cilog-lib 1.10.21 → 1.10.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/esm2022/cilog-lib.mjs +5 -0
  2. package/esm2022/lib/cilog-lib.component.mjs +22 -0
  3. package/esm2022/lib/cilog-lib.module.mjs +96 -0
  4. package/esm2022/lib/cilog-lib.service.mjs +14 -0
  5. package/esm2022/lib/helpers/enums/grille.enum.mjs +51 -0
  6. package/esm2022/lib/helpers/interfaces/edition.interface.mjs +2 -0
  7. package/esm2022/lib/helpers/interfaces/editor.interface.mjs +2 -0
  8. package/esm2022/lib/helpers/interfaces/grille.interface.mjs +2 -0
  9. package/esm2022/lib/helpers/interfaces/message.interface.mjs +2 -0
  10. package/esm2022/lib/helpers/pipes/value.pipe.mjs +27 -0
  11. package/esm2022/lib/modules/primeng.module.mjs +86 -0
  12. package/esm2022/lib/services/excel.service.mjs +184 -0
  13. package/esm2022/lib/services/message.service.mjs +30 -0
  14. package/esm2022/lib/services/table.service.mjs +14 -0
  15. package/esm2022/lib/views/cilog-input-number/cilog-input-number.component.mjs +251 -0
  16. package/esm2022/lib/views/documentation/documentation-contextuelle.component.mjs +156 -0
  17. package/esm2022/lib/views/editor/editor.component.mjs +38 -0
  18. package/esm2022/lib/views/message/message.component.mjs +77 -0
  19. package/esm2022/lib/views/table/table.component.mjs +674 -0
  20. package/esm2022/public-api.mjs +24 -0
  21. package/fesm2022/cilog-lib.mjs +101 -91
  22. package/fesm2022/cilog-lib.mjs.map +1 -1
  23. package/index.d.ts +5 -0
  24. package/lib/cilog-lib.component.d.ts +8 -0
  25. package/lib/cilog-lib.module.d.ts +21 -0
  26. package/lib/cilog-lib.service.d.ts +6 -0
  27. package/lib/helpers/enums/grille.enum.d.ts +44 -0
  28. package/lib/helpers/interfaces/edition.interface.d.ts +34 -0
  29. package/lib/helpers/interfaces/editor.interface.d.ts +4 -0
  30. package/lib/helpers/interfaces/grille.interface.d.ts +167 -0
  31. package/lib/helpers/interfaces/message.interface.d.ts +6 -0
  32. package/lib/helpers/pipes/value.pipe.d.ts +7 -0
  33. package/lib/modules/primeng.module.d.ts +24 -0
  34. package/lib/services/excel.service.d.ts +15 -0
  35. package/lib/services/message.service.d.ts +12 -0
  36. package/lib/services/table.service.d.ts +6 -0
  37. package/lib/views/cilog-input-number/cilog-input-number.component.d.ts +40 -0
  38. package/lib/views/documentation/documentation-contextuelle.component.d.ts +49 -0
  39. package/lib/views/editor/editor.component.d.ts +17 -0
  40. package/lib/views/message/message.component.d.ts +17 -0
  41. package/lib/views/table/table.component.d.ts +83 -0
  42. package/package.json +5 -3
  43. package/public-api.d.ts +15 -0
  44. package/types/cilog-lib.d.ts +0 -538
