@yelon/bis 16.2.4 → 16.2.5-68d194e

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 (68) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +23 -23
  3. package/esm2022/bis.mjs +4 -4
  4. package/esm2022/index.mjs +1 -1
  5. package/esm2022/layout/bis.config.mjs +14 -14
  6. package/esm2022/layout/html-names.mjs +32 -32
  7. package/esm2022/layout/icon/style-icons.mjs +795 -795
  8. package/esm2022/layout/layout-basic/index.mjs +2 -2
  9. package/esm2022/layout/layout-basic/interface.mjs +1 -1
  10. package/esm2022/layout/layout-basic/layout-basic.component.mjs +372 -372
  11. package/esm2022/layout/layout-nav/index.mjs +3 -3
  12. package/esm2022/layout/layout-nav/layout-nav-application.component.mjs +364 -364
  13. package/esm2022/layout/layout-nav/layout-nav-group.component.mjs +122 -122
  14. package/esm2022/layout/layout-nav/layout-nav-tile.component.mjs +14 -14
  15. package/esm2022/layout/layout.mjs +4 -4
  16. package/esm2022/layout/public_api.mjs +12 -12
  17. package/esm2022/layout/widgets/index.mjs +6 -6
  18. package/esm2022/layout/widgets/yunzai-clear-storage.component.mjs +44 -44
  19. package/esm2022/layout/widgets/yunzai-fullscreen.component.mjs +44 -44
  20. package/esm2022/layout/widgets/yunzai-i18n.component.mjs +145 -145
  21. package/esm2022/layout/widgets/yunzai-notify.component.mjs +182 -182
  22. package/esm2022/layout/widgets/yunzai-theme-btn.component.mjs +199 -199
  23. package/esm2022/layout/widgets/yunzai-user.component.mjs +129 -129
  24. package/esm2022/layout/yunzai-act.guard.mjs +106 -106
  25. package/esm2022/layout/yunzai-auth.service.mjs +107 -107
  26. package/esm2022/layout/yunzai-default.interceptor.mjs +200 -200
  27. package/esm2022/layout/yunzai-i18n.service.mjs +102 -129
  28. package/esm2022/layout/yunzai-lang.mjs +113 -113
  29. package/esm2022/layout/yunzai-layout.module.mjs +76 -76
  30. package/esm2022/layout/yunzai-startup.service.mjs +152 -152
  31. package/esm2022/public_api.mjs +1 -1
  32. package/fesm2022/bis.mjs +6 -6
  33. package/fesm2022/layout.mjs +3198 -3224
  34. package/fesm2022/layout.mjs.map +1 -1
  35. package/index.d.ts +1 -1
  36. package/index.less +1 -1
  37. package/layout/bis.config.d.ts +3 -3
  38. package/layout/html-names.d.ts +31 -31
  39. package/layout/icon/style-icons.d.ts +1 -1
  40. package/layout/index.d.ts +5 -5
  41. package/layout/layout-basic/index.d.ts +2 -2
  42. package/layout/layout-basic/interface.d.ts +8 -8
  43. package/layout/layout-basic/layout-basic.component.d.ts +28 -28
  44. package/layout/layout-nav/index.d.ts +3 -3
  45. package/layout/layout-nav/layout-nav-application.component.d.ts +31 -31
  46. package/layout/layout-nav/layout-nav-group.component.d.ts +16 -16
  47. package/layout/layout-nav/layout-nav-tile.component.d.ts +6 -6
  48. package/layout/public_api.d.ts +12 -12
  49. package/layout/style/index.less +154 -154
  50. package/layout/widgets/index.d.ts +6 -6
  51. package/layout/widgets/yunzai-clear-storage.component.d.ts +11 -11
  52. package/layout/widgets/yunzai-fullscreen.component.d.ts +8 -8
  53. package/layout/widgets/yunzai-i18n.component.d.ts +21 -21
  54. package/layout/widgets/yunzai-notify.component.d.ts +30 -30
  55. package/layout/widgets/yunzai-theme-btn.component.d.ts +32 -32
  56. package/layout/widgets/yunzai-user.component.d.ts +26 -26
  57. package/layout/yunzai-act.guard.d.ts +20 -20
  58. package/layout/yunzai-auth.service.d.ts +19 -19
  59. package/layout/yunzai-default.interceptor.d.ts +27 -27
  60. package/layout/yunzai-i18n.service.d.ts +26 -30
  61. package/layout/yunzai-lang.d.ts +11 -11
  62. package/layout/yunzai-layout.module.d.ts +22 -22
  63. package/layout/yunzai-startup.service.d.ts +34 -34
  64. package/package.json +39 -39
  65. package/public_api.d.ts +2 -2
  66. package/theme-compact.less +3 -3
  67. package/theme-dark.less +46 -46
  68. package/theme-default.less +46 -46
