@idea-ionic/uncommon 8.2.1

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 (80) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +21 -0
  3. package/css/global.scss +15 -0
  4. package/esm2022/idea-ionic-uncommon.mjs +5 -0
  5. package/esm2022/public-api.mjs +35 -0
  6. package/esm2022/src/AWSAPI.service.mjs +430 -0
  7. package/esm2022/src/AWSAPISocket.service.mjs +187 -0
  8. package/esm2022/src/address/address.component.mjs +94 -0
  9. package/esm2022/src/address/address.module.mjs +21 -0
  10. package/esm2022/src/announcement/announcement.component.mjs +41 -0
  11. package/esm2022/src/announcement/announcement.module.mjs +21 -0
  12. package/esm2022/src/cachedResources.service.mjs +55 -0
  13. package/esm2022/src/colors/colorPicker.component.mjs +135 -0
  14. package/esm2022/src/colors/colorPicker.module.mjs +20 -0
  15. package/esm2022/src/contacts/contacts.component.mjs +64 -0
  16. package/esm2022/src/contacts/contacts.module.mjs +21 -0
  17. package/esm2022/src/dateTime/calendarPicker.component.mjs +196 -0
  18. package/esm2022/src/dateTime/dateTime.component.mjs +133 -0
  19. package/esm2022/src/dateTime/dateTime.module.mjs +22 -0
  20. package/esm2022/src/duration/duration.component.mjs +77 -0
  21. package/esm2022/src/duration/duration.module.mjs +21 -0
  22. package/esm2022/src/echo/echo.module.mjs +26 -0
  23. package/esm2022/src/echo/echo.page.mjs +165 -0
  24. package/esm2022/src/errorReporting.service.mjs +68 -0
  25. package/esm2022/src/mde/mde.component.mjs +44 -0
  26. package/esm2022/src/mde/mde.module.mjs +22 -0
  27. package/esm2022/src/mde/mdeToolbar.component.mjs +12 -0
  28. package/esm2022/src/offline/cacheableResource.component.mjs +18 -0
  29. package/esm2022/src/offline/offline.module.mjs +22 -0
  30. package/esm2022/src/offline/offline.service.mjs +62 -0
  31. package/esm2022/src/offline/offlineData.service.mjs +479 -0
  32. package/esm2022/src/offline/offlineIndicator.component.mjs +58 -0
  33. package/esm2022/src/offline/offlineManager.component.mjs +84 -0
  34. package/esm2022/src/pushNotifications.service.mjs +56 -0
  35. package/esm2022/src/sentiment/sentiment.component.mjs +71 -0
  36. package/esm2022/src/sentiment/sentiment.module.mjs +21 -0
  37. package/esm2022/src/timeInterval/fromTimeToTime.component.mjs +155 -0
  38. package/esm2022/src/timeInterval/timeInterval.component.mjs +122 -0
  39. package/esm2022/src/timeInterval/timeInterval.module.mjs +22 -0
  40. package/esm2022/src/tinCan.service.mjs +49 -0
  41. package/fesm2022/idea-ionic-uncommon.mjs +2891 -0
  42. package/fesm2022/idea-ionic-uncommon.mjs.map +1 -0
  43. package/index.d.ts +5 -0
  44. package/package.json +51 -0
  45. package/public-api.d.ts +34 -0
  46. package/src/AWSAPI.service.d.ts +178 -0
  47. package/src/AWSAPISocket.service.d.ts +129 -0
  48. package/src/address/address.component.d.ts +64 -0
  49. package/src/address/address.module.d.ts +11 -0
  50. package/src/announcement/announcement.component.d.ts +23 -0
  51. package/src/announcement/announcement.module.d.ts +11 -0
  52. package/src/cachedResources.service.d.ts +34 -0
  53. package/src/colors/colorPicker.component.d.ts +78 -0
  54. package/src/colors/colorPicker.module.d.ts +10 -0
  55. package/src/contacts/contacts.component.d.ts +31 -0
  56. package/src/contacts/contacts.module.d.ts +11 -0
  57. package/src/dateTime/calendarPicker.component.d.ts +45 -0
  58. package/src/dateTime/dateTime.component.d.ts +81 -0
  59. package/src/dateTime/dateTime.module.d.ts +12 -0
  60. package/src/duration/duration.component.d.ts +68 -0
  61. package/src/duration/duration.module.d.ts +11 -0
  62. package/src/echo/echo.module.d.ts +12 -0
  63. package/src/echo/echo.page.d.ts +34 -0
  64. package/src/errorReporting.service.d.ts +26 -0
  65. package/src/mde/mde.component.d.ts +39 -0
  66. package/src/mde/mde.module.d.ts +12 -0
  67. package/src/mde/mdeToolbar.component.d.ts +5 -0
  68. package/src/offline/cacheableResource.component.d.ts +11 -0
  69. package/src/offline/offline.module.d.ts +12 -0
  70. package/src/offline/offline.service.d.ts +39 -0
  71. package/src/offline/offlineData.service.d.ts +281 -0
  72. package/src/offline/offlineIndicator.component.d.ts +25 -0
  73. package/src/offline/offlineManager.component.d.ts +17 -0
  74. package/src/pushNotifications.service.d.ts +26 -0
  75. package/src/sentiment/sentiment.component.d.ts +35 -0
  76. package/src/sentiment/sentiment.module.d.ts +11 -0
  77. package/src/timeInterval/fromTimeToTime.component.d.ts +61 -0
  78. package/src/timeInterval/timeInterval.component.d.ts +84 -0
  79. package/src/timeInterval/timeInterval.module.d.ts +12 -0
  80. package/src/tinCan.service.d.ts +31 -0
