@yelon/bis 17.3.2 → 18.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1 -1
  3. package/config/bis.config.d.ts +3 -3
  4. package/config/index.d.ts +5 -5
  5. package/config/public_api.d.ts +1 -1
  6. package/esm2022/bis.mjs +4 -4
  7. package/esm2022/config/bis.config.mjs +14 -14
  8. package/esm2022/config/config.mjs +4 -4
  9. package/esm2022/config/public_api.mjs +1 -1
  10. package/esm2022/layout/layout-basic.component.mjs +518 -508
  11. package/esm2022/layout/layout-nav-application.component.mjs +372 -372
  12. package/esm2022/layout/layout-nav-group.component.mjs +166 -162
  13. package/esm2022/layout/layout-nav-tile.component.mjs +14 -14
  14. package/esm2022/layout/layout.mjs +4 -4
  15. package/esm2022/layout/layout.module.mjs +53 -53
  16. package/esm2022/layout/public_api.mjs +5 -5
  17. package/esm2022/public_api.mjs +8 -8
  18. package/esm2022/src/bis.module.mjs +16 -16
  19. package/esm2022/src/helper.mjs +44 -44
  20. package/esm2022/src/provide.mjs +7 -7
  21. package/esm2022/src/refresh-token.mjs +78 -78
  22. package/esm2022/src/startup.service.mjs +183 -183
  23. package/esm2022/src/yunzai-act.guard.mjs +87 -87
  24. package/esm2022/src/yunzai-analysis-addon.guard.mjs +98 -98
  25. package/esm2022/src/yunzai-default.interceptor.mjs +62 -62
  26. package/esm2022/yunzai-widgets/public_api.mjs +6 -6
  27. package/esm2022/yunzai-widgets/yunzai-clear-storage.component.mjs +46 -46
  28. package/esm2022/yunzai-widgets/yunzai-fullscreen.component.mjs +46 -46
  29. package/esm2022/yunzai-widgets/yunzai-i18n.component.mjs +138 -138
  30. package/esm2022/yunzai-widgets/yunzai-notify.component.mjs +179 -179
  31. package/esm2022/yunzai-widgets/yunzai-user.component.mjs +119 -119
  32. package/esm2022/yunzai-widgets/yunzai-widget.module.mjs +61 -61
  33. package/esm2022/yunzai-widgets/yunzai-widgets.mjs +4 -4
  34. package/fesm2022/bis.mjs +559 -559
  35. package/fesm2022/config.mjs +21 -21
  36. package/fesm2022/layout.mjs +1097 -1083
  37. package/fesm2022/layout.mjs.map +1 -1
  38. package/fesm2022/yunzai-widgets.mjs +563 -563
  39. package/index.d.ts +5 -5
  40. package/index.less +1 -1
  41. package/layout/index.d.ts +5 -5
  42. package/layout/layout-basic.component.d.ts +54 -54
  43. package/layout/layout-nav-application.component.d.ts +26 -26
  44. package/layout/layout-nav-group.component.d.ts +14 -14
  45. package/layout/layout-nav-tile.component.d.ts +5 -5
  46. package/layout/layout.module.d.ts +18 -18
  47. package/layout/public_api.d.ts +5 -5
  48. package/layout/style/index.less +181 -182
  49. package/package.json +68 -68
  50. package/public_api.d.ts +8 -8
  51. package/src/bis.module.d.ts +8 -8
  52. package/src/helper.d.ts +16 -16
  53. package/src/provide.d.ts +2 -2
  54. package/src/refresh-token.d.ts +6 -6
  55. package/src/startup.service.d.ts +24 -24
  56. package/src/yunzai-act.guard.d.ts +20 -20
  57. package/src/yunzai-analysis-addon.guard.d.ts +26 -26
  58. package/src/yunzai-default.interceptor.d.ts +2 -2
  59. package/theme-compact.less +3 -3
  60. package/theme-dark.less +46 -46
  61. package/theme-default.less +48 -48
  62. package/theme-variable.less +1 -0
  63. package/yunzai-widgets/index.d.ts +5 -5
  64. package/yunzai-widgets/public_api.d.ts +6 -6
  65. package/yunzai-widgets/yunzai-clear-storage.component.d.ts +8 -8
  66. package/yunzai-widgets/yunzai-fullscreen.component.d.ts +8 -8
  67. package/yunzai-widgets/yunzai-i18n.component.d.ts +19 -19
  68. package/yunzai-widgets/yunzai-notify.component.d.ts +25 -25
  69. package/yunzai-widgets/yunzai-user.component.d.ts +22 -22
  70. package/yunzai-widgets/yunzai-widget.module.d.ts +18 -18