@@ -1,183 +1,183 @@
1
- import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
2
- import { forkJoin, map } from 'rxjs';
3
- import { formatDistanceToNow } from 'date-fns';
4
- import { YUNZAI_I18N_TOKEN } from '@yelon/theme';
5
- import { WINDOW } from '@yelon/util';
6
- import { log } from '@yelon/util/other';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "ng-zorro-antd/message";
9
- import * as i2 from "ng-zorro-antd/i18n";
10
- import * as i3 from "@yelon/theme";
11
- import * as i4 from "@yelon/abc/notice-icon";
12
- import * as i5 from "../yunzai-i18n.service";
13
- export class YunzaiNotifyComponent {
14
- constructor(injector, msg, y18n, nzI18n, cdr, httpClient) {
15
- this.injector = injector;
16
- this.msg = msg;
17
- this.y18n = y18n;
18
- this.nzI18n = nzI18n;
19
- this.cdr = cdr;
20
- this.httpClient = httpClient;
21
- this.data = [
22
- {
23
- key: 'msg',
24
- title: this.y18n.fanyi('notify.message'),
25
- list: [],
26
- emptyText: this.y18n.fanyi('notify.message.empty'),
27
- emptyImage: './assets/tmp/img/message.svg',
28
- clearText: this.y18n.fanyi('notify.message.clear')
29
- },
30
- {
31
- key: 'todo',
32
- title: this.y18n.fanyi('notify.todo'),
33
- list: [],
34
- emptyText: this.y18n.fanyi('notify.todo.empty'),
35
- emptyImage: './assets/tmp/img/todo.svg',
36
- clearText: this.y18n.fanyi('notify.todo.clear')
37
- },
38
- {
39
- key: 'notice',
40
- title: this.y18n.fanyi('notify.notice'),
41
- list: [],
42
- emptyText: this.y18n.fanyi('notify.notice.empty'),
43
- emptyImage: './assets/tmp/img/notice.svg',
44
- clearText: this.y18n.fanyi('notify.notice.clear')
45
- }
46
- ];
47
- this.loading = false;
48
- this.count = 0;
49
- this.subs = [];
50
- }
51
- ngOnInit() {
52
- this.loadData();
53
- }
54
- loadData() {
55
- this.count = 0;
56
- this.loading = true;
57
- this.subs.push(forkJoin(this.loadTodo(), this.loadMessage()).subscribe(() => {
58
- this.loading = false;
59
- this.cdr.detectChanges();
60
- }));
61
- }
62
- loadMessage() {
63
- log('notify.component: ', 'fetch message list');
64
- const formatMessageStatus = (status) => {
65
- switch (status) {
66
- case '0':
67
- return { extra: this.y18n.fanyi('notify.unread'), color: 'red' };
68
- case '1':
69
- return { extra: this.y18n.fanyi('notify.readed'), color: 'green' };
70
- default:
71
- return { extra: this.y18n.fanyi('notify.nostatus'), color: 'primary' };
72
- }
73
- };
74
- return this.httpClient
75
- .post(`/message-center-3/my-msg-and-todo/msg-list`, {
76
- pageNum: 1,
77
- pageSize: 10,
78
- status: '0'
79
- })
80
- .pipe(map((response) => {
81
- const viewMessage = this.data.filter(d => d.key === 'msg')[0];
82
- viewMessage.list = response.data.list.map((m) => {
83
- return {
84
- ...m,
85
- avatar: m?.imgUrl || './assets/tmp/img/message.png',
86
- title: m.systemName,
87
- description: m.content,
88
- extra: formatMessageStatus(m.status).extra,
89
- color: formatMessageStatus(m.status).color,
90
- datetime: formatDistanceToNow(new Date(m.date), { locale: this.nzI18n.getDateLocale() })
91
- };
92
- });
93
- this.count += viewMessage.list.length;
94
- }));
95
- }
96
- loadTodo() {
97
- log('notify.component: ', 'fetch todo list');
98
- const formatTodoStatus = (status) => {
99
- switch (status) {
100
- case '0':
101
- return { extra: this.y18n.fanyi('notify.unstart'), color: 'red' };
102
- case '1':
103
- return { extra: this.y18n.fanyi('notify.started'), color: 'green' };
104
- default:
105
- return { extra: this.y18n.fanyi('notify.nostatus'), color: 'primary' };
106
- }
107
- };
108
- return this.httpClient
109
- .post(`/message-center-3/my-msg-and-todo/todo-list`, {
110
- pageNum: 1,
111
- pageSize: 10,
112
- status: '0'
113
- })
114
- .pipe(map((response) => {
115
- const viewTodo = this.data.filter(d => d.key === 'todo')[0];
116
- viewTodo.list = response.data.list.map((t) => {
117
- return {
118
- ...t,
119
- avatar: t?.imgUrl || './assets/tmp/img/todo.png',
120
- title: t.systemName,
121
- description: t.content,
122
- datetime: formatDistanceToNow(new Date(t.date), { locale: this.nzI18n.getDateLocale() }),
123
- extra: formatTodoStatus(t.status).extra,
124
- color: formatTodoStatus(t.status).color
125
- };
126
- });
127
- this.count += viewTodo.list.length;
128
- }));
129
- }
130
- clear(type) {
131
- const t = this.data.filter(d => d.title === type)[0];
132
- if (t.key == 'msg' || t.key == 'notice') {
133
- this.subs.push(this.httpClient.post(`/message-center-3/my-msg-and-todo/msg-clear`, {}).subscribe(_ => {
134
- this.msg.success(`${this.y18n.fanyi('notify.clear')} ${type}`);
135
- this.loadData();
136
- }));
137
- }
138
- if (t.key == 'todo') {
139
- this.loadData();
140
- }
141
- }
142
- select(res) {
143
- this.injector.get(WINDOW).open(res.item.url);
144
- this.loadData();
145
- }
146
- ngOnDestroy() {
147
- this.subs.forEach(a => a.unsubscribe());
148
- }
149
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: YunzaiNotifyComponent, deps: [{ token: i0.Injector }, { token: i1.NzMessageService }, { token: YUNZAI_I18N_TOKEN }, { token: i2.NzI18nService }, { token: i0.ChangeDetectorRef }, { token: i3._HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
150
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: YunzaiNotifyComponent, selector: "yunzai-notify", ngImport: i0, template: `
151
- <notice-icon
152
- [data]="data"
153
- [count]="count"
154
- [loading]="loading"
155
- btnClass="yunzai-default__nav-item"
156
- btnIconClass="yunzai-default__nav-item-icon"
157
- (select)="select($event)"
158
- (clear)="clear($event)"
159
- ></notice-icon>
160
- `, isInline: true, dependencies: [{ kind: "component", type: i4.NoticeIconComponent, selector: "notice-icon", inputs: ["data", "count", "loading", "popoverVisible", "btnClass", "btnIconClass", "centered"], outputs: ["select", "clear", "popoverVisibleChange"], exportAs: ["noticeIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
161
- }
162
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: YunzaiNotifyComponent, decorators: [{
163
- type: Component,
164
- args: [{
165
- selector: 'yunzai-notify',
166
- template: `
167
- <notice-icon
168
- [data]="data"
169
- [count]="count"
170
- [loading]="loading"
171
- btnClass="yunzai-default__nav-item"
172
- btnIconClass="yunzai-default__nav-item-icon"
173
- (select)="select($event)"
174
- (clear)="clear($event)"
175
- ></notice-icon>
176
- `,
177
- changeDetection: ChangeDetectionStrategy.OnPush
178
- }]
179
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.NzMessageService }, { type: i5.YunzaiI18NService, decorators: [{
180
- type: Inject,
181
- args: [YUNZAI_I18N_TOKEN]
182
- }] }, { type: i2.NzI18nService }, { type: i0.ChangeDetectorRef }, { type: i3._HttpClient }]; } });
1
+ import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
2
+ import { forkJoin, map } from 'rxjs';
3
+ import { formatDistanceToNow } from 'date-fns';
4
+ import { YUNZAI_I18N_TOKEN } from '@yelon/theme';
5
+ import { WINDOW } from '@yelon/util';
6
+ import { log } from '@yelon/util/other';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "ng-zorro-antd/message";
9
+ import * as i2 from "ng-zorro-antd/i18n";
10
+ import * as i3 from "@yelon/theme";
11
+ import * as i4 from "@yelon/abc/notice-icon";
12
+ import * as i5 from "../yunzai-i18n.service";
13
+ export class YunzaiNotifyComponent {
14
+ constructor(injector, msg, y18n, nzI18n, cdr, httpClient) {
15
+ this.injector = injector;
16
+ this.msg = msg;
17
+ this.y18n = y18n;
18
+ this.nzI18n = nzI18n;
19
+ this.cdr = cdr;
20
+ this.httpClient = httpClient;
21
+ this.data = [
22
+ {
23
+ key: 'msg',
24
+ title: this.y18n.fanyi('notify.message'),
25
+ list: [],
26
+ emptyText: this.y18n.fanyi('notify.message.empty'),
27
+ emptyImage: './assets/tmp/img/message.svg',
28
+ clearText: this.y18n.fanyi('notify.message.clear')
29
+ },
30
+ {
31
+ key: 'todo',
32
+ title: this.y18n.fanyi('notify.todo'),
33
+ list: [],
34
+ emptyText: this.y18n.fanyi('notify.todo.empty'),
35
+ emptyImage: './assets/tmp/img/todo.svg',
36
+ clearText: this.y18n.fanyi('notify.todo.clear')
37
+ },
38
+ {
39
+ key: 'notice',
40
+ title: this.y18n.fanyi('notify.notice'),
41
+ list: [],
42
+ emptyText: this.y18n.fanyi('notify.notice.empty'),
43
+ emptyImage: './assets/tmp/img/notice.svg',
44
+ clearText: this.y18n.fanyi('notify.notice.clear')
45
+ }
46
+ ];
47
+ this.loading = false;
48
+ this.count = 0;
49
+ this.subs = [];
50
+ }
51
+ ngOnInit() {
52
+ this.loadData();
53
+ }
54
+ loadData() {
55
+ this.count = 0;
56
+ this.loading = true;
57
+ this.subs.push(forkJoin(this.loadTodo(), this.loadMessage()).subscribe(() => {
58
+ this.loading = false;
59
+ this.cdr.detectChanges();
60
+ }));
61
+ }
62
+ loadMessage() {
63
+ log('notify.component: ', 'fetch message list');
64
+ const formatMessageStatus = (status) => {
65
+ switch (status) {
66
+ case '0':
67
+ return { extra: this.y18n.fanyi('notify.unread'), color: 'red' };
68
+ case '1':
69
+ return { extra: this.y18n.fanyi('notify.readed'), color: 'green' };
70
+ default:
71
+ return { extra: this.y18n.fanyi('notify.nostatus'), color: 'primary' };
72
+ }
73
+ };
74
+ return this.httpClient
75
+ .post(`/message-center-3/my-msg-and-todo/msg-list`, {
76
+ pageNum: 1,
77
+ pageSize: 10,
78
+ status: '0'
79
+ })
80
+ .pipe(map((response) => {
81
+ const viewMessage = this.data.filter(d => d.key === 'msg')[0];
82
+ viewMessage.list = response.data.list.map((m) => {
83
+ return {
84
+ ...m,
85
+ avatar: m?.imgUrl || './assets/tmp/img/message.png',
86
+ title: m.systemName,
87
+ description: m.content,
88
+ extra: formatMessageStatus(m.status).extra,
89
+ color: formatMessageStatus(m.status).color,
90
+ datetime: formatDistanceToNow(new Date(m.date), { locale: this.nzI18n.getDateLocale() })
91
+ };
92
+ });
93
+ this.count += viewMessage.list.length;
94
+ }));
95
+ }
96
+ loadTodo() {
97
+ log('notify.component: ', 'fetch todo list');
98
+ const formatTodoStatus = (status) => {
99
+ switch (status) {
100
+ case '0':
101
+ return { extra: this.y18n.fanyi('notify.unstart'), color: 'red' };
102
+ case '1':
103
+ return { extra: this.y18n.fanyi('notify.started'), color: 'green' };
104
+ default:
105
+ return { extra: this.y18n.fanyi('notify.nostatus'), color: 'primary' };
106
+ }
107
+ };
108
+ return this.httpClient
109
+ .post(`/message-center-3/my-msg-and-todo/todo-list`, {
110
+ pageNum: 1,
111
+ pageSize: 10,
112
+ status: '0'
113
+ })
114
+ .pipe(map((response) => {
115
+ const viewTodo = this.data.filter(d => d.key === 'todo')[0];
116
+ viewTodo.list = response.data.list.map((t) => {
117
+ return {
118
+ ...t,
119
+ avatar: t?.imgUrl || './assets/tmp/img/todo.png',
120
+ title: t.systemName,
121
+ description: t.content,
122
+ datetime: formatDistanceToNow(new Date(t.date), { locale: this.nzI18n.getDateLocale() }),
123
+ extra: formatTodoStatus(t.status).extra,
124
+ color: formatTodoStatus(t.status).color
125
+ };
126
+ });
127
+ this.count += viewTodo.list.length;
128
+ }));
129
+ }
130
+ clear(type) {
131
+ const t = this.data.filter(d => d.title === type)[0];
132
+ if (t.key == 'msg' || t.key == 'notice') {
133
+ this.subs.push(this.httpClient.post(`/message-center-3/my-msg-and-todo/msg-clear`, {}).subscribe(_ => {
134
+ this.msg.success(`${this.y18n.fanyi('notify.clear')} ${type}`);
135
+ this.loadData();
136
+ }));
137
+ }
138
+ if (t.key == 'todo') {
139
+ this.loadData();
140
+ }
141
+ }
142
+ select(res) {
143
+ this.injector.get(WINDOW).open(res.item.url);
144
+ this.loadData();
145
+ }
146
+ ngOnDestroy() {
147
+ this.subs.forEach(a => a.unsubscribe());
148
+ }
149
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: YunzaiNotifyComponent, deps: [{ token: i0.Injector }, { token: i1.NzMessageService }, { token: YUNZAI_I18N_TOKEN }, { token: i2.NzI18nService }, { token: i0.ChangeDetectorRef }, { token: i3._HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
150
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: YunzaiNotifyComponent, selector: "yunzai-notify", ngImport: i0, template: `
151
+ <notice-icon
152
+ [data]="data"
153
+ [count]="count"
154
+ [loading]="loading"
155
+ btnClass="yunzai-default__nav-item"
156
+ btnIconClass="yunzai-default__nav-item-icon"
157
+ (select)="select($event)"
158
+ (clear)="clear($event)"
159
+ ></notice-icon>
160
+ `, isInline: true, dependencies: [{ kind: "component", type: i4.NoticeIconComponent, selector: "notice-icon", inputs: ["data", "count", "loading", "popoverVisible", "btnClass", "btnIconClass", "centered"], outputs: ["select", "clear", "popoverVisibleChange"], exportAs: ["noticeIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
161
+ }
162
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: YunzaiNotifyComponent, decorators: [{
163
+ type: Component,
164
+ args: [{
165
+ selector: 'yunzai-notify',
166
+ template: `
167
+ <notice-icon
168
+ [data]="data"
169
+ [count]="count"
170
+ [loading]="loading"
171
+ btnClass="yunzai-default__nav-item"
172
+ btnIconClass="yunzai-default__nav-item-icon"
173
+ (select)="select($event)"
174
+ (clear)="clear($event)"
175
+ ></notice-icon>
176
+ `,
177
+ changeDetection: ChangeDetectionStrategy.OnPush
178
+ }]
179
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.NzMessageService }, { type: i5.YunzaiI18NService, decorators: [{
180
+ type: Inject,
181
+ args: [YUNZAI_I18N_TOKEN]
182
+ }] }, { type: i2.NzI18nService }, { type: i0.ChangeDetectorRef }, { type: i3._HttpClient }]; } });
183
183
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXVuemFpLW5vdGlmeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9iaXMvbGF5b3V0L3dpZGdldHMveXVuemFpLW5vdGlmeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsTUFBTSxFQUlQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQTRCLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0MsT0FBTyxFQUFFLGlCQUFpQixFQUFlLE1BQU0sY0FBYyxDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7O0FBc0J4QyxNQUFNLE9BQU8scUJBQXFCO0lBK0JoQyxZQUNVLFFBQWtCLEVBQ2xCLEdBQXFCLEVBQ00sSUFBdUIsRUFDbEQsTUFBcUIsRUFDckIsR0FBc0IsRUFDdEIsVUFBdUI7UUFMdkIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUNNLFNBQUksR0FBSixJQUFJLENBQW1CO1FBQ2xELFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBYTtRQXBDakMsU0FBSSxHQUFpQjtZQUNuQjtnQkFDRSxHQUFHLEVBQUUsS0FBSztnQkFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3hDLElBQUksRUFBRSxFQUFFO2dCQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFB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QUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQzs4R0F2SlUscUJBQXFCLDBFQWtDdEIsaUJBQWlCO2tHQWxDaEIscUJBQXFCLHFEQWJ0Qjs7Ozs7Ozs7OztHQVVUOzsyRkFHVSxxQkFBcUI7a0JBZmpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFFBQVEsRUFBRTs7Ozs7Ozs7OztHQVVUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs7MEJBbUNJLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgbWFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGZvcm1hdERpc3RhbmNlVG9Ob3cgfSBmcm9tICdkYXRlLWZucyc7XG5cbmltcG9ydCB7IE5vdGljZUljb25TZWxlY3QsIE5vdGljZUl0ZW0gfSBmcm9tICdAeWVsb24vYWJjL25vdGljZS1pY29uJztcbmltcG9ydCB7IFlVTlpBSV9JMThOX1RPS0VOLCBfSHR0cENsaWVudCB9IGZyb20gJ0B5ZWxvbi90aGVtZSc7XG5pbXBvcnQgeyBXSU5ET1cgfSBmcm9tICdAeWVsb24vdXRpbCc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICdAeWVsb24vdXRpbC9vdGhlcic7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgTnpJMThuU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaTE4bic7XG5pbXBvcnQgeyBOek1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9tZXNzYWdlJztcblxuaW1wb3J0IHsgWXVuemFpSTE4TlNlcnZpY2UgfSBmcm9tICcuLi95dW56YWktaTE4bi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXVuemFpLW5vdGlmeScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5vdGljZS1pY29uXG4gICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICAgIFtjb3VudF09XCJjb3VudFwiXG4gICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgIGJ0bkNsYXNzPVwieXVuemFpLWRlZmF1bHRfX25hdi1pdGVtXCJcbiAgICAgIGJ0bkljb25DbGFzcz1cInl1bnphaS1kZWZhdWx0X19uYXYtaXRlbS1pY29uXCJcbiAgICAgIChzZWxlY3QpPVwic2VsZWN0KCRldmVudClcIlxuICAgICAgKGNsZWFyKT1cImNsZWFyKCRldmVudClcIlxuICAgID48L25vdGljZS1pY29uPlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBZdW56YWlOb3RpZnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGRhdGE6IE5vdGljZUl0ZW1bXSA9IFtcbiAgICB7XG4gICAgICBrZXk6ICdtc2cnLFxuICAgICAgdGl0bGU6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5Lm1lc3NhZ2UnKSxcbiAgICAgIGxpc3Q6IFtdLFxuICAgICAgZW1wdHlUZXh0OiB0aGlzLnkxOG4uZmFueWkoJ25vdGlmeS5tZXNzYWdlLmVtcHR5JyksXG4gICAgICBlbXB0eUltYWdlOiAnLi9hc3NldHMvdG1wL2ltZy9tZXNzYWdlLnN2ZycsXG4gICAgICBjbGVhclRleHQ6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5Lm1lc3NhZ2UuY2xlYXInKVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAndG9kbycsXG4gICAgICB0aXRsZTogdGhpcy55MThuLmZhbnlpKCdub3RpZnkudG9kbycpLFxuICAgICAgbGlzdDogW10sXG4gICAgICBlbXB0eVRleHQ6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5LnRvZG8uZW1wdHknKSxcbiAgICAgIGVtcHR5SW1hZ2U6ICcuL2Fzc2V0cy90bXAvaW1nL3RvZG8uc3ZnJyxcbiAgICAgIGNsZWFyVGV4dDogdGhpcy55MThuLmZhbnlpKCdub3RpZnkudG9kby5jbGVhcicpXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdub3RpY2UnLFxuICAgICAgdGl0bGU6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5Lm5vdGljZScpLFxuICAgICAgbGlzdDogW10sXG4gICAgICBlbXB0eVRleHQ6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5Lm5vdGljZS5lbXB0eScpLFxuICAgICAgZW1wdHlJbWFnZTogJy4vYXNzZXRzL3RtcC9pbWcvbm90aWNlLnN2ZycsXG4gICAgICBjbGVhclRleHQ6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5Lm5vdGljZS5jbGVhcicpXG4gICAgfVxuICBdO1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIGNvdW50ID0gMDtcbiAgc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIG1zZzogTnpNZXNzYWdlU2VydmljZSxcbiAgICBASW5qZWN0KFlVTlpBSV9JMThOX1RPS0VOKSBwcml2YXRlIHkxOG46IFl1bnphaUkxOE5TZXJ2aWNlLFxuICAgIHByaXZhdGUgbnpJMThuOiBOekkxOG5TZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGh0dHBDbGllbnQ6IF9IdHRwQ2xpZW50XG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gIH1cblxuICBsb2FkRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50ID0gMDtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3Vicy5wdXNoKFxuICAgICAgZm9ya0pvaW4odGhpcy5sb2FkVG9kbygpLCB0aGlzLmxvYWRNZXNzYWdlKCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBsb2FkTWVzc2FnZSgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBsb2coJ25vdGlmeS5jb21wb25lbnQ6ICcsICdmZXRjaCBtZXNzYWdlIGxpc3QnKTtcbiAgICBjb25zdCBmb3JtYXRNZXNzYWdlU3RhdHVzID0gKHN0YXR1czogc3RyaW5nKTogTnpTYWZlQW55ID0+IHtcbiAgICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJzAnOlxuICAgICAgICAgIHJldHVybiB7IGV4dHJhOiB0aGlzLnkxOG4uZmFueWkoJ25vdGlmeS51bnJlYWQnKSwgY29sb3I6ICdyZWQnIH07XG4gICAgICAgIGNhc2UgJzEnOlxuICAgICAgICAgIHJldHVybiB7IGV4dHJhOiB0aGlzLnkxOG4uZmFueWkoJ25vdGlmeS5yZWFkZWQnKSwgY29sb3I6ICdncmVlbicgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4geyBleHRyYTogdGhpcy55MThuLmZhbnlpKCdub3RpZnkubm9zdGF0dXMnKSwgY29sb3I6ICdwcmltYXJ5JyB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3QoYC9tZXNzYWdlLWNlbnRlci0zL215LW1zZy1hbmQtdG9kby9tc2ctbGlzdGAsIHtcbiAgICAgICAgcGFnZU51bTogMSxcbiAgICAgICAgcGFnZVNpemU6IDEwLFxuICAgICAgICBzdGF0dXM6ICcwJ1xuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBOelNhZmVBbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB2aWV3TWVzc2FnZSA9IHRoaXMuZGF0YS5maWx0ZXIoZCA9PiBkLmtleSA9PT0gJ21zZycpWzBdO1xuICAgICAgICAgIHZpZXdNZXNzYWdlLmxpc3QgPSByZXNwb25zZS5kYXRhLmxpc3QubWFwKChtOiBOelNhZmVBbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLm0sXG4gICAgICAgICAgICAgIGF2YXRhcjogbT8uaW1nVXJsIHx8ICcuL2Fzc2V0cy90bXAvaW1nL21lc3NhZ2UucG5nJyxcbiAgICAgICAgICAgICAgdGl0bGU6IG0uc3lzdGVtTmFtZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG0uY29udGVudCxcbiAgICAgICAgICAgICAgZXh0cmE6IGZvcm1hdE1lc3NhZ2VTdGF0dXMobS5zdGF0dXMpLmV4dHJhLFxuICAgICAgICAgICAgICBjb2xvcjogZm9ybWF0TWVzc2FnZVN0YXR1cyhtLnN0YXR1cykuY29sb3IsXG4gICAgICAgICAgICAgIGRhdGV0aW1lOiBmb3JtYXREaXN0YW5jZVRvTm93KG5ldyBEYXRlKG0uZGF0ZSksIHsgbG9jYWxlOiB0aGlzLm56STE4bi5nZXREYXRlTG9jYWxlKCkgfSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb3VudCArPSB2aWV3TWVzc2FnZS5saXN0Lmxlbmd0aDtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBsb2FkVG9kbygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBsb2coJ25vdGlmeS5jb21wb25lbnQ6ICcsICdmZXRjaCB0b2RvIGxpc3QnKTtcbiAgICBjb25zdCBmb3JtYXRUb2RvU3RhdHVzID0gKHN0YXR1czogc3RyaW5nKTogTnpTYWZlQW55ID0+IHtcbiAgICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJzAnOlxuICAgICAgICAgIHJldHVybiB7IGV4dHJhOiB0aGlzLnkxOG4uZmFueWkoJ25vdGlmeS51bnN0YXJ0JyksIGNvbG9yOiAncmVkJyB9O1xuICAgICAgICBjYXNlICcxJzpcbiAgICAgICAgICByZXR1cm4geyBleHRyYTogdGhpcy55MThuLmZhbnlpKCdub3RpZnkuc3RhcnRlZCcpLCBjb2xvcjogJ2dyZWVuJyB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7IGV4dHJhOiB0aGlzLnkxOG4uZmFueWkoJ25vdGlmeS5ub3N0YXR1cycpLCBjb2xvcjogJ3ByaW1hcnknIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAucG9zdChgL21lc3NhZ2UtY2VudGVyLTMvbXktbXNnLWFuZC10b2RvL3RvZG8tbGlzdGAsIHtcbiAgICAgICAgcGFnZU51bTogMSxcbiAgICAgICAgcGFnZVNpemU6IDEwLFxuICAgICAgICBzdGF0dXM6ICcwJ1xuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBOelNhZmVBbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB2aWV3VG9kbyA9IHRoaXMuZGF0YS5maWx0ZXIoZCA9PiBkLmtleSA9PT0gJ3RvZG8nKVswXTtcbiAgICAgICAgICB2aWV3VG9kby5saXN0ID0gcmVzcG9uc2UuZGF0YS5saXN0Lm1hcCgodDogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi50LFxuICAgICAgICAgICAgICBhdmF0YXI6IHQ/LmltZ1VybCB8fCAnLi9hc3NldHMvdG1wL2ltZy90b2RvLnBuZycsXG4gICAgICAgICAgICAgIHRpdGxlOiB0LnN5c3RlbU5hbWUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0LmNvbnRlbnQsXG4gICAgICAgICAgICAgIGRhdGV0aW1lOiBmb3JtYXREaXN0YW5jZVRvTm93KG5ldyBEYXRlKHQuZGF0ZSksIHsgbG9jYWxlOiB0aGlzLm56STE4bi5nZXREYXRlTG9jYWxlKCkgfSksXG4gICAgICAgICAgICAgIGV4dHJhOiBmb3JtYXRUb2RvU3RhdHVzKHQuc3RhdHVzKS5leHRyYSxcbiAgICAgICAgICAgICAgY29sb3I6IGZvcm1hdFRvZG9TdGF0dXModC5zdGF0dXMpLmNvbG9yXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY291bnQgKz0gdmlld1RvZG8ubGlzdC5sZW5ndGg7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgY2xlYXIodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdCA9IHRoaXMuZGF0YS5maWx0ZXIoZCA9PiBkLnRpdGxlID09PSB0eXBlKVswXTtcbiAgICBpZiAodC5rZXkgPT0gJ21zZycgfHwgdC5rZXkgPT0gJ25vdGljZScpIHtcbiAgICAgIHRoaXMuc3Vicy5wdXNoKFxuICAgICAgICB0aGlzLmh0dHBDbGllbnQucG9zdChgL21lc3NhZ2UtY2VudGVyLTMvbXktbXNnLWFuZC10b2RvL21zZy1jbGVhcmAsIHt9KS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgICAgdGhpcy5tc2cuc3VjY2VzcyhgJHt0aGlzLnkxOG4uZmFueWkoJ25vdGlmeS5jbGVhcicpfSAke3R5cGV9YCk7XG4gICAgICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHQua2V5ID09ICd0b2RvJykge1xuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdChyZXM6IE5vdGljZUljb25TZWxlY3QpOiB2b2lkIHtcbiAgICB0aGlzLmluamVjdG9yLmdldChXSU5ET1cpLm9wZW4ocmVzLml0ZW0udXJsKTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnMuZm9yRWFjaChhID0+IGEudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiJdfQ==