@yelon/bis 12.0.17 → 12.0.18

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 (73) hide show
  1. package/LICENSE +21 -21
  2. package/bis.d.ts +4 -4
  3. package/bundles/bis.umd.js +7 -7
  4. package/bundles/layout.umd.js +2551 -2549
  5. package/bundles/layout.umd.js.map +1 -1
  6. package/bundles/shared.umd.js +1222 -1222
  7. package/esm2015/bis.js +4 -4
  8. package/esm2015/layout/act.guard.js +114 -114
  9. package/esm2015/layout/bis.config.js +10 -10
  10. package/esm2015/layout/contact/contact.component.js +433 -433
  11. package/esm2015/layout/contact/contact.service.js +149 -149
  12. package/esm2015/layout/layout.js +7 -7
  13. package/esm2015/layout/layout.module.js +46 -46
  14. package/esm2015/layout/path-to-regexp.service.js +236 -236
  15. package/esm2015/layout/public_api.js +14 -14
  16. package/esm2015/layout/stomp.config.js +19 -19
  17. package/esm2015/layout/widgets/index.js +7 -7
  18. package/esm2015/layout/widgets/yz.application.component.js +132 -132
  19. package/esm2015/layout/widgets/yz.clear-storage.component.js +35 -35
  20. package/esm2015/layout/widgets/yz.fullscreen.component.js +32 -32
  21. package/esm2015/layout/widgets/yz.i18n.component.js +50 -50
  22. package/esm2015/layout/widgets/yz.notify.component.js +147 -144
  23. package/esm2015/layout/widgets/yz.them-btn.component.js +106 -106
  24. package/esm2015/layout/widgets/yz.user.component.js +57 -57
  25. package/esm2015/layout/yz.auth.service.js +157 -157
  26. package/esm2015/layout/yz.basic.component.js +40 -40
  27. package/esm2015/layout/yz.default.interceptor.js +203 -203
  28. package/esm2015/layout/yz.i18n.service.js +101 -101
  29. package/esm2015/layout/yz.startup.service.js +138 -138
  30. package/esm2015/layout/yz.stomp.service.js +90 -90
  31. package/esm2015/public_api.js +1 -1
  32. package/esm2015/shared/public_api.js +4 -4
  33. package/esm2015/shared/shared-yelon.module.js +107 -107
  34. package/esm2015/shared/shared-zorro.module.js +80 -80
  35. package/esm2015/shared/shared.js +4 -4
  36. package/esm2015/shared/shared.module.js +21 -21
  37. package/esm2015/shared/style-icons.js +795 -795
  38. package/fesm2015/bis.js +2 -2
  39. package/fesm2015/layout.js +2139 -2137
  40. package/fesm2015/layout.js.map +1 -1
  41. package/fesm2015/shared.js +908 -908
  42. package/layout/act.guard.d.ts +20 -20
  43. package/layout/bis.config.d.ts +3 -3
  44. package/layout/contact/contact.component.d.ts +166 -166
  45. package/layout/contact/contact.service.d.ts +115 -115
  46. package/layout/layout.d.ts +7 -7
  47. package/layout/layout.metadata.json +1 -1
  48. package/layout/layout.module.d.ts +2 -2
  49. package/layout/path-to-regexp.service.d.ts +23 -23
  50. package/layout/public_api.d.ts +12 -12
  51. package/layout/stomp.config.d.ts +3 -3
  52. package/layout/widgets/index.d.ts +7 -7
  53. package/layout/widgets/yz.application.component.d.ts +45 -45
  54. package/layout/widgets/yz.clear-storage.component.d.ts +8 -8
  55. package/layout/widgets/yz.fullscreen.component.d.ts +6 -6
  56. package/layout/widgets/yz.i18n.component.d.ts +19 -19
  57. package/layout/widgets/yz.notify.component.d.ts +27 -25
  58. package/layout/widgets/yz.them-btn.component.d.ts +29 -29
  59. package/layout/widgets/yz.user.component.d.ts +25 -25
  60. package/layout/yz.auth.service.d.ts +19 -19
  61. package/layout/yz.basic.component.d.ts +15 -15
  62. package/layout/yz.default.interceptor.d.ts +26 -26
  63. package/layout/yz.i18n.service.d.ts +24 -24
  64. package/layout/yz.startup.service.d.ts +31 -31
  65. package/layout/yz.stomp.service.d.ts +39 -39
  66. package/package.json +10 -10
  67. package/public_api.d.ts +2 -2
  68. package/shared/public_api.d.ts +4 -4
  69. package/shared/shared-yelon.module.d.ts +3 -3
  70. package/shared/shared-zorro.module.d.ts +2 -2
  71. package/shared/shared.d.ts +4 -4
  72. package/shared/shared.module.d.ts +2 -2
  73. package/shared/style-icons.d.ts +1 -1
