@yelon/bis 14.1.1 → 15.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +23 -1
  3. package/esm2020/bis.mjs +2 -2
  4. package/esm2020/index.mjs +2 -0
  5. package/esm2020/public_api.mjs +2 -2
  6. package/esm2020/src/bis.config.mjs +11 -0
  7. package/esm2020/src/icon/style-icons.mjs +796 -0
  8. package/esm2020/src/index.mjs +12 -0
  9. package/esm2020/src/layout-basic/index.mjs +4 -0
  10. package/esm2020/src/layout-basic/interface.mjs +7 -0
  11. package/esm2020/src/layout-basic/layout-basic.component.mjs +312 -0
  12. package/esm2020/src/layout-basic/layout-display.service.mjs +87 -0
  13. package/esm2020/src/layout-nav/index.mjs +5 -0
  14. package/esm2020/src/layout-nav/layout-nav-application.component.mjs +262 -0
  15. package/esm2020/{layout/widgets/yz.application.group.component.mjs → src/layout-nav/layout-nav-group.component.mjs} +23 -21
  16. package/esm2020/src/layout-nav/layout-nav-tile.component.mjs +15 -0
  17. package/esm2020/src/layout-nav/types.mjs +7 -0
  18. package/esm2020/src/widgets/index.mjs +7 -0
  19. package/esm2020/src/widgets/yunzai-clear-storage.component.mjs +45 -0
  20. package/esm2020/src/widgets/yunzai-fullscreen.component.mjs +45 -0
  21. package/esm2020/src/widgets/yunzai-i18n.component.mjs +115 -0
  22. package/esm2020/src/widgets/yunzai-notify.component.mjs +183 -0
  23. package/esm2020/src/widgets/yunzai-theme-btn.component.mjs +195 -0
  24. package/esm2020/{layout/widgets/yz.user.component.mjs → src/widgets/yunzai-user.component.mjs} +6 -6
  25. package/esm2020/src/yunzai-act.guard.mjs +107 -0
  26. package/esm2020/src/yunzai-auth.service.mjs +153 -0
  27. package/esm2020/src/yunzai-default.interceptor.mjs +207 -0
  28. package/esm2020/src/yunzai-i18n.service.mjs +94 -0
  29. package/esm2020/src/yunzai-layout.module.mjs +76 -0
  30. package/esm2020/src/yunzai-startup.service.mjs +157 -0
  31. package/fesm2015/bis.mjs +2960 -1
  32. package/fesm2015/bis.mjs.map +1 -1
  33. package/fesm2020/bis.mjs +2968 -1
  34. package/fesm2020/bis.mjs.map +1 -1
  35. package/index.d.ts +0 -4
  36. package/index.less +1 -1
  37. package/package.json +12 -27
  38. package/public_api.d.ts +1 -2
  39. package/{layout → src}/bis.config.d.ts +0 -0
  40. package/{shared → src/icon}/style-icons.d.ts +0 -0
  41. package/src/index.d.ts +11 -0
  42. package/src/layout-basic/index.d.ts +3 -0
  43. package/src/layout-basic/interface.d.ts +24 -0
  44. package/src/layout-basic/layout-basic.component.d.ts +33 -0
  45. package/src/layout-basic/layout-display.service.d.ts +15 -0
  46. package/src/layout-nav/index.d.ts +4 -0
  47. package/src/layout-nav/layout-nav-application.component.d.ts +26 -0
  48. package/src/layout-nav/layout-nav-group.component.d.ts +17 -0
  49. package/src/layout-nav/layout-nav-tile.component.d.ts +6 -0
  50. package/src/layout-nav/types.d.ts +20 -0
  51. package/src/widgets/index.d.ts +6 -0
  52. package/{layout/widgets/yz.clear-storage.component.d.ts → src/widgets/yunzai-clear-storage.component.d.ts} +3 -3
  53. package/src/widgets/yunzai-fullscreen.component.d.ts +8 -0
  54. package/{layout/widgets/yz.i18n.component.d.ts → src/widgets/yunzai-i18n.component.d.ts} +5 -5
  55. package/{layout/widgets/yz.notify.component.d.ts → src/widgets/yunzai-notify.component.d.ts} +5 -5
  56. package/{layout/widgets/yz.them-btn.component.d.ts → src/widgets/yunzai-theme-btn.component.d.ts} +5 -5
  57. package/{layout/widgets/yz.user.component.d.ts → src/widgets/yunzai-user.component.d.ts} +3 -3
  58. package/{layout/act.guard.d.ts → src/yunzai-act.guard.d.ts} +1 -2
  59. package/{layout/yz.auth.service.d.ts → src/yunzai-auth.service.d.ts} +6 -7
  60. package/{layout/yz.default.interceptor.d.ts → src/yunzai-default.interceptor.d.ts} +4 -6
  61. package/{layout/yz.i18n.service.d.ts → src/yunzai-i18n.service.d.ts} +4 -3
  62. package/src/yunzai-layout.module.d.ts +21 -0
  63. package/src/yunzai-startup.service.d.ts +37 -0
  64. package/esm2020/layout/act.guard.mjs +0 -108
  65. package/esm2020/layout/bis.config.mjs +0 -11
  66. package/esm2020/layout/contact/contact.component.mjs +0 -492
  67. package/esm2020/layout/contact/contact.service.mjs +0 -146
  68. package/esm2020/layout/layout.mjs +0 -5
  69. package/esm2020/layout/layout.module.mjs +0 -76
  70. package/esm2020/layout/path-to-regexp.service.mjs +0 -238
  71. package/esm2020/layout/public_api.mjs +0 -15
  72. package/esm2020/layout/stomp.config.mjs +0 -18
  73. package/esm2020/layout/widgets/index.mjs +0 -9
  74. package/esm2020/layout/widgets/yz.application.component.mjs +0 -271
  75. package/esm2020/layout/widgets/yz.clear-storage.component.mjs +0 -45
  76. package/esm2020/layout/widgets/yz.fullscreen.component.mjs +0 -45
  77. package/esm2020/layout/widgets/yz.i18n.component.mjs +0 -115
  78. package/esm2020/layout/widgets/yz.notify.component.mjs +0 -183
  79. package/esm2020/layout/widgets/yz.them-btn.component.mjs +0 -195
  80. package/esm2020/layout/yz.auth.service.mjs +0 -155
  81. package/esm2020/layout/yz.basic.component.mjs +0 -269
  82. package/esm2020/layout/yz.default.interceptor.mjs +0 -207
  83. package/esm2020/layout/yz.i18n.service.mjs +0 -93
  84. package/esm2020/layout/yz.startup.service.mjs +0 -139
  85. package/esm2020/layout/yz.stomp.service.mjs +0 -88
  86. package/esm2020/shared/public_api.mjs +0 -5
  87. package/esm2020/shared/shared-yelon.module.mjs +0 -106
  88. package/esm2020/shared/shared-zorro.module.mjs +0 -81
  89. package/esm2020/shared/shared.mjs +0 -5
  90. package/esm2020/shared/shared.module.mjs +0 -115
  91. package/esm2020/shared/style-icons.mjs +0 -796
  92. package/fesm2015/layout.mjs +0 -2968
  93. package/fesm2015/layout.mjs.map +0 -1
  94. package/fesm2015/shared.mjs +0 -1103
  95. package/fesm2015/shared.mjs.map +0 -1
  96. package/fesm2020/layout.mjs +0 -2977
  97. package/fesm2020/layout.mjs.map +0 -1
  98. package/fesm2020/shared.mjs +0 -1103
  99. package/fesm2020/shared.mjs.map +0 -1
  100. package/layout/contact/contact.component.d.ts +0 -169
  101. package/layout/contact/contact.service.d.ts +0 -118
  102. package/layout/index.d.ts +0 -5
  103. package/layout/layout.module.d.ts +0 -21
  104. package/layout/path-to-regexp.service.d.ts +0 -26
  105. package/layout/public_api.d.ts +0 -14
  106. package/layout/stomp.config.d.ts +0 -3
  107. package/layout/style/index.less +0 -155
  108. package/layout/widgets/index.d.ts +0 -8
  109. package/layout/widgets/yz.application.component.d.ts +0 -49
  110. package/layout/widgets/yz.application.group.component.d.ts +0 -19
  111. package/layout/widgets/yz.fullscreen.component.d.ts +0 -8
  112. package/layout/yz.basic.component.d.ts +0 -27
  113. package/layout/yz.startup.service.d.ts +0 -36
  114. package/layout/yz.stomp.service.d.ts +0 -42
  115. package/shared/index.d.ts +0 -5
  116. package/shared/public_api.d.ts +0 -4
  117. package/shared/shared-yelon.module.d.ts +0 -3
  118. package/shared/shared-zorro.module.d.ts +0 -2
  119. package/shared/shared.module.d.ts +0 -94
