tnx-shared 5.1.141 → 5.1.145

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 (65) hide show
  1. package/bundles/tnx-shared.umd.js +1001 -264
  2. package/bundles/tnx-shared.umd.js.map +1 -1
  3. package/bundles/tnx-shared.umd.min.js +1 -1
  4. package/bundles/tnx-shared.umd.min.js.map +1 -1
  5. package/classes/base/data-list-base.d.ts.map +1 -1
  6. package/classes/form-schema.d.ts +4 -0
  7. package/classes/form-schema.d.ts.map +1 -1
  8. package/components/common-app-component/app-topbar-v1/app-topbar-v1.component.d.ts.map +1 -1
  9. package/components/common-app-component/app-topbar-v2/app-topbar-v2.component.d.ts +78 -0
  10. package/components/common-app-component/app-topbar-v2/app-topbar-v2.component.d.ts.map +1 -0
  11. package/components/common-app-component/app-topbar-v2/app-topbar-v2.component.ngfactory.d.ts.map +1 -0
  12. package/components/common-app-component/app-topbar-v2/app-topbar-v2.component.scss.shim.ngstyle.d.ts.map +1 -0
  13. package/components/crud/crud-list/crud-list.component.d.ts +1 -1
  14. package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
  15. package/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.d.ts.map +1 -1
  16. package/components/entity-picker/entity-picker.component.d.ts.map +1 -1
  17. package/components/splash-component/splash-component-v1/splash-component-v1.component.d.ts.map +1 -1
  18. package/components/splash-component/splash-component-v2/splash-component-v2.component.d.ts +41 -0
  19. package/components/splash-component/splash-component-v2/splash-component-v2.component.d.ts.map +1 -0
  20. package/components/splash-component/splash-component-v2/splash-component-v2.component.ngfactory.d.ts.map +1 -0
  21. package/components/splash-component/splash-component-v2/splash-component-v2.component.scss.shim.ngstyle.d.ts.map +1 -0
  22. package/components/splash-component/splash-component.component.d.ts +2 -1
  23. package/components/splash-component/splash-component.component.d.ts.map +1 -1
  24. package/components/statemachines/utils/utils.d.ts +1 -1
  25. package/components/statemachines/utils/utils.d.ts.map +1 -1
  26. package/components/user-picker/user-picker.component.d.ts.map +1 -1
  27. package/components/workflow/process-workflow-target/process-workflow-target.component.d.ts +1 -0
  28. package/components/workflow/process-workflow-target/process-workflow-target.component.d.ts.map +1 -1
  29. package/components/workflow/services/workflow-settings.service.d.ts.map +1 -1
  30. package/components/workflow/workflow-history-new/workflow-history-new.component.d.ts +2 -2
  31. package/components/workflow/workflow-history-new/workflow-history-new.component.d.ts.map +1 -1
  32. package/esm2015/classes/base/data-list-base.js +6 -3
  33. package/esm2015/classes/form-schema.js +2 -1
  34. package/esm2015/components/chat/chat-box/chat-box.component.js +1 -1
  35. package/esm2015/components/chat/chat-send-message-box/chat-send-message-box.component.js +1 -1
  36. package/esm2015/components/common-app-component/app-topbar-v1/app-topbar-v1.component.js +3 -3
  37. package/esm2015/components/common-app-component/app-topbar-v2/app-topbar-v2.component.js +412 -0
  38. package/esm2015/components/common-app-component/app.topbar.component.js +2 -2
  39. package/esm2015/components/crud/crud-list/crud-list.component.js +21 -10
  40. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.js +3 -2
  41. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.js +3 -2
  42. package/esm2015/components/entity-picker/entity-picker.component.js +9 -4
  43. package/esm2015/components/query-builders/query-builder-rule/query-builder-rule.component.js +1 -1
  44. package/esm2015/components/splash-component/splash-component-v1/splash-component-v1.component.js +4 -4
  45. package/esm2015/components/splash-component/splash-component-v2/splash-component-v2.component.js +194 -0
  46. package/esm2015/components/splash-component/splash-component.component.js +3 -2
  47. package/esm2015/components/statemachines/utils/utils.js +5 -3
  48. package/esm2015/components/user-picker/user-picker.component.js +7 -3
  49. package/esm2015/components/workflow/process-workflow-target/process-workflow-target.component.js +27 -2
  50. package/esm2015/components/workflow/services/workflow-settings.service.js +2 -1
  51. package/esm2015/components/workflow/workflow-history-new/workflow-history-new.component.js +87 -77
  52. package/esm2015/services/user.service.js +6 -1
  53. package/esm2015/tnx-shared.js +124 -122
  54. package/esm2015/tnx-shared.module.js +5 -1
  55. package/fesm2015/tnx-shared.js +759 -107
  56. package/fesm2015/tnx-shared.js.map +1 -1
  57. package/package.json +2 -2
  58. package/services/user.service.d.ts +1 -0
  59. package/services/user.service.d.ts.map +1 -1
  60. package/tnx-shared.d.ts +123 -121
  61. package/tnx-shared.d.ts.map +1 -1
  62. package/tnx-shared.metadata.json +1 -1
  63. package/tnx-shared.module.d.ts +3 -1
  64. package/tnx-shared.module.d.ts.map +1 -1
  65. package/tnx-shared.module.ngfactory.d.ts.map +1 -1
