@yelon/bis 17.2.3 → 17.3.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.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # @yelon/bis [![CI](https://github.com/hbyunzai/yelon/actions/workflows/ci.yml/badge.svg)](https://github.com/hbyunzai/yelon/actions/workflows/ci.yml) [![Codecov](https://img.shields.io/codecov/c/github/hbyunzai/yelon.svg?style=flat-square)](https://codecov.io/gh/hbyunzai/yelon) [![NPM version](https://img.shields.io/npm/v/@yelon/bis.svg?style=flat-square)](https://www.npmjs.com/package/@yelon/bis)
@@ -1,4 +1,5 @@
1
1
  import { CommonModule } from '@angular/common';
2
+ import { HttpClient } from '@angular/common/http';
2
3
  import { Component, inject } from '@angular/core';
3
4
  import { RouterModule } from '@angular/router';
4
5
  import { ReuseTabModule } from '@yelon/abc/reuse-tab';
@@ -7,10 +8,13 @@ import { StompService } from '@yelon/socket';
7
8
  import { I18nPipe } from '@yelon/theme';
8
9
  import { LayoutDefaultModule, LayoutDisplayService } from '@yelon/theme/layout-default';
9
10
  import { ThemeBtnModule } from '@yelon/theme/theme-btn';
10
- import { hasFavicon, log, NavType, setFavicon, useLocalStorageCurrent, useLocalStorageDefaultRoute, useLocalStorageHeaderType, useLocalStorageProjectInfo, WINDOW } from '@yelon/util';
11
+ import { hasFavicon, log, NavType, setFavicon, useLocalStorageCurrent, useLocalStorageDefaultRoute, useLocalStorageHeaderType, useLocalStorageProjectInfo, WINDOW, YUNZAI_CONFIG } from '@yelon/util';
11
12
  import { NzAvatarModule } from 'ng-zorro-antd/avatar';
13
+ import { NzDescriptionsModule } from 'ng-zorro-antd/descriptions';
12
14
  import { NzDropDownModule } from 'ng-zorro-antd/dropdown';
13
15
  import { NzIconModule } from 'ng-zorro-antd/icon';
16
+ import { NzModalModule } from 'ng-zorro-antd/modal';
17
+ import { NzSkeletonModule } from 'ng-zorro-antd/skeleton';
14
18
  import { YunzaiNavApplicationComponent } from './layout-nav-application.component';
15
19
  import { YunzaiLayoutNavGroupComponent } from './layout-nav-group.component';
16
20
  import { YunzaiLayoutNavTileComponent } from './layout-nav-tile.component';
@@ -23,13 +27,17 @@ import * as i5 from "ng-zorro-antd/menu";
23
27
  import * as i6 from "ng-zorro-antd/dropdown";
24
28
  import * as i7 from "ng-zorro-antd/avatar";
25
29
  import * as i8 from "ng-zorro-antd/icon";