@@ -1,508 +1,518 @@
1
- import { CommonModule } from '@angular/common';
2
- import { HttpClient } from '@angular/common/http';
3
- import { Component, inject } from '@angular/core';
4
- import { RouterModule } from '@angular/router';
5
- import { ReuseTabModule } from '@yelon/abc/reuse-tab';
6
- import { YunzaiWidgetsModule } from '@yelon/bis/yunzai-widgets';
7
- import { StompService } from '@yelon/socket';
8
- import { I18nPipe } from '@yelon/theme';
9
- import { LayoutDefaultModule, LayoutDisplayService } from '@yelon/theme/layout-default';
10
- import { ThemeBtnModule } from '@yelon/theme/theme-btn';
11
- import { hasFavicon, log, NavType, setFavicon, useLocalStorageCurrent, useLocalStorageDefaultRoute, useLocalStorageHeaderType, useLocalStorageProjectInfo, WINDOW, YUNZAI_CONFIG } from '@yelon/util';
12
- import { NzAvatarModule } from 'ng-zorro-antd/avatar';
13
- import { NzDescriptionsModule } from 'ng-zorro-antd/descriptions';
14
- import { NzDropDownModule } from 'ng-zorro-antd/dropdown';
15
- import { NzIconModule } from 'ng-zorro-antd/icon';
16
- import { NzModalModule } from 'ng-zorro-antd/modal';
17
- import { NzSkeletonModule } from 'ng-zorro-antd/skeleton';
18
- import { YunzaiNavApplicationComponent } from './layout-nav-application.component';
19
- import { YunzaiLayoutNavGroupComponent } from './layout-nav-group.component';
20
- import { YunzaiLayoutNavTileComponent } from './layout-nav-tile.component';
21
- import * as i0 from "@angular/core";
22
- import * as i1 from "@yelon/theme/layout-default";
23
- import * as i2 from "@angular/router";
24
- import * as i3 from "@yelon/abc/reuse-tab";
25
- import * as i4 from "@angular/common";
26
- import * as i5 from "ng-zorro-antd/menu";
27
- import * as i6 from "ng-zorro-antd/dropdown";
28
- import * as i7 from "ng-zorro-antd/avatar";
29
- import * as i8 from "ng-zorro-antd/icon";
30
- import * as i9 from "ng-zorro-antd/modal";
31
- import * as i10 from "ng-zorro-antd/skeleton";
32
- import * as i11 from "ng-zorro-antd/descriptions";
33
- import * as i12 from "@yelon/theme/theme-btn";
34
- import * as i13 from "@yelon/bis/yunzai-widgets";
35
- export class YunzaiLayoutBasicComponent {
36
- constructor() {
37
- this.stomp = inject(StompService);
38
- this.win = inject(WINDOW);
39
- this.layoutDisplayService = inject(LayoutDisplayService);
40
- this.conf = inject(YUNZAI_CONFIG);
41
- this.NavType = NavType;
42
- this.state = {
43
- options: {
44
- logoExpanded: `./assets/logo-full.svg`,
45
- logoCollapsed: `./assets/logo.svg`
46
- },
47
- aside: {
48
- name: '',
49
- intro: '',
50
- icon: ''
51
- },
52
- display: {
53
- nav: true,
54
- aside: true,
55
- reusetab: true
56
- },
57
- navType: NavType.APPLICATION
58
- };
59
- this.headerStyleList = [];
60
- this.applicationModal = {
61
- isVisible: false,
62
- loading: false
63
- };
64
- this.httpClient = inject(HttpClient);
65
- }
66
- get options() {
67
- return this.state.options;
68
- }
69
- get navType() {
70
- return this.state.navType;
71
- }
72
- get aside() {
73
- return this.state.aside;
74
- }
75
- get displayReusetab() {
76
- return this.state.display.reusetab;
77
- }
78
- get reusetabCSS() {
79
- let cascadingStyleSheet = {};
80
- if (!this.state.display.nav) {
81
- cascadingStyleSheet = {
82
- ...cascadingStyleSheet,
83
- top: '0px'
84
- };
85
- }
86
- if (!this.state.display.aside) {
87
- cascadingStyleSheet = {
88
- ...cascadingStyleSheet,
89
- left: '0px'
90
- };
91
- }
92
- return cascadingStyleSheet;
93
- }
94
- ngOnInit() {
95
- this.config = this.conf.bis;
96
- this.initLogo();
97
- this.initFavicon();
98
- this.initNavType();
99
- this.initAside();
100
- this.addLayoutDisplayListener();
101
- this.stomp.listen();
102
- this.toIndex();
103
- }
104
- initFavicon() {
105
- const [, getProjectInfo] = useLocalStorageProjectInfo();
106
- const projectInfo = getProjectInfo();
107
- if (projectInfo.faviconUrl) {
108
- hasFavicon(projectInfo.faviconUrl).then((has) => {
109
- if (has) {
110
- setFavicon(projectInfo.faviconUrl);
111
- }
112
- else {
113
- setFavicon('./assets/favicon.ico');
114
- }
115
- });
116
- }
117
- }
118
- initAside() {
119
- const [, getCurrent] = useLocalStorageCurrent();
120
- const aside = getCurrent();
121
- this.state.aside = { ...aside };
122
- }
123
- initLogo() {
124
- const [, getProjectInfo] = useLocalStorageProjectInfo();
125
- const projectInfo = getProjectInfo();
126
- this.state.options.logoExpanded = projectInfo.maxLogoUrl ? projectInfo.maxLogoUrl : `./assets/logo-full.svg`;
127
- this.state.options.logoCollapsed = projectInfo.miniLogoUrl ? projectInfo.miniLogoUrl : `./assets/logo.svg`;
128
- }
129
- initNavType() {
130
- const [, getHeaderType] = useLocalStorageHeaderType();
131
- const [, getProjectInfo] = useLocalStorageProjectInfo();
132
- const navType = getHeaderType();
133
- const projectInfo = getProjectInfo();
134
- if (navType !== null) {
135
- this.state.navType = navType;
136
- }
137
- else {
138
- this.state.navType = NavType.APPLICATION;
139
- }
140
- if (projectInfo.headerStyle && projectInfo.headerStyle.length > 0) {
141
- this.headerStyleList = projectInfo.headerStyle;
142
- const hasThis = this.headerStyleList.some(item => item.value === this.state.navType);
143
- if (!hasThis) {
144
- this.state.navType = projectInfo.headerStyle[0].value;
145
- const [setHeaderType] = useLocalStorageHeaderType();
146
- setHeaderType(this.state.navType);
147
- }
148
- }
149
- }
150
- toIndex() {
151
- const [, getDefaultRoute] = useLocalStorageDefaultRoute();
152
- const defaultRoute = getDefaultRoute();
153
- log('YunzaiLayoutBasicComponent: ', `todo: the default route was ${defaultRoute}, 但是还没想好如何实现.`);
154
- }
155
- onNavTypeChange(type) {
156
- const [setHeaderType] = useLocalStorageHeaderType();
157
- setHeaderType(type);
158
- this.win.location.reload();
159
- }
160
- addLayoutDisplayListener() {
161
- this.layoutDisplayService.listen('reuseTab', (display) => {
162
- this.state.display.reusetab = display;
163
- });
164
- this.layoutDisplayService.listen('nav', (display) => {
165
- this.state.display.nav = display;
166
- });
167
- this.layoutDisplayService.listen('aside', (display) => {
168
- this.state.display.aside = display;
169
- });
170
- }
171
- // 关于本应用
172
- aboutApplication() {
173
- const urlArr = window.location.pathname.split(`${this.config.baseUrl}/`);
174
- if (urlArr.length > 1) {
175
- // 应用标识,截取路径中 /backstage/后第一个字符串
176
- // 例: http://222.30.194.61/backstage/auth/page/oafportal/#/base/menu 中 auth
177
- const name = urlArr[1].split('/')[0];
178
- this.applicationModal.isVisible = true;
179
- this.applicationModal.loading = true;
180
- // eslint-disable-next-line deprecation/deprecation
181
- this.httpClient.get(`/basic/api/app/aboutApp?name=${name}`).subscribe(
182
- // @ts-ignore
183
- (response) => {
184
- this.applicationModal.loading = false;
185
- if (response.data) {
186
- this.applicationInfo = response.data;
187
- }
188
- }, () => {
189
- this.applicationModal.loading = false;
190
- });
191
- }
192
- }
193
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: YunzaiLayoutBasicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
194
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.1", type: YunzaiLayoutBasicComponent, isStandalone: true, selector: "yunzai-layout-basic", ngImport: i0, template: `
195
- <layout-default [options]="options" [asideUser]="asideUserTpl" [content]="displayReusetab ? contentTpl : noneTpl">
196
- <layout-default-header-item direction="left">
197
- <ng-container [ngSwitch]="navType">
198
- <ng-container *ngSwitchCase="NavType.APPLICATION">
199
- <yunzai-layout-nav-application />
200
- </ng-container>
201
- <ng-container *ngSwitchCase="NavType.GROUP">
202
- <yunzai-layout-nav-group />
203
- </ng-container>
204
- <ng-container *ngSwitchCase="NavType.TILE">
205
- <yunzai-layout-nav-tile />
206
- </ng-container>
207
- <ng-container *ngSwitchCase="NavType.BLANK" />
208
- <ng-container *ngSwitchCase="NavType.TABS" />
209
- <ng-container *ngSwitchDefault>
210
- <yunzai-layout-nav-application />
211
- </ng-container>
212
- </ng-container>
213
- </layout-default-header-item>
214
- <layout-default-header-item direction="right" hidden="mobile">
215
- <yunzai-header-notify />
216
- </layout-default-header-item>
217
- <layout-default-header-item direction="right" hidden="mobile">
218
- <theme-btn />
219
- </layout-default-header-item>
220
- <layout-default-header-item direction="right" hidden="mobile">
221
- <div
222
- data-event-id="_nav_settings"
223
- layout-default-header-item-trigger
224
- nz-dropdown
225
- [nzDropdownMenu]="settingsMenu"
226
- nzTrigger="click"
227
- nzPlacement="bottomRight"
228
- >
229
- <i nz-icon nzType="setting"></i>
230
- </div>
231
- <nz-dropdown-menu #settingsMenu="nzDropdownMenu">
232
- <div nz-menu style="width: 200px;">
233
- <div data-event-id="_nav_mode" nz-menu-item>
234
- {{ 'mode.nav' | i18n }}
235
- </div>
236
-
237
- @if (headerStyleList.length > 1) {
238
- @for (i of headerStyleList; track $index) {
239
- <div
240
- data-event-id="_nav_mode"
241
- nz-menu-item
242
- [attr.data-type]="i.value"
243
- (click)="onNavTypeChange(i.value)"
244
- >
245
- <ng-container [ngSwitch]="i.value">
246
- <ng-container *ngSwitchCase="NavType.APPLICATION">
247
- <i nz-icon nzType="appstore" class="mr-sm"></i>
248
- </ng-container>
249
- <ng-container *ngSwitchCase="NavType.GROUP">
250
- <i nz-icon nzType="group" class="mr-sm"></i>
251
- </ng-container>
252
- <ng-container *ngSwitchCase="NavType.TILE">
253
- <i nz-icon nzType="dash" class="mr-sm"></i>
254
- </ng-container>
255
- <ng-container *ngSwitchCase="NavType.BLANK">
256
- <i nz-icon nzType="border" class="mr-sm"></i>
257
- </ng-container>
258
- <ng-container *ngSwitchCase="NavType.TABS">
259
- <i nz-icon nzType="insert-row-above" class="mr-sm"></i>
260
- </ng-container>
261
- <ng-container *ngSwitchDefault>
262
- <i nz-icon nzType="appstore" class="mr-sm"></i>
263
- </ng-container>
264
- {{ 'mode.nav.' + i.value | i18n }}
265
- </ng-container>
266
- </div>
267
- }
268
- }
269
-
270
- <div data-event-id="_nav_fullscreen" nz-menu-item>
271
- <yunzai-header-fullscreen />
272
- </div>
273
- <div data-event-id="_nav_clearstorage" nz-menu-item>
274
- <yunzai-header-clear-storage />
275
- </div>
276
- <div data-event-id="_nav_i18n" nz-menu-item>
277
- <yunzai-header-i18n />
278
- </div>
279
- </div>
280
- </nz-dropdown-menu>
281
- </layout-default-header-item>
282
- <layout-default-header-item direction="right">
283
- <yunzai-header-user />
284
- </layout-default-header-item>
285
- </layout-default>
286
- <ng-template #asideUserTpl>
287
- <div data-event-id="_route_user" class="yunzai-default__aside-user">
288
- <nz-avatar class="yunzai-default__aside-user-avatar" [nzSrc]="aside.icon" (click)="aboutApplication()" />
289
- <div class="yunzai-default__aside-user-info" nz-dropdown nzTrigger="click" [nzDropdownMenu]="userMenu">
290
- <strong>{{ aside.name | i18n }}</strong>
291
- <p class="mb0">{{ aside.intro | i18n }}</p>
292
- </div>
293
- </div>
294
- <nz-dropdown-menu #userMenu="nzDropdownMenu">
295
- <ul nz-menu>
296
- <li data-event-id="_route_backhome" nz-menu-item routerLink="/">{{ 'back.home' | i18n }}</li>
297
- </ul>
298
- </nz-dropdown-menu>
299
- </ng-template>
300
- <ng-template #contentTpl>
301
- <reuse-tab #reuseTab [ngStyle]="reusetabCSS" />
302
- <router-outlet (activate)="reuseTab.activate($event)" (attach)="reuseTab.activate($event)" />
303
- </ng-template>
304
- <ng-template #noneTpl>
305
- <router-outlet />
306
- </ng-template>
307
-
308
- <nz-modal
309
- nzTitle="关于本应用"
310
- [(nzVisible)]="applicationModal.isVisible"
311
- [nzOkText]="null"
312
- [nzCancelText]="'关闭'"
313
- [nzWidth]="700"
314
- (nzOnCancel)="applicationModal.isVisible = false"
315
- >
316
- <ng-container *nzModalContent>
317
- <nz-skeleton [nzLoading]="applicationModal.loading" [nzActive]="true">
318
- <nz-descriptions nzBordered [nzSize]="'middle'" [nzColumn]="{ xxl: 2, xl: 2, lg: 2, md: 2, sm: 2, xs: 1 }">
319
- <nz-descriptions-item nzTitle="应用名称">{{ applicationInfo?.showName }}</nz-descriptions-item>
320
- <nz-descriptions-item nzTitle="应用标识">{{ applicationInfo?.name }}</nz-descriptions-item>
321
- <nz-descriptions-item nzTitle="版本总数">{{ applicationInfo?.versionNum }}</nz-descriptions-item>
322
- <nz-descriptions-item nzTitle="应用首次部署时间">{{
323
- applicationInfo?.firstDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
324
- }}</nz-descriptions-item>
325
- <nz-descriptions-item nzTitle="当前版本">{{ applicationInfo?.currentVersion }}</nz-descriptions-item>
326
- <nz-descriptions-item nzTitle="当前版本部署时间">{{
327
- applicationInfo?.currentDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
328
- }}</nz-descriptions-item>
329
- <nz-descriptions-item nzTitle="最新版本">{{ applicationInfo?.lastVersion }}</nz-descriptions-item>
330
- <nz-descriptions-item nzTitle="最新版本发布时间">{{
331
- applicationInfo?.lastPushDate | date: 'yyyy-MM-dd HH:mm:ss'
332
- }}</nz-descriptions-item>
333
- </nz-descriptions>
334
- </nz-skeleton>
335
- </ng-container>
336
- </nz-modal>
337
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: LayoutDefaultModule }, { kind: "component", type: i1.LayoutDefaultComponent, selector: "layout-default", inputs: ["options", "asideUser", "asideBottom", "nav", "content", "customError", "fetchingStrictly", "fetching"], exportAs: ["layoutDefault"] }, { kind: "component", type: i1.LayoutDefaultHeaderItemComponent, selector: "layout-default-header-item", inputs: ["hidden", "direction"] }, { kind: "directive", type: i1.LayoutDefaultHeaderItemTriggerDirective, selector: "[layout-default-header-item-trigger]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: ReuseTabModule }, { kind: "component", type: i3.ReuseTabComponent, selector: "reuse-tab, [reuse-tab]", inputs: ["mode", "i18n", "debug", "max", "tabMaxWidth", "excludes", "allowClose", "keepingScroll", "storageState", "keepingScrollContainer", "customContextMenu", "tabBarExtraContent", "tabBarGutter", "tabBarStyle", "tabType", "routeParamMatchMode", "disabled", "titleRender", "canClose"], outputs: ["change", "close"], exportAs: ["reuseTab"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: I18nPipe, name: "i18n" }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i5.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i5.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "directive", type: i6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "ngmodule", type: NzAvatarModule }, { kind: "component", type: i7.NzAvatarComponent, selector: "nz-avatar", inputs: ["nzShape", "nzSize", "nzGap", "nzText", "nzSrc", "nzSrcSet", "nzAlt", "nzIcon"], outputs: ["nzError"], exportAs: ["nzAvatar"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i8.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzModalModule }, { kind: "component", type: i9.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i9.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzSkeletonModule }, { kind: "component", type: i10.NzSkeletonComponent, selector: "nz-skeleton", inputs: ["nzActive", "nzLoading", "nzRound", "nzTitle", "nzAvatar", "nzParagraph"], exportAs: ["nzSkeleton"] }, { kind: "ngmodule", type: NzDescriptionsModule }, { kind: "component", type: i11.NzDescriptionsComponent, selector: "nz-descriptions", inputs: ["nzBordered", "nzLayout", "nzColumn", "nzSize", "nzTitle", "nzExtra", "nzColon"], exportAs: ["nzDescriptions"] }, { kind: "component", type: i11.NzDescriptionsItemComponent, selector: "nz-descriptions-item", inputs: ["nzSpan", "nzTitle"], exportAs: ["nzDescriptionsItem"] }, { kind: "ngmodule", type: ThemeBtnModule }, { kind: "component", type: i12.ThemeBtnComponent, selector: "theme-btn", inputs: ["types", "devTips", "deployUrl"], outputs: ["themeChange"] }, { kind: "ngmodule", type: YunzaiWidgetsModule }, { kind: "component", type: i13.YunzaiHeaderClearStorageComponent, selector: "yunzai-header-clear-storage" }, { kind: "component", type: i13.YunzaiHeaderFullScreenComponent, selector: "yunzai-header-fullscreen" }, { kind: "component", type: i13.YunzaiHeaderNotifyComponent, selector: "yunzai-header-notify" }, { kind: "component", type: i13.YunzaiHeaderI18nComponent, selector: "yunzai-header-i18n", inputs: ["showLangText"] }, { kind: "component", type: i13.YunzaiHeaderUserComponent, selector: "yunzai-header-user" }, { kind: "component", type: YunzaiNavApplicationComponent, selector: "yunzai-layout-nav-application" }, { kind: "component", type: YunzaiLayoutNavGroupComponent, selector: "yunzai-layout-nav-group" }, { kind: "component", type: YunzaiLayoutNavTileComponent, selector: "yunzai-layout-nav-tile" }] }); }
338
- }
339
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: YunzaiLayoutBasicComponent, decorators: [{
340
- type: Component,
341
- args: [{
342
- selector: `yunzai-layout-basic`,
343
- template: `
344
- <layout-default [options]="options" [asideUser]="asideUserTpl" [content]="displayReusetab ? contentTpl : noneTpl">
345
- <layout-default-header-item direction="left">
346
- <ng-container [ngSwitch]="navType">
347
- <ng-container *ngSwitchCase="NavType.APPLICATION">
348
- <yunzai-layout-nav-application />
349
- </ng-container>
350
- <ng-container *ngSwitchCase="NavType.GROUP">
351
- <yunzai-layout-nav-group />
352
- </ng-container>
353
- <ng-container *ngSwitchCase="NavType.TILE">
354
- <yunzai-layout-nav-tile />
355
- </ng-container>
356
- <ng-container *ngSwitchCase="NavType.BLANK" />
357
- <ng-container *ngSwitchCase="NavType.TABS" />
358
- <ng-container *ngSwitchDefault>
359
- <yunzai-layout-nav-application />
360
- </ng-container>
361
- </ng-container>
362
- </layout-default-header-item>
363
- <layout-default-header-item direction="right" hidden="mobile">
364
- <yunzai-header-notify />
365
- </layout-default-header-item>
366
- <layout-default-header-item direction="right" hidden="mobile">
367
- <theme-btn />
368
- </layout-default-header-item>
369
- <layout-default-header-item direction="right" hidden="mobile">
370
- <div
371
- data-event-id="_nav_settings"
372
- layout-default-header-item-trigger
373
- nz-dropdown
374
- [nzDropdownMenu]="settingsMenu"
375
- nzTrigger="click"
376
- nzPlacement="bottomRight"
377
- >
378
- <i nz-icon nzType="setting"></i>
379
- </div>
380
- <nz-dropdown-menu #settingsMenu="nzDropdownMenu">
381
- <div nz-menu style="width: 200px;">
382
- <div data-event-id="_nav_mode" nz-menu-item>
383
- {{ 'mode.nav' | i18n }}
384
- </div>
385
-
386
- @if (headerStyleList.length > 1) {
387
- @for (i of headerStyleList; track $index) {
388
- <div
389
- data-event-id="_nav_mode"
390
- nz-menu-item
391
- [attr.data-type]="i.value"
392
- (click)="onNavTypeChange(i.value)"
393
- >
394
- <ng-container [ngSwitch]="i.value">
395
- <ng-container *ngSwitchCase="NavType.APPLICATION">
396
- <i nz-icon nzType="appstore" class="mr-sm"></i>
397
- </ng-container>
398
- <ng-container *ngSwitchCase="NavType.GROUP">
399
- <i nz-icon nzType="group" class="mr-sm"></i>
400
- </ng-container>
401
- <ng-container *ngSwitchCase="NavType.TILE">
402
- <i nz-icon nzType="dash" class="mr-sm"></i>
403
- </ng-container>
404
- <ng-container *ngSwitchCase="NavType.BLANK">
405
- <i nz-icon nzType="border" class="mr-sm"></i>
406
- </ng-container>
407
- <ng-container *ngSwitchCase="NavType.TABS">
408
- <i nz-icon nzType="insert-row-above" class="mr-sm"></i>
409
- </ng-container>
410
- <ng-container *ngSwitchDefault>
411
- <i nz-icon nzType="appstore" class="mr-sm"></i>
412
- </ng-container>
413
- {{ 'mode.nav.' + i.value | i18n }}
414
- </ng-container>
415
- </div>
416
- }
417
- }
418
-
419
- <div data-event-id="_nav_fullscreen" nz-menu-item>
420
- <yunzai-header-fullscreen />
421
- </div>
422
- <div data-event-id="_nav_clearstorage" nz-menu-item>
423
- <yunzai-header-clear-storage />
424
- </div>
425
- <div data-event-id="_nav_i18n" nz-menu-item>
426
- <yunzai-header-i18n />
427
- </div>
428
- </div>
429
- </nz-dropdown-menu>
430
- </layout-default-header-item>
431
- <layout-default-header-item direction="right">
432
- <yunzai-header-user />
433
- </layout-default-header-item>
434
- </layout-default>
435
- <ng-template #asideUserTpl>
436
- <div data-event-id="_route_user" class="yunzai-default__aside-user">
437
- <nz-avatar class="yunzai-default__aside-user-avatar" [nzSrc]="aside.icon" (click)="aboutApplication()" />
438
- <div class="yunzai-default__aside-user-info" nz-dropdown nzTrigger="click" [nzDropdownMenu]="userMenu">
439
- <strong>{{ aside.name | i18n }}</strong>
440
- <p class="mb0">{{ aside.intro | i18n }}</p>
441
- </div>
442
- </div>
443
- <nz-dropdown-menu #userMenu="nzDropdownMenu">
444
- <ul nz-menu>
445
- <li data-event-id="_route_backhome" nz-menu-item routerLink="/">{{ 'back.home' | i18n }}</li>
446
- </ul>
447
- </nz-dropdown-menu>
448
- </ng-template>
449
- <ng-template #contentTpl>
450
- <reuse-tab #reuseTab [ngStyle]="reusetabCSS" />
451
- <router-outlet (activate)="reuseTab.activate($event)" (attach)="reuseTab.activate($event)" />
452
- </ng-template>
453
- <ng-template #noneTpl>
454
- <router-outlet />
455
- </ng-template>
456
-
457
- <nz-modal
458
- nzTitle="关于本应用"
459
- [(nzVisible)]="applicationModal.isVisible"
460
- [nzOkText]="null"
461
- [nzCancelText]="'关闭'"
462
- [nzWidth]="700"
463
- (nzOnCancel)="applicationModal.isVisible = false"
464
- >
465
- <ng-container *nzModalContent>
466
- <nz-skeleton [nzLoading]="applicationModal.loading" [nzActive]="true">
467
- <nz-descriptions nzBordered [nzSize]="'middle'" [nzColumn]="{ xxl: 2, xl: 2, lg: 2, md: 2, sm: 2, xs: 1 }">
468
- <nz-descriptions-item nzTitle="应用名称">{{ applicationInfo?.showName }}</nz-descriptions-item>
469
- <nz-descriptions-item nzTitle="应用标识">{{ applicationInfo?.name }}</nz-descriptions-item>
470
- <nz-descriptions-item nzTitle="版本总数">{{ applicationInfo?.versionNum }}</nz-descriptions-item>
471
- <nz-descriptions-item nzTitle="应用首次部署时间">{{
472
- applicationInfo?.firstDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
473
- }}</nz-descriptions-item>
474
- <nz-descriptions-item nzTitle="当前版本">{{ applicationInfo?.currentVersion }}</nz-descriptions-item>
475
- <nz-descriptions-item nzTitle="当前版本部署时间">{{
476
- applicationInfo?.currentDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
477
- }}</nz-descriptions-item>
478
- <nz-descriptions-item nzTitle="最新版本">{{ applicationInfo?.lastVersion }}</nz-descriptions-item>
479
- <nz-descriptions-item nzTitle="最新版本发布时间">{{
480
- applicationInfo?.lastPushDate | date: 'yyyy-MM-dd HH:mm:ss'
481
- }}</nz-descriptions-item>
482
- </nz-descriptions>
483
- </nz-skeleton>
484
- </ng-container>
485
- </nz-modal>
486
- `,
487
- standalone: true,
488
- imports: [
489
- LayoutDefaultModule,
490
- RouterModule,
491
- ReuseTabModule,
492
- CommonModule,
493
- I18nPipe,
494
- NzDropDownModule,
495
- NzAvatarModule,
496
- NzIconModule,
497
- NzModalModule,
498
- NzSkeletonModule,
499
- NzDescriptionsModule,
500
- ThemeBtnModule,
501
- YunzaiWidgetsModule,
502
- YunzaiNavApplicationComponent,
503
- YunzaiLayoutNavGroupComponent,
504
- YunzaiLayoutNavTileComponent
505
- ]
506
- }]
507
- }] });
508
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJhc2ljLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Jpcy9sYXlvdXQvbGF5b3V0LWJhc2ljLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBd0Isb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUNMLFVBQVUsRUFHVixHQUFHLEVBQ0gsT0FBTyxFQUNQLFVBQVUsRUFDVixzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsTUFBTSxFQUNOLGFBQWEsRUFLZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxF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UUFBUSw0Q0FDUixnQkFBZ0IseTJCQUNoQixjQUFjLGdQQUNkLFlBQVksaU5BQ1osYUFBYSxnekJBQ2IsZ0JBQWdCLDJOQUNoQixvQkFBb0IsK1lBQ3BCLGNBQWMsOEtBQ2QsbUJBQW1CLHNpQkFDbkIsNkJBQTZCLDBFQUM3Qiw2QkFBNkIsb0VBQzdCLDRCQUE0Qjs7MkZBR25CLDBCQUEwQjtrQkF0S3RDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStJVDtvQkFDRCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFO3dCQUNQLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osUUFBUTt3QkFDUixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsWUFBWTt3QkFDWixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsb0JBQW9CO3dCQUNwQixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsNkJBQTZCO3dCQUM3Qiw2QkFBNkI7d0JBQzdCLDRCQUE0QjtxQkFDN0I7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IFJldXNlVGFiTW9kdWxlIH0gZnJvbSAnQHllbG9uL2FiYy9yZXVzZS10YWInO1xuaW1wb3J0IHsgWXVuemFpV2lkZ2V0c01vZHVsZSB9IGZyb20gJ0B5ZWxvbi9iaXMveXVuemFpLXdpZGdldHMnO1xuaW1wb3J0IHsgU3RvbXBTZXJ2aWNlIH0gZnJvbSAnQHllbG9uL3NvY2tldCc7XG5pbXBvcnQgeyBJMThuUGlwZSB9IGZyb20gJ0B5ZWxvbi90aGVtZSc7XG5pbXBvcnQgeyBMYXlvdXREZWZhdWx0TW9kdWxlLCBMYXlvdXREZWZhdWx0T3B0aW9ucywgTGF5b3V0RGlzcGxheVNlcnZpY2UgfSBmcm9tICdAeWVsb24vdGhlbWUvbGF5b3V0LWRlZmF1bHQnO1xuaW1wb3J0IHsgVGhlbWVCdG5Nb2R1bGUgfSBmcm9tICdAeWVsb24vdGhlbWUvdGhlbWUtYnRuJztcbmltcG9ydCB7XG4gIGhhc0Zhdmljb24sXG4gIExheW91dEJhc2ljQXNpZGUsXG4gIExheW91dEJhc2ljRGlzcGxheSxcbiAgbG9nLFxuICBOYXZUeXBlLFxuICBzZXRGYXZpY29uLFxuICB1c2VMb2NhbFN0b3JhZ2VDdXJyZW50LFxuICB1c2VMb2NhbFN0b3JhZ2VEZWZhdWx0Um91dGUsXG4gIHVzZUxvY2FsU3RvcmFnZUhlYWRlclR5cGUsXG4gIHVzZUxvY2FsU3RvcmFnZVByb2plY3RJbmZvLFxuICBXSU5ET1csXG4gIFlVTlpBSV9DT05GSUcsXG4gIFl1bnphaUJ1c2luZXNzQ29uZmlnLFxuICBZdW56YWlDb25maWcsXG4gIFl1bnphaUhlYWRlclN0eWxlLFxuICBZdW56YWlQcm9qZWN0SW5mb1xufSBmcm9tICdAeWVsb24vdXRpbCc7XG5pbXBvcnQgeyBOekF2YXRhck1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvYXZhdGFyJztcbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBOekRlc2NyaXB0aW9uc01vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvZGVzY3JpcHRpb25zJztcbmltcG9ydCB7IE56RHJvcERvd25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2Ryb3Bkb3duJztcbmltcG9ydCB7IE56SWNvbk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaWNvbic7XG5pbXBvcnQgeyBOek1vZGFsTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9tb2RhbCc7XG5pbXBvcnQgeyBOelNrZWxldG9uTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9za2VsZXRvbic7XG5cbmltcG9ydCB7IFl1bnphaU5hdkFwcGxpY2F0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtbmF2LWFwcGxpY2F0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBZdW56YWlMYXlvdXROYXZHcm91cENvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LW5hdi1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgWXVuemFpTGF5b3V0TmF2VGlsZUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LW5hdi10aWxlLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QmFzaWNTdGF0ZSB7XG4gIG9wdGlvbnM6IExheW91dERlZmF1bHRPcHRpb25zO1xuICBhc2lkZTogTGF5b3V0QmFzaWNBc2lkZTtcbiAgZGlzcGxheTogTGF5b3V0QmFzaWNEaXNwbGF5O1xuICBuYXZUeXBlOiBOYXZUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uSW5mb0ludGVyZmFjZSB7XG4gIGlkPzogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICBzaG93TmFtZT86IHN0cmluZztcbiAgbGFzdFZlcnNpb24/OiBzdHJpbmc7XG4gIHZlcnNpb25OdW0/OiBzdHJpbmc7XG4gIGN1cnJlbnRWZXJzaW9uPzogc3RyaW5nO1xuICBmaXJzdERlcGxveW1lbnREYXRlPzogc3RyaW5nO1xuICBjdXJyZW50RGVwbG95bWVudERhdGU/OiBzdHJpbmc7XG4gIGxhc3RQdXNoRGF0ZT86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBgeXVuemFpLWxheW91dC1iYXNpY2AsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGxheW91dC1kZWZhdWx0IFtvcHRpb25zXT1cIm9wdGlvbnNcIiBbYXNpZGVVc2VyXT1cImFzaWRlVXNlclRwbFwiIFtjb250ZW50XT1cImRpc3BsYXlSZXVzZXRhYiA/IGNvbnRlbnRUcGwgOiBub25lVHBsXCI+XG4gICAgICA8bGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0gZGlyZWN0aW9uPVwibGVmdFwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJuYXZUeXBlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiTmF2VHlwZS5BUFBMSUNBVElPTlwiPlxuICAgICAgICAgICAgPHl1bnphaS1sYXlvdXQtbmF2LWFwcGxpY2F0aW9uIC8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiTmF2VHlwZS5HUk9VUFwiPlxuICAgICAgICAgICAgPHl1bnphaS1sYXlvdXQtbmF2LWdyb3VwIC8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiTmF2VHlwZS5USUxFXCI+XG4gICAgICAgICAgICA8eXVuemFpLWxheW91dC1uYXYtdGlsZSAvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuQkxBTktcIiAvPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuVEFCU1wiIC8+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgPHl1bnphaS1sYXlvdXQtbmF2LWFwcGxpY2F0aW9uIC8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9sYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbT5cbiAgICAgIDxsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbSBkaXJlY3Rpb249XCJyaWdodFwiIGhpZGRlbj1cIm1vYmlsZVwiPlxuICAgICAgICA8eXVuemFpLWhlYWRlci1ub3RpZnkgLz5cbiAgICAgIDwvbGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0+XG4gICAgICA8bGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0gZGlyZWN0aW9uPVwicmlnaHRcIiBoaWRkZW49XCJtb2JpbGVcIj5cbiAgICAgICAgPHRoZW1lLWJ0biAvPlxuICAgICAgPC9sYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbT5cbiAgICAgIDxsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbSBkaXJlY3Rpb249XCJyaWdodFwiIGhpZGRlbj1cIm1vYmlsZVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS1ldmVudC1pZD1cIl9uYXZfc2V0dGluZ3NcIlxuICAgICAgICAgIGxheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtLXRyaWdnZXJcbiAgICAgICAgICBuei1kcm9wZG93blxuICAgICAgICAgIFtuekRyb3Bkb3duTWVudV09XCJzZXR0aW5nc01lbnVcIlxuICAgICAgICAgIG56VHJpZ2dlcj1cImNsaWNrXCJcbiAgICAgICAgICBuelBsYWNlbWVudD1cImJvdHRvbVJpZ2h0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwic2V0dGluZ1wiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuei1kcm9wZG93bi1tZW51ICNzZXR0aW5nc01lbnU9XCJuekRyb3Bkb3duTWVudVwiPlxuICAgICAgICAgIDxkaXYgbnotbWVudSBzdHlsZT1cIndpZHRoOiAyMDBweDtcIj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1ldmVudC1pZD1cIl9uYXZfbW9kZVwiIG56LW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAge3sgJ21vZGUubmF2JyB8IGkxOG4gfX1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYgKGhlYWRlclN0eWxlTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIEBmb3IgKGkgb2YgaGVhZGVyU3R5bGVMaXN0OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBkYXRhLWV2ZW50LWlkPVwiX25hdl9tb2RlXCJcbiAgICAgICAgICAgICAgICAgIG56LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10eXBlXT1cImkudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTmF2VHlwZUNoYW5nZShpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiaS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLkFQUExJQ0FUSU9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJhcHBzdG9yZVwiIGNsYXNzPVwibXItc21cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLkdST1VQXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJncm91cFwiIGNsYXNzPVwibXItc21cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLlRJTEVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIG56VHlwZT1cImRhc2hcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiTmF2VHlwZS5CTEFOS1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiYm9yZGVyXCIgY2xhc3M9XCJtci1zbVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuVEFCU1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiaW5zZXJ0LXJvdy1hYm92ZVwiIGNsYXNzPVwibXItc21cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJhcHBzdG9yZVwiIGNsYXNzPVwibXItc21cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB7eyAnbW9kZS5uYXYuJyArIGkudmFsdWUgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8ZGl2IGRhdGEtZXZlbnQtaWQ9XCJfbmF2X2Z1bGxzY3JlZW5cIiBuei1tZW51LWl0ZW0+XG4gICAgICAgICAgICAgIDx5dW56YWktaGVhZGVyLWZ1bGxzY3JlZW4gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLWV2ZW50LWlkPVwiX25hdl9jbGVhcnN0b3JhZ2VcIiBuei1tZW51LWl0ZW0+XG4gICAgICAgICAgICAgIDx5dW56YWktaGVhZGVyLWNsZWFyLXN0b3JhZ2UgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLWV2ZW50LWlkPVwiX25hdl9pMThuXCIgbnotbWVudS1pdGVtPlxuICAgICAgICAgICAgICA8eXVuemFpLWhlYWRlci1pMThuIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uei1kcm9wZG93bi1tZW51PlxuICAgICAgPC9sYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbT5cbiAgICAgIDxsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbSBkaXJlY3Rpb249XCJyaWdodFwiPlxuICAgICAgICA8eXVuemFpLWhlYWRlci11c2VyIC8+XG4gICAgICA8L2xheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtPlxuICAgIDwvbGF5b3V0LWRlZmF1bHQ+XG4gICAgPG5nLXRlbXBsYXRlICNhc2lkZVVzZXJUcGw+XG4gICAgICA8ZGl2IGRhdGEtZXZlbnQtaWQ9XCJfcm91dGVfdXNlclwiIGNsYXNzPVwieXVuemFpLWRlZmF1bHRfX2FzaWRlLXVzZXJcIj5cbiAgICAgICAgPG56LWF2YXRhciBjbGFzcz1cInl1bnphaS1kZWZhdWx0X19hc2lkZS11c2VyLWF2YXRhclwiIFtuelNyY109XCJhc2lkZS5pY29uXCIgKGNsaWNrKT1cImFib3V0QXBwbGljYXRpb24oKVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ5dW56YWktZGVmYXVsdF9fYXNpZGUtdXNlci1pbmZvXCIgbnotZHJvcGRvd24gbnpUcmlnZ2VyPVwiY2xpY2tcIiBbbnpEcm9wZG93bk1lbnVdPVwidXNlck1lbnVcIj5cbiAgICAgICAgICA8c3Ryb25nPnt7IGFzaWRlLm5hbWUgfCBpMThuIH19PC9zdHJvbmc+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtYjBcIj57eyBhc2lkZS5pbnRybyB8IGkxOG4gfX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bnotZHJvcGRvd24tbWVudSAjdXNlck1lbnU9XCJuekRyb3Bkb3duTWVudVwiPlxuICAgICAgICA8dWwgbnotbWVudT5cbiAgICAgICAgICA8bGkgZGF0YS1ldmVudC1pZD1cIl9yb3V0ZV9iYWNraG9tZVwiIG56LW1lbnUtaXRlbSByb3V0ZXJMaW5rPVwiL1wiPnt7ICdiYWNrLmhvbWUnIHwgaTE4biB9fTwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L256LWRyb3Bkb3duLW1lbnU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRUcGw+XG4gICAgICA8cmV1c2UtdGFiICNyZXVzZVRhYiBbbmdTdHlsZV09XCJyZXVzZXRhYkNTU1wiIC8+XG4gICAgICA8cm91dGVyLW91dGxldCAoYWN0aXZhdGUpPVwicmV1c2VUYWIuYWN0aXZhdGUoJGV2ZW50KVwiIChhdHRhY2gpPVwicmV1c2VUYWIuYWN0aXZhdGUoJGV2ZW50KVwiIC8+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI25vbmVUcGw+XG4gICAgICA8cm91dGVyLW91dGxldCAvPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bnotbW9kYWxcbiAgICAgIG56VGl0bGU9XCLlhbPkuo7mnKzlupTnlKhcIlxuICAgICAgWyhuelZpc2libGUpXT1cImFwcGxpY2F0aW9uTW9kYWwuaXNWaXNpYmxlXCJcbiAgICAgIFtuek9rVGV4dF09XCJudWxsXCJcbiAgICAgIFtuekNhbmNlbFRleHRdPVwiJ+WFs+mXrSdcIlxuICAgICAgW256V2lkdGhdPVwiNzAwXCJcbiAgICAgIChuek9uQ2FuY2VsKT1cImFwcGxpY2F0aW9uTW9kYWwuaXNWaXNpYmxlID0gZmFsc2VcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm56TW9kYWxDb250ZW50PlxuICAgICAgICA8bnotc2tlbGV0b24gW256TG9hZGluZ109XCJhcHBsaWNhdGlvbk1vZGFsLmxvYWRpbmdcIiBbbnpBY3RpdmVdPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuei1kZXNjcmlwdGlvbnMgbnpCb3JkZXJlZCBbbnpTaXplXT1cIidtaWRkbGUnXCIgW256Q29sdW1uXT1cInsgeHhsOiAyLCB4bDogMiwgbGc6IDIsIG1kOiAyLCBzbTogMiwgeHM6IDEgfVwiPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLlupTnlKjlkI3np7BcIj57eyBhcHBsaWNhdGlvbkluZm8/LnNob3dOYW1lIH19PC9uei1kZXNjcmlwdGlvbnMtaXRlbT5cbiAgICAgICAgICAgIDxuei1kZXNjcmlwdGlvbnMtaXRlbSBuelRpdGxlPVwi5bqU55So5qCH6K+GXCI+e3sgYXBwbGljYXRpb25JbmZvPy5uYW1lIH19PC9uei1kZXNjcmlwdGlvbnMtaXRlbT5cbiAgICAgICAgICAgIDxuei1kZXNjcmlwdGlvbnMtaXRlbSBuelRpdGxlPVwi54mI5pys5oC75pWwXCI+e3sgYXBwbGljYXRpb25JbmZvPy52ZXJzaW9uTnVtIH19PC9uei1kZXNjcmlwdGlvbnMtaXRlbT5cbiAgICAgICAgICAgIDxuei1kZXNjcmlwdGlvbnMtaXRlbSBuelRpdGxlPVwi5bqU55So6aaW5qyh6YOo572y5pe26Ze0XCI+e3tcbiAgICAgICAgICAgICAgYXBwbGljYXRpb25JbmZvPy5maXJzdERlcGxveW1lbnREYXRlIHwgZGF0ZTogJ3l5eXktTU0tZGQgSEg6bW06c3MnXG4gICAgICAgICAgICB9fTwvbnotZGVzY3JpcHRpb25zLWl0ZW0+XG4gICAgICAgICAgICA8bnotZGVzY3JpcHRpb25zLWl0ZW0gbnpUaXRsZT1cIuW9k+WJjeeJiOacrFwiPnt7IGFwcGxpY2F0aW9uSW5mbz8uY3VycmVudFZlcnNpb24gfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLlvZPliY3niYjmnKzpg6jnvbLml7bpl7RcIj57e1xuICAgICAgICAgICAgICBhcHBsaWNhdGlvbkluZm8/LmN1cnJlbnREZXBsb3ltZW50RGF0ZSB8IGRhdGU6ICd5eXl5LU1NLWRkIEhIOm1tOnNzJ1xuICAgICAgICAgICAgfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLmnIDmlrDniYjmnKxcIj57eyBhcHBsaWNhdGlvbkluZm8/Lmxhc3RWZXJzaW9uIH19PC9uei1kZXNjcmlwdGlvbnMtaXRlbT5cbiAgICAgICAgICAgIDxuei1kZXNjcmlwdGlvbnMtaXRlbSBuelRpdGxlPVwi5pyA5paw54mI5pys5Y+R5biD5pe26Ze0XCI+e3tcbiAgICAgICAgICAgICAgYXBwbGljYXRpb25JbmZvPy5sYXN0UHVzaERhdGUgfCBkYXRlOiAneXl5eS1NTS1kZCBISDptbTpzcydcbiAgICAgICAgICAgIH19PC9uei1kZXNjcmlwdGlvbnMtaXRlbT5cbiAgICAgICAgICA8L256LWRlc2NyaXB0aW9ucz5cbiAgICAgICAgPC9uei1za2VsZXRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbnotbW9kYWw+XG4gIGAsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBMYXlvdXREZWZhdWx0TW9kdWxlLFxuICAgIFJvdXRlck1vZHVsZSxcbiAgICBSZXVzZVRhYk1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSTE4blBpcGUsXG4gICAgTnpEcm9wRG93bk1vZHVsZSxcbiAgICBOekF2YXRhck1vZHVsZSxcbiAgICBOekljb25Nb2R1bGUsXG4gICAgTnpNb2RhbE1vZHVsZSxcbiAgICBOelNrZWxldG9uTW9kdWxlLFxuICAgIE56RGVzY3JpcHRpb25zTW9kdWxlLFxuICAgIFRoZW1lQnRuTW9kdWxlLFxuICAgIFl1bnphaVdpZGdldHNNb2R1bGUsXG4gICAgWXVuemFpTmF2QXBwbGljYXRpb25Db21wb25lbnQsXG4gICAgWXVuemFpTGF5b3V0TmF2R3JvdXBDb21wb25lbnQsXG4gICAgWXVuemFpTGF5b3V0TmF2VGlsZUNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFl1bnphaUxheW91dEJhc2ljQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9tcCA9IGluamVjdChTdG9tcFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdpbiA9IGluamVjdChXSU5ET1cpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxheW91dERpc3BsYXlTZXJ2aWNlID0gaW5qZWN0KExheW91dERpc3BsYXlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25mOiBZdW56YWlDb25maWcgPSBpbmplY3QoWVVOWkFJX0NPTkZJRyk7XG5cbiAgcHVibGljIE5hdlR5cGUgPSBOYXZUeXBlO1xuICBwcml2YXRlIHN0YXRlOiBMYXlvdXRCYXNpY1N0YXRlID0ge1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIGxvZ29FeHBhbmRlZDogYC4vYXNzZXRzL2xvZ28tZnVsbC5zdmdgLFxuICAgICAgbG9nb0NvbGxhcHNlZDogYC4vYXNzZXRzL2xvZ28uc3ZnYFxuICAgIH0sXG4gICAgYXNpZGU6IHtcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgaW50cm86ICcnLFxuICAgICAgaWNvbjogJydcbiAgICB9LFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIG5hdjogdHJ1ZSxcbiAgICAgIGFzaWRlOiB0cnVlLFxuICAgICAgcmV1c2V0YWI6IHRydWVcbiAgICB9LFxuICAgIG5hdlR5cGU6IE5hdlR5cGUuQVBQTElDQVRJT05cbiAgfTtcblxuICBoZWFkZXJTdHlsZUxpc3Q6IFl1bnphaUhlYWRlclN0eWxlW10gPSBbXTtcblxuICBhcHBsaWNhdGlvbkluZm8hOiBBcHBsaWNhdGlvbkluZm9JbnRlcmZhY2U7XG5cbiAgYXBwbGljYXRpb25Nb2RhbCA9IHtcbiAgICBpc1Zpc2libGU6IGZhbHNlLFxuICAgIGxvYWRpbmc6IGZhbHNlXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBodHRwQ2xpZW50ID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICBwcml2YXRlIGNvbmZpZyE6IFl1bnphaUJ1c2luZXNzQ29uZmlnO1xuXG4gIGdldCBvcHRpb25zKCk6IExheW91dERlZmF1bHRPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5vcHRpb25zO1xuICB9XG5cbiAgZ2V0IG5hdlR5cGUoKTogTmF2VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUubmF2VHlwZTtcbiAgfVxuXG4gIGdldCBhc2lkZSgpOiBMYXlvdXRCYXNpY0FzaWRlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5hc2lkZTtcbiAgfVxuXG4gIGdldCBkaXNwbGF5UmV1c2V0YWIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZGlzcGxheS5yZXVzZXRhYjtcbiAgfVxuXG4gIGdldCByZXVzZXRhYkNTUygpOiBOelNhZmVBbnkge1xuICAgIGxldCBjYXNjYWRpbmdTdHlsZVNoZWV0ID0ge307XG4gICAgaWYgKCF0aGlzLnN0YXRlLmRpc3BsYXkubmF2KSB7XG4gICAgICBjYXNjYWRpbmdTdHlsZVNoZWV0ID0ge1xuICAgICAgICAuLi5jYXNjYWRpbmdTdHlsZVNoZWV0LFxuICAgICAgICB0b3A6ICcwcHgnXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3RhdGUuZGlzcGxheS5hc2lkZSkge1xuICAgICAgY2FzY2FkaW5nU3R5bGVTaGVldCA9IHtcbiAgICAgICAgLi4uY2FzY2FkaW5nU3R5bGVTaGVldCxcbiAgICAgICAgbGVmdDogJzBweCdcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjYXNjYWRpbmdTdHlsZVNoZWV0O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcgPSB0aGlzLmNvbmYuYmlzITtcbiAgICB0aGlzLmluaXRMb2dvKCk7XG4gICAgdGhpcy5pbml0RmF2aWNvbigpO1xuICAgIHRoaXMuaW5pdE5hdlR5cGUoKTtcbiAgICB0aGlzLmluaXRBc2lkZSgpO1xuICAgIHRoaXMuYWRkTGF5b3V0RGlzcGxheUxpc3RlbmVyKCk7XG4gICAgdGhpcy5zdG9tcC5saXN0ZW4oKTtcbiAgICB0aGlzLnRvSW5kZXgoKTtcbiAgfVxuXG4gIGluaXRGYXZpY29uKCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldFByb2plY3RJbmZvXSA9IHVzZUxvY2FsU3RvcmFnZVByb2plY3RJbmZvKCk7XG4gICAgY29uc3QgcHJvamVjdEluZm86IFl1bnphaVByb2plY3RJbmZvID0gZ2V0UHJvamVjdEluZm8oKSE7XG4gICAgaWYgKHByb2plY3RJbmZvLmZhdmljb25VcmwpIHtcbiAgICAgIGhhc0Zhdmljb24ocHJvamVjdEluZm8uZmF2aWNvblVybCkudGhlbigoaGFzOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmIChoYXMpIHtcbiAgICAgICAgICBzZXRGYXZpY29uKHByb2plY3RJbmZvLmZhdmljb25VcmwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEZhdmljb24oJy4vYXNzZXRzL2Zhdmljb24uaWNvJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGluaXRBc2lkZSgpOiB2b2lkIHtcbiAgICBjb25zdCBbLCBnZXRDdXJyZW50XSA9IHVzZUxvY2FsU3RvcmFnZUN1cnJlbnQoKTtcbiAgICBjb25zdCBhc2lkZTogTGF5b3V0QmFzaWNBc2lkZSA9IGdldEN1cnJlbnQoKSE7XG4gICAgdGhpcy5zdGF0ZS5hc2lkZSA9IHsgLi4uYXNpZGUgfTtcbiAgfVxuXG4gIGluaXRMb2dvKCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldFByb2plY3RJbmZvXSA9IHVzZUxvY2FsU3RvcmFnZVByb2plY3RJbmZvKCk7XG4gICAgY29uc3QgcHJvamVjdEluZm86IFl1bnphaVByb2plY3RJbmZvID0gZ2V0UHJvamVjdEluZm8oKSE7XG4gICAgdGhpcy5zdGF0ZS5vcHRpb25zLmxvZ29FeHBhbmRlZCA9IHByb2plY3RJbmZvLm1heExvZ29VcmwgPyBwcm9qZWN0SW5mby5tYXhMb2dvVXJsIDogYC4vYXNzZXRzL2xvZ28tZnVsbC5zdmdgO1xuICAgIHRoaXMuc3RhdGUub3B0aW9ucy5sb2dvQ29sbGFwc2VkID0gcHJvamVjdEluZm8ubWluaUxvZ29VcmwgPyBwcm9qZWN0SW5mby5taW5pTG9nb1VybCA6IGAuL2Fzc2V0cy9sb2dvLnN2Z2A7XG4gIH1cblxuICBpbml0TmF2VHlwZSgpOiB2b2lkIHtcbiAgICBjb25zdCBbLCBnZXRIZWFkZXJUeXBlXSA9IHVzZUxvY2FsU3RvcmFnZUhlYWRlclR5cGUoKTtcbiAgICBjb25zdCBbLCBnZXRQcm9qZWN0SW5mb10gPSB1c2VMb2NhbFN0b3JhZ2VQcm9qZWN0SW5mbygpO1xuICAgIGNvbnN0IG5hdlR5cGU6IE5hdlR5cGUgfCBudWxsID0gZ2V0SGVhZGVyVHlwZSgpO1xuICAgIGNvbnN0IHByb2plY3RJbmZvOiBZdW56YWlQcm9qZWN0SW5mbyA9IGdldFByb2plY3RJbmZvKCkhO1xuICAgIGlmIChuYXZUeXBlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnN0YXRlLm5hdlR5cGUgPSBuYXZUeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlLm5hdlR5cGUgPSBOYXZUeXBlLkFQUExJQ0FUSU9OO1xuICAgIH1cbiAgICBpZiAocHJvamVjdEluZm8uaGVhZGVyU3R5bGUgJiYgcHJvamVjdEluZm8uaGVhZGVyU3R5bGUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5oZWFkZXJTdHlsZUxpc3QgPSBwcm9qZWN0SW5mby5oZWFkZXJTdHlsZTtcbiAgICAgIGNvbnN0IGhhc1RoaXMgPSB0aGlzLmhlYWRlclN0eWxlTGlzdC5zb21lKGl0ZW0gPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5zdGF0ZS5uYXZUeXBlKTtcbiAgICAgIGlmICghaGFzVGhpcykge1xuICAgICAgICB0aGlzLnN0YXRlLm5hdlR5cGUgPSA8TmF2VHlwZT5wcm9qZWN0SW5mby5oZWFkZXJTdHlsZVswXS52YWx1ZTtcbiAgICAgICAgY29uc3QgW3NldEhlYWRlclR5cGVdID0gdXNlTG9jYWxTdG9yYWdlSGVhZGVyVHlwZSgpO1xuICAgICAgICBzZXRIZWFkZXJUeXBlKHRoaXMuc3RhdGUubmF2VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9JbmRleCgpOiB2b2lkIHtcbiAgICBjb25zdCBbLCBnZXREZWZhdWx0Um91dGVdID0gdXNlTG9jYWxTdG9yYWdlRGVmYXVsdFJvdXRlKCk7XG4gICAgY29uc3QgZGVmYXVsdFJvdXRlID0gZ2V0RGVmYXVsdFJvdXRlKCkhO1xuICAgIGxvZygnWXVuemFpTGF5b3V0QmFzaWNDb21wb25lbnQ6ICcsIGB0b2RvOiB0aGUgZGVmYXVsdCByb3V0ZSB3YXMgJHtkZWZhdWx0Um91dGV9LCDkvYbmmK/ov5jmsqHmg7Plpb3lpoLkvZXlrp7njrAuYCk7XG4gIH1cblxuICBvbk5hdlR5cGVDaGFuZ2UodHlwZTogTmF2VHlwZSB8IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IFtzZXRIZWFkZXJUeXBlXSA9IHVzZUxvY2FsU3RvcmFnZUhlYWRlclR5cGUoKTtcbiAgICBzZXRIZWFkZXJUeXBlKDxOYXZUeXBlPnR5cGUpO1xuICAgIHRoaXMud2luLmxvY2F0aW9uLnJlbG9hZCgpO1xuICB9XG5cbiAgYWRkTGF5b3V0RGlzcGxheUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIHRoaXMubGF5b3V0RGlzcGxheVNlcnZpY2UubGlzdGVuKCdyZXVzZVRhYicsIChkaXNwbGF5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlLmRpc3BsYXkucmV1c2V0YWIgPSBkaXNwbGF5O1xuICAgIH0pO1xuICAgIHRoaXMubGF5b3V0RGlzcGxheVNlcnZpY2UubGlzdGVuKCduYXYnLCAoZGlzcGxheTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5zdGF0ZS5kaXNwbGF5Lm5hdiA9IGRpc3BsYXk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmxheW91dERpc3BsYXlTZXJ2aWNlLmxpc3RlbignYXNpZGUnLCAoZGlzcGxheTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5zdGF0ZS5kaXNwbGF5LmFzaWRlID0gZGlzcGxheTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOWFs+S6juacrOW6lOeUqFxuICBhYm91dEFwcGxpY2F0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHVybEFyciA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdChgJHt0aGlzLmNvbmZpZy5iYXNlVXJsfS9gKTtcbiAgICBpZiAodXJsQXJyLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIOW6lOeUqOagh+ivhu+8jOaIquWPlui3r+W+hOS4rSAvYmFja3N0YWdlL+WQjuesrOS4gOS4quWtl+espuS4slxuICAgICAgLy8g5L6LOiBodHRwOi8vMjIyLjMwLjE5NC42MS9iYWNrc3RhZ2UvYXV0aC9wYWdlL29hZnBvcnRhbC8jL2Jhc2UvbWVudSAg5LitIGF1dGhcbiAgICAgIGNvbnN0IG5hbWUgPSB1cmxBcnJbMV0uc3BsaXQoJy8nKVswXTtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25Nb2RhbC5pc1Zpc2libGUgPSB0cnVlO1xuICAgICAgdGhpcy5hcHBsaWNhdGlvbk1vZGFsLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgICB0aGlzLmh0dHBDbGllbnQuZ2V0KGAvYmFzaWMvYXBpL2FwcC9hYm91dEFwcD9uYW1lPSR7bmFtZX1gKS5zdWJzY3JpYmUoXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgKHJlc3BvbnNlOiBOelNhZmVBbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uTW9kYWwubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uSW5mbyA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbk1vZGFsLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
1
+ import { CommonModule } from '@angular/common';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { Component, inject } from '@angular/core';
4
+ import { RouterModule } from '@angular/router';
5
+ import { ReuseTabModule } from '@yelon/abc/reuse-tab';
6
+ import { YunzaiWidgetsModule } from '@yelon/bis/yunzai-widgets';
7
+ import { StompService } from '@yelon/socket';
8
+ import { I18nPipe } from '@yelon/theme';
9
+ import { LayoutDefaultModule, LayoutDisplayService } from '@yelon/theme/layout-default';
10
+ import { ThemeBtnModule } from '@yelon/theme/theme-btn';
11
+ import { hasFavicon, log, NavType, setFavicon, useLocalStorageCurrent, useLocalStorageDefaultRoute, useLocalStorageHeaderType, useLocalStorageProjectInfo, WINDOW, YUNZAI_CONFIG } from '@yelon/util';
12
+ import { NzAvatarModule } from 'ng-zorro-antd/avatar';
13
+ import { NzDescriptionsModule } from 'ng-zorro-antd/descriptions';
14
+ import { NzDropDownModule } from 'ng-zorro-antd/dropdown';
15
+ import { NzIconModule } from 'ng-zorro-antd/icon';
16
+ import { NzModalModule } from 'ng-zorro-antd/modal';
17
+ import { NzSkeletonModule } from 'ng-zorro-antd/skeleton';
18
+ import { YunzaiNavApplicationComponent } from './layout-nav-application.component';
19
+ import { YunzaiLayoutNavGroupComponent } from './layout-nav-group.component';
20
+ import { YunzaiLayoutNavTileComponent } from './layout-nav-tile.component';
21
+ import * as i0 from "@angular/core";
22
+ import * as i1 from "@yelon/theme/layout-default";
23
+ import * as i2 from "@angular/router";
24
+ import * as i3 from "@yelon/abc/reuse-tab";
25
+ import * as i4 from "@angular/common";
26
+ import * as i5 from "ng-zorro-antd/menu";
27
+ import * as i6 from "ng-zorro-antd/dropdown";
28
+ import * as i7 from "ng-zorro-antd/avatar";
29
+ import * as i8 from "ng-zorro-antd/icon";
30
+ import * as i9 from "ng-zorro-antd/modal";
31
+ import * as i10 from "ng-zorro-antd/skeleton";
32
+ import * as i11 from "ng-zorro-antd/descriptions";
33
+ import * as i12 from "@yelon/theme/theme-btn";
34
+ import * as i13 from "@yelon/bis/yunzai-widgets";
35
+ export class YunzaiLayoutBasicComponent {
36
+ constructor() {
37
+ this.stomp = inject(StompService);
38
+ this.win = inject(WINDOW);
39
+ this.layoutDisplayService = inject(LayoutDisplayService);
40
+ this.conf = inject(YUNZAI_CONFIG);
41
+ this.NavType = NavType;
42
+ this.state = {
43
+ options: {
44
+ logoExpanded: `./assets/logo-full.svg`,
45
+ logoCollapsed: `./assets/logo.svg`
46
+ },
47
+ aside: {
48
+ name: '',
49
+ intro: '',
50
+ icon: ''
51
+ },
52
+ display: {
53
+ nav: true,
54
+ aside: true,
55
+ reusetab: true
56
+ },
57
+ navType: NavType.APPLICATION
58
+ };
59
+ this.headerStyleList = [];
60
+ this.applicationModal = {
61
+ isVisible: false,
62
+ loading: false
63
+ };
64
+ this.httpClient = inject(HttpClient);
65
+ }
66
+ get options() {
67
+ return this.state.options;
68
+ }
69
+ get navType() {
70
+ return this.state.navType;
71
+ }
72
+ get aside() {
73
+ return this.state.aside;
74
+ }
75
+ get displayReusetab() {
76
+ return this.state.display.reusetab;
77
+ }
78
+ get reusetabCSS() {
79
+ let cascadingStyleSheet = {};
80
+ if (!this.state.display.nav) {
81
+ cascadingStyleSheet = {
82
+ ...cascadingStyleSheet,
83
+ top: '0px'
84
+ };
85
+ }
86
+ if (!this.state.display.aside) {
87
+ cascadingStyleSheet = {
88
+ ...cascadingStyleSheet,
89
+ left: '0px'
90
+ };
91
+ }
92
+ return cascadingStyleSheet;
93
+ }
94
+ ngOnInit() {
95
+ this.config = this.conf.bis;
96
+ this.initLogo();
97
+ this.initFavicon();
98
+ this.initNavType();
99
+ this.initAside();
100
+ this.addLayoutDisplayListener();
101
+ this.stomp.listen();
102
+ this.toIndex();
103
+ }
104
+ initFavicon() {
105
+ const [, getProjectInfo] = useLocalStorageProjectInfo();
106
+ const projectInfo = getProjectInfo();
107
+ if (projectInfo.faviconUrl) {
108
+ hasFavicon(projectInfo.faviconUrl).then((has) => {
109
+ if (has) {
110
+ setFavicon(projectInfo.faviconUrl);
111
+ }
112
+ else {
113
+ setFavicon('./assets/favicon.ico');
114
+ }
115
+ });
116
+ }
117
+ }
118
+ initAside() {
119
+ const [, getCurrent] = useLocalStorageCurrent();
120
+ const aside = getCurrent();
121
+ this.state.aside = { ...aside };
122
+ }
123
+ initLogo() {
124
+ const [, getProjectInfo] = useLocalStorageProjectInfo();
125
+ const projectInfo = getProjectInfo();
126
+ this.state.options.logoExpanded = projectInfo.maxLogoUrl ? projectInfo.maxLogoUrl : `./assets/logo-full.svg`;
127
+ this.state.options.logoCollapsed = projectInfo.miniLogoUrl ? projectInfo.miniLogoUrl : `./assets/logo.svg`;
128
+ }
129
+ initNavType() {
130
+ const [, getHeaderType] = useLocalStorageHeaderType();
131
+ const [, getProjectInfo] = useLocalStorageProjectInfo();
132
+ const navType = getHeaderType();
133
+ const projectInfo = getProjectInfo();
134
+ if (navType !== null) {
135
+ this.state.navType = navType;
136
+ }
137
+ else {
138
+ this.state.navType = NavType.APPLICATION;
139
+ }
140
+ if (projectInfo.headerStyle && projectInfo.headerStyle.length > 0) {
141
+ this.headerStyleList = projectInfo.headerStyle;
142
+ const hasThis = this.headerStyleList.some(item => item.value === this.state.navType);
143
+ if (!hasThis) {
144
+ this.state.navType = projectInfo.headerStyle[0].value;
145
+ const [setHeaderType] = useLocalStorageHeaderType();
146
+ setHeaderType(this.state.navType);
147
+ }
148
+ }
149
+ }
150
+ toIndex() {
151
+ const [, getDefaultRoute] = useLocalStorageDefaultRoute();
152
+ const defaultRoute = getDefaultRoute();
153
+ log('YunzaiLayoutBasicComponent: ', `todo: the default route was ${defaultRoute}, 但是还没想好如何实现.`);
154
+ }
155
+ onNavTypeChange(type) {
156
+ const [setHeaderType] = useLocalStorageHeaderType();
157
+ setHeaderType(type);
158
+ this.win.location.reload();
159
+ }
160
+ addLayoutDisplayListener() {
161
+ this.layoutDisplayService.listen('reuseTab', (display) => {
162
+ this.state.display.reusetab = display;
163
+ });
164
+ this.layoutDisplayService.listen('nav', (display) => {
165
+ this.state.display.nav = display;
166
+ });
167
+ this.layoutDisplayService.listen('aside', (display) => {
168
+ this.state.display.aside = display;
169
+ });
170
+ }
171
+ // 关于本应用
172
+ aboutApplication() {
173
+ const urlArr = window.location.pathname.split(`${this.config.baseUrl}/`);
174
+ if (urlArr.length > 1) {
175
+ // 应用标识,截取路径中 /backstage/后第一个字符串
176
+ // 例: http://222.30.194.61/backstage/auth/page/oafportal/#/base/menu 中 auth
177
+ const name = urlArr[1].split('/')[0];
178
+ this.applicationModal.isVisible = true;
179
+ this.applicationModal.loading = true;
180
+ // eslint-disable-next-line deprecation/deprecation
181
+ this.httpClient.get(`/basic/api/app/aboutApp?name=${name}`).subscribe(
182
+ // @ts-ignore
183
+ (response) => {
184
+ this.applicationModal.loading = false;
185
+ if (response.data) {
186
+ this.applicationInfo = response.data;
187
+ }
188
+ }, () => {
189
+ this.applicationModal.loading = false;
190
+ });
191
+ }
192
+ }
193
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: YunzaiLayoutBasicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
194
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: YunzaiLayoutBasicComponent, isStandalone: true, selector: "yunzai-layout-basic", ngImport: i0, template: `
195
+ <layout-default [options]="options" [asideUser]="asideUserTpl" [content]="displayReusetab ? contentTpl : noneTpl">
196
+ <layout-default-header-item direction="left">
197
+ <ng-container [ngSwitch]="navType">
198
+ <ng-container *ngSwitchCase="NavType.APPLICATION">
199
+ <yunzai-layout-nav-application />
200
+ </ng-container>
201
+ <ng-container *ngSwitchCase="NavType.GROUP">
202
+ <yunzai-layout-nav-group />
203
+ </ng-container>
204
+ <ng-container *ngSwitchCase="NavType.TILE">
205
+ <yunzai-layout-nav-tile />
206
+ </ng-container>
207
+ <ng-container *ngSwitchCase="NavType.BLANK" />
208
+ <ng-container *ngSwitchCase="NavType.TABS" />
209
+ <ng-container *ngSwitchDefault>
210
+ <yunzai-layout-nav-application />
211
+ </ng-container>
212
+ </ng-container>
213
+ </layout-default-header-item>
214
+ <layout-default-header-item direction="right" hidden="mobile">
215
+ <yunzai-header-notify />
216
+ </layout-default-header-item>
217
+ <layout-default-header-item direction="right" hidden="mobile">
218
+ <theme-btn />
219
+ </layout-default-header-item>
220
+ <layout-default-header-item direction="right" hidden="mobile">
221
+ <div
222
+ data-event-id="_nav_settings"
223
+ layout-default-header-item-trigger
224
+ nz-dropdown
225
+ [nzDropdownMenu]="settingsMenu"
226
+ nzTrigger="click"
227
+ nzPlacement="bottomRight"
228
+ >
229
+ <i nz-icon nzType="setting"></i>
230
+ </div>
231
+ <nz-dropdown-menu #settingsMenu="nzDropdownMenu">
232
+ <div nz-menu style="width: 200px;">
233
+ <div data-event-id="_nav_mode" nz-menu-item>
234
+ {{ 'mode.nav' | i18n }}
235
+ </div>
236
+
237
+ @if (headerStyleList.length > 1) {
238
+ @for (i of headerStyleList; track $index) {
239
+ <div
240
+ data-event-id="_nav_mode"
241
+ nz-menu-item
242
+ [attr.data-type]="i.value"
243
+ (click)="onNavTypeChange(i.value)"
244
+ >
245
+ <ng-container [ngSwitch]="i.value">
246
+ <ng-container *ngSwitchCase="NavType.APPLICATION">
247
+ <i nz-icon nzType="appstore" class="mr-sm"></i>
248
+ </ng-container>
249
+ <ng-container *ngSwitchCase="NavType.GROUP">
250
+ <i nz-icon nzType="group" class="mr-sm"></i>
251
+ </ng-container>
252
+ <ng-container *ngSwitchCase="NavType.TILE">
253
+ <i nz-icon nzType="dash" class="mr-sm"></i>
254
+ </ng-container>
255
+ <ng-container *ngSwitchCase="NavType.BLANK">
256
+ <i nz-icon nzType="border" class="mr-sm"></i>
257
+ </ng-container>
258
+ <ng-container *ngSwitchCase="NavType.TABS">
259
+ <i nz-icon nzType="insert-row-above" class="mr-sm"></i>
260
+ </ng-container>
261
+ <ng-container *ngSwitchDefault>
262
+ <i nz-icon nzType="appstore" class="mr-sm"></i>
263
+ </ng-container>
264
+ {{ 'mode.nav.' + i.value | i18n }}
265
+ </ng-container>
266
+ </div>
267
+ }
268
+ }
269
+
270
+ <div data-event-id="_nav_fullscreen" nz-menu-item>
271
+ <yunzai-header-fullscreen />
272
+ </div>
273
+ <div data-event-id="_nav_clearstorage" nz-menu-item>
274
+ <yunzai-header-clear-storage />
275
+ </div>
276
+ <div data-event-id="_nav_i18n" nz-menu-item>
277
+ <yunzai-header-i18n />
278
+ </div>
279
+ </div>
280
+ </nz-dropdown-menu>
281
+ </layout-default-header-item>
282
+ <layout-default-header-item direction="right">
283
+ <yunzai-header-user />
284
+ </layout-default-header-item>
285
+ </layout-default>
286
+ <ng-template #asideUserTpl>
287
+ <div data-event-id="_route_user" class="yunzai-default__aside-user">
288
+ <nz-avatar
289
+ class="yunzai-default__aside-user-avatar"
290
+ [nzSize]="40"
291
+ [nzSrc]="aside.icon"
292
+ (click)="aboutApplication()"
293
+ />
294
+ <div class="yunzai-default__aside-user-info" nz-dropdown nzTrigger="click" [nzDropdownMenu]="userMenu">
295
+ <strong>{{ aside.name | i18n }}</strong>
296
+ <p>{{ aside.intro | i18n }}</p>
297
+ </div>
298
+ </div>
299
+ <nz-dropdown-menu #userMenu="nzDropdownMenu">
300
+ <ul nz-menu>
301
+ <li data-event-id="_route_backhome" nz-menu-item routerLink="/">{{ 'back.home' | i18n }}</li>
302
+ </ul>
303
+ </nz-dropdown-menu>
304
+ </ng-template>
305
+ <ng-template #contentTpl>
306
+ <reuse-tab #reuseTab [ngStyle]="reusetabCSS" />
307
+ <router-outlet (activate)="reuseTab.activate($event)" (attach)="reuseTab.activate($event)" />
308
+ </ng-template>
309
+ <ng-template #noneTpl>
310
+ <router-outlet />
311
+ </ng-template>
312
+
313
+ <nz-modal
314
+ nzTitle="关于本应用"
315
+ [(nzVisible)]="applicationModal.isVisible"
316
+ [nzOkText]="null"
317
+ [nzCancelText]="'关闭'"
318
+ [nzWidth]="700"
319
+ (nzOnCancel)="applicationModal.isVisible = false"
320
+ >
321
+ <ng-container *nzModalContent>
322
+ <nz-skeleton [nzLoading]="applicationModal.loading" [nzActive]="true">
323
+ <nz-descriptions nzBordered [nzSize]="'middle'" [nzColumn]="{ xxl: 2, xl: 2, lg: 2, md: 2, sm: 2, xs: 1 }">
324
+ <nz-descriptions-item nzTitle="应用名称">{{ applicationInfo?.showName }}</nz-descriptions-item>
325
+ <nz-descriptions-item nzTitle="应用标识">{{ applicationInfo?.name }}</nz-descriptions-item>
326
+ <nz-descriptions-item nzTitle="版本总数">{{ applicationInfo?.versionNum }}</nz-descriptions-item>
327
+ <nz-descriptions-item nzTitle="应用首次部署时间">{{
328
+ applicationInfo?.firstDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
329
+ }}</nz-descriptions-item>
330
+ <nz-descriptions-item nzTitle="当前版本">{{ applicationInfo?.currentVersion }}</nz-descriptions-item>
331
+ <nz-descriptions-item nzTitle="当前版本部署时间">{{
332
+ applicationInfo?.currentDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
333
+ }}</nz-descriptions-item>
334
+ <nz-descriptions-item nzTitle="最新版本">{{ applicationInfo?.lastVersion }}</nz-descriptions-item>
335
+ <nz-descriptions-item nzTitle="最新版本发布时间">{{
336
+ applicationInfo?.lastPushDate | date: 'yyyy-MM-dd HH:mm:ss'
337
+ }}</nz-descriptions-item>
338
+ </nz-descriptions>
339
+ </nz-skeleton>
340
+ </ng-container>
341
+ </nz-modal>
342
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: LayoutDefaultModule }, { kind: "component", type: i1.LayoutDefaultComponent, selector: "layout-default", inputs: ["options", "asideUser", "asideBottom", "nav", "content", "customError", "fetchingStrictly", "fetching"], exportAs: ["layoutDefault"] }, { kind: "component", type: i1.LayoutDefaultHeaderItemComponent, selector: "layout-default-header-item", inputs: ["hidden", "direction"] }, { kind: "directive", type: i1.LayoutDefaultHeaderItemTriggerDirective, selector: "[layout-default-header-item-trigger]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: ReuseTabModule }, { kind: "component", type: i3.ReuseTabComponent, selector: "reuse-tab, [reuse-tab]", inputs: ["mode", "i18n", "debug", "max", "tabMaxWidth", "excludes", "allowClose", "keepingScroll", "storageState", "keepingScrollContainer", "customContextMenu", "tabBarExtraContent", "tabBarGutter", "tabBarStyle", "tabType", "routeParamMatchMode", "disabled", "titleRender", "canClose"], outputs: ["change", "close"], exportAs: ["reuseTab"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: I18nPipe, name: "i18n" }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i5.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i5.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "directive", type: i6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "ngmodule", type: NzAvatarModule }, { kind: "component", type: i7.NzAvatarComponent, selector: "nz-avatar", inputs: ["nzShape", "nzSize", "nzGap", "nzText", "nzSrc", "nzSrcSet", "nzAlt", "nzIcon"], outputs: ["nzError"], exportAs: ["nzAvatar"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i8.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzModalModule }, { kind: "component", type: i9.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i9.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzSkeletonModule }, { kind: "component", type: i10.NzSkeletonComponent, selector: "nz-skeleton", inputs: ["nzActive", "nzLoading", "nzRound", "nzTitle", "nzAvatar", "nzParagraph"], exportAs: ["nzSkeleton"] }, { kind: "ngmodule", type: NzDescriptionsModule }, { kind: "component", type: i11.NzDescriptionsComponent, selector: "nz-descriptions", inputs: ["nzBordered", "nzLayout", "nzColumn", "nzSize", "nzTitle", "nzExtra", "nzColon"], exportAs: ["nzDescriptions"] }, { kind: "component", type: i11.NzDescriptionsItemComponent, selector: "nz-descriptions-item", inputs: ["nzSpan", "nzTitle"], exportAs: ["nzDescriptionsItem"] }, { kind: "ngmodule", type: ThemeBtnModule }, { kind: "component", type: i12.ThemeBtnComponent, selector: "theme-btn", inputs: ["types", "devTips", "deployUrl"], outputs: ["themeChange"] }, { kind: "ngmodule", type: YunzaiWidgetsModule }, { kind: "component", type: i13.YunzaiHeaderClearStorageComponent, selector: "yunzai-header-clear-storage" }, { kind: "component", type: i13.YunzaiHeaderFullScreenComponent, selector: "yunzai-header-fullscreen" }, { kind: "component", type: i13.YunzaiHeaderNotifyComponent, selector: "yunzai-header-notify" }, { kind: "component", type: i13.YunzaiHeaderI18nComponent, selector: "yunzai-header-i18n", inputs: ["showLangText"] }, { kind: "component", type: i13.YunzaiHeaderUserComponent, selector: "yunzai-header-user" }, { kind: "component", type: YunzaiNavApplicationComponent, selector: "yunzai-layout-nav-application" }, { kind: "component", type: YunzaiLayoutNavGroupComponent, selector: "yunzai-layout-nav-group" }, { kind: "component", type: YunzaiLayoutNavTileComponent, selector: "yunzai-layout-nav-tile" }] }); }
343
+ }
344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: YunzaiLayoutBasicComponent, decorators: [{
345
+ type: Component,
346
+ args: [{
347
+ selector: `yunzai-layout-basic`,
348
+ template: `
349
+ <layout-default [options]="options" [asideUser]="asideUserTpl" [content]="displayReusetab ? contentTpl : noneTpl">
350
+ <layout-default-header-item direction="left">
351
+ <ng-container [ngSwitch]="navType">
352
+ <ng-container *ngSwitchCase="NavType.APPLICATION">
353
+ <yunzai-layout-nav-application />
354
+ </ng-container>
355
+ <ng-container *ngSwitchCase="NavType.GROUP">
356
+ <yunzai-layout-nav-group />
357
+ </ng-container>
358
+ <ng-container *ngSwitchCase="NavType.TILE">
359
+ <yunzai-layout-nav-tile />
360
+ </ng-container>
361
+ <ng-container *ngSwitchCase="NavType.BLANK" />
362
+ <ng-container *ngSwitchCase="NavType.TABS" />
363
+ <ng-container *ngSwitchDefault>
364
+ <yunzai-layout-nav-application />
365
+ </ng-container>
366
+ </ng-container>
367
+ </layout-default-header-item>
368
+ <layout-default-header-item direction="right" hidden="mobile">
369
+ <yunzai-header-notify />
370
+ </layout-default-header-item>
371
+ <layout-default-header-item direction="right" hidden="mobile">
372
+ <theme-btn />
373
+ </layout-default-header-item>
374
+ <layout-default-header-item direction="right" hidden="mobile">
375
+ <div
376
+ data-event-id="_nav_settings"
377
+ layout-default-header-item-trigger
378
+ nz-dropdown
379
+ [nzDropdownMenu]="settingsMenu"
380
+ nzTrigger="click"
381
+ nzPlacement="bottomRight"
382
+ >
383
+ <i nz-icon nzType="setting"></i>
384
+ </div>
385
+ <nz-dropdown-menu #settingsMenu="nzDropdownMenu">
386
+ <div nz-menu style="width: 200px;">
387
+ <div data-event-id="_nav_mode" nz-menu-item>
388
+ {{ 'mode.nav' | i18n }}
389
+ </div>
390
+
391
+ @if (headerStyleList.length > 1) {
392
+ @for (i of headerStyleList; track $index) {
393
+ <div
394
+ data-event-id="_nav_mode"
395
+ nz-menu-item
396
+ [attr.data-type]="i.value"
397
+ (click)="onNavTypeChange(i.value)"
398
+ >
399
+ <ng-container [ngSwitch]="i.value">
400
+ <ng-container *ngSwitchCase="NavType.APPLICATION">
401
+ <i nz-icon nzType="appstore" class="mr-sm"></i>
402
+ </ng-container>
403
+ <ng-container *ngSwitchCase="NavType.GROUP">
404
+ <i nz-icon nzType="group" class="mr-sm"></i>
405
+ </ng-container>
406
+ <ng-container *ngSwitchCase="NavType.TILE">
407
+ <i nz-icon nzType="dash" class="mr-sm"></i>
408
+ </ng-container>
409
+ <ng-container *ngSwitchCase="NavType.BLANK">
410
+ <i nz-icon nzType="border" class="mr-sm"></i>
411
+ </ng-container>
412
+ <ng-container *ngSwitchCase="NavType.TABS">
413
+ <i nz-icon nzType="insert-row-above" class="mr-sm"></i>
414
+ </ng-container>
415
+ <ng-container *ngSwitchDefault>
416
+ <i nz-icon nzType="appstore" class="mr-sm"></i>
417
+ </ng-container>
418
+ {{ 'mode.nav.' + i.value | i18n }}
419
+ </ng-container>
420
+ </div>
421
+ }
422
+ }
423
+
424
+ <div data-event-id="_nav_fullscreen" nz-menu-item>
425
+ <yunzai-header-fullscreen />
426
+ </div>
427
+ <div data-event-id="_nav_clearstorage" nz-menu-item>
428
+ <yunzai-header-clear-storage />
429
+ </div>
430
+ <div data-event-id="_nav_i18n" nz-menu-item>
431
+ <yunzai-header-i18n />
432
+ </div>
433
+ </div>
434
+ </nz-dropdown-menu>
435
+ </layout-default-header-item>
436
+ <layout-default-header-item direction="right">
437
+ <yunzai-header-user />
438
+ </layout-default-header-item>
439
+ </layout-default>
440
+ <ng-template #asideUserTpl>
441
+ <div data-event-id="_route_user" class="yunzai-default__aside-user">
442
+ <nz-avatar
443
+ class="yunzai-default__aside-user-avatar"
444
+ [nzSize]="40"
445
+ [nzSrc]="aside.icon"
446
+ (click)="aboutApplication()"
447
+ />
448
+ <div class="yunzai-default__aside-user-info" nz-dropdown nzTrigger="click" [nzDropdownMenu]="userMenu">
449
+ <strong>{{ aside.name | i18n }}</strong>
450
+ <p>{{ aside.intro | i18n }}</p>
451
+ </div>
452
+ </div>
453
+ <nz-dropdown-menu #userMenu="nzDropdownMenu">
454
+ <ul nz-menu>
455
+ <li data-event-id="_route_backhome" nz-menu-item routerLink="/">{{ 'back.home' | i18n }}</li>
456
+ </ul>
457
+ </nz-dropdown-menu>
458
+ </ng-template>
459
+ <ng-template #contentTpl>
460
+ <reuse-tab #reuseTab [ngStyle]="reusetabCSS" />
461
+ <router-outlet (activate)="reuseTab.activate($event)" (attach)="reuseTab.activate($event)" />
462
+ </ng-template>
463
+ <ng-template #noneTpl>
464
+ <router-outlet />
465
+ </ng-template>
466
+
467
+ <nz-modal
468
+ nzTitle="关于本应用"
469
+ [(nzVisible)]="applicationModal.isVisible"
470
+ [nzOkText]="null"
471
+ [nzCancelText]="'关闭'"
472
+ [nzWidth]="700"
473
+ (nzOnCancel)="applicationModal.isVisible = false"
474
+ >
475
+ <ng-container *nzModalContent>
476
+ <nz-skeleton [nzLoading]="applicationModal.loading" [nzActive]="true">
477
+ <nz-descriptions nzBordered [nzSize]="'middle'" [nzColumn]="{ xxl: 2, xl: 2, lg: 2, md: 2, sm: 2, xs: 1 }">
478
+ <nz-descriptions-item nzTitle="应用名称">{{ applicationInfo?.showName }}</nz-descriptions-item>
479
+ <nz-descriptions-item nzTitle="应用标识">{{ applicationInfo?.name }}</nz-descriptions-item>
480
+ <nz-descriptions-item nzTitle="版本总数">{{ applicationInfo?.versionNum }}</nz-descriptions-item>
481
+ <nz-descriptions-item nzTitle="应用首次部署时间">{{
482
+ applicationInfo?.firstDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
483
+ }}</nz-descriptions-item>
484
+ <nz-descriptions-item nzTitle="当前版本">{{ applicationInfo?.currentVersion }}</nz-descriptions-item>
485
+ <nz-descriptions-item nzTitle="当前版本部署时间">{{
486
+ applicationInfo?.currentDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
487
+ }}</nz-descriptions-item>
488
+ <nz-descriptions-item nzTitle="最新版本">{{ applicationInfo?.lastVersion }}</nz-descriptions-item>
489
+ <nz-descriptions-item nzTitle="最新版本发布时间">{{
490
+ applicationInfo?.lastPushDate | date: 'yyyy-MM-dd HH:mm:ss'
491
+ }}</nz-descriptions-item>
492
+ </nz-descriptions>
493
+ </nz-skeleton>
494
+ </ng-container>
495
+ </nz-modal>
496
+ `,
497
+ standalone: true,
498
+ imports: [
499
+ LayoutDefaultModule,
500
+ RouterModule,
501
+ ReuseTabModule,
502
+ CommonModule,
503
+ I18nPipe,
504
+ NzDropDownModule,
505
+ NzAvatarModule,
506
+ NzIconModule,
507
+ NzModalModule,
508
+ NzSkeletonModule,
509
+ NzDescriptionsModule,
510
+ ThemeBtnModule,
511
+ YunzaiWidgetsModule,
512
+ YunzaiNavApplicationComponent,
513
+ YunzaiLayoutNavGroupComponent,
514
+ YunzaiLayoutNavTileComponent
515
+ ]
516
+ }]
517
+ }] });
518
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJhc2ljLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Jpcy9sYXlvdXQvbGF5b3V0LWJhc2ljLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBd0Isb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUNMLFVBQVUsRUFHVixHQUFHLEVBQ0gsT0FBTyxFQUNQLFVBQVUsRUFDVixzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsTUFBTSxFQUNOLGFBQWEsRUFLZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZ00zRSxNQUFNLE9BQU8sMEJBQTBCO0lBM0t2QztRQTRLbUIsVUFBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QixRQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JCLHlCQUFvQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3BELFNBQUksR0FBaUIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXJELFlBQU8sR0FBRyxPQUFPLENBQUM7UUFDakIsVUFBSyxHQUFxQjtZQUNoQyxPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLHdCQUF3QjtnQkFDdEMsYUFBYSxFQUFFLG1CQUFtQjthQUNuQztZQUNELEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsRUFBRTtnQkFDUixLQUFLLEVBQUUsRUFBRTtnQkFDVCxJQUFJLEVBQUUsRUFBRTthQUNUO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLEdBQUcsRUFBRSxJQUFJO2dCQUNULEtBQUssRUFBRSxJQUFJO2dCQUNYLFFBQVEsRUFBRSxJQUFJO2FBQ2Y7WUFDRCxPQUFPLEVBQUUsT0FBTyxDQUFDLFdBQVc7U0FDN0IsQ0FBQztRQUVGLG9CQUFlLEdBQXdCLEVBQUUsQ0FBQztRQUkxQyxxQkFBZ0IsR0FBRztZQUNqQixTQUFTLEVBQUUsS0FBSztZQUNoQixPQUFPLEVBQUUsS0FBSztTQUNmLENBQUM7UUFFZSxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBZ0psRDtJQTdJQyxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLElBQUksbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM1QixtQkFBbUIsR0FBRztnQkFDcEIsR0FBRyxtQkFBbUI7Z0JBQ3RCLEdBQUcsRUFBRSxLQUFLO2FBQ1gsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsbUJBQW1CLEdBQUc7Z0JBQ3BCLEdBQUcsbUJBQW1CO2dCQUN0QixJQUFJLEVBQUUsS0FBSzthQUNaLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxDQUFDLEVBQUUsY0FBYyxDQUFDLEdBQUcsMEJBQTBCLEVBQUUsQ0FBQztRQUN4RCxNQUFNLFdBQVcsR0FBc0IsY0FBYyxFQUFHLENBQUM7UUFDekQsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0IsVUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFZLEVBQUUsRUFBRTtnQkFDdkQsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDUixVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNyQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBQ3JDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLHNCQUFzQixFQUFFLENBQUM7UUFDaEQsTUFBTSxLQUFLLEdBQXFCLFVBQVUsRUFBRyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxHQUFHLDBCQUEwQixFQUFFLENBQUM7UUFDeEQsTUFBTSxXQUFXLEdBQXNCLGNBQWMsRUFBRyxDQUFDO1FBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQztRQUM3RyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7SUFDN0csQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLENBQUMsRUFBRSxhQUFhLENBQUMsR0FBRyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxHQUFHLDBCQUEwQixFQUFFLENBQUM7UUFDeEQsTUFBTSxPQUFPLEdBQW1CLGFBQWEsRUFBRSxDQUFDO1FBQ2hELE1BQU0sV0FBVyxHQUFzQixjQUFjLEVBQUcsQ0FBQztRQUN6RCxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO1lBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JGLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBWSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDL0QsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLHlCQUF5QixFQUFFLENBQUM7Z0JBQ3BELGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLENBQUMsRUFBRSxlQUFlLENBQUMsR0FBRywyQkFBMkIsRUFBRSxDQUFDO1FBQzFELE1BQU0sWUFBWSxHQUFHLGVBQWUsRUFBRyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSwrQkFBK0IsWUFBWSxlQUFlLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQXNCO1FBQ3BDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3BELGFBQWEsQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBZ0IsRUFBRSxFQUFFO1lBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQWdCLEVBQUUsRUFBRTtZQUMzRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFnQixFQUFFLEVBQUU7WUFDN0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRO0lBQ1IsZ0JBQWdCO1FBQ2QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ3pFLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixnQ0FBZ0M7WUFDaEMsNEVBQTRFO1lBQzVFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDckMsbURBQW1EO1lBQ25ELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVM7WUFDbkUsYUFBYTtZQUNiLENBQUMsUUFBbUIsRUFBRSxFQUFFO2dCQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDdkMsQ0FBQztZQUNILENBQUMsRUFDRCxHQUFHLEVBQUU7Z0JBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDeEMsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQzs4R0FqTFUsMEJBQTBCO2tHQUExQiwwQkFBMEIsK0VBekszQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9KVCwyREFHQyxtQkFBbUIsdWdCQUNuQixZQUFZLHliQUNaLGNBQWMsNGNBQ2QsWUFBWSw4YUFDWixRQUFRLDRDQUNSLGdCQUFnQix5MkJBQ2hCLGNBQWMsZ1BBQ2QsWUFBWSxpTkFDWixhQUFhLGd6QkFDYixnQkFBZ0IsMk5BQ2hCLG9CQUFvQiwrWUFDcEIsY0FBYyw4S0FDZCxtQkFBbUIsc2lCQUNuQiw2QkFBNkIsMEVBQzdCLDZCQUE2QixvRUFDN0IsNEJBQTRCOzsyRkFHbkIsMEJBQTBCO2tCQTNLdEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvSlQ7b0JBQ0QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCxtQkFBbUI7d0JBQ25CLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxZQUFZO3dCQUNaLFFBQVE7d0JBQ1IsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLDZCQUE2Qjt3QkFDN0IsNkJBQTZCO3dCQUM3Qiw0QkFBNEI7cUJBQzdCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBSZXVzZVRhYk1vZHVsZSB9IGZyb20gJ0B5ZWxvbi9hYmMvcmV1c2UtdGFiJztcbmltcG9ydCB7IFl1bnphaVdpZGdldHNNb2R1bGUgfSBmcm9tICdAeWVsb24vYmlzL3l1bnphaS13aWRnZXRzJztcbmltcG9ydCB7IFN0b21wU2VydmljZSB9IGZyb20gJ0B5ZWxvbi9zb2NrZXQnO1xuaW1wb3J0IHsgSTE4blBpcGUgfSBmcm9tICdAeWVsb24vdGhlbWUnO1xuaW1wb3J0IHsgTGF5b3V0RGVmYXVsdE1vZHVsZSwgTGF5b3V0RGVmYXVsdE9wdGlvbnMsIExheW91dERpc3BsYXlTZXJ2aWNlIH0gZnJvbSAnQHllbG9uL3RoZW1lL2xheW91dC1kZWZhdWx0JztcbmltcG9ydCB7IFRoZW1lQnRuTW9kdWxlIH0gZnJvbSAnQHllbG9uL3RoZW1lL3RoZW1lLWJ0bic7XG5pbXBvcnQge1xuICBoYXNGYXZpY29uLFxuICBMYXlvdXRCYXNpY0FzaWRlLFxuICBMYXlvdXRCYXNpY0Rpc3BsYXksXG4gIGxvZyxcbiAgTmF2VHlwZSxcbiAgc2V0RmF2aWNvbixcbiAgdXNlTG9jYWxTdG9yYWdlQ3VycmVudCxcbiAgdXNlTG9jYWxTdG9yYWdlRGVmYXVsdFJvdXRlLFxuICB1c2VMb2NhbFN0b3JhZ2VIZWFkZXJUeXBlLFxuICB1c2VMb2NhbFN0b3JhZ2VQcm9qZWN0SW5mbyxcbiAgV0lORE9XLFxuICBZVU5aQUlfQ09ORklHLFxuICBZdW56YWlCdXNpbmVzc0NvbmZpZyxcbiAgWXVuemFpQ29uZmlnLFxuICBZdW56YWlIZWFkZXJTdHlsZSxcbiAgWXVuemFpUHJvamVjdEluZm9cbn0gZnJvbSAnQHllbG9uL3V0aWwnO1xuaW1wb3J0IHsgTnpBdmF0YXJNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2F2YXRhcic7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgTnpEZXNjcmlwdGlvbnNNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2Rlc2NyaXB0aW9ucyc7XG5pbXBvcnQgeyBOekRyb3BEb3duTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9kcm9wZG93bic7XG5pbXBvcnQgeyBOekljb25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2ljb24nO1xuaW1wb3J0IHsgTnpNb2RhbE1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvbW9kYWwnO1xuaW1wb3J0IHsgTnpTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvc2tlbGV0b24nO1xuXG5pbXBvcnQgeyBZdW56YWlOYXZBcHBsaWNhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LW5hdi1hcHBsaWNhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgWXVuemFpTGF5b3V0TmF2R3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2xheW91dC1uYXYtZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFl1bnphaUxheW91dE5hdlRpbGVDb21wb25lbnQgfSBmcm9tICcuL2xheW91dC1uYXYtdGlsZS5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dEJhc2ljU3RhdGUge1xuICBvcHRpb25zOiBMYXlvdXREZWZhdWx0T3B0aW9ucztcbiAgYXNpZGU6IExheW91dEJhc2ljQXNpZGU7XG4gIGRpc3BsYXk6IExheW91dEJhc2ljRGlzcGxheTtcbiAgbmF2VHlwZTogTmF2VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkluZm9JbnRlcmZhY2Uge1xuICBpZD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgc2hvd05hbWU/OiBzdHJpbmc7XG4gIGxhc3RWZXJzaW9uPzogc3RyaW5nO1xuICB2ZXJzaW9uTnVtPzogc3RyaW5nO1xuICBjdXJyZW50VmVyc2lvbj86IHN0cmluZztcbiAgZmlyc3REZXBsb3ltZW50RGF0ZT86IHN0cmluZztcbiAgY3VycmVudERlcGxveW1lbnREYXRlPzogc3RyaW5nO1xuICBsYXN0UHVzaERhdGU/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogYHl1bnphaS1sYXlvdXQtYmFzaWNgLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxsYXlvdXQtZGVmYXVsdCBbb3B0aW9uc109XCJvcHRpb25zXCIgW2FzaWRlVXNlcl09XCJhc2lkZVVzZXJUcGxcIiBbY29udGVudF09XCJkaXNwbGF5UmV1c2V0YWIgPyBjb250ZW50VHBsIDogbm9uZVRwbFwiPlxuICAgICAgPGxheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtIGRpcmVjdGlvbj1cImxlZnRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwibmF2VHlwZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuQVBQTElDQVRJT05cIj5cbiAgICAgICAgICAgIDx5dW56YWktbGF5b3V0LW5hdi1hcHBsaWNhdGlvbiAvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuR1JPVVBcIj5cbiAgICAgICAgICAgIDx5dW56YWktbGF5b3V0LW5hdi1ncm91cCAvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuVElMRVwiPlxuICAgICAgICAgICAgPHl1bnphaS1sYXlvdXQtbmF2LXRpbGUgLz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLkJMQU5LXCIgLz5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLlRBQlNcIiAvPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgIDx5dW56YWktbGF5b3V0LW5hdi1hcHBsaWNhdGlvbiAvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0+XG4gICAgICA8bGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0gZGlyZWN0aW9uPVwicmlnaHRcIiBoaWRkZW49XCJtb2JpbGVcIj5cbiAgICAgICAgPHl1bnphaS1oZWFkZXItbm90aWZ5IC8+XG4gICAgICA8L2xheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtPlxuICAgICAgPGxheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtIGRpcmVjdGlvbj1cInJpZ2h0XCIgaGlkZGVuPVwibW9iaWxlXCI+XG4gICAgICAgIDx0aGVtZS1idG4gLz5cbiAgICAgIDwvbGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0+XG4gICAgICA8bGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0gZGlyZWN0aW9uPVwicmlnaHRcIiBoaWRkZW49XCJtb2JpbGVcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhdGEtZXZlbnQtaWQ9XCJfbmF2X3NldHRpbmdzXCJcbiAgICAgICAgICBsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbS10cmlnZ2VyXG4gICAgICAgICAgbnotZHJvcGRvd25cbiAgICAgICAgICBbbnpEcm9wZG93bk1lbnVdPVwic2V0dGluZ3NNZW51XCJcbiAgICAgICAgICBuelRyaWdnZXI9XCJjbGlja1wiXG4gICAgICAgICAgbnpQbGFjZW1lbnQ9XCJib3R0b21SaWdodFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBuei1pY29uIG56VHlwZT1cInNldHRpbmdcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bnotZHJvcGRvd24tbWVudSAjc2V0dGluZ3NNZW51PVwibnpEcm9wZG93bk1lbnVcIj5cbiAgICAgICAgICA8ZGl2IG56LW1lbnUgc3R5bGU9XCJ3aWR0aDogMjAwcHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtZXZlbnQtaWQ9XCJfbmF2X21vZGVcIiBuei1tZW51LWl0ZW0+XG4gICAgICAgICAgICAgIHt7ICdtb2RlLm5hdicgfCBpMThuIH19XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgQGlmIChoZWFkZXJTdHlsZUxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICBAZm9yIChpIG9mIGhlYWRlclN0eWxlTGlzdDsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgZGF0YS1ldmVudC1pZD1cIl9uYXZfbW9kZVwiXG4gICAgICAgICAgICAgICAgICBuei1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdHlwZV09XCJpLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk5hdlR5cGVDaGFuZ2UoaS52YWx1ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImkudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiTmF2VHlwZS5BUFBMSUNBVElPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiYXBwc3RvcmVcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiTmF2VHlwZS5HUk9VUFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiZ3JvdXBcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiTmF2VHlwZS5USUxFXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJkYXNoXCIgY2xhc3M9XCJtci1zbVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuQkxBTktcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIG56VHlwZT1cImJvcmRlclwiIGNsYXNzPVwibXItc21cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLlRBQlNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIG56VHlwZT1cImluc2VydC1yb3ctYWJvdmVcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiYXBwc3RvcmVcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ21vZGUubmF2LicgKyBpLnZhbHVlIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPGRpdiBkYXRhLWV2ZW50LWlkPVwiX25hdl9mdWxsc2NyZWVuXCIgbnotbWVudS1pdGVtPlxuICAgICAgICAgICAgICA8eXVuemFpLWhlYWRlci1mdWxsc2NyZWVuIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1ldmVudC1pZD1cIl9uYXZfY2xlYXJzdG9yYWdlXCIgbnotbWVudS1pdGVtPlxuICAgICAgICAgICAgICA8eXVuemFpLWhlYWRlci1jbGVhci1zdG9yYWdlIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1ldmVudC1pZD1cIl9uYXZfaTE4blwiIG56LW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAgPHl1bnphaS1oZWFkZXItaTE4biAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbnotZHJvcGRvd24tbWVudT5cbiAgICAgIDwvbGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0+XG4gICAgICA8bGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0gZGlyZWN0aW9uPVwicmlnaHRcIj5cbiAgICAgICAgPHl1bnphaS1oZWFkZXItdXNlciAvPlxuICAgICAgPC9sYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbT5cbiAgICA8L2xheW91dC1kZWZhdWx0PlxuICAgIDxuZy10ZW1wbGF0ZSAjYXNpZGVVc2VyVHBsPlxuICAgICAgPGRpdiBkYXRhLWV2ZW50LWlkPVwiX3JvdXRlX3VzZXJcIiBjbGFzcz1cInl1bnphaS1kZWZhdWx0X19hc2lkZS11c2VyXCI+XG4gICAgICAgIDxuei1hdmF0YXJcbiAgICAgICAgICBjbGFzcz1cInl1bnphaS1kZWZhdWx0X19hc2lkZS11c2VyLWF2YXRhclwiXG4gICAgICAgICAgW256U2l6ZV09XCI0MFwiXG4gICAgICAgICAgW256U3JjXT1cImFzaWRlLmljb25cIlxuICAgICAgICAgIChjbGljayk9XCJhYm91dEFwcGxpY2F0aW9uKClcIlxuICAgICAgICAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwieXVuemFpLWRlZmF1bHRfX2FzaWRlLXVzZXItaW5mb1wiIG56LWRyb3Bkb3duIG56VHJpZ2dlcj1cImNsaWNrXCIgW256RHJvcGRvd25NZW51XT1cInVzZXJNZW51XCI+XG4gICAgICAgICAgPHN0cm9uZz57eyBhc2lkZS5uYW1lIHwgaTE4biB9fTwvc3Ryb25nPlxuICAgICAgICAgIDxwPnt7IGFzaWRlLmludHJvIHwgaTE4biB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuei1kcm9wZG93bi1tZW51ICN1c2VyTWVudT1cIm56RHJvcGRvd25NZW51XCI+XG4gICAgICAgIDx1bCBuei1tZW51PlxuICAgICAgICAgIDxsaSBkYXRhLWV2ZW50LWlkPVwiX3JvdXRlX2JhY2tob21lXCIgbnotbWVudS1pdGVtIHJvdXRlckxpbms9XCIvXCI+e3sgJ2JhY2suaG9tZScgfCBpMThuIH19PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvbnotZHJvcGRvd24tbWVudT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjY29udGVudFRwbD5cbiAgICAgIDxyZXVzZS10YWIgI3JldXNlVGFiIFtuZ1N0eWxlXT1cInJldXNldGFiQ1NTXCIgLz5cbiAgICAgIDxyb3V0ZXItb3V0bGV0IChhY3RpdmF0ZSk9XCJyZXVzZVRhYi5hY3RpdmF0ZSgkZXZlbnQpXCIgKGF0dGFjaCk9XCJyZXVzZVRhYi5hY3RpdmF0ZSgkZXZlbnQpXCIgLz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjbm9uZVRwbD5cbiAgICAgIDxyb3V0ZXItb3V0bGV0IC8+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuei1tb2RhbFxuICAgICAgbnpUaXRsZT1cIuWFs+S6juacrOW6lOeUqFwiXG4gICAgICBbKG56VmlzaWJsZSldPVwiYXBwbGljYXRpb25Nb2RhbC5pc1Zpc2libGVcIlxuICAgICAgW256T2tUZXh0XT1cIm51bGxcIlxuICAgICAgW256Q2FuY2VsVGV4dF09XCIn5YWz6ZetJ1wiXG4gICAgICBbbnpXaWR0aF09XCI3MDBcIlxuICAgICAgKG56T25DYW5jZWwpPVwiYXBwbGljYXRpb25Nb2RhbC5pc1Zpc2libGUgPSBmYWxzZVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbnpNb2RhbENvbnRlbnQ+XG4gICAgICAgIDxuei1za2VsZXRvbiBbbnpMb2FkaW5nXT1cImFwcGxpY2F0aW9uTW9kYWwubG9hZGluZ1wiIFtuekFjdGl2ZV09XCJ0cnVlXCI+XG4gICAgICAgICAgPG56LWRlc2NyaXB0aW9ucyBuekJvcmRlcmVkIFtuelNpemVdPVwiJ21pZGRsZSdcIiBbbnpDb2x1bW5dPVwieyB4eGw6IDIsIHhsOiAyLCBsZzogMiwgbWQ6IDIsIHNtOiAyLCB4czogMSB9XCI+XG4gICAgICAgICAgICA8bnotZGVzY3JpcHRpb25zLWl0ZW0gbnpUaXRsZT1cIuW6lOeUqOWQjeensFwiPnt7IGFwcGxpY2F0aW9uSW5mbz8uc2hvd05hbWUgfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLlupTnlKjmoIfor4ZcIj57eyBhcHBsaWNhdGlvbkluZm8/Lm5hbWUgfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLniYjmnKzmgLvmlbBcIj57eyBhcHBsaWNhdGlvbkluZm8/LnZlcnNpb25OdW0gfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLlupTnlKjpppbmrKHpg6jnvbLml7bpl7RcIj57e1xuICAgICAgICAgICAgICBhcHBsaWNhdGlvbkluZm8/LmZpcnN0RGVwbG95bWVudERhdGUgfCBkYXRlOiAneXl5eS1NTS1kZCBISDptbTpzcydcbiAgICAgICAgICAgIH19PC9uei1kZXNjcmlwdGlvbnMtaXRlbT5cbiAgICAgICAgICAgIDxuei1kZXNjcmlwdGlvbnMtaXRlbSBuelRpdGxlPVwi5b2T5YmN54mI5pysXCI+e3sgYXBwbGljYXRpb25JbmZvPy5jdXJyZW50VmVyc2lvbiB9fTwvbnotZGVzY3JpcHRpb25zLWl0ZW0+XG4gICAgICAgICAgICA8bnotZGVzY3JpcHRpb25zLWl0ZW0gbnpUaXRsZT1cIuW9k+WJjeeJiOacrOmDqOe9suaXtumXtFwiPnt7XG4gICAgICAgICAgICAgIGFwcGxpY2F0aW9uSW5mbz8uY3VycmVudERlcGxveW1lbnREYXRlIHwgZGF0ZTogJ3l5eXktTU0tZGQgSEg6bW06c3MnXG4gICAgICAgICAgICB9fTwvbnotZGVzY3JpcHRpb25zLWl0ZW0+XG4gICAgICAgICAgICA8bnotZGVzY3JpcHRpb25zLWl0ZW0gbnpUaXRsZT1cIuacgOaWsOeJiOacrFwiPnt7IGFwcGxpY2F0aW9uSW5mbz8ubGFzdFZlcnNpb24gfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLmnIDmlrDniYjmnKzlj5HluIPml7bpl7RcIj57e1xuICAgICAgICAgICAgICBhcHBsaWNhdGlvbkluZm8/Lmxhc3RQdXNoRGF0ZSB8IGRhdGU6ICd5eXl5LU1NLWRkIEhIOm1tOnNzJ1xuICAgICAgICAgICAgfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgIDwvbnotZGVzY3JpcHRpb25zPlxuICAgICAgICA8L256LXNrZWxldG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uei1tb2RhbD5cbiAgYCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIExheW91dERlZmF1bHRNb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLFxuICAgIFJldXNlVGFiTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBJMThuUGlwZSxcbiAgICBOekRyb3BEb3duTW9kdWxlLFxuICAgIE56QXZhdGFyTW9kdWxlLFxuICAgIE56SWNvbk1vZHVsZSxcbiAgICBOek1vZGFsTW9kdWxlLFxuICAgIE56U2tlbGV0b25Nb2R1bGUsXG4gICAgTnpEZXNjcmlwdGlvbnNNb2R1bGUsXG4gICAgVGhlbWVCdG5Nb2R1bGUsXG4gICAgWXVuemFpV2lkZ2V0c01vZHVsZSxcbiAgICBZdW56YWlOYXZBcHBsaWNhdGlvbkNvbXBvbmVudCxcbiAgICBZdW56YWlMYXlvdXROYXZHcm91cENvbXBvbmVudCxcbiAgICBZdW56YWlMYXlvdXROYXZUaWxlQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgWXVuemFpTGF5b3V0QmFzaWNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b21wID0gaW5qZWN0KFN0b21wU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2luID0gaW5qZWN0KFdJTkRPVyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGF5b3V0RGlzcGxheVNlcnZpY2UgPSBpbmplY3QoTGF5b3V0RGlzcGxheVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmY6IFl1bnphaUNvbmZpZyA9IGluamVjdChZVU5aQUlfQ09ORklHKTtcblxuICBwdWJsaWMgTmF2VHlwZSA9IE5hdlR5cGU7XG4gIHByaXZhdGUgc3RhdGU6IExheW91dEJhc2ljU3RhdGUgPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgbG9nb0V4cGFuZGVkOiBgLi9hc3NldHMvbG9nby1mdWxsLnN2Z2AsXG4gICAgICBsb2dvQ29sbGFwc2VkOiBgLi9hc3NldHMvbG9nby5zdmdgXG4gICAgfSxcbiAgICBhc2lkZToge1xuICAgICAgbmFtZTogJycsXG4gICAgICBpbnRybzogJycsXG4gICAgICBpY29uOiAnJ1xuICAgIH0sXG4gICAgZGlzcGxheToge1xuICAgICAgbmF2OiB0cnVlLFxuICAgICAgYXNpZGU6IHRydWUsXG4gICAgICByZXVzZXRhYjogdHJ1ZVxuICAgIH0sXG4gICAgbmF2VHlwZTogTmF2VHlwZS5BUFBMSUNBVElPTlxuICB9O1xuXG4gIGhlYWRlclN0eWxlTGlzdDogWXVuemFpSGVhZGVyU3R5bGVbXSA9IFtdO1xuXG4gIGFwcGxpY2F0aW9uSW5mbyE6IEFwcGxpY2F0aW9uSW5mb0ludGVyZmFjZTtcblxuICBhcHBsaWNhdGlvbk1vZGFsID0ge1xuICAgIGlzVmlzaWJsZTogZmFsc2UsXG4gICAgbG9hZGluZzogZmFsc2VcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGh0dHBDbGllbnQgPSBpbmplY3QoSHR0cENsaWVudCk7XG4gIHByaXZhdGUgY29uZmlnITogWXVuemFpQnVzaW5lc3NDb25maWc7XG5cbiAgZ2V0IG9wdGlvbnMoKTogTGF5b3V0RGVmYXVsdE9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLm9wdGlvbnM7XG4gIH1cblxuICBnZXQgbmF2VHlwZSgpOiBOYXZUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5uYXZUeXBlO1xuICB9XG5cbiAgZ2V0IGFzaWRlKCk6IExheW91dEJhc2ljQXNpZGUge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmFzaWRlO1xuICB9XG5cbiAgZ2V0IGRpc3BsYXlSZXVzZXRhYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5kaXNwbGF5LnJldXNldGFiO1xuICB9XG5cbiAgZ2V0IHJldXNldGFiQ1NTKCk6IE56U2FmZUFueSB7XG4gICAgbGV0IGNhc2NhZGluZ1N0eWxlU2hlZXQgPSB7fTtcbiAgICBpZiAoIXRoaXMuc3RhdGUuZGlzcGxheS5uYXYpIHtcbiAgICAgIGNhc2NhZGluZ1N0eWxlU2hlZXQgPSB7XG4gICAgICAgIC4uLmNhc2NhZGluZ1N0eWxlU2hlZXQsXG4gICAgICAgIHRvcDogJzBweCdcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghdGhpcy5zdGF0ZS5kaXNwbGF5LmFzaWRlKSB7XG4gICAgICBjYXNjYWRpbmdTdHlsZVNoZWV0ID0ge1xuICAgICAgICAuLi5jYXNjYWRpbmdTdHlsZVNoZWV0LFxuICAgICAgICBsZWZ0OiAnMHB4J1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGNhc2NhZGluZ1N0eWxlU2hlZXQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuY29uZi5iaXMhO1xuICAgIHRoaXMuaW5pdExvZ28oKTtcbiAgICB0aGlzLmluaXRGYXZpY29uKCk7XG4gICAgdGhpcy5pbml0TmF2VHlwZSgpO1xuICAgIHRoaXMuaW5pdEFzaWRlKCk7XG4gICAgdGhpcy5hZGRMYXlvdXREaXNwbGF5TGlzdGVuZXIoKTtcbiAgICB0aGlzLnN0b21wLmxpc3RlbigpO1xuICAgIHRoaXMudG9JbmRleCgpO1xuICB9XG5cbiAgaW5pdEZhdmljb24oKTogdm9pZCB7XG4gICAgY29uc3QgWywgZ2V0UHJvamVjdEluZm9dID0gdXNlTG9jYWxTdG9yYWdlUHJvamVjdEluZm8oKTtcbiAgICBjb25zdCBwcm9qZWN0SW5mbzogWXVuemFpUHJvamVjdEluZm8gPSBnZXRQcm9qZWN0SW5mbygpITtcbiAgICBpZiAocHJvamVjdEluZm8uZmF2aWNvblVybCkge1xuICAgICAgaGFzRmF2aWNvbihwcm9qZWN0SW5mby5mYXZpY29uVXJsKS50aGVuKChoYXM6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKGhhcykge1xuICAgICAgICAgIHNldEZhdmljb24ocHJvamVjdEluZm8uZmF2aWNvblVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0RmF2aWNvbignLi9hc3NldHMvZmF2aWNvbi5pY28nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEFzaWRlKCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldEN1cnJlbnRdID0gdXNlTG9jYWxTdG9yYWdlQ3VycmVudCgpO1xuICAgIGNvbnN0IGFzaWRlOiBMYXlvdXRCYXNpY0FzaWRlID0gZ2V0Q3VycmVudCgpITtcbiAgICB0aGlzLnN0YXRlLmFzaWRlID0geyAuLi5hc2lkZSB9O1xuICB9XG5cbiAgaW5pdExvZ28oKTogdm9pZCB7XG4gICAgY29uc3QgWywgZ2V0UHJvamVjdEluZm9dID0gdXNlTG9jYWxTdG9yYWdlUHJvamVjdEluZm8oKTtcbiAgICBjb25zdCBwcm9qZWN0SW5mbzogWXVuemFpUHJvamVjdEluZm8gPSBnZXRQcm9qZWN0SW5mbygpITtcbiAgICB0aGlzLnN0YXRlLm9wdGlvbnMubG9nb0V4cGFuZGVkID0gcHJvamVjdEluZm8ubWF4TG9nb1VybCA/IHByb2plY3RJbmZvLm1heExvZ29VcmwgOiBgLi9hc3NldHMvbG9nby1mdWxsLnN2Z2A7XG4gICAgdGhpcy5zdGF0ZS5vcHRpb25zLmxvZ29Db2xsYXBzZWQgPSBwcm9qZWN0SW5mby5taW5pTG9nb1VybCA/IHByb2plY3RJbmZvLm1pbmlMb2dvVXJsIDogYC4vYXNzZXRzL2xvZ28uc3ZnYDtcbiAgfVxuXG4gIGluaXROYXZUeXBlKCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldEhlYWRlclR5cGVdID0gdXNlTG9jYWxTdG9yYWdlSGVhZGVyVHlwZSgpO1xuICAgIGNvbnN0IFssIGdldFByb2plY3RJbmZvXSA9IHVzZUxvY2FsU3RvcmFnZVByb2plY3RJbmZvKCk7XG4gICAgY29uc3QgbmF2VHlwZTogTmF2VHlwZSB8IG51bGwgPSBnZXRIZWFkZXJUeXBlKCk7XG4gICAgY29uc3QgcHJvamVjdEluZm86IFl1bnphaVByb2plY3RJbmZvID0gZ2V0UHJvamVjdEluZm8oKSE7XG4gICAgaWYgKG5hdlR5cGUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3RhdGUubmF2VHlwZSA9IG5hdlR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUubmF2VHlwZSA9IE5hdlR5cGUuQVBQTElDQVRJT047XG4gICAgfVxuICAgIGlmIChwcm9qZWN0SW5mby5oZWFkZXJTdHlsZSAmJiBwcm9qZWN0SW5mby5oZWFkZXJTdHlsZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmhlYWRlclN0eWxlTGlzdCA9IHByb2plY3RJbmZvLmhlYWRlclN0eWxlO1xuICAgICAgY29uc3QgaGFzVGhpcyA9IHRoaXMuaGVhZGVyU3R5bGVMaXN0LnNvbWUoaXRlbSA9PiBpdGVtLnZhbHVlID09PSB0aGlzLnN0YXRlLm5hdlR5cGUpO1xuICAgICAgaWYgKCFoYXNUaGlzKSB7XG4gICAgICAgIHRoaXMuc3RhdGUubmF2VHlwZSA9IDxOYXZUeXBlPnByb2plY3RJbmZvLmhlYWRlclN0eWxlWzBdLnZhbHVlO1xuICAgICAgICBjb25zdCBbc2V0SGVhZGVyVHlwZV0gPSB1c2VMb2NhbFN0b3JhZ2VIZWFkZXJUeXBlKCk7XG4gICAgICAgIHNldEhlYWRlclR5cGUodGhpcy5zdGF0ZS5uYXZUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b0luZGV4KCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldERlZmF1bHRSb3V0ZV0gPSB1c2VMb2NhbFN0b3JhZ2VEZWZhdWx0Um91dGUoKTtcbiAgICBjb25zdCBkZWZhdWx0Um91dGUgPSBnZXREZWZhdWx0Um91dGUoKSE7XG4gICAgbG9nKCdZdW56YWlMYXlvdXRCYXNpY0NvbXBvbmVudDogJywgYHRvZG86IHRoZSBkZWZhdWx0IHJvdXRlIHdhcyAke2RlZmF1bHRSb3V0ZX0sIOS9huaYr+i/mOayoeaDs+WlveWmguS9leWunueOsC5gKTtcbiAgfVxuXG4gIG9uTmF2VHlwZUNoYW5nZSh0eXBlOiBOYXZUeXBlIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgW3NldEhlYWRlclR5cGVdID0gdXNlTG9jYWxTdG9yYWdlSGVhZGVyVHlwZSgpO1xuICAgIHNldEhlYWRlclR5cGUoPE5hdlR5cGU+dHlwZSk7XG4gICAgdGhpcy53aW4ubG9jYXRpb24ucmVsb2FkKCk7XG4gIH1cblxuICBhZGRMYXlvdXREaXNwbGF5TGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5sYXlvdXREaXNwbGF5U2VydmljZS5saXN0ZW4oJ3JldXNlVGFiJywgKGRpc3BsYXk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuc3RhdGUuZGlzcGxheS5yZXVzZXRhYiA9IGRpc3BsYXk7XG4gICAgfSk7XG4gICAgdGhpcy5sYXlvdXREaXNwbGF5U2VydmljZS5saXN0ZW4oJ25hdicsIChkaXNwbGF5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlLmRpc3BsYXkubmF2ID0gZGlzcGxheTtcbiAgICB9KTtcblxuICAgIHRoaXMubGF5b3V0RGlzcGxheVNlcnZpY2UubGlzdGVuKCdhc2lkZScsIChkaXNwbGF5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlLmRpc3BsYXkuYXNpZGUgPSBkaXNwbGF5O1xuICAgIH0pO1xuICB9XG5cbiAgLy8g5YWz5LqO5pys5bqU55SoXG4gIGFib3V0QXBwbGljYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdXJsQXJyID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KGAke3RoaXMuY29uZmlnLmJhc2VVcmx9L2ApO1xuICAgIGlmICh1cmxBcnIubGVuZ3RoID4gMSkge1xuICAgICAgLy8g5bqU55So5qCH6K+G77yM5oiq5Y+W6Lev5b6E5LitIC9iYWNrc3RhZ2Uv5ZCO56ys5LiA5Liq5a2X56ym5LiyXG4gICAgICAvLyDkvos6IGh0dHA6Ly8yMjIuMzAuMTk0LjYxL2JhY2tzdGFnZS9hdXRoL3BhZ2Uvb2FmcG9ydGFsLyMvYmFzZS9tZW51ICDkuK0gYXV0aFxuICAgICAgY29uc3QgbmFtZSA9IHVybEFyclsxXS5zcGxpdCgnLycpWzBdO1xuICAgICAgdGhpcy5hcHBsaWNhdGlvbk1vZGFsLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmFwcGxpY2F0aW9uTW9kYWwubG9hZGluZyA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgIHRoaXMuaHR0cENsaWVudC5nZXQoYC9iYXNpYy9hcGkvYXBwL2Fib3V0QXBwP25hbWU9JHtuYW1lfWApLnN1YnNjcmliZShcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAocmVzcG9uc2U6IE56U2FmZUFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25Nb2RhbC5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25JbmZvID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uTW9kYWwubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19