@ecodev/natural-editor 41.3.0 → 42.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/{esm2015/ecodev-natural-editor.js → esm2020/ecodev-natural-editor.mjs} +0 -0
  2. package/esm2020/lib/class-dialog/class-dialog.component.mjs +37 -0
  3. package/esm2020/lib/color-dialog/color-dialog.component.mjs +184 -0
  4. package/esm2020/lib/custom-css/custom-css.directive.mjs +71 -0
  5. package/esm2020/lib/editor/editor.component.mjs +213 -0
  6. package/esm2020/lib/editor.module.mjs +90 -0
  7. package/{esm2015/lib/link-dialog/link-dialog.component.js → esm2020/lib/link-dialog/link-dialog.component.mjs} +5 -8
  8. package/esm2020/lib/utils/image.mjs +81 -0
  9. package/{esm2015/lib/utils/inputrules.js → esm2020/lib/utils/inputrules.mjs} +0 -0
  10. package/esm2020/lib/utils/items/cell-background-color-item.mjs +55 -0
  11. package/esm2020/lib/utils/items/class-item.mjs +86 -0
  12. package/esm2020/lib/utils/items/horizontal-rule-item.mjs +24 -0
  13. package/esm2020/lib/utils/items/item.mjs +39 -0
  14. package/esm2020/lib/utils/items/link-item.mjs +40 -0
  15. package/esm2020/lib/utils/items/table-item.mjs +43 -0
  16. package/esm2020/lib/utils/items/text-align-item.mjs +78 -0
  17. package/esm2020/lib/utils/items/utils.mjs +41 -0
  18. package/esm2020/lib/utils/items/wrap-list-item.mjs +6 -0
  19. package/esm2020/lib/utils/keymap.mjs +115 -0
  20. package/esm2020/lib/utils/menu.mjs +101 -0
  21. package/esm2020/lib/utils/schema/paragraph-with-alignment.mjs +50 -0
  22. package/esm2020/lib/utils/schema/schema.mjs +51 -0
  23. package/esm2020/lib/utils/schema/table.mjs +113 -0
  24. package/esm2020/public-api.mjs +9 -0
  25. package/fesm2015/ecodev-natural-editor.mjs +1548 -0
  26. package/fesm2015/ecodev-natural-editor.mjs.map +1 -0
  27. package/fesm2020/ecodev-natural-editor.mjs +1546 -0
  28. package/fesm2020/ecodev-natural-editor.mjs.map +1 -0
  29. package/lib/class-dialog/class-dialog.component.d.ts +24 -0
  30. package/lib/color-dialog/color-dialog.component.d.ts +26 -0
  31. package/lib/custom-css/custom-css.directive.d.ts +29 -0
  32. package/lib/editor.module.d.ts +19 -16
  33. package/lib/utils/items/cell-background-color-item.d.ts +5 -0
  34. package/lib/utils/items/class-item.d.ts +6 -0
  35. package/lib/utils/items/horizontal-rule-item.d.ts +5 -0
  36. package/lib/utils/{item.d.ts → items/item.d.ts} +0 -0
  37. package/lib/utils/items/link-item.d.ts +6 -0
  38. package/lib/utils/items/table-item.d.ts +4 -0
  39. package/lib/utils/{text-align-item.d.ts → items/text-align-item.d.ts} +0 -0
  40. package/lib/utils/items/utils.d.ts +18 -0
  41. package/lib/utils/items/wrap-list-item.d.ts +3 -0
  42. package/lib/utils/menu.d.ts +2 -2
  43. package/lib/utils/schema/paragraph-with-alignment.d.ts +8 -0
  44. package/lib/utils/{schema.d.ts → schema/schema.d.ts} +0 -0
  45. package/lib/utils/schema/table.d.ts +9 -0
  46. package/package.json +22 -8
  47. package/public-api.d.ts +1 -0
  48. package/src/lib/editor/_editor.theme.scss +1 -1
  49. package/theming/_natural-editor.theme.scss +1 -1
  50. package/bundles/ecodev-natural-editor.umd.js +0 -1351
  51. package/bundles/ecodev-natural-editor.umd.js.map +0 -1
  52. package/esm2015/lib/editor/editor.component.js +0 -219
  53. package/esm2015/lib/editor.module.js +0 -82
  54. package/esm2015/lib/utils/image.js +0 -81
  55. package/esm2015/lib/utils/item.js +0 -39
  56. package/esm2015/lib/utils/keymap.js +0 -115
  57. package/esm2015/lib/utils/menu.js +0 -178
  58. package/esm2015/lib/utils/paragraph-with-alignment.js +0 -43
  59. package/esm2015/lib/utils/schema.js +0 -47
  60. package/esm2015/lib/utils/table.js +0 -37
  61. package/esm2015/lib/utils/text-align-item.js +0 -78
  62. package/esm2015/public-api.js +0 -8
  63. package/fesm2015/ecodev-natural-editor.js +0 -997
  64. package/fesm2015/ecodev-natural-editor.js.map +0 -1
  65. package/lib/utils/paragraph-with-alignment.d.ts +0 -2
  66. package/lib/utils/table.d.ts +0 -8
