@universis/ngx-tables 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +163 -0
- package/README.md +121 -0
- package/bundles/universis-ngx-tables.umd.js +4591 -0
- package/bundles/universis-ngx-tables.umd.js.map +1 -0
- package/bundles/universis-ngx-tables.umd.min.js +2 -0
- package/bundles/universis-ngx-tables.umd.min.js.map +1 -0
- package/esm2015/lib/components/add-items/add-items.component.js +142 -0
- package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +120 -0
- package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +53 -0
- package/esm2015/lib/components/advanced-list/advanced-list.component.js +173 -0
- package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +175 -0
- package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +134 -0
- package/esm2015/lib/components/advanced-select/advanced-select.component.js +51 -0
- package/esm2015/lib/components/advanced-select/advanced-select.service.js +40 -0
- package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +37 -0
- package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +44 -0
- package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +23 -0
- package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +519 -0
- package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +109 -0
- package/esm2015/lib/components/advanced-table/advanced-table.component.js +1007 -0
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +16 -0
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +271 -0
- package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +2 -0
- package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +379 -0
- package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +52 -0
- package/esm2015/lib/directives/advanced-table-editor.directive.js +157 -0
- package/esm2015/lib/directives/btnexp.directive.js +225 -0
- package/esm2015/lib/i18n/tables.el.js +104 -0
- package/esm2015/lib/i18n/tables.en.js +103 -0
- package/esm2015/lib/pipes/advanced-aggregator.pipe.js +35 -0
- package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +46 -0
- package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +117 -0
- package/esm2015/lib/tables.activated-table.service.js +36 -0
- package/esm2015/lib/tables.module.js +134 -0
- package/esm2015/public_api.js +22 -0
- package/esm2015/universis-ngx-tables.js +14 -0
- package/esm5/lib/components/add-items/add-items.component.js +153 -0
- package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +169 -0
- package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +56 -0
- package/esm5/lib/components/advanced-list/advanced-list.component.js +185 -0
- package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +179 -0
- package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +137 -0
- package/esm5/lib/components/advanced-select/advanced-select.component.js +56 -0
- package/esm5/lib/components/advanced-select/advanced-select.service.js +43 -0
- package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +50 -0
- package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +48 -0
- package/esm5/lib/components/advanced-table/advanced-table-search-base.js +29 -0
- package/esm5/lib/components/advanced-table/advanced-table-search.component.js +556 -0
- package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +115 -0
- package/esm5/lib/components/advanced-table/advanced-table.component.js +1035 -0
- package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +16 -0
- package/esm5/lib/components/advanced-table/advanced-table.formatters.js +313 -0
- package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +2 -0
- package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +295 -0
- package/esm5/lib/components/table-simple-header/table-simple-header.component.js +58 -0
- package/esm5/lib/directives/advanced-table-editor.directive.js +175 -0
- package/esm5/lib/directives/btnexp.directive.js +253 -0
- package/esm5/lib/i18n/tables.el.js +104 -0
- package/esm5/lib/i18n/tables.en.js +103 -0
- package/esm5/lib/pipes/advanced-aggregator.pipe.js +39 -0
- package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +49 -0
- package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +130 -0
- package/esm5/lib/tables.activated-table.service.js +43 -0
- package/esm5/lib/tables.module.js +139 -0
- package/esm5/public_api.js +22 -0
- package/esm5/universis-ngx-tables.js +14 -0
- package/fesm2015/universis-ngx-tables.js +4127 -0
- package/fesm2015/universis-ngx-tables.js.map +1 -0
- package/fesm5/universis-ngx-tables.js +4313 -0
- package/fesm5/universis-ngx-tables.js.map +1 -0
- package/lib/advanced-aggregator.d.ts +124 -0
- package/lib/components/add-items/add-items.component.d.ts +44 -0
- package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +45 -0
- package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +25 -0
- package/lib/components/advanced-list/advanced-list.component.d.ts +42 -0
- package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +42 -0
- package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +27 -0
- package/lib/components/advanced-select/advanced-select.component.d.ts +14 -0
- package/lib/components/advanced-select/advanced-select.service.d.ts +9 -0
- package/lib/components/advanced-table/advanced-filter-value-provider.service.d.ts +8 -0
- package/lib/components/advanced-table/advanced-table-resolvers.d.ts +12 -0
- package/lib/components/advanced-table/advanced-table-search-base.d.ts +7 -0
- package/lib/components/advanced-table/advanced-table-search.component.d.ts +80 -0
- package/lib/components/advanced-table/advanced-table-settings.component.d.ts +35 -0
- package/lib/components/advanced-table/advanced-table.component.d.ts +142 -0
- package/lib/components/advanced-table/advanced-table.formatters.d.ts +62 -0
- package/lib/components/advanced-table/advanced-table.formatters.interface.d.ts +15 -0
- package/lib/components/advanced-table/advanced-table.interfaces.d.ts +27 -0
- package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +82 -0
- package/lib/components/table-simple-header/table-simple-header.component.d.ts +14 -0
- package/lib/directives/advanced-table-editor.directive.d.ts +25 -0
- package/lib/directives/btnexp.directive.d.ts +68 -0
- package/lib/i18n/tables.el.d.ts +102 -0
- package/lib/i18n/tables.en.d.ts +101 -0
- package/lib/pipes/advanced-aggregator.pipe.d.ts +21 -0
- package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +21 -0
- package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +32 -0
- package/lib/tables.activated-table.service.d.ts +9 -0
- package/lib/tables.module.d.ts +7 -0
- package/package.json +51 -0
- package/public_api.d.ts +18 -0
- package/universis-ngx-tables.d.ts +12 -0
- package/universis-ngx-tables.metadata.json +1 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { Directive, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { AdvancedTableComponent } from '../components/advanced-table/advanced-table.component';
|
|
3
|
+
export class AdvancedTableNotNullError extends Error {
|
|
4
|
+
constructor() {
|
|
5
|
+
super('Advanced table component cannot be empty at this context.');
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class AdvancedTableEditorDirective {
|
|
9
|
+
constructor(table) {
|
|
10
|
+
this.table = table;
|
|
11
|
+
this.dirty = false;
|
|
12
|
+
this.dirtyChange = new EventEmitter(false);
|
|
13
|
+
//
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Add rows to table and mark them as added rows
|
|
17
|
+
*/
|
|
18
|
+
add(...addItems) {
|
|
19
|
+
if (this.table == null) {
|
|
20
|
+
throw new AdvancedTableNotNullError();
|
|
21
|
+
}
|
|
22
|
+
// decorate items
|
|
23
|
+
const key = this.table.config.columns[0].property || this.table.config.columns[0].name;
|
|
24
|
+
for (let index = 0; index < addItems.length; index++) {
|
|
25
|
+
const element = addItems[index];
|
|
26
|
+
let tr = this.table.dataTable.rows(':has(input[data-id="' + element[key] + '"])').nodes().to$();
|
|
27
|
+
if (tr.hasClass('removed')) {
|
|
28
|
+
tr.toggleClass('removed text-gray-400 text-decoration-line-through');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.table.dataTable.rows.add([element]);
|
|
32
|
+
tr = this.table.dataTable.rows(':has(input[data-id="' + element[key] + '"])').nodes().to$();
|
|
33
|
+
tr.toggleClass('added font-weight-bold text-success');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
this.table.dataTable.draw();
|
|
37
|
+
// find removed
|
|
38
|
+
const removedLength = this.table.dataTable.rows('.removed')[0].length;
|
|
39
|
+
// find added
|
|
40
|
+
const addedLength = this.table.dataTable.rows('.added')[0].length;
|
|
41
|
+
// and emit event
|
|
42
|
+
const items = this.table.dataTable.rows().data();
|
|
43
|
+
this.table.load.emit({
|
|
44
|
+
data: items,
|
|
45
|
+
recordsFiltered: items.length - removedLength,
|
|
46
|
+
recordsTotal: items.length - removedLength
|
|
47
|
+
});
|
|
48
|
+
this.dirty = (removedLength > 0 || addedLength > 0);
|
|
49
|
+
this.dirtyChange.emit(this.dirty);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Marks rows as removed rows
|
|
53
|
+
*/
|
|
54
|
+
remove(...removeItems) {
|
|
55
|
+
if (this.table == null) {
|
|
56
|
+
throw new AdvancedTableNotNullError();
|
|
57
|
+
}
|
|
58
|
+
// get key
|
|
59
|
+
const key = this.table.config.columns[0].property || this.table.config.columns[0].name;
|
|
60
|
+
// loop items
|
|
61
|
+
for (let index = 0; index < removeItems.length; index++) {
|
|
62
|
+
const element = removeItems[index];
|
|
63
|
+
const tr = this.table.dataTable.rows(':has(input[data-id="' + element[key] + '"])').nodes().to$();
|
|
64
|
+
// if row is marked as added
|
|
65
|
+
if (tr.hasClass('added')) {
|
|
66
|
+
// remove this dirty row
|
|
67
|
+
this.table.dataTable.rows(tr).remove();
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// otherwise unmarked row
|
|
71
|
+
tr.toggleClass('removed text-gray-400 text-decoration-line-through');
|
|
72
|
+
}
|
|
73
|
+
// check if item is selected
|
|
74
|
+
const selectedIndex = this.table.selected.findIndex((item) => {
|
|
75
|
+
return item[key] === element[key];
|
|
76
|
+
});
|
|
77
|
+
// and remove it from selected collection
|
|
78
|
+
if (selectedIndex >= 0) {
|
|
79
|
+
this.table.selected.splice(selectedIndex, 1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// re-draw table
|
|
83
|
+
this.table.dataTable.draw();
|
|
84
|
+
// get number of table items
|
|
85
|
+
const items = this.table.dataTable.rows().data();
|
|
86
|
+
// get number of removed items
|
|
87
|
+
const removedLength = this.table.dataTable.rows('.removed')[0].length;
|
|
88
|
+
// get number of added items
|
|
89
|
+
const addedLength = this.table.dataTable.rows('.added')[0].length;
|
|
90
|
+
// refresh
|
|
91
|
+
this.table.load.emit({
|
|
92
|
+
data: items,
|
|
93
|
+
recordsFiltered: items.length - removedLength,
|
|
94
|
+
recordsTotal: items.length - removedLength
|
|
95
|
+
});
|
|
96
|
+
this.dirty = (removedLength > 0 || addedLength > 0);
|
|
97
|
+
this.dirtyChange.emit(this.dirty);
|
|
98
|
+
}
|
|
99
|
+
set(items) {
|
|
100
|
+
if (this.table == null) {
|
|
101
|
+
throw new AdvancedTableNotNullError();
|
|
102
|
+
}
|
|
103
|
+
// clear rows
|
|
104
|
+
this.table.selected = [];
|
|
105
|
+
this.table.dataTable.clear();
|
|
106
|
+
// set items
|
|
107
|
+
this.table.dataTable.rows.add(items).draw();
|
|
108
|
+
this.table.load.emit({
|
|
109
|
+
data: items,
|
|
110
|
+
recordsFiltered: items.length,
|
|
111
|
+
recordsTotal: items.length
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Undo changes
|
|
116
|
+
*/
|
|
117
|
+
undo() {
|
|
118
|
+
if (this.table == null) {
|
|
119
|
+
throw new AdvancedTableNotNullError();
|
|
120
|
+
}
|
|
121
|
+
// reset removed rows
|
|
122
|
+
this.table.dataTable.rows('.removed').nodes().to$().toggleClass('removed text-gray-400 text-decoration-line-through');
|
|
123
|
+
// remove added rows
|
|
124
|
+
this.table.dataTable.rows('.added').remove();
|
|
125
|
+
// clear selected items
|
|
126
|
+
this.table.selected = [];
|
|
127
|
+
const items = this.table.dataTable.rows().data();
|
|
128
|
+
this.table.dataTable.draw();
|
|
129
|
+
this.table.load.emit({
|
|
130
|
+
data: items,
|
|
131
|
+
recordsFiltered: items.length,
|
|
132
|
+
recordsTotal: items.length
|
|
133
|
+
});
|
|
134
|
+
this.dirty = false;
|
|
135
|
+
this.dirtyChange.emit(this.dirty);
|
|
136
|
+
}
|
|
137
|
+
rows() {
|
|
138
|
+
if (this.table == null) {
|
|
139
|
+
throw new AdvancedTableNotNullError();
|
|
140
|
+
}
|
|
141
|
+
return Array.from(this.table.dataTable.rows(':not(.removed)').data());
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
AdvancedTableEditorDirective.decorators = [
|
|
145
|
+
{ type: Directive, args: [{
|
|
146
|
+
selector: '[tableEditor]'
|
|
147
|
+
},] }
|
|
148
|
+
];
|
|
149
|
+
/** @nocollapse */
|
|
150
|
+
AdvancedTableEditorDirective.ctorParameters = () => [
|
|
151
|
+
{ type: AdvancedTableComponent }
|
|
152
|
+
];
|
|
153
|
+
AdvancedTableEditorDirective.propDecorators = {
|
|
154
|
+
dirtyChange: [{ type: Output }]
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUtZWRpdG9yLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvbmd4LXRhYmxlcy8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2FkdmFuY2VkLXRhYmxlLWVkaXRvci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNPLFNBQVMsRUFBb0IsTUFBTSxFQUFFLFlBQVksRUFDOUQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFFL0YsTUFBTSxnQ0FBaUMsU0FBUSxLQUFLO0lBQ2xEO1FBQ0UsS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBT0QsTUFBTTtJQUtKLFlBQW9CLEtBQTZCO1FBQTdCLFVBQUssR0FBTCxLQUFLLENBQXdCO1FBSDFDLFVBQUssR0FBWSxLQUFLLENBQUM7UUFDcEIsZ0JBQVcsR0FBMEIsSUFBSSxZQUFZLENBQVUsS0FBSyxDQUFDLENBQUM7UUFHOUUsRUFBRTtJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBQyxHQUFHLFFBQWU7UUFDcEIsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUN0QixNQUFNLElBQUkseUJBQXlCLEVBQUUsQ0FBQztTQUN2QztRQUNELGlCQUFpQjtRQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkYsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDcEQsTUFBTSxPQUFP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Ozs7MEJBZ0I1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRWxlbWVudFJlZiwgRGlyZWN0aXZlLCBWaWV3Q29udGFpbmVyUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFkdmFuY2VkVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2FkdmFuY2VkLXRhYmxlL2FkdmFuY2VkLXRhYmxlLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFRhYmxlTm90TnVsbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignQWR2YW5jZWQgdGFibGUgY29tcG9uZW50IGNhbm5vdCBiZSBlbXB0eSBhdCB0aGlzIGNvbnRleHQuJyk7XG4gIH1cbn1cblxuQERpcmVjdGl2ZShcbiB7XG4gICBzZWxlY3RvcjogJ1t0YWJsZUVkaXRvcl0nXG4gfVxuKVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkVGFibGVFZGl0b3JEaXJlY3RpdmUge1xuXG4gIHB1YmxpYyBkaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgZGlydHlDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFibGU6IEFkdmFuY2VkVGFibGVDb21wb25lbnQpIHtcbiAgICAvL1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCByb3dzIHRvIHRhYmxlIGFuZCBtYXJrIHRoZW0gYXMgYWRkZWQgcm93c1xuICAgKi9cbiAgYWRkKC4uLmFkZEl0ZW1zOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLnRhYmxlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBBZHZhbmNlZFRhYmxlTm90TnVsbEVycm9yKCk7XG4gICAgfVxuICAgIC8vIGRlY29yYXRlIGl0ZW1zXG4gICAgY29uc3Qga2V5ID0gdGhpcy50YWJsZS5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCB0aGlzLnRhYmxlLmNvbmZpZy5jb2x1bW5zWzBdLm5hbWU7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFkZEl0ZW1zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGFkZEl0ZW1zW2luZGV4XTtcbiAgICAgIGxldCB0ciA9IHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3MoJzpoYXMoaW5wdXRbZGF0YS1pZD1cIicgKyBlbGVtZW50W2tleV0gKyAnXCJdKScpLm5vZGVzKCkudG8kKCk7XG4gICAgICBpZiAodHIuaGFzQ2xhc3MoJ3JlbW92ZWQnKSkge1xuICAgICAgICB0ci50b2dnbGVDbGFzcygncmVtb3ZlZCB0ZXh0LWdyYXktNDAwIHRleHQtZGVjb3JhdGlvbi1saW5lLXRocm91Z2gnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3MuYWRkKFtlbGVtZW50XSk7XG4gICAgICAgIHRyID0gdGhpcy50YWJsZS5kYXRhVGFibGUucm93cygnOmhhcyhpbnB1dFtkYXRhLWlkPVwiJyArIGVsZW1lbnRba2V5XSArICdcIl0pJykubm9kZXMoKS50byQoKTtcbiAgICAgICAgdHIudG9nZ2xlQ2xhc3MoJ2FkZGVkIGZvbnQtd2VpZ2h0LWJvbGQgdGV4dC1zdWNjZXNzJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLmRyYXcoKTtcbiAgICAvLyBmaW5kIHJlbW92ZWRcbiAgICBjb25zdCByZW1vdmVkTGVuZ3RoID0gdGhpcy50YWJsZS5kYXRhVGFibGUucm93cygnLnJlbW92ZWQnKVswXS5sZW5ndGg7XG4gICAgLy8gZmluZCBhZGRlZFxuICAgIGNvbnN0IGFkZGVkTGVuZ3RoID0gdGhpcy50YWJsZS5kYXRhVGFibGUucm93cygnLmFkZGVkJylbMF0ubGVuZ3RoO1xuICAgIC8vIGFuZCBlbWl0IGV2ZW50XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnRhYmxlLmRhdGFUYWJsZS5yb3dzKCkuZGF0YSgpO1xuICAgIHRoaXMudGFibGUubG9hZC5lbWl0KHtcbiAgICAgIGRhdGE6IGl0ZW1zLFxuICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiBpdGVtcy5sZW5ndGggLSByZW1vdmVkTGVuZ3RoLFxuICAgICAgcmVjb3Jkc1RvdGFsOiBpdGVtcy5sZW5ndGggLSByZW1vdmVkTGVuZ3RoXG4gICAgfSk7XG4gICAgdGhpcy5kaXJ0eSA9IChyZW1vdmVkTGVuZ3RoID4gMCB8fCBhZGRlZExlbmd0aCA+IDApO1xuICAgIHRoaXMuZGlydHlDaGFuZ2UuZW1pdCh0aGlzLmRpcnR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyByb3dzIGFzIHJlbW92ZWQgcm93c1xuICAgKi9cbiAgcmVtb3ZlKC4uLnJlbW92ZUl0ZW1zOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLnRhYmxlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBBZHZhbmNlZFRhYmxlTm90TnVsbEVycm9yKCk7XG4gICAgfVxuICAgIC8vIGdldCBrZXlcbiAgICBjb25zdCBrZXkgPSB0aGlzLnRhYmxlLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8IHRoaXMudGFibGUuY29uZmlnLmNvbHVtbnNbMF0ubmFtZTtcbiAgICAvLyBsb29wIGl0ZW1zXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVtb3ZlSXRlbXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW1vdmVJdGVtc1tpbmRleF07XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50YWJsZS5kYXRhVGFibGUucm93cygnOmhhcyhpbnB1dFtkYXRhLWlkPVwiJyArIGVsZW1lbnRba2V5XSArICdcIl0pJykubm9kZXMoKS50byQoKTtcbiAgICAgICAgLy8gaWYgcm93IGlzIG1hcmtlZCBhcyBhZGRlZFxuICAgICAgICBpZiAodHIuaGFzQ2xhc3MoJ2FkZGVkJykpIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhpcyBkaXJ0eSByb3dcbiAgICAgICAgICB0aGlzLnRhYmxlLmRhdGFUYWJsZS5yb3dzKHRyKS5yZW1vdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvdGhlcndpc2UgdW5tYXJrZWQgcm93XG4gICAgICAgICAgdHIudG9nZ2xlQ2xhc3MoJ3JlbW92ZWQgdGV4dC1ncmF5LTQwMCB0ZXh0LWRlY29yYXRpb24tbGluZS10aHJvdWdoJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgaWYgaXRlbSBpcyBzZWxlY3RlZFxuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy50YWJsZS5zZWxlY3RlZC5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbVtrZXldID09PSBlbGVtZW50W2tleV07XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhbmQgcmVtb3ZlIGl0IGZyb20gc2VsZWN0ZWQgY29sbGVjdGlvblxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgdGhpcy50YWJsZS5zZWxlY3RlZC5zcGxpY2Uoc2VsZWN0ZWRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHJlLWRyYXcgdGFibGVcbiAgICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLmRyYXcoKTtcbiAgICAgIC8vIGdldCBudW1iZXIgb2YgdGFibGUgaXRlbXNcbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy50YWJsZS5kYXRhVGFibGUucm93cygpLmRhdGEoKTtcbiAgICAgIC8vIGdldCBudW1iZXIgb2YgcmVtb3ZlZCBpdGVtc1xuICAgICAgY29uc3QgcmVtb3ZlZExlbmd0aCA9IHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3MoJy5yZW1vdmVkJylbMF0ubGVuZ3RoO1xuICAgICAgLy8gZ2V0IG51bWJlciBvZiBhZGRlZCBpdGVtc1xuICAgICAgY29uc3QgYWRkZWRMZW5ndGggPSB0aGlzLnRhYmxlLmRhdGFUYWJsZS5yb3dzKCcuYWRkZWQnKVswXS5sZW5ndGg7XG4gICAgICAvLyByZWZyZXNoXG4gICAgICB0aGlzLnRhYmxlLmxvYWQuZW1pdCh7XG4gICAgICAgIGRhdGE6IGl0ZW1zLFxuICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IGl0ZW1zLmxlbmd0aCAtIHJlbW92ZWRMZW5ndGgsXG4gICAgICAgIHJlY29yZHNUb3RhbDogaXRlbXMubGVuZ3RoIC0gcmVtb3ZlZExlbmd0aFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpcnR5ID0gKHJlbW92ZWRMZW5ndGggPiAwIHx8IGFkZGVkTGVuZ3RoID4gMCk7XG4gICAgICB0aGlzLmRpcnR5Q2hhbmdlLmVtaXQodGhpcy5kaXJ0eSk7XG4gIH1cblxuICBzZXQoaXRlbXM6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMudGFibGUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEFkdmFuY2VkVGFibGVOb3ROdWxsRXJyb3IoKTtcbiAgICB9XG4gICAgLy8gY2xlYXIgcm93c1xuICAgIHRoaXMudGFibGUuc2VsZWN0ZWQgPSBbXTtcbiAgICB0aGlzLnRhYmxlLmRhdGFUYWJsZS5jbGVhcigpO1xuICAgIC8vIHNldCBpdGVtc1xuICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3MuYWRkKGl0ZW1zKS5kcmF3KCk7XG4gICAgdGhpcy50YWJsZS5sb2FkLmVtaXQoe1xuICAgICAgZGF0YTogaXRlbXMsXG4gICAgICByZWNvcmRzRmlsdGVyZWQ6IGl0ZW1zLmxlbmd0aCxcbiAgICAgIHJlY29yZHNUb3RhbDogaXRlbXMubGVuZ3RoXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5kbyBjaGFuZ2VzXG4gICAqL1xuICB1bmRvKCkge1xuICAgIGlmICh0aGlzLnRhYmxlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBBZHZhbmNlZFRhYmxlTm90TnVsbEVycm9yKCk7XG4gICAgfVxuICAgIC8vIHJlc2V0IHJlbW92ZWQgcm93c1xuICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3MoJy5yZW1vdmVkJykubm9kZXMoKS50byQoKS50b2dnbGVDbGFzcygncmVtb3ZlZCB0ZXh0LWdyYXktNDAwIHRleHQtZGVjb3JhdGlvbi1saW5lLXRocm91Z2gnKTtcbiAgICAvLyByZW1vdmUgYWRkZWQgcm93c1xuICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3MoJy5hZGRlZCcpLnJlbW92ZSgpO1xuICAgIC8vIGNsZWFyIHNlbGVjdGVkIGl0ZW1zXG4gICAgdGhpcy50YWJsZS5zZWxlY3RlZCA9IFtdO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy50YWJsZS5kYXRhVGFibGUucm93cygpLmRhdGEoKTtcbiAgICB0aGlzLnRhYmxlLmRhdGFUYWJsZS5kcmF3KCk7XG4gICAgdGhpcy50YWJsZS5sb2FkLmVtaXQoe1xuICAgICAgZGF0YTogaXRlbXMsXG4gICAgICByZWNvcmRzRmlsdGVyZWQ6IGl0ZW1zLmxlbmd0aCxcbiAgICAgIHJlY29yZHNUb3RhbDogaXRlbXMubGVuZ3RoXG4gICAgfSk7XG4gICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIHRoaXMuZGlydHlDaGFuZ2UuZW1pdCh0aGlzLmRpcnR5KTtcbiAgfVxuXG4gIHJvd3MoKSB7XG4gICAgaWYgKHRoaXMudGFibGUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEFkdmFuY2VkVGFibGVOb3ROdWxsRXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy50YWJsZS5kYXRhVGFibGUucm93cygnOm5vdCgucmVtb3ZlZCknKS5kYXRhKCkpO1xuICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import * as tslib_1 from "tslib";
|
|
2
|
+
import { Directive, HostListener } from '@angular/core';
|
|
3
|
+
import { ActivatedTableService } from '../tables.activated-table.service';
|
|
4
|
+
import { AngularDataContext } from '@themost/angular';
|
|
5
|
+
import { ConfigurationService, ErrorService, LoadingService } from '@universis/common';
|
|
6
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
7
|
+
import { ResponseError } from '@themost/client';
|
|
8
|
+
const MAX_EXPORT_ITEMS = 500;
|
|
9
|
+
export class BtnExpDirective {
|
|
10
|
+
constructor(_activatedTable, _context, _config, _translate, _loadingService, _errorService) {
|
|
11
|
+
this._activatedTable = _activatedTable;
|
|
12
|
+
this._context = _context;
|
|
13
|
+
this._config = _config;
|
|
14
|
+
this._translate = _translate;
|
|
15
|
+
this._loadingService = _loadingService;
|
|
16
|
+
this._errorService = _errorService;
|
|
17
|
+
}
|
|
18
|
+
clickEvent(event) {
|
|
19
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
event.stopPropagation();
|
|
22
|
+
if (this._activatedTable.activeTable) {
|
|
23
|
+
const lastQuery = this._activatedTable.activeTable.lastQuery;
|
|
24
|
+
const tableConfig = this._activatedTable.activeTable.config;
|
|
25
|
+
const serviceHeaders = this._context.getService().getHeaders();
|
|
26
|
+
const queryModel = lastQuery.getModel();
|
|
27
|
+
let query = this._context.model(queryModel).asQueryable();
|
|
28
|
+
const queryParams = lastQuery.getParams();
|
|
29
|
+
query = this.constructQuery(query, queryParams, tableConfig, serviceHeaders);
|
|
30
|
+
const maxExportItems = 1000;
|
|
31
|
+
if (maxExportItems && typeof maxExportItems === 'number' && maxExportItems > 0) {
|
|
32
|
+
query.skip(0).take(maxExportItems);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
query.skip(0).take(MAX_EXPORT_ITEMS);
|
|
36
|
+
}
|
|
37
|
+
// This constructs the URI based on the way @themost does
|
|
38
|
+
const url = this.constructURL(query);
|
|
39
|
+
this.downloadFile(url, query.getService().getHeaders(), query.getModel());
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Sets the parameters to the query based on
|
|
45
|
+
* the active filters of the activated table
|
|
46
|
+
* @param {ClientDataQueryable} query
|
|
47
|
+
* @param params: The filters of the last query of the activated table
|
|
48
|
+
* @return ClientDataQueryable
|
|
49
|
+
*/
|
|
50
|
+
setParams(query, params) {
|
|
51
|
+
if (params && typeof params === 'object') {
|
|
52
|
+
Object.keys(params).forEach((key) => {
|
|
53
|
+
query.setParam(key, params[key]);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return query;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sets the headers to the query based on
|
|
60
|
+
* the default headers of the DataContext
|
|
61
|
+
* and appending the accept header to get
|
|
62
|
+
* an xlsx file from the API
|
|
63
|
+
* @param {ClientDataQueryable} query
|
|
64
|
+
* @param {Headers} headers: The headers to append to the query
|
|
65
|
+
* @return ClientDataQueryable
|
|
66
|
+
*/
|
|
67
|
+
setHeaders(query, headers) {
|
|
68
|
+
Object.keys(headers).forEach((key) => {
|
|
69
|
+
if (headers.hasOwnProperty(key)) {
|
|
70
|
+
query.getService().setHeader(key, headers[key]);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// sets a header to accept xlsx files
|
|
74
|
+
query.getService().setHeader('Accept', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
|
|
75
|
+
return query;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Constructs the select parameter of the
|
|
79
|
+
* ClientDataQuery by replacing the target name
|
|
80
|
+
* of the field based on the localized translation
|
|
81
|
+
* of that property on the advanced tabled
|
|
82
|
+
* @param {ClientDataQueryable} query
|
|
83
|
+
* @param tableConfig: The configuration of the activated table
|
|
84
|
+
* @return ClientDataQueryable
|
|
85
|
+
*/
|
|
86
|
+
constructQueryParam(query, tableConfig) {
|
|
87
|
+
let selectQuery = query.getParams().$select;
|
|
88
|
+
let selectQueryArray = selectQuery.split(',');
|
|
89
|
+
selectQueryArray = selectQueryArray.map((select) => {
|
|
90
|
+
const words = select.split(' ');
|
|
91
|
+
if (words.length === 3) {
|
|
92
|
+
if (tableConfig && tableConfig.columns) {
|
|
93
|
+
for (const column of tableConfig.columns) {
|
|
94
|
+
if (column.property === words[2] && column.title) {
|
|
95
|
+
words[2] = `"${this._translate.instant(column.title)}"`;
|
|
96
|
+
}
|
|
97
|
+
else if (column.property === words[2]) {
|
|
98
|
+
words[2] = `"${this._translate.instant(words[2])}"`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (words.length === 1) {
|
|
104
|
+
if (tableConfig && tableConfig.columns) {
|
|
105
|
+
for (const column of tableConfig.columns) {
|
|
106
|
+
if (column.name === words[0] && column.title) {
|
|
107
|
+
words[0] = `${words[0]} as "${this._translate.instant(column.title)}"`;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
else if (column.name === words[0] && column.property) {
|
|
111
|
+
words[0] = `${words[0]} as "${this._translate.instant(column.property)}"`;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
else if (words[0] === column.name && words[0] === "id" && column.hidden) {
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
else if (words[0] == column.name || words[0] === column.property) {
|
|
118
|
+
words[0] = `${words[0]} as "${this._translate.instant(words[0])}"`;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return words[0];
|
|
123
|
+
}
|
|
124
|
+
return words.join(' ');
|
|
125
|
+
});
|
|
126
|
+
selectQuery = selectQueryArray.join(',');
|
|
127
|
+
query.setParam('$select', selectQuery);
|
|
128
|
+
return query;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Constructs the fetch URL based the query parameters
|
|
132
|
+
* @param {ClientDataQueryable} query
|
|
133
|
+
* @return String
|
|
134
|
+
*/
|
|
135
|
+
constructURL(query) {
|
|
136
|
+
const baseURL = query.getService().getBase();
|
|
137
|
+
let url = baseURL.endsWith('/') ? (baseURL + query.getModel() + '?') : (baseURL + '/' + query.getModel() + '?');
|
|
138
|
+
Object.keys(query.getParams()).forEach((key, index) => {
|
|
139
|
+
if (index === 0) {
|
|
140
|
+
url += key + '=' + query.getParams()[key];
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
url += '&' + key + '=' + query.getParams()[key];
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
return url;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Constructs the query by setting the parameters of the
|
|
150
|
+
* advanced table's active filters, sets the necessary headers
|
|
151
|
+
* and build the select parameter of the query
|
|
152
|
+
* @param {ClientDataQueryable} query
|
|
153
|
+
* @param params: The filters of the last query of the activated table
|
|
154
|
+
* @param tableConfig: The configuration of the activated table
|
|
155
|
+
* @param {Headers} headers: The headers to append to the query
|
|
156
|
+
* @return ClientDataQueryable
|
|
157
|
+
*/
|
|
158
|
+
constructQuery(query, params, tableConfig, headers) {
|
|
159
|
+
let _query = this.setParams(query, params);
|
|
160
|
+
_query = this.setHeaders(_query, headers);
|
|
161
|
+
_query = this.constructQueryParam(_query, tableConfig);
|
|
162
|
+
return _query;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Fetches and saves the xlsx file
|
|
166
|
+
* @param {String} url
|
|
167
|
+
* @param {Headers} serviceHeaders: The headers to append to the query
|
|
168
|
+
* @param modelName: The model name of the advanced table
|
|
169
|
+
*/
|
|
170
|
+
downloadFile(url, serviceHeaders, modelName) {
|
|
171
|
+
this._loadingService.showLoading();
|
|
172
|
+
fetch(encodeURI(url), {
|
|
173
|
+
headers: serviceHeaders,
|
|
174
|
+
credentials: 'include'
|
|
175
|
+
}).then(response => {
|
|
176
|
+
if (response && !response.ok) {
|
|
177
|
+
throw new ResponseError(response.statusText, response.status);
|
|
178
|
+
}
|
|
179
|
+
return response.blob();
|
|
180
|
+
}).then(blob => {
|
|
181
|
+
const objectUrl = window.URL.createObjectURL(blob);
|
|
182
|
+
const a = document.createElement('a');
|
|
183
|
+
document.body.appendChild(a);
|
|
184
|
+
a.setAttribute('style', 'display: none');
|
|
185
|
+
a.href = objectUrl;
|
|
186
|
+
const downloadName = `${modelName}.xlsx`;
|
|
187
|
+
a.download = downloadName;
|
|
188
|
+
// this adds support for IE and MS Edge (up to version 44.19041)
|
|
189
|
+
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
|
|
190
|
+
window.navigator.msSaveOrOpenBlob(blob, downloadName);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// for all other browsers
|
|
194
|
+
a.click();
|
|
195
|
+
}
|
|
196
|
+
window.URL.revokeObjectURL(objectUrl);
|
|
197
|
+
a.remove();
|
|
198
|
+
this._loadingService.hideLoading();
|
|
199
|
+
}).catch(err => {
|
|
200
|
+
this._loadingService.hideLoading();
|
|
201
|
+
this._errorService.showError(err, {
|
|
202
|
+
continueLink: '.'
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
BtnExpDirective.decorators = [
|
|
208
|
+
{ type: Directive, args: [{
|
|
209
|
+
selector: '.universis-btn-export'
|
|
210
|
+
},] }
|
|
211
|
+
];
|
|
212
|
+
/** @nocollapse */
|
|
213
|
+
BtnExpDirective.ctorParameters = () => [
|
|
214
|
+
{ type: ActivatedTableService },
|
|
215
|
+
{ type: AngularDataContext },
|
|
216
|
+
{ type: ConfigurationService },
|
|
217
|
+
{ type: TranslateService },
|
|
218
|
+
{ type: LoadingService },
|
|
219
|
+
{ type: ErrorService }
|
|
220
|
+
];
|
|
221
|
+
BtnExpDirective.propDecorators = {
|
|
222
|
+
clickEvent: [{ type: HostListener, args: ['click', ['$event'],] }]
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnRuZXhwLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvbmd4LXRhYmxlcy8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2J0bmV4cC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDckYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFzQixhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUs3QixNQUFNO0lBQ0osWUFBb0IsZUFBc0MsRUFDdEMsUUFBNEIsRUFDNUIsT0FBNkIsRUFDN0IsVUFBNEIsRUFDNUIsZUFBK0IsRUFDL0IsYUFBMkI7UUFMM0Isb0JBQWUsR0FBZixlQUFlLENBQXVCO1FBQ3RDLGFBQVEsR0FBUixRQUFRLENBQW9CO1FBQzVCLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBQzdCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUMvQixrQkFBYSxHQUFiLGFBQWEsQ0FBYztJQUMvQyxDQUFDO0lBR0ssVUFBVSxDQUFDLEtBQUs7O1lBQ3BCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRTtnQkFDcEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO2dCQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7Z0JBQzVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQy9ELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzFELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDMUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQzdFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDNUIsSUFBSSxjQUFjLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7b0JBQzlFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUNwQztxQkFBTTtvQkFDTCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUN0QztnQkFDRCx5REFBeUQ7Z0JBQ3pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUMzRTtRQUNILENBQUM7S0FBQTtJQUVEOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxLQUEwQixFQUFFLE1BQU07UUFDMUMsSUFBSSxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2xDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFVBQVUsQ0FBQyxLQUEwQixFQUFFLE9BQWdCO1FBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNqRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gscUNBQXFDO1FBQ3JDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLG1FQUFtRSxDQUFDLENBQUM7UUFDNUcsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxtQkFBbUIsQ0FBQyxLQUEwQixFQUFFLFdBQStCO1FBQzdFLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDNUMsSUFBSSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2pELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdEIsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtvQkFDdEMsS0FBSSxNQUFNLE1BQU0sSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFO3dCQUN2QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7NEJBQ2hELEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO3lCQUN6RDs2QkFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFOzRCQUN2QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO3lCQUNwRDtxQkFDRjtpQkFDRjthQUNGO1lBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdEIsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtvQkFDdEMsS0FBSSxNQUFNLE1BQU0sSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFDO3dCQUN0QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7NEJBQzVDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzs0QkFDdkUsTUFBTTt5QkFDUDs2QkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7NEJBQ3RELEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQzs0QkFDMUUsTUFBTTt5QkFDUDs2QkFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSSxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTs0QkFDeEUsTUFBTTt5QkFDUDs2QkFBTSxJQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSSxNQUFNLENBQUMsUUFBUSxFQUFFOzRCQUNoRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzt5QkFDcEU7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakI7WUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFDSCxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBRSxDQUFDO1FBQ3hDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsS0FBSztRQUNoQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0MsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2hILE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3BELElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtnQkFDZixHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDM0M7aUJBQU07Z0JBQ0wsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNqRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQWdCO1FBQ3pELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLENBQUMsR0FBRyxFQUFFLGNBQXVCLEVBQUUsU0FBUztRQUNsRCxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25DLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDcEIsT0FBTyxFQUFFLGNBQWM7WUFDdkIsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNqQixJQUFJLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDL0Q7WUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDYixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1lBQ25CLE1BQU0sWUFBWSxHQUFHLEdBQUcsU0FBUyxPQUFPLENBQUM7WUFDekMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDMUIsZ0VBQWdFO1lBQ2hFLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFO2dCQUN6RCxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQzthQUN2RDtpQkFBTTtnQkFDTCx5QkFBeUI7Z0JBQ3pCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNYO1lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDYixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDaEMsWUFBWSxFQUFFLEdBQUc7YUFDbEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzs7WUFyTUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx1QkFBdUI7YUFDbEM7Ozs7WUFYTyxxQkFBcUI7WUFDckIsa0JBQWtCO1lBQ2xCLG9CQUFvQjtZQUNwQixnQkFBZ0I7WUFEb0IsY0FBYztZQUE1QixZQUFZOzs7eUJBbUJ2QyxZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lcn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFRhYmxlU2VydmljZX0gZnJvbSAnLi4vdGFibGVzLmFjdGl2YXRlZC10YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7QW5ndWxhckRhdGFDb250ZXh0fSBmcm9tICdAdGhlbW9zdC9hbmd1bGFyJztcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2UsIEVycm9yU2VydmljZSwgTG9hZGluZ1NlcnZpY2V9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0NsaWVudERhdGFRdWVyeWFibGUsIFJlc3BvbnNlRXJyb3J9IGZyb20gJ0B0aGVtb3N0L2NsaWVudCc7XG5pbXBvcnQgeyBUYWJsZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9jb21wb25lbnRzL2FkdmFuY2VkLXRhYmxlL2FkdmFuY2VkLXRhYmxlLmludGVyZmFjZXMnO1xuXG5jb25zdCBNQVhfRVhQT1JUX0lURU1TID0gNTAwO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICcudW5pdmVyc2lzLWJ0bi1leHBvcnQnXG59KVxuZXhwb3J0IGNsYXNzIEJ0bkV4cERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2FjdGl2YXRlZFRhYmxlOiBBY3RpdmF0ZWRUYWJsZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbnRleHQ6IEFuZ3VsYXJEYXRhQ29udGV4dCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY29uZmlnOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2FkaW5nU2VydmljZTogTG9hZGluZ1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2Vycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlKSB7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIGFzeW5jIGNsaWNrRXZlbnQoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLl9hY3RpdmF0ZWRUYWJsZS5hY3RpdmVUYWJsZSkge1xuICAgICAgY29uc3QgbGFzdFF1ZXJ5ID0gdGhpcy5fYWN0aXZhdGVkVGFibGUuYWN0aXZlVGFibGUubGFzdFF1ZXJ5O1xuICAgICAgY29uc3QgdGFibGVDb25maWcgPSB0aGlzLl9hY3RpdmF0ZWRUYWJsZS5hY3RpdmVUYWJsZS5jb25maWc7XG4gICAgICBjb25zdCBzZXJ2aWNlSGVhZGVycyA9IHRoaXMuX2NvbnRleHQuZ2V0U2VydmljZSgpLmdldEhlYWRlcnMoKTtcbiAgICAgIGNvbnN0IHF1ZXJ5TW9kZWwgPSBsYXN0UXVlcnkuZ2V0TW9kZWwoKTtcbiAgICAgIGxldCBxdWVyeSA9IHRoaXMuX2NvbnRleHQubW9kZWwocXVlcnlNb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbGFzdFF1ZXJ5LmdldFBhcmFtcygpO1xuICAgICAgcXVlcnkgPSB0aGlzLmNvbnN0cnVjdFF1ZXJ5KHF1ZXJ5LCBxdWVyeVBhcmFtcywgdGFibGVDb25maWcsIHNlcnZpY2VIZWFkZXJzKTtcbiAgICAgIGNvbnN0IG1heEV4cG9ydEl0ZW1zID0gMTAwMDtcbiAgICAgIGlmIChtYXhFeHBvcnRJdGVtcyAmJiB0eXBlb2YgbWF4RXhwb3J0SXRlbXMgPT09ICdudW1iZXInICYmIG1heEV4cG9ydEl0ZW1zID4gMCkge1xuICAgICAgICBxdWVyeS5za2lwKDApLnRha2UobWF4RXhwb3J0SXRlbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkuc2tpcCgwKS50YWtlKE1BWF9FWFBPUlRfSVRFTVMpO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBjb25zdHJ1Y3RzIHRoZSBVUkkgYmFzZWQgb24gdGhlIHdheSBAdGhlbW9zdCBkb2VzXG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmNvbnN0cnVjdFVSTChxdWVyeSk7XG4gICAgICB0aGlzLmRvd25sb2FkRmlsZSh1cmwsIHF1ZXJ5LmdldFNlcnZpY2UoKS5nZXRIZWFkZXJzKCksIHF1ZXJ5LmdldE1vZGVsKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBxdWVyeSBiYXNlZCBvblxuICAgKiB0aGUgYWN0aXZlIGZpbHRlcnMgb2YgdGhlIGFjdGl2YXRlZCB0YWJsZVxuICAgKiBAcGFyYW0ge0NsaWVudERhdGFRdWVyeWFibGV9IHF1ZXJ5XG4gICAqIEBwYXJhbSBwYXJhbXM6IFRoZSBmaWx0ZXJzIG9mIHRoZSBsYXN0IHF1ZXJ5IG9mIHRoZSBhY3RpdmF0ZWQgdGFibGVcbiAgICogQHJldHVybiBDbGllbnREYXRhUXVlcnlhYmxlXG4gICAqL1xuICBzZXRQYXJhbXMocXVlcnk6IENsaWVudERhdGFRdWVyeWFibGUsIHBhcmFtcyk6IENsaWVudERhdGFRdWVyeWFibGUge1xuICAgIGlmIChwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIHF1ZXJ5LnNldFBhcmFtKGtleSwgcGFyYW1zW2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBoZWFkZXJzIHRvIHRoZSBxdWVyeSBiYXNlZCBvblxuICAgKiB0aGUgZGVmYXVsdCBoZWFkZXJzIG9mIHRoZSBEYXRhQ29udGV4dFxuICAgKiBhbmQgYXBwZW5kaW5nIHRoZSBhY2NlcHQgaGVhZGVyIHRvIGdldFxuICAgKiBhbiB4bHN4IGZpbGUgZnJvbSB0aGUgQVBJXG4gICAqIEBwYXJhbSB7Q2xpZW50RGF0YVF1ZXJ5YWJsZX0gcXVlcnlcbiAgICogQHBhcmFtIHtIZWFkZXJzfSBoZWFkZXJzOiBUaGUgaGVhZGVycyB0byBhcHBlbmQgdG8gdGhlIHF1ZXJ5XG4gICAqIEByZXR1cm4gQ2xpZW50RGF0YVF1ZXJ5YWJsZVxuICAgKi9cbiAgc2V0SGVhZGVycyhxdWVyeTogQ2xpZW50RGF0YVF1ZXJ5YWJsZSwgaGVhZGVyczogSGVhZGVycyk6IENsaWVudERhdGFRdWVyeWFibGUge1xuICAgIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBxdWVyeS5nZXRTZXJ2aWNlKCkuc2V0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBzZXRzIGEgaGVhZGVyIHRvIGFjY2VwdCB4bHN4IGZpbGVzXG4gICAgcXVlcnkuZ2V0U2VydmljZSgpLnNldEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Jyk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdGhlIHNlbGVjdCBwYXJhbWV0ZXIgb2YgdGhlXG4gICAqIENsaWVudERhdGFRdWVyeSBieSByZXBsYWNpbmcgdGhlIHRhcmdldCBuYW1lXG4gICAqIG9mIHRoZSBmaWVsZCBiYXNlZCBvbiB0aGUgbG9jYWxpemVkIHRyYW5zbGF0aW9uXG4gICAqIG9mIHRoYXQgcHJvcGVydHkgb24gdGhlIGFkdmFuY2VkIHRhYmxlZFxuICAgKiBAcGFyYW0ge0NsaWVudERhdGFRdWVyeWFibGV9IHF1ZXJ5XG4gICAqIEBwYXJhbSB0YWJsZUNvbmZpZzogVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGFjdGl2YXRlZCB0YWJsZVxuICAgKiBAcmV0dXJuIENsaWVudERhdGFRdWVyeWFibGVcbiAgICovXG4gIGNvbnN0cnVjdFF1ZXJ5UGFyYW0ocXVlcnk6IENsaWVudERhdGFRdWVyeWFibGUsIHRhYmxlQ29uZmlnOiBUYWJsZUNvbmZpZ3VyYXRpb24pOiBDbGllbnREYXRhUXVlcnlhYmxlIHtcbiAgICBsZXQgc2VsZWN0UXVlcnkgPSBxdWVyeS5nZXRQYXJhbXMoKS4kc2VsZWN0O1xuICAgIGxldCBzZWxlY3RRdWVyeUFycmF5ID0gc2VsZWN0UXVlcnkuc3BsaXQoJywnKTtcbiAgICBzZWxlY3RRdWVyeUFycmF5ID0gc2VsZWN0UXVlcnlBcnJheS5tYXAoKHNlbGVjdCkgPT4ge1xuICAgICAgY29uc3Qgd29yZHMgPSBzZWxlY3Quc3BsaXQoJyAnKTtcbiAgICAgIGlmICh3b3Jkcy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgaWYgKHRhYmxlQ29uZmlnICYmIHRhYmxlQ29uZmlnLmNvbHVtbnMpIHtcbiAgICAgICAgICBmb3IoY29uc3QgY29sdW1uIG9mIHRhYmxlQ29uZmlnLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4ucHJvcGVydHkgPT09IHdvcmRzWzJdICYmIGNvbHVtbi50aXRsZSkge1xuICAgICAgICAgICAgICB3b3Jkc1syXSA9IGBcIiR7dGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoY29sdW1uLnRpdGxlKX1cImA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi5wcm9wZXJ0eSA9PT0gd29yZHNbMl0pIHtcbiAgICAgICAgICAgICAgd29yZHNbMl0gPSBgXCIke3RoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KHdvcmRzWzJdKX1cImBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh3b3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKHRhYmxlQ29uZmlnICYmIHRhYmxlQ29uZmlnLmNvbHVtbnMpIHtcbiAgICAgICAgICBmb3IoY29uc3QgY29sdW1uIG9mIHRhYmxlQ29uZmlnLmNvbHVtbnMpe1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSB3b3Jkc1swXSAmJiBjb2x1bW4udGl0bGUpIHtcbiAgICAgICAgICAgICAgd29yZHNbMF0gPSBgJHt3b3Jkc1swXX0gYXMgXCIke3RoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KGNvbHVtbi50aXRsZSl9XCJgO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLm5hbWUgPT09IHdvcmRzWzBdICYmIGNvbHVtbi5wcm9wZXJ0eSkge1xuICAgICAgICAgICAgICB3b3Jkc1swXSA9IGAke3dvcmRzWzBdfSBhcyBcIiR7dGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoY29sdW1uLnByb3BlcnR5KX1cImA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3b3Jkc1swXSA9PT0gY29sdW1uLm5hbWUgJiYgd29yZHNbMF09PT0gXCJpZFwiICYmIGNvbHVtbi5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYod29yZHNbMF0gPT0gY29sdW1uLm5hbWUgfHwgd29yZHNbMF09PT0gY29sdW1uLnByb3BlcnR5KSB7XG4gICAgICAgICAgICAgIHdvcmRzWzBdID0gYCR7d29yZHNbMF19IGFzIFwiJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCh3b3Jkc1swXSl9XCJgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd29yZHNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gd29yZHMuam9pbignICcpO1xuICAgIH0pO1xuICAgIHNlbGVjdFF1ZXJ5ID0gc2VsZWN0UXVlcnlBcnJheS5qb2luKCcsJyk7XG4gICAgcXVlcnkuc2V0UGFyYW0oJyRzZWxlY3QnLCBzZWxlY3RRdWVyeSApO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBmZXRjaCBVUkwgYmFzZWQgdGhlIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtDbGllbnREYXRhUXVlcnlhYmxlfSBxdWVyeVxuICAgKiBAcmV0dXJuIFN0cmluZ1xuICAgKi9cbiAgY29uc3RydWN0VVJMKHF1ZXJ5KTogU3RyaW5nIHtcbiAgICBjb25zdCBiYXNlVVJMID0gcXVlcnkuZ2V0U2VydmljZSgpLmdldEJhc2UoKTtcbiAgICBsZXQgdXJsID0gYmFzZVVSTC5lbmRzV2l0aCgnLycpID8gKGJhc2VVUkwgKyBxdWVyeS5nZXRNb2RlbCgpICsgJz8nKSA6IChiYXNlVVJMICsgJy8nICsgcXVlcnkuZ2V0TW9kZWwoKSArICc/Jyk7XG4gICAgT2JqZWN0LmtleXMocXVlcnkuZ2V0UGFyYW1zKCkpLmZvckVhY2goKGtleSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICB1cmwgKz0ga2V5ICsgJz0nICsgcXVlcnkuZ2V0UGFyYW1zKClba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVybCArPSAnJicgKyBrZXkgKyAnPScgKyBxdWVyeS5nZXRQYXJhbXMoKVtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgcXVlcnkgYnkgc2V0dGluZyB0aGUgcGFyYW1ldGVycyBvZiB0aGVcbiAgICogYWR2YW5jZWQgdGFibGUncyBhY3RpdmUgZmlsdGVycywgc2V0cyB0aGUgbmVjZXNzYXJ5IGhlYWRlcnNcbiAgICogYW5kIGJ1aWxkIHRoZSBzZWxlY3QgcGFyYW1ldGVyIG9mIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge0NsaWVudERhdGFRdWVyeWFibGV9IHF1ZXJ5XG4gICAqIEBwYXJhbSBwYXJhbXM6IFRoZSBmaWx0ZXJzIG9mIHRoZSBsYXN0IHF1ZXJ5IG9mIHRoZSBhY3RpdmF0ZWQgdGFibGVcbiAgICogQHBhcmFtIHRhYmxlQ29uZmlnOiBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGUgYWN0aXZhdGVkIHRhYmxlXG4gICAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyczogVGhlIGhlYWRlcnMgdG8gYXBwZW5kIHRvIHRoZSBxdWVyeVxuICAgKiBAcmV0dXJuIENsaWVudERhdGFRdWVyeWFibGVcbiAgICovXG4gIGNvbnN0cnVjdFF1ZXJ5KHF1ZXJ5LCBwYXJhbXMsIHRhYmxlQ29uZmlnLCBoZWFkZXJzOiBIZWFkZXJzKSB7XG4gICAgbGV0IF9xdWVyeSA9IHRoaXMuc2V0UGFyYW1zKHF1ZXJ5LCBwYXJhbXMpO1xuICAgIF9xdWVyeSA9IHRoaXMuc2V0SGVhZGVycyhfcXVlcnksIGhlYWRlcnMpO1xuICAgIF9xdWVyeSA9IHRoaXMuY29uc3RydWN0UXVlcnlQYXJhbShfcXVlcnksIHRhYmxlQ29uZmlnKTtcbiAgICByZXR1cm4gX3F1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIHNhdmVzIHRoZSB4bHN4IGZpbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0hlYWRlcnN9IHNlcnZpY2VIZWFkZXJzOiBUaGUgaGVhZGVycyB0byBhcHBlbmQgdG8gdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSBtb2RlbE5hbWU6IFRoZSBtb2RlbCBuYW1lIG9mIHRoZSBhZHZhbmNlZCB0YWJsZVxuICAgKi9cbiAgZG93bmxvYWRGaWxlKHVybCwgc2VydmljZUhlYWRlcnM6IEhlYWRlcnMsIG1vZGVsTmFtZSkge1xuICAgIHRoaXMuX2xvYWRpbmdTZXJ2aWNlLnNob3dMb2FkaW5nKCk7XG4gICAgZmV0Y2goZW5jb2RlVVJJKHVybCksIHtcbiAgICAgIGhlYWRlcnM6IHNlcnZpY2VIZWFkZXJzLFxuICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJ1xuICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlICYmICFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgUmVzcG9uc2VFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0LCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmJsb2IoKTtcbiAgICB9KS50aGVuKGJsb2IgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0VXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgIGEuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBub25lJyk7XG4gICAgICBhLmhyZWYgPSBvYmplY3RVcmw7XG4gICAgICBjb25zdCBkb3dubG9hZE5hbWUgPSBgJHttb2RlbE5hbWV9Lnhsc3hgO1xuICAgICAgYS5kb3dubG9hZCA9IGRvd25sb2FkTmFtZTtcbiAgICAgIC8vIHRoaXMgYWRkcyBzdXBwb3J0IGZvciBJRSBhbmQgTVMgRWRnZSAodXAgdG8gdmVyc2lvbiA0NC4xOTA0MSlcbiAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yICYmIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoYmxvYiwgZG93bmxvYWROYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZvciBhbGwgb3RoZXIgYnJvd3NlcnNcbiAgICAgICAgYS5jbGljaygpO1xuICAgICAgfVxuICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwob2JqZWN0VXJsKTtcbiAgICAgIGEucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9sb2FkaW5nU2VydmljZS5oaWRlTG9hZGluZygpO1xuICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICB0aGlzLl9sb2FkaW5nU2VydmljZS5oaWRlTG9hZGluZygpO1xuICAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLnNob3dFcnJvcihlcnIsIHtcbiAgICAgICAgY29udGludWVMaW5rOiAnLidcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export const TABLES_EL = {
|
|
2
|
+
"Tables": {
|
|
3
|
+
"Export": "Εξαγωγή",
|
|
4
|
+
"More": "Περισσότερα",
|
|
5
|
+
"Search": "Αναζήτηση",
|
|
6
|
+
"SearchPlaceholder": "Αναζήτηση...",
|
|
7
|
+
"GroupBy": "Ομαδοποίηση ανά",
|
|
8
|
+
"DataTable": {
|
|
9
|
+
"paginate": {
|
|
10
|
+
"first": "Πρώτη σελίδα",
|
|
11
|
+
"last": "Τελεταία σελίδα",
|
|
12
|
+
"next": "Επόμενη",
|
|
13
|
+
"previous": "Προηγούμενη"
|
|
14
|
+
},
|
|
15
|
+
"info": "Εμφάνιση _START_ έως _END_ από _TOTAL_ εγγραφές",
|
|
16
|
+
"infoEmpty": "Δεν βρέθηκαν εγγραφές",
|
|
17
|
+
"loading": "Εμφάνιση δεδομένων...",
|
|
18
|
+
"processing": "Παραλαβή δεδομένων...",
|
|
19
|
+
"emptyTable": "Δεν βρέθηκαν αποτελέσματα."
|
|
20
|
+
},
|
|
21
|
+
"ColumnDisplay": "Επιλογή Εμφάνισης στηλών",
|
|
22
|
+
"ColumnDisplayInfo": "Επιλέξτε τις στήλες που θέλετε να εμφανίζονται.",
|
|
23
|
+
"Save": "Εφαρμογή",
|
|
24
|
+
"Apply": "Εφαρμογή",
|
|
25
|
+
"Cancel": "Ακύρωση",
|
|
26
|
+
"RecordsPerPage": "Εγγραφές ανά σελίδα",
|
|
27
|
+
"PageInfo": "{{start}}-{{end}} από {{recordsTotal}}",
|
|
28
|
+
"SearchListPlaceholder": "Αναζητήστε στη λίστα...",
|
|
29
|
+
"Filters": "Φίλτρα",
|
|
30
|
+
"All": "Όλα",
|
|
31
|
+
"AddItem": "Προσθήκη στοιχείου",
|
|
32
|
+
"EmptyTableTitle": "Δεν βρέθηκαν αποτελέσματα.",
|
|
33
|
+
"EmptyTableMessage": "Προσπαθήστε να χρησιμοποιήσετε άλλες λέξεις κλειδιά.",
|
|
34
|
+
"RemoveItem": "Διαγραφή στοιχείου",
|
|
35
|
+
"Items": "στοιχεία",
|
|
36
|
+
"Item": "στοιχείο",
|
|
37
|
+
"AddItemMessage": {
|
|
38
|
+
"title": "Προσθήκη στοιχείων",
|
|
39
|
+
"one": "Ένα νέο στοιχείο προστέθηκε με επιτυχία.",
|
|
40
|
+
"many": "{{value}} νέα στοιχεία προστέθηκαν με επιτυχία."
|
|
41
|
+
},
|
|
42
|
+
"RemoveItemMessage": {
|
|
43
|
+
"title": "Αφαίρεση στοιχείων",
|
|
44
|
+
"one": "Ένα στοιχείο αφαιρέθηκε με επιτυχία.",
|
|
45
|
+
"many": "{{value}} στοιχεία αφαιρέθηκαν με επιτυχία."
|
|
46
|
+
},
|
|
47
|
+
"RemoveItemsTitle": "Διαγραφή στοιχείου",
|
|
48
|
+
"RemoveItemsMessage": "Πρόκειται να διαγράψετε ένα ή περισσότερα στοιχεία. Θέλετε να προχωρήσετε?",
|
|
49
|
+
"SelectAll": "Επιλογή όλων",
|
|
50
|
+
"ClearSelection": "Αναίρεση επιλογής",
|
|
51
|
+
"Actions": {
|
|
52
|
+
"Label": "Επεξεργασία",
|
|
53
|
+
"Start": "Έναρξη",
|
|
54
|
+
"ActionMessage": {
|
|
55
|
+
"None": "Δεν έχετε επιλέξει κανένα στοιχείο που να ακολουθεί τις προϋποθέσεις της ενέργειας.",
|
|
56
|
+
"One": "Έχετε επιλέξει ένα στοιχείο που ακολουθεί τις προϋποθέσεις της ενέργειας. Πατήστε το πλήκτρο Έναρξη για να ξεκινήσει η διαδικασία.",
|
|
57
|
+
"Many": "Έχετε επιλέξει {{length}} στοιχεία που ακολουθούν τις προϋποθέσεις της ενέργειας. Πατήστε το πλήκτρο Έναρξη για να ξεκινήσει η διαδικασία."
|
|
58
|
+
},
|
|
59
|
+
"CompletedWithErrors": {
|
|
60
|
+
"Title": "Η διαδικασία ολοκληρώθηκε με σφάλματα.",
|
|
61
|
+
"Description": {
|
|
62
|
+
"One": "Ένα στοιχείο δεν ανανεώθηκε λόγω ενός σφάλματος που συνέβη κατά την εκτέλεση της διαδικασίας.",
|
|
63
|
+
"Many": "{{errors}} στοιχεία δεν ανανεώθηκαν λόγω ενός σφάλματος που συνέβη κατά την εκτέλεση της διαδικασίας."
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"CompletedWithSuccess": {
|
|
67
|
+
"Title": "Η διαδικασία ολοκληρώθηκε με επιτυχία."
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"TrueFalse": {
|
|
72
|
+
"long": {
|
|
73
|
+
"Yes": "Ναι",
|
|
74
|
+
"No": "Όχι"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"AdvancedSearch": {
|
|
78
|
+
"Choose": "<Επιλέξτε μια αναζήτηση>",
|
|
79
|
+
"ChooseDate": "Επιλογή ημερομηνίας",
|
|
80
|
+
"SavedSearches": "Αποθηκευμένες αναζητήσεις",
|
|
81
|
+
"ToggleDropdown": "Εμφάνιση λίστας",
|
|
82
|
+
"SaveCurrentSearch": "Αποθήκευση αναζήτησης",
|
|
83
|
+
"SaveAs": "Αποθήκευση ως",
|
|
84
|
+
"Save": "Αποθήκευση",
|
|
85
|
+
"Delete": "Διαγραφή",
|
|
86
|
+
"More": "Περισσότερα",
|
|
87
|
+
"Less": "Λιγότερα",
|
|
88
|
+
"Modal": {
|
|
89
|
+
"Title": "Αποθήκευση κριτηρίων αναζήτησης",
|
|
90
|
+
"Help": "Ορίστε έναν τίτλο για τα επιλεγμένα κριτήρια αναζήτησης. Αυτός ο τίτλος θα σας βοηθήσει να τα χρησιμοποιήσετε ξανά στο μέλλον.",
|
|
91
|
+
"TitleOnUserError": "Παρακαλώ εισάγετε έναν τίτλο",
|
|
92
|
+
"TitleOnListAlreadyCreated": "Το όνομα αυτό χρησιμοποιείται ήδη. Διαλέξτε ένα διαφορετικό.",
|
|
93
|
+
"NoListDefined": "Δεν έχει οριστεί το σημείο αποθήκευσης της λίστας",
|
|
94
|
+
"EmptyCriteriaList": "Δεν έχετε καθορίσει κανένα κριτήριο για αποθήκευση",
|
|
95
|
+
"SaveNameLabel": "Ονομασία λίστας",
|
|
96
|
+
"SaveNamePlaceholder": "Εισάγετε έναν τίτλο",
|
|
97
|
+
"Accept": "Αποθήκευση",
|
|
98
|
+
"Decline": "Απόρριψη",
|
|
99
|
+
"Close": "Κλείσιμο"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVzLmVsLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVuaXZlcnNpcy9uZ3gtdGFibGVzLyIsInNvdXJjZXMiOlsibGliL2kxOG4vdGFibGVzLmVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRztJQUNyQixRQUFRLEVBQUU7UUFDTixRQUFRLEVBQUUsU0FBUztRQUNuQixNQUFNLEVBQUUsYUFBYTtRQUNyQixRQUFRLEVBQUUsV0FBVztRQUNyQixtQkFBbUIsRUFBRSxjQUFjO1FBQ25DLFNBQVMsRUFBRSxpQkFBaUI7UUFDNUIsV0FBVyxFQUFFO1lBQ1QsVUFBVSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixNQUFNLEVBQUUsaUJBQWlCO2dCQUN6QixNQUFNLEVBQUUsU0FBUztnQkFDakIsVUFBVSxFQUFFLGFBQWE7YUFDNUI7WUFDRCxNQUFNLEVBQUUsaURBQWlEO1lBQ3pELFdBQVcsRUFBRSx1QkFBdUI7WUFDcEMsU0FBUyxFQUFFLHVCQUF1QjtZQUNsQyxZQUFZLEVBQUUsdUJBQXVCO1lBQ3JDLFlBQVksRUFBRSw0QkFBNEI7U0FDN0M7UUFDSCxlQUFlLEVBQUUsMEJBQTBCO1FBQzNDLG1CQUFtQixFQUFFLGlEQUFpRDtRQUN0RSxNQUFNLEVBQUUsVUFBVTtRQUNsQixPQUFPLEVBQUUsVUFBVTtRQUNuQixRQUFRLEVBQUUsU0FBUztRQUNuQixnQkFBZ0IsRUFBRSxxQkFBcUI7UUFDdkMsVUFBVSxFQUFFLHdDQUF3QztRQUNwRCx1QkFBdUIsRUFBRSx5QkFBeUI7UUFDbEQsU0FBUyxFQUFFLFFBQVE7UUFDbkIsS0FBSyxFQUFFLEtBQUs7UUFDVixTQUFTLEVBQUUsb0JBQW9CO1FBQy9CLGlCQUFpQixFQUFFLDRCQUE0QjtRQUMvQyxtQkFBbUIsRUFBRSxzREFBc0Q7UUFDM0UsWUFBWSxFQUFFLG9CQUFvQjtRQUNsQyxPQUFPLEVBQUUsVUFBVTtRQUNuQixNQUFNLEVBQUUsVUFBVTtRQUNsQixnQkFBZ0IsRUFBRTtZQUNkLE9BQU8sRUFBRSxvQkFBb0I7WUFDN0IsS0FBSyxFQUFFLDBDQUEwQztZQUNqRCxNQUFNLEVBQUUsaURBQWlEO1NBQzFEO1FBQ0gsbUJBQW1CLEVBQUU7WUFDakIsT0FBTyxFQUFFLG9CQUFvQjtZQUM3QixLQUFLLEVBQUUsc0NBQXNDO1lBQzdDLE1BQU0sRUFBRSw2Q0FBNkM7U0FDeEQ7UUFDRCxrQkFBa0IsRUFBRSxvQkFBb0I7UUFDeEMsb0JBQW9CLEVBQUUsNEVBQTRFO1FBQ2xHLFdBQVcsRUFBRSxjQUFjO1FBQzNCLGdCQUFnQixFQUFFLG1CQUFtQjtRQUN2QyxTQUFTLEVBQUU7WUFDVCxPQUFPLEVBQUUsYUFBYTtZQUN0QixPQUFPLEVBQUUsUUFBUTtZQUNqQixlQUFlLEVBQUU7Z0JBQ2YsTUFBTSxFQUFFLHFGQUFxRjtnQkFDN0YsS0FBSyxFQUFFLG9JQUFvSTtnQkFDM0ksTUFBTSxFQUFFLDRJQUE0STthQUNySjtZQUNELHFCQUFxQixFQUFFO2dCQUNyQixPQUFPLEVBQUUsd0NBQXdDO2dCQUNqRCxhQUFhLEVBQUU7b0JBQ2IsS0FBSyxFQUFFLCtGQUErRjtvQkFDdEcsTUFBTSxFQUFFLHVHQUF1RztpQkFDaEg7YUFDRjtZQUNELHNCQUFzQixFQUFFO2dCQUN0QixPQUFPLEVBQUUsd0NBQXdDO2FBQ2xEO1NBQ0Y7S0FDRjtJQUNELFdBQVcsRUFBRTtRQUNULE1BQU0sRUFBRTtZQUNKLEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFLEtBQUs7U0FDZDtLQUNKO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDZCxRQUFRLEVBQUUsMEJBQTBCO1FBQ3BDLFlBQVksRUFBRSxxQkFBcUI7UUFDbkMsZUFBZSxFQUFFLDJCQUEyQjtRQUM1QyxnQkFBZ0IsRUFBRyxpQkFBaUI7UUFDcEMsbUJBQW1CLEVBQUUsdUJBQXVCO1FBQzVDLFFBQVEsRUFBRyxlQUFlO1FBQzFCLE1BQU0sRUFBRyxZQUFZO1FBQ3JCLFFBQVEsRUFBRyxVQUFVO1FBQ3JCLE1BQU0sRUFBRSxhQUFhO1FBQ3JCLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLE9BQU8sRUFBRztZQUNOLE9BQU8sRUFBRyxpQ0FBaUM7WUFDM0MsTUFBTSxFQUFHLGdJQUFnSTtZQUN6SSxrQkFBa0IsRUFBRyw4QkFBOEI7WUFDbkQsMkJBQTJCLEVBQUcsOERBQThEO1lBQzVGLGVBQWUsRUFBRyxtREFBbUQ7WUFDckUsbUJBQW1CLEVBQUcsb0RBQW9EO1lBQzFFLGVBQWUsRUFBRyxpQkFBaUI7WUFDbkMscUJBQXFCLEVBQUcscUJBQXFCO1lBQzdDLFFBQVEsRUFBRyxZQUFZO1lBQ3ZCLFNBQVMsRUFBRyxVQUFVO1lBQ3RCLE9BQU8sRUFBRyxVQUFVO1NBQ3ZCO0tBQ0o7Q0FDSixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFRBQkxFU19FTCA9IHtcbiAgICBcIlRhYmxlc1wiOiB7XG4gICAgICAgIFwiRXhwb3J0XCI6IFwizpXOvs6xzrPPic6zzq5cIixcbiAgICAgICAgXCJNb3JlXCI6IFwizqDOtc+BzrnPg8+Dz4zPhM61z4HOsVwiLFxuICAgICAgICBcIlNlYXJjaFwiOiBcIs6Rzr3Osc62zq7PhM63z4POt1wiLFxuICAgICAgICBcIlNlYXJjaFBsYWNlaG9sZGVyXCI6IFwizpHOvc6xzrbOrs+EzrfPg863Li4uXCIsXG4gICAgICAgIFwiR3JvdXBCeVwiOiBcIs6fzrzOsc60zr/PgM6/zq/Ot8+DzrcgzrHOvc6sXCIsXG4gICAgICAgIFwiRGF0YVRhYmxlXCI6IHtcbiAgICAgICAgICAgIFwicGFnaW5hdGVcIjoge1xuICAgICAgICAgICAgICAgIFwiZmlyc3RcIjogXCLOoM+Bz47PhM63IM+DzrXOu86vzrTOsVwiLFxuICAgICAgICAgICAgICAgIFwibGFzdFwiOiBcIs6kzrXOu861z4TOsc6vzrEgz4POtc67zq/OtM6xXCIsXG4gICAgICAgICAgICAgICAgXCJuZXh0XCI6IFwizpXPgM+MzrzOtc69zrdcIixcbiAgICAgICAgICAgICAgICBcInByZXZpb3VzXCI6IFwizqDPgc6/zrfOs86/z43OvM61zr3Ot1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbmZvXCI6IFwizpXOvM+GzqzOvc65z4POtyBfU1RBUlRfIM6tz4nPgiBfRU5EXyDOsc+Az4wgX1RPVEFMXyDOtc6zzrPPgc6xz4bOrc+CXCIsXG4gICAgICAgICAgICBcImluZm9FbXB0eVwiOiBcIs6UzrXOvSDOss+Bzq3OuM63zrrOsc69IM61zrPOs8+BzrHPhs6tz4JcIixcbiAgICAgICAgICAgIFwibG9hZGluZ1wiOiBcIs6VzrzPhs6szr3Ouc+DzrcgzrTOtc60zr/OvM6tzr3Pic69Li4uXCIsXG4gICAgICAgICAgICBcInByb2Nlc3NpbmdcIjogXCLOoM6xz4HOsc67zrHOss6uIM60zrXOtM6/zrzOrc69z4nOvS4uLlwiLFxuICAgICAgICAgICAgXCJlbXB0eVRhYmxlXCI6IFwizpTOtc69IM6yz4HOrc64zrfOus6xzr0gzrHPgM6/z4TOtc67zq3Pg868zrHPhM6xLlwiXG4gICAgICAgIH0sXG4gICAgICBcIkNvbHVtbkRpc3BsYXlcIjogXCLOlc+AzrnOu86/zrPOriDOlc68z4bOrM69zrnPg863z4Igz4PPhM63zrvPjs69XCIsXG4gICAgICBcIkNvbHVtbkRpc3BsYXlJbmZvXCI6IFwizpXPgM65zrvOrc6+z4TOtSDPhM65z4Igz4PPhM6uzrvOtc+CIM+Azr/PhSDOuM6tzrvOtc+EzrUgzr3OsSDOtc68z4bOsc69zq/Ots6/zr3PhM6xzrkuXCIsXG4gICAgICBcIlNhdmVcIjogXCLOlc+GzrHPgc68zr/Os86uXCIsXG4gICAgICBcIkFwcGx5XCI6IFwizpXPhs6xz4HOvM6/zrPOrlwiLFxuICAgICAgXCJDYW5jZWxcIjogXCLOkc66z43Pgc+Jz4POt1wiLFxuICAgICAgXCJSZWNvcmRzUGVyUGFnZVwiOiBcIs6VzrPOs8+BzrHPhs6tz4IgzrHOvc6sIM+DzrXOu86vzrTOsVwiLFxuICAgICAgXCJQYWdlSW5mb1wiOiBcInt7c3RhcnR9fS17e2VuZH19IM6xz4DPjCB7e3JlY29yZHNUb3RhbH19XCIsXG4gICAgICBcIlNlYXJjaExpc3RQbGFjZWhvbGRlclwiOiBcIs6Rzr3Osc62zrfPhM6uz4PPhM61IM+Dz4TOtyDOu86vz4PPhM6xLi4uXCIsXG4gICAgICBcIkZpbHRlcnNcIjogXCLOps6vzrvPhM+BzrFcIixcbiAgICAgIFwiQWxsXCI6IFwizozOu86xXCIsXG4gICAgICAgIFwiQWRkSXRlbVwiOiBcIs6gz4HOv8+DzrjOrs66zrcgz4PPhM6/zrnPh861zq/Ov8+FXCIsXG4gICAgICAgIFwiRW1wdHlUYWJsZVRpdGxlXCI6IFwizpTOtc69IM6yz4HOrc64zrfOus6xzr0gzrHPgM6/z4TOtc67zq3Pg868zrHPhM6xLlwiLFxuICAgICAgICBcIkVtcHR5VGFibGVNZXNzYWdlXCI6IFwizqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOvc6xIM+Hz4HOt8+DzrnOvM6/z4DOv865zq7Pg861z4TOtSDOrM67zrvOtc+CIM67zq3Ovs61zrnPgiDOus67zrXOuc60zrnOrC5cIixcbiAgICAgICAgXCJSZW1vdmVJdGVtXCI6IFwizpTOuc6xzrPPgc6xz4bOriDPg8+Ezr/Ouc+HzrXOr86/z4VcIixcbiAgICAgICAgXCJJdGVtc1wiOiBcIs+Dz4TOv865z4fOtc6vzrFcIixcbiAgICAgICAgXCJJdGVtXCI6IFwiz4PPhM6/zrnPh861zq/Ov1wiLFxuICAgICAgICBcIkFkZEl0ZW1NZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIFwidGl0bGVcIjogXCLOoM+Bzr/Pg864zq7Ous63IM+Dz4TOv865z4fOtc6vz4nOvVwiLFxuICAgICAgICAgICAgXCJvbmVcIjogXCLOiM69zrEgzr3Orc6/IM+Dz4TOv865z4fOtc6vzr8gz4DPgc6/z4PPhM6tzrjOt866zrUgzrzOtSDOtc+AzrnPhM+Fz4fOr86xLlwiLFxuICAgICAgICAgICAgXCJtYW55XCI6IFwie3t2YWx1ZX19IM69zq3OsSDPg8+Ezr/Ouc+HzrXOr86xIM+Az4HOv8+Dz4TOrc64zrfOus6xzr0gzrzOtSDOtc+AzrnPhM+Fz4fOr86xLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgXCJSZW1vdmVJdGVtTWVzc2FnZVwiOiB7XG4gICAgICAgICAgICBcInRpdGxlXCI6IFwizpHPhs6xzq/Pgc61z4POtyDPg8+Ezr/Ouc+HzrXOr8+Jzr1cIixcbiAgICAgICAgICAgIFwib25lXCI6IFwizojOvc6xIM+Dz4TOv865z4fOtc6vzr8gzrHPhs6xzrnPgc6tzrjOt866zrUgzrzOtSDOtc+AzrnPhM+Fz4fOr86xLlwiLFxuICAgICAgICAgICAgXCJtYW55XCI6IFwie3t2YWx1ZX19IM+Dz4TOv865z4fOtc6vzrEgzrHPhs6xzrnPgc6tzrjOt866zrHOvSDOvM61IM61z4DOuc+Ez4XPh86vzrEuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJSZW1vdmVJdGVtc1RpdGxlXCI6IFwizpTOuc6xzrPPgc6xz4bOriDPg8+Ezr/Ouc+HzrXOr86/z4VcIixcbiAgICAgICAgXCJSZW1vdmVJdGVtc01lc3NhZ2VcIjogXCLOoM+Bz4zOus61zrnPhM6xzrkgzr3OsSDOtM65zrHOs8+BzqzPiM61z4TOtSDOrc69zrEgzq4gz4DOtc+BzrnPg8+Dz4zPhM61z4HOsSDPg8+Ezr/Ouc+HzrXOr86xLiDOmM6tzrvOtc+EzrUgzr3OsSDPgM+Bzr/Ph8+Jz4HOrs+DzrXPhM61P1wiLFxuICAgICAgICBcIlNlbGVjdEFsbFwiOiBcIs6Vz4DOuc67zr/Os86uIM+MzrvPic69XCIsXG4gICAgICAgIFwiQ2xlYXJTZWxlY3Rpb25cIjogXCLOkc69zrHOr8+BzrXPg863IM61z4DOuc67zr/Os86uz4JcIixcbiAgICAgIFwiQWN0aW9uc1wiOiB7XG4gICAgICAgIFwiTGFiZWxcIjogXCLOlc+AzrXOvs61z4HOs86xz4POr86xXCIsXG4gICAgICAgIFwiU3RhcnRcIjogXCLOiM69zrHPgc6+zrdcIixcbiAgICAgICAgXCJBY3Rpb25NZXNzYWdlXCI6IHtcbiAgICAgICAgICBcIk5vbmVcIjogXCLOlM61zr0gzq3Ph861z4TOtSDOtc+AzrnOu86tzr7Otc65IM66zrHOvc6tzr3OsSDPg8+Ezr/Ouc+HzrXOr86/IM+Azr/PhSDOvc6xIM6xzrrOv867zr/Phc64zrXOryDPhM65z4Igz4DPgc6/z4vPgM6/zrjOrc+DzrXOuc+CIM+EzrfPgiDOtc69zq3Pgc6zzrXOuc6xz4IuXCIsXG4gICAgICAgICAgXCJPbmVcIjogXCLOiM+HzrXPhM61IM61z4DOuc67zq3Ovs61zrkgzq3Ovc6xIM+Dz4TOv865z4fOtc6vzr8gz4DOv8+FIM6xzrrOv867zr/Phc64zrXOryDPhM65z4Igz4DPgc6/z4vPgM6/zrjOrc+DzrXOuc+CIM+EzrfPgiDOtc69zq3Pgc6zzrXOuc6xz4IuIM6gzrHPhM6uz4PPhM61IM+Ezr8gz4DOu86uzrrPhM+Bzr8gzojOvc6xz4HOvs63IM6zzrnOsSDOvc6xIM6+zrXOus65zr3Ors+DzrXOuSDOtyDOtM65zrHOtM65zrrOsc+Dzq/OsS5cIixcbiAgICAgICAgICBcIk1hbnlcIjogXCLOiM+HzrXPhM61IM61z4DOuc67zq3Ovs61zrkge3tsZW5ndGh9fSDPg8+Ezr/Ouc+HzrXOr86xIM+Azr/PhSDOsc66zr/Ou86/z4XOuM6/z43OvSDPhM65z4Igz4DPgc6/z4vPgM6/zrjOrc+DzrXOuc+CIM+EzrfPgiDOtc69zq3Pgc6zzrXOuc6xz4IuIM6gzrHPhM6uz4PPhM61IM+Ezr8gz4DOu86uzrrPhM+Bzr8gzojOvc6xz4HOvs63IM6zzrnOsSDOvc6xIM6+zrXOus65zr3Ors+DzrXOuSDOtyDOtM65zrHOtM65zrrOsc+Dzq/OsS5cIlxuICAgICAgICB9LFxuICAgICAgICBcIkNvbXBsZXRlZFdpdGhFcnJvcnNcIjoge1xuICAgICAgICAgIFwiVGl0bGVcIjogXCLOlyDOtM65zrHOtM65zrrOsc+Dzq/OsSDOv867zr/Ous67zrfPgc+OzrjOt866zrUgzrzOtSDPg8+GzqzOu868zrHPhM6xLlwiLFxuICAgICAgICAgIFwiRGVzY3JpcHRpb25cIjoge1xuICAgICAgICAgICAgXCJPbmVcIjogXCLOiM69zrEgz4PPhM6/zrnPh861zq/OvyDOtM61zr0gzrHOvc6xzr3Otc+OzrjOt866zrUgzrvPjM6zz4kgzrXOvc+Mz4Igz4PPhs6szrvOvM6xz4TOv8+CIM+Azr/PhSDPg8+Fzr3Orc6yzrcgzrrOsc+Ezqwgz4TOt869IM61zrrPhM6tzrvOtc+Dzrcgz4TOt8+CIM60zrnOsc60zrnOus6xz4POr86xz4IuXCIsXG4gICAgICAgICAgICBcIk1hbnlcIjogXCJ7e2Vycm9yc319IM+Dz4TOv865z4fOtc6vzrEgzrTOtc69IM6xzr3Osc69zrXPjs64zrfOus6xzr0gzrvPjM6zz4kgzrXOvc+Mz4Igz4PPhs6szrvOvM6xz4TOv8+CIM+Azr/PhSDPg8+Fzr3Orc6yzrcgzrrOsc+Ezqwgz4TOt869IM61zrrPhM6tzrvOtc+Dzrcgz4TOt8+CIM60zrnOsc60zrnOus6xz4POr86xz4IuXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiQ29tcGxldGVkV2l0aFN1Y2Nlc3NcIjoge1xuICAgICAgICAgIFwiVGl0bGVcIjogXCLOlyDOtM65zrHOtM65zrrOsc+Dzq/OsSDOv867zr/Ous67zrfPgc+OzrjOt866zrUgzrzOtSDOtc+AzrnPhM+Fz4fOr86xLlwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFwiVHJ1ZUZhbHNlXCI6IHtcbiAgICAgICAgXCJsb25nXCI6IHtcbiAgICAgICAgICAgIFwiWWVzXCI6IFwizp3Osc65XCIsXG4gICAgICAgICAgICBcIk5vXCI6IFwizozPh865XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCJBZHZhbmNlZFNlYXJjaFwiOiB7XG4gICAgICAgIFwiQ2hvb3NlXCI6IFwiPM6Vz4DOuc67zq3Ovs+EzrUgzrzOuc6xIM6xzr3Osc62zq7PhM63z4POtz5cIixcbiAgICAgICAgXCJDaG9vc2VEYXRlXCI6IFwizpXPgM65zrvOv86zzq4gzrfOvM61z4HOv868zrfOvc6vzrHPglwiLFxuICAgICAgICBcIlNhdmVkU2VhcmNoZXNcIjogXCLOkc+Azr/OuM63zrrOtc+FzrzOrc69zrXPgiDOsc69zrHOts63z4TOrs+DzrXOuc+CXCIsXG4gICAgICAgIFwiVG9nZ2xlRHJvcGRvd25cIiA6IFwizpXOvM+GzqzOvc65z4POtyDOu86vz4PPhM6xz4JcIixcbiAgICAgICAgXCJTYXZlQ3VycmVudFNlYXJjaFwiOiBcIs6Rz4DOv864zq7Ous61z4XPg863IM6xzr3Osc62zq7PhM63z4POt8+CXCIsXG4gICAgICAgIFwiU2F2ZUFzXCIgOiBcIs6Rz4DOv864zq7Ous61z4XPg863IM+Jz4JcIixcbiAgICAgICAgXCJTYXZlXCIgOiBcIs6Rz4DOv864zq7Ous61z4XPg863XCIsXG4gICAgICAgIFwiRGVsZXRlXCIgOiBcIs6UzrnOsc6zz4HOsc+Gzq5cIixcbiAgICAgICAgXCJNb3JlXCI6IFwizqDOtc+BzrnPg8+Dz4zPhM61z4HOsVwiLFxuICAgICAgICBcIkxlc3NcIjogXCLOm865zrPPjM+EzrXPgc6xXCIsXG4gICAgICAgIFwiTW9kYWxcIiA6IHtcbiAgICAgICAgICAgIFwiVGl0bGVcIiA6IFwizpHPgM6/zrjOrs66zrXPhc+DzrcgzrrPgc65z4TOt8+Bzq/Pic69IM6xzr3Osc62zq7PhM63z4POt8+CXCIsXG4gICAgICAgICAgICBcIkhlbHBcIiA6IFwizp/Pgc6vz4PPhM61IM6tzr3Osc69IM+Ezq/PhM67zr8gzrPOuc6xIM+EzrEgzrXPgM65zrvOtc6zzrzOrc69zrEgzrrPgc65z4TOrs+BzrnOsSDOsc69zrHOts6uz4TOt8+DzrfPgi4gzpHPhc+Ez4zPgiDOvyDPhM6vz4TOu86/z4IgzrjOsSDPg86xz4IgzrLOv863zrjOrs+DzrXOuSDOvc6xIM+EzrEgz4fPgc63z4POuc68zr/PgM6/zrnOrs+DzrXPhM61IM6+zrHOvc6sIM+Dz4TOvyDOvM6tzrvOu86/zr0uXCIsXG4gICAgICAgICAgICBcIlRpdGxlT25Vc2VyRXJyb3JcIiA6IFwizqDOsc+BzrHOus6xzrvPjiDOtc65z4POrM6zzrXPhM61IM6tzr3Osc69IM+Ezq/PhM67zr9cIixcbiAgICAgICAgICAgIFwiVGl0bGVPbkxpc3RBbHJlYWR5Q3JlYXRlZFwiIDogXCLOpM6/IM+Mzr3Ov868zrEgzrHPhc+Ez4wgz4fPgc63z4POuc68zr/PgM6/zrnOtc6vz4TOsc65IM6uzrTOty4gzpTOuc6xzrvOrc6+z4TOtSDOrc69zrEgzrTOuc6xz4bOv8+BzrXPhM65zrrPjC5cIixcbiAgICAgICAgICAgIFwiTm9MaXN0RGVmaW5lZFwiIDogXCLOlM61zr0gzq3Ph861zrkgzr/Pgc65z4PPhM61zq8gz4TOvyDPg863zrzOtc6vzr8gzrHPgM6/zrjOrs66zrXPhc+DzrfPgiDPhM63z4IgzrvOr8+Dz4TOsc+CXCIsXG4gICAgICAgICAgICBcIkVtcHR5Q3JpdGVyaWFMaXN0XCIgOiBcIs6UzrXOvSDOrc+HzrXPhM61IM66zrHOuM6/z4HOr8+DzrXOuSDOus6xzr3Orc69zrEgzrrPgc65z4TOrs+BzrnOvyDOs865zrEgzrHPgM6/zrjOrs66zrXPhc+DzrdcIixcbiAgICAgICAgICAgIFwiU2F2ZU5hbWVMYWJlbFwiIDogXCLOn869zr/OvM6xz4POr86xIM67zq/Pg8+EzrHPglwiLFxuICAgICAgICAgICAgXCJTYXZlTmFtZVBsYWNlaG9sZGVyXCIgOiBcIs6VzrnPg86szrPOtc+EzrUgzq3Ovc6xzr0gz4TOr8+EzrvOv1wiLFxuICAgICAgICAgICAgXCJBY2NlcHRcIiA6IFwizpHPgM6/zrjOrs66zrXPhc+DzrdcIixcbiAgICAgICAgICAgIFwiRGVjbGluZVwiIDogXCLOkc+Az4zPgc+BzrnPiM63XCIsXG4gICAgICAgICAgICBcIkNsb3NlXCIgOiBcIs6azrvOtc6vz4POuc68zr9cIlxuICAgICAgICB9XG4gICAgfVxufVxuIl19
|