@@ -0,0 +1,14 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class CilogTableService {
4
+ constructor() { }
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CilogTableService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CilogTableService, providedIn: 'root' }); }
7
+ }
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CilogTableService, decorators: [{
9
+ type: Injectable,
10
+ args: [{
11
+ providedIn: 'root'
12
+ }]
13
+ }], ctorParameters: () => [] });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NpbG9nLWxpYi9zcmMvbGliL3NlcnZpY2VzL3RhYmxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLGlCQUFpQjtJQUUxQixnQkFBZ0IsQ0FBQzsrR0FGUixpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZkLE1BQU07OzRGQUVULGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENpbG9nVGFibGVTZXJ2aWNlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,251 @@
1
+ import { Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "primeng/inputtext";
6
+ export class CilogInputNumberComponent {
7
+ constructor() {
8
+ this.onInput = new EventEmitter();
9
+ this.onChange = new EventEmitter();
10
+ this.onFocus = new EventEmitter();
11
+ this.onBlur = new EventEmitter();
12
+ this.valueStr = '';
13
+ this.specialKeys = ['Tab', 'End', 'Home', 'ArrowLeft', 'ArrowRight'];
14
+ }
15
+ ngOnInit() {
16
+ this.regex = new RegExp(`^-?\\d{1,3}(?:\\d{3})*(?:[\\.,]\\d{0,${this.maxDecimals || Number.MAX_SAFE_INTEGER}})?$`);
17
+ }
18
+ onKeyDownEvent(event) {
19
+ if (this.specialKeys.indexOf(event.key) !== -1) {
20
+ return;
21
+ }
22
+ if (event.key == 'Enter') {
23
+ this.onChangeInput(this.value);
24
+ this.onChange.emit(this.value);
25
+ return;
26
+ }
27
+ let current = this.cilogInputNumber.nativeElement.value;
28
+ const positionStart = this.cilogInputNumber.nativeElement.selectionStart;
29
+ const positionEnd = this.cilogInputNumber.nativeElement.selectionEnd;
30
+ let debut = current.slice(0, positionStart).replace(/\s/g, '');
31
+ let fin = current.slice(positionEnd).replace(/\s/g, '');
32
+ let next = current.replace(/\s/g, '');
33
+ if (event.key === '.') {
34
+ let positionStartPoint = this.cilogInputNumber.nativeElement.selectionStart;
35
+ next = [debut, ',', fin].join('');
36
+ if (String(next).match(this.regex)) {
37
+ this.acceptValue(next, event);
38
+ }
39
+ else {
40
+ if (current.slice(positionStart)[0] == ',') {
41
+ this.cilogInputNumber.nativeElement.selectionStart = positionStartPoint + 1;
42
+ this.cilogInputNumber.nativeElement.selectionEnd = positionStartPoint + 1;
43
+ }
44
+ }
45
+ }
46
+ else if (event.key === 'Backspace') {
47
+ if (positionStart == positionEnd && (/\s/g.test(current.slice(positionStart - 1, positionStart)) || current.slice(positionStart - 1, positionStart) == ",")) {
48
+ this.cilogInputNumber.nativeElement.selectionStart = positionStart - 1;
49
+ this.cilogInputNumber.nativeElement.selectionEnd = positionStart - 1;
50
+ if (this.cilogInputNumber.nativeElement.value.at(-1) == ',') {
51
+ this.cilogInputNumber.nativeElement.value = this.cilogInputNumber.nativeElement.value.substring(0, this.cilogInputNumber.nativeElement.value.length - 1);
52
+ }
53
+ }
54
+ else {
55
+ if (this.cilogInputNumber.nativeElement.selectionStart != this.cilogInputNumber.nativeElement.selectionEnd) {
56
+ next = [debut, fin].join('');
57
+ }
58
+ else {
59
+ if (positionStart != 0) {
60
+ debut = current.slice(0, positionStart - 1).replace(/\s/g, '');
61
+ }
62
+ next = [debut, fin].join('');
63
+ }
64
+ this.checkValue(next, event);
65
+ }
66
+ }
67
+ else {
68
+ if (event.key === ',' && current.slice(positionStart)[0] == ',') {
69
+ this.cilogInputNumber.nativeElement.selectionStart += 1;
70
+ }
71
+ else {
72
+ if (positionStart != positionEnd) {
73
+ this.cilogInputNumber.nativeElement.selectionStart = positionStart + 1;
74
+ this.cilogInputNumber.nativeElement.selectionEnd = positionStart + 1;
75
+ }
76
+ next = [debut, event.key, fin].join('');
77
+ this.checkValue(next, event);
78
+ }
79
+ }
80
+ event.preventDefault();
81
+ }
82
+ checkValue(next, event) {
83
+ if (next == '-' && (this.min == null || this.min < 0)) {
84
+ this.acceptValue(next, event);
85
+ }
86
+ else if (next.length > 1 && next[0] == ',') {
87
+ this.acceptValue(next.substring(1), event);
88
+ }
89
+ else {
90
+ if (String(next), !String(next).match(this.regex)) {
91
+ if (next == '') {
92
+ this.acceptValue(next, event);
93
+ }
94
+ }
95
+ else {
96
+ let number = +(next.replace(',', '.'));
97
+ if (this.min == null || number >= this.min) {
98
+ if (this.max == null || number <= this.max) {
99
+ this.acceptValue(next, event);
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ acceptValue(value, event) {
106
+ // Stockage position initiale
107
+ const positionStart = this.cilogInputNumber.nativeElement.selectionStart;
108
+ const positionEnd = this.cilogInputNumber.nativeElement.selectionEnd;
109
+ let valEntier = this.cilogInputNumber.nativeElement.value.replace(/\s/g, '').split(',')[0];
110
+ if (valEntier[0] == '-') {
111
+ valEntier = valEntier.substring(1);
112
+ }
113
+ setTimeout(() => {
114
+ let positionFinale = positionStart;
115
+ if (positionStart == positionEnd) {
116
+ let jump = 1;
117
+ let valEntierNext = value.split(',')[0];
118
+ if (valEntierNext[0] == '-') {
119
+ valEntierNext = valEntierNext.substring(1);
120
+ }
121
+ if (value.split(',')[0] != valEntier &&
122
+ ((event.key != 'Backspace' && valEntier.length != 0 && valEntier.length % 3 == 0)
123
+ || (event.key == 'Backspace' && (valEntier.length - 1) != 0 && (valEntier.length - 1) % 3 == 0))) {
124
+ jump = 2;
125
+ }
126
+ // Calcul position finale
127
+ if (event.key == 'Backspace') {
128
+ if (positionStart != 0) {
129
+ positionFinale = positionStart - jump;
130
+ }
131
+ }
132
+ else {
133
+ positionFinale = positionStart + jump;
134
+ }
135
+ }
136
+ this.cilogInputNumber.nativeElement.selectionStart = positionFinale;
137
+ this.cilogInputNumber.nativeElement.selectionEnd = positionFinale;
138
+ });
139
+ // Mise à jour de la valeur du champ
140
+ if (value == '' || value == '-') {
141
+ this.writeValue(null, value);
142
+ }
143
+ else {
144
+ this.writeValue(+(value.replace(',', '.')), value, ((event.key == '.' || event.key == ',') && value.slice(-1) == ','), (event.key == '0' && value.split(',')[0] == valEntier && value.split(',').length == 2), (event.key == '0' && +value.split(',')[1] == 0));
145
+ }
146
+ this.onChangeInput(this.value);
147
+ this.onInput.emit(this.value);
148
+ }
149
+ writeValue(value, valueString = null, sep = false, zero = false, zeroAfter = false) {
150
+ this.value = value;
151
+ if (this.value == null) {
152
+ if (valueString == '-') {
153
+ this.valueStr = '-';
154
+ }
155
+ else {
156
+ this.valueStr = '';
157
+ }
158
+ if (this.cilogInputNumber) {
159
+ this.cilogInputNumber.nativeElement.value = this.valueStr;
160
+ }
161
+ }
162
+ else {
163
+ if (this.maxDecimals != null && this.value.toString().split('.').length > 1 && this.value.toString().split('.')[1].length > this.maxDecimals) {
164
+ this.valueStr = this.value.toLocaleString('fr-FR', { maximumFractionDigits: this.maxDecimals });
165
+ }
166
+ else {
167
+ this.valueStr = this.value.toLocaleString('fr-FR', { maximumFractionDigits: 6 });
168
+ }
169
+ if (sep || zeroAfter) {
170
+ this.valueStr = this.valueStr + ',';
171
+ }
172
+ if (zero) {
173
+ this.valueStr = this.valueStr + '0';
174
+ }
175
+ this.cilogInputNumber.nativeElement.value = this.valueStr;
176
+ }
177
+ }
178
+ onBlurEvent(event) {
179
+ this.onChangeInput(this.value);
180
+ this.onChange.emit(this.value);
181
+ this.onBlur.emit(this.value);
182
+ }
183
+ onFocusEvent(event) {
184
+ this.onFocus.emit(this.value);
185
+ }
186
+ onChangeInput(val) { }
187
+ onTouchedInput() { }
188
+ registerOnChange(fn) {
189
+ this.onChangeInput = fn;
190
+ }
191
+ registerOnTouched(fn) {
192
+ this.onTouchedInput = fn;
193
+ }
194
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CilogInputNumberComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
195
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CilogInputNumberComponent, selector: "cilog-input-number", inputs: { min: "min", max: "max", maxDecimals: "maxDecimals", prefixe: "prefixe", suffixe: "suffixe", inputStyleClass: "inputStyleClass", disabled: "disabled", readonly: "readonly", textColor: "textColor", bold: "bold", italic: "italic", floatLabel: "floatLabel" }, outputs: { onInput: "onInput", onChange: "onChange", onFocus: "onFocus", onBlur: "onBlur" }, host: { listeners: { "keydown": "onKeyDownEvent($event)" } }, providers: [
196
+ {
197
+ provide: NG_VALUE_ACCESSOR,
198
+ useExisting: forwardRef(() => CilogInputNumberComponent),
199
+ multi: true
200
+ }
201
+ ], viewQueries: [{ propertyName: "cilogInputNumber", first: true, predicate: ["cilogInputNumber"], descendants: true }], ngImport: i0, template: "<div class=\"input-group w-full\">\r\n\r\n <span class=\"input-group-addon prefixe\"\r\n *ngIf=\"prefixe != null\">\r\n {{ prefixe }}\r\n </span>\r\n\r\n <div [ngClass]=\"{ 'p-float-label' : floatLabel != null }\">\r\n <input #cilogInputNumber\r\n pInputText\r\n type=\"text\"\r\n [disabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n [value]=\"valueStr\"\r\n (focus)=\"onFocusEvent($event)\"\r\n (blur)=\"onBlurEvent($event)\"\r\n [class]=\"'w-full z-1' + (inputStyleClass == null ? '' : ' ' + inputStyleClass)\"\r\n [ngClass]=\"suffixe != null && prefixe != null ? 'border-noround' : prefixe != null ? 'border-noround-left' : suffixe != null ? 'border-noround-right' : null\"\r\n [ngStyle]=\"{ 'color' : textColor ? textColor : null }\" />\r\n\r\n <label *ngIf=\"floatLabel != null\">{{ floatLabel }}</label>\r\n </div>\r\n\r\n <span class=\"input-group-addon suffixe\"\r\n *ngIf=\"suffixe != null\">\r\n {{ suffixe }}\r\n </span>\r\n\r\n</div>\r\n", styles: [":host ::ng-deep .input-group{display:flex!important}:host ::ng-deep .input-group-addon{background-color:#fff!important;border:1px solid #ccc!important;padding:0 12px!important;max-width:5rem!important;overflow:hidden!important;font-weight:700!important}:host ::ng-deep .prefixe{border-radius:4px 0 0 4px!important;border-right:none!important;display:flex;align-items:center}:host ::ng-deep .suffixe{border-radius:0 4px 4px 0!important;border-left:none!important;display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.InputText, selector: "[pInputText]", inputs: ["variant"] }] }); }
202
+ }
203
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CilogInputNumberComponent, decorators: [{
204
+ type: Component,
205
+ args: [{ selector: 'cilog-input-number', providers: [
206
+ {
207
+ provide: NG_VALUE_ACCESSOR,
208
+ useExisting: forwardRef(() => CilogInputNumberComponent),
209
+ multi: true
210
+ }
211
+ ], template: "<div class=\"input-group w-full\">\r\n\r\n <span class=\"input-group-addon prefixe\"\r\n *ngIf=\"prefixe != null\">\r\n {{ prefixe }}\r\n </span>\r\n\r\n <div [ngClass]=\"{ 'p-float-label' : floatLabel != null }\">\r\n <input #cilogInputNumber\r\n pInputText\r\n type=\"text\"\r\n [disabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n [value]=\"valueStr\"\r\n (focus)=\"onFocusEvent($event)\"\r\n (blur)=\"onBlurEvent($event)\"\r\n [class]=\"'w-full z-1' + (inputStyleClass == null ? '' : ' ' + inputStyleClass)\"\r\n [ngClass]=\"suffixe != null && prefixe != null ? 'border-noround' : prefixe != null ? 'border-noround-left' : suffixe != null ? 'border-noround-right' : null\"\r\n [ngStyle]=\"{ 'color' : textColor ? textColor : null }\" />\r\n\r\n <label *ngIf=\"floatLabel != null\">{{ floatLabel }}</label>\r\n </div>\r\n\r\n <span class=\"input-group-addon suffixe\"\r\n *ngIf=\"suffixe != null\">\r\n {{ suffixe }}\r\n </span>\r\n\r\n</div>\r\n", styles: [":host ::ng-deep .input-group{display:flex!important}:host ::ng-deep .input-group-addon{background-color:#fff!important;border:1px solid #ccc!important;padding:0 12px!important;max-width:5rem!important;overflow:hidden!important;font-weight:700!important}:host ::ng-deep .prefixe{border-radius:4px 0 0 4px!important;border-right:none!important;display:flex;align-items:center}:host ::ng-deep .suffixe{border-radius:0 4px 4px 0!important;border-left:none!important;display:flex;align-items:center}\n"] }]
212
+ }], ctorParameters: () => [], propDecorators: { min: [{
213
+ type: Input
214
+ }], max: [{
215
+ type: Input
216
+ }], maxDecimals: [{
217
+ type: Input
218
+ }], prefixe: [{
219
+ type: Input
220
+ }], suffixe: [{
221
+ type: Input
222
+ }], inputStyleClass: [{
223
+ type: Input
224
+ }], disabled: [{
225
+ type: Input
226
+ }], readonly: [{
227
+ type: Input
228
+ }], textColor: [{
229
+ type: Input
230
+ }], bold: [{
231
+ type: Input
232
+ }], italic: [{
233
+ type: Input
234
+ }], floatLabel: [{
235
+ type: Input
236
+ }], onInput: [{
237
+ type: Output
238
+ }], onChange: [{
239
+ type: Output
240
+ }], onFocus: [{
241
+ type: Output
242
+ }], onBlur: [{
243
+ type: Output
244
+ }], cilogInputNumber: [{
245
+ type: ViewChild,
246
+ args: ['cilogInputNumber']
247
+ }], onKeyDownEvent: [{
248
+ type: HostListener,
249
+ args: ['keydown', ['$event']]
250
+ }] } });
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lsb2ctaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NpbG9nLWxpYi9zcmMvbGliL3ZpZXdzL2NpbG9nLWlucHV0LW51bWJlci9jaWxvZy1pbnB1dC1udW1iZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvY2lsb2ctaW5wdXQtbnVtYmVyL2NpbG9nLWlucHV0LW51bWJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hJLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQWN6RSxNQUFNLE9BQU8seUJBQXlCO0lBNkJsQztRQVpVLFlBQU8sR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMzRCxhQUFRLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDNUQsWUFBTyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzNELFdBQU0sR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVwRSxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBS2QsZ0JBQVcsR0FBa0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFdkUsQ0FBQztJQUVqQixRQUFRO1FBQ0osSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyx3Q0FBd0MsSUFBSSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZILENBQUM7SUFHRCxjQUFjLENBQUMsS0FBb0I7UUFF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QUFLLEVBQUUsSUFBSTthQUNkO1NBQ0osZ0pDYkwsc29DQTZCQTs7NEZEZGEseUJBQXlCO2tCQVpyQyxTQUFTOytCQUNJLG9CQUFvQixhQUduQjt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0o7d0RBTVEsR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUl3QixnQkFBZ0I7c0JBQTlDLFNBQVM7dUJBQUMsa0JBQWtCO2dCQVk3QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NpbG9nLWlucHV0LW51bWJlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2lsb2ctaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NpbG9nLWlucHV0LW51bWJlci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2lsb2dJbnB1dE51bWJlckNvbXBvbmVudCksXHJcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2lsb2dJbnB1dE51bWJlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIHZhbHVlOiBudW1iZXI7XHJcblxyXG4gICAgQElucHV0KCkgbWluOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBtYXg6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIG1heERlY2ltYWxzOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBwcmVmaXhlOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBzdWZmaXhlOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBpbnB1dFN0eWxlQ2xhc3M6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSB0ZXh0Q29sb3I6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIGJvbGQ6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBpdGFsaWM6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBmbG9hdExhYmVsOiBzdHJpbmc7XHJcblxyXG4gICAgQE91dHB1dCgpIG9uSW5wdXQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Gb2N1czogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkJsdXI6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gICAgdmFsdWVTdHI6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2NpbG9nSW5wdXROdW1iZXInKSBjaWxvZ0lucHV0TnVtYmVyOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIHByaXZhdGUgcmVnZXg6IFJlZ0V4cDtcclxuICAgIHByaXZhdGUgc3BlY2lhbEtleXM6IEFycmF5PHN0cmluZz4gPSBbJ1RhYicsICdFbmQnLCAnSG9tZScsICdBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCddO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMucmVnZXggPSBuZXcgUmVnRXhwKGBeLT9cXFxcZHsxLDN9KD86XFxcXGR7M30pKig/OltcXFxcLixdXFxcXGR7MCwke3RoaXMubWF4RGVjaW1hbHMgfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9fSk/JGApO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxyXG4gICAgb25LZXlEb3duRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3BlY2lhbEtleXMuaW5kZXhPZihldmVudC5rZXkpICE9PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09ICdFbnRlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUlucHV0KHRoaXMudmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBzdHJpbmcgPSB0aGlzLmNpbG9nSW5wdXROdW1iZXIubmF0aXZlRWxlbWVudC52YWx1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25TdGFydCA9IHRoaXMuY2lsb2dJbnB1dE51bWJlci5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uRW5kID0gdGhpcy5jaWxvZ0lucHV0TnVtYmVyLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kO1xyXG5cclxuICAgICAgICBsZXQgZGVidXQ6IHN0cmluZyA9IGN1cnJlbnQuc2xpY2UoMCwgcG9zaXRpb25TdGFydCkucmVwbGFjZSgvXFxzL2csICcnKTtcclxuICAgICAgICBsZXQgZmluOiBzdHJpbmcgPSBjdXJyZW50LnNsaWNlKHBvc2l0aW9uRW5kKS5yZXBsYWNlKC9cXHMvZywgJycpO1xyXG5cclxuICAgICAgICBsZXQgbmV4dDogc3RyaW5nID0gY3VycmVudC5yZXBsYWNlKC9cXHMvZywgJycpO1xyXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICcuJykge1xyXG4gICAgICAgICAgICBsZXQgcG9zaXRpb25TdGFydFBvaW50OiBudW1iZXIgPSB0aGlzLmNpbG9nSW5wdXROdW1iZXIubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgbmV4dCA9IFtkZWJ1dCwgJywnLCBmaW5dLmpvaW4oJycpO1xyXG4gICAgICAgICAgICBpZiAoU3RyaW5nKG5leHQpLm1hdGNoKHRoaXMucmVnZXgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2VwdFZhbHVlKG5leHQsIGV2ZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnNsaWNlKHBvc2l0aW9uU3RhcnQpWzBdID09ICcsJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2lsb2dJbnB1dE51bWJlci5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0ID0gcG9zaXRpb25TdGFydFBvaW50ICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNpbG9nSW5wdXROdW1iZXIubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPSBwb3NpdGlvblN0YXJ0UG9pbnQgKyAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvblN0YXJ0ID09IHBvc2l0aW9uRW5kICYmICgvXFxzL2cudGVzdChjdXJyZW50LnNsaWNlKHBvc2l0aW9uU3RhcnQgLSAxLCBwb3NpdGlvblN0YXJ0KSkgfHwgY3VycmVudC5zbGljZShwb3NpdGlvblN0YXJ0IC0gMSwgcG9zaXRpb25TdGFydCkgPT0gXCIsXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNpbG9nSW5wdXROdW1iZXIubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9IHBvc2l0aW9uU3RhcnQgLSAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaWxvZ0lucHV0TnVtYmVyLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kID0gcG9zaXRpb25TdGFydCAtIDE7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaWxvZ0lucHV0TnVtYmVyLm5hdGl2ZUVsZW1lbnQudmFsdWUuYXQoLTEpID09ICcsJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2lsb2dJbnB1dE51bWJlci5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5jaWxvZ0lucHV0TnVtYmVyLm5hdGl2ZUVsZW1lbnQudmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMuY2lsb2dJbnB1dE51bWJlci5uYXRpdmVFbGVtZW50LnZhbHVlLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2lsb2dJbnB1dE51bWJlci5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0ICE9IHRoaXMuY2lsb2dJbnB1dE51bWJlci5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHQgPSBbZGVidXQsIGZpbl0uam9pbignJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvblN0YXJ0ICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVidXQgPSBjdXJyZW50LnNsaWNlKDAsIHBvc2l0aW9uU3RhcnQgLSAxKS5yZXBsYWNlKC9cXHMvZywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gW2RlYnV0LCBmaW5dLmpvaW4oJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZhbHVlKG5leHQsIGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICcsJyAmJiBjdXJyZW50LnNsaWNlKHBvc2l0aW9uU3RhcnQpWzBdID09ICcsJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaWxvZ0lucHV0TnVtYmVyLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgKz0gMTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvblN0YXJ0ICE9IHBvc2l0aW9uRW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaWxvZ0lucHV0TnVtYmVyLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSBwb3NpdGlvblN0YXJ0ICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNpbG9nSW5wdXROdW1iZXIubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPSBwb3NpdGlvblN0YXJ0ICsgMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG5leHQgPSBbZGVidXQsIGV2ZW50LmtleSwgZmluXS5qb2luKCcnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWx1ZShuZXh0LCBldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tWYWx1ZShuZXh0OiBzdHJpbmcsIGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKG5leHQgPT0gJy0nICYmICh0aGlzLm1pbiA9PSBudWxsIHx8IHRoaXMubWluIDwgMCkpIHtcclxuICAgICAgICAgICAgdGhpcy5hY2NlcHRWYWx1ZShuZXh0LCBldmVudCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXh0Lmxlbmd0aCA+IDEgJiYgbmV4dFswXSA9PSAnLCcpIHtcclxuICAgICAgICAgICAgdGhpcy5hY2NlcHRWYWx1ZShuZXh0LnN1YnN0cmluZygxKSwgZXZlbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChTdHJpbmcobmV4dCksICFTdHJpbmcobmV4dCkubWF0Y2godGhpcy5yZWdleCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NlcHRWYWx1ZShuZXh0LCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbnVtYmVyOiBudW1iZXIgPSArKG5leHQucmVwbGFjZSgnLCcsICcuJykpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWluID09IG51bGwgfHwgbnVtYmVyID49IHRoaXMubWluKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF4ID09IG51bGwgfHwgbnVtYmVyIDw9IHRoaXMubWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjZXB0VmFsdWUobmV4dCwgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhY2NlcHRWYWx1ZSh2YWx1ZTogc3RyaW5nLCBldmVudCkge1xyXG4gICAgICAgIC8vIFN0b2NrYWdlIHBvc2l0aW9uIGluaXRpYWxlXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25TdGFydCA9IHRoaXMuY2lsb2dJbnB1dE51bWJlci5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uRW5kID0gdGhpcy5jaWxvZ0lucHV0TnVtYmVyLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgIGxldCB2YWxFbnRpZXI6IHN0cmluZyA9IHRoaXMuY2lsb2dJbnB1dE51bWJlci5uYXRpdmVFbGVtZW50LnZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJykuc3BsaXQoJywnKVswXTtcclxuICAgICAgICBpZiAodmFsRW50aWVyWzBdID09ICctJykge1xyXG4gICAgICAgICAgICB2YWxFbnRpZXIgPSB2YWxFbnRpZXIuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwb3NpdGlvbkZpbmFsZTogbnVtYmVyID0gcG9zaXRpb25TdGFydDtcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uU3RhcnQgPT0gcG9zaXRpb25FbmQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBqdW1wOiBudW1iZXIgPSAxO1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbEVudGllck5leHQ6IHN0cmluZyA9IHZhbHVlLnNwbGl0KCcsJylbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsRW50aWVyTmV4dFswXSA9PSAnLScpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxFbnRpZXJOZXh0ID0gdmFsRW50aWVyTmV4dC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuc3BsaXQoJywnKVswXSAhPSB2YWxFbnRpZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChldmVudC5rZXkgIT0gJ0JhY2tzcGFjZScgJiYgdmFsRW50aWVyLmxlbmd0aCAhPSAwICYmIHZhbEVudGllci5sZW5ndGggJSAzID09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChldmVudC5rZXkgPT0gJ0JhY2tzcGFjZScgJiYgKHZhbEVudGllci5sZW5ndGggLSAxKSAhPSAwICYmICh2YWxFbnRpZXIubGVuZ3RoIC0gMSkgJSAzID09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAganVtcCA9IDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2FsY3VsIHBvc2l0aW9uIGZpbmFsZVxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSAnQmFja3NwYWNlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvblN0YXJ0ICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25GaW5hbGUgPSBwb3NpdGlvblN0YXJ0IC0ganVtcDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uRmluYWxlID0gcG9zaXRpb25TdGFydCArIGp1bXA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jaWxvZ0lucHV0TnVtYmVyLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSBwb3NpdGlvbkZpbmFsZTtcclxuICAgICAgICAgICAgdGhpcy5jaWxvZ0lucHV0TnVtYmVyLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kID0gcG9zaXRpb25GaW5hbGU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIE1pc2Ugw6Agam91ciBkZSBsYSB2YWxldXIgZHUgY2hhbXBcclxuICAgICAgICBpZiAodmFsdWUgPT0gJycgfHwgdmFsdWUgPT0gJy0nKSB7XHJcbiAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZShudWxsLCB2YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKFxyXG4gICAgICAgICAgICAgICAgKyh2YWx1ZS5yZXBsYWNlKCcsJywgJy4nKSksXHJcbiAgICAgICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgICAgICgoZXZlbnQua2V5ID09ICcuJyB8fCBldmVudC5rZXkgPT0gJywnKSAmJiB2YWx1ZS5zbGljZSgtMSkgPT0gJywnKSxcclxuICAgICAgICAgICAgICAgIChldmVudC5rZXkgPT0gJzAnICYmIHZhbHVlLnNwbGl0KCcsJylbMF0gPT0gdmFsRW50aWVyICYmIHZhbHVlLnNwbGl0KCcsJykubGVuZ3RoID09IDIpLFxyXG4gICAgICAgICAgICAgICAgKGV2ZW50LmtleSA9PSAnMCcgJiYgK3ZhbHVlLnNwbGl0KCcsJylbMV0gPT0gMClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub25DaGFuZ2VJbnB1dCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB0aGlzLm9uSW5wdXQuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIsIHZhbHVlU3RyaW5nOiBzdHJpbmcgPSBudWxsLCBzZXA6IGJvb2xlYW4gPSBmYWxzZSwgemVybzogYm9vbGVhbiA9IGZhbHNlLCB6ZXJvQWZ0ZXI6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWVTdHJpbmcgPT0gJy0nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlU3RyID0gJy0nO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZVN0ciA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNpbG9nSW5wdXROdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2lsb2dJbnB1dE51bWJlci5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy52YWx1ZVN0cjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1heERlY2ltYWxzICE9IG51bGwgJiYgdGhpcy52YWx1ZS50b1N0cmluZygpLnNwbGl0KCcuJykubGVuZ3RoID4gMSAmJiB0aGlzLnZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXS5sZW5ndGggPiB0aGlzLm1heERlY2ltYWxzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlU3RyID0gdGhpcy52YWx1ZS50b0xvY2FsZVN0cmluZygnZnItRlInLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogdGhpcy5tYXhEZWNpbWFscyB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVTdHIgPSB0aGlzLnZhbHVlLnRvTG9jYWxlU3RyaW5nKCdmci1GUicsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiA2IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZXAgfHwgemVyb0FmdGVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlU3RyID0gdGhpcy52YWx1ZVN0ciArICcsJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoemVybykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZVN0ciA9IHRoaXMudmFsdWVTdHIgKyAnMCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jaWxvZ0lucHV0TnVtYmVyLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLnZhbHVlU3RyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkJsdXJFdmVudChldmVudCkge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2VJbnB1dCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5vbkJsdXIuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZvY3VzRXZlbnQoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLm9uRm9jdXMuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZUlucHV0KHZhbDogbnVtYmVyKSB7IH1cclxuXHJcbiAgICBvblRvdWNoZWRJbnB1dCgpIHsgfVxyXG5cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlSW5wdXQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25Ub3VjaGVkSW5wdXQgPSBmbjtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy1mdWxsXCI+XHJcblxyXG4gICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvbiBwcmVmaXhlXCJcclxuICAgICAgICAgICpuZ0lmPVwicHJlZml4ZSAhPSBudWxsXCI+XHJcbiAgICAgICAge3sgcHJlZml4ZSB9fVxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwieyAncC1mbG9hdC1sYWJlbCcgOiBmbG9hdExhYmVsICE9IG51bGwgfVwiPlxyXG4gICAgICAgIDxpbnB1dCAjY2lsb2dJbnB1dE51bWJlclxyXG4gICAgICAgICAgICAgICBwSW5wdXRUZXh0XHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlU3RyXCJcclxuICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXNFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIFtjbGFzc109XCIndy1mdWxsIHotMScgKyAoaW5wdXRTdHlsZUNsYXNzID09IG51bGwgPyAnJyA6ICcgJyArIGlucHV0U3R5bGVDbGFzcylcIlxyXG4gICAgICAgICAgICAgICBbbmdDbGFzc109XCJzdWZmaXhlICE9IG51bGwgJiYgcHJlZml4ZSAhPSBudWxsID8gJ2JvcmRlci1ub3JvdW5kJyA6IHByZWZpeGUgIT0gbnVsbCA/ICdib3JkZXItbm9yb3VuZC1sZWZ0JyA6IHN1ZmZpeGUgIT0gbnVsbCA/ICdib3JkZXItbm9yb3VuZC1yaWdodCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnY29sb3InIDogdGV4dENvbG9yID8gdGV4dENvbG9yIDogbnVsbCB9XCIgLz5cclxuXHJcbiAgICAgICAgPGxhYmVsICpuZ0lmPVwiZmxvYXRMYWJlbCAhPSBudWxsXCI+e3sgZmxvYXRMYWJlbCB9fTwvbGFiZWw+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uIHN1ZmZpeGVcIlxyXG4gICAgICAgICAgKm5nSWY9XCJzdWZmaXhlICE9IG51bGxcIj5cclxuICAgICAgICB7eyBzdWZmaXhlIH19XHJcbiAgICA8L3NwYW4+XHJcblxyXG48L2Rpdj5cclxuIl19
@@ -0,0 +1,156 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common/http";
4
+ import * as i2 from "@angular/router";
5
+ import * as i3 from "@angular/common";
6
+ import * as i4 from "primeng/button";
7
+ import * as i5 from "primeng/inputtext";
8
+ import * as i6 from "primeng/tabview";
9
+ import * as i7 from "@angular/forms";
10
+ import * as i8 from "ngx-markdown";
11
+ import * as i9 from "primeng/progressspinner";
12
+ export class DocumentationContextuelleComponent {
13
+ constructor(http, router) {
14
+ this.http = http;
15
+ this.router = router;
16
+ this.categories = [];
17
+ this.filteredCategories = [];
18
+ this.tabs = [];
19
+ this.searchQuery = '';
20
+ this.activeTabIndex = 0;
21
+ }
22
+ ngOnInit() {
23
+ this.http.get('assets/docs/doc-config/config.json').subscribe((config) => {
24
+ this.config = config;
25
+ this.organizeDocsByCategory(config);
26
+ // Tentative d'ouverture automatique en fonction de l'URL
27
+ const currentPath = this.router.url;
28
+ const foundDoc = this.findDocForUrl(currentPath);
29
+ if (foundDoc) {
30
+ this.openDocumentationAndSwitch(foundDoc);
31
+ }
32
+ else {
33
+ this.openDocumentationList(); // fallback sur le sommaire
34
+ }
35
+ });
36
+ }
37
+ openCurrentPageDoc() {
38
+ const currentPath = this.router.url;
39
+ const foundDoc = this.findDocForUrl(currentPath);
40
+ if (foundDoc) {
41
+ this.openDocumentationAndSwitch(foundDoc);
42
+ }
43
+ else {
44
+ this.openDocumentationList();
45
+ }
46
+ }
47
+ organizeDocsByCategory(config) {
48
+ const categories = config.categories.map((cat) => ({
49
+ ...cat,
50
+ docs: []
51
+ }));
52
+ const iconMappings = config.iconMappings || {};
53
+ const docsConfig = config.documentations;
54
+ for (const fileName in docsConfig) {
55
+ const doc = docsConfig[fileName];
56
+ const categoryKey = doc.category;
57
+ const matchedCategory = categories.find((cat) => cat.key === categoryKey);
58
+ if (matchedCategory) {
59
+ const icon = doc.tags?.map(t => iconMappings[t])?.find(i => !!i) || iconMappings.default;
60
+ matchedCategory.docs.push({
61
+ ...doc,
62
+ fileName,
63
+ icon
64
+ });
65
+ }
66
+ }
67
+ this.categories = categories.sort((a, b) => a.name - b.name);
68
+ this.categories.forEach(cat => {
69
+ cat.docs = cat.docs.sort((a, b) => a.displayName.localeCompare(b.displayName));
70
+ });
71
+ this.filteredCategories = JSON.parse(JSON.stringify(this.categories));
72
+ }
73
+ filterDocumentation() {
74
+ const query = this.searchQuery.toLowerCase();
75
+ this.filteredCategories = this.categories.map(category => {
76
+ const filteredDocs = category.docs.filter(doc => doc.displayName.toLowerCase().includes(query) ||
77
+ doc.description.toLowerCase().includes(query) ||
78
+ doc.tags?.some(tag => tag.toLowerCase().includes(query)));
79
+ return {
80
+ ...category,
81
+ docs: filteredDocs
82
+ };
83
+ }).filter(cat => cat.docs.length > 0);
84
+ }
85
+ toggleCategory(key) {
86
+ const cat = this.filteredCategories.find(c => c.key === key);
87
+ if (cat)
88
+ cat.expanded = !cat.expanded;
89
+ }
90
+ openTabAndActivate(tab) {
91
+ this.tabs.push(tab);
92
+ setTimeout(() => {
93
+ this.activeTabIndex = this.tabs.length - 1;
94
+ });
95
+ }
96
+ openDocumentationAndSwitch(doc) {
97
+ const existingTab = this.tabs.find(tab => tab.fileName === doc.fileName);
98
+ if (existingTab) {
99
+ this.activeTabIndex = this.tabs.indexOf(existingTab);
100
+ return;
101
+ }
102
+ const newTab = {
103
+ type: 'doc',
104
+ title: doc.displayName,
105
+ fileName: doc.fileName,
106
+ content: '',
107
+ loading: true,
108
+ category: this.categories.find(c => c.key === doc.category)?.name
109
+ };
110
+ this.openTabAndActivate(newTab);
111
+ fetch(`assets/docs/${doc.fileName}`)
112
+ .then(res => res.text())
113
+ .then(content => {
114
+ newTab.content = content;
115
+ newTab.loading = false;
116
+ })
117
+ .catch(() => {
118
+ newTab.content = '❌ Erreur lors du chargement du fichier markdown.';
119
+ newTab.loading = false;
120
+ });
121
+ }
122
+ openDocumentationList() {
123
+ const existing = this.tabs.find(t => t.type === 'list');
124
+ if (existing) {
125
+ this.activeTabIndex = this.tabs.indexOf(existing);
126
+ return;
127
+ }
128
+ this.openTabAndActivate({ type: 'list', title: '📚 Sommaire des Docs' });
129
+ }
130
+ getTotalDocsCount() {
131
+ return this.categories.reduce((sum, cat) => sum + cat.docs.length, 0);
132
+ }
133
+ getOpenTabsCount() {
134
+ return this.tabs.length;
135
+ }
136
+ closeTab(event) {
137
+ this.tabs.splice(event.index, 1);
138
+ if (this.activeTabIndex >= this.tabs.length) {
139
+ this.activeTabIndex = this.tabs.length - 1;
140
+ }
141
+ }
142
+ /** Essaie de retrouver un document à partir de l'URL Angular */
143
+ findDocForUrl(url) {
144
+ const normalizedUrl = url.replace(/^\/+/, '').replace(/\/$/, '');
145
+ return this.categories
146
+ .reduce((acc, cat) => acc.concat(cat.docs), [])
147
+ .find(doc => normalizedUrl.toLowerCase().includes(doc.fileName.toLowerCase().replace('.md', '')));
148
+ }
149
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DocumentationContextuelleComponent, deps: [{ token: i1.HttpClient }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component }); }
150
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DocumentationContextuelleComponent, selector: "cilog-documentation-contextuelle", ngImport: i0, template: "<div class=\"documentation-container\">\r\n <!-- Menu sup\u00E9rieur -->\r\n <div class=\"documentation-menu\">\r\n <button \r\n pButton \r\n type=\"button\" \r\n icon=\"pi pi-list\" \r\n label=\"Sommaire des documentations\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openDocumentationList()\"\r\n title=\"Voir toutes les documentations disponibles\">\r\n </button>\r\n <button \r\n pButton \r\n type=\"button\" \r\n icon=\"pi pi-home\" \r\n label=\"Documentation courante\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openCurrentPageDoc()\"\r\n title=\"Documentation de la page actuelle\">\r\n </button>\r\n </div>\r\n\r\n <!-- Syst\u00E8me d'onglets -->\r\n <p-tabView \r\n [(activeIndex)]=\"activeTabIndex\"\r\n (onClose)=\"closeTab($event)\"\r\n styleClass=\"documentation-tabs\">\r\n \r\n <p-tabPanel \r\n *ngFor=\"let tab of tabs; let i = index\" \r\n [header]=\"tab.title\"\r\n [closable]=\"tabs.length > 1\">\r\n \r\n <!-- Contenu pour onglet de liste - Version am\u00E9lior\u00E9e -->\r\n <div *ngIf=\"tab.type === 'list'\" class=\"docs-list-container\">\r\n <div class=\"docs-header\">\r\n <h2>\uD83D\uDCDA Sommaire de la Documentation</h2>\r\n <p class=\"docs-subtitle\">Explorez toutes les fonctionnalit\u00E9s disponibles dans LogeProj</p>\r\n </div>\r\n\r\n <!-- Barre de recherche -->\r\n <div class=\"search-bar\">\r\n <span class=\"p-input-icon-left\" style=\"width: 100%; max-width: 800px;\">\r\n <i class=\"pi pi-search\"></i>\r\n <input \r\n type=\"text\" \r\n pInputText \r\n placeholder=\"Rechercher dans les documentations...\" \r\n [(ngModel)]=\"searchQuery\"\r\n (input)=\"filterDocumentation()\"\r\n style=\"width: 100% !important; padding: 12px 20px 12px 40px !important; border-radius: 25px !important;\">\r\n </span>\r\n </div>\r\n\r\n <!-- Liste des cat\u00E9gories -->\r\n <div class=\"categories-container\">\r\n <div *ngFor=\"let category of filteredCategories\" class=\"category-section\">\r\n <div class=\"category-header\" (click)=\"toggleCategory(category.key)\">\r\n <i class=\"pi\" [ngClass]=\"category.expanded ? 'pi-chevron-down' : 'pi-chevron-right'\"></i>\r\n <span class=\"category-icon\">{{ category.icon }}</span>\r\n <h3 class=\"category-title\">{{ category.name }}</h3>\r\n <span class=\"category-count\">({{ category.docs.length }})</span>\r\n </div>\r\n \r\n <div class=\"category-content\" [ngClass]=\"{ 'expanded': category.expanded }\">\r\n <div class=\"docs-grid\">\r\n <div \r\n *ngFor=\"let doc of category.docs\" \r\n class=\"doc-card\"\r\n (click)=\"openDocumentationAndSwitch(doc)\"\r\n [title]=\"doc.description\"> \r\n <div class=\"doc-card-content\">\r\n <h4 class=\"doc-name\">{{ doc.displayName }}</h4>\r\n <p class=\"doc-description\">{{ doc.description }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Stats en bas -->\r\n <div class=\"docs-stats\">\r\n <div class=\"stat-item\">\r\n <strong>{{ getTotalDocsCount() }}</strong> documentations disponibles\r\n </div>\r\n <div class=\"stat-item\">\r\n <strong>{{ getOpenTabsCount() }}</strong> onglets ouverts\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Contenu pour onglet de documentation -->\r\n <div *ngIf=\"tab.type === 'doc'\" class=\"markdown-container\">\r\n <!-- Breadcrumb pour navigation -->\r\n <div class=\"doc-breadcrumb\" *ngIf=\"tab.category\">\r\n <span class=\"breadcrumb-item\">{{ tab.category }}</span>\r\n <i class=\"pi pi-angle-right\"></i>\r\n <span class=\"breadcrumb-current\">{{ tab.title }}</span>\r\n </div>\r\n\r\n <div *ngIf=\"tab.loading\" class=\"loading-container\">\r\n <p-progressSpinner strokeWidth=\"4\"></p-progressSpinner>\r\n <span>Chargement de la documentation...</span>\r\n </div>\r\n <markdown \r\n *ngIf=\"!tab.loading\" \r\n [data]=\"tab.content || 'Aucun contenu disponible'\">\r\n </markdown>\r\n </div>\r\n </p-tabPanel>\r\n </p-tabView>\r\n</div>", styles: [".documentation-container{display:flex;flex-direction:column;height:100%;width:100%}.documentation-menu{padding:15px;background:linear-gradient(135deg,#667eea,#764ba2);border-bottom:1px solid #e9ecef;display:flex;gap:10px;flex-shrink:0}.documentation-menu .p-button{background:#fff3;border:1px solid rgba(255,255,255,.3);color:#fff}.documentation-menu .p-button:hover{background:#ffffff4d}.docs-list-container{padding:20px;flex:1;overflow-y:auto;background:#f8f9fa}.docs-header{text-align:center;margin-bottom:30px}.docs-header h2{margin:0 0 10px;color:#2c3e50;font-size:2rem}.docs-header .docs-subtitle{color:#7f8c8d;font-size:1.1rem;margin:0}.search-bar{margin-bottom:30px;display:flex;justify-content:center}.search-bar .search-input{width:100%;padding:12px 20px 12px 40px;border-radius:25px;border:2px solid #e9ecef;font-size:1rem}.search-bar .search-input:focus{border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.categories-container{max-width:1200px;margin:0 auto}.category-section{margin-bottom:25px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a;overflow:hidden}.category-section .category-header{padding:20px;background:linear-gradient(135deg,#f5f7fa,#c3cfe2);cursor:pointer;display:flex;align-items:center;gap:15px;transition:all .3s ease}.category-section .category-header:hover{background:linear-gradient(135deg,#e8eaf6,#b39ddb)}.category-section .category-header .pi{color:#667eea;font-size:1rem;transition:transform .3s ease}.category-section .category-header .category-icon{font-size:1.5rem}.category-section .category-header .category-title{margin:0;color:#2c3e50;font-size:1.3rem;flex:1}.category-section .category-header .category-count{color:#7f8c8d;font-size:.9rem;background:#677eea1a;padding:4px 12px;border-radius:15px}.category-section .category-content{max-height:0;overflow:hidden;transition:max-height .4s ease-out}.category-section .category-content.expanded{max-height:2000px;transition:max-height .6s ease-in}.docs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:20px;padding:25px}.doc-card{border:1px solid #e9ecef;border-radius:12px;padding:20px;cursor:pointer;transition:all .3s ease;background:#fff;position:relative;overflow:hidden}.doc-card:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:4px;background:linear-gradient(90deg,#667eea,#764ba2);transform:scaleX(0);transition:transform .3s ease}.doc-card:hover{border-color:#667eea;box-shadow:0 8px 25px #667eea26;transform:translateY(-4px)}.doc-card:hover:before{transform:scaleX(1)}.doc-card .doc-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.doc-card .doc-card-header .doc-icon{font-size:2rem}.doc-card .doc-card-header .doc-badge{padding:4px 8px;border-radius:12px;font-size:.75rem;font-weight:600;text-transform:uppercase}.doc-card .doc-card-header .doc-badge.doc-badge-high{background:#e8f5e8;color:#2e7d2e}.doc-card .doc-card-header .doc-badge.doc-badge-medium{background:#fff3cd;color:#856404}.doc-card .doc-card-header .doc-badge.doc-badge-low{background:#f8f9fa;color:#6c757d}.doc-card .doc-card-content .doc-name{margin:0 0 10px;color:#2c3e50;font-size:1.1rem;font-weight:600;line-height:1.3}.doc-card .doc-card-content .doc-description{color:#6c757d;font-size:.9rem;line-height:1.4;margin:0 0 10px}.doc-card .doc-card-content .doc-filename{color:#adb5bd;font-size:.8rem;font-family:Courier New,monospace}.docs-stats{display:flex;justify-content:center;gap:40px;margin-top:40px;padding:20px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a}.docs-stats .stat-item{text-align:center;color:#6c757d}.docs-stats .stat-item strong{color:#667eea;font-size:1.2rem}.markdown-container{flex:1;overflow-y:auto;padding:20px;background:#fff}.markdown-container .doc-breadcrumb{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding:10px 0;border-bottom:1px solid #e9ecef;color:#6c757d;font-size:.9rem}.markdown-container .doc-breadcrumb .breadcrumb-current{color:#2c3e50;font-weight:600}.markdown-container markdown{display:block;line-height:1.6}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px;color:#6c757d;gap:20px}.loading-container span{font-size:1.1rem}.documentation-tabs{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-panels{flex:1;display:flex}.documentation-tabs ::ng-deep .p-tabview-panels .p-tabview-panel{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-nav{background:#f8f9fa;border-bottom:2px solid #e9ecef}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link{background:transparent;border:none;color:#6c757d;font-weight:500}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link:not(.p-disabled):focus{box-shadow:0 0 0 2px #667eea33}.documentation-tabs ::ng-deep .p-tabview-nav .p-highlight .p-tabview-nav-link{background:#fff;color:#667eea;border-bottom:2px solid #667eea}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i6.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i6.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: i9.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }] }); }
151
+ }
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DocumentationContextuelleComponent, decorators: [{
153
+ type: Component,
154
+ args: [{ selector: 'cilog-documentation-contextuelle', template: "<div class=\"documentation-container\">\r\n <!-- Menu sup\u00E9rieur -->\r\n <div class=\"documentation-menu\">\r\n <button \r\n pButton \r\n type=\"button\" \r\n icon=\"pi pi-list\" \r\n label=\"Sommaire des documentations\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openDocumentationList()\"\r\n title=\"Voir toutes les documentations disponibles\">\r\n </button>\r\n <button \r\n pButton \r\n type=\"button\" \r\n icon=\"pi pi-home\" \r\n label=\"Documentation courante\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openCurrentPageDoc()\"\r\n title=\"Documentation de la page actuelle\">\r\n </button>\r\n </div>\r\n\r\n <!-- Syst\u00E8me d'onglets -->\r\n <p-tabView \r\n [(activeIndex)]=\"activeTabIndex\"\r\n (onClose)=\"closeTab($event)\"\r\n styleClass=\"documentation-tabs\">\r\n \r\n <p-tabPanel \r\n *ngFor=\"let tab of tabs; let i = index\" \r\n [header]=\"tab.title\"\r\n [closable]=\"tabs.length > 1\">\r\n \r\n <!-- Contenu pour onglet de liste - Version am\u00E9lior\u00E9e -->\r\n <div *ngIf=\"tab.type === 'list'\" class=\"docs-list-container\">\r\n <div class=\"docs-header\">\r\n <h2>\uD83D\uDCDA Sommaire de la Documentation</h2>\r\n <p class=\"docs-subtitle\">Explorez toutes les fonctionnalit\u00E9s disponibles dans LogeProj</p>\r\n </div>\r\n\r\n <!-- Barre de recherche -->\r\n <div class=\"search-bar\">\r\n <span class=\"p-input-icon-left\" style=\"width: 100%; max-width: 800px;\">\r\n <i class=\"pi pi-search\"></i>\r\n <input \r\n type=\"text\" \r\n pInputText \r\n placeholder=\"Rechercher dans les documentations...\" \r\n [(ngModel)]=\"searchQuery\"\r\n (input)=\"filterDocumentation()\"\r\n style=\"width: 100% !important; padding: 12px 20px 12px 40px !important; border-radius: 25px !important;\">\r\n </span>\r\n </div>\r\n\r\n <!-- Liste des cat\u00E9gories -->\r\n <div class=\"categories-container\">\r\n <div *ngFor=\"let category of filteredCategories\" class=\"category-section\">\r\n <div class=\"category-header\" (click)=\"toggleCategory(category.key)\">\r\n <i class=\"pi\" [ngClass]=\"category.expanded ? 'pi-chevron-down' : 'pi-chevron-right'\"></i>\r\n <span class=\"category-icon\">{{ category.icon }}</span>\r\n <h3 class=\"category-title\">{{ category.name }}</h3>\r\n <span class=\"category-count\">({{ category.docs.length }})</span>\r\n </div>\r\n \r\n <div class=\"category-content\" [ngClass]=\"{ 'expanded': category.expanded }\">\r\n <div class=\"docs-grid\">\r\n <div \r\n *ngFor=\"let doc of category.docs\" \r\n class=\"doc-card\"\r\n (click)=\"openDocumentationAndSwitch(doc)\"\r\n [title]=\"doc.description\"> \r\n <div class=\"doc-card-content\">\r\n <h4 class=\"doc-name\">{{ doc.displayName }}</h4>\r\n <p class=\"doc-description\">{{ doc.description }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Stats en bas -->\r\n <div class=\"docs-stats\">\r\n <div class=\"stat-item\">\r\n <strong>{{ getTotalDocsCount() }}</strong> documentations disponibles\r\n </div>\r\n <div class=\"stat-item\">\r\n <strong>{{ getOpenTabsCount() }}</strong> onglets ouverts\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Contenu pour onglet de documentation -->\r\n <div *ngIf=\"tab.type === 'doc'\" class=\"markdown-container\">\r\n <!-- Breadcrumb pour navigation -->\r\n <div class=\"doc-breadcrumb\" *ngIf=\"tab.category\">\r\n <span class=\"breadcrumb-item\">{{ tab.category }}</span>\r\n <i class=\"pi pi-angle-right\"></i>\r\n <span class=\"breadcrumb-current\">{{ tab.title }}</span>\r\n </div>\r\n\r\n <div *ngIf=\"tab.loading\" class=\"loading-container\">\r\n <p-progressSpinner strokeWidth=\"4\"></p-progressSpinner>\r\n <span>Chargement de la documentation...</span>\r\n </div>\r\n <markdown \r\n *ngIf=\"!tab.loading\" \r\n [data]=\"tab.content || 'Aucun contenu disponible'\">\r\n </markdown>\r\n </div>\r\n </p-tabPanel>\r\n </p-tabView>\r\n</div>", styles: [".documentation-container{display:flex;flex-direction:column;height:100%;width:100%}.documentation-menu{padding:15px;background:linear-gradient(135deg,#667eea,#764ba2);border-bottom:1px solid #e9ecef;display:flex;gap:10px;flex-shrink:0}.documentation-menu .p-button{background:#fff3;border:1px solid rgba(255,255,255,.3);color:#fff}.documentation-menu .p-button:hover{background:#ffffff4d}.docs-list-container{padding:20px;flex:1;overflow-y:auto;background:#f8f9fa}.docs-header{text-align:center;margin-bottom:30px}.docs-header h2{margin:0 0 10px;color:#2c3e50;font-size:2rem}.docs-header .docs-subtitle{color:#7f8c8d;font-size:1.1rem;margin:0}.search-bar{margin-bottom:30px;display:flex;justify-content:center}.search-bar .search-input{width:100%;padding:12px 20px 12px 40px;border-radius:25px;border:2px solid #e9ecef;font-size:1rem}.search-bar .search-input:focus{border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.categories-container{max-width:1200px;margin:0 auto}.category-section{margin-bottom:25px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a;overflow:hidden}.category-section .category-header{padding:20px;background:linear-gradient(135deg,#f5f7fa,#c3cfe2);cursor:pointer;display:flex;align-items:center;gap:15px;transition:all .3s ease}.category-section .category-header:hover{background:linear-gradient(135deg,#e8eaf6,#b39ddb)}.category-section .category-header .pi{color:#667eea;font-size:1rem;transition:transform .3s ease}.category-section .category-header .category-icon{font-size:1.5rem}.category-section .category-header .category-title{margin:0;color:#2c3e50;font-size:1.3rem;flex:1}.category-section .category-header .category-count{color:#7f8c8d;font-size:.9rem;background:#677eea1a;padding:4px 12px;border-radius:15px}.category-section .category-content{max-height:0;overflow:hidden;transition:max-height .4s ease-out}.category-section .category-content.expanded{max-height:2000px;transition:max-height .6s ease-in}.docs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:20px;padding:25px}.doc-card{border:1px solid #e9ecef;border-radius:12px;padding:20px;cursor:pointer;transition:all .3s ease;background:#fff;position:relative;overflow:hidden}.doc-card:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:4px;background:linear-gradient(90deg,#667eea,#764ba2);transform:scaleX(0);transition:transform .3s ease}.doc-card:hover{border-color:#667eea;box-shadow:0 8px 25px #667eea26;transform:translateY(-4px)}.doc-card:hover:before{transform:scaleX(1)}.doc-card .doc-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.doc-card .doc-card-header .doc-icon{font-size:2rem}.doc-card .doc-card-header .doc-badge{padding:4px 8px;border-radius:12px;font-size:.75rem;font-weight:600;text-transform:uppercase}.doc-card .doc-card-header .doc-badge.doc-badge-high{background:#e8f5e8;color:#2e7d2e}.doc-card .doc-card-header .doc-badge.doc-badge-medium{background:#fff3cd;color:#856404}.doc-card .doc-card-header .doc-badge.doc-badge-low{background:#f8f9fa;color:#6c757d}.doc-card .doc-card-content .doc-name{margin:0 0 10px;color:#2c3e50;font-size:1.1rem;font-weight:600;line-height:1.3}.doc-card .doc-card-content .doc-description{color:#6c757d;font-size:.9rem;line-height:1.4;margin:0 0 10px}.doc-card .doc-card-content .doc-filename{color:#adb5bd;font-size:.8rem;font-family:Courier New,monospace}.docs-stats{display:flex;justify-content:center;gap:40px;margin-top:40px;padding:20px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a}.docs-stats .stat-item{text-align:center;color:#6c757d}.docs-stats .stat-item strong{color:#667eea;font-size:1.2rem}.markdown-container{flex:1;overflow-y:auto;padding:20px;background:#fff}.markdown-container .doc-breadcrumb{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding:10px 0;border-bottom:1px solid #e9ecef;color:#6c757d;font-size:.9rem}.markdown-container .doc-breadcrumb .breadcrumb-current{color:#2c3e50;font-weight:600}.markdown-container markdown{display:block;line-height:1.6}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px;color:#6c757d;gap:20px}.loading-container span{font-size:1.1rem}.documentation-tabs{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-panels{flex:1;display:flex}.documentation-tabs ::ng-deep .p-tabview-panels .p-tabview-panel{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-nav{background:#f8f9fa;border-bottom:2px solid #e9ecef}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link{background:transparent;border:none;color:#6c757d;font-weight:500}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link:not(.p-disabled):focus{box-shadow:0 0 0 2px #667eea33}.documentation-tabs ::ng-deep .p-tabview-nav .p-highlight .p-tabview-nav-link{background:#fff;color:#667eea;border-bottom:2px solid #667eea}\n"] }]
155
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.Router }] });
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRhdGlvbi1jb250ZXh0dWVsbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvZG9jdW1lbnRhdGlvbi9kb2N1bWVudGF0aW9uLWNvbnRleHR1ZWxsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaWxvZy1saWIvc3JjL2xpYi92aWV3cy9kb2N1bWVudGF0aW9uL2RvY3VtZW50YXRpb24tY29udGV4dHVlbGxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7O0FBOEJsRCxNQUFNLE9BQU8sa0NBQWtDO0lBUTdDLFlBQ1UsSUFBZ0IsRUFDaEIsTUFBYztRQURkLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQVJ4QixlQUFVLEdBQWUsRUFBRSxDQUFDO1FBQzVCLHVCQUFrQixHQUFlLEVBQUUsQ0FBQztRQUNwQyxTQUFJLEdBQVUsRUFBRSxDQUFDO1FBQ2pCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO0lBS2hCLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUM1RSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFcEMseURBQXlEO1lBQ3pELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENB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QyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRSxPQUFPLElBQUksQ0FBQyxVQUFVO2FBQ25CLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQWUsQ0FBQzthQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDVixhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUNwRixDQUFDO0lBQ04sQ0FBQzsrR0FqS1Usa0NBQWtDO21HQUFsQyxrQ0FBa0Msd0VDOUIvQyw2cEpBaUhNOzs0RkRuRk8sa0NBQWtDO2tCQUw5QyxTQUFTOytCQUNFLGtDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbnRlcmZhY2UgRG9jdW1lbnRhdGlvbkVudHJ5IHtcclxuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xyXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgY2F0ZWdvcnk6IHN0cmluZztcclxuICB0YWdzOiBzdHJpbmdbXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIENhdGVnb3J5IHtcclxuICBrZXk6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaWNvbjogc3RyaW5nO1xyXG4gIGV4cGFuZGVkOiBib29sZWFuO1xyXG4gIGtleXdvcmRzOiBzdHJpbmdbXTtcclxuICBkb2NzOiBEb2NGaWxlW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBEb2NGaWxlIGV4dGVuZHMgRG9jdW1lbnRhdGlvbkVudHJ5IHtcclxuICBmaWxlTmFtZTogc3RyaW5nO1xyXG4gIGljb246IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjaWxvZy1kb2N1bWVudGF0aW9uLWNvbnRleHR1ZWxsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RvY3VtZW50YXRpb24tY29udGV4dHVlbGxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kb2N1bWVudGF0aW9uLWNvbnRleHR1ZWxsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEb2N1bWVudGF0aW9uQ29udGV4dHVlbGxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBjb25maWc6IGFueTtcclxuICBjYXRlZ29yaWVzOiBDYXRlZ29yeVtdID0gW107XHJcbiAgZmlsdGVyZWRDYXRlZ29yaWVzOiBDYXRlZ29yeVtdID0gW107XHJcbiAgdGFiczogYW55W10gPSBbXTtcclxuICBzZWFyY2hRdWVyeSA9ICcnO1xyXG4gIGFjdGl2ZVRhYkluZGV4ID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaHR0cC5nZXQoJ2Fzc2V0cy9kb2NzL2RvYy1jb25maWcvY29uZmlnLmpzb24nKS5zdWJzY3JpYmUoKGNvbmZpZzogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG4gICAgICB0aGlzLm9yZ2FuaXplRG9jc0J5Q2F0ZWdvcnkoY29uZmlnKTtcclxuXHJcbiAgICAgIC8vIFRlbnRhdGl2ZSBkJ291dmVydHVyZSBhdXRvbWF0aXF1ZSBlbiBmb25jdGlvbiBkZSBsJ1VSTFxyXG4gICAgICBjb25zdCBjdXJyZW50UGF0aCA9IHRoaXMucm91dGVyLnVybDtcclxuICAgICAgY29uc3QgZm91bmREb2MgPSB0aGlzLmZpbmREb2NGb3JVcmwoY3VycmVudFBhdGgpO1xyXG4gICAgICBpZiAoZm91bmREb2MpIHtcclxuICAgICAgICB0aGlzLm9wZW5Eb2N1bWVudGF0aW9uQW5kU3dpdGNoKGZvdW5kRG9jKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm9wZW5Eb2N1bWVudGF0aW9uTGlzdCgpOyAvLyBmYWxsYmFjayBzdXIgbGUgc29tbWFpcmVcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvcGVuQ3VycmVudFBhZ2VEb2MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHRoaXMucm91dGVyLnVybDtcclxuICAgIGNvbnN0IGZvdW5kRG9jID0gdGhpcy5maW5kRG9jRm9yVXJsKGN1cnJlbnRQYXRoKTtcclxuICAgIGlmIChmb3VuZERvYykge1xyXG4gICAgICB0aGlzLm9wZW5Eb2N1bWVudGF0aW9uQW5kU3dpdGNoKGZvdW5kRG9jKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub3BlbkRvY3VtZW50YXRpb25MaXN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcmdhbml6ZURvY3NCeUNhdGVnb3J5KGNvbmZpZzogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBjYXRlZ29yaWVzID0gY29uZmlnLmNhdGVnb3JpZXMubWFwKChjYXQ6IGFueSkgPT4gKHtcclxuICAgICAgLi4uY2F0LFxyXG4gICAgICBkb2NzOiBbXVxyXG4gICAgfSkpO1xyXG5cclxuICAgIGNvbnN0IGljb25NYXBwaW5ncyA9IGNvbmZpZy5pY29uTWFwcGluZ3MgfHwge307XHJcbiAgICBjb25zdCBkb2NzQ29uZmlnID0gY29uZmlnLmRvY3VtZW50YXRpb25zO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgaW4gZG9jc0NvbmZpZykge1xyXG4gICAgICBjb25zdCBkb2MgPSBkb2NzQ29uZmlnW2ZpbGVOYW1lXTtcclxuICAgICAgY29uc3QgY2F0ZWdvcnlLZXkgPSBkb2MuY2F0ZWdvcnk7XHJcblxyXG4gICAgICBjb25zdCBtYXRjaGVkQ2F0ZWdvcnkgPSBjYXRlZ29yaWVzLmZpbmQoKGNhdDogYW55KSA9PiBjYXQua2V5ID09PSBjYXRlZ29yeUtleSk7XHJcbiAgICAgIGlmIChtYXRjaGVkQ2F0ZWdvcnkpIHtcclxuICAgICAgICBjb25zdCBpY29uID0gZG9jLnRhZ3M/Lm1hcCh0ID0+IGljb25NYXBwaW5nc1t0XSk/LmZpbmQoaSA9PiAhIWkpIHx8IGljb25NYXBwaW5ncy5kZWZhdWx0O1xyXG4gICAgICAgIG1hdGNoZWRDYXRlZ29yeS5kb2NzLnB1c2goe1xyXG4gICAgICAgICAgLi4uZG9jLFxyXG4gICAgICAgICAgZmlsZU5hbWUsXHJcbiAgICAgICAgICBpY29uXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzLnNvcnQoKGEsIGIpID0+IGEubmFtZSAtIGIubmFtZSk7XHJcbiAgICB0aGlzLmNhdGVnb3JpZXMuZm9yRWFjaChjYXQgPT4ge1xyXG4gICAgICBjYXQuZG9jcyA9IGNhdC5kb2NzLnNvcnQoKGEsIGIpID0+IGEuZGlzcGxheU5hbWUubG9jYWxlQ29tcGFyZShiLmRpc3BsYXlOYW1lKSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsdGVyZWRDYXRlZ29yaWVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhdGVnb3JpZXMpKTtcclxuICB9XHJcblxyXG4gIGZpbHRlckRvY3VtZW50YXRpb24oKTogdm9pZCB7XHJcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VhcmNoUXVlcnkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcmVkQ2F0ZWdvcmllcyA9IHRoaXMuY2F0ZWdvcmllcy5tYXAoY2F0ZWdvcnkgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZERvY3MgPSBjYXRlZ29yeS5kb2NzLmZpbHRlcihkb2MgPT5cclxuICAgICAgICBkb2MuZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkgfHxcclxuICAgICAgICBkb2MuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkgfHxcclxuICAgICAgICBkb2MudGFncz8uc29tZSh0YWcgPT4gdGFnLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpKVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLmNhdGVnb3J5LFxyXG4gICAgICAgIGRvY3M6IGZpbHRlcmVkRG9jc1xyXG4gICAgICB9O1xyXG4gICAgfSkuZmlsdGVyKGNhdCA9PiBjYXQuZG9jcy5sZW5ndGggPiAwKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNhdGVnb3J5KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBjYXQgPSB0aGlzLmZpbHRlcmVkQ2F0ZWdvcmllcy5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XHJcbiAgICBpZiAoY2F0KSBjYXQuZXhwYW5kZWQgPSAhY2F0LmV4cGFuZGVkO1xyXG4gIH1cclxuXHJcbiAgb3BlblRhYkFuZEFjdGl2YXRlKHRhYjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnRhYnMucHVzaCh0YWIpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiSW5kZXggPSB0aGlzLnRhYnMubGVuZ3RoIC0gMTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIG9wZW5Eb2N1bWVudGF0aW9uQW5kU3dpdGNoKGRvYzogRG9jRmlsZSk6IHZvaWQge1xyXG4gICAgY29uc3QgZXhpc3RpbmdUYWIgPSB0aGlzLnRhYnMuZmluZCh0YWIgPT4gdGFiLmZpbGVOYW1lID09PSBkb2MuZmlsZU5hbWUpO1xyXG4gICAgaWYgKGV4aXN0aW5nVGFiKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiSW5kZXggPSB0aGlzLnRhYnMuaW5kZXhPZihleGlzdGluZ1RhYik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdUYWIgPSB7XHJcbiAgICAgIHR5cGU6ICdkb2MnLFxyXG4gICAgICB0aXRsZTogZG9jLmRpc3BsYXlOYW1lLFxyXG4gICAgICBmaWxlTmFtZTogZG9jLmZpbGVOYW1lLFxyXG4gICAgICBjb250ZW50OiAnJyxcclxuICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgY2F0ZWdvcnk6IHRoaXMuY2F0ZWdvcmllcy5maW5kKGMgPT4gYy5rZXkgPT09IGRvYy5jYXRlZ29yeSk/Lm5hbWVcclxuICAgIH07XHJcblxyXG4gIHRoaXMub3BlblRhYkFuZEFjdGl2YXRlKG5ld1RhYik7XHJcblxyXG4gICAgZmV0Y2goYGFzc2V0cy9kb2NzLyR7ZG9jLmZpbGVOYW1lfWApXHJcbiAgICAgIC50aGVuKHJlcyA9PiByZXMudGV4dCgpKVxyXG4gICAgICAudGhlbihjb250ZW50ID0+IHtcclxuICAgICAgICBuZXdUYWIuY29udGVudCA9IGNvbnRlbnQ7XHJcbiAgICAgICAgbmV3VGFiLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICBuZXdUYWIuY29udGVudCA9ICfinYwgRXJyZXVyIGxvcnMgZHUgY2hhcmdlbWVudCBkdSBmaWNoaWVyIG1hcmtkb3duLic7XHJcbiAgICAgICAgbmV3VGFiLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvcGVuRG9jdW1lbnRhdGlvbkxpc3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMudGFicy5maW5kKHQgPT4gdC50eXBlID09PSAnbGlzdCcpO1xyXG4gICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiSW5kZXggPSB0aGlzLnRhYnMuaW5kZXhPZihleGlzdGluZyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMub3BlblRhYkFuZEFjdGl2YXRlKHsgdHlwZTogJ2xpc3QnLCB0aXRsZTogJ/Cfk5ogU29tbWFpcmUgZGVzIERvY3MnIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VG90YWxEb2NzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmNhdGVnb3JpZXMucmVkdWNlKChzdW0sIGNhdCkgPT4gc3VtICsgY2F0LmRvY3MubGVuZ3RoLCAwKTtcclxuICB9XHJcblxyXG4gIGdldE9wZW5UYWJzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRhYnMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VUYWIoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy50YWJzLnNwbGljZShldmVudC5pbmRleCwgMSk7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVUYWJJbmRleCA+PSB0aGlzLnRhYnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiSW5kZXggPSB0aGlzLnRhYnMubGVuZ3RoIC0gMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBFc3NhaWUgZGUgcmV0cm91dmVyIHVuIGRvY3VtZW50IMOgIHBhcnRpciBkZSBsJ1VSTCBBbmd1bGFyICovXHJcbiAgZmluZERvY0ZvclVybCh1cmw6IHN0cmluZyk6IERvY0ZpbGUgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3Qgbm9ybWFsaXplZFVybCA9IHVybC5yZXBsYWNlKC9eXFwvKy8sICcnKS5yZXBsYWNlKC9cXC8kLywgJycpO1xyXG4gICAgcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1xyXG4gICAgICAucmVkdWNlKChhY2MsIGNhdCkgPT4gYWNjLmNvbmNhdChjYXQuZG9jcyksIFtdIGFzIERvY0ZpbGVbXSlcclxuICAgICAgLmZpbmQoZG9jID0+XHJcbiAgICAgICAgbm9ybWFsaXplZFVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGRvYy5maWxlTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJy5tZCcsICcnKSlcclxuICAgICAgKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRvY3VtZW50YXRpb24tY29udGFpbmVyXCI+XHJcbiAgPCEtLSBNZW51IHN1cMOpcmlldXIgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImRvY3VtZW50YXRpb24tbWVudVwiPlxyXG4gICAgPGJ1dHRvbiBcclxuICAgICAgcEJ1dHRvbiBcclxuICAgICAgdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICBpY29uPVwicGkgcGktbGlzdFwiIFxyXG4gICAgICBsYWJlbD1cIlNvbW1haXJlIGRlcyBkb2N1bWVudGF0aW9uc1wiXHJcbiAgICAgIGNsYXNzPVwicC1idXR0b24tc20gcC1idXR0b24tb3V0bGluZWRcIlxyXG4gICAgICAoY2xpY2spPVwib3BlbkRvY3VtZW50YXRpb25MaXN0KClcIlxyXG4gICAgICB0aXRsZT1cIlZvaXIgdG91dGVzIGxlcyBkb2N1bWVudGF0aW9ucyBkaXNwb25pYmxlc1wiPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIFxyXG4gICAgICBwQnV0dG9uIFxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCIgXHJcbiAgICAgIGljb249XCJwaSBwaS1ob21lXCIgXHJcbiAgICAgIGxhYmVsPVwiRG9jdW1lbnRhdGlvbiBjb3VyYW50ZVwiXHJcbiAgICAgIGNsYXNzPVwicC1idXR0b24tc20gcC1idXR0b24tb3V0bGluZWRcIlxyXG4gICAgICAoY2xpY2spPVwib3BlbkN1cnJlbnRQYWdlRG9jKClcIlxyXG4gICAgICB0aXRsZT1cIkRvY3VtZW50YXRpb24gZGUgbGEgcGFnZSBhY3R1ZWxsZVwiPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gU3lzdMOobWUgZCdvbmdsZXRzIC0tPlxyXG4gIDxwLXRhYlZpZXcgXHJcbiAgICBbKGFjdGl2ZUluZGV4KV09XCJhY3RpdmVUYWJJbmRleFwiXHJcbiAgICAob25DbG9zZSk9XCJjbG9zZVRhYigkZXZlbnQpXCJcclxuICAgIHN0eWxlQ2xhc3M9XCJkb2N1bWVudGF0aW9uLXRhYnNcIj5cclxuICAgIFxyXG4gICAgPHAtdGFiUGFuZWwgXHJcbiAgICAgICpuZ0Zvcj1cImxldCB0YWIgb2YgdGFiczsgbGV0IGkgPSBpbmRleFwiIFxyXG4gICAgICBbaGVhZGVyXT1cInRhYi50aXRsZVwiXHJcbiAgICAgIFtjbG9zYWJsZV09XCJ0YWJzLmxlbmd0aCA+IDFcIj5cclxuICAgICAgXHJcbiAgICAgIDwhLS0gQ29udGVudSBwb3VyIG9uZ2xldCBkZSBsaXN0ZSAtIFZlcnNpb24gYW3DqWxpb3LDqWUgLS0+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ0YWIudHlwZSA9PT0gJ2xpc3QnXCIgY2xhc3M9XCJkb2NzLWxpc3QtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRvY3MtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8aDI+8J+TmiBTb21tYWlyZSBkZSBsYSBEb2N1bWVudGF0aW9uPC9oMj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwiZG9jcy1zdWJ0aXRsZVwiPkV4cGxvcmV6IHRvdXRlcyBsZXMgZm9uY3Rpb25uYWxpdMOpcyBkaXNwb25pYmxlcyBkYW5zIExvZ2VQcm9qPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEJhcnJlIGRlIHJlY2hlcmNoZSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWJhclwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWlucHV0LWljb24tbGVmdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IG1heC13aWR0aDogODAwcHg7XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktc2VhcmNoXCI+PC9pPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgICBwSW5wdXRUZXh0IFxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmVjaGVyY2hlciBkYW5zIGxlcyBkb2N1bWVudGF0aW9ucy4uLlwiIFxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoUXVlcnlcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXJEb2N1bWVudGF0aW9uKClcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCUgIWltcG9ydGFudDsgcGFkZGluZzogMTJweCAyMHB4IDEycHggNDBweCAhaW1wb3J0YW50OyBib3JkZXItcmFkaXVzOiAyNXB4ICFpbXBvcnRhbnQ7XCI+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gTGlzdGUgZGVzIGNhdMOpZ29yaWVzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2YgZmlsdGVyZWRDYXRlZ29yaWVzXCIgY2xhc3M9XCJjYXRlZ29yeS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlQ2F0ZWdvcnkoY2F0ZWdvcnkua2V5KVwiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGlcIiBbbmdDbGFzc109XCJjYXRlZ29yeS5leHBhbmRlZCA/ICdwaS1jaGV2cm9uLWRvd24nIDogJ3BpLWNoZXZyb24tcmlnaHQnXCI+PC9pPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiPnt7IGNhdGVnb3J5Lmljb24gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2F0ZWdvcnktdGl0bGVcIj57eyBjYXRlZ29yeS5uYW1lIH19PC9oMz5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5LWNvdW50XCI+KHt7IGNhdGVnb3J5LmRvY3MubGVuZ3RoIH19KTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktY29udGVudFwiIFtuZ0NsYXNzXT1cInsgJ2V4cGFuZGVkJzogY2F0ZWdvcnkuZXhwYW5kZWQgfVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2NzLWdyaWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkb2Mgb2YgY2F0ZWdvcnkuZG9jc1wiIFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRvYy1jYXJkXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Eb2N1bWVudGF0aW9uQW5kU3dpdGNoKGRvYylcIlxyXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZG9jLmRlc2NyaXB0aW9uXCI+ICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwiZG9jLW5hbWVcIj57eyBkb2MuZGlzcGxheU5hbWUgfX08L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZG9jLWRlc2NyaXB0aW9uXCI+e3sgZG9jLmRlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgIDwhLS0gU3RhdHMgZW4gYmFzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb2NzLXN0YXRzXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxzdHJvbmc+e3sgZ2V0VG90YWxEb2NzQ291bnQoKSB9fTwvc3Ryb25nPiBkb2N1bWVudGF0aW9ucyBkaXNwb25pYmxlc1xyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxzdHJvbmc+e3sgZ2V0T3BlblRhYnNDb3VudCgpIH19PC9zdHJvbmc+IG9uZ2xldHMgb3V2ZXJ0c1xyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBDb250ZW51IHBvdXIgb25nbGV0IGRlIGRvY3VtZW50YXRpb24gLS0+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ0YWIudHlwZSA9PT0gJ2RvYydcIiBjbGFzcz1cIm1hcmtkb3duLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDwhLS0gQnJlYWRjcnVtYiBwb3VyIG5hdmlnYXRpb24gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1icmVhZGNydW1iXCIgKm5nSWY9XCJ0YWIuY2F0ZWdvcnlcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJlYWRjcnVtYi1pdGVtXCI+e3sgdGFiLmNhdGVnb3J5IH19PC9zcGFuPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1hbmdsZS1yaWdodFwiPjwvaT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJlYWRjcnVtYi1jdXJyZW50XCI+e3sgdGFiLnRpdGxlIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwidGFiLmxvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCI0XCI+PC9wLXByb2dyZXNzU3Bpbm5lcj5cclxuICAgICAgICAgIDxzcGFuPkNoYXJnZW1lbnQgZGUgbGEgZG9jdW1lbnRhdGlvbi4uLjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWFya2Rvd24gXHJcbiAgICAgICAgICAqbmdJZj1cIiF0YWIubG9hZGluZ1wiIFxyXG4gICAgICAgICAgW2RhdGFdPVwidGFiLmNvbnRlbnQgfHwgJ0F1Y3VuIGNvbnRlbnUgZGlzcG9uaWJsZSdcIj5cclxuICAgICAgICA8L21hcmtkb3duPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICA8L3AtdGFiVmlldz5cclxuPC9kaXY+Il19