26
- import * as i9 from "@yelon/theme/theme-btn";
27
- import * as i10 from "@yelon/bis/yunzai-widgets";
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";
28
35
  export class YunzaiLayoutBasicComponent {
29
36
  constructor() {
30
37
  this.stomp = inject(StompService);
31
38
  this.win = inject(WINDOW);
32
39
  this.layoutDisplayService = inject(LayoutDisplayService);
40
+ this.conf = inject(YUNZAI_CONFIG);
33
41
  this.NavType = NavType;
34
42
  this.state = {
35
43
  options: {
@@ -48,6 +56,12 @@ export class YunzaiLayoutBasicComponent {
48
56
  },
49
57
  navType: NavType.APPLICATION
50
58
  };
59
+ this.headerStyleList = [];
60
+ this.applicationModal = {
61
+ isVisible: false,
62
+ loading: false
63
+ };
64
+ this.httpClient = inject(HttpClient);
51
65
  }
52
66
  get options() {
53
67
  return this.state.options;
@@ -78,6 +92,7 @@ export class YunzaiLayoutBasicComponent {
78
92
  return cascadingStyleSheet;
79
93
  }
80
94
  ngOnInit() {
95
+ this.config = this.conf.bis;
81
96
  this.initLogo();
82
97
  this.initFavicon();
83
98
  this.initNavType();
@@ -118,17 +133,19 @@ export class YunzaiLayoutBasicComponent {
118
133
  const projectInfo = getProjectInfo();
119
134
  if (navType !== null) {
120
135
  this.state.navType = navType;
121
- return;
122
136
  }
123
- let fetchedNavType;
124
- if (projectInfo.headerStyle && projectInfo.headerStyle.length > 0) {
125
- fetchedNavType = projectInfo.headerStyle.pop()?.value;
137
+ else {
138
+ this.state.navType = NavType.APPLICATION;
126
139
  }
127
- // default value
128
- if (!fetchedNavType) {
129
- fetchedNavType = NavType.APPLICATION;
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
+ }
130
148
  }
131
- this.state.navType = fetchedNavType;
132
149
  }
133
150
  toIndex() {
134
151
  const [, getDefaultRoute] = useLocalStorageDefaultRoute();
@@ -151,8 +168,30 @@ export class YunzaiLayoutBasicComponent {
151
168
  this.state.display.aside = display;
152
169
  });
153
170
  }
154
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiLayoutBasicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
155
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.1", type: YunzaiLayoutBasicComponent, isStandalone: true, selector: "yunzai-layout-basic", ngImport: i0, template: `
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.0", ngImport: i0, type: YunzaiLayoutBasicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
194
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: YunzaiLayoutBasicComponent, isStandalone: true, selector: "yunzai-layout-basic", ngImport: i0, template: `
156
195
  <layout-default [options]="options" [asideUser]="asideUserTpl" [content]="displayReusetab ? contentTpl : noneTpl">
157
196
  <layout-default-header-item direction="left">
158
197
  <ng-container [ngSwitch]="navType">
@@ -165,6 +204,8 @@ export class YunzaiLayoutBasicComponent {
165
204
  <ng-container *ngSwitchCase="NavType.TILE">
166
205
  <yunzai-layout-nav-tile />
167
206
  </ng-container>
207
+ <ng-container *ngSwitchCase="NavType.BLANK" />
208
+ <ng-container *ngSwitchCase="NavType.TABS" />
168
209
  <ng-container *ngSwitchDefault>
169
210
  <yunzai-layout-nav-application />
170
211
  </ng-container>
@@ -192,23 +233,40 @@ export class YunzaiLayoutBasicComponent {
192
233
  <div data-event-id="_nav_mode" nz-menu-item>
193
234
  {{ 'mode.nav' | i18n }}
194
235
  </div>
195
- <div
196
- data-event-id="_nav_mode"
197
- data-type="application"
198
- nz-menu-item
199
- (click)="onNavTypeChange(NavType.APPLICATION)"
200
- >
201
- <i nz-icon nzType="appstore" class="mr-sm"></i>
202
- {{ 'mode.nav.application' | i18n }}
203
- </div>
204
- <div data-event-id="_nav_mode" data-type="group" nz-menu-item (click)="onNavTypeChange(NavType.GROUP)">
205
- <i nz-icon nzType="group" class="mr-sm"></i>
206
- {{ 'mode.nav.group' | i18n }}
207
- </div>
208
- <div data-event-id="_nav_mode" data-type="tile" nz-menu-item (click)="onNavTypeChange(NavType.TILE)">
209
- <i nz-icon nzType="appstore" class="mr-sm"></i>
210
- {{ 'mode.nav.tile' | i18n }}
211
- </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
+
212
270
  <div data-event-id="_nav_fullscreen" nz-menu-item>
213
271
  <yunzai-header-fullscreen />
214
272
  </div>
@@ -226,15 +284,9 @@ export class YunzaiLayoutBasicComponent {
226
284
  </layout-default-header-item>
227
285
  </layout-default>
228
286
  <ng-template #asideUserTpl>
229
- <div
230
- data-event-id="_route_user"
231
- nz-dropdown
232
- nzTrigger="click"
233
- [nzDropdownMenu]="userMenu"
234
- class="yunzai-default__aside-user"
235
- >
236
- <nz-avatar class="yunzai-default__aside-user-avatar" [nzSrc]="aside.icon" />
237
- <div class="yunzai-default__aside-user-info">
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">
238
290
  <strong>{{ aside.name | i18n }}</strong>
239
291
  <p class="mb0">{{ aside.intro | i18n }}</p>
240
292
  </div>
@@ -249,10 +301,42 @@ export class YunzaiLayoutBasicComponent {
249
301
  <reuse-tab #reuseTab [ngStyle]="reusetabCSS" />
250
302
  <router-outlet (activate)="reuseTab.activate($event)" (attach)="reuseTab.activate($event)" />
251
303
  </ng-template>
252
- <ng-template #noneTpl> <router-outlet /> </ng-template>
253
- `, 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: 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: ThemeBtnModule }, { kind: "component", type: i9.ThemeBtnComponent, selector: "theme-btn", inputs: ["types", "devTips", "deployUrl"], outputs: ["themeChange"] }, { kind: "ngmodule", type: YunzaiWidgetsModule }, { kind: "component", type: i10.YunzaiHeaderClearStorageComponent, selector: "yunzai-header-clear-storage" }, { kind: "component", type: i10.YunzaiHeaderFullScreenComponent, selector: "yunzai-header-fullscreen" }, { kind: "component", type: i10.YunzaiHeaderNotifyComponent, selector: "yunzai-header-notify" }, { kind: "component", type: i10.YunzaiHeaderI18nComponent, selector: "yunzai-header-i18n", inputs: ["showLangText"] }, { kind: "component", type: i10.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" }] }); }
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" }] }); }
254
338
  }
255
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: YunzaiLayoutBasicComponent, decorators: [{
339
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: YunzaiLayoutBasicComponent, decorators: [{
256
340
  type: Component,
257
341
  args: [{
258
342
  selector: `yunzai-layout-basic`,
@@ -269,6 +353,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
269
353
  <ng-container *ngSwitchCase="NavType.TILE">
270
354
  <yunzai-layout-nav-tile />
271
355
  </ng-container>
356
+ <ng-container *ngSwitchCase="NavType.BLANK" />
357
+ <ng-container *ngSwitchCase="NavType.TABS" />
272
358
  <ng-container *ngSwitchDefault>
273
359
  <yunzai-layout-nav-application />
274
360
  </ng-container>
@@ -296,23 +382,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
296
382
  <div data-event-id="_nav_mode" nz-menu-item>
297
383
  {{ 'mode.nav' | i18n }}
298
384
  </div>
299
- <div
300
- data-event-id="_nav_mode"
301
- data-type="application"
302
- nz-menu-item
303
- (click)="onNavTypeChange(NavType.APPLICATION)"
304
- >
305
- <i nz-icon nzType="appstore" class="mr-sm"></i>
306
- {{ 'mode.nav.application' | i18n }}
307
- </div>
308
- <div data-event-id="_nav_mode" data-type="group" nz-menu-item (click)="onNavTypeChange(NavType.GROUP)">
309
- <i nz-icon nzType="group" class="mr-sm"></i>
310
- {{ 'mode.nav.group' | i18n }}
311
- </div>
312
- <div data-event-id="_nav_mode" data-type="tile" nz-menu-item (click)="onNavTypeChange(NavType.TILE)">
313
- <i nz-icon nzType="appstore" class="mr-sm"></i>
314
- {{ 'mode.nav.tile' | i18n }}
315
- </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
+
316
419
  <div data-event-id="_nav_fullscreen" nz-menu-item>
317
420
  <yunzai-header-fullscreen />
318
421
  </div>
@@ -330,15 +433,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
330
433
  </layout-default-header-item>
331
434
  </layout-default>
332
435
  <ng-template #asideUserTpl>
333
- <div
334
- data-event-id="_route_user"
335
- nz-dropdown
336
- nzTrigger="click"
337
- [nzDropdownMenu]="userMenu"
338
- class="yunzai-default__aside-user"
339
- >
340
- <nz-avatar class="yunzai-default__aside-user-avatar" [nzSrc]="aside.icon" />
341
- <div class="yunzai-default__aside-user-info">
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">
342
439
  <strong>{{ aside.name | i18n }}</strong>
343
440
  <p class="mb0">{{ aside.intro | i18n }}</p>
344
441
  </div>
@@ -353,7 +450,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
353
450
  <reuse-tab #reuseTab [ngStyle]="reusetabCSS" />
354
451
  <router-outlet (activate)="reuseTab.activate($event)" (attach)="reuseTab.activate($event)" />
355
452
  </ng-template>
356
- <ng-template #noneTpl> <router-outlet /> </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>
357
486
  `,
358
487
  standalone: true,
359
488
  imports: [
@@ -365,6 +494,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
365
494
  NzDropDownModule,
366
495
  NzAvatarModule,
367
496
  NzIconModule,
497
+ NzModalModule,
498
+ NzSkeletonModule,
499
+ NzDescriptionsModule,
368
500
  ThemeBtnModule,
369
501
  YunzaiWidgetsModule,
370
502
  YunzaiNavApplicationComponent,
@@ -373,4 +505,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
373
505
  ]
374
506
  }]
375
507
  }] });
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJhc2ljLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Jpcy9sYXlvdXQvbGF5b3V0LWJhc2ljLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLG1CQUFtQixFQUF3QixvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsVUFBVSxFQUdWLEdBQUcsRUFDSCxPQUFPLEVBQ1AsVUFBVSxFQUNWLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMxQixNQUFNLEVBRVAsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsNkJBQTZC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b0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBZ0IsRUFBRSxFQUFFO1lBQzdELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzhHQXpJVSwwQkFBMEI7a0dBQTFCLDBCQUEwQiwrRUFwSDNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtHVCwyREFHQyxtQkFBbUIsdWdCQUNuQixZQUFZLHliQUNaLGNBQWMsNGNBQ2QsWUFBWSwyWEFDWixRQUFRLDRDQUNSLGdCQUFnQix5MkJBQ2hCLGNBQWMsZ1BBQ2QsWUFBWSxpTkFDWixjQUFjLDZLQUNkLG1CQUFtQixzaUJBQ25CLDZCQUE2QiwwRUFDN0IsNkJBQTZCLG9FQUM3Qiw0QkFBNEI7OzJGQUduQiwwQkFBMEI7a0JBdEh0QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrR1Q7b0JBQ0QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCxtQkFBbUI7d0JBQ25CLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxZQUFZO3dCQUNaLFFBQVE7d0JBQ1IsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLDZCQUE2Qjt3QkFDN0IsNkJBQTZCO3dCQUM3Qiw0QkFBNEI7cUJBQzdCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IFJldXNlVGFiTW9kdWxlIH0gZnJvbSAnQHllbG9uL2FiYy9yZXVzZS10YWInO1xuaW1wb3J0IHsgWXVuemFpV2lkZ2V0c01vZHVsZSB9IGZyb20gJ0B5ZWxvbi9iaXMveXVuemFpLXdpZGdldHMnO1xuaW1wb3J0IHsgU3RvbXBTZXJ2aWNlIH0gZnJvbSAnQHllbG9uL3NvY2tldCc7XG5pbXBvcnQgeyBJMThuUGlwZSB9IGZyb20gJ0B5ZWxvbi90aGVtZSc7XG5pbXBvcnQgeyBMYXlvdXREZWZhdWx0TW9kdWxlLCBMYXlvdXREZWZhdWx0T3B0aW9ucywgTGF5b3V0RGlzcGxheVNlcnZpY2UgfSBmcm9tICdAeWVsb24vdGhlbWUvbGF5b3V0LWRlZmF1bHQnO1xuaW1wb3J0IHsgVGhlbWVCdG5Nb2R1bGUgfSBmcm9tICdAeWVsb24vdGhlbWUvdGhlbWUtYnRuJztcbmltcG9ydCB7XG4gIGhhc0Zhdmljb24sXG4gIExheW91dEJhc2ljQXNpZGUsXG4gIExheW91dEJhc2ljRGlzcGxheSxcbiAgbG9nLFxuICBOYXZUeXBlLFxuICBzZXRGYXZpY29uLFxuICB1c2VMb2NhbFN0b3JhZ2VDdXJyZW50LFxuICB1c2VMb2NhbFN0b3JhZ2VEZWZhdWx0Um91dGUsXG4gIHVzZUxvY2FsU3RvcmFnZUhlYWRlclR5cGUsXG4gIHVzZUxvY2FsU3RvcmFnZVByb2plY3RJbmZvLFxuICBXSU5ET1csXG4gIFl1bnphaVByb2plY3RJbmZvXG59IGZyb20gJ0B5ZWxvbi91dGlsJztcbmltcG9ydCB7IE56QXZhdGFyTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9hdmF0YXInO1xuaW1wb3J0IHsgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IE56RHJvcERvd25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2Ryb3Bkb3duJztcbmltcG9ydCB7IE56SWNvbk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaWNvbic7XG5cbmltcG9ydCB7IFl1bnphaU5hdkFwcGxpY2F0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtbmF2LWFwcGxpY2F0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBZdW56YWlMYXlvdXROYXZHcm91cENvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LW5hdi1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgWXVuemFpTGF5b3V0TmF2VGlsZUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LW5hdi10aWxlLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QmFzaWNTdGF0ZSB7XG4gIG9wdGlvbnM6IExheW91dERlZmF1bHRPcHRpb25zO1xuICBhc2lkZTogTGF5b3V0QmFzaWNBc2lkZTtcbiAgZGlzcGxheTogTGF5b3V0QmFzaWNEaXNwbGF5O1xuICBuYXZUeXBlOiBOYXZUeXBlO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IGB5dW56YWktbGF5b3V0LWJhc2ljYCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bGF5b3V0LWRlZmF1bHQgW29wdGlvbnNdPVwib3B0aW9uc1wiIFthc2lkZVVzZXJdPVwiYXNpZGVVc2VyVHBsXCIgW2NvbnRlbnRdPVwiZGlzcGxheVJldXNldGFiID8gY29udGVudFRwbCA6IG5vbmVUcGxcIj5cbiAgICAgIDxsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbSBkaXJlY3Rpb249XCJsZWZ0XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIm5hdlR5cGVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLkFQUExJQ0FUSU9OXCI+XG4gICAgICAgICAgICA8eXVuemFpLWxheW91dC1uYXYtYXBwbGljYXRpb24gLz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLkdST1VQXCI+XG4gICAgICAgICAgICA8eXVuemFpLWxheW91dC1uYXYtZ3JvdXAgLz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLlRJTEVcIj5cbiAgICAgICAgICAgIDx5dW56YWktbGF5b3V0LW5hdi10aWxlIC8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgPHl1bnphaS1sYXlvdXQtbmF2LWFwcGxpY2F0aW9uIC8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9sYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbT5cbiAgICAgIDxsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbSBkaXJlY3Rpb249XCJyaWdodFwiIGhpZGRlbj1cIm1vYmlsZVwiPlxuICAgICAgICA8eXVuemFpLWhlYWRlci1ub3RpZnkgLz5cbiAgICAgIDwvbGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0+XG4gICAgICA8bGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0gZGlyZWN0aW9uPVwicmlnaHRcIiBoaWRkZW49XCJtb2JpbGVcIj5cbiAgICAgICAgPHRoZW1lLWJ0biAvPlxuICAgICAgPC9sYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbT5cbiAgICAgIDxsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbSBkaXJlY3Rpb249XCJyaWdodFwiIGhpZGRlbj1cIm1vYmlsZVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS1ldmVudC1pZD1cIl9uYXZfc2V0dGluZ3NcIlxuICAgICAgICAgIGxheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtLXRyaWdnZXJcbiAgICAgICAgICBuei1kcm9wZG93blxuICAgICAgICAgIFtuekRyb3Bkb3duTWVudV09XCJzZXR0aW5nc01lbnVcIlxuICAgICAgICAgIG56VHJpZ2dlcj1cImNsaWNrXCJcbiAgICAgICAgICBuelBsYWNlbWVudD1cImJvdHRvbVJpZ2h0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwic2V0dGluZ1wiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuei1kcm9wZG93bi1tZW51ICNzZXR0aW5nc01lbnU9XCJuekRyb3Bkb3duTWVudVwiPlxuICAgICAgICAgIDxkaXYgbnotbWVudSBzdHlsZT1cIndpZHRoOiAyMDBweDtcIj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1ldmVudC1pZD1cIl9uYXZfbW9kZVwiIG56LW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAge3sgJ21vZGUubmF2JyB8IGkxOG4gfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBkYXRhLWV2ZW50LWlkPVwiX25hdl9tb2RlXCJcbiAgICAgICAgICAgICAgZGF0YS10eXBlPVwiYXBwbGljYXRpb25cIlxuICAgICAgICAgICAgICBuei1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTmF2VHlwZUNoYW5nZShOYXZUeXBlLkFQUExJQ0FUSU9OKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiYXBwc3RvcmVcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICB7eyAnbW9kZS5uYXYuYXBwbGljYXRpb24nIHwgaTE4biB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtZXZlbnQtaWQ9XCJfbmF2X21vZGVcIiBkYXRhLXR5cGU9XCJncm91cFwiIG56LW1lbnUtaXRlbSAoY2xpY2spPVwib25OYXZUeXBlQ2hhbmdlKE5hdlR5cGUuR1JPVVApXCI+XG4gICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiZ3JvdXBcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICB7eyAnbW9kZS5uYXYuZ3JvdXAnIHwgaTE4biB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtZXZlbnQtaWQ9XCJfbmF2X21vZGVcIiBkYXRhLXR5cGU9XCJ0aWxlXCIgbnotbWVudS1pdGVtIChjbGljayk9XCJvbk5hdlR5cGVDaGFuZ2UoTmF2VHlwZS5USUxFKVwiPlxuICAgICAgICAgICAgICA8aSBuei1pY29uIG56VHlwZT1cImFwcHN0b3JlXCIgY2xhc3M9XCJtci1zbVwiPjwvaT5cbiAgICAgICAgICAgICAge3sgJ21vZGUubmF2LnRpbGUnIHwgaTE4biB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtZXZlbnQtaWQ9XCJfbmF2X2Z1bGxzY3JlZW5cIiBuei1tZW51LWl0ZW0+XG4gICAgICAgICAgICAgIDx5dW56YWktaGVhZGVyLWZ1bGxzY3JlZW4gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLWV2ZW50LWlkPVwiX25hdl9jbGVhcnN0b3JhZ2VcIiBuei1tZW51LWl0ZW0+XG4gICAgICAgICAgICAgIDx5dW56YWktaGVhZGVyLWNsZWFyLXN0b3JhZ2UgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLWV2ZW50LWlkPVwiX25hdl9pMThuXCIgbnotbWVudS1pdGVtPlxuICAgICAgICAgICAgICA8eXVuemFpLWhlYWRlci1pMThuIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uei1kcm9wZG93bi1tZW51PlxuICAgICAgPC9sYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbT5cbiAgICAgIDxsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbSBkaXJlY3Rpb249XCJyaWdodFwiPlxuICAgICAgICA8eXVuemFpLWhlYWRlci11c2VyIC8+XG4gICAgICA8L2xheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtPlxuICAgIDwvbGF5b3V0LWRlZmF1bHQ+XG4gICAgPG5nLXRlbXBsYXRlICNhc2lkZVVzZXJUcGw+XG4gICAgICA8ZGl2XG4gICAgICAgIGRhdGEtZXZlbnQtaWQ9XCJfcm91dGVfdXNlclwiXG4gICAgICAgIG56LWRyb3Bkb3duXG4gICAgICAgIG56VHJpZ2dlcj1cImNsaWNrXCJcbiAgICAgICAgW256RHJvcGRvd25NZW51XT1cInVzZXJNZW51XCJcbiAgICAgICAgY2xhc3M9XCJ5dW56YWktZGVmYXVsdF9fYXNpZGUtdXNlclwiXG4gICAgICA+XG4gICAgICAgIDxuei1hdmF0YXIgY2xhc3M9XCJ5dW56YWktZGVmYXVsdF9fYXNpZGUtdXNlci1hdmF0YXJcIiBbbnpTcmNdPVwiYXNpZGUuaWNvblwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ5dW56YWktZGVmYXVsdF9fYXNpZGUtdXNlci1pbmZvXCI+XG4gICAgICAgICAgPHN0cm9uZz57eyBhc2lkZS5uYW1lIHwgaTE4biB9fTwvc3Ryb25nPlxuICAgICAgICAgIDxwIGNsYXNzPVwibWIwXCI+e3sgYXNpZGUuaW50cm8gfCBpMThuIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG56LWRyb3Bkb3duLW1lbnUgI3VzZXJNZW51PVwibnpEcm9wZG93bk1lbnVcIj5cbiAgICAgICAgPHVsIG56LW1lbnU+XG4gICAgICAgICAgPGxpIGRhdGEtZXZlbnQtaWQ9XCJfcm91dGVfYmFja2hvbWVcIiBuei1tZW51LWl0ZW0gcm91dGVyTGluaz1cIi9cIj57eyAnYmFjay5ob21lJyB8IGkxOG4gfX08L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9uei1kcm9wZG93bi1tZW51PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNjb250ZW50VHBsPlxuICAgICAgPHJldXNlLXRhYiAjcmV1c2VUYWIgW25nU3R5bGVdPVwicmV1c2V0YWJDU1NcIiAvPlxuICAgICAgPHJvdXRlci1vdXRsZXQgKGFjdGl2YXRlKT1cInJldXNlVGFiLmFjdGl2YXRlKCRldmVudClcIiAoYXR0YWNoKT1cInJldXNlVGFiLmFjdGl2YXRlKCRldmVudClcIiAvPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNub25lVHBsPiA8cm91dGVyLW91dGxldCAvPiA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTGF5b3V0RGVmYXVsdE1vZHVsZSxcbiAgICBSb3V0ZXJNb2R1bGUsXG4gICAgUmV1c2VUYWJNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEkxOG5QaXBlLFxuICAgIE56RHJvcERvd25Nb2R1bGUsXG4gICAgTnpBdmF0YXJNb2R1bGUsXG4gICAgTnpJY29uTW9kdWxlLFxuICAgIFRoZW1lQnRuTW9kdWxlLFxuICAgIFl1bnphaVdpZGdldHNNb2R1bGUsXG4gICAgWXVuemFpTmF2QXBwbGljYXRpb25Db21wb25lbnQsXG4gICAgWXVuemFpTGF5b3V0TmF2R3JvdXBDb21wb25lbnQsXG4gICAgWXVuemFpTGF5b3V0TmF2VGlsZUNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFl1bnphaUxheW91dEJhc2ljQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9tcCA9IGluamVjdChTdG9tcFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdpbiA9IGluamVjdChXSU5ET1cpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxheW91dERpc3BsYXlTZXJ2aWNlID0gaW5qZWN0KExheW91dERpc3BsYXlTZXJ2aWNlKTtcblxuICBwdWJsaWMgTmF2VHlwZSA9IE5hdlR5cGU7XG4gIHByaXZhdGUgc3RhdGU6IExheW91dEJhc2ljU3RhdGUgPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgbG9nb0V4cGFuZGVkOiBgLi9hc3NldHMvbG9nby1mdWxsLnN2Z2AsXG4gICAgICBsb2dvQ29sbGFwc2VkOiBgLi9hc3NldHMvbG9nby5zdmdgXG4gICAgfSxcbiAgICBhc2lkZToge1xuICAgICAgbmFtZTogJycsXG4gICAgICBpbnRybzogJycsXG4gICAgICBpY29uOiAnJ1xuICAgIH0sXG4gICAgZGlzcGxheToge1xuICAgICAgbmF2OiB0cnVlLFxuICAgICAgYXNpZGU6IHRydWUsXG4gICAgICByZXVzZXRhYjogdHJ1ZVxuICAgIH0sXG4gICAgbmF2VHlwZTogTmF2VHlwZS5BUFBMSUNBVElPTlxuICB9O1xuXG4gIGdldCBvcHRpb25zKCk6IExheW91dERlZmF1bHRPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5vcHRpb25zO1xuICB9XG5cbiAgZ2V0IG5hdlR5cGUoKTogTmF2VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUubmF2VHlwZTtcbiAgfVxuXG4gIGdldCBhc2lkZSgpOiBMYXlvdXRCYXNpY0FzaWRlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5hc2lkZTtcbiAgfVxuXG4gIGdldCBkaXNwbGF5UmV1c2V0YWIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZGlzcGxheS5yZXVzZXRhYjtcbiAgfVxuXG4gIGdldCByZXVzZXRhYkNTUygpOiBOelNhZmVBbnkge1xuICAgIGxldCBjYXNjYWRpbmdTdHlsZVNoZWV0ID0ge307XG4gICAgaWYgKCF0aGlzLnN0YXRlLmRpc3BsYXkubmF2KSB7XG4gICAgICBjYXNjYWRpbmdTdHlsZVNoZWV0ID0ge1xuICAgICAgICAuLi5jYXNjYWRpbmdTdHlsZVNoZWV0LFxuICAgICAgICB0b3A6ICcwcHgnXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3RhdGUuZGlzcGxheS5hc2lkZSkge1xuICAgICAgY2FzY2FkaW5nU3R5bGVTaGVldCA9IHtcbiAgICAgICAgLi4uY2FzY2FkaW5nU3R5bGVTaGVldCxcbiAgICAgICAgbGVmdDogJzI0cHgnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gY2FzY2FkaW5nU3R5bGVTaGVldDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdExvZ28oKTtcbiAgICB0aGlzLmluaXRGYXZpY29uKCk7XG4gICAgdGhpcy5pbml0TmF2VHlwZSgpO1xuICAgIHRoaXMuaW5pdEFzaWRlKCk7XG4gICAgdGhpcy5hZGRMYXlvdXREaXNwbGF5TGlzdGVuZXIoKTtcbiAgICB0aGlzLnN0b21wLmxpc3RlbigpO1xuICAgIHRoaXMudG9JbmRleCgpO1xuICB9XG5cbiAgaW5pdEZhdmljb24oKTogdm9pZCB7XG4gICAgY29uc3QgWywgZ2V0UHJvamVjdEluZm9dID0gdXNlTG9jYWxTdG9yYWdlUHJvamVjdEluZm8oKTtcbiAgICBjb25zdCBwcm9qZWN0SW5mbzogWXVuemFpUHJvamVjdEluZm8gPSBnZXRQcm9qZWN0SW5mbygpITtcbiAgICBpZiAocHJvamVjdEluZm8uZmF2aWNvblVybCkge1xuICAgICAgaGFzRmF2aWNvbihwcm9qZWN0SW5mby5mYXZpY29uVXJsKS50aGVuKChoYXM6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKGhhcykge1xuICAgICAgICAgIHNldEZhdmljb24ocHJvamVjdEluZm8uZmF2aWNvblVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0RmF2aWNvbignLi9hc3NldHMvZmF2aWNvbi5pY28nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEFzaWRlKCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldEN1cnJlbnRdID0gdXNlTG9jYWxTdG9yYWdlQ3VycmVudCgpO1xuICAgIGNvbnN0IGFzaWRlOiBMYXlvdXRCYXNpY0FzaWRlID0gZ2V0Q3VycmVudCgpITtcbiAgICB0aGlzLnN0YXRlLmFzaWRlID0geyAuLi5hc2lkZSB9O1xuICB9XG5cbiAgaW5pdExvZ28oKTogdm9pZCB7XG4gICAgY29uc3QgWywgZ2V0UHJvamVjdEluZm9dID0gdXNlTG9jYWxTdG9yYWdlUHJvamVjdEluZm8oKTtcbiAgICBjb25zdCBwcm9qZWN0SW5mbzogWXVuemFpUHJvamVjdEluZm8gPSBnZXRQcm9qZWN0SW5mbygpITtcbiAgICB0aGlzLnN0YXRlLm9wdGlvbnMubG9nb0V4cGFuZGVkID0gcHJvamVjdEluZm8ubWF4TG9nb1VybCA/IHByb2plY3RJbmZvLm1heExvZ29VcmwgOiBgLi9hc3NldHMvbG9nby1mdWxsLnN2Z2A7XG4gICAgdGhpcy5zdGF0ZS5vcHRpb25zLmxvZ29Db2xsYXBzZWQgPSBwcm9qZWN0SW5mby5taW5pTG9nb1VybCA/IHByb2plY3RJbmZvLm1pbmlMb2dvVXJsIDogYC4vYXNzZXRzL2xvZ28uc3ZnYDtcbiAgfVxuXG4gIGluaXROYXZUeXBlKCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldEhlYWRlclR5cGVdID0gdXNlTG9jYWxTdG9yYWdlSGVhZGVyVHlwZSgpO1xuICAgIGNvbnN0IFssIGdldFByb2plY3RJbmZvXSA9IHVzZUxvY2FsU3RvcmFnZVByb2plY3RJbmZvKCk7XG4gICAgY29uc3QgbmF2VHlwZTogTmF2VHlwZSB8IG51bGwgPSBnZXRIZWFkZXJUeXBlKCk7XG4gICAgY29uc3QgcHJvamVjdEluZm86IFl1bnphaVByb2plY3RJbmZvID0gZ2V0UHJvamVjdEluZm8oKSE7XG4gICAgaWYgKG5hdlR5cGUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3RhdGUubmF2VHlwZSA9IG5hdlR5cGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBmZXRjaGVkTmF2VHlwZTogTnpTYWZlQW55O1xuICAgIGlmIChwcm9qZWN0SW5mby5oZWFkZXJTdHlsZSAmJiBwcm9qZWN0SW5mby5oZWFkZXJTdHlsZS5sZW5ndGggPiAwKSB7XG4gICAgICBmZXRjaGVkTmF2VHlwZSA9IHByb2plY3RJbmZvLmhlYWRlclN0eWxlLnBvcCgpPy52YWx1ZTtcbiAgICB9XG4gICAgLy8gZGVmYXVsdCB2YWx1ZVxuICAgIGlmICghZmV0Y2hlZE5hdlR5cGUpIHtcbiAgICAgIGZldGNoZWROYXZUeXBlID0gTmF2VHlwZS5BUFBMSUNBVElPTjtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5uYXZUeXBlID0gZmV0Y2hlZE5hdlR5cGU7XG4gIH1cblxuICB0b0luZGV4KCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldERlZmF1bHRSb3V0ZV0gPSB1c2VMb2NhbFN0b3JhZ2VEZWZhdWx0Um91dGUoKTtcbiAgICBjb25zdCBkZWZhdWx0Um91dGUgPSBnZXREZWZhdWx0Um91dGUoKSE7XG4gICAgbG9nKCdZdW56YWlMYXlvdXRCYXNpY0NvbXBvbmVudDogJywgYHRvZG86IHRoZSBkZWZhdWx0IHJvdXRlIHdhcyAke2RlZmF1bHRSb3V0ZX0sIOS9huaYr+i/mOayoeaDs+WlveWmguS9leWunueOsC5gKTtcbiAgfVxuXG4gIG9uTmF2VHlwZUNoYW5nZSh0eXBlOiBOYXZUeXBlKTogdm9pZCB7XG4gICAgY29uc3QgW3NldEhlYWRlclR5cGVdID0gdXNlTG9jYWxTdG9yYWdlSGVhZGVyVHlwZSgpO1xuICAgIHNldEhlYWRlclR5cGUodHlwZSk7XG4gICAgdGhpcy53aW4ubG9jYXRpb24ucmVsb2FkKCk7XG4gIH1cblxuICBhZGRMYXlvdXREaXNwbGF5TGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5sYXlvdXREaXNwbGF5U2VydmljZS5saXN0ZW4oJ3JldXNlVGFiJywgKGRpc3BsYXk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuc3RhdGUuZGlzcGxheS5yZXVzZXRhYiA9IGRpc3BsYXk7XG4gICAgfSk7XG4gICAgdGhpcy5sYXlvdXREaXNwbGF5U2VydmljZS5saXN0ZW4oJ25hdicsIChkaXNwbGF5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlLmRpc3BsYXkubmF2ID0gZGlzcGxheTtcbiAgICB9KTtcblxuICAgIHRoaXMubGF5b3V0RGlzcGxheVNlcnZpY2UubGlzdGVuKCdhc2lkZScsIChkaXNwbGF5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlLmRpc3BsYXkuYXNpZGUgPSBkaXNwbGF5O1xuICAgIH0pO1xuICB9XG59XG4iXX0=
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+XG4gIGAsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBMYXlvdXREZWZhdWx0TW9kdWxlLFxuICAgIFJvdXRlck1vZHVsZSxcbiAgICBSZXVzZVRhYk1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSTE4blBpcGUsXG4gICAgTnpEcm9wRG93bk1vZHVsZSxcbiAgICBOekF2YXRhck1vZHVsZSxcbiAgICBOekljb25Nb2R1bGUsXG4gICAgTnpNb2RhbE1vZHVsZSxcbiAgICBOelNrZWxldG9uTW9kdWxlLFxuICAgIE56RGVzY3JpcHRpb25zTW9kdWxlLFxuICAgIFRoZW1lQnRuTW9kdWxlLFxuICAgIFl1bnphaVdpZGdldHNNb2R1bGUsXG4gICAgWXVuemFpTmF2QXBwbGljYXRpb25Db21wb25lbnQsXG4gICAgWXVuemFpTGF5b3V0TmF2R3JvdXBDb21wb25lbnQsXG4gICAgWXVuemFpTGF5b3V0TmF2VGlsZUNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFl1bnphaUxheW91dEJhc2ljQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9tcCA9IGluamVjdChTdG9tcFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdpbiA9IGluamVjdChXSU5ET1cpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxheW91dERpc3BsYXlTZXJ2aWNlID0gaW5qZWN0KExheW91dERpc3BsYXlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25mOiBZdW56YWlDb25maWcgPSBpbmplY3QoWVVOWkFJX0NPTkZJRyk7XG5cbiAgcHVibGljIE5hdlR5cGUgPSBOYXZUeXBlO1xuICBwcml2YXRlIHN0YXRlOiBMYXlvdXRCYXNpY1N0YXRlID0ge1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIGxvZ29FeHBhbmRlZDogYC4vYXNzZXRzL2xvZ28tZnVsbC5zdmdgLFxuICAgICAgbG9nb0NvbGxhcHNlZDogYC4vYXNzZXRzL2xvZ28uc3ZnYFxuICAgIH0sXG4gICAgYXNpZGU6IHtcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgaW50cm86ICcnLFxuICAgICAgaWNvbjogJydcbiAgICB9LFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIG5hdjogdHJ1ZSxcbiAgICAgIGFzaWRlOiB0cnVlLFxuICAgICAgcmV1c2V0YWI6IHRydWVcbiAgICB9LFxuICAgIG5hdlR5cGU6IE5hdlR5cGUuQVBQTElDQVRJT05cbiAgfTtcblxuICBoZWFkZXJTdHlsZUxpc3Q6IFl1bnphaUhlYWRlclN0eWxlW10gPSBbXTtcblxuICBhcHBsaWNhdGlvbkluZm8hOiBBcHBsaWNhdGlvbkluZm9JbnRlcmZhY2U7XG5cbiAgYXBwbGljYXRpb25Nb2RhbCA9IHtcbiAgICBpc1Zpc2libGU6IGZhbHNlLFxuICAgIGxvYWRpbmc6IGZhbHNlXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBodHRwQ2xpZW50ID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICBwcml2YXRlIGNvbmZpZyE6IFl1bnphaUJ1c2luZXNzQ29uZmlnO1xuXG4gIGdldCBvcHRpb25zKCk6IExheW91dERlZmF1bHRPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5vcHRpb25zO1xuICB9XG5cbiAgZ2V0IG5hdlR5cGUoKTogTmF2VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUubmF2VHlwZTtcbiAgfVxuXG4gIGdldCBhc2lkZSgpOiBMYXlvdXRCYXNpY0FzaWRlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5hc2lkZTtcbiAgfVxuXG4gIGdldCBkaXNwbGF5UmV1c2V0YWIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZGlzcGxheS5yZXVzZXRhYjtcbiAgfVxuXG4gIGdldCByZXVzZXRhYkNTUygpOiBOelNhZmVBbnkge1xuICAgIGxldCBjYXNjYWRpbmdTdHlsZVNoZWV0ID0ge307XG4gICAgaWYgKCF0aGlzLnN0YXRlLmRpc3BsYXkubmF2KSB7XG4gICAgICBjYXNjYWRpbmdTdHlsZVNoZWV0ID0ge1xuICAgICAgICAuLi5jYXNjYWRpbmdTdHlsZVNoZWV0LFxuICAgICAgICB0b3A6ICcwcHgnXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3RhdGUuZGlzcGxheS5hc2lkZSkge1xuICAgICAgY2FzY2FkaW5nU3R5bGVTaGVldCA9IHtcbiAgICAgICAgLi4uY2FzY2FkaW5nU3R5bGVTaGVldCxcbiAgICAgICAgbGVmdDogJzI0cHgnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gY2FzY2FkaW5nU3R5bGVTaGVldDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnID0gdGhpcy5jb25mLmJpcyE7XG4gICAgdGhpcy5pbml0TG9nbygpO1xuICAgIHRoaXMuaW5pdEZhdmljb24oKTtcbiAgICB0aGlzLmluaXROYXZUeXBlKCk7XG4gICAgdGhpcy5pbml0QXNpZGUoKTtcbiAgICB0aGlzLmFkZExheW91dERpc3BsYXlMaXN0ZW5lcigpO1xuICAgIHRoaXMuc3RvbXAubGlzdGVuKCk7XG4gICAgdGhpcy50b0luZGV4KCk7XG4gIH1cblxuICBpbml0RmF2aWNvbigpOiB2b2lkIHtcbiAgICBjb25zdCBbLCBnZXRQcm9qZWN0SW5mb10gPSB1c2VMb2NhbFN0b3JhZ2VQcm9qZWN0SW5mbygpO1xuICAgIGNvbnN0IHByb2plY3RJbmZvOiBZdW56YWlQcm9qZWN0SW5mbyA9IGdldFByb2plY3RJbmZvKCkhO1xuICAgIGlmIChwcm9qZWN0SW5mby5mYXZpY29uVXJsKSB7XG4gICAgICBoYXNGYXZpY29uKHByb2plY3RJbmZvLmZhdmljb25VcmwpLnRoZW4oKGhhczogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoaGFzKSB7XG4gICAgICAgICAgc2V0RmF2aWNvbihwcm9qZWN0SW5mby5mYXZpY29uVXJsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRGYXZpY29uKCcuL2Fzc2V0cy9mYXZpY29uLmljbycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpbml0QXNpZGUoKTogdm9pZCB7XG4gICAgY29uc3QgWywgZ2V0Q3VycmVudF0gPSB1c2VMb2NhbFN0b3JhZ2VDdXJyZW50KCk7XG4gICAgY29uc3QgYXNpZGU6IExheW91dEJhc2ljQXNpZGUgPSBnZXRDdXJyZW50KCkhO1xuICAgIHRoaXMuc3RhdGUuYXNpZGUgPSB7IC4uLmFzaWRlIH07XG4gIH1cblxuICBpbml0TG9nbygpOiB2b2lkIHtcbiAgICBjb25zdCBbLCBnZXRQcm9qZWN0SW5mb10gPSB1c2VMb2NhbFN0b3JhZ2VQcm9qZWN0SW5mbygpO1xuICAgIGNvbnN0IHByb2plY3RJbmZvOiBZdW56YWlQcm9qZWN0SW5mbyA9IGdldFByb2plY3RJbmZvKCkhO1xuICAgIHRoaXMuc3RhdGUub3B0aW9ucy5sb2dvRXhwYW5kZWQgPSBwcm9qZWN0SW5mby5tYXhMb2dvVXJsID8gcHJvamVjdEluZm8ubWF4TG9nb1VybCA6IGAuL2Fzc2V0cy9sb2dvLWZ1bGwuc3ZnYDtcbiAgICB0aGlzLnN0YXRlLm9wdGlvbnMubG9nb0NvbGxhcHNlZCA9IHByb2plY3RJbmZvLm1pbmlMb2dvVXJsID8gcHJvamVjdEluZm8ubWluaUxvZ29VcmwgOiBgLi9hc3NldHMvbG9nby5zdmdgO1xuICB9XG5cbiAgaW5pdE5hdlR5cGUoKTogdm9pZCB7XG4gICAgY29uc3QgWywgZ2V0SGVhZGVyVHlwZV0gPSB1c2VMb2NhbFN0b3JhZ2VIZWFkZXJUeXBlKCk7XG4gICAgY29uc3QgWywgZ2V0UHJvamVjdEluZm9dID0gdXNlTG9jYWxTdG9yYWdlUHJvamVjdEluZm8oKTtcbiAgICBjb25zdCBuYXZUeXBlOiBOYXZUeXBlIHwgbnVsbCA9IGdldEhlYWRlclR5cGUoKTtcbiAgICBjb25zdCBwcm9qZWN0SW5mbzogWXVuemFpUHJvamVjdEluZm8gPSBnZXRQcm9qZWN0SW5mbygpITtcbiAgICBpZiAobmF2VHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zdGF0ZS5uYXZUeXBlID0gbmF2VHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZS5uYXZUeXBlID0gTmF2VHlwZS5BUFBMSUNBVElPTjtcbiAgICB9XG4gICAgaWYgKHByb2plY3RJbmZvLmhlYWRlclN0eWxlICYmIHByb2plY3RJbmZvLmhlYWRlclN0eWxlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaGVhZGVyU3R5bGVMaXN0ID0gcHJvamVjdEluZm8uaGVhZGVyU3R5bGU7XG4gICAgICBjb25zdCBoYXNUaGlzID0gdGhpcy5oZWFkZXJTdHlsZUxpc3Quc29tZShpdGVtID0+IGl0ZW0udmFsdWUgPT09IHRoaXMuc3RhdGUubmF2VHlwZSk7XG4gICAgICBpZiAoIWhhc1RoaXMpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5uYXZUeXBlID0gPE5hdlR5cGU+cHJvamVjdEluZm8uaGVhZGVyU3R5bGVbMF0udmFsdWU7XG4gICAgICAgIGNvbnN0IFtzZXRIZWFkZXJUeXBlXSA9IHVzZUxvY2FsU3RvcmFnZUhlYWRlclR5cGUoKTtcbiAgICAgICAgc2V0SGVhZGVyVHlwZSh0aGlzLnN0YXRlLm5hdlR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvSW5kZXgoKTogdm9pZCB7XG4gICAgY29uc3QgWywgZ2V0RGVmYXVsdFJvdXRlXSA9IHVzZUxvY2FsU3RvcmFnZURlZmF1bHRSb3V0ZSgpO1xuICAgIGNvbnN0IGRlZmF1bHRSb3V0ZSA9IGdldERlZmF1bHRSb3V0ZSgpITtcbiAgICBsb2coJ1l1bnphaUxheW91dEJhc2ljQ29tcG9uZW50OiAnLCBgdG9kbzogdGhlIGRlZmF1bHQgcm91dGUgd2FzICR7ZGVmYXVsdFJvdXRlfSwg5L2G5piv6L+Y5rKh5oOz5aW95aaC5L2V5a6e546wLmApO1xuICB9XG5cbiAgb25OYXZUeXBlQ2hhbmdlKHR5cGU6IE5hdlR5cGUgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBbc2V0SGVhZGVyVHlwZV0gPSB1c2VMb2NhbFN0b3JhZ2VIZWFkZXJUeXBlKCk7XG4gICAgc2V0SGVhZGVyVHlwZSg8TmF2VHlwZT50eXBlKTtcbiAgICB0aGlzLndpbi5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGFkZExheW91dERpc3BsYXlMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB0aGlzLmxheW91dERpc3BsYXlTZXJ2aWNlLmxpc3RlbigncmV1c2VUYWInLCAoZGlzcGxheTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5zdGF0ZS5kaXNwbGF5LnJldXNldGFiID0gZGlzcGxheTtcbiAgICB9KTtcbiAgICB0aGlzLmxheW91dERpc3BsYXlTZXJ2aWNlLmxpc3RlbignbmF2JywgKGRpc3BsYXk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuc3RhdGUuZGlzcGxheS5uYXYgPSBkaXNwbGF5O1xuICAgIH0pO1xuXG4gICAgdGhpcy5sYXlvdXREaXNwbGF5U2VydmljZS5saXN0ZW4oJ2FzaWRlJywgKGRpc3BsYXk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuc3RhdGUuZGlzcGxheS5hc2lkZSA9IGRpc3BsYXk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDlhbPkuo7mnKzlupTnlKhcbiAgYWJvdXRBcHBsaWNhdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCB1cmxBcnIgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoYCR7dGhpcy5jb25maWcuYmFzZVVybH0vYCk7XG4gICAgaWYgKHVybEFyci5sZW5ndGggPiAxKSB7XG4gICAgICAvLyDlupTnlKjmoIfor4bvvIzmiKrlj5bot6/lvoTkuK0gL2JhY2tzdGFnZS/lkI7nrKzkuIDkuKrlrZfnrKbkuLJcbiAgICAgIC8vIOS+izogaHR0cDovLzIyMi4zMC4xOTQuNjEvYmFja3N0YWdlL2F1dGgvcGFnZS9vYWZwb3J0YWwvIy9iYXNlL21lbnUgIOS4rSBhdXRoXG4gICAgICBjb25zdCBuYW1lID0gdXJsQXJyWzFdLnNwbGl0KCcvJylbMF07XG4gICAgICB0aGlzLmFwcGxpY2F0aW9uTW9kYWwuaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25Nb2RhbC5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICAgICAgdGhpcy5odHRwQ2xpZW50LmdldChgL2Jhc2ljL2FwaS9hcHAvYWJvdXRBcHA/bmFtZT0ke25hbWV9YCkuc3Vic2NyaWJlKFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIChyZXNwb25zZTogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbk1vZGFsLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkluZm8gPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25Nb2RhbC5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=