@@ -0,0 +1,135 @@
1
+ import { Component, Input, Output, EventEmitter, inject } from '@angular/core';
2
+ import { PopoverController } from '@ionic/angular';
3
+ import { COLORS } from 'idea-toolbox';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@ionic/angular";
6
+ /**
7
+ * Pick a color from a defined set.
8
+ */
9
+ export class IDEAColorPickerComponent {
10
+ constructor() {
11
+ /**
12
+ * The pickable colors.
13
+ */
14
+ this.colors = COLORS;
15
+ /**
16
+ * On select event.
17
+ */
18
+ this.select = new EventEmitter();
19
+ /**
20
+ * Icon select.
21
+ */
22
+ this.iconSelect = new EventEmitter();
23
+ this._popover = inject(PopoverController);
24
+ }
25
+ async openPalette(event) {
26
+ if (this.disabled)
27
+ return;
28
+ const componentProps = { colors: this.colors, current: this.current };
29
+ const popover = await this._popover.create({ component: ColorsPaletteComponent, componentProps, event });
30
+ popover.onDidDismiss().then(res => {
31
+ if (res && res.data)
32
+ this.select.emit(res.data);
33
+ });
34
+ popover.present();
35
+ }
36
+ doIconSelect(event) {
37
+ if (event)
38
+ event.stopPropagation();
39
+ this.iconSelect.emit(event);
40
+ }
41
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: IDEAColorPickerComponent, selector: "idea-color-picker", inputs: { colors: "colors", current: "current", label: "label", placeholder: "placeholder", icon: "icon", iconColor: "iconColor", disabled: "disabled", obligatory: "obligatory", lines: "lines", color: "color" }, outputs: { select: "select", iconSelect: "iconSelect" }, ngImport: i0, template: "<ion-item\n class=\"colorPickerItem\"\n [color]=\"color\"\n [lines]=\"lines\"\n [button]=\"!disabled\"\n [title]=\"placeholder || ''\"\n [class.withLabel]=\"label\"\n (click)=\"openPalette($event)\"\n>\n @if (icon) {\n <ion-button fill=\"clear\" slot=\"start\" [color]=\"iconColor\" (click)=\"doIconSelect($event)\">\n <ion-icon [name]=\"icon\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (label) {\n <ion-label [class.selectable]=\"!disabled\">\n {{ label }}\n @if (obligatory && !disabled) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-avatar slot=\"end\" class=\"colorCircle\" [style.background-color]=\"current\" />\n @if (!disabled) {\n <ion-icon slot=\"end\" name=\"caret-down\" class=\"selectIcon\" [class.selectable]=\"!disabled\" />\n }\n</ion-item>\n", styles: [".colorPickerItem{min-height:48px;height:auto}.colorPickerItem .placeholder{color:var(--ion-color-medium)}.colorPickerItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.selectItem.withLabel{min-height:58px;height:auto}.selectItem.withLabel .selectIcon{padding-top:25px}.selectItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}ion-avatar.colorCircle{width:20px;height:20px}\n"], dependencies: [{ kind: "component", type: i1.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }] }); }
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerComponent, decorators: [{
45
+ type: Component,
46
+ args: [{ selector: 'idea-color-picker', template: "<ion-item\n class=\"colorPickerItem\"\n [color]=\"color\"\n [lines]=\"lines\"\n [button]=\"!disabled\"\n [title]=\"placeholder || ''\"\n [class.withLabel]=\"label\"\n (click)=\"openPalette($event)\"\n>\n @if (icon) {\n <ion-button fill=\"clear\" slot=\"start\" [color]=\"iconColor\" (click)=\"doIconSelect($event)\">\n <ion-icon [name]=\"icon\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (label) {\n <ion-label [class.selectable]=\"!disabled\">\n {{ label }}\n @if (obligatory && !disabled) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-avatar slot=\"end\" class=\"colorCircle\" [style.background-color]=\"current\" />\n @if (!disabled) {\n <ion-icon slot=\"end\" name=\"caret-down\" class=\"selectIcon\" [class.selectable]=\"!disabled\" />\n }\n</ion-item>\n", styles: [".colorPickerItem{min-height:48px;height:auto}.colorPickerItem .placeholder{color:var(--ion-color-medium)}.colorPickerItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.selectItem.withLabel{min-height:58px;height:auto}.selectItem.withLabel .selectIcon{padding-top:25px}.selectItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}ion-avatar.colorCircle{width:20px;height:20px}\n"] }]
47
+ }], propDecorators: { colors: [{
48
+ type: Input
49
+ }], current: [{
50
+ type: Input
51
+ }], label: [{
52
+ type: Input
53
+ }], placeholder: [{
54
+ type: Input
55
+ }], icon: [{
56
+ type: Input
57
+ }], iconColor: [{
58
+ type: Input
59
+ }], disabled: [{
60
+ type: Input
61
+ }], obligatory: [{
62
+ type: Input
63
+ }], lines: [{
64
+ type: Input
65
+ }], color: [{
66
+ type: Input
67
+ }], select: [{
68
+ type: Output
69
+ }], iconSelect: [{
70
+ type: Output
71
+ }] } });
72
+ /**
73
+ * Component to open in a popover for displaying the colors available.
74
+ */
75
+ export class ColorsPaletteComponent {
76
+ constructor() {
77
+ this._popover = inject(PopoverController);
78
+ }
79
+ pick(color) {
80
+ this._popover.dismiss(color);
81
+ }
82
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: ColorsPaletteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
83
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: ColorsPaletteComponent, selector: "idea-colors-palette", inputs: { colors: "colors", current: "current" }, ngImport: i0, template: `
84
+ <ion-content>
85
+ <ion-grid>
86
+ <ion-row>
87
+ @for (c of colors; track c) {
88
+ <ion-col [size]="2">
89
+ <ion-avatar
90
+ class="colorCircle tappable"
91
+ [style.background-color]="c.hex"
92
+ [title]="c.name || c.hex"
93
+ (click)="pick(c.hex)"
94
+ >
95
+ @if (c.hex === current) {
96
+ <ion-icon name="checkmark" />
97
+ }
98
+ </ion-avatar>
99
+ </ion-col>
100
+ }
101
+ </ion-row>
102
+ </ion-grid>
103
+ </ion-content>
104
+ `, isInline: true, styles: ["ion-content{--background: var(--ion-color-white)}ion-avatar.colorCircle{width:20px;height:20px}.tappable{cursor:pointer}ion-avatar.colorCircle ion-icon{color:#fff;font-size:1.2em}\n"], dependencies: [{ kind: "component", type: i1.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }] }); }
105
+ }
106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: ColorsPaletteComponent, decorators: [{
107
+ type: Component,
108
+ args: [{ selector: 'idea-colors-palette', template: `
109
+ <ion-content>
110
+ <ion-grid>
111
+ <ion-row>
112
+ @for (c of colors; track c) {
113
+ <ion-col [size]="2">
114
+ <ion-avatar
115
+ class="colorCircle tappable"
116
+ [style.background-color]="c.hex"
117
+ [title]="c.name || c.hex"
118
+ (click)="pick(c.hex)"
119
+ >
120
+ @if (c.hex === current) {
121
+ <ion-icon name="checkmark" />
122
+ }
123
+ </ion-avatar>
124
+ </ion-col>
125
+ }
126
+ </ion-row>
127
+ </ion-grid>
128
+ </ion-content>
129
+ `, styles: ["ion-content{--background: var(--ion-color-white)}ion-avatar.colorCircle{width:20px;height:20px}.tappable{cursor:pointer}ion-avatar.colorCircle ion-icon{color:#fff;font-size:1.2em}\n"] }]
130
+ }], propDecorators: { colors: [{
131
+ type: Input
132
+ }], current: [{
133
+ type: Input
134
+ }] } });
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3JQaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvY29sb3JzL2NvbG9yUGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvdW5jb21tb24vc3JjL2NvbG9ycy9jb2xvclBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQVMsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7QUFFN0M7O0dBRUc7QUFNSCxNQUFNLE9BQU8sd0JBQXdCO0lBTHJDO1FBTUU7O1dBRUc7UUFDTSxXQUFNLEdBQVksTUFBTSxDQUFDO1FBcUNsQzs7V0FFRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzlDOztXQUVHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFeEMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0tBaUI5QztJQWZDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBVTtRQUMxQixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUUxQixNQUFNLGNBQWMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJO2dCQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVU7UUFDckIsSUFBSSxLQUFLO1lBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7OEdBbEVVLHdCQUF3QjtrR0FBeEIsd0JBQXdCLHNVQ1pyQywrMEJBMkJBOzsyRkRmYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsbUJBQW1COzhCQVFwQixNQUFNO3NCQUFkLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLO2dCQUlHLEtBQUs7c0JBQWIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsVUFBVTtzQkFBbEIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsS0FBSztzQkFBYixLQUFLO2dCQUlJLE1BQU07c0JBQWYsTUFBTTtnQkFJRyxVQUFVO3NCQUFuQixNQUFNOztBQXFCVDs7R0FFRztBQTRDSCxNQUFNLE9BQU8sc0JBQXNCO0lBM0NuQztRQTRDVSxhQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FjOUM7SUFIQyxJQUFJLENBQUMsS0FBYTtRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDOzhHQWRVLHNCQUFzQjtrR0FBdEIsc0JBQXNCLDZHQXpDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVDs7MkZBb0JVLHNCQUFzQjtrQkEzQ2xDLFNBQVM7K0JBQ0UscUJBQXFCLFlBQ3JCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQlQ7OEJBMEJRLE1BQU07c0JBQWQsS0FBSztnQkFJRyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IENvbG9yLCBDT0xPUlMgfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuXG4vKipcbiAqIFBpY2sgYSBjb2xvciBmcm9tIGEgZGVmaW5lZCBzZXQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lkZWEtY29sb3ItcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICdjb2xvclBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydjb2xvclBpY2tlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIElERUFDb2xvclBpY2tlckNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUaGUgcGlja2FibGUgY29sb3JzLlxuICAgKi9cbiAgQElucHV0KCkgY29sb3JzOiBDb2xvcltdID0gQ09MT1JTO1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgY29sb3IuXG4gICAqL1xuICBASW5wdXQoKSBjdXJyZW50OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHBsYWNlaG9sZGVyIGZvciB0aGUgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGljb24gZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIGljb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgaWNvbi5cbiAgICovXG4gIEBJbnB1dCgpIGljb25Db2xvcjogc3RyaW5nO1xuICAvKipcbiAgICogSWYgdHJ1ZSwgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogSWYgdHJ1ZSwgdGhlIG9ibGlnYXRvcnkgZG90IGlzIHNob3duLlxuICAgKi9cbiAgQElucHV0KCkgb2JsaWdhdG9yeTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIExpbmVzIHByZWZlcmVuY2VzIGZvciB0aGUgaXRlbS5cbiAgICovXG4gIEBJbnB1dCgpIGxpbmVzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29sb3IgZm9yIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBjb2xvcjogc3RyaW5nO1xuICAvKipcbiAgICogT24gc2VsZWN0IGV2ZW50LlxuICAgKi9cbiAgQE91dHB1dCgpIHNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKipcbiAgICogSWNvbiBzZWxlY3QuXG4gICAqL1xuICBAT3V0cHV0KCkgaWNvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIF9wb3BvdmVyID0gaW5qZWN0KFBvcG92ZXJDb250cm9sbGVyKTtcblxuICBhc3luYyBvcGVuUGFsZXR0ZShldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbXBvbmVudFByb3BzID0geyBjb2xvcnM6IHRoaXMuY29sb3JzLCBjdXJyZW50OiB0aGlzLmN1cnJlbnQgfTtcbiAgICBjb25zdCBwb3BvdmVyID0gYXdhaXQgdGhpcy5fcG9wb3Zlci5jcmVhdGUoeyBjb21wb25lbnQ6IENvbG9yc1BhbGV0dGVDb21wb25lbnQsIGNvbXBvbmVudFByb3BzLCBldmVudCB9KTtcbiAgICBwb3BvdmVyLm9uRGlkRGlzbWlzcygpLnRoZW4ocmVzID0+IHtcbiAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHRoaXMuc2VsZWN0LmVtaXQocmVzLmRhdGEpO1xuICAgIH0pO1xuICAgIHBvcG92ZXIucHJlc2VudCgpO1xuICB9XG5cbiAgZG9JY29uU2VsZWN0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaWNvblNlbGVjdC5lbWl0KGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBvbmVudCB0byBvcGVuIGluIGEgcG9wb3ZlciBmb3IgZGlzcGxheWluZyB0aGUgY29sb3JzIGF2YWlsYWJsZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWRlYS1jb2xvcnMtcGFsZXR0ZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1jb250ZW50PlxuICAgICAgPGlvbi1ncmlkPlxuICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICBAZm9yIChjIG9mIGNvbG9yczsgdHJhY2sgYykge1xuICAgICAgICAgICAgPGlvbi1jb2wgW3NpemVdPVwiMlwiPlxuICAgICAgICAgICAgICA8aW9uLWF2YXRhclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sb3JDaXJjbGUgdGFwcGFibGVcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImMuaGV4XCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiYy5uYW1lIHx8IGMuaGV4XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicGljayhjLmhleClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChjLmhleCA9PT0gY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGVja21hcmtcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9pb24tYXZhdGFyPlxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tZ3JpZD5cbiAgICA8L2lvbi1jb250ZW50PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICBpb24tY29udGVudCB7XG4gICAgICAgIC0tYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXdoaXRlKTtcbiAgICAgIH1cbiAgICAgIGlvbi1hdmF0YXIuY29sb3JDaXJjbGUge1xuICAgICAgICB3aWR0aDogMjBweDtcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgfVxuICAgICAgLnRhcHBhYmxlIHtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgfVxuICAgICAgaW9uLWF2YXRhci5jb2xvckNpcmNsZSBpb24taWNvbiB7XG4gICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgICAgZm9udC1zaXplOiAxLjJlbTtcbiAgICAgIH1cbiAgICBgXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JzUGFsZXR0ZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgX3BvcG92ZXIgPSBpbmplY3QoUG9wb3ZlckNvbnRyb2xsZXIpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGlja2FibGUgY29sb3JzLlxuICAgKi9cbiAgQElucHV0KCkgY29sb3JzOiBDb2xvcltdO1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgY29sb3IuXG4gICAqL1xuICBASW5wdXQoKSBjdXJyZW50OiBzdHJpbmc7XG5cbiAgcGljayhjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcG9wb3Zlci5kaXNtaXNzKGNvbG9yKTtcbiAgfVxufVxuIiwiPGlvbi1pdGVtXG4gIGNsYXNzPVwiY29sb3JQaWNrZXJJdGVtXCJcbiAgW2NvbG9yXT1cImNvbG9yXCJcbiAgW2xpbmVzXT1cImxpbmVzXCJcbiAgW2J1dHRvbl09XCIhZGlzYWJsZWRcIlxuICBbdGl0bGVdPVwicGxhY2Vob2xkZXIgfHwgJydcIlxuICBbY2xhc3Mud2l0aExhYmVsXT1cImxhYmVsXCJcbiAgKGNsaWNrKT1cIm9wZW5QYWxldHRlKCRldmVudClcIlxuPlxuICBAaWYgKGljb24pIHtcbiAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzbG90PVwic3RhcnRcIiBbY29sb3JdPVwiaWNvbkNvbG9yXCIgKGNsaWNrKT1cImRvSWNvblNlbGVjdCgkZXZlbnQpXCI+XG4gICAgICA8aW9uLWljb24gW25hbWVdPVwiaWNvblwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgIDwvaW9uLWJ1dHRvbj5cbiAgfVxuICBAaWYgKGxhYmVsKSB7XG4gICAgPGlvbi1sYWJlbCBbY2xhc3Muc2VsZWN0YWJsZV09XCIhZGlzYWJsZWRcIj5cbiAgICAgIHt7IGxhYmVsIH19XG4gICAgICBAaWYgKG9ibGlnYXRvcnkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIDxpb24tdGV4dCBjbGFzcz1cIm9ibGlnYXRvcnlEb3RcIiAvPlxuICAgICAgfVxuICAgIDwvaW9uLWxhYmVsPlxuICB9XG4gIDxpb24tYXZhdGFyIHNsb3Q9XCJlbmRcIiBjbGFzcz1cImNvbG9yQ2lyY2xlXCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY3VycmVudFwiIC8+XG4gIEBpZiAoIWRpc2FibGVkKSB7XG4gICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwiY2FyZXQtZG93blwiIGNsYXNzPVwic2VsZWN0SWNvblwiIFtjbGFzcy5zZWxlY3RhYmxlXT1cIiFkaXNhYmxlZFwiIC8+XG4gIH1cbjwvaW9uLWl0ZW0+XG4iXX0=
@@ -0,0 +1,20 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { IonicModule } from '@ionic/angular';
5
+ import { ColorsPaletteComponent, IDEAColorPickerComponent } from './colorPicker.component';
6
+ import * as i0 from "@angular/core";
7
+ export class IDEAColorPickerModule {
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
9
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerModule, declarations: [IDEAColorPickerComponent, ColorsPaletteComponent], imports: [CommonModule, FormsModule, IonicModule], exports: [IDEAColorPickerComponent, ColorsPaletteComponent] }); }
10
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerModule, imports: [CommonModule, FormsModule, IonicModule] }); }
11
+ }
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAColorPickerModule, decorators: [{
13
+ type: NgModule,
14
+ args: [{
15
+ imports: [CommonModule, FormsModule, IonicModule],
16
+ declarations: [IDEAColorPickerComponent, ColorsPaletteComponent],
17
+ exports: [IDEAColorPickerComponent, ColorsPaletteComponent]
18
+ }]
19
+ }] });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3JQaWNrZXIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvY29sb3JzL2NvbG9yUGlja2VyLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQU8zRixNQUFNLE9BQU8scUJBQXFCOzhHQUFyQixxQkFBcUI7K0dBQXJCLHFCQUFxQixpQkFIakIsd0JBQXdCLEVBQUUsc0JBQXNCLGFBRHJELFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxhQUV0Qyx3QkFBd0IsRUFBRSxzQkFBc0I7K0dBRS9DLHFCQUFxQixZQUp0QixZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVc7OzJGQUlyQyxxQkFBcUI7a0JBTGpDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUM7b0JBQ2pELFlBQVksRUFBRSxDQUFDLHdCQUF3QixFQUFFLHNCQUFzQixDQUFDO29CQUNoRSxPQUFPLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQztpQkFDNUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uaWNNb2R1bGUgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5cbmltcG9ydCB7IENvbG9yc1BhbGV0dGVDb21wb25lbnQsIElERUFDb2xvclBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vY29sb3JQaWNrZXIuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIElvbmljTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbSURFQUNvbG9yUGlja2VyQ29tcG9uZW50LCBDb2xvcnNQYWxldHRlQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW0lERUFDb2xvclBpY2tlckNvbXBvbmVudCwgQ29sb3JzUGFsZXR0ZUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgSURFQUNvbG9yUGlja2VyTW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,64 @@
1
+ import { Component, Input, inject } from '@angular/core';
2
+ import { AlertController } from '@ionic/angular';
3
+ import { Contacts } from 'idea-toolbox';
4
+ import { IDEATranslationsService } from '@idea-ionic/common';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "@ionic/angular";
8
+ import * as i3 from "@idea-ionic/common";
9
+ export class IDEAContactsComponent {
10
+ constructor() {
11
+ this._alert = inject(AlertController);
12
+ this._translate = inject(IDEATranslationsService);
13
+ /**
14
+ * The contacts to manage.
15
+ */
16
+ this.contacts = new Contacts();
17
+ /**
18
+ * If true, show the field `name`.
19
+ */
20
+ this.showName = false;
21
+ /**
22
+ * Whether the fields are editable or disabled.
23
+ */
24
+ this.editMode = true;
25
+ }
26
+ sendEmail() {
27
+ if (!this.contacts.email)
28
+ return;
29
+ const url = `mailto:${this.contacts.email}`;
30
+ this.preExternalAction(this.contacts.email, () => window.open(url, '_system'));
31
+ }
32
+ call() {
33
+ if (!this.contacts.phone)
34
+ return;
35
+ const url = `tel:${this.contacts.phone}`;
36
+ this.preExternalAction(this.contacts.phone, () => window.open(url, '_system'));
37
+ }
38
+ preExternalAction(message, cb) {
39
+ const header = this._translate._('COMMON.DO_YOU_WANT_TO_PROCEED');
40
+ const buttons = [
41
+ { text: this._translate._('COMMON.CANCEL') },
42
+ { text: this._translate._('COMMON.CONFIRM'), handler: () => cb() }
43
+ ];
44
+ const cssClass = 'selectableAlertMessage';
45
+ this._alert.create({ header, message, buttons, cssClass }).then(alert => alert.present());
46
+ }
47
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
48
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: IDEAContactsComponent, selector: "idea-contacts", inputs: { contacts: "contacts", showName: "showName", editMode: "editMode", lines: "lines", color: "color" }, ngImport: i0, template: "<div class=\"contacts\">\n @if (showName) {\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.NAME' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [(ngModel)]=\"contacts.name\"\n />\n </ion-item>\n }\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.PHONE' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [(ngModel)]=\"contacts.phone\"\n />\n @if (!editMode) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.CALL' | translate\"\n (click)=\"call()\"\n >\n <ion-icon name=\"call\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [(ngModel)]=\"contacts.email\"\n />\n @if (!editMode) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.SEND_EMAIL' | translate\"\n (click)=\"sendEmail()\"\n >\n <ion-icon name=\"mail\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n</div>\n", styles: [".marginTop{margin-top:14px}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }] }); }
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsComponent, decorators: [{
51
+ type: Component,
52
+ args: [{ selector: 'idea-contacts', template: "<div class=\"contacts\">\n @if (showName) {\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.NAME' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [(ngModel)]=\"contacts.name\"\n />\n </ion-item>\n }\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.PHONE' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [(ngModel)]=\"contacts.phone\"\n />\n @if (!editMode) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.CALL' | translate\"\n (click)=\"call()\"\n >\n <ion-icon name=\"call\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n <ion-item [lines]=\"lines\" [color]=\"color\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL' | translate\"\n [disabled]=\"!editMode\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [(ngModel)]=\"contacts.email\"\n />\n @if (!editMode) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.SEND_EMAIL' | translate\"\n (click)=\"sendEmail()\"\n >\n <ion-icon name=\"mail\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n</div>\n", styles: [".marginTop{margin-top:14px}\n"] }]
53
+ }], propDecorators: { contacts: [{
54
+ type: Input
55
+ }], showName: [{
56
+ type: Input
57
+ }], editMode: [{
58
+ type: Input
59
+ }], lines: [{
60
+ type: Input
61
+ }], color: [{
62
+ type: Input
63
+ }] } });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvY29udGFjdHMvY29udGFjdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvY29udGFjdHMvY29udGFjdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7OztBQU83RCxNQUFNLE9BQU8scUJBQXFCO0lBTGxDO1FBTVUsV0FBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxlQUFVLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFckQ7O1dBRUc7UUFDTSxhQUFRLEdBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUM3Qzs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDMUI7O1dBRUc7UUFDTSxhQUFRLEdBQUcsSUFBSSxDQUFDO0tBOEIxQjtJQXBCQyxTQUFTO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSztZQUFFLE9BQU87UUFDakMsTUFBTSxHQUFHLEdBQUcsVUFBVSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFDRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSztZQUFFLE9BQU87UUFDakMsTUFBTSxHQUFHLEdBQUcsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsRUFBYztRQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sT0FBTyxHQUFHO1lBQ2QsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDNUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7U0FDekUsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDOzhHQTVDVSxxQkFBcUI7a0dBQXJCLHFCQUFxQixtS0NWbEMsdTlEQTZEQTs7MkZEbkRhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxlQUFlOzhCQVdoQixRQUFRO3NCQUFoQixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBDb250YWN0cyB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQgeyBJREVBVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lkZWEtY29udGFjdHMnLFxuICB0ZW1wbGF0ZVVybDogJ2NvbnRhY3RzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2NvbnRhY3RzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSURFQUNvbnRhY3RzQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfYWxlcnQgPSBpbmplY3QoQWxlcnRDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfdHJhbnNsYXRlID0gaW5qZWN0KElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlKTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhY3RzIHRvIG1hbmFnZS5cbiAgICovXG4gIEBJbnB1dCgpIGNvbnRhY3RzOiBDb250YWN0cyA9IG5ldyBDb250YWN0cygpO1xuICAvKipcbiAgICogSWYgdHJ1ZSwgc2hvdyB0aGUgZmllbGQgYG5hbWVgLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd05hbWUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkcyBhcmUgZWRpdGFibGUgb3IgZGlzYWJsZWQuXG4gICAqL1xuICBASW5wdXQoKSBlZGl0TW9kZSA9IHRydWU7XG4gIC8qKlxuICAgKiBUaGUgbGluZXMgYXR0cmlidXRlIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgQElucHV0KCkgbGluZXM6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb2xvciBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGNvbG9yOiBzdHJpbmc7XG5cbiAgc2VuZEVtYWlsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250YWN0cy5lbWFpbCkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IGBtYWlsdG86JHt0aGlzLmNvbnRhY3RzLmVtYWlsfWA7XG4gICAgdGhpcy5wcmVFeHRlcm5hbEFjdGlvbih0aGlzLmNvbnRhY3RzLmVtYWlsLCAoKTogV2luZG93ID0+IHdpbmRvdy5vcGVuKHVybCwgJ19zeXN0ZW0nKSk7XG4gIH1cbiAgY2FsbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udGFjdHMucGhvbmUpIHJldHVybjtcbiAgICBjb25zdCB1cmwgPSBgdGVsOiR7dGhpcy5jb250YWN0cy5waG9uZX1gO1xuICAgIHRoaXMucHJlRXh0ZXJuYWxBY3Rpb24odGhpcy5jb250YWN0cy5waG9uZSwgKCk6IFdpbmRvdyA9PiB3aW5kb3cub3Blbih1cmwsICdfc3lzdGVtJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVFeHRlcm5hbEFjdGlvbihtZXNzYWdlOiBzdHJpbmcsIGNiOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5ET19ZT1VfV0FOVF9UT19QUk9DRUVEJyk7XG4gICAgY29uc3QgYnV0dG9ucyA9IFtcbiAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5DQU5DRUwnKSB9LFxuICAgICAgeyB0ZXh0OiB0aGlzLl90cmFuc2xhdGUuXygnQ09NTU9OLkNPTkZJUk0nKSwgaGFuZGxlcjogKCk6IHZvaWQgPT4gY2IoKSB9XG4gICAgXTtcbiAgICBjb25zdCBjc3NDbGFzcyA9ICdzZWxlY3RhYmxlQWxlcnRNZXNzYWdlJztcbiAgICB0aGlzLl9hbGVydC5jcmVhdGUoeyBoZWFkZXIsIG1lc3NhZ2UsIGJ1dHRvbnMsIGNzc0NsYXNzIH0pLnRoZW4oYWxlcnQgPT4gYWxlcnQucHJlc2VudCgpKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhY3RzXCI+XG4gIEBpZiAoc2hvd05hbWUpIHtcbiAgICA8aW9uLWl0ZW0gW2xpbmVzXT1cImxpbmVzXCIgW2NvbG9yXT1cImNvbG9yXCI+XG4gICAgICA8aW9uLWlucHV0XG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm5ld1wiXG4gICAgICAgIGxhYmVsUGxhY2VtZW50PVwic3RhY2tlZFwiXG4gICAgICAgIFtsYWJlbF09XCInSURFQV9VTkNPTU1PTi5DT05UQUNUUy5OQU1FJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0lERUFfVU5DT01NT04uQ09OVEFDVFMuTkFNRV9ISU5UJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5DT05UQUNUUy5OQU1FX0hJTlQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJjb250YWN0cy5uYW1lXCJcbiAgICAgIC8+XG4gICAgPC9pb24taXRlbT5cbiAgfVxuICA8aW9uLWl0ZW0gW2xpbmVzXT1cImxpbmVzXCIgW2NvbG9yXT1cImNvbG9yXCI+XG4gICAgPGlvbi1pbnB1dFxuICAgICAgYXV0b2NvbXBsZXRlPVwibmV3XCJcbiAgICAgIGxhYmVsUGxhY2VtZW50PVwic3RhY2tlZFwiXG4gICAgICBbbGFiZWxdPVwiJ0lERUFfVU5DT01NT04uQ09OVEFDVFMuUEhPTkUnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIidJREVBX1VOQ09NTU9OLkNPTlRBQ1RTLlBIT05FX0hJTlQnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5DT05UQUNUUy5QSE9ORV9ISU5UJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbKG5nTW9kZWwpXT1cImNvbnRhY3RzLnBob25lXCJcbiAgICAvPlxuICAgIEBpZiAoIWVkaXRNb2RlKSB7XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBzbG90PVwiZW5kXCJcbiAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgY2xhc3M9XCJtYXJnaW5Ub3BcIlxuICAgICAgICBbdGl0bGVdPVwiJ0lERUFfVU5DT01NT04uQ09OVEFDVFMuQ0FMTCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAoY2xpY2spPVwiY2FsbCgpXCJcbiAgICAgID5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjYWxsXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgfVxuICA8L2lvbi1pdGVtPlxuICA8aW9uLWl0ZW0gW2xpbmVzXT1cImxpbmVzXCIgW2NvbG9yXT1cImNvbG9yXCI+XG4gICAgPGlvbi1pbnB1dFxuICAgICAgYXV0b2NvbXBsZXRlPVwibmV3XCJcbiAgICAgIGxhYmVsUGxhY2VtZW50PVwic3RhY2tlZFwiXG4gICAgICBbbGFiZWxdPVwiJ0lERUFfVU5DT01NT04uQ09OVEFDVFMuRU1BSUwnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIidJREVBX1VOQ09NTU9OLkNPTlRBQ1RTLkVNQUlMX0hJTlQnIHwgdHJhbnNsYXRlXCJcbiAgICAgIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5DT05UQUNUUy5FTUFJTF9ISU5UJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbKG5nTW9kZWwpXT1cImNvbnRhY3RzLmVtYWlsXCJcbiAgICAvPlxuICAgIEBpZiAoIWVkaXRNb2RlKSB7XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBzbG90PVwiZW5kXCJcbiAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgY2xhc3M9XCJtYXJnaW5Ub3BcIlxuICAgICAgICBbdGl0bGVdPVwiJ0lERUFfVU5DT01NT04uQ09OVEFDVFMuU0VORF9FTUFJTCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAoY2xpY2spPVwic2VuZEVtYWlsKClcIlxuICAgICAgPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cIm1haWxcIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICB9XG4gIDwvaW9uLWl0ZW0+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,21 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { IonicModule } from '@ionic/angular';
5
+ import { IDEASelectModule, IDEATranslationsModule } from '@idea-ionic/common';
6
+ import { IDEAContactsComponent } from './contacts.component';
7
+ import * as i0 from "@angular/core";
8
+ export class IDEAContactsModule {
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsModule, declarations: [IDEAContactsComponent], imports: [CommonModule, FormsModule, IonicModule, IDEATranslationsModule, IDEASelectModule], exports: [IDEAContactsComponent] }); }
11
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsModule, imports: [CommonModule, FormsModule, IonicModule, IDEATranslationsModule, IDEASelectModule] }); }
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAContactsModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ imports: [CommonModule, FormsModule, IonicModule, IDEATranslationsModule, IDEASelectModule],
17
+ declarations: [IDEAContactsComponent],
18
+ exports: [IDEAContactsComponent]
19
+ }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdHMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvY29udGFjdHMvY29udGFjdHMubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBTzdELE1BQU0sT0FBTyxrQkFBa0I7OEdBQWxCLGtCQUFrQjsrR0FBbEIsa0JBQWtCLGlCQUhkLHFCQUFxQixhQUQxQixZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxnQkFBZ0IsYUFFaEYscUJBQXFCOytHQUVwQixrQkFBa0IsWUFKbkIsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCOzsyRkFJL0Usa0JBQWtCO2tCQUw5QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixDQUFDO29CQUMzRixZQUFZLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDckMsT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUM7aUJBQ2pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbmljTW9kdWxlIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgSURFQVNlbGVjdE1vZHVsZSwgSURFQVRyYW5zbGF0aW9uc01vZHVsZSB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbmltcG9ydCB7IElERUFDb250YWN0c0NvbXBvbmVudCB9IGZyb20gJy4vY29udGFjdHMuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIElvbmljTW9kdWxlLCBJREVBVHJhbnNsYXRpb25zTW9kdWxlLCBJREVBU2VsZWN0TW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbSURFQUNvbnRhY3RzQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW0lERUFDb250YWN0c0NvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgSURFQUNvbnRhY3RzTW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,196 @@
1
+ import { Component, Input, inject } from '@angular/core';
2
+ import { AlertController, ModalController } from '@ionic/angular';
3
+ import { IDEATranslationsService } from '@idea-ionic/common';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@ionic/angular";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "@idea-ionic/common";
8
+ /**
9
+ * A random sunday, used as reference to calculate the week days.
10
+ */
11
+ const SUNDAY = 259200000;
12
+ export class IDEACalendarPickerComponent {
13
+ constructor() {
14
+ this._modal = inject(ModalController);
15
+ this._alert = inject(AlertController);
16
+ this._translate = inject(IDEATranslationsService);
17
+ this.timePicker = false;
18
+ this.manualTimePicker = false;
19
+ this.hideClearButton = false;
20
+ }
21
+ ngOnInit() {
22
+ this.today = new Date();
23
+ this.refDate = this.inputDate ? new Date(this.inputDate) : new Date(this.today);
24
+ this.selectedDate = new Date(this.refDate);
25
+ this.hour = 12; // to endure timezones
26
+ this.minute = 0;
27
+ if (this.timePicker || this.manualTimePicker) {
28
+ this.hour = this.selectedDate.getHours();
29
+ if (this.manualTimePicker)
30
+ this.minute = this.selectedDate.getMinutes();
31
+ else {
32
+ // round the minutes a multiple of 5
33
+ this.minute = Math.ceil(this.selectedDate.getMinutes() / 5) * 5;
34
+ this.selectedDate.setMinutes(this.minute);
35
+ }
36
+ }
37
+ this.buildCalendarGrid(this.refDate);
38
+ this.hours = Array.from(Array(24).keys()).map(i => '0'.concat(i.toString()).slice(-2));
39
+ this.minutes = Array.from(Array(12).keys()).map(i => '0'.concat((i * 5).toString()).slice(-2));
40
+ // build the weekdays based on the current locale
41
+ this.weekDays = new Array();
42
+ const refDateForWeekDays = new Date(SUNDAY);
43
+ refDateForWeekDays.setDate(refDateForWeekDays.getDate() - this.getLocalisedDay(refDateForWeekDays));
44
+ for (let i = 0; i < 7; i++) {
45
+ this.weekDays.push(refDateForWeekDays.toLocaleDateString(this._translate.getCurrentLang(), { weekday: 'short' }));
46
+ refDateForWeekDays.setDate(refDateForWeekDays.getDate() + 1);
47
+ }
48
+ if (this.min)
49
+ this.dateMin = new Date(this.min);
50
+ if (this.max)
51
+ this.dateMax = new Date(this.max);
52
+ }
53
+ getLocalisedDay(date) {
54
+ let n = date.getDay();
55
+ switch (this._translate.getCurrentLang()) {
56
+ case 'it':
57
+ n = --n < 0 ? 6 : n;
58
+ break;
59
+ }
60
+ return n;
61
+ }
62
+ buildCalendarGrid(refDate) {
63
+ // find the first day in the month: the important data here is the day of the week
64
+ const firstDateOfMonth = new Date(refDate.getFullYear(), refDate.getMonth(), 1);
65
+ // the following flag is used to divide the logic so I can fill the calendar
66
+ // also with the dates from the previous month, until there's space in the grid
67
+ let haventFoundFirstDay = true;
68
+ // index used to build the dates of the month, starting from the first one
69
+ let index = 1;
70
+ this.calendarGrid = new Array();
71
+ for (let i = 0; i < 6; i++) {
72
+ this.calendarGrid[i] = new Array();
73
+ for (let j = 0; j < 7; j++) {
74
+ if (haventFoundFirstDay) {
75
+ if (this.getLocalisedDay(firstDateOfMonth) === j) {
76
+ // note: considers Sunday
77
+ haventFoundFirstDay = false;
78
+ this.calendarGrid[i][j] = new Date(firstDateOfMonth);
79
+ // now the I've found the first date of the month I can fill the calendar
80
+ // the dates fromt the previous month, until there's space in the grid
81
+ for (let y = this.getLocalisedDay(firstDateOfMonth); y >= 0; y--) {
82
+ const d = new Date(firstDateOfMonth);
83
+ d.setDate(firstDateOfMonth.getDate() - y);
84
+ this.calendarGrid[i][this.getLocalisedDay(firstDateOfMonth) - y] = d;
85
+ }
86
+ }
87
+ }
88
+ else {
89
+ // fill the following dates until there's space in the grid
90
+ const d = new Date(firstDateOfMonth);
91
+ d.setDate(firstDateOfMonth.getDate() + index++);
92
+ this.calendarGrid[i][j] = d;
93
+ }
94
+ }
95
+ }
96
+ }
97
+ addYears(offset) {
98
+ this.refDate.setFullYear(this.refDate.getFullYear() + offset);
99
+ this.buildCalendarGrid(this.refDate);
100
+ }
101
+ setYear(year) {
102
+ if (!year)
103
+ return;
104
+ this.refDate.setFullYear(Number(year));
105
+ this.buildCalendarGrid(this.refDate);
106
+ }
107
+ addMonths(offset) {
108
+ this.refDate.setMonth(this.refDate.getMonth() + offset);
109
+ this.buildCalendarGrid(this.refDate);
110
+ }
111
+ async showMonths() {
112
+ const buttons = [];
113
+ const inputs = [];
114
+ const month = new Date(0);
115
+ for (let i = 1; i <= 12; i++) {
116
+ inputs.push({
117
+ type: 'radio',
118
+ label: month.toLocaleDateString(this._translate.getCurrentLang(), { month: 'long' }),
119
+ value: i.toString(),
120
+ checked: i === this.refDate.getMonth() + 1
121
+ });
122
+ month.setMonth(month.getMonth() + 1);
123
+ }
124
+ buttons.push({ text: this._translate._('COMMON.CANCEL'), role: 'cancel' });
125
+ buttons.push({
126
+ text: this._translate._('COMMON.SELECT'),
127
+ handler: (m) => {
128
+ this.refDate.setMonth(parseInt(m, 10) - 1);
129
+ this.buildCalendarGrid(this.refDate);
130
+ }
131
+ });
132
+ const alert = await this._alert.create({
133
+ header: this._translate._('IDEA_UNCOMMON.CALENDAR.MONTH'),
134
+ buttons,
135
+ inputs
136
+ });
137
+ alert.present();
138
+ }
139
+ isDateSelectable(date) {
140
+ if (this.dateMin && date < this.dateMin)
141
+ return false;
142
+ if (this.dateMax && date > this.dateMax)
143
+ return false;
144
+ return true;
145
+ }
146
+ selectDate(date) {
147
+ this.selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), this.hour, this.minute);
148
+ }
149
+ selectHour(hour) {
150
+ this.hour = Number(hour);
151
+ this.selectedDate.setHours(this.hour);
152
+ }
153
+ selectMinute(minute) {
154
+ this.minute = Number(minute);
155
+ this.selectedDate.setMinutes(this.minute);
156
+ }
157
+ isSameDay(a, b) {
158
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
159
+ }
160
+ isSameMonth(a, b) {
161
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
162
+ }
163
+ isSameHour(hour) {
164
+ return this.selectedDate.getHours() === Number(hour);
165
+ }
166
+ isSameMinute(minute) {
167
+ return this.selectedDate.getMinutes() === Number(minute);
168
+ }
169
+ save(reset) {
170
+ this._modal.dismiss(reset ? '' : this.selectedDate);
171
+ }
172
+ close() {
173
+ this._modal.dismiss();
174
+ }
175
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
176
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: IDEACalendarPickerComponent, selector: "idea-calendar-picker", inputs: { inputDate: "inputDate", timePicker: "timePicker", manualTimePicker: "manualTimePicker", title: "title", hideClearButton: "hideClearButton", min: "min", max: "max" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n @if (!hideClearButton) {\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.RESET' | translate\" (click)=\"save(true)\">\n <ion-icon slot=\"icon-only\" name=\"arrow-undo\" />\n </ion-button>\n }\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon slot=\"icon-only\" name=\"close\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid fixed class=\"ion-no-padding\">\n <ion-row>\n <h1 class=\"headerLabel\">{{ 'IDEA_UNCOMMON.CALENDAR.SET_DATE' | translate }}</h1>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\">\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"5\">\n <ion-row class=\"ion-align-items-center ion-justify-content-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\">\n <ion-input\n type=\"text\"\n [placeholder]=\"'IDEA_UNCOMMON.CALENDAR.YEAR' | translate\"\n [value]=\"refDate.getFullYear()\"\n (ionFocus)=\"$event.target.value = ''\"\n (ionChange)=\"setYear($event?.target?.value)\"\n >\n </ion-input>\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"7\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\" (click)=\"showMonths()\">\n {{ refDate | dateLocale: 'MMMM' }}\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\" class=\"headerLabel\">\n @for (ddd of weekDays; track ddd) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n {{ ddd }}\n </ion-col>\n }\n </ion-row>\n @for (row of calendarGrid; track row; let i = $index) {\n <ion-row class=\"ion-align-items-center\">\n @for (col of row; track col; let j = $index) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"\n isSameDay(calendarGrid[i][j], today) || isSameDay(calendarGrid[i][j], selectedDate)\n ? 'primary'\n : isSameMonth(calendarGrid[i][j], refDate)\n ? 'dark'\n : 'medium'\n \"\n [fill]=\"\n isSameDay(calendarGrid[i][j], selectedDate)\n ? 'solid'\n : isSameDay(calendarGrid[i][j], today)\n ? 'outline'\n : 'clear'\n \"\n [disabled]=\"!isDateSelectable(calendarGrid[i][j])\"\n (click)=\"selectDate(calendarGrid[i][j])\"\n >\n {{ calendarGrid[i][j] | date: 'd' }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n @if (timePicker || manualTimePicker) {\n <ion-row>\n <h1 class=\"headerLabel\">\n {{ 'IDEA_UNCOMMON.CALENDAR.SET_TIME' | translate }}\n </h1>\n </ion-row>\n }\n @if (timePicker) {\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-no-padding\" [size]=\"7\">\n <ion-row>\n @for (hour of hours; track hour) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"2\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameHour(hour) ? 'primary' : 'dark'\"\n [fill]=\"isSameHour(hour) ? 'solid' : 'clear'\"\n (click)=\"selectHour(hour)\"\n >\n {{ hour }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"1\"> : </ion-col>\n <ion-col class=\"ion-no-padding\" [size]=\"4\">\n <ion-row>\n @for (minute of minutes; track minute) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"4\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameMinute(minute) ? 'primary' : 'dark'\"\n [fill]=\"isSameMinute(minute) ? 'solid' : 'clear'\"\n (click)=\"selectMinute(minute)\"\n >\n {{ minute }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n </ion-row>\n }\n @if (manualTimePicker) {\n <ion-row class=\"ion-align-items-center manualTimePicker\">\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <input type=\"number\" min=\"0\" max=\"23\" [value]=\"hour\" (change)=\"selectHour($event.target.value)\" />\n <span>:</span>\n <input type=\"number\" min=\"0\" max=\"59\" [value]=\"minute\" (change)=\"selectMinute($event.target.value)\" />\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-content>\n<ion-footer>\n <ion-toolbar color=\"ideaToolbar\" class=\"tappable\" (click)=\"save()\">\n <ion-title class=\"ion-text-center\">\n <ion-icon name=\"checkmark\" />\n </ion-title>\n </ion-toolbar>\n</ion-footer>\n", styles: ["ion-content{--background: var(--ion-color-white)}h1{margin:10px}.headerLabel{font-size:.7em;font-weight:700;text-transform:uppercase}ion-col,ion-button{font-size:.95em}ion-button{margin:3px 0}ion-footer ion-toolbar{--min-height: 40px}.tappable{cursor:pointer}.manualTimePicker{padding:20px}.manualTimePicker input[type=number],.manualTimePicker span{font-size:2.5em}.manualTimePicker input[type=number]{border:none;border-bottom:2px solid var(--ion-color-dark);text-align:center}.manualTimePicker span{padding-left:4px;padding-right:4px}\n"], dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }, { kind: "pipe", type: i3.IDEALocalizedDatePipe, name: "dateLocale" }] }); }
177
+ }
178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarPickerComponent, decorators: [{
179
+ type: Component,
180
+ args: [{ selector: 'idea-calendar-picker', template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n @if (!hideClearButton) {\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.RESET' | translate\" (click)=\"save(true)\">\n <ion-icon slot=\"icon-only\" name=\"arrow-undo\" />\n </ion-button>\n }\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon slot=\"icon-only\" name=\"close\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid fixed class=\"ion-no-padding\">\n <ion-row>\n <h1 class=\"headerLabel\">{{ 'IDEA_UNCOMMON.CALENDAR.SET_DATE' | translate }}</h1>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\">\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"5\">\n <ion-row class=\"ion-align-items-center ion-justify-content-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\">\n <ion-input\n type=\"text\"\n [placeholder]=\"'IDEA_UNCOMMON.CALENDAR.YEAR' | translate\"\n [value]=\"refDate.getFullYear()\"\n (ionFocus)=\"$event.target.value = ''\"\n (ionChange)=\"setYear($event?.target?.value)\"\n >\n </ion-input>\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"7\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\" (click)=\"showMonths()\">\n {{ refDate | dateLocale: 'MMMM' }}\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\" class=\"headerLabel\">\n @for (ddd of weekDays; track ddd) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n {{ ddd }}\n </ion-col>\n }\n </ion-row>\n @for (row of calendarGrid; track row; let i = $index) {\n <ion-row class=\"ion-align-items-center\">\n @for (col of row; track col; let j = $index) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"\n isSameDay(calendarGrid[i][j], today) || isSameDay(calendarGrid[i][j], selectedDate)\n ? 'primary'\n : isSameMonth(calendarGrid[i][j], refDate)\n ? 'dark'\n : 'medium'\n \"\n [fill]=\"\n isSameDay(calendarGrid[i][j], selectedDate)\n ? 'solid'\n : isSameDay(calendarGrid[i][j], today)\n ? 'outline'\n : 'clear'\n \"\n [disabled]=\"!isDateSelectable(calendarGrid[i][j])\"\n (click)=\"selectDate(calendarGrid[i][j])\"\n >\n {{ calendarGrid[i][j] | date: 'd' }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n @if (timePicker || manualTimePicker) {\n <ion-row>\n <h1 class=\"headerLabel\">\n {{ 'IDEA_UNCOMMON.CALENDAR.SET_TIME' | translate }}\n </h1>\n </ion-row>\n }\n @if (timePicker) {\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-no-padding\" [size]=\"7\">\n <ion-row>\n @for (hour of hours; track hour) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"2\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameHour(hour) ? 'primary' : 'dark'\"\n [fill]=\"isSameHour(hour) ? 'solid' : 'clear'\"\n (click)=\"selectHour(hour)\"\n >\n {{ hour }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"1\"> : </ion-col>\n <ion-col class=\"ion-no-padding\" [size]=\"4\">\n <ion-row>\n @for (minute of minutes; track minute) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"4\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameMinute(minute) ? 'primary' : 'dark'\"\n [fill]=\"isSameMinute(minute) ? 'solid' : 'clear'\"\n (click)=\"selectMinute(minute)\"\n >\n {{ minute }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n </ion-row>\n }\n @if (manualTimePicker) {\n <ion-row class=\"ion-align-items-center manualTimePicker\">\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <input type=\"number\" min=\"0\" max=\"23\" [value]=\"hour\" (change)=\"selectHour($event.target.value)\" />\n <span>:</span>\n <input type=\"number\" min=\"0\" max=\"59\" [value]=\"minute\" (change)=\"selectMinute($event.target.value)\" />\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-content>\n<ion-footer>\n <ion-toolbar color=\"ideaToolbar\" class=\"tappable\" (click)=\"save()\">\n <ion-title class=\"ion-text-center\">\n <ion-icon name=\"checkmark\" />\n </ion-title>\n </ion-toolbar>\n</ion-footer>\n", styles: ["ion-content{--background: var(--ion-color-white)}h1{margin:10px}.headerLabel{font-size:.7em;font-weight:700;text-transform:uppercase}ion-col,ion-button{font-size:.95em}ion-button{margin:3px 0}ion-footer ion-toolbar{--min-height: 40px}.tappable{cursor:pointer}.manualTimePicker{padding:20px}.manualTimePicker input[type=number],.manualTimePicker span{font-size:2.5em}.manualTimePicker input[type=number]{border:none;border-bottom:2px solid var(--ion-color-dark);text-align:center}.manualTimePicker span{padding-left:4px;padding-right:4px}\n"] }]
181
+ }], propDecorators: { inputDate: [{
182
+ type: Input
183
+ }], timePicker: [{
184
+ type: Input
185
+ }], manualTimePicker: [{
186
+ type: Input
187
+ }], title: [{
188
+ type: Input
189
+ }], hideClearButton: [{
190
+ type: Input
191
+ }], min: [{
192
+ type: Input
193
+ }], max: [{
194
+ type: Input
195
+ }] } });
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvZGF0ZVRpbWUvY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvZGF0ZVRpbWUvY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7O0FBRTdEOztHQUVHO0FBQ0gsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBT3pCLE1BQU0sT0FBTywyQkFBMkI7SUFMeEM7UUFNVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsZUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBRzVDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO0tBOEtsQztJQTlKQyxRQUFRO1FBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7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SUFFRCxJQUFJLENBQUMsS0FBZTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDOzhHQXRMVSwyQkFBMkI7a0dBQTNCLDJCQUEyQiw0T0NmeEMsNGpOQW9LQTs7MkZEckphLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSxzQkFBc0I7OEJBU3ZCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIsIE1vZGFsQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IGVwb2NoRGF0ZVRpbWUsIGVwb2NoSVNPU3RyaW5nIH0gZnJvbSAnaWRlYS10b29sYm94JztcbmltcG9ydCB7IElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuLyoqXG4gKiBBIHJhbmRvbSBzdW5kYXksIHVzZWQgYXMgcmVmZXJlbmNlIHRvIGNhbGN1bGF0ZSB0aGUgd2VlayBkYXlzLlxuICovXG5jb25zdCBTVU5EQVkgPSAyNTkyMDAwMDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lkZWEtY2FsZW5kYXItcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICdjYWxlbmRhclBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydjYWxlbmRhclBpY2tlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIElERUFDYWxlbmRhclBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgX21vZGFsID0gaW5qZWN0KE1vZGFsQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX2FsZXJ0ID0gaW5qZWN0KEFsZXJ0Q29udHJvbGxlcik7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG5cbiAgQElucHV0KCkgaW5wdXREYXRlOiBlcG9jaERhdGVUaW1lIHwgZXBvY2hJU09TdHJpbmc7XG4gIEBJbnB1dCgpIHRpbWVQaWNrZXIgPSBmYWxzZTtcbiAgQElucHV0KCkgbWFudWFsVGltZVBpY2tlciA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBoaWRlQ2xlYXJCdXR0b24gPSBmYWxzZTtcbiAgQElucHV0KCkgbWluOiBlcG9jaERhdGVUaW1lIHwgZXBvY2hJU09TdHJpbmc7XG4gIEBJbnB1dCgpIG1heDogZXBvY2hEYXRlVGltZSB8IGVwb2NoSVNPU3RyaW5nO1xuXG4gIHJlZkRhdGU6IERhdGU7XG4gIHNlbGVjdGVkRGF0ZTogRGF0ZTtcbiAgdG9kYXk6IERhdGU7XG4gIGNhbGVuZGFyR3JpZDogRGF0ZVtdW107XG4gIGhvdXI6IG51bWJlcjtcbiAgbWludXRlOiBudW1iZXI7XG4gIGhvdXJzOiBzdHJpbmdbXTtcbiAgbWludXRlczogc3RyaW5nW107XG4gIHdlZWtEYXlzOiBzdHJpbmdbXTtcbiAgZGF0ZU1pbjogRGF0ZTtcbiAgZGF0ZU1heDogRGF0ZTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLnJlZkRhdGUgPSB0aGlzLmlucHV0RGF0ZSA/IG5ldyBEYXRlKHRoaXMuaW5wdXREYXRlKSA6IG5ldyBEYXRlKHRoaXMudG9kYXkpO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbmV3IERhdGUodGhpcy5yZWZEYXRlKTtcbiAgICB0aGlzLmhvdXIgPSAxMjsgLy8gdG8gZW5kdXJlIHRpbWV6b25lc1xuICAgIHRoaXMubWludXRlID0gMDtcbiAgICBpZiAodGhpcy50aW1lUGlja2VyIHx8IHRoaXMubWFudWFsVGltZVBpY2tlcikge1xuICAgICAgdGhpcy5ob3VyID0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0SG91cnMoKTtcbiAgICAgIGlmICh0aGlzLm1hbnVhbFRpbWVQaWNrZXIpIHRoaXMubWludXRlID0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0TWludXRlcygpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIHJvdW5kIHRoZSBtaW51dGVzIGEgbXVsdGlwbGUgb2YgNVxuICAgICAgICB0aGlzLm1pbnV0ZSA9IE1hdGguY2VpbCh0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNaW51dGVzKCkgLyA1KSAqIDU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLnNldE1pbnV0ZXModGhpcy5taW51dGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJ1aWxkQ2FsZW5kYXJHcmlkKHRoaXMucmVmRGF0ZSk7XG4gICAgdGhpcy5ob3VycyA9IEFycmF5LmZyb20oQXJyYXkoMjQpLmtleXMoKSkubWFwKGkgPT4gJzAnLmNvbmNhdChpLnRvU3RyaW5nKCkpLnNsaWNlKC0yKSk7XG4gICAgdGhpcy5taW51dGVzID0gQXJyYXkuZnJvbShBcnJheSgxMikua2V5cygpKS5tYXAoaSA9PiAnMCcuY29uY2F0KChpICogNSkudG9TdHJpbmcoKSkuc2xpY2UoLTIpKTtcbiAgICAvLyBidWlsZCB0aGUgd2Vla2RheXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlXG4gICAgdGhpcy53ZWVrRGF5cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgY29uc3QgcmVmRGF0ZUZvcldlZWtEYXlzID0gbmV3IERhdGUoU1VOREFZKTtcbiAgICByZWZEYXRlRm9yV2Vla0RheXMuc2V0RGF0ZShyZWZEYXRlRm9yV2Vla0RheXMuZ2V0RGF0ZSgpIC0gdGhpcy5nZXRMb2NhbGlzZWREYXkocmVmRGF0ZUZvcldlZWtEYXlzKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgIHRoaXMud2Vla0RheXMucHVzaChyZWZEYXRlRm9yV2Vla0RheXMudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuX3RyYW5zbGF0ZS5nZXRDdXJyZW50TGFuZygpLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSkpO1xuICAgICAgcmVmRGF0ZUZvcldlZWtEYXlzLnNldERhdGUocmVmRGF0ZUZvcldlZWtEYXlzLmdldERhdGUoKSArIDEpO1xuICAgIH1cbiAgICBpZiAodGhpcy5taW4pIHRoaXMuZGF0ZU1pbiA9IG5ldyBEYXRlKHRoaXMubWluKTtcbiAgICBpZiAodGhpcy5tYXgpIHRoaXMuZGF0ZU1heCA9IG5ldyBEYXRlKHRoaXMubWF4KTtcbiAgfVxuXG4gIGdldExvY2FsaXNlZERheShkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICBsZXQgbiA9IGRhdGUuZ2V0RGF5KCk7XG4gICAgc3dpdGNoICh0aGlzLl90cmFuc2xhdGUuZ2V0Q3VycmVudExhbmcoKSkge1xuICAgICAgY2FzZSAnaXQnOlxuICAgICAgICBuID0gLS1uIDwgMCA/IDYgOiBuO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH1cblxuICBidWlsZENhbGVuZGFyR3JpZChyZWZEYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgLy8gZmluZCB0aGUgZmlyc3QgZGF5IGluIHRoZSBtb250aDogdGhlIGltcG9ydGFudCBkYXRhIGhlcmUgaXMgdGhlIGRheSBvZiB0aGUgd2Vla1xuICAgIGNvbnN0IGZpcnN0RGF0ZU9mTW9udGggPSBuZXcgRGF0ZShyZWZEYXRlLmdldEZ1bGxZZWFyKCksIHJlZkRhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgLy8gdGhlIGZvbGxvd2luZyBmbGFnIGlzIHVzZWQgdG8gZGl2aWRlIHRoZSBsb2dpYyBzbyBJIGNhbiBmaWxsIHRoZSBjYWxlbmRhclxuICAgIC8vIGFsc28gd2l0aCB0aGUgZGF0ZXMgZnJvbSB0aGUgcHJldmlvdXMgbW9udGgsIHVudGlsIHRoZXJlJ3Mgc3BhY2UgaW4gdGhlIGdyaWRcbiAgICBsZXQgaGF2ZW50Rm91bmRGaXJzdERheSA9IHRydWU7XG4gICAgLy8gaW5kZXggdXNlZCB0byBidWlsZCB0aGUgZGF0ZXMgb2YgdGhlIG1vbnRoLCBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBvbmVcbiAgICBsZXQgaW5kZXggPSAxO1xuICAgIHRoaXMuY2FsZW5kYXJHcmlkID0gbmV3IEFycmF5PERhdGVbXT4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgdGhpcy5jYWxlbmRhckdyaWRbaV0gPSBuZXcgQXJyYXk8RGF0ZT4oKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNzsgaisrKSB7XG4gICAgICAgIGlmIChoYXZlbnRGb3VuZEZpcnN0RGF5KSB7XG4gICAgICAgICAgaWYgKHRoaXMuZ2V0TG9jYWxpc2VkRGF5KGZpcnN0RGF0ZU9mTW9udGgpID09PSBqKSB7XG4gICAgICAgICAgICAvLyBub3RlOiBjb25zaWRlcnMgU3VuZGF5XG4gICAgICAgICAgICBoYXZlbnRGb3VuZEZpcnN0RGF5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyR3JpZFtpXVtqXSA9IG5ldyBEYXRlKGZpcnN0RGF0ZU9mTW9udGgpO1xuICAgICAgICAgICAgLy8gbm93IHRoZSBJJ3ZlIGZvdW5kIHRoZSBmaXJzdCBkYXRlIG9mIHRoZSBtb250aCBJIGNhbiBmaWxsIHRoZSBjYWxlbmRhclxuICAgICAgICAgICAgLy8gdGhlIGRhdGVzIGZyb210IHRoZSBwcmV2aW91cyBtb250aCwgdW50aWwgdGhlcmUncyBzcGFjZSBpbiB0aGUgZ3JpZFxuICAgICAgICAgICAgZm9yIChsZXQgeSA9IHRoaXMuZ2V0TG9jYWxpc2VkRGF5KGZpcnN0RGF0ZU9mTW9udGgpOyB5ID49IDA7IHktLSkge1xuICAgICAgICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoZmlyc3REYXRlT2ZNb250aCk7XG4gICAgICAgICAgICAgIGQuc2V0RGF0ZShmaXJzdERhdGVPZk1vbnRoLmdldERhdGUoKSAtIHkpO1xuICAgICAgICAgICAgICB0aGlzLmNhbGVuZGFyR3JpZFtpXVt0aGlzLmdldExvY2FsaXNlZERheShmaXJzdERhdGVPZk1vbnRoKSAtIHldID0gZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZmlsbCB0aGUgZm9sbG93aW5nIGRhdGVzIHVudGlsIHRoZXJlJ3Mgc3BhY2UgaW4gdGhlIGdyaWRcbiAgICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoZmlyc3REYXRlT2ZNb250aCk7XG4gICAgICAgICAgZC5zZXREYXRlKGZpcnN0RGF0ZU9mTW9udGguZ2V0RGF0ZSgpICsgaW5kZXgrKyk7XG4gICAgICAgICAgdGhpcy5jYWxlbmRhckdyaWRbaV1bal0gPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkWWVhcnMob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZkRhdGUuc2V0RnVsbFllYXIodGhpcy5yZWZEYXRlLmdldEZ1bGxZZWFyKCkgKyBvZmZzZXQpO1xuICAgIHRoaXMuYnVpbGRDYWxlbmRhckdyaWQodGhpcy5yZWZEYXRlKTtcbiAgfVxuICBzZXRZZWFyKHllYXI6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIGlmICgheWVhcikgcmV0dXJuO1xuXG4gICAgdGhpcy5yZWZEYXRlLnNldEZ1bGxZZWFyKE51bWJlcih5ZWFyKSk7XG4gICAgdGhpcy5idWlsZENhbGVuZGFyR3JpZCh0aGlzLnJlZkRhdGUpO1xuICB9XG4gIGFkZE1vbnRocyhvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVmRGF0ZS5zZXRNb250aCh0aGlzLnJlZkRhdGUuZ2V0TW9udGgoKSArIG9mZnNldCk7XG4gICAgdGhpcy5idWlsZENhbGVuZGFyR3JpZCh0aGlzLnJlZkRhdGUpO1xuICB9XG4gIGFzeW5jIHNob3dNb250aHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYnV0dG9ucyA9IFtdO1xuICAgIGNvbnN0IGlucHV0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBtb250aCA9IG5ldyBEYXRlKDApO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgdHlwZTogJ3JhZGlvJyxcbiAgICAgICAgbGFiZWw6IG1vbnRoLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLl90cmFuc2xhdGUuZ2V0Q3VycmVudExhbmcoKSwgeyBtb250aDogJ2xvbmcnIH0pLFxuICAgICAgICB2YWx1ZTogaS50b1N0cmluZygpLFxuICAgICAgICBjaGVja2VkOiBpID09PSB0aGlzLnJlZkRhdGUuZ2V0TW9udGgoKSArIDFcbiAgICAgIH0pO1xuICAgICAgbW9udGguc2V0TW9udGgobW9udGguZ2V0TW9udGgoKSArIDEpO1xuICAgIH1cbiAgICBidXR0b25zLnB1c2goeyB0ZXh0OiB0aGlzLl90cmFuc2xhdGUuXygnQ09NTU9OLkNBTkNFTCcpLCByb2xlOiAnY2FuY2VsJyB9KTtcbiAgICBidXR0b25zLnB1c2goe1xuICAgICAgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5TRUxFQ1QnKSxcbiAgICAgIGhhbmRsZXI6IChtOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZWZEYXRlLnNldE1vbnRoKHBhcnNlSW50KG0sIDEwKSAtIDEpO1xuICAgICAgICB0aGlzLmJ1aWxkQ2FsZW5kYXJHcmlkKHRoaXMucmVmRGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGVydCA9IGF3YWl0IHRoaXMuX2FsZXJ0LmNyZWF0ZSh7XG4gICAgICBoZWFkZXI6IHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX1VOQ09NTU9OLkNBTEVOREFSLk1PTlRIJyksXG4gICAgICBidXR0b25zLFxuICAgICAgaW5wdXRzXG4gICAgfSk7XG4gICAgYWxlcnQucHJlc2VudCgpO1xuICB9XG5cbiAgaXNEYXRlU2VsZWN0YWJsZShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGF0ZU1pbiAmJiBkYXRlIDwgdGhpcy5kYXRlTWluKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGF0ZU1heCAmJiBkYXRlID4gdGhpcy5kYXRlTWF4KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZWxlY3REYXRlKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgdGhpcy5ob3VyLCB0aGlzLm1pbnV0ZSk7XG4gIH1cblxuICBzZWxlY3RIb3VyKGhvdXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaG91ciA9IE51bWJlcihob3VyKTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZS5zZXRIb3Vycyh0aGlzLmhvdXIpO1xuICB9XG4gIHNlbGVjdE1pbnV0ZShtaW51dGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWludXRlID0gTnVtYmVyKG1pbnV0ZSk7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUuc2V0TWludXRlcyh0aGlzLm1pbnV0ZSk7XG4gIH1cblxuICBpc1NhbWVEYXkoYTogRGF0ZSwgYjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhLmdldEZ1bGxZZWFyKCkgPT09IGIuZ2V0RnVsbFllYXIoKSAmJiBhLmdldE1vbnRoKCkgPT09IGIuZ2V0TW9udGgoKSAmJiBhLmdldERhdGUoKSA9PT0gYi5nZXREYXRlKCk7XG4gIH1cbiAgaXNTYW1lTW9udGgoYTogRGF0ZSwgYjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhLmdldEZ1bGxZZWFyKCkgPT09IGIuZ2V0RnVsbFllYXIoKSAmJiBhLmdldE1vbnRoKCkgPT09IGIuZ2V0TW9udGgoKTtcbiAgfVxuXG4gIGlzU2FtZUhvdXIoaG91cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlLmdldEhvdXJzKCkgPT09IE51bWJlcihob3VyKTtcbiAgfVxuICBpc1NhbWVNaW51dGUobWludXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGUuZ2V0TWludXRlcygpID09PSBOdW1iZXIobWludXRlKTtcbiAgfVxuXG4gIHNhdmUocmVzZXQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fbW9kYWwuZGlzbWlzcyhyZXNldCA/ICcnIDogdGhpcy5zZWxlY3RlZERhdGUpO1xuICB9XG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsLmRpc21pc3MoKTtcbiAgfVxufVxuIiwiPGlvbi1oZWFkZXI+XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cImlkZWFUb29sYmFyXCI+XG4gICAgPGlvbi10aXRsZT57eyB0aXRsZSB9fTwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICBAaWYgKCFoaWRlQ2xlYXJCdXR0b24pIHtcbiAgICAgICAgPGlvbi1idXR0b24gW3RpdGxlXT1cIidJREVBX1VOQ09NTU9OLkNBTEVOREFSLlJFU0VUJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJzYXZlKHRydWUpXCI+XG4gICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiYXJyb3ctdW5kb1wiIC8+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICAgIDxpb24tYnV0dG9uIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5DQUxFTkRBUi5DTE9TRV9XSVRIT1VUX1NBVklORycgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjbG9zZVwiIC8+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWhlYWRlcj5cbjxpb24tY29udGVudD5cbiAgPGlvbi1ncmlkIGZpeGVkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxoMSBjbGFzcz1cImhlYWRlckxhYmVsXCI+e3sgJ0lERUFfVU5DT01NT04uQ0FMRU5EQVIuU0VUX0RBVEUnIHwgdHJhbnNsYXRlIH19PC9oMT5cbiAgICA8L2lvbi1yb3c+XG4gICAgPGlvbi1yb3cgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHhcIj5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiNVwiPlxuICAgICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXIgaW9uLWp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LXJpZ2h0IGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiM1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImFkZFllYXJzKC0xKVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjaGV2cm9uLWJhY2tcIiAvPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZyB0YXBwYWJsZVwiIFtzaXplXT1cIjZcIj5cbiAgICAgICAgICAgIDxpb24taW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0lERUFfVU5DT01NT04uQ0FMRU5EQVIuWUVBUicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwicmVmRGF0ZS5nZXRGdWxsWWVhcigpXCJcbiAgICAgICAgICAgICAgKGlvbkZvY3VzKT1cIiRldmVudC50YXJnZXQudmFsdWUgPSAnJ1wiXG4gICAgICAgICAgICAgIChpb25DaGFuZ2UpPVwic2V0WWVhcigkZXZlbnQ/LnRhcmdldD8udmFsdWUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvaW9uLWlucHV0PlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWxlZnQgaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCIzXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiYWRkWWVhcnMoKzEpXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImNoZXZyb24tZm9yd2FyZFwiIC8+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjdcIj5cbiAgICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1yaWdodCBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjNcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJhZGRNb250aHMoLTEpXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImNoZXZyb24tYmFja1wiIC8+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGlvbi1uby1wYWRkaW5nIHRhcHBhYmxlXCIgW3NpemVdPVwiNlwiIChjbGljayk9XCJzaG93TW9udGhzKClcIj5cbiAgICAgICAgICAgIHt7IHJlZkRhdGUgfCBkYXRlTG9jYWxlOiAnTU1NTScgfX1cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1sZWZ0IGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiM1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImFkZE1vbnRocygrMSlcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2hldnJvbi1mb3J3YXJkXCIgLz5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gICAgPGlvbi1yb3cgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHhcIiBjbGFzcz1cImhlYWRlckxhYmVsXCI+XG4gICAgICBAZm9yIChkZGQgb2Ygd2Vla0RheXM7IHRyYWNrIGRkZCkge1xuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgIHt7IGRkZCB9fVxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICB9XG4gICAgPC9pb24tcm93PlxuICAgIEBmb3IgKHJvdyBvZiBjYWxlbmRhckdyaWQ7IHRyYWNrIHJvdzsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICBAZm9yIChjb2wgb2Ygcm93OyB0cmFjayBjb2w7IGxldCBqID0gJGluZGV4KSB7XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgICAgICBbY29sb3JdPVwiXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KGNhbGVuZGFyR3JpZFtpXVtqXSwgdG9kYXkpIHx8IGlzU2FtZURheShjYWxlbmRhckdyaWRbaV1bal0sIHNlbGVjdGVkRGF0ZSlcbiAgICAgICAgICAgICAgICAgID8gJ3ByaW1hcnknXG4gICAgICAgICAgICAgICAgICA6IGlzU2FtZU1vbnRoKGNhbGVuZGFyR3JpZFtpXVtqXSwgcmVmRGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgPyAnZGFyaydcbiAgICAgICAgICAgICAgICAgICAgOiAnbWVkaXVtJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbZmlsbF09XCJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoY2FsZW5kYXJHcmlkW2ldW2pdLCBzZWxlY3RlZERhdGUpXG4gICAgICAgICAgICAgICAgICA/ICdzb2xpZCdcbiAgICAgICAgICAgICAgICAgIDogaXNTYW1lRGF5KGNhbGVuZGFyR3JpZFtpXVtqXSwgdG9kYXkpXG4gICAgICAgICAgICAgICAgICAgID8gJ291dGxpbmUnXG4gICAgICAgICAgICAgICAgICAgIDogJ2NsZWFyJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRGF0ZVNlbGVjdGFibGUoY2FsZW5kYXJHcmlkW2ldW2pdKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGNhbGVuZGFyR3JpZFtpXVtqXSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBjYWxlbmRhckdyaWRbaV1bal0gfCBkYXRlOiAnZCcgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIH1cbiAgICAgIDwvaW9uLXJvdz5cbiAgICB9XG4gICAgQGlmICh0aW1lUGlja2VyIHx8IG1hbnVhbFRpbWVQaWNrZXIpIHtcbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8aDEgY2xhc3M9XCJoZWFkZXJMYWJlbFwiPlxuICAgICAgICAgIHt7ICdJREVBX1VOQ09NTU9OLkNBTEVOREFSLlNFVF9USU1FJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2gxPlxuICAgICAgPC9pb24tcm93PlxuICAgIH1cbiAgICBAaWYgKHRpbWVQaWNrZXIpIHtcbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiN1wiPlxuICAgICAgICAgIDxpb24tcm93PlxuICAgICAgICAgICAgQGZvciAoaG91ciBvZiBob3VyczsgdHJhY2sgaG91cikge1xuICAgICAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImlzU2FtZUhvdXIoaG91cikgPyAncHJpbWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgICAgICAgICAgW2ZpbGxdPVwiaXNTYW1lSG91cihob3VyKSA/ICdzb2xpZCcgOiAnY2xlYXInXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RIb3VyKGhvdXIpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBob3VyIH19XG4gICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiMVwiPiA6IDwvaW9uLWNvbD5cbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjRcIj5cbiAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgIEBmb3IgKG1pbnV0ZSBvZiBtaW51dGVzOyB0cmFjayBtaW51dGUpIHtcbiAgICAgICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCI0XCI+XG4gICAgICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJpc1NhbWVNaW51dGUobWludXRlKSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgICAgICAgICBbZmlsbF09XCJpc1NhbWVNaW51dGUobWludXRlKSA/ICdzb2xpZCcgOiAnY2xlYXInXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNaW51dGUobWludXRlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgbWludXRlIH19XG4gICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgfVxuICAgIEBpZiAobWFudWFsVGltZVBpY2tlcikge1xuICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtY2VudGVyIG1hbnVhbFRpbWVQaWNrZXJcIj5cbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIiBbc2l6ZV09XCIxMlwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjIzXCIgW3ZhbHVlXT1cImhvdXJcIiAoY2hhbmdlKT1cInNlbGVjdEhvdXIoJGV2ZW50LnRhcmdldC52YWx1ZSlcIiAvPlxuICAgICAgICAgIDxzcGFuPjo8L3NwYW4+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgbWF4PVwiNTlcIiBbdmFsdWVdPVwibWludXRlXCIgKGNoYW5nZSk9XCJzZWxlY3RNaW51dGUoJGV2ZW50LnRhcmdldC52YWx1ZSlcIiAvPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgfVxuICA8L2lvbi1ncmlkPlxuPC9pb24tY29udGVudD5cbjxpb24tZm9vdGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiIGNsYXNzPVwidGFwcGFibGVcIiAoY2xpY2spPVwic2F2ZSgpXCI+XG4gICAgPGlvbi10aXRsZSBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiPlxuICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGVja21hcmtcIiAvPlxuICAgIDwvaW9uLXRpdGxlPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24tZm9vdGVyPlxuIl19