@@ -0,0 +1,412 @@
1
+ import { __awaiter } from "tslib";
2
+ import { ChangeDetectorRef, Component, ElementRef, Injector, ViewChild } from '@angular/core';
3
+ import { Router } from '@angular/router';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { ComponentContextService } from '../../../app-context/component-context.service';
6
+ import { ComponentBase } from '../../../classes/base/component-base';
7
+ import { ComCtxConstants } from '../../../configs/component-context.constant';
8
+ import { AuthenService } from '../../../services/authen.service';
9
+ import { CommonService } from '../../../services/common.service';
10
+ import { CustomRouterService } from '../../../services/custom-router.service';
11
+ import { ModuleConfigService } from '../../../services/module-config.service';
12
+ import { NotifierService } from '../../../services/notifier.service';
13
+ import { PermissionService } from '../../../services/permission.service';
14
+ import { UserService } from '../../../services/user.service';
15
+ export class AppTopBarV2Component extends ComponentBase {
16
+ constructor(
17
+ // public app: AppComponent,
18
+ _customRouteService, _router, _commonService, _authenService, _cd, _injector, _permissionService, _moduleConfigService, _userService, _notifierService, _translateService) {
19
+ super(_injector);
20
+ this._customRouteService = _customRouteService;
21
+ this._router = _router;
22
+ this._commonService = _commonService;
23
+ this._authenService = _authenService;
24
+ this._cd = _cd;
25
+ this._permissionService = _permissionService;
26
+ this._moduleConfigService = _moduleConfigService;
27
+ this._userService = _userService;
28
+ this._notifierService = _notifierService;
29
+ this._translateService = _translateService;
30
+ this.defaultAvatar = '';
31
+ this.key = '';
32
+ this.currentRoute = '';
33
+ this.fileApi = '';
34
+ this.currentUser = null;
35
+ this.appSwitcherItems = [];
36
+ this.isFirstTime = false;
37
+ this.showSettings = false;
38
+ this.allSubscriptions = [];
39
+ this.message = '';
40
+ this.environment = this._moduleConfigService.getConfig().environment;
41
+ this.defaultAvatar = this.environment.appMetadata.main.defaultMaleAvatar;
42
+ this.fileApi = this.environment.apiDomain.fileEndpoint;
43
+ if (this.rootContext.data.currentAppMetadata && this.rootContext.data.currentAppMetadata.showDefaultSetting != null && this.rootContext.data.currentAppMetadata.showDefaultSetting != undefined) {
44
+ this.showDefaultSetting = this.rootContext.data.currentAppMetadata.showDefaultSetting;
45
+ }
46
+ else {
47
+ if (this.environment.appMetadata.main.showDefaultSetting != null && this.environment.appMetadata.main.showDefaultSetting != undefined) {
48
+ this.showDefaultSetting = this.environment.appMetadata.main.showDefaultSetting;
49
+ }
50
+ else {
51
+ this.showDefaultSetting = false;
52
+ }
53
+ }
54
+ if (!this.rootContext.data.currentUser) {
55
+ this.rootContext.data.currentUser = {};
56
+ }
57
+ // this.allSubscriptions.push(this.rootContext.subscribe(ComCtxConstants.ROOT.USER_INFO_CHANGED, rs => {
58
+ // this._cd.detectChanges();
59
+ // }));
60
+ this.rootContext.replaySubscribeOnce(ComCtxConstants.ROOT.USER_LOADED, rs => {
61
+ this.currentUser = this._userService.getCurrentUser();
62
+ this.loadMenuMetadata();
63
+ });
64
+ if (this.rootModel.allowAnonymous) {
65
+ this.loadMenuMetadata();
66
+ }
67
+ }
68
+ loadMenuMetadata() {
69
+ const prmsAppSwicherItem = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
70
+ const arr = [];
71
+ for (const ind in this.environment.appMetadata.appSwitcher) {
72
+ const element = this.environment.appMetadata.appSwitcher[ind];
73
+ const clientId = this.environment.authenticationSettings.clientId;
74
+ if (this.rootContext.data.allowAnonymous && element.allowAnonymous) {
75
+ arr.push(element);
76
+ }
77
+ else {
78
+ if (this.currentUser) {
79
+ const isAuthorized = yield this._permissionService.isAuthorized(element.code, `${element.code}.MODULE.${element.code}`.toUpperCase(), true);
80
+ if (isAuthorized) {
81
+ arr.push(element);
82
+ }
83
+ }
84
+ }
85
+ }
86
+ resolve(arr);
87
+ }));
88
+ prmsAppSwicherItem.then(rs => {
89
+ if (rs) {
90
+ const currentUser = this._userService.getCurrentUser();
91
+ this.appSwitcherItems.length = 0;
92
+ rs.forEach(element => {
93
+ if (element.visible) {
94
+ if (element.allowAnonymous) {
95
+ this.appSwitcherItems.push(element);
96
+ }
97
+ else {
98
+ if (currentUser.maNguoiHoc && currentUser.issuperuser && currentUser.issuperuser.toLowerCase() != 'true') {
99
+ if (element.code.toLowerCase() == 'sv' || element.code.toLowerCase() == 'user') {
100
+ this.appSwitcherItems.push(element);
101
+ }
102
+ }
103
+ else {
104
+ this.appSwitcherItems.push(element);
105
+ }
106
+ }
107
+ }
108
+ });
109
+ }
110
+ });
111
+ }
112
+ ngOnInit() {
113
+ if (this.rootContext.data.currentUser) {
114
+ if (this.rootContext.data.currentUser.gender == 0) {
115
+ this.defaultAvatar = this.environment.appMetadata.main.defaultFemaleAvatar;
116
+ }
117
+ else {
118
+ this.defaultAvatar = this.environment.appMetadata.main.defaultMaleAvatar;
119
+ }
120
+ this.userProfile = this._userService.getProfileInfo();
121
+ }
122
+ this.rootContext.subscribe(ComCtxConstants.ROOT.BODY_MOUSE_DOWN, (e) => {
123
+ setTimeout(() => {
124
+ this.hideAdvanceSearch(e);
125
+ });
126
+ });
127
+ this.rootContext.subscribe(ComCtxConstants.ROOT.KEY_DOWN_CTRL_F, (e) => {
128
+ this.focusToSearchBox();
129
+ });
130
+ this.rootContext.subscribe(ComCtxConstants.COMMON.FORCE_RELOAD, (e) => {
131
+ this.showNotificationReload();
132
+ });
133
+ this.rootContext.subscribe(ComCtxConstants.COMMON.SHOW_NOTIFY, (e) => {
134
+ this.setNotify(e.message);
135
+ });
136
+ this.allSubscriptions.push(this.rootContext.subscribe(ComCtxConstants.ROOT_USMART.SHOW_CONFIG_DATA_DEFAULT, e => {
137
+ this.model.dataModelSetting.showSettings = true;
138
+ }));
139
+ this.model.dataModelSetting = {
140
+ data: {},
141
+ showSettings: false
142
+ };
143
+ this.subscribe(ComCtxConstants.COMMON.SAVE_DATA_DEFAULT, data => {
144
+ this.formatDefaultDataSetting(data);
145
+ this.reloadWindow();
146
+ });
147
+ const stringDataDefault = localStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.DEFAULT_DATA);
148
+ if (stringDataDefault) {
149
+ const dataCacheDefault = JSON.parse(stringDataDefault);
150
+ this.formatDefaultDataSetting(dataCacheDefault);
151
+ }
152
+ else {
153
+ this.defaultDataSetting = 'Thiết lập tham số mặc định';
154
+ }
155
+ }
156
+ ngOnDestroy() {
157
+ this.allSubscriptions.forEach(element => {
158
+ element.unsubscribe();
159
+ });
160
+ if (this.intervalCountdown) {
161
+ clearInterval(this.intervalCountdown);
162
+ }
163
+ super.ngOnDestroy();
164
+ }
165
+ formatDefaultDataSetting(data) {
166
+ let dataSetting = '';
167
+ const fields = ['instanceIdHeDaoTao', 'heDaoTao', 'namHoc', 'hocKy', 'instanceIdNamHoc', 'instanceIdHocKy', 'idDotThi'];
168
+ const fieldPluses = ['code', 'code', 'ten', 'ten', 'ten', 'ten', 'ten'];
169
+ fields.forEach((field, index) => {
170
+ if (!this.checkHidden(field)) {
171
+ const _f = `${field}${fieldPluses[index]}`;
172
+ if (data[_f]) {
173
+ dataSetting += data[_f] + '/';
174
+ }
175
+ }
176
+ });
177
+ if (dataSetting.length > 0) {
178
+ dataSetting = dataSetting.substring(0, dataSetting.length - 1);
179
+ }
180
+ this.defaultDataSetting = dataSetting;
181
+ }
182
+ checkHidden(field) {
183
+ return this.rootModel.currentAppMetadata.configDefaultSetting && !this.rootModel.currentAppMetadata.configDefaultSetting.column.some(p => p.field == field);
184
+ }
185
+ getCurrentUserFullName() {
186
+ return this.rootContext.data.currentUser && this.rootContext.data.currentUser.fullName ? this.rootContext.data.currentUser.fullName : 'Khách';
187
+ }
188
+ getCurrentUserPosition() {
189
+ return this.userProfile ? this.userProfile.tenDonVi : null;
190
+ }
191
+ getCurrentUserAvatar() {
192
+ if (this.rootContext.data.currentUser && this.rootContext.data.currentUser.avatar) {
193
+ return `${this.fileApi}/file/public/${this.rootContext.data.currentUser.avatar}/Download`;
194
+ }
195
+ else {
196
+ return this.defaultAvatar;
197
+ }
198
+ }
199
+ clearFilter(input) {
200
+ setTimeout(() => {
201
+ this.model.searchModel[this.model.fieldKey] = '';
202
+ this._customRouteService.updateFragment(this.model.fieldKey, null);
203
+ this._customRouteService.updateWithoutFireEvent();
204
+ this.rootContext.fireEvent(ComCtxConstants.ROOT.ON_SEARCH, this.model.searchModel);
205
+ input.value = '';
206
+ input.focus();
207
+ this._cd.detectChanges();
208
+ });
209
+ }
210
+ toggleAdvanceSearch(evt) {
211
+ this.rootContext.fireEvent(ComCtxConstants.ROOT.ADVANCE_SEARCH_TOGGLE_BOX, { event: evt });
212
+ evt.preventDefault();
213
+ evt.cancelBubble = true;
214
+ }
215
+ hideAdvanceSearch(evt) {
216
+ if (document.getElementById('advance-search-box')) {
217
+ const mask = document.body.querySelectorAll('div[class~="ui-dialog-mask"]');
218
+ if (!mask.length) {
219
+ const closestDropdown = evt.target.closest('.dropdown-advs');
220
+ if (closestDropdown == null || closestDropdown.length == 0) {
221
+ this.rootContext.fireEvent(ComCtxConstants.ROOT.ADVANCE_SEARCH_HIDE_BOX, { event: evt });
222
+ }
223
+ }
224
+ }
225
+ }
226
+ focusToSearchBox() {
227
+ if (!document.body.querySelector('div[class~="ui-dialog-mask"]')) {
228
+ this.input.nativeElement.focus();
229
+ }
230
+ }
231
+ onTopbarSearchClick(event, input) {
232
+ if (!this.model.fieldKey) {
233
+ return;
234
+ }
235
+ setTimeout(() => {
236
+ this.rootContext.fireEvent(ComCtxConstants.ROOT.ON_SEARCH, this.model.searchModel);
237
+ this._customRouteService.updateFragment(this.model.fieldKey, input.value);
238
+ this._customRouteService.updateWithoutFireEvent();
239
+ input.focus();
240
+ });
241
+ }
242
+ onEsc(event, input) {
243
+ this.clearFilter(input);
244
+ }
245
+ onEnter(event, input) {
246
+ this.onTopbarSearchClick(event, input);
247
+ }
248
+ switchApp(item, openNewTab = false) {
249
+ if (item.target == '_blank') {
250
+ if (!item.defaultRedirect) {
251
+ item.defaultRedirect = '';
252
+ }
253
+ // NamNH tip trick cho mot so may bi loi item.url = 'main' -> redirect sai khi click vao cac phan he
254
+ if (item.url == item.defaultRedirect) {
255
+ item.url = '/' + item.code.toLowerCase();
256
+ }
257
+ if (!openNewTab) {
258
+ top.location.href = `${item.url}/${item.defaultRedirect}`;
259
+ }
260
+ else {
261
+ window.open(`${item.url}/${item.defaultRedirect}`, '_blank');
262
+ }
263
+ }
264
+ else {
265
+ if (item.defaultRedirect != '' && !this.rootContext.data.flags.menuTopOpenning) {
266
+ this._router.navigateByUrl(item.defaultRedirect);
267
+ this.rootContext.data.currentAppMetadata = this.environment.appMetadata.appSwitcher.find(x => x.code == item.code);
268
+ if (this.rootContext.data.currentAppMetadata
269
+ && this.rootContext.data.currentAppMetadata.showDefaultSetting != undefined
270
+ && this.rootContext.data.currentAppMetadata.showDefaultSetting != null) {
271
+ this.showDefaultSetting = this.rootContext.data.currentAppMetadata.showDefaultSetting && this.showDefaultSetting;
272
+ }
273
+ }
274
+ }
275
+ }
276
+ hasAdvanceSearchBox() {
277
+ return this.model.searchModel.hasAdvanceSearch;
278
+ }
279
+ isAdvanceSearching() {
280
+ return this.hasAdvanceSearchValue(this.model.searchModel);
281
+ }
282
+ hasAdvanceSearchValue(obj) {
283
+ for (const key in obj) {
284
+ if (key === '_k' || key === 'hasAdvanceSearch') {
285
+ continue;
286
+ }
287
+ if (obj[key] != null && obj[key] != '') {
288
+ return false;
289
+ }
290
+ }
291
+ return true;
292
+ }
293
+ getComponentId() {
294
+ return 'TOPBAR';
295
+ }
296
+ goToHome() {
297
+ this.rootContext.fireEvent('GO_HOME');
298
+ }
299
+ onEditInfo(event) {
300
+ event.preventDefault();
301
+ const currentAppSetting = this.environment.appMetadata.appSwitcher.find(x => x.code == 'USER');
302
+ if (currentAppSetting) {
303
+ this.switchApp(currentAppSetting);
304
+ }
305
+ else {
306
+ console.error('Bạn chưa thiết lập metadata cho trang cá nhân');
307
+ }
308
+ }
309
+ onChangePassword(event) {
310
+ event.preventDefault();
311
+ // this.changePassword.showPopup(this._userService.getId());
312
+ }
313
+ onTopbarLogout() {
314
+ if (!localStorage.getItem('currentUrl')) {
315
+ localStorage.setItem('currentUrl', top.location.href);
316
+ }
317
+ this._authenService.logout();
318
+ }
319
+ settingDefault() {
320
+ this.model.dataModelSetting = {
321
+ data: {},
322
+ showSettings: true
323
+ };
324
+ }
325
+ onShowSettings(ev) {
326
+ this.rootContext.fireEvent(ComCtxConstants.ROOT_USMART.CONFIG_DATA_DEFAULT_OPENED);
327
+ }
328
+ onCloseSettings(ev) {
329
+ this.rootContext.fireEvent(ComCtxConstants.ROOT_USMART.CONFIG_DATA_DEFAULT_CLOSED);
330
+ }
331
+ showProfilePage() {
332
+ if (this._userService.isSinhVienAccount()) {
333
+ return false;
334
+ }
335
+ return true;
336
+ }
337
+ login() {
338
+ this.rootContext.fireEvent('LOGIN');
339
+ }
340
+ setNotify(message) {
341
+ this.message = message;
342
+ }
343
+ handleMouseOver(evt) {
344
+ evt.target.stop();
345
+ }
346
+ handleMouseOut(evt) {
347
+ evt.target.start();
348
+ }
349
+ showNotificationReload() {
350
+ this.message = 'Hệ thống có phiên bản mới, hãy refresh trình duyệt để cập nhật';
351
+ this.rootContext.fireEvent(ComCtxConstants.ROOT.SHOW_REJECT_CONFIRM, false);
352
+ this._notifierService.showConfirm(this.message).then(res => {
353
+ this.reloadWindow();
354
+ });
355
+ // if (this.intervalCountdown) {
356
+ // clearInterval(this.intervalCountdown);
357
+ // }
358
+ // const date = new Date();
359
+ // const goalDate = (new Date(date.getTime() + 10 * 1000)).getTime(); // Đếm 10s
360
+ // this.intervalCountdown = setInterval(f => {
361
+ // const now = new Date().getTime();
362
+ // const distance = goalDate - now;
363
+ // var seconds = Math.floor(distance / 1000);
364
+ // // If the count down is finished, write some text
365
+ // if (distance < 0) {
366
+ // clearInterval(this.intervalCountdown);
367
+ // this.reloadWindow();
368
+ // return;
369
+ // }
370
+ // let message = `Trình duyệt sẽ khởi động lại sau ${seconds}s`;
371
+ // if (seconds < 1) {
372
+ // message = 'Trình duyệt sẽ khởi động lại ngay bây giờ';
373
+ // }
374
+ // this._notifierService.showConfirm(
375
+ // message, null, null, false, this._translateService.instant('CONFIRM.ACCEPT_LABEL'),
376
+ // 'pi pi-check'
377
+ // ).then(res => {
378
+ // clearInterval(this.intervalCountdown);
379
+ // this.reloadWindow();
380
+ // });
381
+ // }, 1000);
382
+ }
383
+ reloadWindow() {
384
+ top.location.reload();
385
+ }
386
+ }
387
+ AppTopBarV2Component.decorators = [
388
+ { type: Component, args: [{
389
+ selector: 'app-topbar-v2',
390
+ template: "<div class=\"topbar clearfix tn-l-top-bar\">\r\n <div class=\"topbar-left tn-l-top-bar-left\" [ngClass]=\"{'beta-version': !environment.isProduction }\">\r\n <div class=\"tn-l-left-menu-toggle-block\">\r\n <a tabindex=\"1\" id=\"menu-button\" class=\"tn-l-left-menu-toggle\" href=\"#\"\r\n (click)=\"_commonService.onMenuButtonClick($event)\">\r\n <i class=\"pi pi-chevron-left\"></i>\r\n </a>\r\n </div>\r\n\r\n <div class=\"topbar-logo tn-l-logo-wrapper\">\r\n <a tabindex=\"2\" href=\"javascript:\" style=\"display: inline-block;\">\r\n <img class=\"topbar-logo tn-l-logo\" [src]=\"environment.appMetadata.main.logo\" (click)=\"goToHome()\" /></a>\r\n </div>\r\n <div class=\"topbar-title tn-l-logo-title-block\">\r\n <div class=\"topbar-owner\">\r\n {{environment.appMetadata.main.owner}}\r\n </div>\r\n <div class=\"topbar-description\">\r\n {{environment.appMetadata.main.title}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"setting-default-container\">\r\n <ng-container *ngIf=\"showDefaultSetting && currentUser\">\r\n <a tabindex=\"3\" href=\"javascript:void(0)\" class=\"tn-l-m-default-setting pi pi-cog\"\r\n (click)=\"settingDefault()\">\r\n </a>\r\n <h3 class=\"tn-l-default-detting\" (click)=\"settingDefault()\">\r\n {{defaultDataSetting}} <i class=\"pi pi-pencil\" style=\"margin-left:10px\"></i></h3>\r\n </ng-container>\r\n </div>\r\n <div #notify class=\"notify-message\">\r\n <marquee (mouseover)=\"handleMouseOver($event)\" (mouseout)=\"handleMouseOut($event)\">{{message}}</marquee>\r\n </div>\r\n <div class=\"topbar-right tn-l-top-bar-right\" [ngClass]=\"{'beta-version': !environment.isProduction}\"\r\n oncontextmenu=\"return false\">\r\n <div class=\"tn-l-top-bar-right-block-1\">\r\n <a tabindex=\"4\" class=\"topbar-menu-button\" id=\"topbar-menu-button\" href=\"#\"\r\n (click)=\"_commonService.onTopbarMenuButtonClick($event)\">\r\n <svg focusable=\"false\" class=\"tn-m-topbar-menu-toggle\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 448 512\">\r\n <path fill=\"currentColor\"\r\n d=\"M0 224h192V32H0v192zm256-192v192h192V32H256zM0 480h192V288H0v192zm256-192v192h192V288H256z\">\r\n </path>\r\n </svg>\r\n <span *ngIf=\"messages.totalUnRead > 0\" class=\"topbar-badge animated rubberBand\"\r\n [ngClass]=\"{'topbar-badge-bounce': messages.bounceNoti}\">{{messages.totalUnRead}}</span>\r\n </a>\r\n </div>\r\n\r\n <div class=\"tn-l-top-bar-right-block-2\">\r\n <ul class=\"topbar-items fadeInDown\" [ngClass]=\"{'topbar-items-visible': _commonService.topbarMenuActive}\">\r\n <li #profile class=\"profile-item tn-l-top-bar-menu-item\"\r\n *ngIf=\"_commonService.profileMode==='top'||_commonService.isHorizontal()\"\r\n [ngClass]=\"{'active-top-menu':_commonService.activeTopbarItem === profile}\">\r\n\r\n <a href=\"#\" tabindex=\"10\" class=\"UserPane tn-l-top-bar-menu-item-inner\"\r\n (click)=\"_commonService.onTopbarItemClick($event,profile)\">\r\n <div class=\"profile-image-wrapper topbar-icon-left\">\r\n <img class=\"profile-image tn-l-profile-img\" [src-fallback]=\"defaultAvatar\"\r\n [src]=\"getCurrentUserAvatar()\" />\r\n </div>\r\n <div class=\"profile-info-wrapper\">\r\n <div class=\"topbar-item-name-wrapper\"\r\n [ngClass]=\"{'not-show-position': !getCurrentUserPosition()}\">\r\n <span class=\"topbar-item-name tn-l-user-name\">{{getCurrentUserFullName()}}</span>\r\n </div>\r\n <div class=\"topbar-item-role-wrapper tn-l-topbar-item-role-wrapper\"><span\r\n class=\"topbar-item-role\">{{getCurrentUserPosition()}}</span></div>\r\n </div>\r\n <i class=\"pi pi-user\" style=\"opacity: 0; position: absolute;\"></i>\r\n </a>\r\n\r\n <ul class=\"layout-menu fadeInDown tn-l-switcher\">\r\n <li *ngIf=\"currentUser\" role=\"menuitem\">\r\n <a href=\"javascript:;\" (click)=\"onTopbarLogout()\">\r\n <i class=\"pi pi-sign-out\"></i>\r\n <span>\u0110\u0103ng xu\u1EA5t</span>\r\n </a>\r\n </li>\r\n <li *ngIf=\"!currentUser\" role=\"menuitem\">\r\n <a href=\"javascript:;\" (click)=\"login()\">\r\n <i class=\"pi pi-sign-in\"></i>\r\n <span>\u0110\u0103ng nh\u1EADp</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li #help class=\"menu-help tn-l-top-bar-menu-item\" tn-app-help></li>\r\n <li id=\"li-notifications\" class=\"tn-l-top-bar-menu-item\" #messages\r\n [ngClass]=\"{'active-top-menu':_commonService.activeTopbarItem === messages || _commonService.activeTopbarItem === 0}\"\r\n tn-app-notification (openMenu)=\"_commonService.onTopbarItemClick($event,messages)\"></li>\r\n <li id=\"li-app-switcher\" class=\"tn-l-top-bar-menu-item\" #modules\r\n [ngClass]=\"{'active-top-menu':_commonService.activeTopbarItem === modules || _commonService.activeTopbarItem === 1}\">\r\n <a href=\"#\" tabindex=\"7\" class=\"tn-l-top-bar-menu-item-inner\" style=\"height: 30px;\"\r\n pTooltip=\"Danh s\u00E1ch ph\u00E2n h\u1EC7\" tooltipPosition=\"bottom\"\r\n (click)=\"_commonService.onTopbarItemClick($event,modules)\">\r\n <span class=\"topbar-icon-left tn-l-topbar-icon-left\">\r\n <svg focusable=\"false\" class=\"topbar-icon animated swing svgmodule\" role=\"img\"\r\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\r\n <path fill=\"currentColor\"\r\n d=\"M0 224h192V32H0v192zm256-192v192h192V32H256zM0 480h192V288H0v192zm256-192v192h192V288H256z\">\r\n </path>\r\n </svg>\r\n <!-- <i class=\"pi pi-microsoft\"></i> -->\r\n </span>\r\n <span class=\"topbar-item-name\">{{ 'Danh s\u00E1ch ph\u00E2n h\u1EC7' | translate}}</span>\r\n </a>\r\n <ul class=\"app-switcher layout-menu fadeInDown\">\r\n <tn-custom-scrollbar #scrollbar class=\"app-switcher-holder\">\r\n <li role=\"menuitem\" class=\"wrapper-appswitch\">\r\n <ng-container *ngFor=\"let item of appSwitcherItems; let ind = index;\">\r\n <a class=\"switcher-item tn-l-switcher-item\" href=\"javascript:\"\r\n (click)=\"switchApp(item, true)\">\r\n <span class=\"tn-l-switcher-item-inner\">\r\n <i class=\"{{item.icon}} app-switcher-item-icon tn-l-switcher-item-icon\"></i>\r\n <div class=\"tn-l-switcher-item-label\">\r\n {{ item.title | translate}}\r\n </div>\r\n </span>\r\n </a>\r\n </ng-container>\r\n </li>\r\n </tn-custom-scrollbar>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n</div>",
391
+ providers: [ComponentContextService],
392
+ styles: [".topBarSearchButton:disabled{background-color:#eee!important;border:1px solid #c8c8c8!important;border-right:none!important;color:#c1c1c1!important;opacity:1}::ng-deep app-topbar a{outline:none}input:disabled::-moz-placeholder{color:#b1b1b1}input:disabled:-ms-input-placeholder{color:#b1b1b1}input:disabled::placeholder{color:#b1b1b1}.UserPane.UserPane{display:flex}.profile-image-wrapper{order:1}.tn-l-user-name.tn-l-user-name.tn-l-user-name.tn-l-user-name.tn-l-user-name{float:none;margin-top:0}.profile-info-wrapper.profile-info-wrapper.profile-info-wrapper.profile-info-wrapper{display:inline-flex;flex-direction:column;float:none;justify-content:center;order:0;text-align:right}.tn-l-logo{image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges}.tn-l-default-detting{color:#fff;cursor:pointer;margin:0}.tn-l-left-menu-toggle-block{-ms-grid-row-align:stretch;align-items:center;align-self:stretch;box-shadow:0 0 5px 0 rgba(0,0,0,.3764705882352941);display:flex}.tn-l-left-menu-toggle{color:#fff;padding:8px;transition:transform .25s ease-in-out}::ng-deep .layout-menu-static-inactive app-topbar .tn-l-left-menu-toggle{transform:rotate(180deg)}.tn-l-logo-title-block.tn-l-logo-title-block.tn-l-logo-title-block.tn-l-logo-title-block{margin-left:0;margin-right:30px}.topbar-logo.topbar-logo.topbar-logo{float:none}.tn-l-logo.tn-l-logo.tn-l-logo.tn-l-logo{height:40px;margin:0;width:auto}.tn-l-logo-wrapper.tn-l-logo-wrapper.tn-l-logo-wrapper.tn-l-logo-wrapper{font-size:0;height:auto;margin:0;padding-left:8px;padding-right:8px;width:auto}.tn-l-top-bar{display:flex}.topbar-description,.topbar-owner{white-space:nowrap}.topbar-owner.topbar-owner.topbar-owner.topbar-owner.topbar-owner{font-size:15px}.topbar-description.topbar-description.topbar-description.topbar-description.topbar-description{font-size:11px;text-transform:none}.tn-l-top-bar-left.tn-l-top-bar-left.tn-l-top-bar-left{display:flex;float:none;width:auto}.tn-l-top-bar-left{align-items:center}.tn-m-topbar-menu-toggle{display:block;height:28px;margin:auto;width:30px}.tn-m-topbar-menu-toggle g{stroke:#fff}.tn-m-topbar-menu-toggle path{fill:#fff}.tn-l-m-default-setting{display:none}.setting-default-container{justify-content:center}.notify-message,.setting-default-container{align-items:center;display:flex;margin-left:30px}.notify-message{flex:1 1;overflow:hidden}.notify-message>marquee{color:#ff0;font-size:500;white-space:nowrap}.search-item{margin-right:10px}.tn-l-switcher-item.tn-l-switcher-item.tn-l-switcher-item{background:#fff}.tn-l-switcher-item-label{color:#52abff;text-align:center;text-shadow:none}.tn-l-switcher-item-icon.tn-l-switcher-item-icon.tn-l-switcher-item-icon.tn-l-switcher-item-icon{color:#52abff;font-size:38px;margin:5px auto;text-shadow:none}.tn-l-switcher-item.tn-l-switcher-item.tn-l-switcher-item.tn-l-switcher-item.tn-l-switcher-item{padding:8px}.tn-l-switcher.tn-l-switcher{margin-bottom:0}::ng-deep .layout-wrapper app-topbar-v2 .layout-menu li a.switcher-item{margin-top:0;width:unset}::ng-deep .layout-wrapper app-topbar-v2 .layout-menu li a.switcher-item:nth-child(3n+0){border-left:none}::ng-deep .layout-wrapper app-topbar-v2 .layout-menu li a.switcher-item:nth-child(3n+1){border-right:none}::ng-deep .layout-wrapper app-topbar-v2 .layout-menu li a.switcher-item:nth-child(3n+2){border:none}::ng-deep .layout-wrapper app-topbar-v2 .layout-menu li a.switcher-item:nth-child(3n+1):last-child,::ng-deep .layout-wrapper app-topbar-v2 .layout-menu li a.switcher-item:nth-child(3n+2):last-child{width:unset}::ng-deep .layout-wrapper app-topbar-v2 .layout-menu li a span{line-height:1.2}::ng-deep .layout-wrapper app-topbar-v2 .topbar .topbar-left{box-shadow:none}::ng-deep .layout-wrapper app-topbar-v2 .wrapper-appswitch{display:-ms-grid;display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));text-align:center}@media (max-width:1024px){::ng-deep .layout-wrapper app-topbar-v2 .layout-menu li a.switcher-item{width:unset}}@media (min-width:1025px){.tn-l-top-bar-right{align-items:center;display:flex;justify-content:space-between}.tn-l-top-bar-right.tn-l-top-bar-right.tn-l-top-bar-right{padding:0 15px}.topbar-items.topbar-items.topbar-items{align-items:center;display:flex;flex-direction:row-reverse;justify-content:flex-start;margin:0}.topbar-items.topbar-items.topbar-items,.topbar-items.topbar-items.topbar-items>li{float:none}::ng-deep .topbar .topbar-items>li>a{margin-top:0}::ng-deep .topbar .topbar-items>li>a>span>i{color:#fff;font-size:24px}.topbar .topbar-items>li>a.UserPane{height:auto;line-height:inherit;top:0}a.UserPane .profile-image.profile-image.profile-image.profile-image{margin-top:0}}@media (min-width:1025px) and (max-width:1400px){.tn-l-logo-title-block.tn-l-logo-title-block.tn-l-logo-title-block.tn-l-logo-title-block{margin-right:19px}.search-item{margin-right:0}.tn-l-top-bar-right.tn-l-top-bar-right.tn-l-top-bar-right{padding-left:15px}.topbar-items>li.profile-item{margin-left:14px}}@media (max-width:1024px){.tn-l-m-default-setting{align-items:center;color:#fff;display:flex;font-size:28px;height:36px;justify-content:center;width:36px}.tn-l-default-detting{display:none}::ng-deep .layout-menu-static-mobile-inactive app-topbar .tn-l-left-menu-toggle{transform:rotate(180deg)}.profile-info-wrapper.profile-info-wrapper.profile-info-wrapper.profile-info-wrapper{text-align:left}.topbar .topbar-right #topbar-menu-button{align-items:center;display:flex;justify-content:center;width:36px}.tn-l-top-bar-right-block-1{display:flex}.tn-l-logo-wrapper.tn-l-logo-wrapper.tn-l-logo-wrapper.tn-l-logo-wrapper{padding-left:5px;padding-right:5px}.tn-l-logo-title-block,.tn-l-top-bar-left,.topbar-description,.topbar-owner{overflow:hidden}.topbar-description,.topbar-owner{text-overflow:ellipsis}.tn-l-top-bar-menu-item:empty{display:none}.tn-l-top-bar-left.tn-l-top-bar-left.tn-l-top-bar-left{padding-left:0;padding-right:0}.topbar-title.topbar-title.topbar-title.topbar-title{margin:0}.topbar-owner.topbar-owner.topbar-owner.topbar-owner.topbar-owner{font-size:14px}.topbar-description.topbar-description.topbar-description.topbar-description.topbar-description{font-size:10px}.tn-l-top-bar-right{flex:1;position:relative}.topbar-menu-button span.topbar-badge{right:-4px}.tn-l-top-bar-right.tn-l-top-bar-right.tn-l-top-bar-right{align-items:center;display:flex;justify-content:flex-end;padding:0 .5em}.tn-l-top-bar-right.tn-l-top-bar-right.tn-l-top-bar-right #topbar-menu-button{margin-left:.5em;position:relative;right:0;top:0}.app-switcher.layout-menu.layout-menu.layout-menu.layout-menu{width:270px}.profile-image-wrapper{order:0}.tn-l-user-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:220px}::ng-deep app-topbar .tn-l-top-bar-menu-item .topbar-icon-left{align-items:center;display:flex;justify-content:center}.tn-l-topbar-item-role-wrapper{display:none}}"]
393
+ },] }
394
+ ];
395
+ AppTopBarV2Component.ctorParameters = () => [
396
+ { type: CustomRouterService },
397
+ { type: Router },
398
+ { type: CommonService },
399
+ { type: AuthenService },
400
+ { type: ChangeDetectorRef },
401
+ { type: Injector },
402
+ { type: PermissionService },
403
+ { type: ModuleConfigService },
404
+ { type: UserService },
405
+ { type: NotifierService },
406
+ { type: TranslateService }
407
+ ];
408
+ AppTopBarV2Component.propDecorators = {
409
+ input: [{ type: ViewChild, args: ['input',] }],
410
+ notify: [{ type: ViewChild, args: ['notify', { static: true },] }]
411
+ };
412
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvcGJhci12Mi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG54LXNoYXJlZC9zcmMvbGliLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9jb21tb24tYXBwLWNvbXBvbmVudC9hcHAtdG9wYmFyLXYyL2FwcC10b3BiYXItdjIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUU5RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFRN0QsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGFBQWE7SUEwQm5EO0lBQ0ksNEJBQTRCO0lBQ3BCLG1CQUF3QyxFQUN4QyxPQUFl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RGIsYUFBYTtZQVJiLGlCQUFpQjtZQUF5QixRQUFRO1lBYWxELGlCQUFpQjtZQUZqQixtQkFBbUI7WUFHbkIsV0FBVztZQUZYLGVBQWU7WUFWZixnQkFBZ0I7OztvQkFxQnBCLFNBQVMsU0FBQyxPQUFPO3FCQUNqQixTQUFTLFNBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBwLWNvbnRleHQvY29tcG9uZW50LWNvbnRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Jhc2UvY29tcG9uZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi8uLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuaW1wb3J0IHsgVG5Vc2VyIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RuLXVzZXInO1xyXG5pbXBvcnQgeyBBdXRoZW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aGVuLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21Sb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3VzdG9tLXJvdXRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTW9kdWxlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21vZHVsZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IE5vdGlmaWVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3Blcm1pc3Npb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdhcHAtdG9wYmFyLXYyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9hcHAtdG9wYmFyLXYyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2FwcC10b3BiYXItdjIuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0NvbXBvbmVudENvbnRleHRTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwVG9wQmFyVjJDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnKSBpbnB1dDogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ25vdGlmeScsIHsgc3RhdGljOiB0cnVlIH0pIG5vdGlmeTogRWxlbWVudFJlZjtcclxuXHJcbiAgICBkZWZhdWx0QXZhdGFyID0gJyc7XHJcbiAgICBlbnZpcm9ubWVudDogYW55O1xyXG5cclxuICAgIHNob3dEZWZhdWx0U2V0dGluZzogYW55O1xyXG4gICAga2V5ID0gJyc7XHJcblxyXG4gICAgY3VycmVudFJvdXRlID0gJyc7XHJcbiAgICBmaWxlQXBpID0gJyc7XHJcblxyXG4gICAgY3VycmVudFVzZXI6IGFueSA9IG51bGw7XHJcbiAgICBhcHBTd2l0Y2hlckl0ZW1zOiBhbnkgPSBbXTtcclxuICAgIGlzRmlyc3RUaW1lID0gZmFsc2U7XHJcblxyXG4gICAgc2VhcmNoRGF0YTtcclxuICAgIHNob3dTZXR0aW5ncyA9IGZhbHNlO1xyXG4gICAgYWxsU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICAgIGRlZmF1bHREYXRhU2V0dGluZzogc3RyaW5nO1xyXG4gICAgdXNlclByb2ZpbGU6IGFueTtcclxuXHJcbiAgICBtZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuICAgIGludGVydmFsQ291bnRkb3duOiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgLy8gcHVibGljIGFwcDogQXBwQ29tcG9uZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2N1c3RvbVJvdXRlU2VydmljZTogQ3VzdG9tUm91dGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBwdWJsaWMgX2NvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfYXV0aGVuU2VydmljZTogQXV0aGVuU2VydmljZSxcclxuICAgICAgICBwcm90ZWN0ZWQgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBfaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIHByaXZhdGUgX3Blcm1pc3Npb25TZXJ2aWNlOiBQZXJtaXNzaW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9tb2R1bGVDb25maWdTZXJ2aWNlOiBNb2R1bGVDb25maWdTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpLmVudmlyb25tZW50O1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdEF2YXRhciA9IHRoaXMuZW52aXJvbm1lbnQuYXBwTWV0YWRhdGEubWFpbi5kZWZhdWx0TWFsZUF2YXRhcjtcclxuXHJcbiAgICAgICAgdGhpcy5maWxlQXBpID0gdGhpcy5lbnZpcm9ubWVudC5hcGlEb21haW4uZmlsZUVuZHBvaW50O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YSAmJiB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhLnNob3dEZWZhdWx0U2V0dGluZyAhPSBudWxsICYmIHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50QXBwTWV0YWRhdGEuc2hvd0RlZmF1bHRTZXR0aW5nICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dEZWZhdWx0U2V0dGluZyA9IHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50QXBwTWV0YWRhdGEuc2hvd0RlZmF1bHRTZXR0aW5nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuYXBwTWV0YWRhdGEubWFpbi5zaG93RGVmYXVsdFNldHRpbmcgIT0gbnVsbCAmJiB0aGlzLmVudmlyb25tZW50LmFwcE1ldGFkYXRhLm1haW4uc2hvd0RlZmF1bHRTZXR0aW5nICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RGVmYXVsdFNldHRpbmcgPSB0aGlzLmVudmlyb25tZW50LmFwcE1ldGFkYXRhLm1haW4uc2hvd0RlZmF1bHRTZXR0aW5nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RGVmYXVsdFNldHRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIgPSB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRoaXMuYWxsU3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfSU5GT19DSEFOR0VELCBycyA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAvLyB9KSk7XHJcblxyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQucmVwbGF5U3Vic2NyaWJlT25jZShDb21DdHhDb25zdGFudHMuUk9PVC5VU0VSX0xPQURFRCwgcnMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gdGhpcy5fdXNlclNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKSBhcyBUblVzZXI7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZE1lbnVNZXRhZGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yb290TW9kZWwuYWxsb3dBbm9ueW1vdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkTWVudU1ldGFkYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvYWRNZW51TWV0YWRhdGEoKSB7XHJcbiAgICAgICAgY29uc3QgcHJtc0FwcFN3aWNoZXJJdGVtID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpbmQgaW4gdGhpcy5lbnZpcm9ubWVudC5hcHBNZXRhZGF0YS5hcHBTd2l0Y2hlcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZW52aXJvbm1lbnQuYXBwTWV0YWRhdGEuYXBwU3dpdGNoZXJbaW5kXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudElkID0gdGhpcy5lbnZpcm9ubWVudC5hdXRoZW50aWNhdGlvblNldHRpbmdzLmNsaWVudElkO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3RDb250ZXh0LmRhdGEuYWxsb3dBbm9ueW1vdXMgJiYgZWxlbWVudC5hbGxvd0Fub255bW91cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBdXRob3JpemVkID0gYXdhaXQgdGhpcy5fcGVybWlzc2lvblNlcnZpY2UuaXNBdXRob3JpemVkKGVsZW1lbnQuY29kZSwgYCR7ZWxlbWVudC5jb2RlfS5NT0RVTEUuJHtlbGVtZW50LmNvZGV9YC50b1VwcGVyQ2FzZSgpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXV0aG9yaXplZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc29sdmUoYXJyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcHJtc0FwcFN3aWNoZXJJdGVtLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICBpZiAocnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gdGhpcy5fdXNlclNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKSBhcyBUblVzZXI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFwcFN3aXRjaGVySXRlbXMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgICAgICg8YW55PnJzKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYWxsb3dBbm9ueW1vdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwU3dpdGNoZXJJdGVtcy5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRVc2VyLm1hTmd1b2lIb2MgJiYgY3VycmVudFVzZXIuaXNzdXBlcnVzZXIgJiYgY3VycmVudFVzZXIuaXNzdXBlcnVzZXIudG9Mb3dlckNhc2UoKSAhPSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jb2RlLnRvTG93ZXJDYXNlKCkgPT0gJ3N2JyB8fCBlbGVtZW50LmNvZGUudG9Mb3dlckNhc2UoKSA9PSAndXNlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBTd2l0Y2hlckl0ZW1zLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBTd2l0Y2hlckl0ZW1zLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlci5nZW5kZXIgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QXZhdGFyID0gdGhpcy5lbnZpcm9ubWVudC5hcHBNZXRhZGF0YS5tYWluLmRlZmF1bHRGZW1hbGVBdmF0YXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRBdmF0YXIgPSB0aGlzLmVudmlyb25tZW50LmFwcE1ldGFkYXRhLm1haW4uZGVmYXVsdE1hbGVBdmF0YXI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMudXNlclByb2ZpbGUgPSB0aGlzLl91c2VyU2VydmljZS5nZXRQcm9maWxlSW5mbygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5CT0RZX01PVVNFX0RPV04sIChlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlQWR2YW5jZVNlYXJjaChlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULktFWV9ET1dOX0NUUkxfRiwgKGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c1RvU2VhcmNoQm94KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5GT1JDRV9SRUxPQUQsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvblJlbG9hZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5DT01NT04uU0hPV19OT1RJRlksIChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Tm90aWZ5KGUubWVzc2FnZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hbGxTdWJzY3JpcHRpb25zLnB1c2godGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1RfVVNNQVJULlNIT1dfQ09ORklHX0RBVEFfREVGQVVMVCwgZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YU1vZGVsU2V0dGluZy5zaG93U2V0dGluZ3MgPSB0cnVlO1xyXG4gICAgICAgIH0pKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmRhdGFNb2RlbFNldHRpbmcgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHt9LFxyXG4gICAgICAgICAgICBzaG93U2V0dGluZ3M6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuQ09NTU9OLlNBVkVfREFUQV9ERUZBVUxULCBkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtYXREZWZhdWx0RGF0YVNldHRpbmcoZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkV2luZG93KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3Qgc3RyaW5nRGF0YURlZmF1bHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5ERUZBVUxUX0RBVEEpO1xyXG4gICAgICAgIGlmIChzdHJpbmdEYXRhRGVmYXVsdCkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhQ2FjaGVEZWZhdWx0ID0gSlNPTi5wYXJzZShzdHJpbmdEYXRhRGVmYXVsdCk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0RGVmYXVsdERhdGFTZXR0aW5nKGRhdGFDYWNoZURlZmF1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0RGF0YVNldHRpbmcgPSAnVGhp4bq/dCBs4bqtcCB0aGFtIHPhu5EgbeG6t2MgxJHhu4tuaCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWxsU3Vic2NyaXB0aW9ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxDb3VudGRvd24pIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsQ291bnRkb3duKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtYXREZWZhdWx0RGF0YVNldHRpbmcoZGF0YSkge1xyXG4gICAgICAgIGxldCBkYXRhU2V0dGluZyA9ICcnO1xyXG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IFsnaW5zdGFuY2VJZEhlRGFvVGFvJywgJ2hlRGFvVGFvJywgJ25hbUhvYycsICdob2NLeScsICdpbnN0YW5jZUlkTmFtSG9jJywgJ2luc3RhbmNlSWRIb2NLeScsICdpZERvdFRoaSddO1xyXG4gICAgICAgIGNvbnN0IGZpZWxkUGx1c2VzID0gWydjb2RlJywgJ2NvZGUnLCAndGVuJywgJ3RlbicsICd0ZW4nLCAndGVuJywgJ3RlbiddO1xyXG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSGlkZGVuKGZpZWxkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgX2YgPSBgJHtmaWVsZH0ke2ZpZWxkUGx1c2VzW2luZGV4XX1gO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGFbX2ZdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YVNldHRpbmcgKz0gZGF0YVtfZl0gKyAnLyc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoZGF0YVNldHRpbmcubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBkYXRhU2V0dGluZyA9IGRhdGFTZXR0aW5nLnN1YnN0cmluZygwLCBkYXRhU2V0dGluZy5sZW5ndGggLSAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RGF0YVNldHRpbmcgPSBkYXRhU2V0dGluZztcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0hpZGRlbihmaWVsZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvb3RNb2RlbC5jdXJyZW50QXBwTWV0YWRhdGEuY29uZmlnRGVmYXVsdFNldHRpbmcgJiYgIXRoaXMucm9vdE1vZGVsLmN1cnJlbnRBcHBNZXRhZGF0YS5jb25maWdEZWZhdWx0U2V0dGluZy5jb2x1bW4uc29tZShwID0+IHAuZmllbGQgPT0gZmllbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRVc2VyRnVsbE5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlciAmJiB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIuZnVsbE5hbWUgPyB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIuZnVsbE5hbWUgOiAnS2jDoWNoJztcclxuICAgIH1cclxuXHJcbiAgICBnZXRDdXJyZW50VXNlclBvc2l0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJQcm9maWxlID8gdGhpcy51c2VyUHJvZmlsZS50ZW5Eb25WaSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFVzZXJBdmF0YXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlciAmJiB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIuYXZhdGFyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmZpbGVBcGl9L2ZpbGUvcHVibGljLyR7dGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRVc2VyLmF2YXRhcn0vRG93bmxvYWRgO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEF2YXRhcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJGaWx0ZXIoaW5wdXQpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWFyY2hNb2RlbFt0aGlzLm1vZGVsLmZpZWxkS2V5XSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZVNlcnZpY2UudXBkYXRlRnJhZ21lbnQodGhpcy5tb2RlbC5maWVsZEtleSwgbnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVJvdXRlU2VydmljZS51cGRhdGVXaXRob3V0RmlyZUV2ZW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULk9OX1NFQVJDSCwgdGhpcy5tb2RlbC5zZWFyY2hNb2RlbCk7XHJcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVBZHZhbmNlU2VhcmNoKGV2dCkge1xyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULkFEVkFOQ0VfU0VBUkNIX1RPR0dMRV9CT1gsIHsgZXZlbnQ6IGV2dCB9KTtcclxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlQWR2YW5jZVNlYXJjaChldnQpIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkdmFuY2Utc2VhcmNoLWJveCcpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hc2s6IGFueSA9IGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbCgnZGl2W2NsYXNzfj1cInVpLWRpYWxvZy1tYXNrXCJdJyk7XHJcbiAgICAgICAgICAgIGlmICghbWFzay5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsb3Nlc3REcm9wZG93biA9IGV2dC50YXJnZXQuY2xvc2VzdCgnLmRyb3Bkb3duLWFkdnMnKTtcclxuICAgICAgICAgICAgICAgIGlmIChjbG9zZXN0RHJvcGRvd24gPT0gbnVsbCB8fCBjbG9zZXN0RHJvcGRvd24ubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5BRFZBTkNFX1NFQVJDSF9ISURFX0JPWCwgeyBldmVudDogZXZ0IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzVG9TZWFyY2hCb3goKSB7XHJcbiAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3IoJ2RpdltjbGFzc349XCJ1aS1kaWFsb2ctbWFza1wiXScpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblRvcGJhclNlYXJjaENsaWNrKGV2ZW50LCBpbnB1dCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2RlbC5maWVsZEtleSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5PTl9TRUFSQ0gsIHRoaXMubW9kZWwuc2VhcmNoTW9kZWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZVNlcnZpY2UudXBkYXRlRnJhZ21lbnQodGhpcy5tb2RlbC5maWVsZEtleSwgaW5wdXQudmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZVNlcnZpY2UudXBkYXRlV2l0aG91dEZpcmVFdmVudCgpO1xyXG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRXNjKGV2ZW50LCBpbnB1dCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJGaWx0ZXIoaW5wdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRW50ZXIoZXZlbnQsIGlucHV0KSB7XHJcbiAgICAgICAgdGhpcy5vblRvcGJhclNlYXJjaENsaWNrKGV2ZW50LCBpbnB1dCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoQXBwKGl0ZW0sIG9wZW5OZXdUYWIgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChpdGVtLnRhcmdldCA9PSAnX2JsYW5rJykge1xyXG4gICAgICAgICAgICBpZiAoIWl0ZW0uZGVmYXVsdFJlZGlyZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmRlZmF1bHRSZWRpcmVjdCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBOYW1OSCB0aXAgdHJpY2sgY2hvIG1vdCBzbyBtYXkgYmkgbG9pIGl0ZW0udXJsID0gJ21haW4nIC0+IHJlZGlyZWN0IHNhaSBraGkgY2xpY2sgdmFvIGNhYyBwaGFuIGhlXHJcbiAgICAgICAgICAgIGlmIChpdGVtLnVybCA9PSBpdGVtLmRlZmF1bHRSZWRpcmVjdCkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS51cmwgPSAnLycgKyBpdGVtLmNvZGUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFvcGVuTmV3VGFiKSB7XHJcbiAgICAgICAgICAgICAgICB0b3AubG9jYXRpb24uaHJlZiA9IGAke2l0ZW0udXJsfS8ke2l0ZW0uZGVmYXVsdFJlZGlyZWN0fWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihgJHtpdGVtLnVybH0vJHtpdGVtLmRlZmF1bHRSZWRpcmVjdH1gLCAnX2JsYW5rJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmRlZmF1bHRSZWRpcmVjdCAhPSAnJyAmJiAhdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLm1lbnVUb3BPcGVubmluZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlQnlVcmwoaXRlbS5kZWZhdWx0UmVkaXJlY3QpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YSA9IHRoaXMuZW52aXJvbm1lbnQuYXBwTWV0YWRhdGEuYXBwU3dpdGNoZXIuZmluZCh4ID0+IHguY29kZSA9PSBpdGVtLmNvZGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50QXBwTWV0YWRhdGFcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhLnNob3dEZWZhdWx0U2V0dGluZyAhPSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhLnNob3dEZWZhdWx0U2V0dGluZyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RGVmYXVsdFNldHRpbmcgPSB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhLnNob3dEZWZhdWx0U2V0dGluZyAmJiB0aGlzLnNob3dEZWZhdWx0U2V0dGluZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYXNBZHZhbmNlU2VhcmNoQm94KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLnNlYXJjaE1vZGVsLmhhc0FkdmFuY2VTZWFyY2g7XHJcbiAgICB9XHJcblxyXG4gICAgaXNBZHZhbmNlU2VhcmNoaW5nKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhhc0FkdmFuY2VTZWFyY2hWYWx1ZSh0aGlzLm1vZGVsLnNlYXJjaE1vZGVsKTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNBZHZhbmNlU2VhcmNoVmFsdWUob2JqKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdfaycgfHwga2V5ID09PSAnaGFzQWR2YW5jZVNlYXJjaCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvYmpba2V5XSAhPSBudWxsICYmIG9ialtrZXldICE9ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudElkKCkge1xyXG4gICAgICAgIHJldHVybiAnVE9QQkFSJztcclxuICAgIH1cclxuXHJcbiAgICBnb1RvSG9tZSgpIHtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudCgnR09fSE9NRScpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRWRpdEluZm8oZXZlbnQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRBcHBTZXR0aW5nID0gdGhpcy5lbnZpcm9ubWVudC5hcHBNZXRhZGF0YS5hcHBTd2l0Y2hlci5maW5kKHggPT4geC5jb2RlID09ICdVU0VSJyk7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRBcHBTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3dpdGNoQXBwKGN1cnJlbnRBcHBTZXR0aW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0LhuqFuIGNoxrBhIHRoaeG6v3QgbOG6rXAgbWV0YWRhdGEgY2hvIHRyYW5nIGPDoSBuaMOibicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZVBhc3N3b3JkKGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAvLyB0aGlzLmNoYW5nZVBhc3N3b3JkLnNob3dQb3B1cCh0aGlzLl91c2VyU2VydmljZS5nZXRJZCgpKTtcclxuICAgIH1cclxuICAgIG9uVG9wYmFyTG9nb3V0KCkge1xyXG4gICAgICAgIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2N1cnJlbnRVcmwnKSkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY3VycmVudFVybCcsIHRvcC5sb2NhdGlvbi5ocmVmKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYXV0aGVuU2VydmljZS5sb2dvdXQoKTtcclxuICAgIH1cclxuICAgIHNldHRpbmdEZWZhdWx0KCkge1xyXG4gICAgICAgIHRoaXMubW9kZWwuZGF0YU1vZGVsU2V0dGluZyA9IHtcclxuICAgICAgICAgICAgZGF0YToge30sXHJcbiAgICAgICAgICAgIHNob3dTZXR0aW5nczogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBvblNob3dTZXR0aW5ncyhldikge1xyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09UX1VTTUFSVC5DT05GSUdfREFUQV9ERUZBVUxUX09QRU5FRCk7XHJcbiAgICB9XHJcbiAgICBvbkNsb3NlU2V0dGluZ3MoZXYpIHtcclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVF9VU01BUlQuQ09ORklHX0RBVEFfREVGQVVMVF9DTE9TRUQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dQcm9maWxlUGFnZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdXNlclNlcnZpY2UuaXNTaW5oVmllbkFjY291bnQoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxvZ2luKCkge1xyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KCdMT0dJTicpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldE5vdGlmeShtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZU1vdXNlT3ZlcihldnQpIHtcclxuICAgICAgICBldnQudGFyZ2V0LnN0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVNb3VzZU91dChldnQpIHtcclxuICAgICAgICBldnQudGFyZ2V0LnN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd05vdGlmaWNhdGlvblJlbG9hZCgpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnSOG7hyB0aOG7kW5nIGPDsyBwaGnDqm4gYuG6o24gbeG7m2ksIGjDo3kgcmVmcmVzaCB0csOsbmggZHV54buHdCDEkeG7gyBj4bqtcCBuaOG6rXQnO1xyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULlNIT1dfUkVKRUNUX0NPTkZJUk0sIGZhbHNlKTtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0NvbmZpcm0oXHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVxyXG4gICAgICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZFdpbmRvdygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBpZiAodGhpcy5pbnRlcnZhbENvdW50ZG93bikge1xyXG4gICAgICAgIC8vICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxDb3VudGRvd24pO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAvLyBjb25zdCBnb2FsRGF0ZSA9IChuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSArIDEwICogMTAwMCkpLmdldFRpbWUoKTsgLy8gxJDhur9tIDEwc1xyXG4gICAgICAgIC8vIHRoaXMuaW50ZXJ2YWxDb3VudGRvd24gPSBzZXRJbnRlcnZhbChmID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGRpc3RhbmNlID0gZ29hbERhdGUgLSBub3c7XHJcbiAgICAgICAgLy8gICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihkaXN0YW5jZSAvIDEwMDApO1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gSWYgdGhlIGNvdW50IGRvd24gaXMgZmluaXNoZWQsIHdyaXRlIHNvbWUgdGV4dFxyXG4gICAgICAgIC8vICAgICBpZiAoZGlzdGFuY2UgPCAwKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxDb3VudGRvd24pO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5yZWxvYWRXaW5kb3coKTtcclxuICAgICAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICAgICBsZXQgbWVzc2FnZSA9IGBUcsOsbmggZHV54buHdCBz4bq9IGto4bufaSDEkeG7mW5nIGzhuqFpIHNhdSAke3NlY29uZHN9c2A7XHJcbiAgICAgICAgLy8gICAgIGlmIChzZWNvbmRzIDwgMSkge1xyXG4gICAgICAgIC8vICAgICAgICAgbWVzc2FnZSA9ICdUcsOsbmggZHV54buHdCBz4bq9IGto4bufaSDEkeG7mW5nIGzhuqFpIG5nYXkgYsOieSBnaeG7nSc7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dDb25maXJtKFxyXG4gICAgICAgIC8vICAgICAgICAgbWVzc2FnZSwgbnVsbCwgbnVsbCwgZmFsc2UsIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQ09ORklSTS5BQ0NFUFRfTEFCRUwnKSxcclxuICAgICAgICAvLyAgICAgICAgICdwaSBwaS1jaGVjaydcclxuICAgICAgICAvLyAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxDb3VudGRvd24pO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5yZWxvYWRXaW5kb3coKTtcclxuICAgICAgICAvLyAgICAgfSk7XHJcbiAgICAgICAgLy8gfSwgMTAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkV2luZG93KCkge1xyXG4gICAgICAgIHRvcC5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgIH1cclxuXHJcbn1cclxuIl19