tin-spa 14.3.11 → 14.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/esm2020/lib/classes/Classes.mjs +53 -206
- package/esm2020/lib/classes/LibClasses.mjs +180 -0
- package/esm2020/lib/classes/TinCore.mjs +201 -42
- package/esm2020/lib/components/alert/alert.component.mjs +12 -6
- package/esm2020/lib/components/attach/attach.component.mjs +49 -33
- package/esm2020/lib/components/capsules/capsules.component.mjs +63 -0
- package/esm2020/lib/components/cards/cards.component.mjs +103 -0
- package/esm2020/lib/components/date/date.component.mjs +6 -6
- package/esm2020/lib/components/datetime/datetime.component.mjs +6 -3
- package/esm2020/lib/components/email/email.component.mjs +133 -0
- package/esm2020/lib/components/filter/filter.component.mjs +7 -3
- package/esm2020/lib/components/form/form.component.mjs +155 -53
- package/esm2020/lib/components/html/html.component.mjs +34 -0
- package/esm2020/lib/components/label/label.component.mjs +6 -3
- package/esm2020/lib/components/list-dialog/list-dialog.component.mjs +3 -3
- package/esm2020/lib/components/money/money.component.mjs +26 -9
- package/esm2020/lib/components/multi-select/multi-select.component.mjs +165 -0
- package/esm2020/lib/components/multi-text/multi-text.component.mjs +208 -0
- package/esm2020/lib/components/nav-menu/nav-menu.component.mjs +32 -28
- package/esm2020/lib/components/notes/notes.component.mjs +62 -0
- package/esm2020/lib/components/number/number.component.mjs +23 -8
- package/esm2020/lib/components/option/option.component.mjs +39 -14
- package/esm2020/lib/components/page/page.component.mjs +101 -0
- package/esm2020/lib/components/search/search.component.mjs +10 -5
- package/esm2020/lib/components/select/select.component.mjs +56 -119
- package/esm2020/lib/components/select-bitwise/select-bitwise.component.mjs +87 -0
- package/esm2020/lib/components/select-common/select-common.component.mjs +189 -0
- package/esm2020/lib/components/select-internal/select-internal.component.mjs +75 -0
- package/esm2020/lib/components/select-lite/select-lite.component.mjs +18 -0
- package/esm2020/lib/components/steps/steps.component.mjs +83 -61
- package/esm2020/lib/components/suffix/suffix.component.mjs +70 -0
- package/esm2020/lib/components/table/detailsDialog.component.mjs +179 -37
- package/esm2020/lib/components/table/table.component.mjs +142 -108
- package/esm2020/lib/components/table-action/table-action.component.mjs +42 -8
- package/esm2020/lib/components/table-header/table-header.component.mjs +87 -15
- package/esm2020/lib/components/table-internal/detailsDialog-internal.component.mjs +183 -35
- package/esm2020/lib/components/table-internal/table-internal.component.mjs +144 -109
- package/esm2020/lib/components/table-lite/detailsDialog-lite.component.mjs +371 -0
- package/esm2020/lib/components/table-lite/table-lite.component.mjs +441 -0
- package/esm2020/lib/components/table-row/table-row.component.mjs +41 -6
- package/esm2020/lib/components/text/text.component.mjs +97 -42
- package/esm2020/lib/components/tiles/tiles.component.mjs +44 -26
- package/esm2020/lib/components/viewer/viewer.component.mjs +7 -3
- package/esm2020/lib/components/viewer/viewerDialog.component.mjs +20 -13
- package/esm2020/lib/modules/admin/admin-routing.module.mjs +32 -22
- package/esm2020/lib/modules/index/index-routing.module.mjs +4 -4
- package/esm2020/lib/modules/spa-admin.module.mjs +7 -7
- package/esm2020/lib/modules/spa-index.module.mjs +4 -4
- package/esm2020/lib/modules/spa-user.module.mjs +3 -3
- package/esm2020/lib/modules/user/user-routing.module.mjs +3 -3
- package/esm2020/lib/pages/accounts/accountDialog.component.mjs +56 -0
- package/esm2020/lib/pages/accounts/accounts.component.mjs +70 -0
- package/esm2020/lib/pages/app-models/app-models.component.mjs +56 -0
- package/esm2020/lib/pages/approvals/approvals.component.mjs +19 -0
- package/esm2020/lib/pages/approvals-config/approvals-config.component.mjs +165 -0
- package/esm2020/lib/pages/bug/bug.component.mjs +14 -0
- package/esm2020/lib/pages/change-password/change-password.component.mjs +92 -0
- package/esm2020/lib/pages/create-account/create-account.component.mjs +110 -0
- package/esm2020/lib/pages/customers/customers.component.mjs +21 -0
- package/esm2020/lib/{components → pages}/departments/departments.component.mjs +3 -5
- package/esm2020/lib/pages/employees/employees.component.mjs +20 -0
- package/esm2020/lib/pages/grades/grades.component.mjs +14 -0
- package/esm2020/lib/pages/inventory/inventory.component.mjs +99 -0
- package/esm2020/lib/pages/inventory/quantityDialog.component.mjs +53 -0
- package/esm2020/lib/pages/invitations-table/invitations-table.component.mjs +71 -0
- package/esm2020/lib/pages/login/login.component.mjs +166 -0
- package/esm2020/lib/pages/logs/logs.component.mjs +42 -0
- package/esm2020/lib/pages/membership/membership.component.mjs +44 -0
- package/esm2020/lib/pages/notifications/notifications.component.mjs +90 -0
- package/esm2020/lib/pages/notifications-config/notifications-config.component.mjs +113 -0
- package/esm2020/lib/pages/plans/plans.component.mjs +44 -0
- package/esm2020/lib/pages/positions/positions.component.mjs +21 -0
- package/esm2020/lib/pages/profile/profile.component.mjs +94 -0
- package/esm2020/lib/pages/recover-account/recover-account.component.mjs +46 -0
- package/esm2020/lib/{components → pages}/roles/addRoleDialog.component.mjs +3 -3
- package/esm2020/lib/pages/roles/roles.component.mjs +151 -0
- package/esm2020/lib/{components → pages}/settings/settings.component.mjs +2 -11
- package/esm2020/lib/pages/signup/signup.component.mjs +50 -0
- package/esm2020/lib/pages/suppliers/suppliers.component.mjs +22 -0
- package/esm2020/lib/pages/tasks/tasks.component.mjs +86 -0
- package/esm2020/lib/pages/tenant-settings/tenant-settings.component.mjs +228 -0
- package/esm2020/lib/pages/tenants/tenants.component.mjs +47 -0
- package/esm2020/lib/pages/transactions/transactDialog.component.mjs +80 -0
- package/esm2020/lib/pages/transactions/transactions.component.mjs +101 -0
- package/esm2020/lib/pages/users/users.component.mjs +141 -0
- package/esm2020/lib/pages/welcome/welcome.component.mjs +86 -0
- package/esm2020/lib/select-context.directive.mjs +23 -0
- package/esm2020/lib/services/auth.service.mjs +3 -2
- package/esm2020/lib/services/button.service.mjs +90 -30
- package/esm2020/lib/services/csv.service.mjs +49 -0
- package/esm2020/lib/services/datalib.service.mjs +504 -76
- package/esm2020/lib/services/dialog.service.mjs +24 -7
- package/esm2020/lib/services/log.service.mjs +2 -2
- package/esm2020/lib/services/notifications.service.mjs +33 -0
- package/esm2020/lib/services/table-config.service.mjs +55 -7
- package/esm2020/lib/tin-spa.module.mjs +70 -30
- package/esm2020/public-api.mjs +33 -25
- package/fesm2015/tin-spa.mjs +6258 -2345
- package/fesm2015/tin-spa.mjs.map +1 -1
- package/fesm2020/tin-spa.mjs +6308 -2336
- package/fesm2020/tin-spa.mjs.map +1 -1
- package/lib/classes/Classes.d.ts +244 -294
- package/lib/classes/LibClasses.d.ts +173 -0
- package/lib/classes/TinCore.d.ts +13 -3
- package/lib/components/attach/attach.component.d.ts +13 -6
- package/lib/components/capsules/capsules.component.d.ts +26 -0
- package/lib/components/cards/cards.component.d.ts +39 -0
- package/lib/components/datetime/datetime.component.d.ts +2 -1
- package/lib/components/email/email.component.d.ts +40 -0
- package/lib/components/filter/filter.component.d.ts +1 -0
- package/lib/components/form/form.component.d.ts +20 -9
- package/lib/components/html/html.component.d.ts +16 -0
- package/lib/components/label/label.component.d.ts +2 -1
- package/lib/components/money/money.component.d.ts +8 -1
- package/lib/components/multi-select/multi-select.component.d.ts +47 -0
- package/lib/components/multi-text/multi-text.component.d.ts +56 -0
- package/lib/components/nav-menu/nav-menu.component.d.ts +6 -2
- package/lib/components/notes/notes.component.d.ts +19 -0
- package/lib/components/number/number.component.d.ts +7 -1
- package/lib/components/option/option.component.d.ts +11 -2
- package/lib/components/page/page.component.d.ts +38 -0
- package/lib/components/search/search.component.d.ts +3 -1
- package/lib/components/select/select.component.d.ts +16 -35
- package/lib/components/select-bitwise/select-bitwise.component.d.ts +31 -0
- package/lib/components/select-common/select-common.component.d.ts +50 -0
- package/lib/components/select-internal/select-internal.component.d.ts +23 -0
- package/lib/components/select-lite/select-lite.component.d.ts +8 -0
- package/lib/components/steps/steps.component.d.ts +18 -9
- package/lib/components/suffix/suffix.component.d.ts +23 -0
- package/lib/components/table/detailsDialog.component.d.ts +24 -7
- package/lib/components/table/table.component.d.ts +18 -9
- package/lib/components/table-action/table-action.component.d.ts +4 -1
- package/lib/components/table-header/table-header.component.d.ts +19 -4
- package/lib/components/table-internal/detailsDialog-internal.component.d.ts +24 -7
- package/lib/components/table-internal/table-internal.component.d.ts +18 -9
- package/lib/components/table-lite/detailsDialog-lite.component.d.ts +81 -0
- package/lib/components/table-lite/table-lite.component.d.ts +91 -0
- package/lib/components/table-row/table-row.component.d.ts +5 -2
- package/lib/components/text/text.component.d.ts +17 -4
- package/lib/components/tiles/tiles.component.d.ts +7 -4
- package/lib/components/viewer/viewerDialog.component.d.ts +3 -1
- package/lib/modules/spa-admin.module.d.ts +6 -6
- package/lib/modules/spa-index.module.d.ts +3 -3
- package/lib/modules/spa-user.module.d.ts +2 -2
- package/lib/pages/app-models/app-models.component.d.ts +15 -0
- package/lib/pages/approvals/approvals.component.d.ts +10 -0
- package/lib/pages/approvals-config/approvals-config.component.d.ts +24 -0
- package/lib/{components → pages}/change-password/change-password.component.d.ts +1 -1
- package/lib/{components → pages}/create-account/create-account.component.d.ts +2 -1
- package/lib/{components → pages}/customers/customers.component.d.ts +2 -8
- package/lib/{components → pages}/invitations-table/invitations-table.component.d.ts +1 -1
- package/lib/{components → pages}/login/login.component.d.ts +10 -3
- package/lib/{components → pages}/logs/logs.component.d.ts +2 -6
- package/lib/{components → pages}/membership/membership.component.d.ts +2 -6
- package/lib/pages/notifications/notifications.component.d.ts +16 -0
- package/lib/pages/notifications-config/notifications-config.component.d.ts +17 -0
- package/lib/{components → pages}/plans/plans.component.d.ts +2 -6
- package/lib/{components → pages}/profile/profile.component.d.ts +2 -1
- package/lib/{components → pages}/roles/addRoleDialog.component.d.ts +1 -1
- package/lib/{components → pages}/roles/roles.component.d.ts +15 -3
- package/lib/{components → pages}/signup/signup.component.d.ts +1 -1
- package/lib/{components → pages}/suppliers/suppliers.component.d.ts +1 -4
- package/lib/{components → pages}/tasks/tasks.component.d.ts +1 -1
- package/lib/{components → pages}/tenant-settings/tenant-settings.component.d.ts +12 -7
- package/lib/{components → pages}/tenants/tenants.component.d.ts +2 -2
- package/lib/{components → pages}/users/users.component.d.ts +8 -16
- package/lib/select-context.directive.d.ts +10 -0
- package/lib/services/auth.service.d.ts +1 -1
- package/lib/services/button.service.d.ts +10 -7
- package/lib/services/csv.service.d.ts +10 -0
- package/lib/services/datalib.service.d.ts +55 -10
- package/lib/services/dialog.service.d.ts +2 -2
- package/lib/services/log.service.d.ts +1 -1
- package/lib/services/notifications.service.d.ts +12 -0
- package/lib/services/table-config.service.d.ts +9 -1
- package/lib/tin-spa.module.d.ts +51 -33
- package/package.json +1 -1
- package/public-api.d.ts +31 -23
- package/esm2020/lib/components/accounts/accountDialog.component.mjs +0 -56
- package/esm2020/lib/components/accounts/accounts.component.mjs +0 -70
- package/esm2020/lib/components/bug/bug.component.mjs +0 -14
- package/esm2020/lib/components/change-password/change-password.component.mjs +0 -92
- package/esm2020/lib/components/create-account/create-account.component.mjs +0 -109
- package/esm2020/lib/components/customers/customers.component.mjs +0 -60
- package/esm2020/lib/components/employees/employees.component.mjs +0 -21
- package/esm2020/lib/components/grades/grades.component.mjs +0 -14
- package/esm2020/lib/components/inventory/inventory.component.mjs +0 -99
- package/esm2020/lib/components/inventory/quantityDialog.component.mjs +0 -53
- package/esm2020/lib/components/invitations/invitations.component.mjs +0 -14
- package/esm2020/lib/components/invitations-table/invitations-table.component.mjs +0 -70
- package/esm2020/lib/components/login/login.component.mjs +0 -127
- package/esm2020/lib/components/logs/logs.component.mjs +0 -37
- package/esm2020/lib/components/membership/membership.component.mjs +0 -48
- package/esm2020/lib/components/notifications/notifications.component.mjs +0 -14
- package/esm2020/lib/components/plans/plans.component.mjs +0 -47
- package/esm2020/lib/components/positions/positions.component.mjs +0 -21
- package/esm2020/lib/components/profile/profile.component.mjs +0 -92
- package/esm2020/lib/components/recover-account/recover-account.component.mjs +0 -46
- package/esm2020/lib/components/roles/roles.component.mjs +0 -91
- package/esm2020/lib/components/signup/signup.component.mjs +0 -50
- package/esm2020/lib/components/suppliers/suppliers.component.mjs +0 -50
- package/esm2020/lib/components/tasks/tasks.component.mjs +0 -86
- package/esm2020/lib/components/tenant-settings/inviteDialog.component.mjs +0 -60
- package/esm2020/lib/components/tenant-settings/tenant-settings.component.mjs +0 -155
- package/esm2020/lib/components/tenants/tenants.component.mjs +0 -47
- package/esm2020/lib/components/transactions/transactDialog.component.mjs +0 -80
- package/esm2020/lib/components/transactions/transactions.component.mjs +0 -101
- package/esm2020/lib/components/users/users.component.mjs +0 -118
- package/esm2020/lib/components/welcome/welcome.component.mjs +0 -86
- package/lib/components/invitations/invitations.component.d.ts +0 -8
- package/lib/components/notifications/notifications.component.d.ts +0 -8
- package/lib/components/tenant-settings/inviteDialog.component.d.ts +0 -28
- /package/lib/{components → pages}/accounts/accountDialog.component.d.ts +0 -0
- /package/lib/{components → pages}/accounts/accounts.component.d.ts +0 -0
- /package/lib/{components → pages}/bug/bug.component.d.ts +0 -0
- /package/lib/{components → pages}/departments/departments.component.d.ts +0 -0
- /package/lib/{components → pages}/employees/employees.component.d.ts +0 -0
- /package/lib/{components → pages}/grades/grades.component.d.ts +0 -0
- /package/lib/{components → pages}/inventory/inventory.component.d.ts +0 -0
- /package/lib/{components → pages}/inventory/quantityDialog.component.d.ts +0 -0
- /package/lib/{components → pages}/positions/positions.component.d.ts +0 -0
- /package/lib/{components → pages}/recover-account/recover-account.component.d.ts +0 -0
- /package/lib/{components → pages}/settings/settings.component.d.ts +0 -0
- /package/lib/{components → pages}/transactions/transactDialog.component.d.ts +0 -0
- /package/lib/{components → pages}/transactions/transactions.component.d.ts +0 -0
- /package/lib/{components → pages}/welcome/welcome.component.d.ts +0 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { FormControl } from '@angular/forms';
|
|
3
|
+
import { map, startWith } from 'rxjs/operators';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../../services/message.service";
|
|
6
|
+
import * as i2 from "../../services/datalib.service";
|
|
7
|
+
import * as i3 from "@angular/common";
|
|
8
|
+
import * as i4 from "@angular/forms";
|
|
9
|
+
import * as i5 from "@angular/material/button";
|
|
10
|
+
import * as i6 from "@angular/material/icon";
|
|
11
|
+
import * as i7 from "@angular/material/form-field";
|
|
12
|
+
import * as i8 from "@angular/material/chips";
|
|
13
|
+
import * as i9 from "@angular/material/core";
|
|
14
|
+
import * as i10 from "@angular/material/autocomplete";
|
|
15
|
+
import * as i11 from "@angular/material/tooltip";
|
|
16
|
+
import * as i12 from "../suffix/suffix.component";
|
|
17
|
+
export class MultiTextComponent {
|
|
18
|
+
constructor(messageService, dataService) {
|
|
19
|
+
this.messageService = messageService;
|
|
20
|
+
this.dataService = dataService;
|
|
21
|
+
this.display = "";
|
|
22
|
+
this.value = "";
|
|
23
|
+
this.valueChange = new EventEmitter();
|
|
24
|
+
this.readonly = false;
|
|
25
|
+
this.required = true;
|
|
26
|
+
this.hint = "";
|
|
27
|
+
this.strict = false;
|
|
28
|
+
this.copyContent = false;
|
|
29
|
+
this.clearContent = false;
|
|
30
|
+
this.options = [];
|
|
31
|
+
this.optionDisplay = "name"; // Default to name if not provided
|
|
32
|
+
this.optionValue = "value"; // Default to value if not provided
|
|
33
|
+
this.values = [];
|
|
34
|
+
this.control = new FormControl('');
|
|
35
|
+
this.errorState = false;
|
|
36
|
+
this.selectedFromAutocomplete = false;
|
|
37
|
+
this.isHovered = false;
|
|
38
|
+
this.hoverChange = new EventEmitter();
|
|
39
|
+
}
|
|
40
|
+
ngOnInit() {
|
|
41
|
+
this.values = this.value ? this.value.split(';').filter(val => val.trim() !== '') : [];
|
|
42
|
+
this.setupAutoComplete();
|
|
43
|
+
this.getData(this.loadAction);
|
|
44
|
+
}
|
|
45
|
+
ngOnChanges() {
|
|
46
|
+
if (this.options) {
|
|
47
|
+
this.setupAutoComplete();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
setupAutoComplete() {
|
|
51
|
+
this.filteredOptions = this.control.valueChanges.pipe(startWith(''), map(value => this.filterOptions(value)));
|
|
52
|
+
}
|
|
53
|
+
filterOptions(value) {
|
|
54
|
+
if (!value || !this.options)
|
|
55
|
+
return this.options || [];
|
|
56
|
+
const searchValue = value.toString().toLowerCase();
|
|
57
|
+
return this.options.filter(option => {
|
|
58
|
+
const displayValue = option[this.optionDisplay]?.toString().toLowerCase();
|
|
59
|
+
return displayValue?.includes(searchValue);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
add(event) {
|
|
63
|
+
// Skip validation if option was selected from autocomplete
|
|
64
|
+
if (this.selectedFromAutocomplete) {
|
|
65
|
+
this.selectedFromAutocomplete = false;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const input = (event.value || '').trim();
|
|
69
|
+
if (!input)
|
|
70
|
+
return;
|
|
71
|
+
if (this.strict) {
|
|
72
|
+
const found = this.options.find(opt => {
|
|
73
|
+
const optionDisplayValue = opt[this.optionDisplay]?.toString().toLowerCase();
|
|
74
|
+
const optionValue = opt[this.optionValue]?.toString().toLowerCase();
|
|
75
|
+
const inputLower = input.toLowerCase();
|
|
76
|
+
return optionDisplayValue === inputLower || optionValue === inputLower;
|
|
77
|
+
});
|
|
78
|
+
// if (!found) {
|
|
79
|
+
// this.errorState = true;
|
|
80
|
+
// this.hint = 'Value must be selected from the list';
|
|
81
|
+
// return;
|
|
82
|
+
// }
|
|
83
|
+
this.addValue(found[this.optionValue]?.toString());
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.addValue(input);
|
|
87
|
+
}
|
|
88
|
+
this.resetInput();
|
|
89
|
+
}
|
|
90
|
+
addValue(value) {
|
|
91
|
+
if (!this.values.includes(value)) {
|
|
92
|
+
this.values.push(value);
|
|
93
|
+
this.errorState = false;
|
|
94
|
+
this.updateValue();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
remove(value) {
|
|
98
|
+
const index = this.values.indexOf(value);
|
|
99
|
+
if (index >= 0) {
|
|
100
|
+
this.values.splice(index, 1);
|
|
101
|
+
this.updateValue();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
optionSelected(event) {
|
|
105
|
+
const selectedOption = event.option.value;
|
|
106
|
+
if (selectedOption) {
|
|
107
|
+
this.selectedFromAutocomplete = true;
|
|
108
|
+
this.addValue(selectedOption[this.optionValue]?.toString());
|
|
109
|
+
this.resetInput();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
resetInput() {
|
|
113
|
+
// Reset form control
|
|
114
|
+
this.control.setValue('');
|
|
115
|
+
// Reset input element if available
|
|
116
|
+
if (this.textInput?.nativeElement) {
|
|
117
|
+
this.textInput.nativeElement.value = '';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
updateValue() {
|
|
121
|
+
this.value = this.values.join(';');
|
|
122
|
+
this.valueChange.emit(this.value);
|
|
123
|
+
}
|
|
124
|
+
clear() {
|
|
125
|
+
this.values = [];
|
|
126
|
+
this.updateValue();
|
|
127
|
+
}
|
|
128
|
+
getDisplayValue(value) {
|
|
129
|
+
const option = this.options?.find(opt => opt[this.optionValue]?.toString() === value);
|
|
130
|
+
return option ? option[this.optionDisplay]?.toString() : value;
|
|
131
|
+
}
|
|
132
|
+
copyValues() {
|
|
133
|
+
navigator.clipboard.writeText(this.value).then(() => {
|
|
134
|
+
this.messageService.toast('Copied');
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
onMouseEnter() {
|
|
138
|
+
this.isHovered = true;
|
|
139
|
+
this.hoverChange.emit(true);
|
|
140
|
+
}
|
|
141
|
+
onMouseLeave() {
|
|
142
|
+
this.isHovered = false;
|
|
143
|
+
this.hoverChange.emit(false);
|
|
144
|
+
}
|
|
145
|
+
refresh(event) {
|
|
146
|
+
event.stopPropagation();
|
|
147
|
+
if (!this.loadAction) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const refreshAction = {
|
|
151
|
+
...this.loadAction,
|
|
152
|
+
forceRefresh: true
|
|
153
|
+
};
|
|
154
|
+
this.getData(refreshAction);
|
|
155
|
+
}
|
|
156
|
+
getData(action) {
|
|
157
|
+
if (!action)
|
|
158
|
+
return;
|
|
159
|
+
this.dataService.CallApi(action).subscribe((apiResponse) => {
|
|
160
|
+
if (apiResponse.success) {
|
|
161
|
+
this.options = apiResponse.data;
|
|
162
|
+
this.setupAutoComplete();
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
MultiTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MultiTextComponent, deps: [{ token: i1.MessageService }, { token: i2.DataServiceLib }], target: i0.ɵɵFactoryTarget.Component });
|
|
168
|
+
MultiTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MultiTextComponent, selector: "spa-multi-text", inputs: { display: "display", value: "value", readonly: "readonly", required: "required", hint: "hint", strict: "strict", suffix: "suffix", infoMessage: "infoMessage", copyContent: "copyContent", clearContent: "clearContent", options: "options", optionDisplay: "optionDisplay", optionValue: "optionValue", loadAction: "loadAction" }, outputs: { valueChange: "valueChange", hoverChange: "hoverChange" }, viewQueries: [{ propertyName: "textInput", first: true, predicate: ["textInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-form-field style=\"width: 100%;\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\r\n <mat-label>{{display}}</mat-label>\r\n <mat-chip-list #chipList>\r\n <mat-chip *ngFor=\"let value of values\" [removable]=\"!readonly\" (removed)=\"remove(value)\">\r\n {{getDisplayValue(value)}}\r\n <mat-icon matChipRemove *ngIf=\"!readonly\">cancel</mat-icon>\r\n </mat-chip>\r\n <input #textInput autocomplete=\"off\" [placeholder]=\"readonly ? '' : display\" [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"[13, 186]\" [matChipInputAddOnBlur]=\"true\" (matChipInputTokenEnd)=\"add($event)\" [formControl]=\"control\" [readonly]=\"readonly\" [matAutocomplete]=\"auto\">\r\n </mat-chip-list>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"optionSelected($event)\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option\">\r\n {{option[optionDisplay]}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n\r\n <mat-error *ngIf=\"errorState\">{{hint}}</mat-error>\r\n <mat-hint *ngIf=\"hint && !errorState\">{{hint}}</mat-hint>\r\n\r\n <div matSuffix class=\"suffix-icons\">\r\n <button mat-icon-button *ngIf=\"loadAction && isHovered\" (click)=\"refresh($event)\" matTooltip=\"Refresh\" matTooltipPosition=\"above\">\r\n <mat-icon color=\"primary\">cached</mat-icon>\r\n </button>\r\n <spa-suffix [label]=\"suffix\" [infoMessage]=\"infoMessage\" [copyContent]=\"copyContent\" [clearContent]=\"clearContent\" (clearClick)=\"clear()\" [isHovered]=\"true\" [(value)]=\"value\"></spa-suffix>\r\n </div>\r\n</mat-form-field>\r\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: i8.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i8.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i8.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i8.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.SuffixComponent, selector: "spa-suffix", inputs: ["label", "infoMessage", "copyContent", "isHovered", "clearContent", "value"], outputs: ["infoClick", "copyClick", "clearClick", "valueChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] });
|
|
169
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MultiTextComponent, decorators: [{
|
|
170
|
+
type: Component,
|
|
171
|
+
args: [{ selector: 'spa-multi-text', template: "<mat-form-field style=\"width: 100%;\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\r\n <mat-label>{{display}}</mat-label>\r\n <mat-chip-list #chipList>\r\n <mat-chip *ngFor=\"let value of values\" [removable]=\"!readonly\" (removed)=\"remove(value)\">\r\n {{getDisplayValue(value)}}\r\n <mat-icon matChipRemove *ngIf=\"!readonly\">cancel</mat-icon>\r\n </mat-chip>\r\n <input #textInput autocomplete=\"off\" [placeholder]=\"readonly ? '' : display\" [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"[13, 186]\" [matChipInputAddOnBlur]=\"true\" (matChipInputTokenEnd)=\"add($event)\" [formControl]=\"control\" [readonly]=\"readonly\" [matAutocomplete]=\"auto\">\r\n </mat-chip-list>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"optionSelected($event)\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option\">\r\n {{option[optionDisplay]}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n\r\n <mat-error *ngIf=\"errorState\">{{hint}}</mat-error>\r\n <mat-hint *ngIf=\"hint && !errorState\">{{hint}}</mat-hint>\r\n\r\n <div matSuffix class=\"suffix-icons\">\r\n <button mat-icon-button *ngIf=\"loadAction && isHovered\" (click)=\"refresh($event)\" matTooltip=\"Refresh\" matTooltipPosition=\"above\">\r\n <mat-icon color=\"primary\">cached</mat-icon>\r\n </button>\r\n <spa-suffix [label]=\"suffix\" [infoMessage]=\"infoMessage\" [copyContent]=\"copyContent\" [clearContent]=\"clearContent\" (clearClick)=\"clear()\" [isHovered]=\"true\" [(value)]=\"value\"></spa-suffix>\r\n </div>\r\n</mat-form-field>\r\n" }]
|
|
172
|
+
}], ctorParameters: function () { return [{ type: i1.MessageService }, { type: i2.DataServiceLib }]; }, propDecorators: { textInput: [{
|
|
173
|
+
type: ViewChild,
|
|
174
|
+
args: ['textInput']
|
|
175
|
+
}], display: [{
|
|
176
|
+
type: Input
|
|
177
|
+
}], value: [{
|
|
178
|
+
type: Input
|
|
179
|
+
}], valueChange: [{
|
|
180
|
+
type: Output
|
|
181
|
+
}], readonly: [{
|
|
182
|
+
type: Input
|
|
183
|
+
}], required: [{
|
|
184
|
+
type: Input
|
|
185
|
+
}], hint: [{
|
|
186
|
+
type: Input
|
|
187
|
+
}], strict: [{
|
|
188
|
+
type: Input
|
|
189
|
+
}], suffix: [{
|
|
190
|
+
type: Input
|
|
191
|
+
}], infoMessage: [{
|
|
192
|
+
type: Input
|
|
193
|
+
}], copyContent: [{
|
|
194
|
+
type: Input
|
|
195
|
+
}], clearContent: [{
|
|
196
|
+
type: Input
|
|
197
|
+
}], options: [{
|
|
198
|
+
type: Input
|
|
199
|
+
}], optionDisplay: [{
|
|
200
|
+
type: Input
|
|
201
|
+
}], optionValue: [{
|
|
202
|
+
type: Input
|
|
203
|
+
}], loadAction: [{
|
|
204
|
+
type: Input
|
|
205
|
+
}], hoverChange: [{
|
|
206
|
+
type: Output
|
|
207
|
+
}] } });
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktdGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy9tdWx0aS10ZXh0L211bHRpLXRleHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbXVsdGktdGV4dC9tdWx0aS10ZXh0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk3QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQVNoRCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQW9CLGNBQThCLEVBQVUsV0FBMkI7UUFBbkUsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBSTlFLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1YsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzFDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1YsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdmLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLFlBQU8sR0FBVSxFQUFFLENBQUM7UUFDcEIsa0JBQWEsR0FBRyxNQUFNLENBQUMsQ0FBQyxrQ0FBa0M7UUFDMUQsZ0JBQVcsR0FB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c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBaUlJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xyXG5pbXBvcnQgeyBNYXRDaGlwSW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBY3Rpb24sIEFwaVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9DbGFzc2VzJztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2VMaWIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhbGliLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcGEtbXVsdGktdGV4dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLXRleHQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNdWx0aVRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLCBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZUxpYikgeyB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3RleHRJbnB1dCcpIHRleHRJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuXHJcbiAgQElucHV0KCkgZGlzcGxheSA9IFwiXCI7XHJcbiAgQElucHV0KCkgdmFsdWUgPSBcIlwiO1xyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcmVxdWlyZWQgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGhpbnQgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHN0cmljdCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHN1ZmZpeDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGluZm9NZXNzYWdlOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY29weUNvbnRlbnQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjbGVhckNvbnRlbnQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBvcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIG9wdGlvbkRpc3BsYXkgPSBcIm5hbWVcIjsgLy8gRGVmYXVsdCB0byBuYW1lIGlmIG5vdCBwcm92aWRlZFxyXG4gIEBJbnB1dCgpIG9wdGlvblZhbHVlID0gXCJ2YWx1ZVwiOyAvLyBEZWZhdWx0IHRvIHZhbHVlIGlmIG5vdCBwcm92aWRlZFxyXG5cclxuICBASW5wdXQoKSBsb2FkQWN0aW9uOiBBY3Rpb247XHJcblxyXG4gIHZhbHVlczogc3RyaW5nW10gPSBbXTtcclxuICBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICBmaWx0ZXJlZE9wdGlvbnM6IE9ic2VydmFibGU8YW55W10+O1xyXG4gIGVycm9yU3RhdGUgPSBmYWxzZTtcclxuICBwcml2YXRlIHNlbGVjdGVkRnJvbUF1dG9jb21wbGV0ZSA9IGZhbHNlO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUuc3BsaXQoJzsnKS5maWx0ZXIodmFsID0+IHZhbC50cmltKCkgIT09ICcnKSA6IFtdO1xyXG4gICAgdGhpcy5zZXR1cEF1dG9Db21wbGV0ZSgpO1xyXG4gICAgdGhpcy5nZXREYXRhKHRoaXMubG9hZEFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5zZXR1cEF1dG9Db21wbGV0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEF1dG9Db21wbGV0ZSgpIHtcclxuICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICBzdGFydFdpdGgoJycpLFxyXG4gICAgICBtYXAodmFsdWUgPT4gdGhpcy5maWx0ZXJPcHRpb25zKHZhbHVlKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbHRlck9wdGlvbnModmFsdWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgIGlmICghdmFsdWUgfHwgIXRoaXMub3B0aW9ucykgcmV0dXJuIHRoaXMub3B0aW9ucyB8fCBbXTtcclxuXHJcbiAgICBjb25zdCBzZWFyY2hWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiB7XHJcbiAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IG9wdGlvblt0aGlzLm9wdGlvbkRpc3BsYXldPy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIHJldHVybiBkaXNwbGF5VmFsdWU/LmluY2x1ZGVzKHNlYXJjaFZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIG9wdGlvbiB3YXMgc2VsZWN0ZWQgZnJvbSBhdXRvY29tcGxldGVcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRnJvbUF1dG9jb21wbGV0ZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRnJvbUF1dG9jb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5wdXQgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcclxuICAgIGlmICghaW5wdXQpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5zdHJpY3QpIHtcclxuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLm9wdGlvbnMuZmluZChvcHQgPT4ge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbkRpc3BsYXlWYWx1ZSA9IG9wdFt0aGlzLm9wdGlvbkRpc3BsYXldPy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBvcHRbdGhpcy5vcHRpb25WYWx1ZV0/LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBpbnB1dExvd2VyID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICByZXR1cm4gb3B0aW9uRGlzcGxheVZhbHVlID09PSBpbnB1dExvd2VyIHx8IG9wdGlvblZhbHVlID09PSBpbnB1dExvd2VyO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGlmICghZm91bmQpIHtcclxuICAgICAgLy8gICB0aGlzLmVycm9yU3RhdGUgPSB0cnVlO1xyXG4gICAgICAvLyAgIHRoaXMuaGludCA9ICdWYWx1ZSBtdXN0IGJlIHNlbGVjdGVkIGZyb20gdGhlIGxpc3QnO1xyXG4gICAgICAvLyAgIHJldHVybjtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgdGhpcy5hZGRWYWx1ZShmb3VuZFt0aGlzLm9wdGlvblZhbHVlXT8udG9TdHJpbmcoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkZFZhbHVlKGlucHV0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc2V0SW5wdXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgdGhpcy52YWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMuZXJyb3JTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnZhbHVlcy5pbmRleE9mKHZhbHVlKTtcclxuICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgIHRoaXMudmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIHRoaXMudXBkYXRlVmFsdWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wdGlvblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcclxuICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRnJvbUF1dG9jb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuYWRkVmFsdWUoc2VsZWN0ZWRPcHRpb25bdGhpcy5vcHRpb25WYWx1ZV0/LnRvU3RyaW5nKCkpO1xyXG4gICAgICB0aGlzLnJlc2V0SW5wdXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHJlc2V0SW5wdXQoKTogdm9pZCB7XHJcbiAgICAvLyBSZXNldCBmb3JtIGNvbnRyb2xcclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSgnJyk7XHJcblxyXG4gICAgLy8gUmVzZXQgaW5wdXQgZWxlbWVudCBpZiBhdmFpbGFibGVcclxuICAgIGlmICh0aGlzLnRleHRJbnB1dD8ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnRleHRJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVWYWx1ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlcy5qb2luKCc7Jyk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWVzID0gW107XHJcbiAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBnZXREaXNwbGF5VmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnM/LmZpbmQob3B0ID0+XHJcbiAgICAgIG9wdFt0aGlzLm9wdGlvblZhbHVlXT8udG9TdHJpbmcoKSA9PT0gdmFsdWVcclxuICAgICk7XHJcbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3RoaXMub3B0aW9uRGlzcGxheV0/LnRvU3RyaW5nKCkgOiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGNvcHlWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0aGlzLnZhbHVlKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdCgnQ29waWVkJyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlzSG92ZXJlZCA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBob3ZlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBvbk1vdXNlRW50ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzSG92ZXJlZCA9IHRydWU7XHJcbiAgICB0aGlzLmhvdmVyQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzSG92ZXJlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5ob3ZlckNoYW5nZS5lbWl0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKCF0aGlzLmxvYWRBY3Rpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZnJlc2hBY3Rpb24gPSB7XHJcbiAgICAgIC4uLnRoaXMubG9hZEFjdGlvbixcclxuICAgICAgZm9yY2VSZWZyZXNoOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ2V0RGF0YShyZWZyZXNoQWN0aW9uKTtcclxuICB9XHJcblxyXG4gIGdldERhdGEoYWN0aW9uOiBBY3Rpb24pIHtcclxuICAgIGlmICghYWN0aW9uKSByZXR1cm47XHJcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLkNhbGxBcGkoYWN0aW9uKS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSkgPT4ge1xyXG4gICAgICBpZiAoYXBpUmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGFwaVJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgdGhpcy5zZXR1cEF1dG9Db21wbGV0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgKG1vdXNlZW50ZXIpPVwib25Nb3VzZUVudGVyKClcIiAobW91c2VsZWF2ZSk9XCJvbk1vdXNlTGVhdmUoKVwiPlxyXG4gIDxtYXQtbGFiZWw+e3tkaXNwbGF5fX08L21hdC1sYWJlbD5cclxuICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3Q+XHJcbiAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIHZhbHVlc1wiIFtyZW1vdmFibGVdPVwiIXJlYWRvbmx5XCIgKHJlbW92ZWQpPVwicmVtb3ZlKHZhbHVlKVwiPlxyXG4gICAgICB7e2dldERpc3BsYXlWYWx1ZSh2YWx1ZSl9fVxyXG4gICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZSAqbmdJZj1cIiFyZWFkb25seVwiPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICA8L21hdC1jaGlwPlxyXG4gICAgPGlucHV0ICN0ZXh0SW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgW3BsYWNlaG9sZGVyXT1cInJlYWRvbmx5ID8gJycgOiBkaXNwbGF5XCIgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJbMTMsIDE4Nl1cIiBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cInRydWVcIiAobWF0Q2hpcElucHV0VG9rZW5FbmQpPVwiYWRkKCRldmVudClcIiBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiIFtyZWFkb25seV09XCJyZWFkb25seVwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPlxyXG4gIDwvbWF0LWNoaXAtbGlzdD5cclxuXHJcbiAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwib3B0aW9uU2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cclxuICAgICAge3tvcHRpb25bb3B0aW9uRGlzcGxheV19fVxyXG4gICAgPC9tYXQtb3B0aW9uPlxyXG4gIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuXHJcbiAgPG1hdC1lcnJvciAqbmdJZj1cImVycm9yU3RhdGVcIj57e2hpbnR9fTwvbWF0LWVycm9yPlxyXG4gIDxtYXQtaGludCAqbmdJZj1cImhpbnQgJiYgIWVycm9yU3RhdGVcIj57e2hpbnR9fTwvbWF0LWhpbnQ+XHJcblxyXG4gIDxkaXYgbWF0U3VmZml4IGNsYXNzPVwic3VmZml4LWljb25zXCI+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cImxvYWRBY3Rpb24gJiYgaXNIb3ZlcmVkXCIgKGNsaWNrKT1cInJlZnJlc2goJGV2ZW50KVwiIG1hdFRvb2x0aXA9XCJSZWZyZXNoXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cclxuICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiPmNhY2hlZDwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxzcGEtc3VmZml4IFtsYWJlbF09XCJzdWZmaXhcIiBbaW5mb01lc3NhZ2VdPVwiaW5mb01lc3NhZ2VcIiBbY29weUNvbnRlbnRdPVwiY29weUNvbnRlbnRcIiBbY2xlYXJDb250ZW50XT1cImNsZWFyQ29udGVudFwiIChjbGVhckNsaWNrKT1cImNsZWFyKClcIiBbaXNIb3ZlcmVkXT1cInRydWVcIiBbKHZhbHVlKV09XCJ2YWx1ZVwiPjwvc3BhLXN1ZmZpeD5cclxuICA8L2Rpdj5cclxuPC9tYXQtZm9ybS1maWVsZD5cclxuIl19
|
|
@@ -1,35 +1,39 @@
|
|
|
1
|
-
import { AppConfig } from './../../classes/Classes';
|
|
1
|
+
import { AppConfig, } from './../../classes/Classes';
|
|
2
2
|
import { Component, Input } from '@angular/core';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "@angular/router";
|
|
5
5
|
import * as i2 from "../../services/auth.service";
|
|
6
6
|
import * as i3 from "../../services/storage.service";
|
|
7
|
-
import * as i4 from "
|
|
8
|
-
import * as i5 from "@
|
|
9
|
-
import * as i6 from "
|
|
10
|
-
import * as i7 from "
|
|
11
|
-
import * as i8 from "@angular/
|
|
12
|
-
import * as i9 from "@angular/material/
|
|
13
|
-
import * as i10 from "@angular/material/
|
|
14
|
-
import * as i11 from "@angular/material/
|
|
15
|
-
import * as i12 from "@angular/material/
|
|
16
|
-
import * as i13 from "@angular/material/
|
|
17
|
-
import * as i14 from "@angular/material/
|
|
18
|
-
import * as i15 from "@angular/material/
|
|
19
|
-
import * as i16 from "@angular/material/
|
|
20
|
-
import * as i17 from "
|
|
7
|
+
import * as i4 from "../../services/notifications.service";
|
|
8
|
+
import * as i5 from "@abacritt/angularx-social-login";
|
|
9
|
+
import * as i6 from "@angular/cdk/layout";
|
|
10
|
+
import * as i7 from "../../services/datalib.service";
|
|
11
|
+
import * as i8 from "@angular/common";
|
|
12
|
+
import * as i9 from "@angular/material/menu";
|
|
13
|
+
import * as i10 from "@angular/material/badge";
|
|
14
|
+
import * as i11 from "@angular/material/button";
|
|
15
|
+
import * as i12 from "@angular/material/icon";
|
|
16
|
+
import * as i13 from "@angular/material/list";
|
|
17
|
+
import * as i14 from "@angular/material/divider";
|
|
18
|
+
import * as i15 from "@angular/material/tooltip";
|
|
19
|
+
import * as i16 from "@angular/material/sidenav";
|
|
20
|
+
import * as i17 from "@angular/material/toolbar";
|
|
21
|
+
import * as i18 from "@angular/material/expansion";
|
|
22
|
+
import * as i19 from "../loader/loader.component";
|
|
21
23
|
export class NavMenuComponent {
|
|
22
|
-
constructor(router, authService, storageService, socialService, breakpointObserver, dataService) {
|
|
24
|
+
constructor(router, authService, storageService, notificationsService, socialService, breakpointObserver, dataService) {
|
|
23
25
|
this.router = router;
|
|
24
26
|
this.authService = authService;
|
|
25
27
|
this.storageService = storageService;
|
|
28
|
+
this.notificationsService = notificationsService;
|
|
26
29
|
this.socialService = socialService;
|
|
27
30
|
this.breakpointObserver = breakpointObserver;
|
|
28
31
|
this.dataService = dataService;
|
|
32
|
+
this.notificationCount$ = this.notificationsService.notificationCount$;
|
|
29
33
|
this.isExpanded = false;
|
|
30
34
|
this.nowDate = new Date();
|
|
31
35
|
this.appConfig = new AppConfig();
|
|
32
|
-
this.footer = 'alsquaretech.net
|
|
36
|
+
this.footer = 'alsquaretech.net';
|
|
33
37
|
// detect screen size changes
|
|
34
38
|
this.breakpointObserver.observe(["(max-width: 600px)"]).subscribe((result) => {
|
|
35
39
|
if (result.matches) {
|
|
@@ -45,6 +49,9 @@ export class NavMenuComponent {
|
|
|
45
49
|
this.authService.myRoleObserv.subscribe(rol => this.myRole = rol);
|
|
46
50
|
this.authService.loggedinObserv.subscribe(obj => this.loggedin = obj);
|
|
47
51
|
this.authService.tenantNameObserv.subscribe(obj => this.tenantName = obj);
|
|
52
|
+
if (!this.smallScreen) {
|
|
53
|
+
this.isExpanded = true;
|
|
54
|
+
}
|
|
48
55
|
}
|
|
49
56
|
collapse() {
|
|
50
57
|
this.isExpanded = false;
|
|
@@ -56,12 +63,6 @@ export class NavMenuComponent {
|
|
|
56
63
|
this.isExpanded = false;
|
|
57
64
|
}
|
|
58
65
|
logoff() {
|
|
59
|
-
// this.socialService.signOut();
|
|
60
|
-
// this.authService.Updateloggedin(false);
|
|
61
|
-
// this.authService.UpdateAutoLogin(false);
|
|
62
|
-
// this.authService.UpdateRole(new Role());
|
|
63
|
-
// this.storageService.clear();
|
|
64
|
-
// this.router.navigate(["login"]);
|
|
65
66
|
this.authService.logoff();
|
|
66
67
|
}
|
|
67
68
|
redirectTo(link) {
|
|
@@ -70,15 +71,18 @@ export class NavMenuComponent {
|
|
|
70
71
|
this.router.navigate([link]);
|
|
71
72
|
}
|
|
72
73
|
}
|
|
74
|
+
getSubItems(capItem) {
|
|
75
|
+
return capItem.capSubItems.filter(x => x.showMenu && !x.isBool);
|
|
76
|
+
}
|
|
73
77
|
}
|
|
74
|
-
NavMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NavMenuComponent, deps: [{ token: i1.Router }, { token: i2.AuthService }, { token: i3.StorageService }, { token: i4.
|
|
75
|
-
NavMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NavMenuComponent, selector: "spa-nav-menu", inputs: { appConfig: "appConfig", footer: "footer" }, ngImport: i0, template: "<header *ngIf=\"loggedin && dataService.appConfig.navigation == 'top'\">\r\n\r\n <nav class=\"toolbar navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow mb-3 \" style=\"padding-right: 10px;\">\r\n\r\n\r\n <div class=\"container-fluid\" style=\"padding-right: 0px;\">\r\n\r\n <img *ngIf=\"appConfig.logo!=''\" [src]=\"appConfig.logo\" style=\"height: 50px; margin-right: 2em\" />\r\n\r\n <div>\r\n <!-- <div style=\"font-size: 20px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n <div *ngIf=\"!dataService.appConfig.multitenant\" style=\"font-size: 22px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\" style=\"font-size: 20px; ; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-label=\"Toggle navigation\" [attr.aria-expanded]=\"isExpanded\" (click)=\"toggle()\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"myRole\" class=\" navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse stack-top\" style=\"margin-right: 0px;\" [ngClass]=\"{ show: isExpanded, navitems: isExpanded }\" >\r\n\r\n <button mat-icon-button (click)=\"logoff()\" > <mat-icon>logout</mat-icon> </button>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >support_agent</mat-icon> </button>\r\n\r\n <!-- <button mat-icon-button (click)=\"redirectTo('home/admin/tenants')\"> <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button> -->\r\n </div>\r\n\r\n\r\n <button id=\"btnUser\" mat-button [matMenuTriggerFor]=\"profileMenu\" ><mat-icon style=\"font-size: 24px;\">account_circle</mat-icon> {{loggedUserFullName}}</button>\r\n\r\n <mat-menu #profileMenu=\"matMenu\">\r\n <button id=\"btnProfile\" mat-menu-item (click)=\"redirectTo('home/user/profile')\" >Profile</button>\r\n <button id=\"btnLogOff\" mat-menu-item (click)=\"logoff()\">Log Off</button>\r\n </mat-menu>\r\n\r\n <div *ngFor=\"let item of appConfig.capItems\">\r\n\r\n <!-- Menu Item -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && !item.capSubItems && item.showMenu\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items ignored -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && item.ignoreSubsDisplay\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items to display-->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && !item.ignoreSubsDisplay\" mat-button [matMenuTriggerFor]=\"adminMenu\">{{item.display}}</button>\r\n\r\n\r\n <!-- Sub Menu Items -->\r\n <mat-menu #adminMenu=\"matMenu\">\r\n\r\n <div *ngFor=\"let subItem of item.capSubItems\">\r\n\r\n <button *ngIf=\"myRole[subItem.name] && subItem.showMenu\" mat-menu-item (click)=\"redirectTo(subItem.link)\">{{subItem.display}}</button>\r\n\r\n </div>\r\n\r\n </mat-menu>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </nav>\r\n\r\n</header>\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"dataService.appConfig.navigation == 'top'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!-- SIDE -->\r\n<mat-toolbar class=\"tin-bg-image-toolbar\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\" style=\"padding: 0px 8px;\">\r\n\r\n <button mat-icon-button (click)=\"toggle()\" matTooltip=\"Menu\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n\r\n <img [src]=\"dataService.appConfig.logo\" style=\"height: 50px;\" />\r\n\r\n <div style=\"padding-left: 10px; \">\r\n\r\n <div style=\"font-size: 20px; height: 25px; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <span class=\"toolbar-item-spacer\"></span>\r\n\r\n <!-- buttons -->\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >help</mat-icon> </button>\r\n\r\n </div>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button matTooltip=\"Notifications\"><mat-icon>notifications</mat-icon></button>\r\n\r\n <button mat-icon-button matTooltip=\"My Account\" [matMenuTriggerFor]=\"userAccountMenu\"><mat-icon>account_circle</mat-icon></button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"logoff()\"> <mat-icon>logout</mat-icon></button>\r\n\r\n\r\n <!-- my account menu -->\r\n <mat-menu #userAccountMenu [overlapTrigger]=\"false\" yPosition=\"below\">\r\n\r\n <button mat-menu-item routerLink=\"home/user/profile\">\r\n <mat-icon>person</mat-icon><span>Profile</span>\r\n </button>\r\n\r\n <button mat-menu-item routerLink=\"home/admin/bug\" *ngIf=\"dataService.appConfig.multitenant && smallScreen\">\r\n <mat-icon>help</mat-icon> <span>Help</span>\r\n </button>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <button mat-menu-item (click)=\"logoff()\">\r\n <mat-icon>logout</mat-icon>Logout\r\n </button>\r\n\r\n </mat-menu>\r\n\r\n</mat-toolbar>\r\n\r\n\r\n\r\n\r\n<mat-sidenav-container class=\"app-container\" [hasBackdrop]=\"smallScreen\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n\r\n <mat-sidenav #sidenav [mode]=\"smallScreen ? 'over' : 'over'\" [class.mat-elevation-z4]=\"true\" [opened]=\"isExpanded\" class=\"app-sidenav side-color\" style=\"height: 100%;\">\r\n <mat-nav-list >\r\n\r\n <ng-container *ngFor=\"let cap of dataService.appConfig.capItems\" >\r\n\r\n <!-- Menu item -->\r\n <mat-list-item [routerLink]=\"cap.link\" *ngIf=\"myRole[cap.name] && cap.showMenu && (!cap.capSubItems || cap.capSubItems && cap.ignoreSubsDisplay)\" style=\"height: 40px;font-size: 15px;\" (click)=\"toggle()\">\r\n <mat-icon style=\"margin-right: 5px;\">{{cap.icon}}</mat-icon>{{cap.display}}\r\n </mat-list-item>\r\n\r\n <!-- Menu With Sub items -->\r\n <mat-expansion-panel class=\"side-color\" [class.mat-elevation-z0]=\"true\" *ngIf=\"myRole[cap.name] && cap.showMenu && cap.capSubItems && !cap.ignoreSubsDisplay\">\r\n\r\n <mat-expansion-panel-header style=\"height: 40px;padding-left: 15px;\">\r\n <mat-icon style=\"margin-right: 5px;\">{{cap.icon != 'navigate_next' ? cap.icon : 'fiber_manual_record' }}</mat-icon>{{cap.display}}\r\n </mat-expansion-panel-header>\r\n\r\n <!-- Sub items -->\r\n <mat-nav-list *ngFor=\"let capSub of cap.capSubItems\">\r\n\r\n <mat-list-item [routerLink]=\"capSub.link\" style=\"height: 30px; font-size: 15px;\" (click)=\"toggle()\" *ngIf=\"myRole[cap.name] && cap.showMenu\">\r\n <mat-icon style=\"margin-right: 5px;\">{{capSub.icon}}</mat-icon>{{capSub.display}}\r\n </mat-list-item>\r\n\r\n </mat-nav-list>\r\n\r\n </mat-expansion-panel>\r\n\r\n </ng-container>\r\n\r\n </mat-nav-list>\r\n </mat-sidenav>\r\n\r\n\r\n\r\n <mat-sidenav-content class=\"container-fluid tin-bg-image\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <hr style=\"margin-top: 0px;\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n </mat-sidenav-content>\r\n\r\n</mat-sidenav-container>\r\n\r\n\r\n<!-- footer -->\r\n<div class=\"tin-center\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <label style=\"text-align: center; font-size: 12px;\">© {{nowDate | date : 'yyyy'}} {{footer}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"!loggedin && dataService.appConfig.navigation == 'side'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n", styles: ["a.navbar-brand{white-space:normal;text-align:center;word-break:break-all}html{font-size:14px}.box-shadow{box-shadow:0 .25rem .75rem #0000000d}.toolbar{height:60px;display:flex;align-items:center;background-color:#03a;color:#fff}.stack-top{z-index:9;margin:20px}.navitems{background-color:#03a}.toolbar-item-spacer{flex:1 1 auto}.app-container{height:90%;margin:0}.app-sidenav{width:200px}.side-color{background-color:#def0fc}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatNavList, selector: "mat-nav-list", inputs: ["disableRipple", "disabled"], exportAs: ["matNavList"] }, { kind: "component", type: i11.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["disableRipple", "disabled"], exportAs: ["matListItem"] }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i14.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i14.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "component", type: i15.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i1.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i16.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i16.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i17.LoaderComponent, selector: "spa-loader", inputs: ["logo"] }, { kind: "pipe", type: i7.DatePipe, name: "date" }] });
|
|
78
|
+
NavMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NavMenuComponent, deps: [{ token: i1.Router }, { token: i2.AuthService }, { token: i3.StorageService }, { token: i4.NotificationsService }, { token: i5.SocialAuthService }, { token: i6.BreakpointObserver }, { token: i7.DataServiceLib }], target: i0.ɵɵFactoryTarget.Component });
|
|
79
|
+
NavMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NavMenuComponent, selector: "spa-nav-menu", inputs: { appConfig: "appConfig", footer: "footer" }, ngImport: i0, template: "<header *ngIf=\"loggedin && dataService.appConfig.navigation == 'top'\">\r\n\r\n <nav class=\"toolbar navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow mb-3 \" style=\"padding-right: 10px;\">\r\n\r\n\r\n <div class=\"container-fluid\" style=\"padding-right: 0px;\">\r\n\r\n <img *ngIf=\"appConfig.logo!=''\" [src]=\"appConfig.logo\" style=\"height: 50px; margin-right: 2em\" />\r\n\r\n <div>\r\n <!-- <div style=\"font-size: 20px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n <div *ngIf=\"!dataService.appConfig.multitenant\" style=\"font-size: 22px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\" style=\"font-size: 20px; ; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-label=\"Toggle navigation\" [attr.aria-expanded]=\"isExpanded\" (click)=\"toggle()\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"myRole\" class=\" navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse stack-top\" style=\"margin-right: 0px;\" [ngClass]=\"{ show: isExpanded, navitems: isExpanded }\" >\r\n\r\n <button mat-icon-button (click)=\"logoff()\" > <mat-icon>logout</mat-icon> </button>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >support_agent</mat-icon> </button>\r\n\r\n <!-- <button mat-icon-button (click)=\"redirectTo('home/admin/notifications')\"> <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button> -->\r\n </div>\r\n\r\n\r\n <button id=\"btnUser\" mat-button [matMenuTriggerFor]=\"profileMenu\" ><mat-icon style=\"font-size: 24px;\">account_circle</mat-icon> {{loggedUserFullName}}</button>\r\n\r\n <mat-menu #profileMenu=\"matMenu\">\r\n <button id=\"btnProfile\" mat-menu-item (click)=\"redirectTo('home/user/profile')\" >Profile</button>\r\n <button id=\"btnLogOff\" mat-menu-item (click)=\"logoff()\">Log Off</button>\r\n </mat-menu>\r\n\r\n <div *ngFor=\"let item of appConfig.capItems\">\r\n\r\n <!-- Menu Item -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && !item.capSubItems && item.showMenu\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items ignored -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && item.ignoreSubsDisplay\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items to display-->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && !item.ignoreSubsDisplay\" mat-button [matMenuTriggerFor]=\"adminMenu\">{{item.display}}</button>\r\n\r\n\r\n <!-- Sub Menu Items -->\r\n <mat-menu #adminMenu=\"matMenu\">\r\n\r\n <div *ngFor=\"let subItem of item.capSubItems\">\r\n\r\n <button *ngIf=\"myRole[subItem.name] && subItem.showMenu\" mat-menu-item (click)=\"redirectTo(subItem.link)\">{{subItem.display}}</button>\r\n\r\n </div>\r\n\r\n </mat-menu>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </nav>\r\n\r\n</header>\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"dataService.appConfig.navigation == 'top'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!-- SIDE -->\r\n<mat-toolbar class=\"tin-bg-image-toolbar\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\" style=\"padding: 0px 8px;\">\r\n\r\n <button mat-icon-button (click)=\"toggle()\" matTooltip=\"Menu\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n\r\n <img [src]=\"dataService.appConfig.logo\" style=\"height: 50px;\" />\r\n\r\n <div style=\"padding-left: 10px; \">\r\n\r\n <div style=\"font-size: 22px; font-weight: 400;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <!-- <div style=\"font-size: 20px; height: 25px; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div> -->\r\n\r\n <!-- <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n </div>\r\n\r\n\r\n\r\n <span class=\"toolbar-item-spacer\"></span>\r\n\r\n <!-- buttons -->\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <!-- <label style=\"font-size: 14px;\">Hi, {{loggedUserFullName}}</label> -->\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" matTooltip=\"Organisation Settings\">\r\n <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon>\r\n </button>\r\n <label style=\"font-size: 14px;margin-right: 20px;\">{{tenantName}}</label>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/bug')\" matTooltip=\"Support\">\r\n <mat-icon >help</mat-icon>\r\n </button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/notifications')\" matTooltip=\"Notifications\">\r\n <mat-icon [matBadge]=\"notificationCount$ | async\" [matBadgeHidden]=\"(notificationCount$ | async) === 0\" matBadgeColor=\"warn\" matBadgeSize=\"small\">notifications</mat-icon>\r\n </button>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button mat-icon-button matTooltip=\"My Account\" [matMenuTriggerFor]=\"userAccountMenu\"><mat-icon>account_circle</mat-icon></button>\r\n <label style=\"font-size: 14px;\">{{loggedUserFullName}}</label>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"logoff()\" matTooltip=\"Signout\">\r\n <mat-icon>logout</mat-icon>\r\n </button>\r\n\r\n\r\n <!-- my account menu -->\r\n <mat-menu #userAccountMenu [overlapTrigger]=\"false\" yPosition=\"below\">\r\n\r\n\r\n <button mat-menu-item routerLink=\"home/user/profile\">\r\n <mat-icon>person</mat-icon><span>Profile</span>\r\n </button>\r\n\r\n <button mat-menu-item routerLink=\"home/admin/bug\" *ngIf=\"dataService.appConfig.multitenant && smallScreen\">\r\n <mat-icon>help</mat-icon> <span>Help</span>\r\n </button>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <button mat-menu-item (click)=\"logoff()\">\r\n <mat-icon>logout</mat-icon>Logout\r\n </button>\r\n\r\n </mat-menu>\r\n\r\n</mat-toolbar>\r\n\r\n\r\n\r\n\r\n<mat-sidenav-container class=\"app-container\" [hasBackdrop]=\"smallScreen\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n\r\n <mat-sidenav #sidenav [mode]=\"smallScreen ? 'over' : 'side'\" [class.mat-elevation-z4]=\"true\" [opened]=\"isExpanded\" class=\"app-sidenav side-color\" style=\"height: 100%;\"\r\n [ngStyle]=\"{'width': dataService.appConfig.navWidth}\">\r\n <mat-nav-list >\r\n\r\n <ng-container *ngFor=\"let cap of dataService.appConfig.capItems\" >\r\n\r\n <!-- Menu item -->\r\n <mat-list-item [routerLink]=\"cap.link\" *ngIf=\"myRole[cap.name] && cap.showMenu && (!cap.capSubItems || cap.capSubItems && cap.ignoreSubsDisplay)\" style=\"height: 40px;font-size: 15px;\"\r\n (click)=\"smallScreen ? toggle() : null\">\r\n <mat-icon [ngStyle]=\"{'color': cap.color}\" style=\"margin-right: 5px;\">{{cap.icon}}</mat-icon>{{cap.display}}\r\n </mat-list-item>\r\n\r\n <!-- Menu With Sub items -->\r\n <mat-expansion-panel class=\"side-color\" [class.mat-elevation-z0]=\"true\" *ngIf=\"myRole[cap.name] && cap.showMenu && cap.capSubItems && !cap.ignoreSubsDisplay\">\r\n\r\n <mat-expansion-panel-header style=\"height: 40px;padding-left: 15px;\">\r\n <mat-icon [ngStyle]=\"{'color': cap.color}\" style=\"margin-right: 5px;\">{{cap.icon != 'navigate_next' ? cap.icon : 'fiber_manual_record' }}</mat-icon>{{cap.display}}\r\n </mat-expansion-panel-header>\r\n\r\n <!-- Sub items -->\r\n <mat-nav-list *ngFor=\"let capSub of getSubItems(cap)\">\r\n\r\n <mat-list-item [routerLink]=\"capSub.link\" style=\"height: 30px; font-size: 15px;\" (click)=\"smallScreen ? toggle() : null\" *ngIf=\"myRole[capSub.name] && capSub.showMenu\">\r\n <mat-icon [ngStyle]=\"{'color': capSub.color}\" style=\"margin-right: 5px;\">{{capSub.icon}}</mat-icon>{{capSub.display}}\r\n </mat-list-item>\r\n\r\n </mat-nav-list>\r\n\r\n </mat-expansion-panel>\r\n\r\n </ng-container>\r\n\r\n </mat-nav-list>\r\n </mat-sidenav>\r\n\r\n\r\n\r\n <mat-sidenav-content class=\"tin-bg-image\" style=\"padding: 0px 12px;\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <hr style=\"margin-top: 0px;\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n </mat-sidenav-content>\r\n\r\n</mat-sidenav-container>\r\n\r\n\r\n<!-- footer -->\r\n<div class=\"tin-center\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <label style=\"text-align: center; font-size: 12px;\">© {{nowDate | date : 'yyyy'}} <a color=\"primary\" class=\"terms-link\" [href]=\"appConfig.siteUrl\" target=\"_blank\">{{footer}}</a> | <a color=\"primary\" class=\"terms-link\" [href]=\"appConfig.privacyUrl\" target=\"_blank\">Privacy Policy</a>.</label>\r\n</div>\r\n\r\n\r\n<div class=\"tin-bg-image\" *ngIf=\"!loggedin && dataService.appConfig.navigation == 'side'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n", styles: ["a.navbar-brand{white-space:normal;text-align:center;word-break:break-all}html{font-size:14px}.box-shadow{box-shadow:0 .25rem .75rem #0000000d}.toolbar{height:60px;display:flex;align-items:center;background-color:#03a;color:#fff}.stack-top{z-index:9;margin:20px}.navitems{background-color:#03a}.toolbar-item-spacer{flex:1 1 auto}.app-container{height:90%;margin:0}.app-sidenav{width:200px}.side-color{background-color:#e6f4ff}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i10.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i11.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i13.MatNavList, selector: "mat-nav-list", inputs: ["disableRipple", "disabled"], exportAs: ["matNavList"] }, { kind: "component", type: i13.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["disableRipple", "disabled"], exportAs: ["matListItem"] }, { kind: "component", type: i14.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i15.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i16.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i16.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i16.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "component", type: i17.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i1.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i18.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i18.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i19.LoaderComponent, selector: "spa-loader", inputs: ["logo"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.DatePipe, name: "date" }] });
|
|
76
80
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NavMenuComponent, decorators: [{
|
|
77
81
|
type: Component,
|
|
78
|
-
args: [{ selector: 'spa-nav-menu', template: "<header *ngIf=\"loggedin && dataService.appConfig.navigation == 'top'\">\r\n\r\n <nav class=\"toolbar navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow mb-3 \" style=\"padding-right: 10px;\">\r\n\r\n\r\n <div class=\"container-fluid\" style=\"padding-right: 0px;\">\r\n\r\n <img *ngIf=\"appConfig.logo!=''\" [src]=\"appConfig.logo\" style=\"height: 50px; margin-right: 2em\" />\r\n\r\n <div>\r\n <!-- <div style=\"font-size: 20px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n <div *ngIf=\"!dataService.appConfig.multitenant\" style=\"font-size: 22px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\" style=\"font-size: 20px; ; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-label=\"Toggle navigation\" [attr.aria-expanded]=\"isExpanded\" (click)=\"toggle()\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"myRole\" class=\" navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse stack-top\" style=\"margin-right: 0px;\" [ngClass]=\"{ show: isExpanded, navitems: isExpanded }\" >\r\n\r\n <button mat-icon-button (click)=\"logoff()\" > <mat-icon>logout</mat-icon> </button>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >support_agent</mat-icon> </button>\r\n\r\n <!-- <button mat-icon-button (click)=\"redirectTo('home/admin/tenants')\"> <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button> -->\r\n </div>\r\n\r\n\r\n <button id=\"btnUser\" mat-button [matMenuTriggerFor]=\"profileMenu\" ><mat-icon style=\"font-size: 24px;\">account_circle</mat-icon> {{loggedUserFullName}}</button>\r\n\r\n <mat-menu #profileMenu=\"matMenu\">\r\n <button id=\"btnProfile\" mat-menu-item (click)=\"redirectTo('home/user/profile')\" >Profile</button>\r\n <button id=\"btnLogOff\" mat-menu-item (click)=\"logoff()\">Log Off</button>\r\n </mat-menu>\r\n\r\n <div *ngFor=\"let item of appConfig.capItems\">\r\n\r\n <!-- Menu Item -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && !item.capSubItems && item.showMenu\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items ignored -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && item.ignoreSubsDisplay\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items to display-->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && !item.ignoreSubsDisplay\" mat-button [matMenuTriggerFor]=\"adminMenu\">{{item.display}}</button>\r\n\r\n\r\n <!-- Sub Menu Items -->\r\n <mat-menu #adminMenu=\"matMenu\">\r\n\r\n <div *ngFor=\"let subItem of item.capSubItems\">\r\n\r\n <button *ngIf=\"myRole[subItem.name] && subItem.showMenu\" mat-menu-item (click)=\"redirectTo(subItem.link)\">{{subItem.display}}</button>\r\n\r\n </div>\r\n\r\n </mat-menu>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </nav>\r\n\r\n</header>\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"dataService.appConfig.navigation == 'top'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!-- SIDE -->\r\n<mat-toolbar class=\"tin-bg-image-toolbar\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\" style=\"padding: 0px 8px;\">\r\n\r\n <button mat-icon-button (click)=\"toggle()\" matTooltip=\"Menu\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n\r\n <img [src]=\"dataService.appConfig.logo\" style=\"height: 50px;\" />\r\n\r\n <div style=\"padding-left: 10px; \">\r\n\r\n <div style=\"font-size: 20px; height: 25px; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <span class=\"toolbar-item-spacer\"></span>\r\n\r\n <!-- buttons -->\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >help</mat-icon> </button>\r\n\r\n </div>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button matTooltip=\"Notifications\"><mat-icon>notifications</mat-icon></button>\r\n\r\n <button mat-icon-button matTooltip=\"My Account\" [matMenuTriggerFor]=\"userAccountMenu\"><mat-icon>account_circle</mat-icon></button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"logoff()\"> <mat-icon>logout</mat-icon></button>\r\n\r\n\r\n <!-- my account menu -->\r\n <mat-menu #userAccountMenu [overlapTrigger]=\"false\" yPosition=\"below\">\r\n\r\n <button mat-menu-item routerLink=\"home/user/profile\">\r\n <mat-icon>person</mat-icon><span>Profile</span>\r\n </button>\r\n\r\n <button mat-menu-item routerLink=\"home/admin/bug\" *ngIf=\"dataService.appConfig.multitenant && smallScreen\">\r\n <mat-icon>help</mat-icon> <span>Help</span>\r\n </button>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <button mat-menu-item (click)=\"logoff()\">\r\n <mat-icon>logout</mat-icon>Logout\r\n </button>\r\n\r\n </mat-menu>\r\n\r\n</mat-toolbar>\r\n\r\n\r\n\r\n\r\n<mat-sidenav-container class=\"app-container\" [hasBackdrop]=\"smallScreen\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n\r\n <mat-sidenav #sidenav [mode]=\"smallScreen ? 'over' : 'over'\" [class.mat-elevation-z4]=\"true\" [opened]=\"isExpanded\" class=\"app-sidenav side-color\" style=\"height: 100%;\">\r\n <mat-nav-list >\r\n\r\n <ng-container *ngFor=\"let cap of dataService.appConfig.capItems\" >\r\n\r\n <!-- Menu item -->\r\n <mat-list-item [routerLink]=\"cap.link\" *ngIf=\"myRole[cap.name] && cap.showMenu && (!cap.capSubItems || cap.capSubItems && cap.ignoreSubsDisplay)\" style=\"height: 40px;font-size: 15px;\" (click)=\"toggle()\">\r\n <mat-icon style=\"margin-right: 5px;\">{{cap.icon}}</mat-icon>{{cap.display}}\r\n </mat-list-item>\r\n\r\n <!-- Menu With Sub items -->\r\n <mat-expansion-panel class=\"side-color\" [class.mat-elevation-z0]=\"true\" *ngIf=\"myRole[cap.name] && cap.showMenu && cap.capSubItems && !cap.ignoreSubsDisplay\">\r\n\r\n <mat-expansion-panel-header style=\"height: 40px;padding-left: 15px;\">\r\n <mat-icon style=\"margin-right: 5px;\">{{cap.icon != 'navigate_next' ? cap.icon : 'fiber_manual_record' }}</mat-icon>{{cap.display}}\r\n </mat-expansion-panel-header>\r\n\r\n <!-- Sub items -->\r\n <mat-nav-list *ngFor=\"let capSub of cap.capSubItems\">\r\n\r\n <mat-list-item [routerLink]=\"capSub.link\" style=\"height: 30px; font-size: 15px;\" (click)=\"toggle()\" *ngIf=\"myRole[cap.name] && cap.showMenu\">\r\n <mat-icon style=\"margin-right: 5px;\">{{capSub.icon}}</mat-icon>{{capSub.display}}\r\n </mat-list-item>\r\n\r\n </mat-nav-list>\r\n\r\n </mat-expansion-panel>\r\n\r\n </ng-container>\r\n\r\n </mat-nav-list>\r\n </mat-sidenav>\r\n\r\n\r\n\r\n <mat-sidenav-content class=\"container-fluid tin-bg-image\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <hr style=\"margin-top: 0px;\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n </mat-sidenav-content>\r\n\r\n</mat-sidenav-container>\r\n\r\n\r\n<!-- footer -->\r\n<div class=\"tin-center\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <label style=\"text-align: center; font-size: 12px;\">© {{nowDate | date : 'yyyy'}} {{footer}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"!loggedin && dataService.appConfig.navigation == 'side'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n", styles: ["a.navbar-brand{white-space:normal;text-align:center;word-break:break-all}html{font-size:14px}.box-shadow{box-shadow:0 .25rem .75rem #0000000d}.toolbar{height:60px;display:flex;align-items:center;background-color:#03a;color:#fff}.stack-top{z-index:9;margin:20px}.navitems{background-color:#03a}.toolbar-item-spacer{flex:1 1 auto}.app-container{height:90%;margin:0}.app-sidenav{width:200px}.side-color{background-color:#def0fc}\n"] }]
|
|
79
|
-
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AuthService }, { type: i3.StorageService }, { type: i4.
|
|
82
|
+
args: [{ selector: 'spa-nav-menu', template: "<header *ngIf=\"loggedin && dataService.appConfig.navigation == 'top'\">\r\n\r\n <nav class=\"toolbar navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow mb-3 \" style=\"padding-right: 10px;\">\r\n\r\n\r\n <div class=\"container-fluid\" style=\"padding-right: 0px;\">\r\n\r\n <img *ngIf=\"appConfig.logo!=''\" [src]=\"appConfig.logo\" style=\"height: 50px; margin-right: 2em\" />\r\n\r\n <div>\r\n <!-- <div style=\"font-size: 20px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n <div *ngIf=\"!dataService.appConfig.multitenant\" style=\"font-size: 22px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\" style=\"font-size: 20px; ; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-label=\"Toggle navigation\" [attr.aria-expanded]=\"isExpanded\" (click)=\"toggle()\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"myRole\" class=\" navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse stack-top\" style=\"margin-right: 0px;\" [ngClass]=\"{ show: isExpanded, navitems: isExpanded }\" >\r\n\r\n <button mat-icon-button (click)=\"logoff()\" > <mat-icon>logout</mat-icon> </button>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >support_agent</mat-icon> </button>\r\n\r\n <!-- <button mat-icon-button (click)=\"redirectTo('home/admin/notifications')\"> <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button> -->\r\n </div>\r\n\r\n\r\n <button id=\"btnUser\" mat-button [matMenuTriggerFor]=\"profileMenu\" ><mat-icon style=\"font-size: 24px;\">account_circle</mat-icon> {{loggedUserFullName}}</button>\r\n\r\n <mat-menu #profileMenu=\"matMenu\">\r\n <button id=\"btnProfile\" mat-menu-item (click)=\"redirectTo('home/user/profile')\" >Profile</button>\r\n <button id=\"btnLogOff\" mat-menu-item (click)=\"logoff()\">Log Off</button>\r\n </mat-menu>\r\n\r\n <div *ngFor=\"let item of appConfig.capItems\">\r\n\r\n <!-- Menu Item -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && !item.capSubItems && item.showMenu\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items ignored -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && item.ignoreSubsDisplay\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items to display-->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && !item.ignoreSubsDisplay\" mat-button [matMenuTriggerFor]=\"adminMenu\">{{item.display}}</button>\r\n\r\n\r\n <!-- Sub Menu Items -->\r\n <mat-menu #adminMenu=\"matMenu\">\r\n\r\n <div *ngFor=\"let subItem of item.capSubItems\">\r\n\r\n <button *ngIf=\"myRole[subItem.name] && subItem.showMenu\" mat-menu-item (click)=\"redirectTo(subItem.link)\">{{subItem.display}}</button>\r\n\r\n </div>\r\n\r\n </mat-menu>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </nav>\r\n\r\n</header>\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"dataService.appConfig.navigation == 'top'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!-- SIDE -->\r\n<mat-toolbar class=\"tin-bg-image-toolbar\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\" style=\"padding: 0px 8px;\">\r\n\r\n <button mat-icon-button (click)=\"toggle()\" matTooltip=\"Menu\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n\r\n <img [src]=\"dataService.appConfig.logo\" style=\"height: 50px;\" />\r\n\r\n <div style=\"padding-left: 10px; \">\r\n\r\n <div style=\"font-size: 22px; font-weight: 400;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <!-- <div style=\"font-size: 20px; height: 25px; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div> -->\r\n\r\n <!-- <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n </div>\r\n\r\n\r\n\r\n <span class=\"toolbar-item-spacer\"></span>\r\n\r\n <!-- buttons -->\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <!-- <label style=\"font-size: 14px;\">Hi, {{loggedUserFullName}}</label> -->\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" matTooltip=\"Organisation Settings\">\r\n <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon>\r\n </button>\r\n <label style=\"font-size: 14px;margin-right: 20px;\">{{tenantName}}</label>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/bug')\" matTooltip=\"Support\">\r\n <mat-icon >help</mat-icon>\r\n </button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/notifications')\" matTooltip=\"Notifications\">\r\n <mat-icon [matBadge]=\"notificationCount$ | async\" [matBadgeHidden]=\"(notificationCount$ | async) === 0\" matBadgeColor=\"warn\" matBadgeSize=\"small\">notifications</mat-icon>\r\n </button>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button mat-icon-button matTooltip=\"My Account\" [matMenuTriggerFor]=\"userAccountMenu\"><mat-icon>account_circle</mat-icon></button>\r\n <label style=\"font-size: 14px;\">{{loggedUserFullName}}</label>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"logoff()\" matTooltip=\"Signout\">\r\n <mat-icon>logout</mat-icon>\r\n </button>\r\n\r\n\r\n <!-- my account menu -->\r\n <mat-menu #userAccountMenu [overlapTrigger]=\"false\" yPosition=\"below\">\r\n\r\n\r\n <button mat-menu-item routerLink=\"home/user/profile\">\r\n <mat-icon>person</mat-icon><span>Profile</span>\r\n </button>\r\n\r\n <button mat-menu-item routerLink=\"home/admin/bug\" *ngIf=\"dataService.appConfig.multitenant && smallScreen\">\r\n <mat-icon>help</mat-icon> <span>Help</span>\r\n </button>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <button mat-menu-item (click)=\"logoff()\">\r\n <mat-icon>logout</mat-icon>Logout\r\n </button>\r\n\r\n </mat-menu>\r\n\r\n</mat-toolbar>\r\n\r\n\r\n\r\n\r\n<mat-sidenav-container class=\"app-container\" [hasBackdrop]=\"smallScreen\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n\r\n <mat-sidenav #sidenav [mode]=\"smallScreen ? 'over' : 'side'\" [class.mat-elevation-z4]=\"true\" [opened]=\"isExpanded\" class=\"app-sidenav side-color\" style=\"height: 100%;\"\r\n [ngStyle]=\"{'width': dataService.appConfig.navWidth}\">\r\n <mat-nav-list >\r\n\r\n <ng-container *ngFor=\"let cap of dataService.appConfig.capItems\" >\r\n\r\n <!-- Menu item -->\r\n <mat-list-item [routerLink]=\"cap.link\" *ngIf=\"myRole[cap.name] && cap.showMenu && (!cap.capSubItems || cap.capSubItems && cap.ignoreSubsDisplay)\" style=\"height: 40px;font-size: 15px;\"\r\n (click)=\"smallScreen ? toggle() : null\">\r\n <mat-icon [ngStyle]=\"{'color': cap.color}\" style=\"margin-right: 5px;\">{{cap.icon}}</mat-icon>{{cap.display}}\r\n </mat-list-item>\r\n\r\n <!-- Menu With Sub items -->\r\n <mat-expansion-panel class=\"side-color\" [class.mat-elevation-z0]=\"true\" *ngIf=\"myRole[cap.name] && cap.showMenu && cap.capSubItems && !cap.ignoreSubsDisplay\">\r\n\r\n <mat-expansion-panel-header style=\"height: 40px;padding-left: 15px;\">\r\n <mat-icon [ngStyle]=\"{'color': cap.color}\" style=\"margin-right: 5px;\">{{cap.icon != 'navigate_next' ? cap.icon : 'fiber_manual_record' }}</mat-icon>{{cap.display}}\r\n </mat-expansion-panel-header>\r\n\r\n <!-- Sub items -->\r\n <mat-nav-list *ngFor=\"let capSub of getSubItems(cap)\">\r\n\r\n <mat-list-item [routerLink]=\"capSub.link\" style=\"height: 30px; font-size: 15px;\" (click)=\"smallScreen ? toggle() : null\" *ngIf=\"myRole[capSub.name] && capSub.showMenu\">\r\n <mat-icon [ngStyle]=\"{'color': capSub.color}\" style=\"margin-right: 5px;\">{{capSub.icon}}</mat-icon>{{capSub.display}}\r\n </mat-list-item>\r\n\r\n </mat-nav-list>\r\n\r\n </mat-expansion-panel>\r\n\r\n </ng-container>\r\n\r\n </mat-nav-list>\r\n </mat-sidenav>\r\n\r\n\r\n\r\n <mat-sidenav-content class=\"tin-bg-image\" style=\"padding: 0px 12px;\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <hr style=\"margin-top: 0px;\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n </mat-sidenav-content>\r\n\r\n</mat-sidenav-container>\r\n\r\n\r\n<!-- footer -->\r\n<div class=\"tin-center\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <label style=\"text-align: center; font-size: 12px;\">© {{nowDate | date : 'yyyy'}} <a color=\"primary\" class=\"terms-link\" [href]=\"appConfig.siteUrl\" target=\"_blank\">{{footer}}</a> | <a color=\"primary\" class=\"terms-link\" [href]=\"appConfig.privacyUrl\" target=\"_blank\">Privacy Policy</a>.</label>\r\n</div>\r\n\r\n\r\n<div class=\"tin-bg-image\" *ngIf=\"!loggedin && dataService.appConfig.navigation == 'side'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n", styles: ["a.navbar-brand{white-space:normal;text-align:center;word-break:break-all}html{font-size:14px}.box-shadow{box-shadow:0 .25rem .75rem #0000000d}.toolbar{height:60px;display:flex;align-items:center;background-color:#03a;color:#fff}.stack-top{z-index:9;margin:20px}.navitems{background-color:#03a}.toolbar-item-spacer{flex:1 1 auto}.app-container{height:90%;margin:0}.app-sidenav{width:200px}.side-color{background-color:#e6f4ff}\n"] }]
|
|
83
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AuthService }, { type: i3.StorageService }, { type: i4.NotificationsService }, { type: i5.SocialAuthService }, { type: i6.BreakpointObserver }, { type: i7.DataServiceLib }]; }, propDecorators: { appConfig: [{
|
|
80
84
|
type: Input
|
|
81
85
|
}], footer: [{
|
|
82
86
|
type: Input
|
|
83
87
|
}] } });
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbmF2LW1lbnUvbmF2LW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbmF2LW1lbnUvbmF2LW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBbUIsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWN6RCxNQUFNLE9BQU8sZ0JBQWdCO0lBRTNCLFlBQW1CLE1BQWMsRUFBUyxXQUF3QixFQUFVLGNBQThCLEVBQVUsYUFBZ0MsRUFBVSxrQkFBc0MsRUFBUyxXQUEyQjtRQUFyTixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBbUI7UUFBVSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBMkJ4TyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRW5CLFlBQU8sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBR1gsY0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDNUIsV0FBTSxHQUFXLG1DQUFtQyxDQUFDO1FBaEM1RCw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUF1QixFQUFFLEVBQUU7WUFFNUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTthQUN4QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTthQUN6QjtRQUVILENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVGLFFBQVE7UUFFTixJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUNyRixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUE7UUFDckUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFBO0lBRTNFLENBQUM7SUFpQkQsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTTtRQUNKLGdDQUFnQztRQUNoQywwQ0FBMEM7UUFDMUMsMkNBQTJDO1FBQzNDLDJDQUEyQztRQUMzQywrQkFBK0I7UUFDL0IsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFZO1FBRXJCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoQixJQUFJLElBQUksSUFBRSxFQUFFLEVBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDOUI7SUFFSCxDQUFDOzs2R0FyRVUsZ0JBQWdCO2lHQUFoQixnQkFBZ0IsMEdDZjdCLCt1U0FpT0E7MkZEbE5hLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxjQUFjO2tQQXNDZixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcENvbmZpZywgUm9sZSwgQ29uc3RhbnRzIH0gZnJvbSAnLi8uLi8uLi9jbGFzc2VzL0NsYXNzZXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgIEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTb2NpYWxBdXRoU2VydmljZSB9IGZyb20gJ0BhYmFjcml0dC9hbmd1bGFyeC1zb2NpYWwtbG9naW4nO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFsaWIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludFN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcGEtbmF2LW1lbnUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uYXYtbWVudS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmF2LW1lbnUuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYXZNZW51Q29tcG9uZW50IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHJvdXRlcjogUm91dGVyLCBwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSwgcHJpdmF0ZSBzb2NpYWxTZXJ2aWNlOiBTb2NpYWxBdXRoU2VydmljZSwgcHJpdmF0ZSBicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlciwgcHVibGljIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZUxpYiwpIHtcclxuICAgIC8vIGRldGVjdCBzY3JlZW4gc2l6ZSBjaGFuZ2VzXHJcbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKFtcIihtYXgtd2lkdGg6IDYwMHB4KVwiXSkuc3Vic2NyaWJlKChyZXN1bHQ6IEJyZWFrcG9pbnRTdGF0ZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKHJlc3VsdC5tYXRjaGVzKSB7XHJcbiAgICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IHRydWVcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNtYWxsU2NyZWVuID0gZmFsc2VcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nZ2VkVXNlckZ1bGxOYW1lLnN1YnNjcmliZSh1c2VyID0+IHRoaXMubG9nZ2VkVXNlckZ1bGxOYW1lID0gdXNlcilcclxuICAgIHRoaXMuYXV0aFNlcnZpY2UubXlSb2xlT2JzZXJ2LnN1YnNjcmliZShyb2wgPT4gdGhpcy5teVJvbGUgPSByb2wpO1xyXG4gICAgdGhpcy5hdXRoU2VydmljZS5sb2dnZWRpbk9ic2Vydi5zdWJzY3JpYmUob2JqID0+IHRoaXMubG9nZ2VkaW4gPSBvYmopXHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLnRlbmFudE5hbWVPYnNlcnYuc3Vic2NyaWJlKG9iaiA9PiB0aGlzLnRlbmFudE5hbWUgPSBvYmopXHJcblxyXG4gIH1cclxuXHJcbiAgc21hbGxTY3JlZW5cclxuICBteVJvbGU7XHJcbiAgbG9nZ2VkVXNlckZ1bGxOYW1lOiBzdHJpbmc7XHJcbiAgdGVuYW50TmFtZSA6IHN0cmluZztcclxuICBsb2dnZWRpbjogYm9vbGVhbjtcclxuICBpc0V4cGFuZGVkID0gZmFsc2U7XHJcblxyXG4gIG5vd0RhdGUgPSBuZXcgRGF0ZSgpXHJcblxyXG5cclxuICBASW5wdXQoKSBhcHBDb25maWcgPSBuZXcgQXBwQ29uZmlnKCk7XHJcbiAgQElucHV0KCkgZm9vdGVyOiBzdHJpbmcgPSAnYWxzcXVhcmV0ZWNoLm5ldCB8IFByaXZhY3kgUG9saWN5JztcclxuXHJcblxyXG5cclxuICBjb2xsYXBzZSgpIHtcclxuICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcclxuICB9XHJcblxyXG4gIGNsb3NlU2lkZSgpIHtcclxuICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbG9nb2ZmKCkge1xyXG4gICAgLy8gdGhpcy5zb2NpYWxTZXJ2aWNlLnNpZ25PdXQoKTtcclxuICAgIC8vIHRoaXMuYXV0aFNlcnZpY2UuVXBkYXRlbG9nZ2VkaW4oZmFsc2UpO1xyXG4gICAgLy8gdGhpcy5hdXRoU2VydmljZS5VcGRhdGVBdXRvTG9naW4oZmFsc2UpO1xyXG4gICAgLy8gdGhpcy5hdXRoU2VydmljZS5VcGRhdGVSb2xlKG5ldyBSb2xlKCkpO1xyXG4gICAgLy8gdGhpcy5zdG9yYWdlU2VydmljZS5jbGVhcigpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wibG9naW5cIl0pO1xyXG4gICAgdGhpcy5hdXRoU2VydmljZS5sb2dvZmYoKTtcclxuICB9XHJcblxyXG4gIHJlZGlyZWN0VG8obGluazogc3RyaW5nKXtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlKCk7XHJcblxyXG4gICAgaWYgKGxpbmshPVwiXCIpe1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbGlua10pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxufVxyXG4iLCI8aGVhZGVyICpuZ0lmPVwibG9nZ2VkaW4gJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3RvcCdcIj5cclxuXHJcbiAgPG5hdiBjbGFzcz1cInRvb2xiYXIgbmF2YmFyIG5hdmJhci1leHBhbmQtc20gbmF2YmFyLXRvZ2dsZWFibGUtc20gbmF2YmFyLWxpZ2h0ICBib3JkZXItYm90dG9tIGJveC1zaGFkb3cgbWItMyBcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCI+XHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDBweDtcIj5cclxuXHJcbiAgICAgIDxpbWcgKm5nSWY9XCJhcHBDb25maWcubG9nbyE9JydcIiBbc3JjXT1cImFwcENvbmZpZy5sb2dvXCIgc3R5bGU9XCJoZWlnaHQ6IDUwcHg7IG1hcmdpbi1yaWdodDogMmVtXCIgLz5cclxuXHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMjBweDtcIj5cclxuICAgICAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50ICYmIHRlbmFudE5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIj5cclxuICAgICAgICAgICAgICB7e3RlbmFudE5hbWV9fVxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50XCIgc3R5bGU9XCJmb250LXNpemU6IDIycHg7XCI+XHJcbiAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudFwiIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyA7IGZvbnQtd2VpZ2h0OiA0MDA7XCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50ID8gJzEycHgnIDogJyd9XCI+XHJcbiAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudCAmJiB0ZW5hbnROYW1lXCIgc3R5bGU9XCJmb250LXNpemU6IDEycHg7IG1hcmdpbi1ib3R0b206IDVweDtcIj5cclxuICAgICAgICAgIHt7dGVuYW50TmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLXRhcmdldD1cIi5uYXZiYXItY29sbGFwc2VcIiBhcmlhLWxhYmVsPVwiVG9nZ2xlIG5hdmlnYXRpb25cIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIiAoY2xpY2spPVwidG9nZ2xlKClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyLWljb25cIj48L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIm15Um9sZVwiIGNsYXNzPVwiIG5hdmJhci1jb2xsYXBzZSBjb2xsYXBzZSBkLXNtLWlubGluZS1mbGV4IGZsZXgtc20tcm93LXJldmVyc2Ugc3RhY2stdG9wXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDBweDtcIiBbbmdDbGFzc109XCJ7IHNob3c6IGlzRXhwYW5kZWQsIG5hdml0ZW1zOiBpc0V4cGFuZGVkIH1cIiA+XHJcblxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJsb2dvZmYoKVwiID4gPG1hdC1pY29uPmxvZ291dDwvbWF0LWljb24+IDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50XCI+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlZGlyZWN0VG8oJ2hvbWUvYWRtaW4vdGVuYW50LXNldHRpbmdzJylcIiA+IDxtYXQtaWNvbiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIj5hcGFydG1lbnQ8L21hdC1pY29uPiA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbygnaG9tZS9hZG1pbi9idWcnKVwiPiA8bWF0LWljb24gPnN1cHBvcnRfYWdlbnQ8L21hdC1pY29uPiA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKCdob21lL2FkbWluL3RlbmFudHMnKVwiPiA8bWF0LWljb24gZm9udFNldD1cIm1hdGVyaWFsLWljb25zLXJvdW5kXCI+YXBhcnRtZW50PC9tYXQtaWNvbj4gPC9idXR0b24+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBpZD1cImJ0blVzZXJcIiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJwcm9maWxlTWVudVwiICA+PG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4O1wiPmFjY291bnRfY2lyY2xlPC9tYXQtaWNvbj4gICZuYnNwO3t7bG9nZ2VkVXNlckZ1bGxOYW1lfX08L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPG1hdC1tZW51ICNwcm9maWxlTWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgIDxidXR0b24gaWQ9XCJidG5Qcm9maWxlXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVkaXJlY3RUbygnaG9tZS91c2VyL3Byb2ZpbGUnKVwiID5Qcm9maWxlPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuTG9nT2ZmXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwibG9nb2ZmKClcIj5Mb2cgT2ZmPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhcHBDb25maWcuY2FwSXRlbXNcIj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1lbnUgSXRlbSAtLT5cclxuICAgICAgICAgIDxidXR0b24gaWQ9XCJidG5NZW51XCIgKm5nSWY9XCJteVJvbGVbaXRlbS5uYW1lXSAmJiAhaXRlbS5jYXBTdWJJdGVtcyAmJiBpdGVtLnNob3dNZW51XCIgbWF0LWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbyhpdGVtLmxpbmspXCI+e3tpdGVtLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDwhLS0gTWVudSBJdGVtIHdpdGggU3ViIGl0ZW1zIGlnbm9yZWQgLS0+XHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuTWVudVwiICpuZ0lmPVwibXlSb2xlW2l0ZW0ubmFtZV0gJiYgaXRlbS5jYXBTdWJJdGVtcyAmJiBpdGVtLnNob3dNZW51ICYmIGl0ZW0uaWdub3JlU3Vic0Rpc3BsYXlcIiBtYXQtYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKGl0ZW0ubGluaylcIj57e2l0ZW0uZGlzcGxheX19PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPCEtLSBNZW51IEl0ZW0gd2l0aCBTdWIgaXRlbXMgdG8gZGlzcGxheS0tPlxyXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJ0bk1lbnVcIiAqbmdJZj1cIm15Um9sZVtpdGVtLm5hbWVdICYmIGl0ZW0uY2FwU3ViSXRlbXMgJiYgaXRlbS5zaG93TWVudSAmJiAhaXRlbS5pZ25vcmVTdWJzRGlzcGxheVwiIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFkbWluTWVudVwiPnt7aXRlbS5kaXNwbGF5fX08L2J1dHRvbj5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBTdWIgTWVudSBJdGVtcyAtLT5cclxuICAgICAgICAgIDxtYXQtbWVudSAjYWRtaW5NZW51PVwibWF0TWVudVwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBpdGVtLmNhcFN1Ykl0ZW1zXCI+XHJcblxyXG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJteVJvbGVbc3ViSXRlbS5uYW1lXSAmJiBzdWJJdGVtLnNob3dNZW51XCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVkaXJlY3RUbyhzdWJJdGVtLmxpbmspXCI+e3tzdWJJdGVtLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvbmF2PlxyXG5cclxuPC9oZWFkZXI+XHJcblxyXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIHRpbi1iZy1pbWFnZVwiICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3RvcCdcIj5cclxuICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XHJcbiAgPHNwYS1sb2FkZXIgW2xvZ29dPVwidGhpcy5kYXRhU2VydmljZS5hcHBDb25maWcubG9nb1wiPjwvc3BhLWxvYWRlcj5cclxuPC9kaXY+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbjwhLS0gU0lERSAtLT5cclxuPG1hdC10b29sYmFyIGNsYXNzPVwidGluLWJnLWltYWdlLXRvb2xiYXJcIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiIHN0eWxlPVwicGFkZGluZzogMHB4IDhweDtcIj5cclxuXHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInRvZ2dsZSgpXCIgbWF0VG9vbHRpcD1cIk1lbnVcIj5cclxuICAgIDxtYXQtaWNvbj5tZW51PC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPGltZyBbc3JjXT1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5sb2dvXCIgc3R5bGU9XCJoZWlnaHQ6IDUwcHg7XCIgLz5cclxuXHJcbiAgPGRpdiBzdHlsZT1cInBhZGRpbmctbGVmdDogMTBweDsgXCI+XHJcblxyXG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMjBweDsgaGVpZ2h0OiAyNXB4OyBmb250LXdlaWdodDogNDAwO1wiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudCA/ICcxMnB4JyA6ICcnfVwiPlxyXG4gICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJkYXRhU2VydmljZS5hcHBDb25maWcubXVsdGl0ZW5hbnQgJiYgdGVuYW50TmFtZVwiIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBtYXJnaW4tYm90dG9tOiA1cHg7XCI+XHJcbiAgICAgIHt7dGVuYW50TmFtZX19XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyLWl0ZW0tc3BhY2VyXCI+PC9zcGFuPlxyXG5cclxuICA8IS0tIGJ1dHRvbnMgLS0+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJkYXRhU2VydmljZS5hcHBDb25maWcubXVsdGl0ZW5hbnRcIj5cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbygnaG9tZS9hZG1pbi90ZW5hbnQtc2V0dGluZ3MnKVwiID4gPG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1yb3VuZFwiPmFwYXJ0bWVudDwvbWF0LWljb24+IDwvYnV0dG9uPlxyXG5cclxuICAgIDxidXR0b24gKm5nSWY9XCIhc21hbGxTY3JlZW5cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlZGlyZWN0VG8oJ2hvbWUvYWRtaW4vYnVnJylcIj4gPG1hdC1pY29uID5oZWxwPC9tYXQtaWNvbj4gPC9idXR0b24+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8YnV0dG9uICpuZ0lmPVwiIXNtYWxsU2NyZWVuXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJOb3RpZmljYXRpb25zXCI+PG1hdC1pY29uPm5vdGlmaWNhdGlvbnM8L21hdC1pY29uPjwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiTXkgQWNjb3VudFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ1c2VyQWNjb3VudE1lbnVcIj48bWF0LWljb24+YWNjb3VudF9jaXJjbGU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uICpuZ0lmPVwiIXNtYWxsU2NyZWVuXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJsb2dvZmYoKVwiPiA8bWF0LWljb24+bG9nb3V0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuXHJcblxyXG4gIDwhLS0gbXkgYWNjb3VudCBtZW51IC0tPlxyXG4gIDxtYXQtbWVudSAjdXNlckFjY291bnRNZW51IFtvdmVybGFwVHJpZ2dlcl09XCJmYWxzZVwiIHlQb3NpdGlvbj1cImJlbG93XCI+XHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIHJvdXRlckxpbms9XCJob21lL3VzZXIvcHJvZmlsZVwiPlxyXG4gICAgICA8bWF0LWljb24+cGVyc29uPC9tYXQtaWNvbj48c3Bhbj5Qcm9maWxlPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICByb3V0ZXJMaW5rPVwiaG9tZS9hZG1pbi9idWdcIiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudCAmJiBzbWFsbFNjcmVlblwiPlxyXG4gICAgICA8bWF0LWljb24+aGVscDwvbWF0LWljb24+IDxzcGFuPkhlbHA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImxvZ29mZigpXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5sb2dvdXQ8L21hdC1pY29uPkxvZ291dFxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gIDwvbWF0LW1lbnU+XHJcblxyXG48L21hdC10b29sYmFyPlxyXG5cclxuXHJcblxyXG5cclxuPG1hdC1zaWRlbmF2LWNvbnRhaW5lciBjbGFzcz1cImFwcC1jb250YWluZXJcIiBbaGFzQmFja2Ryb3BdPVwic21hbGxTY3JlZW5cIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiPlxyXG5cclxuICA8bWF0LXNpZGVuYXYgI3NpZGVuYXYgW21vZGVdPVwic21hbGxTY3JlZW4gPyAnb3ZlcicgOiAnb3ZlcidcIiBbY2xhc3MubWF0LWVsZXZhdGlvbi16NF09XCJ0cnVlXCIgW29wZW5lZF09XCJpc0V4cGFuZGVkXCIgIGNsYXNzPVwiYXBwLXNpZGVuYXYgc2lkZS1jb2xvclwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiPlxyXG4gICAgPG1hdC1uYXYtbGlzdCA+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYXAgb2YgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLmNhcEl0ZW1zXCIgPlxyXG5cclxuICAgICAgICA8IS0tIE1lbnUgaXRlbSAtLT5cclxuICAgICAgICA8bWF0LWxpc3QtaXRlbSBbcm91dGVyTGlua109XCJjYXAubGlua1wiICAqbmdJZj1cIm15Um9sZVtjYXAubmFtZV0gJiYgY2FwLnNob3dNZW51ICYmICghY2FwLmNhcFN1Ykl0ZW1zIHx8IGNhcC5jYXBTdWJJdGVtcyAmJiBjYXAuaWdub3JlU3Vic0Rpc3BsYXkpXCIgc3R5bGU9XCJoZWlnaHQ6IDQwcHg7Zm9udC1zaXplOiAxNXB4O1wiIChjbGljayk9XCJ0b2dnbGUoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA1cHg7XCI+e3tjYXAuaWNvbn19PC9tYXQtaWNvbj57e2NhcC5kaXNwbGF5fX1cclxuICAgICAgICA8L21hdC1saXN0LWl0ZW0+XHJcblxyXG4gICAgICAgIDwhLS0gTWVudSBXaXRoIFN1YiBpdGVtcyAtLT5cclxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBjbGFzcz1cInNpZGUtY29sb3JcIiBbY2xhc3MubWF0LWVsZXZhdGlvbi16MF09XCJ0cnVlXCIgICpuZ0lmPVwibXlSb2xlW2NhcC5uYW1lXSAmJiBjYXAuc2hvd01lbnUgJiYgY2FwLmNhcFN1Ykl0ZW1zICYmICFjYXAuaWdub3JlU3Vic0Rpc3BsYXlcIj5cclxuXHJcbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIgc3R5bGU9XCJoZWlnaHQ6IDQwcHg7cGFkZGluZy1sZWZ0OiAxNXB4O1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweDtcIj57e2NhcC5pY29uICE9ICduYXZpZ2F0ZV9uZXh0JyA/IGNhcC5pY29uIDogJ2ZpYmVyX21hbnVhbF9yZWNvcmQnIH19PC9tYXQtaWNvbj57e2NhcC5kaXNwbGF5fX1cclxuICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcblxyXG4gICAgICAgICAgPCEtLSBTdWIgaXRlbXMgLS0+XHJcbiAgICAgICAgICA8bWF0LW5hdi1saXN0ICpuZ0Zvcj1cImxldCBjYXBTdWIgb2YgY2FwLmNhcFN1Ykl0ZW1zXCI+XHJcblxyXG4gICAgICAgICAgICA8bWF0LWxpc3QtaXRlbSBbcm91dGVyTGlua109XCJjYXBTdWIubGlua1wiIHN0eWxlPVwiaGVpZ2h0OiAzMHB4OyBmb250LXNpemU6IDE1cHg7XCIgKGNsaWNrKT1cInRvZ2dsZSgpXCIgKm5nSWY9XCJteVJvbGVbY2FwLm5hbWVdICYmIGNhcC5zaG93TWVudVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cIm1hcmdpbi1yaWdodDogNXB4O1wiPnt7Y2FwU3ViLmljb259fTwvbWF0LWljb24+e3tjYXBTdWIuZGlzcGxheX19XHJcbiAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cclxuXHJcbiAgICAgICAgICA8L21hdC1uYXYtbGlzdD5cclxuXHJcbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPC9tYXQtbmF2LWxpc3Q+XHJcbiAgPC9tYXQtc2lkZW5hdj5cclxuXHJcblxyXG5cclxuICA8bWF0LXNpZGVuYXYtY29udGVudCBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCB0aW4tYmctaW1hZ2VcIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiPlxyXG4gICAgPGhyIHN0eWxlPVwibWFyZ2luLXRvcDogMHB4O1wiPlxyXG4gICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxyXG4gICAgPHNwYS1sb2FkZXIgW2xvZ29dPVwidGhpcy5kYXRhU2VydmljZS5hcHBDb25maWcubG9nb1wiPjwvc3BhLWxvYWRlcj5cclxuICA8L21hdC1zaWRlbmF2LWNvbnRlbnQ+XHJcblxyXG48L21hdC1zaWRlbmF2LWNvbnRhaW5lcj5cclxuXHJcblxyXG48IS0tIGZvb3RlciAtLT5cclxuPGRpdiBjbGFzcz1cInRpbi1jZW50ZXJcIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiPlxyXG4gIDxsYWJlbCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxMnB4O1wiPiZjb3B5OyB7e25vd0RhdGUgfCBkYXRlIDogJ3l5eXknfX0ge3tmb290ZXJ9fTwvbGFiZWw+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgdGluLWJnLWltYWdlXCIgKm5nSWY9XCIhbG9nZ2VkaW4gJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3NpZGUnXCI+XHJcbiAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxyXG4gIDxzcGEtbG9hZGVyIFtsb2dvXT1cInRoaXMuZGF0YVNlcnZpY2UuYXBwQ29uZmlnLmxvZ29cIj48L3NwYS1sb2FkZXI+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbmF2LW1lbnUvbmF2LW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbmF2LW1lbnUvbmF2LW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsR0FBWSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlekQsTUFBTSxPQUFPLGdCQUFnQjtJQUUzQixZQUFtQixNQUFjLEVBQVMsV0FBd0IsRUFBVSxjQUE4QixFQUFVLG9CQUEwQyxFQUNwSixhQUFnQyxFQUFVLGtCQUFzQyxFQUFTLFdBQTJCO1FBRDNHLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBUyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFVLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDcEosa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBQVUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFTLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQTBCOUgsdUJBQWtCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDO1FBTWxFLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFbkIsWUFBTyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFHWCxjQUFTLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM1QixXQUFNLEdBQVcsa0JBQWtCLENBQUM7UUFyQzNDLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQXVCLEVBQUUsRUFBRTtZQUU1RixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO2FBQ3hCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO2FBQ3pCO1FBRUgsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUYsUUFBUTtRQUVOLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxDQUFBO1FBQ3JGLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUNyRSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUE7UUFFekUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDeEI7SUFFSCxDQUFDO0lBa0JELFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBWTtRQUVyQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEIsSUFBSSxJQUFJLElBQUUsRUFBRSxFQUFDO1lBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQzlCO0lBRUgsQ0FBQztJQUdELFdBQVcsQ0FBQyxPQUFpQjtRQUMzQixPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUUsQ0FBQztJQUNuRSxDQUFDOzs2R0ExRVUsZ0JBQWdCO2lHQUFoQixnQkFBZ0IsMEdDaEI3Qix5M1VBc1BBOzJGRHRPYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsY0FBYztxUkE0Q2YsU0FBUztzQkFBakIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBDb25maWcsIENhcEl0ZW0sIH0gZnJvbSAnLi8uLi8uLi9jbGFzc2VzL0NsYXNzZXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgIEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTb2NpYWxBdXRoU2VydmljZSB9IGZyb20gJ0BhYmFjcml0dC9hbmd1bGFyeC1zb2NpYWwtbG9naW4nO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFsaWIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludFN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9ucy5zZXJ2aWNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NwYS1uYXYtbWVudScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25hdi1tZW51LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uYXYtbWVudS5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5hdk1lbnVDb21wb25lbnQge1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcm91dGVyOiBSb3V0ZXIsIHB1YmxpYyBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLCBwcml2YXRlIG5vdGlmaWNhdGlvbnNTZXJ2aWNlOiBOb3RpZmljYXRpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgc29jaWFsU2VydmljZTogU29jaWFsQXV0aFNlcnZpY2UsIHByaXZhdGUgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIsIHB1YmxpYyBkYXRhU2VydmljZTogRGF0YVNlcnZpY2VMaWIsKSB7XHJcbiAgICAvLyBkZXRlY3Qgc2NyZWVuIHNpemUgY2hhbmdlc1xyXG4gICAgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXIub2JzZXJ2ZShbXCIobWF4LXdpZHRoOiA2MDBweClcIl0pLnN1YnNjcmliZSgocmVzdWx0OiBCcmVha3BvaW50U3RhdGUpID0+IHtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQubWF0Y2hlcykge1xyXG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW4gPSB0cnVlXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IGZhbHNlXHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmxvZ2dlZFVzZXJGdWxsTmFtZS5zdWJzY3JpYmUodXNlciA9PiB0aGlzLmxvZ2dlZFVzZXJGdWxsTmFtZSA9IHVzZXIpXHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLm15Um9sZU9ic2Vydi5zdWJzY3JpYmUocm9sID0+IHRoaXMubXlSb2xlID0gcm9sKTtcclxuICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nZ2VkaW5PYnNlcnYuc3Vic2NyaWJlKG9iaiA9PiB0aGlzLmxvZ2dlZGluID0gb2JqKVxyXG4gICAgdGhpcy5hdXRoU2VydmljZS50ZW5hbnROYW1lT2JzZXJ2LnN1YnNjcmliZShvYmogPT4gdGhpcy50ZW5hbnROYW1lID0gb2JqKVxyXG5cclxuICAgIGlmICghdGhpcy5zbWFsbFNjcmVlbikge1xyXG4gICAgICB0aGlzLmlzRXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIG5vdGlmaWNhdGlvbkNvdW50JCA9IHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2Uubm90aWZpY2F0aW9uQ291bnQkO1xyXG4gIHNtYWxsU2NyZWVuXHJcbiAgbXlSb2xlO1xyXG4gIGxvZ2dlZFVzZXJGdWxsTmFtZTogc3RyaW5nO1xyXG4gIHRlbmFudE5hbWUgOiBzdHJpbmc7XHJcbiAgbG9nZ2VkaW46IGJvb2xlYW47XHJcbiAgaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG5cclxuICBub3dEYXRlID0gbmV3IERhdGUoKVxyXG5cclxuXHJcbiAgQElucHV0KCkgYXBwQ29uZmlnID0gbmV3IEFwcENvbmZpZygpO1xyXG4gIEBJbnB1dCgpIGZvb3Rlcjogc3RyaW5nID0gJ2Fsc3F1YXJldGVjaC5uZXQnO1xyXG5cclxuXHJcblxyXG4gIGNvbGxhcHNlKCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGUoKSB7XHJcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSAhdGhpcy5pc0V4cGFuZGVkO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VTaWRlKCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBsb2dvZmYoKSB7XHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmxvZ29mZigpO1xyXG4gIH1cclxuXHJcbiAgcmVkaXJlY3RUbyhsaW5rOiBzdHJpbmcpe1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2UoKTtcclxuXHJcbiAgICBpZiAobGluayE9XCJcIil7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtsaW5rXSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGdldFN1Ykl0ZW1zKGNhcEl0ZW0gOiBDYXBJdGVtKSA6IENhcEl0ZW1bXSB7XHJcbiAgICByZXR1cm4gY2FwSXRlbS5jYXBTdWJJdGVtcy5maWx0ZXIoeCA9PiB4LnNob3dNZW51ICYmICF4LmlzQm9vbCApO1xyXG4gIH1cclxuXHJcblxyXG5cclxufVxyXG4iLCI8aGVhZGVyICpuZ0lmPVwibG9nZ2VkaW4gJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3RvcCdcIj5cclxuXHJcbiAgPG5hdiBjbGFzcz1cInRvb2xiYXIgbmF2YmFyIG5hdmJhci1leHBhbmQtc20gbmF2YmFyLXRvZ2dsZWFibGUtc20gbmF2YmFyLWxpZ2h0ICBib3JkZXItYm90dG9tIGJveC1zaGFkb3cgbWItMyBcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCI+XHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDBweDtcIj5cclxuXHJcbiAgICAgIDxpbWcgKm5nSWY9XCJhcHBDb25maWcubG9nbyE9JydcIiBbc3JjXT1cImFwcENvbmZpZy5sb2dvXCIgc3R5bGU9XCJoZWlnaHQ6IDUwcHg7IG1hcmdpbi1yaWdodDogMmVtXCIgLz5cclxuXHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMjBweDtcIj5cclxuICAgICAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50ICYmIHRlbmFudE5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIj5cclxuICAgICAgICAgICAgICB7e3RlbmFudE5hbWV9fVxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50XCIgc3R5bGU9XCJmb250LXNpemU6IDIycHg7XCI+XHJcbiAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudFwiIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyA7IGZvbnQtd2VpZ2h0OiA0MDA7XCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50ID8gJzEycHgnIDogJyd9XCI+XHJcbiAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudCAmJiB0ZW5hbnROYW1lXCIgc3R5bGU9XCJmb250LXNpemU6IDEycHg7IG1hcmdpbi1ib3R0b206IDVweDtcIj5cclxuICAgICAgICAgIHt7dGVuYW50TmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLXRhcmdldD1cIi5uYXZiYXItY29sbGFwc2VcIiBhcmlhLWxhYmVsPVwiVG9nZ2xlIG5hdmlnYXRpb25cIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIiAoY2xpY2spPVwidG9nZ2xlKClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyLWljb25cIj48L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIm15Um9sZVwiIGNsYXNzPVwiIG5hdmJhci1jb2xsYXBzZSBjb2xsYXBzZSBkLXNtLWlubGluZS1mbGV4IGZsZXgtc20tcm93LXJldmVyc2Ugc3RhY2stdG9wXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDBweDtcIiBbbmdDbGFzc109XCJ7IHNob3c6IGlzRXhwYW5kZWQsIG5hdml0ZW1zOiBpc0V4cGFuZGVkIH1cIiA+XHJcblxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJsb2dvZmYoKVwiID4gPG1hdC1pY29uPmxvZ291dDwvbWF0LWljb24+IDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50XCI+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlZGlyZWN0VG8oJ2hvbWUvYWRtaW4vdGVuYW50LXNldHRpbmdzJylcIiA+IDxtYXQtaWNvbiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIj5hcGFydG1lbnQ8L21hdC1pY29uPiA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbygnaG9tZS9hZG1pbi9idWcnKVwiPiA8bWF0LWljb24gPnN1cHBvcnRfYWdlbnQ8L21hdC1pY29uPiA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKCdob21lL2FkbWluL25vdGlmaWNhdGlvbnMnKVwiPiA8bWF0LWljb24gZm9udFNldD1cIm1hdGVyaWFsLWljb25zLXJvdW5kXCI+YXBhcnRtZW50PC9tYXQtaWNvbj4gPC9idXR0b24+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBpZD1cImJ0blVzZXJcIiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJwcm9maWxlTWVudVwiICA+PG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4O1wiPmFjY291bnRfY2lyY2xlPC9tYXQtaWNvbj4gICZuYnNwO3t7bG9nZ2VkVXNlckZ1bGxOYW1lfX08L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPG1hdC1tZW51ICNwcm9maWxlTWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgIDxidXR0b24gaWQ9XCJidG5Qcm9maWxlXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVkaXJlY3RUbygnaG9tZS91c2VyL3Byb2ZpbGUnKVwiID5Qcm9maWxlPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuTG9nT2ZmXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwibG9nb2ZmKClcIj5Mb2cgT2ZmPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhcHBDb25maWcuY2FwSXRlbXNcIj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1lbnUgSXRlbSAtLT5cclxuICAgICAgICAgIDxidXR0b24gaWQ9XCJidG5NZW51XCIgKm5nSWY9XCJteVJvbGVbaXRlbS5uYW1lXSAmJiAhaXRlbS5jYXBTdWJJdGVtcyAmJiBpdGVtLnNob3dNZW51XCIgbWF0LWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbyhpdGVtLmxpbmspXCI+e3tpdGVtLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDwhLS0gTWVudSBJdGVtIHdpdGggU3ViIGl0ZW1zIGlnbm9yZWQgLS0+XHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuTWVudVwiICpuZ0lmPVwibXlSb2xlW2l0ZW0ubmFtZV0gJiYgaXRlbS5jYXBTdWJJdGVtcyAmJiBpdGVtLnNob3dNZW51ICYmIGl0ZW0uaWdub3JlU3Vic0Rpc3BsYXlcIiBtYXQtYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKGl0ZW0ubGluaylcIj57e2l0ZW0uZGlzcGxheX19PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPCEtLSBNZW51IEl0ZW0gd2l0aCBTdWIgaXRlbXMgdG8gZGlzcGxheS0tPlxyXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJ0bk1lbnVcIiAqbmdJZj1cIm15Um9sZVtpdGVtLm5hbWVdICYmIGl0ZW0uY2FwU3ViSXRlbXMgJiYgaXRlbS5zaG93TWVudSAmJiAhaXRlbS5pZ25vcmVTdWJzRGlzcGxheVwiIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFkbWluTWVudVwiPnt7aXRlbS5kaXNwbGF5fX08L2J1dHRvbj5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBTdWIgTWVudSBJdGVtcyAtLT5cclxuICAgICAgICAgIDxtYXQtbWVudSAjYWRtaW5NZW51PVwibWF0TWVudVwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBpdGVtLmNhcFN1Ykl0ZW1zXCI+XHJcblxyXG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJteVJvbGVbc3ViSXRlbS5uYW1lXSAmJiBzdWJJdGVtLnNob3dNZW51XCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVkaXJlY3RUbyhzdWJJdGVtLmxpbmspXCI+e3tzdWJJdGVtLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvbmF2PlxyXG5cclxuPC9oZWFkZXI+XHJcblxyXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIHRpbi1iZy1pbWFnZVwiICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3RvcCdcIj5cclxuICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XHJcbiAgPHNwYS1sb2FkZXIgW2xvZ29dPVwidGhpcy5kYXRhU2VydmljZS5hcHBDb25maWcubG9nb1wiPjwvc3BhLWxvYWRlcj5cclxuPC9kaXY+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbjwhLS0gU0lERSAtLT5cclxuPG1hdC10b29sYmFyIGNsYXNzPVwidGluLWJnLWltYWdlLXRvb2xiYXJcIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiIHN0eWxlPVwicGFkZGluZzogMHB4IDhweDtcIj5cclxuXHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInRvZ2dsZSgpXCIgbWF0VG9vbHRpcD1cIk1lbnVcIj5cclxuICAgIDxtYXQtaWNvbj5tZW51PC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPGltZyBbc3JjXT1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5sb2dvXCIgc3R5bGU9XCJoZWlnaHQ6IDUwcHg7XCIgLz5cclxuXHJcbiAgPGRpdiBzdHlsZT1cInBhZGRpbmctbGVmdDogMTBweDsgXCI+XHJcblxyXG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMjJweDsgZm9udC13ZWlnaHQ6IDQwMDtcIj5cclxuICAgICAge3thcHBDb25maWcuYXBwTmFtZX19XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDIwcHg7IGhlaWdodDogMjVweDsgZm9udC13ZWlnaHQ6IDQwMDtcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBkYXRhU2VydmljZS5hcHBDb25maWcubXVsdGl0ZW5hbnQgPyAnMTJweCcgOiAnJ31cIj5cclxuICAgICAge3thcHBDb25maWcuYXBwTmFtZX19XHJcbiAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgPCEtLSA8ZGl2ICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50ICYmIHRlbmFudE5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDsgbWFyZ2luLWJvdHRvbTogNXB4O1wiPlxyXG4gICAgICB7e3RlbmFudE5hbWV9fVxyXG4gICAgPC9kaXY+IC0tPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICA8c3BhbiBjbGFzcz1cInRvb2xiYXItaXRlbS1zcGFjZXJcIj48L3NwYW4+XHJcblxyXG4gIDwhLS0gYnV0dG9ucyAtLT5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudFwiPlxyXG5cclxuICAgIDwhLS0gPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiPkhpLCB7e2xvZ2dlZFVzZXJGdWxsTmFtZX19PC9sYWJlbD4gLS0+XHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlZGlyZWN0VG8oJ2hvbWUvYWRtaW4vdGVuYW50LXNldHRpbmdzJylcIiBtYXRUb29sdGlwPVwiT3JnYW5pc2F0aW9uIFNldHRpbmdzXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIj5hcGFydG1lbnQ8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDE0cHg7bWFyZ2luLXJpZ2h0OiAyMHB4O1wiPnt7dGVuYW50TmFtZX19PC9sYWJlbD5cclxuXHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiIXNtYWxsU2NyZWVuXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKCdob21lL2FkbWluL2J1ZycpXCIgIG1hdFRvb2x0aXA9XCJTdXBwb3J0XCI+XHJcbiAgICAgIDxtYXQtaWNvbiA+aGVscDwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiIXNtYWxsU2NyZWVuXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKCdob21lL2FkbWluL25vdGlmaWNhdGlvbnMnKVwiIG1hdFRvb2x0aXA9XCJOb3RpZmljYXRpb25zXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBbbWF0QmFkZ2VdPVwibm90aWZpY2F0aW9uQ291bnQkIHwgYXN5bmNcIiBbbWF0QmFkZ2VIaWRkZW5dPVwiKG5vdGlmaWNhdGlvbkNvdW50JCB8IGFzeW5jKSA9PT0gMFwiIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCIgbWF0QmFkZ2VTaXplPVwic21hbGxcIj5ub3RpZmljYXRpb25zPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiTXkgQWNjb3VudFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ1c2VyQWNjb3VudE1lbnVcIj48bWF0LWljb24+YWNjb3VudF9jaXJjbGU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDtcIj57e2xvZ2dlZFVzZXJGdWxsTmFtZX19PC9sYWJlbD5cclxuXHJcbiAgPGJ1dHRvbiAqbmdJZj1cIiFzbWFsbFNjcmVlblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwibG9nb2ZmKClcIiAgbWF0VG9vbHRpcD1cIlNpZ25vdXRcIj5cclxuICAgIDxtYXQtaWNvbj5sb2dvdXQ8L21hdC1pY29uPlxyXG4gIDwvYnV0dG9uPlxyXG5cclxuXHJcbiAgPCEtLSBteSBhY2NvdW50IG1lbnUgLS0+XHJcbiAgPG1hdC1tZW51ICN1c2VyQWNjb3VudE1lbnUgW292ZXJsYXBUcmlnZ2VyXT1cImZhbHNlXCIgeVBvc2l0aW9uPVwiYmVsb3dcIj5cclxuXHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIHJvdXRlckxpbms9XCJob21lL3VzZXIvcHJvZmlsZVwiPlxyXG4gICAgICA8bWF0LWljb24+cGVyc29uPC9tYXQtaWNvbj48c3Bhbj5Qcm9maWxlPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICByb3V0ZXJMaW5rPVwiaG9tZS9hZG1pbi9idWdcIiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudCAmJiBzbWFsbFNjcmVlblwiPlxyXG4gICAgICA8bWF0LWljb24+aGVscDwvbWF0LWljb24+IDxzcGFuPkhlbHA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImxvZ29mZigpXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5sb2dvdXQ8L21hdC1pY29uPkxvZ291dFxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gIDwvbWF0LW1lbnU+XHJcblxyXG48L21hdC10b29sYmFyPlxyXG5cclxuXHJcblxyXG5cclxuPG1hdC1zaWRlbmF2LWNvbnRhaW5lciBjbGFzcz1cImFwcC1jb250YWluZXJcIiBbaGFzQmFja2Ryb3BdPVwic21hbGxTY3JlZW5cIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiPlxyXG5cclxuICA8bWF0LXNpZGVuYXYgI3NpZGVuYXYgW21vZGVdPVwic21hbGxTY3JlZW4gPyAnb3ZlcicgOiAnc2lkZSdcIiBbY2xhc3MubWF0LWVsZXZhdGlvbi16NF09XCJ0cnVlXCIgW29wZW5lZF09XCJpc0V4cGFuZGVkXCIgIGNsYXNzPVwiYXBwLXNpZGVuYXYgc2lkZS1jb2xvclwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiXHJcbiAgW25nU3R5bGVdPVwieyd3aWR0aCc6IGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZXaWR0aH1cIj5cclxuICAgIDxtYXQtbmF2LWxpc3QgPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FwIG9mIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5jYXBJdGVtc1wiID5cclxuXHJcbiAgICAgICAgPCEtLSBNZW51IGl0ZW0gLS0+XHJcbiAgICAgICAgPG1hdC1saXN0LWl0ZW0gW3JvdXRlckxpbmtdPVwiY2FwLmxpbmtcIiAgKm5nSWY9XCJteVJvbGVbY2FwLm5hbWVdICYmIGNhcC5zaG93TWVudSAmJiAoIWNhcC5jYXBTdWJJdGVtcyB8fCBjYXAuY2FwU3ViSXRlbXMgJiYgY2FwLmlnbm9yZVN1YnNEaXNwbGF5KVwiIHN0eWxlPVwiaGVpZ2h0OiA0MHB4O2ZvbnQtc2l6ZTogMTVweDtcIlxyXG4gICAgICAgIChjbGljayk9XCJzbWFsbFNjcmVlbiA/IHRvZ2dsZSgpIDogbnVsbFwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIFtuZ1N0eWxlXT1cInsnY29sb3InOiBjYXAuY29sb3J9XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweDtcIj57e2NhcC5pY29ufX08L21hdC1pY29uPnt7Y2FwLmRpc3BsYXl9fVxyXG4gICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cclxuXHJcbiAgICAgICAgPCEtLSBNZW51IFdpdGggU3ViIGl0ZW1zIC0tPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIGNsYXNzPVwic2lkZS1jb2xvclwiIFtjbGFzcy5tYXQtZWxldmF0aW9uLXowXT1cInRydWVcIiAgKm5nSWY9XCJteVJvbGVbY2FwLm5hbWVdICYmIGNhcC5zaG93TWVudSAmJiBjYXAuY2FwU3ViSXRlbXMgJiYgIWNhcC5pZ25vcmVTdWJzRGlzcGxheVwiPlxyXG5cclxuICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciBzdHlsZT1cImhlaWdodDogNDBweDtwYWRkaW5nLWxlZnQ6IDE1cHg7XCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogY2FwLmNvbG9yfVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA1cHg7XCI+e3tjYXAuaWNvbiAhPSAnbmF2aWdhdGVfbmV4dCcgPyBjYXAuaWNvbiA6ICdmaWJlcl9tYW51YWxfcmVjb3JkJyB9fTwvbWF0LWljb24+e3tjYXAuZGlzcGxheX19XHJcbiAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG5cclxuICAgICAgICAgIDwhLS0gU3ViIGl0ZW1zIC0tPlxyXG4gICAgICAgICAgPG1hdC1uYXYtbGlzdCAqbmdGb3I9XCJsZXQgY2FwU3ViIG9mIGdldFN1Ykl0ZW1zKGNhcClcIj5cclxuXHJcbiAgICAgICAgICAgIDxtYXQtbGlzdC1pdGVtIFtyb3V0ZXJMaW5rXT1cImNhcFN1Yi5saW5rXCIgc3R5bGU9XCJoZWlnaHQ6IDMwcHg7IGZvbnQtc2l6ZTogMTVweDtcIiAoY2xpY2spPVwic21hbGxTY3JlZW4gPyB0b2dnbGUoKSA6IG51bGxcIiAqbmdJZj1cIm15Um9sZVtjYXBTdWIubmFtZV0gJiYgY2FwU3ViLnNob3dNZW51XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIFtuZ1N0eWxlXT1cInsnY29sb3InOiBjYXBTdWIuY29sb3J9XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweDtcIj57e2NhcFN1Yi5pY29ufX08L21hdC1pY29uPnt7Y2FwU3ViLmRpc3BsYXl9fVxyXG4gICAgICAgICAgICA8L21hdC1saXN0LWl0ZW0+XHJcblxyXG4gICAgICAgICAgPC9tYXQtbmF2LWxpc3Q+XHJcblxyXG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuXHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwvbWF0LW5hdi1saXN0PlxyXG4gIDwvbWF0LXNpZGVuYXY+XHJcblxyXG5cclxuXHJcbiAgPG1hdC1zaWRlbmF2LWNvbnRlbnQgY2xhc3M9XCJ0aW4tYmctaW1hZ2VcIiBzdHlsZT1cInBhZGRpbmc6IDBweCAxMnB4O1wiICpuZ0lmPVwibG9nZ2VkaW4gJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3NpZGUnXCI+XHJcbiAgICA8aHIgc3R5bGU9XCJtYXJnaW4tdG9wOiAwcHg7XCI+XHJcbiAgICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XHJcbiAgICA8c3BhLWxvYWRlciBbbG9nb109XCJ0aGlzLmRhdGFTZXJ2aWNlLmFwcENvbmZpZy5sb2dvXCI+PC9zcGEtbG9hZGVyPlxyXG4gIDwvbWF0LXNpZGVuYXYtY29udGVudD5cclxuXHJcbjwvbWF0LXNpZGVuYXYtY29udGFpbmVyPlxyXG5cclxuXHJcbjwhLS0gZm9vdGVyIC0tPlxyXG48ZGl2IGNsYXNzPVwidGluLWNlbnRlclwiICpuZ0lmPVwibG9nZ2VkaW4gJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3NpZGUnXCI+XHJcbiAgPGxhYmVsIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDEycHg7XCI+JmNvcHk7IHt7bm93RGF0ZSB8IGRhdGUgOiAneXl5eSd9fSA8YSBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cInRlcm1zLWxpbmtcIiBbaHJlZl09XCJhcHBDb25maWcuc2l0ZVVybFwiIHRhcmdldD1cIl9ibGFua1wiPnt7Zm9vdGVyfX08L2E+IHwgPGEgY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJ0ZXJtcy1saW5rXCIgW2hyZWZdPVwiYXBwQ29uZmlnLnByaXZhY3lVcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIj5Qcml2YWN5IFBvbGljeTwvYT4uPC9sYWJlbD5cclxuPC9kaXY+XHJcblxyXG5cclxuPGRpdiBjbGFzcz1cInRpbi1iZy1pbWFnZVwiICpuZ0lmPVwiIWxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiPlxyXG4gIDxyb3V0ZXItb3V0bGV0Pjwvcm91dGVyLW91dGxldD5cclxuICA8c3BhLWxvYWRlciBbbG9nb109XCJ0aGlzLmRhdGFTZXJ2aWNlLmFwcENvbmZpZy5sb2dvXCI+PC9zcGEtbG9hZGVyPlxyXG48L2Rpdj5cclxuIl19
|