@@ -0,0 +1,37 @@
1
+ import { Component, Inject } from '@angular/core';
2
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
+ import { FormControl, FormGroup, Validators } from '@angular/forms';
4
+ import { ifValid } from '@ecodev/natural';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/material/dialog";
7
+ import * as i2 from "@angular/material/form-field";
8
+ import * as i3 from "@angular/material/button";
9
+ import * as i4 from "@angular/forms";
10
+ import * as i5 from "@angular/material/input";
11
+ import * as i6 from "@angular/common";
12
+ export class ClassDialogComponent {
13
+ constructor(data, dialogRef) {
14
+ this.dialogRef = dialogRef;
15
+ this.classControl = new FormControl('', Validators.pattern(/(^\s*(-?[_a-zA-Z]+[_a-zA-Z0-9-]*\s*)+)/));
16
+ this.form = new FormGroup({
17
+ class: this.classControl,
18
+ });
19
+ this.form.setValue(data);
20
+ }
21
+ maybeConfirm() {
22
+ ifValid(this.form).subscribe(() => this.confirm());
23
+ }
24
+ confirm() {
25
+ this.dialogRef.close(this.form.value);
26
+ }
27
+ }
28
+ ClassDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ClassDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
29
+ ClassDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: ClassDialogComponent, selector: "ng-component", ngImport: i0, template: "<h2 i18n mat-dialog-title>Saisir les classes CSS</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <mat-form-field>\n <mat-label i18n>Classes CSS</mat-label>\n <input matInput [formControl]=\"classControl\" (keydown.enter)=\"maybeConfirm()\" cdkFocusInitial />\n <div class=\"sample\" matSuffix [style]=\"{backgroundClass: classControl.valid ? classControl.value : ''}\"></div>\n <mat-error *ngIf=\"classControl.hasError('pattern')\" i18n>Doit \u00EAtre un ou plusieurs nom de classe CSS</mat-error>\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <button mat-button [mat-dialog-close] i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-actions{display:flex;flex-direction:row;justify-content:flex-end}mat-dialog-content{width:70vw;max-width:30em;display:grid}\n"], components: [{ type: i2.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.MatLabel, selector: "mat-label" }, { type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i2.MatSuffix, selector: "[matSuffix]" }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatError, selector: "mat-error", inputs: ["id"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] });
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ClassDialogComponent, decorators: [{
31
+ type: Component,
32
+ args: [{ template: "<h2 i18n mat-dialog-title>Saisir les classes CSS</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <mat-form-field>\n <mat-label i18n>Classes CSS</mat-label>\n <input matInput [formControl]=\"classControl\" (keydown.enter)=\"maybeConfirm()\" cdkFocusInitial />\n <div class=\"sample\" matSuffix [style]=\"{backgroundClass: classControl.valid ? classControl.value : ''}\"></div>\n <mat-error *ngIf=\"classControl.hasError('pattern')\" i18n>Doit \u00EAtre un ou plusieurs nom de classe CSS</mat-error>\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <button mat-button [mat-dialog-close] i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-actions{display:flex;flex-direction:row;justify-content:flex-end}mat-dialog-content{width:70vw;max-width:30em;display:grid}\n"] }]
33
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
34
+ type: Inject,
35
+ args: [MAT_DIALOG_DATA]
36
+ }] }, { type: i1.MatDialogRef }]; } });
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwtZWRpdG9yL3NyYy9saWIvY2xhc3MtZGlhbG9nL2NsYXNzLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2NsYXNzLWRpYWxvZy9jbGFzcy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFDLGVBQWUsRUFBZSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7QUFrQnhDLE1BQU0sT0FBTyxvQkFBb0I7SUFNN0IsWUFDNkIsSUFBcUIsRUFDdEMsU0FBOEQ7UUFBOUQsY0FBUyxHQUFULFNBQVMsQ0FBcUQ7UUFQMUQsaUJBQVksR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUM7UUFDakcsU0FBSSxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtTQUMzQixDQUFDLENBQUM7UUFNQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU0sWUFBWTtRQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxPQUFPO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDOztpSEFuQlEsb0JBQW9CLGtCQU9qQixlQUFlO3FHQVBsQixvQkFBb0Isb0RDckJqQywreUJBZUE7MkZETWEsb0JBQW9CO2tCQUpoQyxTQUFTOzs7MEJBV0QsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2lmVmFsaWR9IGZyb20gJ0BlY29kZXYvbmF0dXJhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3NEaWFsb2dEYXRhIHtcbiAgICAvKipcbiAgICAgKiBDU1MgY2xhc3MgbmFtZXNcbiAgICAgKlxuICAgICAqIEVnOlxuICAgICAqXG4gICAgICogLSBgXCJcImBcbiAgICAgKiAtIGBcIm15LWNsYXNzIG15LW90aGVyLWNsYXNzXCJgXG4gICAgICovXG4gICAgY2xhc3M6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGVVcmw6ICcuL2NsYXNzLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2xhc3MtZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENsYXNzRGlhbG9nQ29tcG9uZW50IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xhc3NDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnBhdHRlcm4oLyheXFxzKigtP1tfYS16QS1aXStbX2EtekEtWjAtOS1dKlxccyopKykvKSk7XG4gICAgcHVibGljIHJlYWRvbmx5IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgY2xhc3M6IHRoaXMuY2xhc3NDb250cm9sLFxuICAgIH0pO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgZGF0YTogQ2xhc3NEaWFsb2dEYXRhLFxuICAgICAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENsYXNzRGlhbG9nQ29tcG9uZW50LCBDbGFzc0RpYWxvZ0RhdGE+LFxuICAgICkge1xuICAgICAgICB0aGlzLmZvcm0uc2V0VmFsdWUoZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIG1heWJlQ29uZmlybSgpOiB2b2lkIHtcbiAgICAgICAgaWZWYWxpZCh0aGlzLmZvcm0pLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNvbmZpcm0oKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maXJtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0aGlzLmZvcm0udmFsdWUpO1xuICAgIH1cbn1cbiIsIjxoMiBpMThuIG1hdC1kaWFsb2ctdGl0bGU+U2Fpc2lyIGxlcyBjbGFzc2VzIENTUzwvaDI+XG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsIGkxOG4+Q2xhc3NlcyBDU1M8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJjbGFzc0NvbnRyb2xcIiAoa2V5ZG93bi5lbnRlcik9XCJtYXliZUNvbmZpcm0oKVwiIGNka0ZvY3VzSW5pdGlhbCAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2FtcGxlXCIgbWF0U3VmZml4IFtzdHlsZV09XCJ7YmFja2dyb3VuZENsYXNzOiBjbGFzc0NvbnRyb2wudmFsaWQgPyBjbGFzc0NvbnRyb2wudmFsdWUgOiAnJ31cIj48L2Rpdj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImNsYXNzQ29udHJvbC5oYXNFcnJvcigncGF0dGVybicpXCIgaTE4bj5Eb2l0IMOqdHJlIHVuIG91IHBsdXNpZXVycyBub20gZGUgY2xhc3NlIENTUzwvbWF0LWVycm9yPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdIGkxOG4+QW5udWxlcjwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJtYXliZUNvbmZpcm0oKVwiIFtkaXNhYmxlZF09XCIhZm9ybS52YWxpZFwiPjxzcGFuIGkxOG4+VmFsaWRlcjwvc3Bhbj48L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuIl19
@@ -0,0 +1,184 @@
1
+ import { Component, Inject } from '@angular/core';
2
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
+ import { FormControl, FormGroup, Validators } from '@angular/forms';
4
+ import { ifValid } from '@ecodev/natural';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/material/dialog";
7
+ import * as i2 from "@angular/material/button";
8
+ import * as i3 from "@ecodev/natural";
9
+ import * as i4 from "@angular/material/form-field";
10
+ import * as i5 from "@angular/forms";
11
+ import * as i6 from "@angular/common";
12
+ import * as i7 from "@angular/material/input";
13
+ export class ColorDialogComponent {
14
+ constructor(data, dialogRef) {
15
+ this.dialogRef = dialogRef;
16
+ this.colors = [
17
+ [
18
+ '#000000',
19
+ '#111111',
20
+ '#1c1c1c',
21
+ '#333333',
22
+ '#666666',
23
+ '#808080',
24
+ '#999999',
25
+ '#b2b2b2',
26
+ '#cccccc',
27
+ '#dddddd',
28
+ '#eeeeee',
29
+ '#ffffff',
30
+ ],
31
+ [
32
+ '#ffff00',
33
+ '#ffbf00',
34
+ '#ff8000',
35
+ '#ff4000',
36
+ '#ff0000',
37
+ '#bf0041',
38
+ '#800080',
39
+ '#55308d',
40
+ '#2a6099',
41
+ '#158466',
42
+ '#00a933',
43
+ '#81d41a',
44
+ ],
45
+ [
46
+ '#ffffd7',
47
+ '#fff5ce',
48
+ '#ffdbb6',
49
+ '#ffd8ce',
50
+ '#ffd7d7',
51
+ '#f7d1d5',
52
+ '#e0c2cd',
53
+ '#dedce6',
54
+ '#dee6ef',
55
+ '#dee7e5',
56
+ '#dde8cb',
57
+ '#f6f9d4',
58
+ ],
59
+ [
60
+ '#ffffa6',
61
+ '#ffe994',
62
+ '#ffb66c',
63
+ '#ffaa95',
64
+ '#ffa6a6',
65
+ '#ec9ba4',
66
+ '#bf819e',
67
+ '#b7b3ca',
68
+ '#b4c7dc',
69
+ '#b3cac7',
70
+ '#afd095',
71
+ '#e8f2a1',
72
+ ],
73
+ [
74
+ '#ffff6d',
75
+ '#ffde59',
76
+ '#ff972f',
77
+ '#ff7b59',
78
+ '#ff6d6d',
79
+ '#e16173',
80
+ '#a1467e',
81
+ '#8e86ae',
82
+ '#729fcf',
83
+ '#81aca6',
84
+ '#77bc65',
85
+ '#d4ea6b',
86
+ ],
87
+ [
88
+ '#ffff38',
89
+ '#ffd428',
90
+ '#ff860d',
91
+ '#ff5429',
92
+ '#ff3838',
93
+ '#d62e4e',
94
+ '#8d1d75',
95
+ '#6b5e9b',
96
+ '#5983b0',
97
+ '#50938a',
98
+ '#3faf46',
99
+ '#bbe33d',
100
+ ],
101
+ [
102
+ '#e6e905',
103
+ '#e8a202',
104
+ '#ea7500',
105
+ '#ed4c05',
106
+ '#f10d0c',
107
+ '#a7074b',
108
+ '#780373',
109
+ '#5b277d',
110
+ '#3465a4',
111
+ '#168253',
112
+ '#069a2e',
113
+ '#5eb91e',
114
+ ],
115
+ [
116
+ '#acb20c',
117
+ '#b47804',
118
+ '#b85c00',
119
+ '#be480a',
120
+ '#c9211e',
121
+ '#861141',
122
+ '#650953',
123
+ '#55215b',
124
+ '#355269',
125
+ '#1e6a39',
126
+ '#127622',
127
+ '#468a1a',
128
+ ],
129
+ [
130
+ '#706e0c',
131
+ '#784b04',
132
+ '#7b3d00',
133
+ '#813709',
134
+ '#8d281e',
135
+ '#611729',
136
+ '#4e102d',
137
+ '#481d32',
138
+ '#383d3c',
139
+ '#28471f',
140
+ '#224b12',
141
+ '#395511',
142
+ ],
143
+ [
144
+ '#443205',
145
+ '#472702',
146
+ '#492300',
147
+ '#4b2204',
148
+ '#50200c',
149
+ '#41190d',
150
+ '#3b160e',
151
+ '#3a1a0f',
152
+ '#362413',
153
+ '#302709',
154
+ '#2e2706',
155
+ '#342a06',
156
+ ],
157
+ ];
158
+ this.colorControl = new FormControl('', Validators.pattern(/^#\p{Hex_Digit}{6}/u));
159
+ this.form = new FormGroup({
160
+ color: this.colorControl,
161
+ });
162
+ this.form.setValue(data);
163
+ }
164
+ maybeConfirm() {
165
+ ifValid(this.form).subscribe(() => this.confirm());
166
+ }
167
+ confirm() {
168
+ this.dialogRef.close(this.form.value);
169
+ }
170
+ selectColor(color) {
171
+ this.colorControl.setValue(color);
172
+ this.maybeConfirm();
173
+ }
174
+ }
175
+ ColorDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ColorDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
176
+ ColorDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: ColorDialogComponent, selector: "ng-component", ngImport: i0, template: "<h2 i18n mat-dialog-title>S\u00E9lectionner une couleur</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <div>\n <div *ngFor=\"let row of colors\">\n <div\n *ngFor=\"let color of row\"\n class=\"color\"\n [style]=\"{backgroundColor: color}\"\n (click)=\"selectColor(color)\"\n >\n </div>\n </div>\n </div>\n\n <div>\n <button mat-button (click)=\"selectColor('')\">\n <natural-icon name=\"format_color_reset\"></natural-icon>\n <span i18n>Transparent</span></button\n >\n </div>\n\n <mat-form-field>\n <mat-label i18n>Couleur</mat-label>\n <input matInput [formControl]=\"colorControl\" (keydown.enter)=\"maybeConfirm()\" cdkFocusInitial />\n <div class=\"sample\" matSuffix [style]=\"{backgroundColor: colorControl.valid ? colorControl.value : ''}\"></div>\n <mat-error *ngIf=\"colorControl.hasError('pattern')\" i18n\n >Doit \u00EAtre le format hexadecimal. Par exemple: #ff4000\n </mat-error>\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <button mat-button [mat-dialog-close] i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-actions{display:flex;flex-direction:row;justify-content:flex-end}mat-dialog-content{width:70vw;max-width:30em;display:grid;justify-content:center;row-gap:25px}.color{display:inline-block;width:25px;height:25px;margin:3px;cursor:pointer}.color:hover{padding:3px;margin:0}.sample{width:27px;height:27px}\n"], components: [{ type: i2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3.NaturalIconComponent, selector: "natural-icon", inputs: ["label", "labelColor", "labelPosition", "name", "size"] }, { type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }], directives: [{ type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.MatLabel, selector: "mat-label" }, { type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i4.MatSuffix, selector: "[matSuffix]" }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.MatError, selector: "mat-error", inputs: ["id"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] });
177
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ColorDialogComponent, decorators: [{
178
+ type: Component,
179
+ args: [{ template: "<h2 i18n mat-dialog-title>S\u00E9lectionner une couleur</h2>\n\n<mat-dialog-content [formGroup]=\"form\">\n <div>\n <div *ngFor=\"let row of colors\">\n <div\n *ngFor=\"let color of row\"\n class=\"color\"\n [style]=\"{backgroundColor: color}\"\n (click)=\"selectColor(color)\"\n >\n </div>\n </div>\n </div>\n\n <div>\n <button mat-button (click)=\"selectColor('')\">\n <natural-icon name=\"format_color_reset\"></natural-icon>\n <span i18n>Transparent</span></button\n >\n </div>\n\n <mat-form-field>\n <mat-label i18n>Couleur</mat-label>\n <input matInput [formControl]=\"colorControl\" (keydown.enter)=\"maybeConfirm()\" cdkFocusInitial />\n <div class=\"sample\" matSuffix [style]=\"{backgroundColor: colorControl.valid ? colorControl.value : ''}\"></div>\n <mat-error *ngIf=\"colorControl.hasError('pattern')\" i18n\n >Doit \u00EAtre le format hexadecimal. Par exemple: #ff4000\n </mat-error>\n </mat-form-field>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <button mat-button [mat-dialog-close] i18n>Annuler</button>\n <button mat-stroked-button (click)=\"maybeConfirm()\" [disabled]=\"!form.valid\"><span i18n>Valider</span></button>\n</mat-dialog-actions>\n", styles: ["mat-dialog-actions{display:flex;flex-direction:row;justify-content:flex-end}mat-dialog-content{width:70vw;max-width:30em;display:grid;justify-content:center;row-gap:25px}.color{display:inline-block;width:25px;height:25px;margin:3px;cursor:pointer}.color:hover{padding:3px;margin:0}.sample{width:27px;height:27px}\n"] }]
180
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
181
+ type: Inject,
182
+ args: [MAT_DIALOG_DATA]
183
+ }] }, { type: i1.MatDialogRef }]; } });
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwtZWRpdG9yL3NyYy9saWIvY29sb3ItZGlhbG9nL2NvbG9yLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2NvbG9yLWRpYWxvZy9jb2xvci1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFDLGVBQWUsRUFBZSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0FBa0J4QyxNQUFNLE9BQU8sb0JBQW9CO0lBcUo3QixZQUM2QixJQUFxQixFQUN0QyxTQUE4RDtRQUE5RCxjQUFTLEdBQVQsU0FBUyxDQUFxRDtRQXRKMUQsV0FBTSxHQUFlO1lBQ2pDO2dCQUNJLFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2FBQ1o7WUFDRDtnQkFDSSxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUzthQUNaO1lBQ0Q7Z0JBQ0ksU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7YUFDWjtZQUNEO2dCQUNJLFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2FBQ1o7WUFDRDtnQkFDSSxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUzthQUNaO1lBQ0Q7Z0JBQ0ksU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7YUFDWjtZQUNEO2dCQUNJLFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2FBQ1o7WUFDRDtnQkFDSSxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUzthQUNaO1lBQ0Q7Z0JBQ0ksU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7YUFDWjtZQUNEO2dCQUNJLFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2FBQ1o7U0FDSixDQUFDO1FBRWMsaUJBQVksR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDOUUsU0FBSSxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtTQUMzQixDQUFDLENBQUM7UUFNQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU0sWUFBWTtRQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxPQUFPO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU0sV0FBVyxDQUFDLEtBQWE7UUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7O2lIQXZLUSxvQkFBb0Isa0JBc0pqQixlQUFlO3FHQXRKbEIsb0JBQW9CLG9EQ3JCakMseTJDQW9DQTsyRkRmYSxvQkFBb0I7a0JBSmhDLFNBQVM7OzswQkEwSkQsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2lmVmFsaWR9IGZyb20gJ0BlY29kZXYvbmF0dXJhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JEaWFsb2dEYXRhIHtcbiAgICAvKipcbiAgICAgKiBFbXB0eSBzdHJpbmcgbWVhbnMgbm8gY29sb3Igc2V0IGF0IGFsbC4gQW55dGhpbmcgZWxzZSBtdXN0IGJlIGEgdmFsaWQgQ1NTIGNvbG9yIGluIGhleGEgZm9ybWF0LlxuICAgICAqXG4gICAgICogRWc6XG4gICAgICpcbiAgICAgKiAtIGBcIlwiYFxuICAgICAqIC0gYFwiI2ZmNDAwMFwiYFxuICAgICAqL1xuICAgIGNvbG9yOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlVXJsOiAnLi9jb2xvci1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NvbG9yLWRpYWxvZy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb2xvckRpYWxvZ0NvbXBvbmVudCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGNvbG9yczogc3RyaW5nW11bXSA9IFtcbiAgICAgICAgW1xuICAgICAgICAgICAgJyMwMDAwMDAnLFxuICAgICAgICAgICAgJyMxMTExMTEnLFxuICAgICAgICAgICAgJyMxYzFjMWMnLFxuICAgICAgICAgICAgJyMzMzMzMzMnLFxuICAgICAgICAgICAgJyM2NjY2NjYnLFxuICAgICAgICAgICAgJyM4MDgwODAnLFxuICAgICAgICAgICAgJyM5OTk5OTknLFxuICAgICAgICAgICAgJyNiMmIyYjInLFxuICAgICAgICAgICAgJyNjY2NjY2MnLFxuICAgICAgICAgICAgJyNkZGRkZGQnLFxuICAgICAgICAgICAgJyNlZWVlZWUnLFxuICAgICAgICAgICAgJyNmZmZmZmYnLFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICAnI2ZmZmYwMCcsXG4gICAgICAgICAgICAnI2ZmYmYwMCcsXG4gICAgICAgICAgICAnI2ZmODAwMCcsXG4gICAgICAgICAgICAnI2ZmNDAwMCcsXG4gICAgICAgICAgICAnI2ZmMDAwMCcsXG4gICAgICAgICAgICAnI2JmMDA0MScsXG4gICAgICAgICAgICAnIzgwMDA4MCcsXG4gICAgICAgICAgICAnIzU1MzA4ZCcsXG4gICAgICAgICAgICAnIzJhNjA5OScsXG4gICAgICAgICAgICAnIzE1ODQ2NicsXG4gICAgICAgICAgICAnIzAwYTkzMycsXG4gICAgICAgICAgICAnIzgxZDQxYScsXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgICcjZmZmZmQ3JyxcbiAgICAgICAgICAgICcjZmZmNWNlJyxcbiAgICAgICAgICAgICcjZmZkYmI2JyxcbiAgICAgICAgICAgICcjZmZkOGNlJyxcbiAgICAgICAgICAgICcjZmZkN2Q3JyxcbiAgICAgICAgICAgICcjZjdkMWQ1JyxcbiAgICAgICAgICAgICcjZTBjMmNkJyxcbiAgICAgICAgICAgICcjZGVkY2U2JyxcbiAgICAgICAgICAgICcjZGVlNmVmJyxcbiAgICAgICAgICAgICcjZGVlN2U1JyxcbiAgICAgICAgICAgICcjZGRlOGNiJyxcbiAgICAgICAgICAgICcjZjZmOWQ0JyxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgJyNmZmZmYTYnLFxuICAgICAgICAgICAgJyNmZmU5OTQnLFxuICAgICAgICAgICAgJyNmZmI2NmMnLFxuICAgICAgICAgICAgJyNmZmFhOTUnLFxuICAgICAgICAgICAgJyNmZmE2YTYnLFxuICAgICAgICAgICAgJyNlYzliYTQnLFxuICAgICAgICAgICAgJyNiZjgxOWUnLFxuICAgICAgICAgICAgJyNiN2IzY2EnLFxuICAgICAgICAgICAgJyNiNGM3ZGMnLFxuICAgICAgICAgICAgJyNiM2NhYzcnLFxuICAgICAgICAgICAgJyNhZmQwOTUnLFxuICAgICAgICAgICAgJyNlOGYyYTEnLFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICAnI2ZmZmY2ZCcsXG4gICAgICAgICAgICAnI2ZmZGU1OScsXG4gICAgICAgICAgICAnI2ZmOTcyZicsXG4gICAgICAgICAgICAnI2ZmN2I1OScsXG4gICAgICAgICAgICAnI2ZmNmQ2ZCcsXG4gICAgICAgICAgICAnI2UxNjE3MycsXG4gICAgICAgICAgICAnI2ExNDY3ZScsXG4gICAgICAgICAgICAnIzhlODZhZScsXG4gICAgICAgICAgICAnIzcyOWZjZicsXG4gICAgICAgICAgICAnIzgxYWNhNicsXG4gICAgICAgICAgICAnIzc3YmM2NScsXG4gICAgICAgICAgICAnI2Q0ZWE2YicsXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgICcjZmZmZjM4JyxcbiAgICAgICAgICAgICcjZmZkNDI4JyxcbiAgICAgICAgICAgICcjZmY4NjBkJyxcbiAgICAgICAgICAgICcjZmY1NDI5JyxcbiAgICAgICAgICAgICcjZmYzODM4JyxcbiAgICAgICAgICAgICcjZDYyZTRlJyxcbiAgICAgICAgICAgICcjOGQxZDc1JyxcbiAgICAgICAgICAgICcjNmI1ZTliJyxcbiAgICAgICAgICAgICcjNTk4M2IwJyxcbiAgICAgICAgICAgICcjNTA5MzhhJyxcbiAgICAgICAgICAgICcjM2ZhZjQ2JyxcbiAgICAgICAgICAgICcjYmJlMzNkJyxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgJyNlNmU5MDUnLFxuICAgICAgICAgICAgJyNlOGEyMDInLFxuICAgICAgICAgICAgJyNlYTc1MDAnLFxuICAgICAgICAgICAgJyNlZDRjMDUnLFxuICAgICAgICAgICAgJyNmMTBkMGMnLFxuICAgICAgICAgICAgJyNhNzA3NGInLFxuICAgICAgICAgICAgJyM3ODAzNzMnLFxuICAgICAgICAgICAgJyM1YjI3N2QnLFxuICAgICAgICAgICAgJyMzNDY1YTQnLFxuICAgICAgICAgICAgJyMxNjgyNTMnLFxuICAgICAgICAgICAgJyMwNjlhMmUnLFxuICAgICAgICAgICAgJyM1ZWI5MWUnLFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICAnI2FjYjIwYycsXG4gICAgICAgICAgICAnI2I0NzgwNCcsXG4gICAgICAgICAgICAnI2I4NWMwMCcsXG4gICAgICAgICAgICAnI2JlNDgwYScsXG4gICAgICAgICAgICAnI2M5MjExZScsXG4gICAgICAgICAgICAnIzg2MTE0MScsXG4gICAgICAgICAgICAnIzY1MDk1MycsXG4gICAgICAgICAgICAnIzU1MjE1YicsXG4gICAgICAgICAgICAnIzM1NTI2OScsXG4gICAgICAgICAgICAnIzFlNmEzOScsXG4gICAgICAgICAgICAnIzEyNzYyMicsXG4gICAgICAgICAgICAnIzQ2OGExYScsXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgICcjNzA2ZTBjJyxcbiAgICAgICAgICAgICcjNzg0YjA0JyxcbiAgICAgICAgICAgICcjN2IzZDAwJyxcbiAgICAgICAgICAgICcjODEzNzA5JyxcbiAgICAgICAgICAgICcjOGQyODFlJyxcbiAgICAgICAgICAgICcjNjExNzI5JyxcbiAgICAgICAgICAgICcjNGUxMDJkJyxcbiAgICAgICAgICAgICcjNDgxZDMyJyxcbiAgICAgICAgICAgICcjMzgzZDNjJyxcbiAgICAgICAgICAgICcjMjg0NzFmJyxcbiAgICAgICAgICAgICcjMjI0YjEyJyxcbiAgICAgICAgICAgICcjMzk1NTExJyxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgJyM0NDMyMDUnLFxuICAgICAgICAgICAgJyM0NzI3MDInLFxuICAgICAgICAgICAgJyM0OTIzMDAnLFxuICAgICAgICAgICAgJyM0YjIyMDQnLFxuICAgICAgICAgICAgJyM1MDIwMGMnLFxuICAgICAgICAgICAgJyM0MTE5MGQnLFxuICAgICAgICAgICAgJyMzYjE2MGUnLFxuICAgICAgICAgICAgJyMzYTFhMGYnLFxuICAgICAgICAgICAgJyMzNjI0MTMnLFxuICAgICAgICAgICAgJyMzMDI3MDknLFxuICAgICAgICAgICAgJyMyZTI3MDYnLFxuICAgICAgICAgICAgJyMzNDJhMDYnLFxuICAgICAgICBdLFxuICAgIF07XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgY29sb3JDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnBhdHRlcm4oL14jXFxwe0hleF9EaWdpdH17Nn0vdSkpO1xuICAgIHB1YmxpYyByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yQ29udHJvbCxcbiAgICB9KTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIGRhdGE6IENvbG9yRGlhbG9nRGF0YSxcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxDb2xvckRpYWxvZ0NvbXBvbmVudCwgQ29sb3JEaWFsb2dEYXRhPixcbiAgICApIHtcbiAgICAgICAgdGhpcy5mb3JtLnNldFZhbHVlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXliZUNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIGlmVmFsaWQodGhpcy5mb3JtKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jb25maXJtKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5mb3JtLnZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0Q29sb3IoY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbG9yQ29udHJvbC5zZXRWYWx1ZShjb2xvcik7XG4gICAgICAgIHRoaXMubWF5YmVDb25maXJtKCk7XG4gICAgfVxufVxuIiwiPGgyIGkxOG4gbWF0LWRpYWxvZy10aXRsZT5Tw6lsZWN0aW9ubmVyIHVuZSBjb3VsZXVyPC9oMj5cblxuPG1hdC1kaWFsb2ctY29udGVudCBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8ZGl2PlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgY29sb3JzXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbG9yIG9mIHJvd1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgW3N0eWxlXT1cIntiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yfVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENvbG9yKGNvbG9yKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInNlbGVjdENvbG9yKCcnKVwiPlxuICAgICAgICAgICAgPG5hdHVyYWwtaWNvbiBuYW1lPVwiZm9ybWF0X2NvbG9yX3Jlc2V0XCI+PC9uYXR1cmFsLWljb24+XG4gICAgICAgICAgICA8c3BhbiBpMThuPlRyYW5zcGFyZW50PC9zcGFuPjwvYnV0dG9uXG4gICAgICAgID5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1sYWJlbCBpMThuPkNvdWxldXI8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJjb2xvckNvbnRyb2xcIiAoa2V5ZG93bi5lbnRlcik9XCJtYXliZUNvbmZpcm0oKVwiIGNka0ZvY3VzSW5pdGlhbCAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2FtcGxlXCIgbWF0U3VmZml4IFtzdHlsZV09XCJ7YmFja2dyb3VuZENvbG9yOiBjb2xvckNvbnRyb2wudmFsaWQgPyBjb2xvckNvbnRyb2wudmFsdWUgOiAnJ31cIj48L2Rpdj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImNvbG9yQ29udHJvbC5oYXNFcnJvcigncGF0dGVybicpXCIgaTE4blxuICAgICAgICAgICAgPkRvaXQgw6p0cmUgbGUgZm9ybWF0IGhleGFkZWNpbWFsLiBQYXIgZXhlbXBsZTogI2ZmNDAwMFxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbjxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXQtZGlhbG9nLWNsb3NlXSBpMThuPkFubnVsZXI8L2J1dHRvbj5cbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwibWF5YmVDb25maXJtKClcIiBbZGlzYWJsZWRdPVwiIWZvcm0udmFsaWRcIj48c3BhbiBpMThuPlZhbGlkZXI8L3NwYW4+PC9idXR0b24+XG48L21hdC1kaWFsb2ctYWN0aW9ucz5cbiJdfQ==
@@ -0,0 +1,71 @@
1
+ import { Directive, HostBinding, Inject, Input } from '@angular/core';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Prefix all CSS selectors with the given selector
6
+ *
7
+ * This is meant to be relatively simple and might not cover advanced CSS syntax
8
+ */
9
+ export function prefixCss(prefix, css) {
10
+ prefix = '\n' + prefix + ' ';
11
+ return css
12
+ .replace(/([^{}]*){/gs, selectors => selectors
13
+ .split(',')
14
+ .map(selector => prefix + selector.trim())
15
+ .join(','))
16
+ .trim();
17
+ }
18
+ let uniqueId = 0;
19
+ let componentCount = 0;
20
+ /**
21
+ * Inject custom CSS into component and scope the CSS only to this component
22
+ *
23
+ * Usage :
24
+ *
25
+ * ```html
26
+ * <div [naturalCustomCss]=".my-class {background: red}">
27
+ * <p class="my-class">foo bar</p>
28
+ * </div>
29
+ * ```
30
+ */
31
+ export class NaturalCustomCssDirective {
32
+ constructor(document) {
33
+ this.document = document;
34
+ this.style = null;
35
+ this.id = 'n' + ++uniqueId;
36
+ }
37
+ set naturalCustomCss(value) {
38
+ if (value && !this.style) {
39
+ this.style = this.document.createElement('style');
40
+ this.document.head.appendChild(this.style);
41
+ }
42
+ if (this.style) {
43
+ this.style.innerHTML = value ? prefixCss(`[data-natural-id=${this.id}]`, value) : '';
44
+ }
45
+ }
46
+ ngOnDestroy() {
47
+ this.style?.remove();
48
+ // Reset uniqueId if we have no component alive anymore, so that we never reach max int
49
+ componentCount--;
50
+ if (componentCount <= 0) {
51
+ uniqueId = 0;
52
+ }
53
+ }
54
+ }
55
+ NaturalCustomCssDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalCustomCssDirective, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive });
56
+ NaturalCustomCssDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: NaturalCustomCssDirective, selector: "[naturalCustomCss]", inputs: { naturalCustomCss: "naturalCustomCss" }, host: { properties: { "attr.data-natural-id": "this.id" } }, ngImport: i0 });
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalCustomCssDirective, decorators: [{
58
+ type: Directive,
59
+ args: [{
60
+ selector: '[naturalCustomCss]',
61
+ }]
62
+ }], ctorParameters: function () { return [{ type: Document, decorators: [{
63
+ type: Inject,
64
+ args: [DOCUMENT]
65
+ }] }]; }, propDecorators: { id: [{
66
+ type: HostBinding,
67
+ args: ['attr.data-natural-id']
68
+ }], naturalCustomCss: [{
69
+ type: Input
70
+ }] } });
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNzcy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2N1c3RvbS1jc3MvY3VzdG9tLWNzcy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7O0FBRXpDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQWMsRUFBRSxHQUFXO0lBQ2pELE1BQU0sR0FBRyxJQUFJLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUU3QixPQUFPLEdBQUc7U0FDTCxPQUFPLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQ2hDLFNBQVM7U0FDSixLQUFLLENBQUMsR0FBRyxDQUFDO1NBQ1YsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ2pCO1NBQ0EsSUFBSSxFQUFFLENBQUM7QUFDaEIsQ0FBQztBQUVELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQUNqQixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFFdkI7Ozs7Ozs7Ozs7R0FVRztBQUlILE1BQU0sT0FBTyx5QkFBeUI7SUFpQmxDLFlBQXNELFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFoQmhFLFVBQUssR0FBNEIsSUFBSSxDQUFDO1FBRVEsT0FBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQztJQWNELENBQUM7SUFaNUUsSUFDVyxnQkFBZ0IsQ0FBQyxLQUF5QjtRQUNqRCxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3hGO0lBQ0wsQ0FBQztJQUlNLFdBQVc7UUFDZCxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBRXJCLHVGQUF1RjtRQUN2RixjQUFjLEVBQUUsQ0FBQztRQUNqQixJQUFJLGNBQWMsSUFBSSxDQUFDLEVBQUU7WUFDckIsUUFBUSxHQUFHLENBQUMsQ0FBQztTQUNoQjtJQUNMLENBQUM7O3NIQTNCUSx5QkFBeUIsa0JBaUJQLFFBQVE7MEdBakIxQix5QkFBeUI7MkZBQXpCLHlCQUF5QjtrQkFIckMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsb0JBQW9CO2lCQUNqQzswREFrQm1FLFFBQVE7MEJBQXBELE1BQU07MkJBQUMsUUFBUTs0Q0FkbUIsRUFBRTtzQkFBdkQsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBR3hCLGdCQUFnQjtzQkFEMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBIb3N0QmluZGluZywgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8qKlxuICogUHJlZml4IGFsbCBDU1Mgc2VsZWN0b3JzIHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yXG4gKlxuICogVGhpcyBpcyBtZWFudCB0byBiZSByZWxhdGl2ZWx5IHNpbXBsZSBhbmQgbWlnaHQgbm90IGNvdmVyIGFkdmFuY2VkIENTUyBzeW50YXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeENzcyhwcmVmaXg6IHN0cmluZywgY3NzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHByZWZpeCA9ICdcXG4nICsgcHJlZml4ICsgJyAnO1xuXG4gICAgcmV0dXJuIGNzc1xuICAgICAgICAucmVwbGFjZSgvKFtee31dKil7L2dzLCBzZWxlY3RvcnMgPT5cbiAgICAgICAgICAgIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgLm1hcChzZWxlY3RvciA9PiBwcmVmaXggKyBzZWxlY3Rvci50cmltKCkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJywnKSxcbiAgICAgICAgKVxuICAgICAgICAudHJpbSgpO1xufVxuXG5sZXQgdW5pcXVlSWQgPSAwO1xubGV0IGNvbXBvbmVudENvdW50ID0gMDtcblxuLyoqXG4gKiBJbmplY3QgY3VzdG9tIENTUyBpbnRvIGNvbXBvbmVudCBhbmQgc2NvcGUgdGhlIENTUyBvbmx5IHRvIHRoaXMgY29tcG9uZW50XG4gKlxuICogVXNhZ2UgOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxkaXYgW25hdHVyYWxDdXN0b21Dc3NdPVwiLm15LWNsYXNzIHtiYWNrZ3JvdW5kOiByZWR9XCI+XG4gKiAgICAgPHAgY2xhc3M9XCJteS1jbGFzc1wiPmZvbyBiYXI8L3A+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tuYXR1cmFsQ3VzdG9tQ3NzXScsXG59KVxuZXhwb3J0IGNsYXNzIE5hdHVyYWxDdXN0b21Dc3NEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgc3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLW5hdHVyYWwtaWQnKSBwcml2YXRlIHJlYWRvbmx5IGlkID0gJ24nICsgKyt1bmlxdWVJZDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBuYXR1cmFsQ3VzdG9tQ3NzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmICF0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMuc3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuaW5uZXJIVE1MID0gdmFsdWUgPyBwcmVmaXhDc3MoYFtkYXRhLW5hdHVyYWwtaWQ9JHt0aGlzLmlkfV1gLCB2YWx1ZSkgOiAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudCkge31cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdHlsZT8ucmVtb3ZlKCk7XG5cbiAgICAgICAgLy8gUmVzZXQgdW5pcXVlSWQgaWYgd2UgaGF2ZSBubyBjb21wb25lbnQgYWxpdmUgYW55bW9yZSwgc28gdGhhdCB3ZSBuZXZlciByZWFjaCBtYXggaW50XG4gICAgICAgIGNvbXBvbmVudENvdW50LS07XG4gICAgICAgIGlmIChjb21wb25lbnRDb3VudCA8PSAwKSB7XG4gICAgICAgICAgICB1bmlxdWVJZCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=