@@ -1,492 +0,0 @@
1
- import { Component, Input, Optional, ViewChild, Output, EventEmitter } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "./contact.service";
4
- import * as i2 from "@angular/common";
5
- import * as i3 from "@angular/forms";
6
- import * as i4 from "@yelon/abc/st";
7
- import * as i5 from "@yelon/abc/sg";
8
- import * as i6 from "ng-zorro-antd/tree";
9
- import * as i7 from "ng-zorro-antd/button";
10
- import * as i8 from "ng-zorro-antd/core/transition-patch";
11
- import * as i9 from "ng-zorro-antd/core/wave";
12
- import * as i10 from "ng-zorro-antd/grid";
13
- import * as i11 from "ng-zorro-antd/icon";
14
- import * as i12 from "ng-zorro-antd/tabs";
15
- import * as i13 from "ng-zorro-antd/input";
16
- import * as i14 from "ng-zorro-antd/list";
17
- import * as i15 from "ng-zorro-antd/spin";
18
- export class ContactComponent {
19
- constructor(contact, changeDetectorRef) {
20
- this.contact = contact;
21
- this.changeDetectorRef = changeDetectorRef;
22
- this.subs = [];
23
- /**
24
- * tabset
25
- */
26
- this.nzTabsetSearch = null;
27
- this.nzTabsetLoading = false;
28
- /**
29
- * 树展开状态
30
- */
31
- this.nzExpandAll = true;
32
- /**
33
- * 部门树和部门查询的一些选项/可传可不传
34
- */
35
- this.nzDepts = [];
36
- this._nzDeptsCopy = [];
37
- this.nzDeptTreeVirtualHeight = null;
38
- this.nzDeptClass = true;
39
- this.nzDeptClassHistory = true;
40
- this.nzDeptGrade = false;
41
- this.nzDeptGradeID = null;
42
- /**
43
- * 角色树
44
- */
45
- this.nzRoles = [];
46
- this._nzRolesCopy = [];
47
- this.nzRoleTreeVirtualHeight = null;
48
- /**
49
- * 好友分组
50
- */
51
- this.nzFriendGroups = [];
52
- this._nzFriendGroupsCopy = [];
53
- /**
54
- * 联系人
55
- */
56
- this.defaultContacts = [];
57
- this.nzContacts = [];
58
- this.nzContactLoading = false;
59
- /**
60
- * 提交和提交按钮
61
- */
62
- this.button = true;
63
- this.confirmed = new EventEmitter();
64
- }
65
- /**
66
- * 初始化,首先加载部门树和默认选中的人的数据
67
- */
68
- ngOnInit() {
69
- this.onTabsetDept();
70
- this.onContactsInit();
71
- }
72
- /**
73
- * 视图初始化完毕后进行table初始化
74
- */
75
- ngAfterViewInit() {
76
- this.onTableInit();
77
- }
78
- /**
79
- * 初始化默认选中联系人
80
- */
81
- onContactsInit() {
82
- if (this.defaultContacts && this.defaultContacts.length > 0) {
83
- this.nzContactLoading = true;
84
- this.subs.push(this.contact.getUserByUserIds(this.defaultContacts).subscribe(contacts => {
85
- this.nzContacts = contacts;
86
- this.nzContactLoading = false;
87
- this.refresh();
88
- }));
89
- }
90
- }
91
- /**
92
- * table初始化
93
- */
94
- onTableInit() {
95
- // 设置表头
96
- this.st.resetColumns({
97
- columns: [
98
- { title: '选择', type: 'checkbox' },
99
- { title: '序号', type: 'no' },
100
- { title: '姓名', index: 'realName' },
101
- { title: '学号/工号', index: 'userCode' },
102
- { title: '部门', index: 'dept.deptName' }
103
- ]
104
- });
105
- // 订阅table点击checkbox事件变化
106
- this.subs.push(this.st.change.subscribe(e => {
107
- if (e.type === 'checkbox') {
108
- // 点击checkbox新增联系人
109
- const contactIds = this.nzContacts.map(c => c.userId);
110
- this.nzContacts = this.nzContacts.concat(e.checkbox.filter(c => !contactIds.includes(c.userId)));
111
- // 取消checkbox取消联系人
112
- const cancelIds = this.st.list.filter(d => !d.checked).map(d => d.userId);
113
- this.nzContacts = this.nzContacts.filter(d => !cancelIds.includes(d.userId));
114
- }
115
- }));
116
- }
117
- /**
118
- * tabset进入加载状态
119
- */
120
- onTabsetLoadStart() {
121
- this.nzTabsetLoading = true;
122
- }
123
- /**
124
- * tabset取消加载状态
125
- */
126
- onTabsetLoadEnd() {
127
- this.nzTabsetLoading = false;
128
- }
129
- /**
130
- * tabset搜索框清除
131
- */
132
- onTabsetSearchClean() {
133
- this.nzDepts = this._nzDeptsCopy;
134
- this.nzRoles = this._nzRolesCopy;
135
- this.nzFriendGroups = this._nzFriendGroupsCopy;
136
- this.nzTabsetSearch = null;
137
- }
138
- /**
139
- * tabset搜索框输入
140
- *
141
- * @param type 类型
142
- * @param value 值
143
- */
144
- onTabsetSearchChange(type, value) {
145
- this.onTabsetLoadStart();
146
- if (!value || value === '') {
147
- this.nzDepts = this._nzDeptsCopy;
148
- this.nzRoles = this._nzRolesCopy;
149
- this.nzFriendGroups = this._nzFriendGroupsCopy;
150
- }
151
- else {
152
- const trees = [];
153
- if (type === 'dept') {
154
- this.searchTree(value, this._nzDeptsCopy, trees);
155
- this.nzDepts = trees;
156
- }
157
- if (type === 'role') {
158
- this.searchTree(value, this._nzRolesCopy, trees);
159
- this.nzRoles = trees;
160
- }
161
- if (type === 'friendGroup') {
162
- this.nzFriendGroups = this._nzFriendGroupsCopy.filter(f => {
163
- return !f.name.indexOf(value);
164
- });
165
- }
166
- }
167
- this.onTabsetLoadEnd();
168
- this.refresh();
169
- }
170
- /**
171
- * tabset切换到部门
172
- */
173
- onTabsetDept() {
174
- this.onTabsetSearchClean();
175
- if (!this.nzDepts || this.nzDepts.length === 0) {
176
- this.onTabsetDeptFlush();
177
- }
178
- }
179
- /**
180
- * tabset切换到角色
181
- */
182
- onTabsetRole() {
183
- this.onTabsetSearchClean();
184
- if (!this.nzRoles || this.nzRoles.length === 0) {
185
- this.onTabsetRoleFlush(null);
186
- }
187
- }
188
- /**
189
- * tabset切换到好友分组
190
- */
191
- onTabsetFriendGroup() {
192
- this.onTabsetSearchClean();
193
- if (!this.nzFriendGroups || this.nzFriendGroups.length === 0) {
194
- this.onTabsetFriendGroupFlush();
195
- }
196
- }
197
- /**
198
- * 获取部门树
199
- */
200
- onTabsetDeptFlush() {
201
- this.onTabsetLoadStart();
202
- this.subs.push(this.contact
203
- .dept(this.nzDeptClass, this.nzDeptClassHistory, this.nzDeptGrade, this.nzDeptGradeID)
204
- .subscribe((trees) => {
205
- this.expandTree(trees);
206
- this.nzDepts = trees;
207
- this._nzDeptsCopy = trees;
208
- this.onTabsetLoadEnd();
209
- this.refresh();
210
- }));
211
- }
212
- // 获取角色树
213
- onTabsetRoleFlush(groupRoleCode) {
214
- this.onTabsetLoadStart();
215
- this.subs.push(this.contact.getGroupRole(groupRoleCode).subscribe((roles) => {
216
- this.expandTree(roles);
217
- this.nzRoles = roles;
218
- this._nzRolesCopy = roles;
219
- this.onTabsetLoadEnd();
220
- this.refresh();
221
- }));
222
- }
223
- // 获取好友分组列表
224
- onTabsetFriendGroupFlush() {
225
- this.onTabsetLoadStart();
226
- this.subs.push(this.contact.getFriendGroup().subscribe((group) => {
227
- this.nzFriendGroups = group;
228
- this._nzFriendGroupsCopy = group;
229
- this.onTabsetLoadEnd();
230
- this.refresh();
231
- }));
232
- }
233
- /**
234
- * 部门树点击
235
- *
236
- * @param e 节点
237
- */
238
- onDeptClick(e) {
239
- // 构造分页请求,直接传入stTable组件,剩下的所有交给组件自己完成
240
- this.st.data = '/auth/baseUser/queryListForPage';
241
- this.st.req = {
242
- allInBody: true,
243
- method: 'POST',
244
- type: 'page',
245
- reName: {
246
- pi: 'pageNum',
247
- ps: 'pageSize'
248
- },
249
- body: {
250
- pageParam: {
251
- deptId: e.keys?.pop()
252
- }
253
- }
254
- };
255
- // table数据预处理
256
- this.st.res = {
257
- process: data => {
258
- this.onTableCheck(data);
259
- return data;
260
- }
261
- };
262
- // 加载第一页
263
- this.st.load(1);
264
- }
265
- /**
266
- * 角色树点击
267
- *
268
- * @param e 节点
269
- */
270
- onRoleClick(e) {
271
- // 构造分页请求,直接传入stTable组件,剩下的所有交给组件自己完成
272
- this.st.data = '/auth/baseUser/queryListForPage';
273
- this.st.req = {
274
- allInBody: true,
275
- method: 'POST',
276
- type: 'page',
277
- reName: {
278
- pi: 'pageNum',
279
- ps: 'pageSize'
280
- },
281
- body: {
282
- pageParam: {
283
- roleId: e.keys?.pop()
284
- }
285
- }
286
- };
287
- // table数据预处理
288
- this.st.res = {
289
- process: data => {
290
- this.onTableCheck(data);
291
- return data;
292
- }
293
- };
294
- // 加载第一页
295
- this.st.load(1);
296
- }
297
- /**
298
- * 好友分组点击
299
- *
300
- * @param e 分组
301
- */
302
- onFriendGroupClick(e) {
303
- // 构造分页请求,直接传入stTable组件,剩下的所有交给组件自己完成
304
- this.st.data = '/auth/baseUser/queryListForPage';
305
- this.st.req = {
306
- allInBody: true,
307
- method: 'POST',
308
- type: 'page',
309
- reName: {
310
- pi: 'pageNum',
311
- ps: 'pageSize'
312
- },
313
- body: {
314
- pageParam: {
315
- friendGroupId: e.id
316
- }
317
- }
318
- };
319
- // table数据预处理
320
- this.st.res = {
321
- process: data => {
322
- this.onTableCheck(data);
323
- return data;
324
- }
325
- };
326
- // 加载第一页
327
- this.st.load(1);
328
- }
329
- /**
330
- * 点击右侧联系人进行删除
331
- *
332
- * @param c 点击的联系人
333
- */
334
- onContactRemove(c) {
335
- this.nzContacts = this.nzContacts.filter(contact => {
336
- return contact.userId != c.userId;
337
- });
338
- this.st.reload();
339
- }
340
- /**
341
- * 预处理table当前页数据,和nzContat对比,确定checkbox状态
342
- *
343
- * @param data 预处理数据
344
- */
345
- onTableCheck(data) {
346
- const ids = this.nzContacts.map(u => u.userId);
347
- data.forEach(d => {
348
- if (ids.includes(d.userId)) {
349
- d.checked = true;
350
- }
351
- else {
352
- d.checked = false;
353
- }
354
- });
355
- }
356
- /**
357
- * 递归树寻找name相同节点
358
- *
359
- * @param name 名称
360
- * @param trees 需要递归的树
361
- * @param list 搜索结果
362
- */
363
- searchTree(name, trees, list) {
364
- if (trees && trees.length && trees.length > 0) {
365
- trees.forEach((tree) => {
366
- if (tree.title.indexOf(name) != -1) {
367
- list.push(tree);
368
- }
369
- if (tree.children) {
370
- this.searchTree(name, tree.children, list);
371
- }
372
- });
373
- }
374
- }
375
- /**
376
- * 递归树展开所有有子节点的节点
377
- *
378
- * @param trees 需要展开的树
379
- */
380
- expandTree(trees) {
381
- if (trees && trees.length && trees.length > 0) {
382
- trees.forEach(tree => {
383
- if (!tree.children || tree.children.length === 0) {
384
- tree.expanded = false;
385
- tree.isLeaf = true;
386
- }
387
- if (tree.children) {
388
- tree.expanded = this.nzExpandAll;
389
- tree.isLeaf = false;
390
- this.expandTree(tree.children);
391
- }
392
- });
393
- }
394
- }
395
- /**
396
- * 刷新当前页面
397
- */
398
- refresh() {
399
- this.changeDetectorRef.detectChanges();
400
- }
401
- /**
402
- * 确认按钮output数据
403
- */
404
- confirm() {
405
- this.confirmed.next(this.nzContacts);
406
- }
407
- /**
408
- * 销毁函数
409
- */
410
- ngOnDestroy() {
411
- this.nzDepts = [];
412
- this.nzRoles = [];
413
- this.nzContacts = [];
414
- this.subs.forEach(s => s.unsubscribe());
415
- }
416
- }
417
- ContactComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: ContactComponent, deps: [{ token: i1.ContactService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
418
- ContactComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.5", type: ContactComponent, selector: "contact", inputs: { nzTabsetSearch: "nzTabsetSearch", nzTabsetLoading: "nzTabsetLoading", nzExpandAll: "nzExpandAll", nzDepts: "nzDepts", nzDeptTreeVirtualHeight: "nzDeptTreeVirtualHeight", nzDeptClass: "nzDeptClass", nzDeptClassHistory: "nzDeptClassHistory", nzDeptGrade: "nzDeptGrade", nzDeptGradeID: "nzDeptGradeID", nzRoles: "nzRoles", nzRoleTreeVirtualHeight: "nzRoleTreeVirtualHeight", nzFriendGroups: "nzFriendGroups", defaultContacts: "defaultContacts", nzContacts: "nzContacts", nzContactLoading: "nzContactLoading", button: "button" }, outputs: { confirmed: "confirmed" }, viewQueries: [{ propertyName: "st", first: true, predicate: ["st"], descendants: true }], ngImport: i0, 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", 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"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.STComponent, selector: "st", inputs: ["req", "res", "page", "data", "columns", "contextmenu", "ps", "pi", "total", "loading", "loadingDelay", "loadingIndicator", "bordered", "size", "scroll", "singleSort", "multiSort", "rowClassName", "clickRowClassName", "widthMode", "widthConfig", "resizable", "header", "showHeader", "footer", "bodyHeader", "body", "expandRowByClick", "expandAccordion", "expand", "noResult", "responsive", "responsiveHideHeaderFooter", "virtualScroll", "virtualItemSize", "virtualMaxBufferPx", "virtualMinBufferPx", "customRequest", "virtualForTrackBy"], outputs: ["error", "change"], exportAs: ["st"] }, { kind: "component", type: i5.SGContainerComponent, selector: "sg-container, [sg-container]", inputs: ["gutter", "sg-container", "col"], exportAs: ["sgContainer"] }, { kind: "component", type: i5.SGComponent, selector: "sg", inputs: ["col"], exportAs: ["sg"] }, { kind: "component", type: i6.NzTreeComponent, selector: "nz-tree", inputs: ["nzShowIcon", "nzHideUnMatched", "nzBlockNode", "nzExpandAll", "nzSelectMode", "nzCheckStrictly", "nzShowExpand", "nzShowLine", "nzCheckable", "nzAsyncData", "nzDraggable", "nzMultiple", "nzExpandedIcon", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzTreeTemplate", "nzBeforeDrop", "nzData", "nzExpandedKeys", "nzSelectedKeys", "nzCheckedKeys", "nzSearchValue", "nzSearchFunc"], outputs: ["nzExpandedKeysChange", "nzSelectedKeysChange", "nzCheckedKeysChange", "nzSearchValueChange", "nzClick", "nzDblClick", "nzContextMenu", "nzCheckBoxChange", "nzExpandChange", "nzOnDragStart", "nzOnDragEnter", "nzOnDragOver", "nzOnDragLeave", "nzOnDrop", "nzOnDragEnd"], exportAs: ["nzTree"] }, { kind: "component", type: i7.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i8.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i9.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "directive", type: i10.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i10.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i11.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i12.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzSelectedIndex", "nzTabPosition", "nzTabBarExtraContent", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { kind: "component", type: i12.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { kind: "directive", type: i13.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i13.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i13.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "component", type: i14.NzListComponent, selector: "nz-list, [nz-list]", inputs: ["nzDataSource", "nzBordered", "nzGrid", "nzHeader", "nzFooter", "nzItemLayout", "nzRenderItem", "nzLoading", "nzLoadMore", "nzPagination", "nzSize", "nzSplit", "nzNoResult"], exportAs: ["nzList"] }, { kind: "component", type: i14.NzListItemComponent, selector: "nz-list-item, [nz-list-item]", inputs: ["nzActions", "nzContent", "nzExtra", "nzNoFlex"], exportAs: ["nzListItem"] }, { kind: "component", type: i14.NzListItemMetaComponent, selector: "nz-list-item-meta, [nz-list-item-meta]", inputs: ["nzAvatar", "nzTitle", "nzDescription"], exportAs: ["nzListItemMeta"] }, { kind: "component", type: i14.NzListItemMetaTitleComponent, selector: "nz-list-item-meta-title", exportAs: ["nzListItemMetaTitle"] }, { kind: "component", type: i15.NzSpinComponent, selector: "nz-spin", inputs: ["nzIndicator", "nzSize", "nzTip", "nzDelay", "nzSimple", "nzSpinning"], exportAs: ["nzSpin"] }] });
419
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImport: i0, type: ContactComponent, decorators: [{
420
- type: Component,
421
- args: [{ selector: 'contact', 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", 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"] }]
422
- }], ctorParameters: function () { return [{ type: i1.ContactService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { nzTabsetSearch: [{
423
- type: Optional
424
- }, {
425
- type: Input
426
- }], nzTabsetLoading: [{
427
- type: Optional
428
- }, {
429
- type: Input
430
- }], nzExpandAll: [{
431
- type: Optional
432
- }, {
433
- type: Input
434
- }], nzDepts: [{
435
- type: Optional
436
- }, {
437
- type: Input
438
- }], nzDeptTreeVirtualHeight: [{
439
- type: Optional
440
- }, {
441
- type: Input
442
- }], nzDeptClass: [{
443
- type: Optional
444
- }, {
445
- type: Input
446
- }], nzDeptClassHistory: [{
447
- type: Optional
448
- }, {
449
- type: Input
450
- }], nzDeptGrade: [{
451
- type: Optional
452
- }, {
453
- type: Input
454
- }], nzDeptGradeID: [{
455
- type: Optional
456
- }, {
457
- type: Input
458
- }], nzRoles: [{
459
- type: Optional
460
- }, {
461
- type: Input
462
- }], nzRoleTreeVirtualHeight: [{
463
- type: Optional
464
- }, {
465
- type: Input
466
- }], nzFriendGroups: [{
467
- type: Optional
468
- }, {
469
- type: Input
470
- }], st: [{
471
- type: ViewChild,
472
- args: ['st', { static: false }]
473
- }], defaultContacts: [{
474
- type: Optional
475
- }, {
476
- type: Input
477
- }], nzContacts: [{
478
- type: Optional
479
- }, {
480
- type: Input
481
- }], nzContactLoading: [{
482
- type: Optional
483
- }, {
484
- type: Input
485
- }], button: [{
486
- type: Optional
487
- }, {
488
- type: Input
489
- }], confirmed: [{
490
- type: Output
491
- }] } });
492
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9iaXMvbGF5b3V0L2NvbnRhY3QvY29udGFjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9iaXMvbGF5b3V0L2NvbnRhY3QvY29udGFjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULEtBQUssRUFJTCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY3ZCLE1BQU0sT0FBTyxnQkFBZ0I7SUF3RDNCLFlBQW9CLE9BQXVCLEVBQVUsaUJBQW9DO1FBQXJFLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQXZEekYsU0FBSSxHQUFtQixFQUFFLENBQUM7UUFFMUI7O1dBRUc7UUFDa0IsbUJBQWMsR0FBa0IsSUFBSSxDQUFDO1FBQ3JDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBRXREOztXQUVHO1FBQ2tCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBRWpEOztXQUVHO1FBQ2tCLFlBQU8sR0FBd0IsRUFBRSxDQUFDO1FBQy9DLGlCQUFZLEdBQXdCLEVBQUUsQ0FBQztRQUMxQiw0QkFBdUIsR0FBa0IsSUFBSSxDQUFDO1FBQzlDLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQzVCLHVCQUFrQixHQUFZLElBQUksQ0FBQztRQUNuQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFFekQ7O1dBRUc7UUFDa0IsWUFBTyxHQUF3QixFQUFFLENBQUM7UUFDL0MsaUJBQVksR0FBd0IsRUFBRSxDQUFDO1FBQzFCLDRCQUF1QixHQUFrQixJQUFJLENBQUM7UUFFbkU7O1dBRUc7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QVE7O3NCQUFJLEtBQUs7Z0JBTWtCLEVBQUU7c0JBQXJDLFNBQVM7dUJBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFLYixlQUFlO3NCQUFuQyxRQUFROztzQkFBSSxLQUFLO2dCQUNHLFVBQVU7c0JBQTlCLFFBQVE7O3NCQUFJLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUFwQyxRQUFROztzQkFBSSxLQUFLO2dCQUtHLE1BQU07c0JBQTFCLFFBQVE7O3NCQUFJLEtBQUs7Z0JBQ0MsU0FBUztzQkFBM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT3B0aW9uYWwsXG4gIFZpZXdDaGlsZCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU1RDb21wb25lbnQgfSBmcm9tICdAeWVsb24vYWJjL3N0JztcbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBOelRyZWVOb2RlT3B0aW9ucywgTnpGb3JtYXRFbWl0RXZlbnQgfSBmcm9tICduZy16b3Jyby1hbnRkL3RyZWUnO1xuXG5pbXBvcnQgeyBDb250YWN0U2VydmljZSB9IGZyb20gJy4vY29udGFjdC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29udGFjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250YWN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29udGFjdC5jb21wb25lbnQubGVzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbnRhY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHN1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgLyoqXG4gICAqIHRhYnNldFxuICAgKi9cbiAgQE9wdGlvbmFsKCkgQElucHV0KCkgbnpUYWJzZXRTZWFyY2g6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBuelRhYnNldExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICog5qCR5bGV5byA54q25oCBXG4gICAqL1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBuekV4cGFuZEFsbDogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIOmDqOmXqOagkeWSjOmDqOmXqOafpeivoueahOS4gOS6m+mAiemhuS/lj6/kvKDlj6/kuI3kvKBcbiAgICovXG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56RGVwdHM6IE56VHJlZU5vZGVPcHRpb25zW10gPSBbXTtcbiAgcHJpdmF0ZSBfbnpEZXB0c0NvcHk6IE56VHJlZU5vZGVPcHRpb25zW10gPSBbXTtcbiAgQE9wdGlvbmFsKCkgQElucHV0KCkgbnpEZXB0VHJlZVZpcnR1YWxIZWlnaHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBuekRlcHRDbGFzczogYm9vbGVhbiA9IHRydWU7XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56RGVwdENsYXNzSGlzdG9yeTogYm9vbGVhbiA9IHRydWU7XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56RGVwdEdyYWRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56RGVwdEdyYWRlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiDop5LoibLmoJFcbiAgICovXG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56Um9sZXM6IE56VHJlZU5vZGVPcHRpb25zW10gPSBbXTtcbiAgcHJpdmF0ZSBfbnpSb2xlc0NvcHk6IE56VHJlZU5vZGVPcHRpb25zW10gPSBbXTtcbiAgQE9wdGlvbmFsKCkgQElucHV0KCkgbnpSb2xlVHJlZVZpcnR1YWxIZWlnaHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiDlpb3lj4vliIbnu4RcbiAgICovXG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56RnJpZW5kR3JvdXBzOiBOelNhZmVBbnlbXSA9IFtdO1xuICBfbnpGcmllbmRHcm91cHNDb3B5OiBOelNhZmVBbnlbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiB0YWJsZee7hOS7tu+8jOW4ruWKqeaWh+ahozogaHR0cHM6Ly9uZy55dW56YWluZm8uY29tL2NvbXBvbmVudHMvc3Qvemg/I0FQSVxuICAgKi9cbiAgQFZpZXdDaGlsZCgnc3QnLCB7IHN0YXRpYzogZmFsc2UgfSkgc3QhOiBTVENvbXBvbmVudDtcblxuICAvKipcbiAgICog6IGU57O75Lq6XG4gICAqL1xuICBAT3B0aW9uYWwoKSBASW5wdXQoKSBkZWZhdWx0Q29udGFjdHM6IHN0cmluZ1tdID0gW107XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56Q29udGFjdHM6IE56U2FmZUFueVtdID0gW107XG4gIEBPcHRpb25hbCgpIEBJbnB1dCgpIG56Q29udGFjdExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICog5o+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+IHMudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiIsIjxuei1yb3cgW256R3V0dGVyXT1cIjE2XCI+XG4gIDxuei1jb2wgW256WHNdPVwiMjRcIiBbbnpTbV09XCIyNFwiIFtuek1kXT1cIjI0XCIgW256TGddPVwiOFwiIFtuelhsXT1cIjZcIiBbbnpYWGxdPVwiNlwiPlxuICAgIDxuei10YWJzZXQgbnpDZW50ZXJlZD5cbiAgICAgIDxuei10YWIgbnpUaXRsZT1cIumDqOmXqFwiIChuelNlbGVjdCk9XCJvblRhYnNldERlcHQoKVwiPlxuICAgICAgICA8ZGl2IHNnLWNvbnRhaW5lcj1cIjJcIj5cbiAgICAgICAgICA8c2cgY29sPVwiMVwiIGNsYXNzPVwibnotdGFic2V0LXNnXCI+XG4gICAgICAgICAgICA8bnotaW5wdXQtZ3JvdXAgY2xhc3M9XCJuei10YWJzZXQtaW5wdXRcIiBbbnpTdWZmaXhdPVwic2VhcmNoSW5wdXRUcGxcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbnotaW5wdXRcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm56VGFic2V0U2VhcmNoXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblRhYnNldFNlYXJjaENoYW5nZSgnZGVwdCcsICRldmVudClcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpemDqOmXqOWQjeensFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgIDwvc2c+XG4gICAgICAgICAgPHNnIGNvbD1cIjFcIj5cbiAgICAgICAgICAgIDxuei1zcGluIFtuelNwaW5uaW5nXT1cIm56VGFic2V0TG9hZGluZ1wiPlxuICAgICAgICAgICAgICA8bnotdHJlZVxuICAgICAgICAgICAgICAgIGNsYXNzPVwibnotdGFic2V0LWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIChuekNsaWNrKT1cIm9uRGVwdENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtuekJsb2NrTm9kZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbnpTaG93TGluZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbnpIaWRlVW5NYXRjaGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtuelZpcnR1YWxIZWlnaHRdPVwibnpEZXB0VHJlZVZpcnR1YWxIZWlnaHRcIlxuICAgICAgICAgICAgICAgIFtuekRhdGFdPVwibnpEZXB0c1wiXG4gICAgICAgICAgICAgID48L256LXRyZWU+XG4gICAgICAgICAgICA8L256LXNwaW4+XG4gICAgICAgICAgPC9zZz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L256LXRhYj5cbiAgICAgIDxuei10YWIgbnpUaXRsZT1cIuinkuiJslwiIChuelNlbGVjdCk9XCJvblRhYnNldFJvbGUoKVwiPlxuICAgICAgICA8ZGl2IHNnLWNvbnRhaW5lcj1cIjJcIj5cbiAgICAgICAgICA8c2cgY29sPVwiMVwiIGNsYXNzPVwibnotdGFic2V0LXNnXCI+XG4gICAgICAgICAgICA8bnotaW5wdXQtZ3JvdXAgY2xhc3M9XCJuei10YWJzZXQtaW5wdXRcIiBbbnpTdWZmaXhdPVwic2VhcmNoSW5wdXRUcGxcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbnotaW5wdXRcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm56VGFic2V0U2VhcmNoXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblRhYnNldFNlYXJjaENoYW5nZSgncm9sZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeinkuiJsuWQjeensFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgIDwvc2c+XG4gICAgICAgICAgPHNnIGNvbD1cIjFcIj5cbiAgICAgICAgICAgIDxuei1zcGluIFtuelNwaW5uaW5nXT1cIm56VGFic2V0TG9hZGluZ1wiPlxuICAgICAgICAgICAgICA8bnotdHJlZVxuICAgICAgICAgICAgICAgIGNsYXNzPVwibnotdGFic2V0LWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIChuekNsaWNrKT1cIm9uUm9sZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtuekJsb2NrTm9kZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbnpTaG93TGluZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbnpIaWRlVW5NYXRjaGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtuelZpcnR1YWxIZWlnaHRdPVwibnpSb2xlVHJlZVZpcnR1YWxIZWlnaHRcIlxuICAgICAgICAgICAgICAgIFtuekRhdGFdPVwibnpSb2xlc1wiXG4gICAgICAgICAgICAgID48L256LXRyZWU+XG4gICAgICAgICAgICA8L256LXNwaW4+XG4gICAgICAgICAgPC9zZz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L256LXRhYj5cbiAgICAgIDxuei10YWIgbnpUaXRsZT1cIuWlveWPi1wiIChuelNlbGVjdCk9XCJvblRhYnNldEZyaWVuZEdyb3VwKClcIj5cbiAgICAgICAgPGRpdiBzZy1jb250YWluZXI9XCIyXCI+XG4gICAgICAgICAgPHNnIGNvbD1cIjFcIiBjbGFzcz1cIm56LXRhYnNldC1zZ1wiPlxuICAgICAgICAgICAgPG56LWlucHV0LWdyb3VwIGNsYXNzPVwibnotdGFic2V0LWlucHV0XCIgW256U3VmZml4XT1cInNlYXJjaElucHV0VHBsXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG56LWlucHV0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuelRhYnNldFNlYXJjaFwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25UYWJzZXRTZWFyY2hDaGFuZ2UoJ2ZyaWVuZEdyb3VwJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5aW95Y+L5ZCN56ewXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbnotaW5wdXQtZ3JvdXA+XG4gICAgICAgICAgPC9zZz5cbiAgICAgICAgICA8c2cgY29sPVwiMVwiPlxuICAgICAgICAgICAgPG56LXNwaW4gW256U3Bpbm5pbmddPVwibnpUYWJzZXRMb2FkaW5nXCI+XG4gICAgICAgICAgICAgIDxuei1saXN0IGNsYXNzPVwibnotdGFic2V0LWNvbnRlbnRcIiBuekl0ZW1MYXlvdXQ9XCJob3Jpem9udGFsXCIgW256U3BsaXRdPVwiZmFsc2VcIiBuelNpemU9XCJzbWFsbFwiPlxuICAgICAgICAgICAgICAgIDxuei1saXN0LWl0ZW1cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibnotdGFic2V0LWNvbnRlbnQtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgbnpGcmllbmRHcm91cHNcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRnJpZW5kR3JvdXBDbGljayhncm91cClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuei1saXN0LWl0ZW0tbWV0YT5cbiAgICAgICAgICAgICAgICAgICAgPG56LWxpc3QtaXRlbS1tZXRhLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uei1saXN0LWl0ZW0tbWV0YS10aXRsZT5cbiAgICAgICAgICAgICAgICAgIDwvbnotbGlzdC1pdGVtLW1ldGE+XG4gICAgICAgICAgICAgICAgPC9uei1saXN0LWl0ZW0+XG4gICAgICAgICAgICAgIDwvbnotbGlzdD5cbiAgICAgICAgICAgIDwvbnotc3Bpbj5cbiAgICAgICAgICA8L3NnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbnotdGFiPlxuICAgIDwvbnotdGFic2V0PlxuICA8L256LWNvbD5cblxuICA8bnotY29sIFtuelhzXT1cIjI0XCIgW256U21dPVwiMjRcIiBbbnpNZF09XCIyNFwiIFtuekxnXT1cIjE2XCIgW256WGxdPVwiMTNcIiBbbnpYWGxdPVwiMTNcIj5cbiAgICA8c3QgI3N0IHJlc3BvbnNpdmVIaWRlSGVhZGVyRm9vdGVyPjwvc3Q+XG4gIDwvbnotY29sPlxuXG4gIDxuei1jb2wgW256WHNdPVwiMjRcIiBbbnpTbV09XCIyNFwiIFtuek1kXT1cIjI0XCIgW256TGddPVwiMjRcIiBbbnpYbF09XCI1XCIgW256WFhsXT1cIjVcIj5cbiAgICA8bnotc3BpbiBbbnpTcGlubmluZ109XCJuekNvbnRhY3RMb2FkaW5nXCI+XG4gICAgICA8bnotbGlzdCBuekl0ZW1MYXlvdXQ9XCJob3Jpem9udGFsXCIgW256U3BsaXRdPVwiZmFsc2VcIiBuelNpemU9XCJzbWFsbFwiPlxuICAgICAgICA8bnotbGlzdC1pdGVtXG4gICAgICAgICAgY2xhc3M9XCJuei10YWJzZXQtY29udGVudC1pdGVtXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29udGFjdCBvZiBuekNvbnRhY3RzXCJcbiAgICAgICAgICAoY2xpY2spPVwib25Db250YWN0UmVtb3ZlKGNvbnRhY3QpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuei1saXN0LWl0ZW0tbWV0YT5cbiAgICAgICAgICAgIDxuei1saXN0LWl0ZW0tbWV0YS10aXRsZT5cbiAgICAgICAgICAgICAge3sgY29udGFjdC5yZWFsTmFtZSB9fVxuICAgICAgICAgICAgPC9uei1saXN0LWl0ZW0tbWV0YS10aXRsZT5cbiAgICAgICAgICA8L256LWxpc3QtaXRlbS1tZXRhPlxuICAgICAgICA8L256LWxpc3QtaXRlbT5cbiAgICAgIDwvbnotbGlzdD5cbiAgICA8L256LXNwaW4+XG4gIDwvbnotY29sPlxuPC9uei1yb3c+XG5cbjxuei1yb3cgKm5nSWY9XCJidXR0b25cIj5cbiAgPG56LWNvbCBbbnpTcGFuXT1cIjRcIiBbbnpPZmZzZXRdPVwiMjBcIj5cbiAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNvbmZpcm0oKVwiPuehruWumjwvYnV0dG9uPlxuICA8L256LWNvbD5cbjwvbnotcm93PlxuXG48bmctdGVtcGxhdGUgI3NlYXJjaElucHV0VHBsPlxuICA8aSBuei1pY29uIG56VHlwZT1cImNsb3NlXCIgbnpUaGVtZT1cIm91dGxpbmVcIiAqbmdJZj1cIm56VGFic2V0U2VhcmNoXCIgKGNsaWNrKT1cIm9uVGFic2V0U2VhcmNoQ2xlYW4oKVwiPjwvaT5cbiAgPGkgbnotaWNvbiBuelR5cGU9XCJzZWFyY2hcIiBuelRoZW1lPVwib3V0bGluZVwiICpuZ0lmPVwiIW56VGFic2V0U2VhcmNoXCI+PC9pPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==