@@ -1,434 +1,434 @@
1
- import { ChangeDetectorRef, Component, Input, Optional, ViewChild, Output, EventEmitter } from '@angular/core';
2
- import { ContactService } from './contact.service';
3
- export class ContactComponent {
4
- constructor(contact, changeDetectorRef) {
5
- this.contact = contact;
6
- this.changeDetectorRef = changeDetectorRef;
7
- this.subs = [];
8
- /**
9
- * tabset
10
- */
11
- this.nzTabsetSearch = null;
12
- this.nzTabsetLoading = false;
13
- /**
14
- * 树展开状态
15
- */
16
- this.nzExpandAll = true;
17
- /**
18
- * 部门树和部门查询的一些选项/可传可不传
19
- */
20
- this.nzDepts = [];
21
- this._nzDeptsCopy = [];
22
- this.nzDeptTreeVirtualHeight = null;
23
- this.nzDeptClass = true;
24
- this.nzDeptClassHistory = true;
25
- this.nzDeptGrade = false;
26
- /**
27
- * 角色树
28
- */
29
- this.nzRoles = [];
30
- this._nzRolesCopy = [];
31
- this.nzRoleTreeVirtualHeight = null;
32
- /**
33
- * 好友分组
34
- */
35
- this.nzFriendGroups = [];
36
- this._nzFriendGroupsCopy = [];
37
- /**
38
- * 联系人
39
- */
40
- this.defaultContacts = [];
41
- this.nzContacts = [];
42
- this.nzContactLoading = false;
43
- /**
44
- * 提交和提交按钮
45
- */
46
- this.button = true;
47
- this.confirmed = new EventEmitter();
48
- }
49
- /**
50
- * 初始化,首先加载部门树和默认选中的人的数据
51
- */
52
- ngOnInit() {
53
- this.onTabsetDept();
54
- this.onContactsInit();
55
- }
56
- /**
57
- * 视图初始化完毕后进行table初始化
58
- */
59
- ngAfterViewInit() {
60
- this.onTableInit();
61
- }
62
- /**
63
- * 初始化默认选中联系人
64
- */
65
- onContactsInit() {
66
- if (this.defaultContacts && this.defaultContacts.length > 0) {
67
- this.nzContactLoading = true;
68
- this.subs.push(this.contact.getUserByUserIds(this.defaultContacts).subscribe(contacts => {
69
- this.nzContacts = contacts;
70
- this.nzContactLoading = false;
71
- this.refresh();
72
- }));
73
- }
74
- }
75
- /**
76
- * table初始化
77
- */
78
- onTableInit() {
79
- // 设置表头
80
- this.st.resetColumns({
81
- columns: [
82
- { title: '选择', type: 'checkbox' },
83
- { title: '序号', type: 'no' },
84
- { title: '姓名', index: 'realName' },
85
- { title: '学号/工号', index: 'userCode' },
86
- { title: '部门', index: 'dept.deptName' }
87
- ]
88
- });
89
- // 订阅table点击checkbox事件变化
90
- this.subs.push(this.st.change.subscribe(e => {
91
- if (e.type === 'checkbox') {
92
- // 点击checkbox新增联系人
93
- const contactIds = this.nzContacts.map(c => c.userId);
94
- this.nzContacts = this.nzContacts.concat(e.checkbox.filter(c => !contactIds.includes(c.userId)));
95
- // 取消checkbox取消联系人
96
- const cancelIds = this.st.list.filter(d => !d.checked).map(d => d.userId);
97
- this.nzContacts = this.nzContacts.filter(d => !cancelIds.includes(d.userId));
98
- }
99
- }));
100
- }
101
- /**
102
- * tabset进入加载状态
103
- */
104
- onTabsetLoadStart() {
105
- this.nzTabsetLoading = true;
106
- }
107
- /**
108
- * tabset取消加载状态
109
- */
110
- onTabsetLoadEnd() {
111
- this.nzTabsetLoading = false;
112
- }
113
- /**
114
- * tabset搜索框清除
115
- */
116
- onTabsetSearchClean() {
117
- this.nzDepts = this._nzDeptsCopy;
118
- this.nzRoles = this._nzRolesCopy;
119
- this.nzFriendGroups = this._nzFriendGroupsCopy;
120
- this.nzTabsetSearch = null;
121
- }
122
- /**
123
- * tabset搜索框输入
124
- *
125
- * @param type 类型
126
- * @param value 值
127
- */
128
- onTabsetSearchChange(type, value) {
129
- this.onTabsetLoadStart();
130
- if (!value || value === '') {
131
- this.nzDepts = this._nzDeptsCopy;
132
- this.nzRoles = this._nzRolesCopy;
133
- this.nzFriendGroups = this._nzFriendGroupsCopy;
134
- }
135
- else {
136
- const trees = [];
137
- if (type === 'dept') {
138
- this.searchTree(value, this._nzDeptsCopy, trees);
139
- this.nzDepts = trees;
140
- }
141
- if (type === 'role') {
142
- this.searchTree(value, this._nzRolesCopy, trees);
143
- this.nzRoles = trees;
144
- }
145
- if (type === 'friendGroup') {
146
- this.nzFriendGroups = this._nzFriendGroupsCopy.filter(f => {
147
- return !f.name.indexOf(value);
148
- });
149
- }
150
- }
151
- this.onTabsetLoadEnd();
152
- this.refresh();
153
- }
154
- /**
155
- * tabset切换到部门
156
- */
157
- onTabsetDept() {
158
- this.onTabsetSearchClean();
159
- if (!this.nzDepts || this.nzDepts.length === 0) {
160
- this.onTabsetDeptFlush();
161
- }
162
- }
163
- /**
164
- * tabset切换到角色
165
- */
166
- onTabsetRole() {
167
- this.onTabsetSearchClean();
168
- if (!this.nzRoles || this.nzRoles.length === 0) {
169
- this.onTabsetRoleFlush(null);
170
- }
171
- }
172
- /**
173
- * tabset切换到好友分组
174
- */
175
- onTabsetFriendGroup() {
176
- this.onTabsetSearchClean();
177
- if (!this.nzFriendGroups || this.nzFriendGroups.length === 0) {
178
- this.onTabsetFriendGroupFlush();
179
- }
180
- }
181
- /**
182
- * 获取部门树
183
- */
184
- onTabsetDeptFlush() {
185
- this.onTabsetLoadStart();
186
- this.subs.push(this.contact
187
- .dept(this.nzDeptClass, this.nzDeptClassHistory, this.nzDeptGrade, this.nzDeptGradeID)
188
- .subscribe((trees) => {
189
- this.expandTree(trees);
190
- this.nzDepts = trees;
191
- this._nzDeptsCopy = trees;
192
- this.onTabsetLoadEnd();
193
- this.refresh();
194
- }));
195
- }
196
- // 获取角色树
197
- onTabsetRoleFlush(groupRoleCode) {
198
- this.onTabsetLoadStart();
199
- this.subs.push(this.contact.getGroupRole(groupRoleCode).subscribe((roles) => {
200
- this.expandTree(roles);
201
- this.nzRoles = roles;
202
- this._nzRolesCopy = roles;
203
- this.onTabsetLoadEnd();
204
- this.refresh();
205
- }));
206
- }
207
- // 获取好友分组列表
208
- onTabsetFriendGroupFlush() {
209
- this.onTabsetLoadStart();
210
- this.subs.push(this.contact.getFriendGroup().subscribe((group) => {
211
- this.nzFriendGroups = group;
212
- this._nzFriendGroupsCopy = group;
213
- this.onTabsetLoadEnd();
214
- this.refresh();
215
- }));
216
- }
217
- /**
218
- * 部门树点击
219
- *
220
- * @param e 节点
221
- */
222
- onDeptClick(e) {
223
- var _a;
224
- // 构造分页请求,直接传入stTable组件,剩下的所有交给组件自己完成
225
- this.st.data = '/auth/baseUser/queryListForPage';
226
- this.st.req = {
227
- allInBody: true,
228
- method: 'POST',
229
- type: 'page',
230
- reName: {
231
- pi: 'pageNum',
232
- ps: 'pageSize'
233
- },
234
- body: {
235
- pageParam: {
236
- deptId: (_a = e.keys) === null || _a === void 0 ? void 0 : _a.pop()
237
- }
238
- }
239
- };
240
- // table数据预处理
241
- this.st.res = {
242
- process: data => {
243
- this.onTableCheck(data);
244
- return data;
245
- }
246
- };
247
- // 加载第一页
248
- this.st.load(1);
249
- }
250
- /**
251
- * 角色树点击
252
- *
253
- * @param e 节点
254
- */
255
- onRoleClick(e) {
256
- var _a;
257
- // 构造分页请求,直接传入stTable组件,剩下的所有交给组件自己完成
258
- this.st.data = '/auth/baseUser/queryListForPage';
259
- this.st.req = {
260
- allInBody: true,
261
- method: 'POST',
262
- type: 'page',
263
- reName: {
264
- pi: 'pageNum',
265
- ps: 'pageSize'
266
- },
267
- body: {
268
- pageParam: {
269
- roleId: (_a = e.keys) === null || _a === void 0 ? void 0 : _a.pop()
270
- }
271
- }
272
- };
273
- // table数据预处理
274
- this.st.res = {
275
- process: data => {
276
- this.onTableCheck(data);
277
- return data;
278
- }
279
- };
280
- // 加载第一页
281
- this.st.load(1);
282
- }
283
- /**
284
- * 好友分组点击
285
- *
286
- * @param e 分组
287
- */
288
- onFriendGroupClick(e) {
289
- // 构造分页请求,直接传入stTable组件,剩下的所有交给组件自己完成
290
- this.st.data = '/auth/baseUser/queryListForPage';
291
- this.st.req = {
292
- allInBody: true,
293
- method: 'POST',
294
- type: 'page',
295
- reName: {
296
- pi: 'pageNum',
297
- ps: 'pageSize'
298
- },
299
- body: {
300
- pageParam: {
301
- friendGroupId: e.id
302
- }
303
- }
304
- };
305
- // table数据预处理
306
- this.st.res = {
307
- process: data => {
308
- this.onTableCheck(data);
309
- return data;
310
- }
311
- };
312
- // 加载第一页
313
- this.st.load(1);
314
- }
315
- /**
316
- * 点击右侧联系人进行删除
317
- *
318
- * @param c 点击的联系人
319
- */
320
- onContactRemove(c) {
321
- this.nzContacts = this.nzContacts.filter(contact => {
322
- return contact.userId != c.userId;
323
- });
324
- this.st.reload();
325
- }
326
- /**
327
- * 预处理table当前页数据,和nzContat对比,确定checkbox状态
328
- *
329
- * @param data 预处理数据
330
- */
331
- onTableCheck(data) {
332
- const ids = this.nzContacts.map(u => u.userId);
333
- data.forEach(d => {
334
- if (ids.includes(d.userId)) {
335
- d.checked = true;
336
- }
337
- else {
338
- d.checked = false;
339
- }
340
- });
341
- }
342
- /**
343
- * 递归树寻找name相同节点
344
- *
345
- * @param name 名称
346
- * @param trees 需要递归的树
347
- * @param list 搜索结果
348
- */
349
- searchTree(name, trees, list) {
350
- if (trees && trees.length && trees.length > 0) {
351
- trees.forEach((tree) => {
352
- if (tree.title.indexOf(name) != -1) {
353
- list.push(tree);
354
- }
355
- if (tree.children) {
356
- this.searchTree(name, tree.children, list);
357
- }
358
- });
359
- }
360
- }
361
- /**
362
- * 递归树展开所有有子节点的节点
363
- *
364
- * @param trees 需要展开的树
365
- */
366
- expandTree(trees) {
367
- if (trees && trees.length && trees.length > 0) {
368
- trees.forEach(tree => {
369
- if (!tree.children || tree.children.length === 0) {
370
- tree.expanded = false;
371
- tree.isLeaf = true;
372
- }
373
- if (tree.children) {
374
- tree.expanded = this.nzExpandAll;
375
- tree.isLeaf = false;
376
- this.expandTree(tree.children);
377
- }
378
- });
379
- }
380
- }
381
- /**
382
- * 刷新当前页面
383
- */
384
- refresh() {
385
- this.changeDetectorRef.detectChanges();
386
- }
387
- /**
388
- * 确认按钮output数据
389
- */
390
- confirm() {
391
- this.confirmed.next(this.nzContacts);
392
- }
393
- /**
394
- * 销毁函数
395
- */
396
- ngOnDestroy() {
397
- this.nzDepts = [];
398
- this.nzRoles = [];
399
- this.nzContacts = [];
400
- this.subs.forEach(s => s.unsubscribe());
401
- }
402
- }
403
- ContactComponent.decorators = [
404
- { type: Component, args: [{
405
- selector: 'contact',
406
- template: "<nz-row [nzGutter]=\"16\">\n <nz-col [nzXs]=\"24\" [nzSm]=\"24\" [nzMd]=\"24\" [nzLg]=\"8\" [nzXl]=\"6\" [nzXXl]=\"6\">\n <nz-tabset nzCentered>\n <nz-tab nzTitle=\"\u90E8\u95E8\" (nzSelect)=\"onTabsetDept()\">\n <div sg-container=\"2\">\n <sg col=\"1\" class=\"nz-tabset-sg\">\n <nz-input-group class=\"nz-tabset-input\" [nzSuffix]=\"searchInputTpl\">\n <input\n nz-input\n [(ngModel)]=\"nzTabsetSearch\"\n (ngModelChange)=\"onTabsetSearchChange('dept', $event)\"\n type=\"text\"\n placeholder=\"\u8BF7\u8F93\u5165\u90E8\u95E8\u540D\u79F0\"\n />\n </nz-input-group>\n </sg>\n <sg col=\"1\">\n <nz-spin [nzSpinning]=\"nzTabsetLoading\">\n <nz-tree\n class=\"nz-tabset-content\"\n (nzClick)=\"onDeptClick($event)\"\n [nzBlockNode]=\"true\"\n [nzShowLine]=\"true\"\n [nzHideUnMatched]=\"true\"\n [nzVirtualHeight]=\"nzDeptTreeVirtualHeight\"\n [nzData]=\"nzDepts\"\n ></nz-tree>\n </nz-spin>\n </sg>\n </div>\n </nz-tab>\n <nz-tab nzTitle=\"\u89D2\u8272\" (nzSelect)=\"onTabsetRole()\">\n <div sg-container=\"2\">\n <sg col=\"1\" class=\"nz-tabset-sg\">\n <nz-input-group class=\"nz-tabset-input\" [nzSuffix]=\"searchInputTpl\">\n <input\n nz-input\n [(ngModel)]=\"nzTabsetSearch\"\n (ngModelChange)=\"onTabsetSearchChange('role', $event)\"\n type=\"text\"\n placeholder=\"\u8BF7\u8F93\u5165\u89D2\u8272\u540D\u79F0\"\n />\n </nz-input-group>\n </sg>\n <sg col=\"1\">\n <nz-spin [nzSpinning]=\"nzTabsetLoading\">\n <nz-tree\n class=\"nz-tabset-content\"\n (nzClick)=\"onRoleClick($event)\"\n [nzBlockNode]=\"true\"\n [nzShowLine]=\"true\"\n [nzHideUnMatched]=\"true\"\n [nzVirtualHeight]=\"nzRoleTreeVirtualHeight\"\n [nzData]=\"nzRoles\"\n ></nz-tree>\n </nz-spin>\n </sg>\n </div>\n </nz-tab>\n <nz-tab nzTitle=\"\u597D\u53CB\" (nzSelect)=\"onTabsetFriendGroup()\">\n <div sg-container=\"2\">\n <sg col=\"1\" class=\"nz-tabset-sg\">\n <nz-input-group class=\"nz-tabset-input\" [nzSuffix]=\"searchInputTpl\">\n <input\n nz-input\n [(ngModel)]=\"nzTabsetSearch\"\n (ngModelChange)=\"onTabsetSearchChange('friendGroup', $event)\"\n type=\"text\"\n placeholder=\"\u8BF7\u8F93\u5165\u597D\u53CB\u540D\u79F0\"\n />\n </nz-input-group>\n </sg>\n <sg col=\"1\">\n <nz-spin [nzSpinning]=\"nzTabsetLoading\">\n <nz-list class=\"nz-tabset-content\" nzItemLayout=\"horizontal\" [nzSplit]=\"false\" nzSize=\"small\">\n <nz-list-item\n class=\"nz-tabset-content-item\"\n *ngFor=\"let group of nzFriendGroups\"\n (click)=\"onFriendGroupClick(group)\"\n >\n <nz-list-item-meta>\n <nz-list-item-meta-title>\n {{ group.name }}\n </nz-list-item-meta-title>\n </nz-list-item-meta>\n </nz-list-item>\n </nz-list>\n </nz-spin>\n </sg>\n </div>\n </nz-tab>\n </nz-tabset>\n </nz-col>\n\n <nz-col [nzXs]=\"24\" [nzSm]=\"24\" [nzMd]=\"24\" [nzLg]=\"16\" [nzXl]=\"13\" [nzXXl]=\"13\">\n <st #st responsiveHideHeaderFooter></st>\n </nz-col>\n\n <nz-col [nzXs]=\"24\" [nzSm]=\"24\" [nzMd]=\"24\" [nzLg]=\"24\" [nzXl]=\"5\" [nzXXl]=\"5\">\n <nz-spin [nzSpinning]=\"nzContactLoading\">\n <nz-list nzItemLayout=\"horizontal\" [nzSplit]=\"false\" nzSize=\"small\">\n <nz-list-item\n class=\"nz-tabset-content-item\"\n *ngFor=\"let contact of nzContacts\"\n (click)=\"onContactRemove(contact)\"\n >\n <nz-list-item-meta>\n <nz-list-item-meta-title>\n {{ contact.realName }}\n </nz-list-item-meta-title>\n </nz-list-item-meta>\n </nz-list-item>\n </nz-list>\n </nz-spin>\n </nz-col>\n</nz-row>\n\n<nz-row *ngIf=\"button\">\n <nz-col [nzSpan]=\"4\" [nzOffset]=\"20\">\n <button nz-button nzType=\"primary\" (click)=\"confirm()\">\u786E\u5B9A</button>\n </nz-col>\n</nz-row>\n\n<ng-template #searchInputTpl>\n <i nz-icon nzType=\"close\" nzTheme=\"outline\" *ngIf=\"nzTabsetSearch\" (click)=\"onTabsetSearchClean()\"></i>\n <i nz-icon nzType=\"search\" nzTheme=\"outline\" *ngIf=\"!nzTabsetSearch\"></i>\n</ng-template>\n",
407
- styles: [".nz-tabset-input{width:100%}.nz-tabset-content{padding:20px}.nz-tabset-sg{padding-right:38px!important;padding-left:38px!important}.nz-tabset-content-item:hover{background-color:#f1f1f1;cursor:pointer}\n"]
408
- },] }
409
- ];
410
- ContactComponent.ctorParameters = () => [
411
- { type: ContactService },
412
- { type: ChangeDetectorRef }
413
- ];
414
- ContactComponent.propDecorators = {
415
- nzTabsetSearch: [{ type: Optional }, { type: Input }],
416
- nzTabsetLoading: [{ type: Optional }, { type: Input }],
417
- nzExpandAll: [{ type: Optional }, { type: Input }],
418
- nzDepts: [{ type: Optional }, { type: Input }],
419
- nzDeptTreeVirtualHeight: [{ type: Optional }, { type: Input }],
420
- nzDeptClass: [{ type: Optional }, { type: Input }],
421
- nzDeptClassHistory: [{ type: Optional }, { type: Input }],
422
- nzDeptGrade: [{ type: Optional }, { type: Input }],
423
- nzDeptGradeID: [{ type: Optional }, { type: Input }],
424
- nzRoles: [{ type: Optional }, { type: Input }],
425
- nzRoleTreeVirtualHeight: [{ type: Optional }, { type: Input }],
426
- nzFriendGroups: [{ type: Optional }, { type: Input }],
427
- st: [{ type: ViewChild, args: ['st', { static: false },] }],
428
- defaultContacts: [{ type: Optional }, { type: Input }],
429
- nzContacts: [{ type: Optional }, { type: Input }],
430
- nzContactLoading: [{ type: Optional }, { type: Input }],
431
- button: [{ type: Optional }, { type: Input }],
432
- confirmed: [{ type: Output }]
433
- };
1
+ import { ChangeDetectorRef, Component, Input, Optional, ViewChild, Output, EventEmitter } from '@angular/core';
2
+ import { ContactService } from './contact.service';
3
+ export class ContactComponent {
4
+ constructor(contact, changeDetectorRef) {
5
+ this.contact = contact;
6
+ this.changeDetectorRef = changeDetectorRef;
7
+ this.subs = [];
8
+ /**
9
+ * tabset
10
+ */
11
+ this.nzTabsetSearch = null;
12
+ this.nzTabsetLoading = false;
13
+ /**
14
+ * 树展开状态
15
+ */
16
+ this.nzExpandAll = true;
17
+ /**
18
+ * 部门树和部门查询的一些选项/可传可不传
19
+ */
20
+ this.nzDepts = [];
21
+ this._nzDeptsCopy = [];
22
+ this.nzDeptTreeVirtualHeight = null;
23
+ this.nzDeptClass = true;
24
+ this.nzDeptClassHistory = true;
25
+ this.nzDeptGrade = false;
26
+ /**
27
+ * 角色树
28
+ */
29
+ this.nzRoles = [];
30
+ this._nzRolesCopy = [];
31
+ this.nzRoleTreeVirtualHeight = null;
32
+ /**
33
+ * 好友分组
34
+ */
35
+ this.nzFriendGroups = [];
36
+ this._nzFriendGroupsCopy = [];
37
+ /**
38
+ * 联系人
39
+ */
40
+ this.defaultContacts = [];
41
+ this.nzContacts = [];
42
+ this.nzContactLoading = false;
43
+ /**
44
+ * 提交和提交按钮
45
+ */
46
+ this.button = true;
47
+ this.confirmed = new EventEmitter();
48
+ }
49
+ /**
50
+ * 初始化,首先加载部门树和默认选中的人的数据
51
+ */
52
+ ngOnInit() {
53
+ this.onTabsetDept();
54
+ this.onContactsInit();
55
+ }
56
+ /**
57
+ * 视图初始化完毕后进行table初始化
58
+ */
59
+ ngAfterViewInit() {
60
+ this.onTableInit();
61
+ }
62
+ /**
63
+ * 初始化默认选中联系人
64
+ */
65
+ onContactsInit() {
66
+ if (this.defaultContacts && this.defaultContacts.length > 0) {
67
+ this.nzContactLoading = true;
68
+ this.subs.push(this.contact.getUserByUserIds(this.defaultContacts).subscribe(contacts => {
69
+ this.nzContacts = contacts;
70
+ this.nzContactLoading = false;
71
+ this.refresh();
72
+ }));
73
+ }
74
+ }
75
+ /**
76
+ * table初始化
77
+ */
78
+ onTableInit() {
79
+ // 设置表头
80
+ this.st.resetColumns({
81
+ columns: [
82
+ { title: '选择', type: 'checkbox' },
83
+ { title: '序号', type: 'no' },
84
+ { title: '姓名', index: 'realName' },
85
+ { title: '学号/工号', index: 'userCode' },
86
+ { title: '部门', index: 'dept.deptName' }
87
+ ]
88
+ });
89
+ // 订阅table点击checkbox事件变化
90
+ this.subs.push(this.st.change.subscribe(e => {
91
+ if (e.type === 'checkbox') {
92
+ // 点击checkbox新增联系人
93
+ const contactIds = this.nzContacts.map(c => c.userId);
94
+ this.nzContacts = this.nzContacts.concat(e.checkbox.filter(c => !contactIds.includes(c.userId)));
95
+ // 取消checkbox取消联系人
96
+ const cancelIds = this.st.list.filter(d => !d.checked).map(d => d.userId);
97
+ this.nzContacts = this.nzContacts.filter(d => !cancelIds.includes(d.userId));
98
+ }
99
+ }));
100
+ }
101
+ /**
102
+ * tabset进入加载状态
103
+ */
104
+ onTabsetLoadStart() {
105
+ this.nzTabsetLoading = true;
106
+ }
107
+ /**
108
+ * tabset取消加载状态
109
+ */
110
+ onTabsetLoadEnd() {
111
+ this.nzTabsetLoading = false;
112
+ }
113
+ /**
114
+ * tabset搜索框清除
115
+ */
116
+ onTabsetSearchClean() {
117
+ this.nzDepts = this._nzDeptsCopy;
118
+ this.nzRoles = this._nzRolesCopy;
119
+ this.nzFriendGroups = this._nzFriendGroupsCopy;
120
+ this.nzTabsetSearch = null;
121
+ }
122
+ /**
123
+ * tabset搜索框输入
124
+ *
125
+ * @param type 类型
126
+ * @param value 值
127
+ */
128
+ onTabsetSearchChange(type, value) {
129
+ this.onTabsetLoadStart();
130
+ if (!value || value === '') {
131
+ this.nzDepts = this._nzDeptsCopy;
132
+ this.nzRoles = this._nzRolesCopy;
133
+ this.nzFriendGroups = this._nzFriendGroupsCopy;
134
+ }
135
+ else {
136
+ const trees = [];
137
+ if (type === 'dept') {
138
+ this.searchTree(value, this._nzDeptsCopy, trees);
139
+ this.nzDepts = trees;
140
+ }
141
+ if (type === 'role') {
142
+ this.searchTree(value, this._nzRolesCopy, trees);
143
+ this.nzRoles = trees;
144
+ }
145
+ if (type === 'friendGroup') {
146
+ this.nzFriendGroups = this._nzFriendGroupsCopy.filter(f => {
147
+ return !f.name.indexOf(value);
148
+ });
149
+ }
150
+ }
151
+ this.onTabsetLoadEnd();
152
+ this.refresh();
153
+ }
154
+ /**
155
+ * tabset切换到部门
156
+ */
157
+ onTabsetDept() {
158
+ this.onTabsetSearchClean();
159
+ if (!this.nzDepts || this.nzDepts.length === 0) {
160
+ this.onTabsetDeptFlush();
161
+ }
162
+ }
163
+ /**
164
+ * tabset切换到角色
165
+ */
166
+ onTabsetRole() {
167
+ this.onTabsetSearchClean();
168
+ if (!this.nzRoles || this.nzRoles.length === 0) {
169
+ this.onTabsetRoleFlush(null);
170
+ }
171
+ }
172
+ /**
173
+ * tabset切换到好友分组
174
+ */
175
+ onTabsetFriendGroup() {
176
+ this.onTabsetSearchClean();
177
+ if (!this.nzFriendGroups || this.nzFriendGroups.length === 0) {
178
+ this.onTabsetFriendGroupFlush();
179
+ }
180
+ }
181
+ /**
182
+ * 获取部门树
183
+ */
184
+ onTabsetDeptFlush() {
185
+ this.onTabsetLoadStart();
186
+ this.subs.push(this.contact
187
+ .dept(this.nzDeptClass, this.nzDeptClassHistory, this.nzDeptGrade, this.nzDeptGradeID)
188
+ .subscribe((trees) => {
189
+ this.expandTree(trees);
190
+ this.nzDepts = trees;
191
+ this._nzDeptsCopy = trees;
192
+ this.onTabsetLoadEnd();
193
+ this.refresh();
194
+ }));
195
+ }
196
+ // 获取角色树
197
+ onTabsetRoleFlush(groupRoleCode) {
198
+ this.onTabsetLoadStart();
199
+ this.subs.push(this.contact.getGroupRole(groupRoleCode).subscribe((roles) => {
200
+ this.expandTree(roles);
201
+ this.nzRoles = roles;
202
+ this._nzRolesCopy = roles;
203
+ this.onTabsetLoadEnd();
204
+ this.refresh();
205
+ }));
206
+ }
207
+ // 获取好友分组列表
208
+ onTabsetFriendGroupFlush() {
209
+ this.onTabsetLoadStart();
210
+ this.subs.push(this.contact.getFriendGroup().subscribe((group) => {
211
+ this.nzFriendGroups = group;
212
+ this._nzFriendGroupsCopy = group;
213
+ this.onTabsetLoadEnd();
214
+ this.refresh();
215
+ }));
216
+ }
217
+ /**
218
+ * 部门树点击
219
+ *
220
+ * @param e 节点
221
+ */
222
+ onDeptClick(e) {
223
+ var _a;
224
+ // 构造分页请求,直接传入stTable组件,剩下的所有交给组件自己完成
225
+ this.st.data = '/auth/baseUser/queryListForPage';
226
+ this.st.req = {
227
+ allInBody: true,
228
+ method: 'POST',
229
+ type: 'page',
230
+ reName: {
231
+ pi: 'pageNum',
232
+ ps: 'pageSize'
233
+ },
234
+ body: {
235
+ pageParam: {
236
+ deptId: (_a = e.keys) === null || _a === void 0 ? void 0 : _a.pop()
237
+ }
238
+ }
239
+ };
240
+ // table数据预处理
241
+ this.st.res = {
242
+ process: data => {
243
+ this.onTableCheck(data);
244
+ return data;
245
+ }
246
+ };
247
+ // 加载第一页
248
+ this.st.load(1);
249
+ }
250
+ /**
251
+ * 角色树点击
252
+ *
253
+ * @param e 节点
254
+ */
255
+ onRoleClick(e) {
256
+ var _a;
257
+ // 构造分页请求,直接传入stTable组件,剩下的所有交给组件自己完成
258
+ this.st.data = '/auth/baseUser/queryListForPage';
259
+ this.st.req = {
260
+ allInBody: true,
261
+ method: 'POST',
262
+ type: 'page',
263
+ reName: {
264
+ pi: 'pageNum',
265
+ ps: 'pageSize'
266
+ },
267
+ body: {
268
+ pageParam: {
269
+ roleId: (_a = e.keys) === null || _a === void 0 ? void 0 : _a.pop()
270
+ }
271
+ }
272
+ };
273
+ // table数据预处理
274
+ this.st.res = {
275
+ process: data => {
276
+ this.onTableCheck(data);
277
+ return data;
278
+ }
279
+ };
280
+ // 加载第一页
281
+ this.st.load(1);
282
+ }
283
+ /**
284
+ * 好友分组点击
285
+ *
286
+ * @param e 分组
287
+ */
288
+ onFriendGroupClick(e) {
289
+ // 构造分页请求,直接传入stTable组件,剩下的所有交给组件自己完成
290
+ this.st.data = '/auth/baseUser/queryListForPage';
291
+ this.st.req = {
292
+ allInBody: true,
293
+ method: 'POST',
294
+ type: 'page',
295
+ reName: {
296
+ pi: 'pageNum',
297
+ ps: 'pageSize'
298
+ },
299
+ body: {
300
+ pageParam: {
301
+ friendGroupId: e.id
302
+ }
303
+ }
304
+ };
305
+ // table数据预处理
306
+ this.st.res = {
307
+ process: data => {
308
+ this.onTableCheck(data);
309
+ return data;
310
+ }
311
+ };
312
+ // 加载第一页
313
+ this.st.load(1);
314
+ }
315
+ /**
316
+ * 点击右侧联系人进行删除
317
+ *
318
+ * @param c 点击的联系人
319
+ */
320
+ onContactRemove(c) {
321
+ this.nzContacts = this.nzContacts.filter(contact => {
322
+ return contact.userId != c.userId;
323
+ });
324
+ this.st.reload();
325
+ }
326
+ /**
327
+ * 预处理table当前页数据,和nzContat对比,确定checkbox状态
328
+ *
329
+ * @param data 预处理数据
330
+ */
331
+ onTableCheck(data) {
332
+ const ids = this.nzContacts.map(u => u.userId);
333
+ data.forEach(d => {
334
+ if (ids.includes(d.userId)) {
335
+ d.checked = true;
336
+ }
337
+ else {
338
+ d.checked = false;
339
+ }
340
+ });
341
+ }
342
+ /**
343
+ * 递归树寻找name相同节点
344
+ *
345
+ * @param name 名称
346
+ * @param trees 需要递归的树
347
+ * @param list 搜索结果
348
+ */
349
+ searchTree(name, trees, list) {
350
+ if (trees && trees.length && trees.length > 0) {
351
+ trees.forEach((tree) => {
352
+ if (tree.title.indexOf(name) != -1) {
353
+ list.push(tree);
354
+ }
355
+ if (tree.children) {
356
+ this.searchTree(name, tree.children, list);
357
+ }
358
+ });
359
+ }
360
+ }
361
+ /**
362
+ * 递归树展开所有有子节点的节点
363
+ *
364
+ * @param trees 需要展开的树
365
+ */
366
+ expandTree(trees) {
367
+ if (trees && trees.length && trees.length > 0) {
368
+ trees.forEach(tree => {
369
+ if (!tree.children || tree.children.length === 0) {
370
+ tree.expanded = false;
371
+ tree.isLeaf = true;
372
+ }
373
+ if (tree.children) {
374
+ tree.expanded = this.nzExpandAll;
375
+ tree.isLeaf = false;
376
+ this.expandTree(tree.children);
377
+ }
378
+ });
379
+ }
380
+ }
381
+ /**
382
+ * 刷新当前页面
383
+ */
384
+ refresh() {
385
+ this.changeDetectorRef.detectChanges();
386
+ }
387
+ /**
388
+ * 确认按钮output数据
389
+ */
390
+ confirm() {
391
+ this.confirmed.next(this.nzContacts);
392
+ }
393
+ /**
394
+ * 销毁函数
395
+ */
396
+ ngOnDestroy() {
397
+ this.nzDepts = [];
398
+ this.nzRoles = [];
399
+ this.nzContacts = [];
400
+ this.subs.forEach(s => s.unsubscribe());
401
+ }
402
+ }
403
+ ContactComponent.decorators = [
404
+ { type: Component, args: [{
405
+ selector: 'contact',
406
+ template: "<nz-row [nzGutter]=\"16\">\n <nz-col [nzXs]=\"24\" [nzSm]=\"24\" [nzMd]=\"24\" [nzLg]=\"8\" [nzXl]=\"6\" [nzXXl]=\"6\">\n <nz-tabset nzCentered>\n <nz-tab nzTitle=\"\u90E8\u95E8\" (nzSelect)=\"onTabsetDept()\">\n <div sg-container=\"2\">\n <sg col=\"1\" class=\"nz-tabset-sg\">\n <nz-input-group class=\"nz-tabset-input\" [nzSuffix]=\"searchInputTpl\">\n <input\n nz-input\n [(ngModel)]=\"nzTabsetSearch\"\n (ngModelChange)=\"onTabsetSearchChange('dept', $event)\"\n type=\"text\"\n placeholder=\"\u8BF7\u8F93\u5165\u90E8\u95E8\u540D\u79F0\"\n />\n </nz-input-group>\n </sg>\n <sg col=\"1\">\n <nz-spin [nzSpinning]=\"nzTabsetLoading\">\n <nz-tree\n class=\"nz-tabset-content\"\n (nzClick)=\"onDeptClick($event)\"\n [nzBlockNode]=\"true\"\n [nzShowLine]=\"true\"\n [nzHideUnMatched]=\"true\"\n [nzVirtualHeight]=\"nzDeptTreeVirtualHeight\"\n [nzData]=\"nzDepts\"\n ></nz-tree>\n </nz-spin>\n </sg>\n </div>\n </nz-tab>\n <nz-tab nzTitle=\"\u89D2\u8272\" (nzSelect)=\"onTabsetRole()\">\n <div sg-container=\"2\">\n <sg col=\"1\" class=\"nz-tabset-sg\">\n <nz-input-group class=\"nz-tabset-input\" [nzSuffix]=\"searchInputTpl\">\n <input\n nz-input\n [(ngModel)]=\"nzTabsetSearch\"\n (ngModelChange)=\"onTabsetSearchChange('role', $event)\"\n type=\"text\"\n placeholder=\"\u8BF7\u8F93\u5165\u89D2\u8272\u540D\u79F0\"\n />\n </nz-input-group>\n </sg>\n <sg col=\"1\">\n <nz-spin [nzSpinning]=\"nzTabsetLoading\">\n <nz-tree\n class=\"nz-tabset-content\"\n (nzClick)=\"onRoleClick($event)\"\n [nzBlockNode]=\"true\"\n [nzShowLine]=\"true\"\n [nzHideUnMatched]=\"true\"\n [nzVirtualHeight]=\"nzRoleTreeVirtualHeight\"\n [nzData]=\"nzRoles\"\n ></nz-tree>\n </nz-spin>\n </sg>\n </div>\n </nz-tab>\n <nz-tab nzTitle=\"\u597D\u53CB\" (nzSelect)=\"onTabsetFriendGroup()\">\n <div sg-container=\"2\">\n <sg col=\"1\" class=\"nz-tabset-sg\">\n <nz-input-group class=\"nz-tabset-input\" [nzSuffix]=\"searchInputTpl\">\n <input\n nz-input\n [(ngModel)]=\"nzTabsetSearch\"\n (ngModelChange)=\"onTabsetSearchChange('friendGroup', $event)\"\n type=\"text\"\n placeholder=\"\u8BF7\u8F93\u5165\u597D\u53CB\u540D\u79F0\"\n />\n </nz-input-group>\n </sg>\n <sg col=\"1\">\n <nz-spin [nzSpinning]=\"nzTabsetLoading\">\n <nz-list class=\"nz-tabset-content\" nzItemLayout=\"horizontal\" [nzSplit]=\"false\" nzSize=\"small\">\n <nz-list-item\n class=\"nz-tabset-content-item\"\n *ngFor=\"let group of nzFriendGroups\"\n (click)=\"onFriendGroupClick(group)\"\n >\n <nz-list-item-meta>\n <nz-list-item-meta-title>\n {{ group.name }}\n </nz-list-item-meta-title>\n </nz-list-item-meta>\n </nz-list-item>\n </nz-list>\n </nz-spin>\n </sg>\n </div>\n </nz-tab>\n </nz-tabset>\n </nz-col>\n\n <nz-col [nzXs]=\"24\" [nzSm]=\"24\" [nzMd]=\"24\" [nzLg]=\"16\" [nzXl]=\"13\" [nzXXl]=\"13\">\n <st #st responsiveHideHeaderFooter></st>\n </nz-col>\n\n <nz-col [nzXs]=\"24\" [nzSm]=\"24\" [nzMd]=\"24\" [nzLg]=\"24\" [nzXl]=\"5\" [nzXXl]=\"5\">\n <nz-spin [nzSpinning]=\"nzContactLoading\">\n <nz-list nzItemLayout=\"horizontal\" [nzSplit]=\"false\" nzSize=\"small\">\n <nz-list-item\n class=\"nz-tabset-content-item\"\n *ngFor=\"let contact of nzContacts\"\n (click)=\"onContactRemove(contact)\"\n >\n <nz-list-item-meta>\n <nz-list-item-meta-title>\n {{ contact.realName }}\n </nz-list-item-meta-title>\n </nz-list-item-meta>\n </nz-list-item>\n </nz-list>\n </nz-spin>\n </nz-col>\n</nz-row>\n\n<nz-row *ngIf=\"button\">\n <nz-col [nzSpan]=\"4\" [nzOffset]=\"20\">\n <button nz-button nzType=\"primary\" (click)=\"confirm()\">\u786E\u5B9A</button>\n </nz-col>\n</nz-row>\n\n<ng-template #searchInputTpl>\n <i nz-icon nzType=\"close\" nzTheme=\"outline\" *ngIf=\"nzTabsetSearch\" (click)=\"onTabsetSearchClean()\"></i>\n <i nz-icon nzType=\"search\" nzTheme=\"outline\" *ngIf=\"!nzTabsetSearch\"></i>\n</ng-template>\n",
407
+ styles: [".nz-tabset-input{width:100%}.nz-tabset-content{padding:20px}.nz-tabset-sg{padding-right:38px!important;padding-left:38px!important}.nz-tabset-content-item:hover{background-color:#f1f1f1;cursor:pointer}\n"]
408
+ },] }
409
+ ];
410
+ ContactComponent.ctorParameters = () => [
411
+ { type: ContactService },
412
+ { type: ChangeDetectorRef }
413
+ ];
414
+ ContactComponent.propDecorators = {
415
+ nzTabsetSearch: [{ type: Optional }, { type: Input }],
416
+ nzTabsetLoading: [{ type: Optional }, { type: Input }],
417
+ nzExpandAll: [{ type: Optional }, { type: Input }],
418
+ nzDepts: [{ type: Optional }, { type: Input }],
419
+ nzDeptTreeVirtualHeight: [{ type: Optional }, { type: Input }],
420
+ nzDeptClass: [{ type: Optional }, { type: Input }],
421
+ nzDeptClassHistory: [{ type: Optional }, { type: Input }],
422
+ nzDeptGrade: [{ type: Optional }, { type: Input }],
423
+ nzDeptGradeID: [{ type: Optional }, { type: Input }],
424
+ nzRoles: [{ type: Optional }, { type: Input }],
425
+ nzRoleTreeVirtualHeight: [{ type: Optional }, { type: Input }],
426
+ nzFriendGroups: [{ type: Optional }, { type: Input }],
427
+ st: [{ type: ViewChild, args: ['st', { static: false },] }],
428
+ defaultContacts: [{ type: Optional }, { type: Input }],
429
+ nzContacts: [{ type: Optional }, { type: Input }],
430
+ nzContactLoading: [{ type: Optional }, { type: Input }],
431
+ button: [{ type: Optional }, { type: Input }],
432
+ confirmed: [{ type: Output }]
433
+ };
434
434
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9iaXMvbGF5b3V0L2NvbnRhY3QvY29udGFjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxFQUlMLFFBQVEsRUFDUixTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQVF2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFPbkQsTUFBTSxPQUFPLGdCQUFnQjtJQXdEM0IsWUFBb0IsT0FBdUIsRUFBVSxpQkFBb0M7UUFBckUsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFBVSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBdkR6RixTQUFJLEdBQW1CLEVBQUUsQ0FBQztRQUUxQjs7V0FFRztRQUNrQixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDckMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFdEQ7O1dBRUc7UUFDa0IsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFFakQ7O1dBRUc7UUFDa0IsWUFBTyxHQUF3QixFQUFFLENBQUM7UUFDL0MsaUJBQVksR0FBd0IsRUFBRSxDQUFDO1FBQzFCLDRCQUF1QixHQUFrQixJQUFJLENBQUM7UUFDOUMsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFDNUIsdUJBQWtCLEdBQVksSUFBSSxDQUFDO1FBQ25DLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBR2xEOztXQUVHO1FBQ2tCLFlBQU8sR0FBd0IsRUFBRSxDQUFDO1FBQy9DLGlCQUFZLEdBQXdCLEVBQUUsQ0FBQztRQUMxQiw0QkFBdUIsR0FBa0IsSUFBSSxDQUFDO1FBRW5FOztXQUVHO1FBQ2tCLG1CQUFjLEdBQWdCLEVBQUUsQ0FBQztRQUN0RCx3QkFBbUIsR0FBZ0IsRUFBRSxDQUFDO1FB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aGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9wdGlvbmFsLFxuICBWaWV3Q2hpbGQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBOelRyZWVOb2RlT3B0aW9ucywgTnpGb3JtYXRFbWl0RXZlbnQgfSBmcm9tICduZy16b3Jyby1hbnRkL3RyZWUnO1xuXG5pbXBvcnQgeyBTVENvbXBvbmVudCB9IGZyb20gJ0B5ZWxvbi9hYmMvc3QnO1xuXG5pbXBvcnQgeyBDb250YWN0U2VydmljZSB9IGZyb20gJy4vY29udGFjdC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29udGFjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250YWN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29udGFjdC5jb21wb25lbnQubGVzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbnRhY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHN1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgLyoqXG4gICAqIHRhYnNldFxuICAgKi9cbiAgQE9wdGlvbmFsKCkgQElucHV0KCkgbnpUYWJzZXRTZWFyY2g6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBuelRhYnNldExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICog5qCR5bGV5byA54q25oCBXG4gICAqL1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBuekV4cGFuZEFsbDogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIOmDqOmXqOagkeWSjOmDqOmXqOafpeivoueahOS4gOS6m+mAiemhuS/lj6/kvKDlj6/kuI3kvKBcbiAgICovXG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56RGVwdHM6IE56VHJlZU5vZGVPcHRpb25zW10gPSBbXTtcbiAgcHJpdmF0ZSBfbnpEZXB0c0NvcHk6IE56VHJlZU5vZGVPcHRpb25zW10gPSBbXTtcbiAgQE9wdGlvbmFsKCkgQElucHV0KCkgbnpEZXB0VHJlZVZpcnR1YWxIZWlnaHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBuekRlcHRDbGFzczogYm9vbGVhbiA9IHRydWU7XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56RGVwdENsYXNzSGlzdG9yeTogYm9vbGVhbiA9IHRydWU7XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56RGVwdEdyYWRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56RGVwdEdyYWRlSUQ6IHN0cmluZztcblxuICAvKipcbiAgICog6KeS6Imy5qCRXG4gICAqL1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBuelJvbGVzOiBOelRyZWVOb2RlT3B0aW9uc1tdID0gW107XG4gIHByaXZhdGUgX256Um9sZXNDb3B5OiBOelRyZWVOb2RlT3B0aW9uc1tdID0gW107XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56Um9sZVRyZWVWaXJ0dWFsSGVpZ2h0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICog5aW95Y+L5YiG57uEXG4gICAqL1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBuekZyaWVuZEdyb3VwczogTnpTYWZlQW55W10gPSBbXTtcbiAgX256RnJpZW5kR3JvdXBzQ29weTogTnpTYWZlQW55W10gPSBbXTtcblxuICAvKipcbiAgICogdGFibGXnu4Tku7bvvIzluK7liqnmlofmoaM6IGh0dHBzOi8vbmcueXVuemFpbmZvLmNvbS9jb21wb25lbnRzL3N0L3poPyNBUElcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ3N0JywgeyBzdGF0aWM6IGZhbHNlIH0pIHN0OiBTVENvbXBvbmVudDtcblxuICAvKipcbiAgICog6IGU57O75Lq6XG4gICAqL1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBkZWZhdWx0Q29udGFjdHM6IHN0cmluZ1tdID0gW107XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56Q29udGFjdHM6IE56U2FmZUFueVtdID0gW107XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56Q29udGFjdExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICog5o+Q5Lqk5ZKM5o+Q5Lqk5oyJ6ZKuXG4gICAqL1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBidXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgY29uZmlybWVkOiBFdmVudEVtaXR0ZXI8TnpTYWZlQW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29udGFjdDogQ29udGFjdFNlcnZpY2UsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIC8qKlxuICAgKiDliJ3lp4vljJbvvIzpppblhYjliqDovb3pg6jpl6jmoJHlkozpu5jorqTpgInkuK3nmoTkurrnmoTmlbDmja5cbiAgICovXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub25UYWJzZXREZXB0KCk7XG4gICAgdGhpcy5vbkNvbnRhY3RzSW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOinhuWbvuWIneWni+WMluWujOavleWQjui/m+ihjHRhYmxl5Yid5aeL5YyWXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vblRhYmxlSW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIneWni+WMlum7mOiupOmAieS4reiBlOezu+S6ulxuICAgKi9cbiAgb25Db250YWN0c0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVmYXVsdENvbnRhY3RzICYmIHRoaXMuZGVmYXVsdENvbnRhY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubnpDb250YWN0TG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnN1YnMucHVzaChcbiAgICAgICAgdGhpcy5jb250YWN0LmdldFVzZXJCeVVzZXJJZHModGhpcy5kZWZhdWx0Q29udGFjdHMpLnN1YnNjcmliZShjb250YWN0cyA9PiB7XG4gICAgICAgICAgdGhpcy5uekNvbnRhY3RzID0gY29udGFjdHM7XG4gICAgICAgICAgdGhpcy5uekNvbnRhY3RMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0YWJsZeWIneWni+WMllxuICAgKi9cbiAgb25UYWJsZUluaXQoKTogdm9pZCB7XG4gICAgLy8g6K6+572u6KGo5aS0XG4gICAgdGhpcy5zdC5yZXNldENvbHVtbnMoe1xuICAgICAgY29sdW1uczogW1xuICAgICAgICB7IHRpdGxlOiAn6YCJ5oupJywgdHlwZTogJ2NoZWNrYm94JyB9LFxuICAgICAgICB7IHRpdGxlOiAn5bqP5Y+3JywgdHlwZTogJ25vJyB9LFxuICAgICAgICB7IHRpdGxlOiAn5aeT5ZCNJywgaW5kZXg6ICdyZWFsTmFtZScgfSxcbiAgICAgICAgeyB0aXRsZTogJ+WtpuWPty/lt6Xlj7cnLCBpbmRleDogJ3VzZXJDb2RlJyB9LFxuICAgICAgICB7IHRpdGxlOiAn6YOo6ZeoJywgaW5kZXg6ICdkZXB0LmRlcHROYW1lJyB9XG4gICAgICBdXG4gICAgfSk7XG4gICAgLy8g6K6i6ZiFdGFibGXngrnlh7tjaGVja2JveOS6i+S7tuWPmOWMllxuICAgIHRoaXMuc3Vicy5wdXNoKFxuICAgICAgdGhpcy5zdC5jaGFuZ2Uuc3Vic2NyaWJlKGUgPT4ge1xuICAgICAgICBpZiAoZS50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgLy8g54K55Ye7Y2hlY2tib3jmlrDlop7ogZTns7vkurpcbiAgICAgICAgICBjb25zdCBjb250YWN0SWRzID0gdGhpcy5uekNvbnRhY3RzLm1hcChjID0+IGMudXNlcklkKTtcbiAgICAgICAgICB0aGlzLm56Q29udGFjdHMgPSB0aGlzLm56Q29udGFjdHMuY29uY2F0KGUuY2hlY2tib3ghLmZpbHRlcihjID0+ICFjb250YWN0SWRzLmluY2x1ZGVzKGMudXNlcklkKSkpO1xuICAgICAgICAgIC8vIOWPlua2iGNoZWNrYm945Y+W5raI6IGU57O75Lq6XG4gICAgICAgICAgY29uc3QgY2FuY2VsSWRzID0gdGhpcy5zdC5saXN0LmZpbHRlcihkID0+ICFkLmNoZWNrZWQpLm1hcChkID0+IGQudXNlcklkKTtcbiAgICAgICAgICB0aGlzLm56Q29udGFjdHMgPSB0aGlzLm56Q29udGFjdHMuZmlsdGVyKGQgPT4gIWNhbmNlbElkcy5pbmNsdWRlcyhkLnVzZXJJZCkpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogdGFic2V06L+b5YWl5Yqg6L2954q25oCBXG4gICAqL1xuICBvblRhYnNldExvYWRTdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLm56VGFic2V0TG9hZGluZyA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogdGFic2V05Y+W5raI5Yqg6L2954q25oCBXG4gICAqL1xuICBvblRhYnNldExvYWRFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5uelRhYnNldExvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0YWJzZXTmkJzntKLmoYbmuIXpmaRcbiAgICovXG4gIG9uVGFic2V0U2VhcmNoQ2xlYW4oKTogdm9pZCB7XG4gICAgdGhpcy5uekRlcHRzID0gdGhpcy5fbnpEZXB0c0NvcHk7XG4gICAgdGhpcy5uelJvbGVzID0gdGhpcy5fbnpSb2xlc0NvcHk7XG4gICAgdGhpcy5uekZyaWVuZEdyb3VwcyA9IHRoaXMuX256RnJpZW5kR3JvdXBzQ29weTtcbiAgICB0aGlzLm56VGFic2V0U2VhcmNoID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0YWJzZXTmkJzntKLmoYbovpPlhaVcbiAgICpcbiAgICogQHBhcmFtIHR5cGUg57G75Z6LXG4gICAqIEBwYXJhbSB2YWx1ZSDlgLxcbiAgICovXG4gIG9uVGFic2V0U2VhcmNoQ2hhbmdlKHR5cGU6ICdkZXB0JyB8ICdyb2xlJyB8ICdmcmllbmRHcm91cCcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9uVGFic2V0TG9hZFN0YXJ0KCk7XG4gICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMubnpEZXB0cyA9IHRoaXMuX256RGVwdHNDb3B5O1xuICAgICAgdGhpcy5uelJvbGVzID0gdGhpcy5fbnpSb2xlc0NvcHk7XG4gICAgICB0aGlzLm56RnJpZW5kR3JvdXBzID0gdGhpcy5fbnpGcmllbmRHcm91cHNDb3B5O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0cmVlczogTnpUcmVlTm9kZU9wdGlvbnNbXSA9IFtdO1xuICAgICAgaWYgKHR5cGUgPT09ICdkZXB0Jykge1xuICAgICAgICB0aGlzLnNlYXJjaFRyZWUodmFsdWUsIHRoaXMuX256RGVwdHNDb3B5LCB0cmVlcyk7XG4gICAgICAgIHRoaXMubnpEZXB0cyA9IHRyZWVzO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09ICdyb2xlJykge1xuICAgICAgICB0aGlzLnNlYXJjaFRyZWUodmFsdWUsIHRoaXMuX256Um9sZXNDb3B5LCB0cmVlcyk7XG4gICAgICAgIHRoaXMubnpSb2xlcyA9IHRyZWVzO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09ICdmcmllbmRHcm91cCcpIHtcbiAgICAgICAgdGhpcy5uekZyaWVuZEdyb3VwcyA9IHRoaXMuX256RnJpZW5kR3JvdXBzQ29weS5maWx0ZXIoZiA9PiB7XG4gICAgICAgICAgcmV0dXJuICFmLm5hbWUuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uVGFic2V0TG9hZEVuZCgpO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRhYnNldOWIh+aNouWIsOmDqOmXqFxuICAgKi9cbiAgb25UYWJzZXREZXB0KCk6IHZvaWQge1xuICAgIHRoaXMub25UYWJzZXRTZWFyY2hDbGVhbigpO1xuICAgIGlmICghdGhpcy5uekRlcHRzIHx8IHRoaXMubnpEZXB0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub25UYWJzZXREZXB0Rmx1c2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdGFic2V05YiH5o2i5Yiw6KeS6ImyXG4gICAqL1xuICBvblRhYnNldFJvbGUoKTogdm9pZCB7XG4gICAgdGhpcy5vblRhYnNldFNlYXJjaENsZWFuKCk7XG4gICAgaWYgKCF0aGlzLm56Um9sZXMgfHwgdGhpcy5uelJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5vblRhYnNldFJvbGVGbHVzaChudWxsIGFzIE56U2FmZUFueSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRhYnNldOWIh+aNouWIsOWlveWPi+WIhue7hFxuICAgKi9cbiAgb25UYWJzZXRGcmllbmRHcm91cCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uVGFic2V0U2VhcmNoQ2xlYW4oKTtcbiAgICBpZiAoIXRoaXMubnpGcmllbmRHcm91cHMgfHwgdGhpcy5uekZyaWVuZEdyb3Vwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub25UYWJzZXRGcmllbmRHcm91cEZsdXNoKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumDqOmXqOagkVxuICAgKi9cbiAgb25UYWJzZXREZXB0Rmx1c2goKTogdm9pZCB7XG4gICAgdGhpcy5vblRhYnNldExvYWRTdGFydCgpO1xuICAgIHRoaXMuc3Vicy5wdXNoKFxuICAgICAgdGhpcy5jb250YWN0XG4gICAgICAgIC5kZXB0KHRoaXMubnpEZXB0Q2xhc3MsIHRoaXMubnpEZXB0Q2xhc3NIaXN0b3J5LCB0aGlzLm56RGVwdEdyYWRlLCB0aGlzLm56RGVwdEdyYWRlSUQpXG4gICAgICAgIC5zdWJzY3JpYmUoKHRyZWVzOiBOelRyZWVOb2RlT3B0aW9uc1tdKSA9PiB7XG4gICAgICAgICAgdGhpcy5leHBhbmRUcmVlKHRyZWVzKTtcbiAgICAgICAgICB0aGlzLm56RGVwdHMgPSB0cmVlcztcbiAgICAgICAgICB0aGlzLl9uekRlcHRzQ29weSA9IHRyZWVzO1xuICAgICAgICAgIHRoaXMub25UYWJzZXRMb2FkRW5kKCk7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8vIOiOt+WPluinkuiJsuagkVxuICBvblRhYnNldFJvbGVGbHVzaChncm91cFJvbGVDb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9uVGFic2V0TG9hZFN0YXJ0KCk7XG4gICAgdGhpcy5zdWJzLnB1c2goXG4gICAgICB0aGlzLmNvbnRhY3QuZ2V0R3JvdXBSb2xlKGdyb3VwUm9sZUNvZGUpLnN1YnNjcmliZSgocm9sZXM6IE56VHJlZU5vZGVPcHRpb25zW10pID0+IHtcbiAgICAgICAgdGhpcy5leHBhbmRUcmVlKHJvbGVzKTtcbiAgICAgICAgdGhpcy5uelJvbGVzID0gcm9sZXM7XG4gICAgICAgIHRoaXMuX256Um9sZXNDb3B5ID0gcm9sZXM7XG4gICAgICAgIHRoaXMub25UYWJzZXRMb2FkRW5kKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLy8g6I635Y+W5aW95Y+L5YiG57uE5YiX6KGoXG4gIG9uVGFic2V0RnJpZW5kR3JvdXBGbHVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uVGFic2V0TG9hZFN0YXJ0KCk7XG4gICAgdGhpcy5zdWJzLnB1c2goXG4gICAgICB0aGlzLmNvbnRhY3QuZ2V0RnJpZW5kR3JvdXAoKS5zdWJzY3JpYmUoKGdyb3VwOiBOelNhZmVBbnlbXSkgPT4ge1xuICAgICAgICB0aGlzLm56RnJpZW5kR3JvdXBzID0gZ3JvdXA7XG4gICAgICAgIHRoaXMuX256RnJpZW5kR3JvdXBzQ29weSA9IGdyb3VwO1xuICAgICAgICB0aGlzLm9uVGFic2V0TG9hZEVuZCgpO1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpg6jpl6jmoJHngrnlh7tcbiAgICpcbiAgICogQHBhcmFtIGUg6IqC54K5XG4gICAqL1xuICBvbkRlcHRDbGljayhlOiBOekZvcm1hdEVtaXRFdmVudCk6IHZvaWQge1xuICAgIC8vIOaehOmAoOWIhumhteivt+axgu+8jOebtOaOpeS8oOWFpXN0VGFibGXnu4Tku7bvvIzliankuIvnmoTmiYDmnInkuqTnu5nnu4Tku7boh6rlt7HlrozmiJBcbiAgICB0aGlzLnN0LmRhdGEgPSAnL2F1dGgvYmFzZVVzZXIvcXVlcnlMaXN0Rm9yUGFnZSc7XG4gICAgdGhpcy5zdC5yZXEgPSB7XG4gICAgICBhbGxJbkJvZHk6IHRydWUsXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHR5cGU6ICdwYWdlJyxcbiAgICAgIHJlTmFtZToge1xuICAgICAgICBwaTogJ3BhZ2VOdW0nLFxuICAgICAgICBwczogJ3BhZ2VTaXplJ1xuICAgICAgfSxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgcGFnZVBhcmFtOiB7XG4gICAgICAgICAgZGVwdElkOiBlLmtleXM/LnBvcCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIHRhYmxl5pWw5o2u6aKE5aSE55CGXG4gICAgdGhpcy5zdC5yZXMgPSB7XG4gICAgICBwcm9jZXNzOiBkYXRhID0+IHtcbiAgICAgICAgdGhpcy5vblRhYmxlQ2hlY2soZGF0YSk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8g5Yqg6L2956ys5LiA6aG1XG4gICAgdGhpcy5zdC5sb2FkKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIOinkuiJsuagkeeCueWHu1xuICAgKlxuICAgKiBAcGFyYW0gZSDoioLngrlcbiAgICovXG4gIG9uUm9sZUNsaWNrKGU6IE56Rm9ybWF0RW1pdEV2ZW50KTogdm9pZCB7XG4gICAgLy8g5p6E6YCg5YiG6aG16K+35rGC77yM55u05o6l5Lyg5YWlc3RUYWJsZee7hOS7tu+8jOWJqeS4i+eahOaJgOacieS6pOe7mee7hOS7tuiHquW3seWujOaIkFxuICAgIHRoaXMuc3QuZGF0YSA9ICcvYXV0aC9iYXNlVXNlci9xdWVyeUxpc3RGb3JQYWdlJztcbiAgICB0aGlzLnN0LnJlcSA9IHtcbiAgICAgIGFsbEluQm9keTogdHJ1ZSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdHlwZTogJ3BhZ2UnLFxuICAgICAgcmVOYW1lOiB7XG4gICAgICAgIHBpOiAncGFnZU51bScsXG4gICAgICAgIHBzOiAncGFnZVNpemUnXG4gICAgICB9LFxuICAgICAgYm9keToge1xuICAgICAgICBwYWdlUGFyYW06IHtcbiAgICAgICAgICByb2xlSWQ6IGUua2V5cz8ucG9wKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgLy8gdGFibGXmlbDmja7pooTlpITnkIZcbiAgICB0aGlzLnN0LnJlcyA9IHtcbiAgICAgIHByb2Nlc3M6IGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm9uVGFibGVDaGVjayhkYXRhKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyDliqDovb3nrKzkuIDpobVcbiAgICB0aGlzLnN0LmxvYWQoMSk7XG4gIH1cblxuICAvKipcbiAgICog5aW95Y+L5YiG57uE54K55Ye7XG4gICAqXG4gICAqIEBwYXJhbSBlIOWIhue7hFxuICAgKi9cbiAgb25GcmllbmRHcm91cENsaWNrKGU6IE56U2FmZUFueSk6IHZvaWQge1xuICAgIC8vIOaehOmAoOWIhumhteivt+axgu+8jOebtOaOpeS8oOWFpXN0VGFibGXnu4Tku7bvvIzliankuIvnmoTmiYDmnInkuqTnu5nnu4Tku7boh6rlt7HlrozmiJBcbiAgICB0aGlzLnN0LmRhdGEgPSAnL2F1dGgvYmFzZVVzZXIvcXVlcnlMaXN0Rm9yUGFnZSc7XG4gICAgdGhpcy5zdC5yZXEgPSB7XG4gICAgICBhbGxJbkJvZHk6IHRydWUsXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHR5cGU6ICdwYWdlJyxcbiAgICAgIHJlTmFtZToge1xuICAgICAgICBwaTogJ3BhZ2VOdW0nLFxuICAgICAgICBwczogJ3BhZ2VTaXplJ1xuICAgICAgfSxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgcGFnZVBhcmFtOiB7XG4gICAgICAgICAgZnJpZW5kR3JvdXBJZDogZS5pZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyB0YWJsZeaVsOaNrumihOWkhOeQhlxuICAgIHRoaXMuc3QucmVzID0ge1xuICAgICAgcHJvY2VzczogZGF0YSA9PiB7XG4gICAgICAgIHRoaXMub25UYWJsZUNoZWNrKGRhdGEpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIOWKoOi9veesrOS4gOmhtVxuICAgIHRoaXMuc3QubG9hZCgxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDngrnlh7vlj7PkvqfogZTns7vkurrov5vooYzliKDpmaRcbiAgICpcbiAgICogQHBhcmFtIGMg54K55Ye755qE6IGU57O75Lq6XG4gICAqL1xuICBvbkNvbnRhY3RSZW1vdmUoYzogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgdGhpcy5uekNvbnRhY3RzID0gdGhpcy5uekNvbnRhY3RzLmZpbHRlcihjb250YWN0ID0+IHtcbiAgICAgIHJldHVybiBjb250YWN0LnVzZXJJZCAhPSBjLnVzZXJJZDtcbiAgICB9KTtcbiAgICB0aGlzLnN0LnJlbG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOmihOWkhOeQhnRhYmxl5b2T5YmN6aG15pWw5o2u77yM5ZKMbnpDb250YXTlr7nmr5TvvIznoa7lrppjaGVja2JveOeKtuaAgVxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSDpooTlpITnkIbmlbDmja5cbiAgICovXG4gIG9uVGFibGVDaGVjayhkYXRhOiBOelNhZmVBbnlbXSk6IHZvaWQge1xuICAgIGNvbnN0IGlkcyA9IHRoaXMubnpDb250YWN0cy5tYXAodSA9PiB1LnVzZXJJZCk7XG4gICAgZGF0YS5mb3JFYWNoKGQgPT4ge1xuICAgICAgaWYgKGlkcy5pbmNsdWRlcyhkLnVzZXJJZCkpIHtcbiAgICAgICAgZC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAkuW9kuagkeWvu+aJvm5hbWXnm7jlkIzoioLngrlcbiAgICpcbiAgICogQHBhcmFtIG5hbWUg5ZCN56ewXG4gICAqIEBwYXJhbSB0cmVlcyDpnIDopoHpgJLlvZLnmoTmoJFcbiAgICogQHBhcmFtIGxpc3Qg5pCc57Si57uT5p6cXG4gICAqL1xuICBzZWFyY2hUcmVlKG5hbWU6IHN0cmluZywgdHJlZXM6IE56VHJlZU5vZGVPcHRpb25zW10sIGxpc3Q6IE56VHJlZU5vZGVPcHRpb25zW10pOiB2b2lkIHtcbiAgICBpZiAodHJlZXMgJiYgdHJlZXMubGVuZ3RoICYmIHRyZWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyZWVzLmZvckVhY2goKHRyZWU6IE56VHJlZU5vZGVPcHRpb25zKSA9PiB7XG4gICAgICAgIGlmICh0cmVlLnRpdGxlLmluZGV4T2YobmFtZSkgIT0gLTEpIHtcbiAgICAgICAgICBsaXN0LnB1c2godHJlZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyZWUuY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRyZWUobmFtZSwgdHJlZS5jaGlsZHJlbiwgbGlzdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJLlvZLmoJHlsZXlvIDmiYDmnInmnInlrZDoioLngrnnmoToioLngrlcbiAgICpcbiAgICogQHBhcmFtIHRyZWVzIOmcgOimgeWxleW8gOeahOagkVxuICAgKi9cbiAgZXhwYW5kVHJlZSh0cmVlczogTnpUcmVlTm9kZU9wdGlvbnNbXSk6IHZvaWQge1xuICAgIGlmICh0cmVlcyAmJiB0cmVlcy5sZW5ndGggJiYgdHJlZXMubGVuZ3RoID4gMCkge1xuICAgICAgdHJlZXMuZm9yRWFjaCh0cmVlID0+IHtcbiAgICAgICAgaWYgKCF0cmVlLmNoaWxkcmVuIHx8IHRyZWUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdHJlZS5leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICAgIHRyZWUuaXNMZWFmID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJlZS5jaGlsZHJlbikge1xuICAgICAgICAgIHRyZWUuZXhwYW5kZWQgPSB0aGlzLm56RXhwYW5kQWxsO1xuICAgICAgICAgIHRyZWUuaXNMZWFmID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5leHBhbmRUcmVlKHRyZWUuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Yi35paw5b2T5YmN6aG16Z2iXG4gICAqL1xuICByZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIOehruiupOaMiemSrm91dHB1dOaVsOaNrlxuICAgKi9cbiAgY29uZmlybSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpcm1lZC5uZXh0KHRoaXMubnpDb250YWN0cyk7XG4gIH1cblxuICAvKipcbiAgICog6ZSA5q+B5Ye95pWwXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm56RGVwdHMgPSBbXTtcbiAgICB0aGlzLm56Um9sZXMgPSBbXTtcbiAgICB0aGlzLm56Q29udGFjdHMgPSBbXTtcbiAgICB0aGlzLnN1YnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiJdfQ==