@idea-ionic/uncommon 8.5.12 → 8.6.0-beta.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 (57) hide show
  1. package/fesm2022/idea-ionic-uncommon.mjs +85 -85
  2. package/fesm2022/idea-ionic-uncommon.mjs.map +1 -1
  3. package/index.d.ts +1405 -3
  4. package/package.json +12 -13
  5. package/esm2022/idea-ionic-uncommon.mjs +0 -5
  6. package/esm2022/public-api.mjs +0 -26
  7. package/esm2022/src/AWSAPI.service.mjs +0 -431
  8. package/esm2022/src/AWSAPISocket.service.mjs +0 -188
  9. package/esm2022/src/address/address.component.mjs +0 -409
  10. package/esm2022/src/announcement/announcement.component.mjs +0 -72
  11. package/esm2022/src/cachedResources.service.mjs +0 -55
  12. package/esm2022/src/colors/colorPicker.component.mjs +0 -191
  13. package/esm2022/src/contacts/contacts.component.mjs +0 -188
  14. package/esm2022/src/dateTime/calendarPicker.component.mjs +0 -213
  15. package/esm2022/src/dateTime/dateTime.component.mjs +0 -217
  16. package/esm2022/src/duration/duration.component.mjs +0 -195
  17. package/esm2022/src/echo/echo.page.mjs +0 -233
  18. package/esm2022/src/echo/echo.routes.mjs +0 -6
  19. package/esm2022/src/errorReporting.service.mjs +0 -69
  20. package/esm2022/src/mde/mde.component.mjs +0 -143
  21. package/esm2022/src/mde/mdeToolbar.component.mjs +0 -25
  22. package/esm2022/src/offline/cacheableResource.component.mjs +0 -56
  23. package/esm2022/src/offline/offline.service.mjs +0 -63
  24. package/esm2022/src/offline/offlineData.service.mjs +0 -480
  25. package/esm2022/src/offline/offlineIndicator.component.mjs +0 -105
  26. package/esm2022/src/offline/offlineManager.component.mjs +0 -101
  27. package/esm2022/src/pushNotifications.service.mjs +0 -57
  28. package/esm2022/src/sentiment/sentiment.component.mjs +0 -112
  29. package/esm2022/src/timeInterval/fromTimeToTime.component.mjs +0 -171
  30. package/esm2022/src/timeInterval/timeInterval.component.mjs +0 -206
  31. package/esm2022/src/tinCan.service.mjs +0 -49
  32. package/public-api.d.ts +0 -25
  33. package/src/AWSAPI.service.d.ts +0 -178
  34. package/src/AWSAPISocket.service.d.ts +0 -129
  35. package/src/address/address.component.d.ts +0 -64
  36. package/src/announcement/announcement.component.d.ts +0 -23
  37. package/src/cachedResources.service.d.ts +0 -34
  38. package/src/colors/colorPicker.component.d.ts +0 -78
  39. package/src/contacts/contacts.component.d.ts +0 -31
  40. package/src/dateTime/calendarPicker.component.d.ts +0 -45
  41. package/src/dateTime/dateTime.component.d.ts +0 -81
  42. package/src/duration/duration.component.d.ts +0 -68
  43. package/src/echo/echo.page.d.ts +0 -34
  44. package/src/echo/echo.routes.d.ts +0 -2
  45. package/src/errorReporting.service.d.ts +0 -26
  46. package/src/mde/mde.component.d.ts +0 -39
  47. package/src/mde/mdeToolbar.component.d.ts +0 -5
  48. package/src/offline/cacheableResource.component.d.ts +0 -11
  49. package/src/offline/offline.service.d.ts +0 -39
  50. package/src/offline/offlineData.service.d.ts +0 -281
  51. package/src/offline/offlineIndicator.component.d.ts +0 -25
  52. package/src/offline/offlineManager.component.d.ts +0 -17
  53. package/src/pushNotifications.service.d.ts +0 -26
  54. package/src/sentiment/sentiment.component.d.ts +0 -35
  55. package/src/timeInterval/fromTimeToTime.component.d.ts +0 -61
  56. package/src/timeInterval/timeInterval.component.d.ts +0 -84
  57. package/src/tinCan.service.d.ts +0 -31
@@ -1,171 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, Input, inject } from '@angular/core';
3
- import { ModalController, IonHeader, IonToolbar, IonButtons, IonButton, IonIcon, IonTitle, IonContent, IonGrid, IonRow, IonCol, IonText, IonSegment, IonSegmentButton, IonLabel } from '@ionic/angular/standalone';
4
- import { TimeInterval } from 'idea-toolbox';
5
- import { IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';
6
- import * as i0 from "@angular/core";
7
- export class IDEAFromTimeToTimeComponent {
8
- constructor() {
9
- this._modal = inject(ModalController);
10
- this._translate = inject(IDEATranslationsService);
11
- /**
12
- * Whether we should start picking the time displaying the afternoon (PM) or the morning (AM, default).
13
- */
14
- this.period = Periods.AM;
15
- this.Segments = Segments;
16
- this.Periods = Periods;
17
- }
18
- ngOnInit() {
19
- this.segment = Segments.FROM;
20
- this.minutes = 30;
21
- this.timeIntervalWC = new TimeInterval(this.timeInterval);
22
- }
23
- setInterval(hours, minutes) {
24
- // adjust the hour based on the start of the interval and the settings of am/pm
25
- hours = this.contextualizeHour(hours, minutes);
26
- // convert the hours and minutes in milliseconds
27
- const timeMs = this.timeToMs(hours, minutes);
28
- // set the correct part of the interval, based on the current segment
29
- if (this.segment === Segments.FROM) {
30
- // set the start of the interval (from) and change the segment so that the end (to) will be picked
31
- this.timeIntervalWC.from = timeMs;
32
- this.segment = Segments.TO;
33
- }
34
- else {
35
- // can't proceed if from and to are equal
36
- if (timeMs === this.timeIntervalWC.from)
37
- return;
38
- // set the end of the interval (to)
39
- this.timeIntervalWC.to = timeMs;
40
- // save the changes and notify the parent component
41
- this.save();
42
- }
43
- }
44
- timeToMs(hours, minutes) {
45
- return (hours * 60 * 60 + (minutes || 0) * 60) * 1000;
46
- }
47
- getClockButtonContent(hours, minutes) {
48
- // adjust the hour based on the start of the interval and the settings of am/pm
49
- hours = this.contextualizeHour(hours, minutes);
50
- // convert the calculated time into a readable string; we need to format it to distinguish 0-24 vs 0-12 am/pm
51
- const refDate = new Date();
52
- refDate.setHours(hours, minutes || 0, 0);
53
- const str = this._translate.formatDate(refDate, 'shortTime');
54
- // remove the extra part (e.g. am/pm), based on the type of button we have to show
55
- const strArr = str.split(':');
56
- return String(Number(strArr[0])).concat(minutes ? ':'.concat(strArr[1].slice(0, 2)) : '');
57
- }
58
- contextualizeHour(hours, minutes) {
59
- // adjust the content to the afternoon hours, if needed
60
- if (this.period === Periods.PM)
61
- hours += 12;
62
- // if we already selected the start of the interval, check whether we need to adjust the time: the center of the
63
- // clock will be moved to the selected hour (from), to have a reasonable set of choices for the end (to)
64
- if (this.segment === Segments.TO && this.timeToMs(hours, minutes) < this.timeIntervalWC.from)
65
- hours += this.period === Periods.PM ? -12 : 12;
66
- // set midnight to 00
67
- if (hours === 24)
68
- hours = 0;
69
- return hours;
70
- }
71
- equalsFrom(hours, minutes) {
72
- // if the start of the interval hasn't been selected yet, skip it
73
- if (this.segment === Segments.FROM)
74
- return false;
75
- // adjust the hour based on the start of the interval and the settings of am/pm
76
- hours = this.contextualizeHour(hours, minutes);
77
- // compare the two strings based on the timestamps in ms
78
- return this.msToTimeString(this.timeIntervalWC.from) === this.msToTimeString(this.timeToMs(hours, minutes));
79
- }
80
- isAllowed(hours, minutes) {
81
- // adjust the hour based on the start of the interval and the settings of am/pm
82
- hours = this.contextualizeHour(hours, minutes);
83
- // check whether the selected time is inside the given boundaries
84
- return ((!this.notEarlierThan ||
85
- this.timeToMs(hours, minutes) >= this.notEarlierThan ||
86
- this.timeToMs(hours, minutes) === 0) &&
87
- (!this.notLaterThan || this.timeToMs(hours, minutes) <= this.notLaterThan));
88
- }
89
- isHourOfOppositeMeridian(hours, minutes) {
90
- // if the start of the interval hasn't been selected yet, skip it
91
- if (this.segment === Segments.FROM)
92
- return false;
93
- // adjust the hour based on the start of the interval and the settings of am/pm
94
- hours = this.contextualizeHour(hours, minutes);
95
- // calculate the ms of the selected time and of "noon" time (to determ the meridian)
96
- const timeMs = this.timeToMs(hours, minutes);
97
- const noonMs = this.timeToMs(12);
98
- // return true in case the hour doesn't belong to the current meridian
99
- return (this.period === Periods.AM && timeMs > noonMs) || (this.period === Periods.PM && timeMs < noonMs);
100
- }
101
- msToTimeString(time) {
102
- if (!time)
103
- return '';
104
- // note: the time must be always considered without any timezone (UTC)
105
- const refDate = new Date();
106
- refDate.setTime(time);
107
- const dateOpts = { timeZone: 'UTC', hour: '2-digit', minute: '2-digit' };
108
- return refDate.toLocaleTimeString(this._translate.getCurrentLang(), dateOpts);
109
- }
110
- save() {
111
- this.timeInterval.load(this.timeIntervalWC);
112
- this._modal.dismiss(true);
113
- }
114
- reset() {
115
- this.timeInterval.reset();
116
- this._modal.dismiss(false);
117
- }
118
- close() {
119
- this._modal.dismiss();
120
- }
121
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAFromTimeToTimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
122
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEAFromTimeToTimeComponent, isStandalone: true, selector: "idea-from-time-to-time", inputs: { timeInterval: "timeInterval", period: "period", notEarlierThan: "notEarlierThan", notLaterThan: "notLaterThan", title: "title" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.RESET' | translate\" (click)=\"reset()\">\n <ion-icon name=\"arrow-undo\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid class=\"clockGrid\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"5\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(12) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12)\"\n [disabled]=\"!isAllowed(12)\"\n (click)=\"setInterval(12)\"\n >\n {{ getClockButtonContent(12) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(12, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12, minutes)\"\n [disabled]=\"!isAllowed(12, minutes)\"\n (click)=\"setInterval(12, minutes)\"\n >\n {{ getClockButtonContent(12, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"3\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(11, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11, minutes)\"\n [disabled]=\"!isAllowed(11, minutes)\"\n (click)=\"setInterval(11, minutes)\"\n >\n {{ getClockButtonContent(11, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(11) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11)\"\n [disabled]=\"!isAllowed(11)\"\n (click)=\"setInterval(11)\"\n >\n {{ getClockButtonContent(11) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(1) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1)\"\n [disabled]=\"!isAllowed(1)\"\n (click)=\"setInterval(1)\"\n >\n {{ getClockButtonContent(1) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(1, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1, minutes)\"\n [disabled]=\"!isAllowed(1, minutes)\"\n (click)=\"setInterval(1, minutes)\"\n >\n {{ getClockButtonContent(1, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(10, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10, minutes)\"\n [disabled]=\"!isAllowed(10, minutes)\"\n (click)=\"setInterval(10, minutes)\"\n >\n {{ getClockButtonContent(10, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(10) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10)\"\n [disabled]=\"!isAllowed(10)\"\n (click)=\"setInterval(10)\"\n >\n {{ getClockButtonContent(10) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(2) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2)\"\n [disabled]=\"!isAllowed(2)\"\n (click)=\"setInterval(2)\"\n >\n {{ getClockButtonContent(2) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(2, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2, minutes)\"\n [disabled]=\"!isAllowed(2, minutes)\"\n (click)=\"setInterval(2, minutes)\"\n >\n {{ getClockButtonContent(2, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(9, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9, minutes)\"\n [disabled]=\"!isAllowed(9, minutes)\"\n (click)=\"setInterval(9, minutes)\"\n >\n {{ getClockButtonContent(9, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(9) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9)\"\n [disabled]=\"!isAllowed(9)\"\n (click)=\"setInterval(9)\"\n >\n {{ getClockButtonContent(9) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center displayText\" [size]=\"4\">\n <ion-text [class.fromSelected]=\"segment === Segments.TO\">\n {{ 'IDEA_UNCOMMON.FTTT.FROM' | translate }}\n @if (segment === Segments.TO) {\n <span>{{ msToTimeString(timeIntervalWC.from) }}</span>\n }\n </ion-text>\n @if (segment === Segments.TO) {\n <ion-text>{{ 'IDEA_UNCOMMON.FTTT.TO' | translate }}</ion-text>\n }\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(3) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3)\"\n [disabled]=\"!isAllowed(3)\"\n (click)=\"setInterval(3)\"\n >\n {{ getClockButtonContent(3) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(3, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3, minutes)\"\n [disabled]=\"!isAllowed(3, minutes)\"\n (click)=\"setInterval(3, minutes)\"\n >\n {{ getClockButtonContent(3, minutes) }}\n </ion-button>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(8, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8, minutes)\"\n [disabled]=\"!isAllowed(8, minutes)\"\n (click)=\"setInterval(8, minutes)\"\n >\n {{ getClockButtonContent(8, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(8) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8)\"\n [disabled]=\"!isAllowed(8)\"\n (click)=\"setInterval(8)\"\n >\n {{ getClockButtonContent(8) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(4) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4)\"\n [disabled]=\"!isAllowed(4)\"\n (click)=\"setInterval(4)\"\n >\n {{ getClockButtonContent(4) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(4, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4, minutes)\"\n [disabled]=\"!isAllowed(4, minutes)\"\n (click)=\"setInterval(4, minutes)\"\n >\n {{ getClockButtonContent(4, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(7, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7, minutes)\"\n [disabled]=\"!isAllowed(7, minutes)\"\n (click)=\"setInterval(7, minutes)\"\n >\n {{ getClockButtonContent(7, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(7) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7)\"\n [disabled]=\"!isAllowed(7)\"\n (click)=\"setInterval(7)\"\n >\n {{ getClockButtonContent(7) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(5) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5)\"\n [disabled]=\"!isAllowed(5)\"\n (click)=\"setInterval(5)\"\n >\n {{ getClockButtonContent(5) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(5, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5, minutes)\"\n [disabled]=\"!isAllowed(5, minutes)\"\n (click)=\"setInterval(5, minutes)\"\n >\n {{ getClockButtonContent(5, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"3\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(6, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6, minutes)\"\n [disabled]=\"!isAllowed(6, minutes)\"\n (click)=\"setInterval(6, minutes)\"\n >\n {{ getClockButtonContent(6, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(6) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6)\"\n [disabled]=\"!isAllowed(6)\"\n (click)=\"setInterval(6)\"\n >\n {{ getClockButtonContent(6) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"5\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.PERIOD' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"period\" (ionChange)=\"period = $event?.detail?.value || period\">\n <ion-segment-button [value]=\"Periods.AM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.AM' | translate }}</ion-label>\n </ion-segment-button>\n <ion-segment-button [value]=\"Periods.PM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.PM' | translate }}</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.MINUTES_PREFERENCE' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"minutes\" (ionChange)=\"minutes = $event?.detail?.value || minutes\">\n <ion-segment-button value=\"15\">\n <ion-label>15</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"30\">\n <ion-label>30</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"45\">\n <ion-label>45</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-content>\n", styles: ["ion-grid.clockGrid ion-button[size=large]{width:50px;height:50px;font-size:1.1em;font-weight:700}ion-grid.clockGrid ion-button[size=small]{font-size:.75em}ion-grid.clockGrid ion-button.oppositeMeridian{--border-color: var(--ion-color-medium);--border-style: dashed;--border-width: 1px}ion-grid.clockGrid .displayText ion-text{font-size:1.3em;font-weight:700}ion-grid.clockGrid .displayText ion-text.fromSelected{display:block;padding-bottom:3px;font-size:.9em}ion-grid.clockGrid ion-segment ion-segment-button{min-width:50px;--color-checked: var(--ion-color-dark);--border-color: var(--ion-color-dark)}ion-grid.clockGrid .prefLabel{font-size:.6em;font-weight:700;text-transform:uppercase}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: IDEATranslatePipe, name: "translate" }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonSegmentButton, selector: "ion-segment-button", inputs: ["disabled", "layout", "mode", "type", "value"] }, { kind: "component", type: IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: 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: IonRow, selector: "ion-row" }, { kind: "component", type: IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: 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: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }] }); }
123
- }
124
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAFromTimeToTimeComponent, decorators: [{
125
- type: Component,
126
- args: [{ selector: 'idea-from-time-to-time', standalone: true, imports: [
127
- CommonModule,
128
- IDEATranslatePipe,
129
- IonLabel,
130
- IonSegmentButton,
131
- IonSegment,
132
- IonText,
133
- IonCol,
134
- IonRow,
135
- IonGrid,
136
- IonContent,
137
- IonTitle,
138
- IonIcon,
139
- IonButton,
140
- IonButtons,
141
- IonToolbar,
142
- IonHeader
143
- ], template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.RESET' | translate\" (click)=\"reset()\">\n <ion-icon name=\"arrow-undo\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid class=\"clockGrid\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"5\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(12) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12)\"\n [disabled]=\"!isAllowed(12)\"\n (click)=\"setInterval(12)\"\n >\n {{ getClockButtonContent(12) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(12, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12, minutes)\"\n [disabled]=\"!isAllowed(12, minutes)\"\n (click)=\"setInterval(12, minutes)\"\n >\n {{ getClockButtonContent(12, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"3\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(11, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11, minutes)\"\n [disabled]=\"!isAllowed(11, minutes)\"\n (click)=\"setInterval(11, minutes)\"\n >\n {{ getClockButtonContent(11, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(11) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11)\"\n [disabled]=\"!isAllowed(11)\"\n (click)=\"setInterval(11)\"\n >\n {{ getClockButtonContent(11) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(1) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1)\"\n [disabled]=\"!isAllowed(1)\"\n (click)=\"setInterval(1)\"\n >\n {{ getClockButtonContent(1) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(1, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1, minutes)\"\n [disabled]=\"!isAllowed(1, minutes)\"\n (click)=\"setInterval(1, minutes)\"\n >\n {{ getClockButtonContent(1, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(10, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10, minutes)\"\n [disabled]=\"!isAllowed(10, minutes)\"\n (click)=\"setInterval(10, minutes)\"\n >\n {{ getClockButtonContent(10, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(10) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10)\"\n [disabled]=\"!isAllowed(10)\"\n (click)=\"setInterval(10)\"\n >\n {{ getClockButtonContent(10) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(2) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2)\"\n [disabled]=\"!isAllowed(2)\"\n (click)=\"setInterval(2)\"\n >\n {{ getClockButtonContent(2) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(2, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2, minutes)\"\n [disabled]=\"!isAllowed(2, minutes)\"\n (click)=\"setInterval(2, minutes)\"\n >\n {{ getClockButtonContent(2, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(9, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9, minutes)\"\n [disabled]=\"!isAllowed(9, minutes)\"\n (click)=\"setInterval(9, minutes)\"\n >\n {{ getClockButtonContent(9, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(9) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9)\"\n [disabled]=\"!isAllowed(9)\"\n (click)=\"setInterval(9)\"\n >\n {{ getClockButtonContent(9) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center displayText\" [size]=\"4\">\n <ion-text [class.fromSelected]=\"segment === Segments.TO\">\n {{ 'IDEA_UNCOMMON.FTTT.FROM' | translate }}\n @if (segment === Segments.TO) {\n <span>{{ msToTimeString(timeIntervalWC.from) }}</span>\n }\n </ion-text>\n @if (segment === Segments.TO) {\n <ion-text>{{ 'IDEA_UNCOMMON.FTTT.TO' | translate }}</ion-text>\n }\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(3) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3)\"\n [disabled]=\"!isAllowed(3)\"\n (click)=\"setInterval(3)\"\n >\n {{ getClockButtonContent(3) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(3, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3, minutes)\"\n [disabled]=\"!isAllowed(3, minutes)\"\n (click)=\"setInterval(3, minutes)\"\n >\n {{ getClockButtonContent(3, minutes) }}\n </ion-button>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(8, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8, minutes)\"\n [disabled]=\"!isAllowed(8, minutes)\"\n (click)=\"setInterval(8, minutes)\"\n >\n {{ getClockButtonContent(8, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(8) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8)\"\n [disabled]=\"!isAllowed(8)\"\n (click)=\"setInterval(8)\"\n >\n {{ getClockButtonContent(8) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(4) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4)\"\n [disabled]=\"!isAllowed(4)\"\n (click)=\"setInterval(4)\"\n >\n {{ getClockButtonContent(4) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(4, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4, minutes)\"\n [disabled]=\"!isAllowed(4, minutes)\"\n (click)=\"setInterval(4, minutes)\"\n >\n {{ getClockButtonContent(4, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(7, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7, minutes)\"\n [disabled]=\"!isAllowed(7, minutes)\"\n (click)=\"setInterval(7, minutes)\"\n >\n {{ getClockButtonContent(7, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(7) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7)\"\n [disabled]=\"!isAllowed(7)\"\n (click)=\"setInterval(7)\"\n >\n {{ getClockButtonContent(7) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(5) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5)\"\n [disabled]=\"!isAllowed(5)\"\n (click)=\"setInterval(5)\"\n >\n {{ getClockButtonContent(5) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(5, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5, minutes)\"\n [disabled]=\"!isAllowed(5, minutes)\"\n (click)=\"setInterval(5, minutes)\"\n >\n {{ getClockButtonContent(5, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"3\">&nbsp;</ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(6, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6, minutes)\"\n [disabled]=\"!isAllowed(6, minutes)\"\n (click)=\"setInterval(6, minutes)\"\n >\n {{ getClockButtonContent(6, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(6) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6)\"\n [disabled]=\"!isAllowed(6)\"\n (click)=\"setInterval(6)\"\n >\n {{ getClockButtonContent(6) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"5\">&nbsp;</ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.PERIOD' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"period\" (ionChange)=\"period = $event?.detail?.value || period\">\n <ion-segment-button [value]=\"Periods.AM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.AM' | translate }}</ion-label>\n </ion-segment-button>\n <ion-segment-button [value]=\"Periods.PM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.PM' | translate }}</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.MINUTES_PREFERENCE' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"minutes\" (ionChange)=\"minutes = $event?.detail?.value || minutes\">\n <ion-segment-button value=\"15\">\n <ion-label>15</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"30\">\n <ion-label>30</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"45\">\n <ion-label>45</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-content>\n", styles: ["ion-grid.clockGrid ion-button[size=large]{width:50px;height:50px;font-size:1.1em;font-weight:700}ion-grid.clockGrid ion-button[size=small]{font-size:.75em}ion-grid.clockGrid ion-button.oppositeMeridian{--border-color: var(--ion-color-medium);--border-style: dashed;--border-width: 1px}ion-grid.clockGrid .displayText ion-text{font-size:1.3em;font-weight:700}ion-grid.clockGrid .displayText ion-text.fromSelected{display:block;padding-bottom:3px;font-size:.9em}ion-grid.clockGrid ion-segment ion-segment-button{min-width:50px;--color-checked: var(--ion-color-dark);--border-color: var(--ion-color-dark)}ion-grid.clockGrid .prefLabel{font-size:.6em;font-weight:700;text-transform:uppercase}\n"] }]
144
- }], propDecorators: { timeInterval: [{
145
- type: Input
146
- }], period: [{
147
- type: Input
148
- }], notEarlierThan: [{
149
- type: Input
150
- }], notLaterThan: [{
151
- type: Input
152
- }], title: [{
153
- type: Input
154
- }] } });
155
- /**
156
- * The two stages of the component, to pick the start and the end of the interval.
157
- */
158
- var Segments;
159
- (function (Segments) {
160
- Segments["FROM"] = "FROM";
161
- Segments["TO"] = "TO";
162
- })(Segments || (Segments = {}));
163
- /**
164
- * The two possible periods of the component, to interpret the clock the right way.
165
- */
166
- export var Periods;
167
- (function (Periods) {
168
- Periods["AM"] = "AM";
169
- Periods["PM"] = "PM";
170
- })(Periods || (Periods = {}));
171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbVRpbWVUb1RpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvdGltZUludGVydmFsL2Zyb21UaW1lVG9UaW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvdW5jb21tb24vc3JjL3RpbWVJbnRlcnZhbC9mcm9tVGltZVRvVGltZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFDTCxlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxRQUFRLEVBQ1IsVUFBVSxFQUNWLE9BQU8sRUFDUCxNQUFNLEVBQ04sTUFBTSxFQUNOLE9BQU8sRUFDUCxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDVCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBMEJoRixNQUFNLE9BQU8sMkJBQTJCO0lBeEJ4QztRQXlCVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQU1yRDs7V0FFRztRQUNNLFdBQU0sR0FBWSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBZXRDLGFBQVEsR0FBRyxRQUFRLENBQUM7UUFDcEIsWUFBTyxHQUFHLE9BQU8sQ0FBQztLQStHbkI7SUEzR0MsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFP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LFFBR1o7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLE9BR1g7QUFIRCxXQUFZLE9BQU87SUFDakIsb0JBQVMsQ0FBQTtJQUNULG9CQUFTLENBQUE7QUFDWCxDQUFDLEVBSFcsT0FBTyxLQUFQLE9BQU8sUUFHbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE1vZGFsQ29udHJvbGxlcixcbiAgSW9uSGVhZGVyLFxuICBJb25Ub29sYmFyLFxuICBJb25CdXR0b25zLFxuICBJb25CdXR0b24sXG4gIElvbkljb24sXG4gIElvblRpdGxlLFxuICBJb25Db250ZW50LFxuICBJb25HcmlkLFxuICBJb25Sb3csXG4gIElvbkNvbCxcbiAgSW9uVGV4dCxcbiAgSW9uU2VnbWVudCxcbiAgSW9uU2VnbWVudEJ1dHRvbixcbiAgSW9uTGFiZWxcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBUaW1lSW50ZXJ2YWwgfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuaW1wb3J0IHsgSURFQVRyYW5zbGF0ZVBpcGUsIElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWRlYS1mcm9tLXRpbWUtdG8tdGltZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSURFQVRyYW5zbGF0ZVBpcGUsXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uU2VnbWVudEJ1dHRvbixcbiAgICBJb25TZWdtZW50LFxuICAgIElvblRleHQsXG4gICAgSW9uQ29sLFxuICAgIElvblJvdyxcbiAgICBJb25HcmlkLFxuICAgIElvbkNvbnRlbnQsXG4gICAgSW9uVGl0bGUsXG4gICAgSW9uSWNvbixcbiAgICBJb25CdXR0b24sXG4gICAgSW9uQnV0dG9ucyxcbiAgICBJb25Ub29sYmFyLFxuICAgIElvbkhlYWRlclxuICBdLFxuICB0ZW1wbGF0ZVVybDogJ2Zyb21UaW1lVG9UaW1lLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2Zyb21UaW1lVG9UaW1lLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSURFQUZyb21UaW1lVG9UaW1lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBfbW9kYWwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfdHJhbnNsYXRlID0gaW5qZWN0KElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlKTtcblxuICAvKipcbiAgICogVGhlIHRpbWUgaW50ZXJ2YWwgdG8gc2V0LlxuICAgKi9cbiAgQElucHV0KCkgdGltZUludGVydmFsOiBUaW1lSW50ZXJ2YWw7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHNob3VsZCBzdGFydCBwaWNraW5nIHRoZSB0aW1lIGRpc3BsYXlpbmcgdGhlIGFmdGVybm9vbiAoUE0pIG9yIHRoZSBtb3JuaW5nIChBTSwgZGVmYXVsdCkuXG4gICAqL1xuICBASW5wdXQoKSBwZXJpb2Q6IFBlcmlvZHMgPSBQZXJpb2RzLkFNO1xuICAvKipcbiAgICogQSB0aW1lIHRvIHVzZSBhcyBsb3dlciBsaW1pdCBmb3IgdGhlIHBvc3NpYmxlIGNob2ljZXMuXG4gICAqL1xuICBASW5wdXQoKSBub3RFYXJsaWVyVGhhbjogbnVtYmVyO1xuICAvKipcbiAgICogQSB0aW1lIHRvIHVzZSBhcyB1cHBlciBsaW1pdCBmb3IgdGhlIHBvc3NpYmxlIGNob2ljZXMuXG4gICAqL1xuICBASW5wdXQoKSBub3RMYXRlclRoYW46IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcblxuICBzZWdtZW50OiBTZWdtZW50cztcbiAgU2VnbWVudHMgPSBTZWdtZW50cztcbiAgUGVyaW9kcyA9IFBlcmlvZHM7XG4gIHRpbWVJbnRlcnZhbFdDOiBUaW1lSW50ZXJ2YWw7XG4gIG1pbnV0ZXM6IG51bWJlcjtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlZ21lbnQgPSBTZWdtZW50cy5GUk9NO1xuICAgIHRoaXMubWludXRlcyA9IDMwO1xuICAgIHRoaXMudGltZUludGVydmFsV0MgPSBuZXcgVGltZUludGVydmFsKHRoaXMudGltZUludGVydmFsKTtcbiAgfVxuXG4gIHNldEludGVydmFsKGhvdXJzOiBudW1iZXIsIG1pbnV0ZXM/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhZGp1c3QgdGhlIGhvdXIgYmFzZWQgb24gdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBhbmQgdGhlIHNldHRpbmdzIG9mIGFtL3BtXG4gICAgaG91cnMgPSB0aGlzLmNvbnRleHR1YWxpemVIb3VyKGhvdXJzLCBtaW51dGVzKTtcbiAgICAvLyBjb252ZXJ0IHRoZSBob3VycyBhbmQgbWludXRlcyBpbiBtaWxsaXNlY29uZHNcbiAgICBjb25zdCB0aW1lTXMgPSB0aGlzLnRpbWVUb01zKGhvdXJzLCBtaW51dGVzKTtcbiAgICAvLyBzZXQgdGhlIGNvcnJlY3QgcGFydCBvZiB0aGUgaW50ZXJ2YWwsIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlZ21lbnRcbiAgICBpZiAodGhpcy5zZWdtZW50ID09PSBTZWdtZW50cy5GUk9NKSB7XG4gICAgICAvLyBzZXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCAoZnJvbSkgYW5kIGNoYW5nZSB0aGUgc2VnbWVudCBzbyB0aGF0IHRoZSBlbmQgKHRvKSB3aWxsIGJlIHBpY2tlZFxuICAgICAgdGhpcy50aW1lSW50ZXJ2YWxXQy5mcm9tID0gdGltZU1zO1xuICAgICAgdGhpcy5zZWdtZW50ID0gU2VnbWVudHMuVE87XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNhbid0IHByb2NlZWQgaWYgZnJvbSBhbmQgdG8gYXJlIGVxdWFsXG4gICAgICBpZiAodGltZU1zID09PSB0aGlzLnRpbWVJbnRlcnZhbFdDLmZyb20pIHJldHVybjtcbiAgICAgIC8vIHNldCB0aGUgZW5kIG9mIHRoZSBpbnRlcnZhbCAodG8pXG4gICAgICB0aGlzLnRpbWVJbnRlcnZhbFdDLnRvID0gdGltZU1zO1xuICAgICAgLy8gc2F2ZSB0aGUgY2hhbmdlcyBhbmQgbm90aWZ5IHRoZSBwYXJlbnQgY29tcG9uZW50XG4gICAgICB0aGlzLnNhdmUoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB0aW1lVG9Ncyhob3VyczogbnVtYmVyLCBtaW51dGVzPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKGhvdXJzICogNjAgKiA2MCArIChtaW51dGVzIHx8IDApICogNjApICogMTAwMDtcbiAgfVxuXG4gIGdldENsb2NrQnV0dG9uQ29udGVudChob3VyczogbnVtYmVyLCBtaW51dGVzPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAvLyBhZGp1c3QgdGhlIGhvdXIgYmFzZWQgb24gdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBhbmQgdGhlIHNldHRpbmdzIG9mIGFtL3BtXG4gICAgaG91cnMgPSB0aGlzLmNvbnRleHR1YWxpemVIb3VyKGhvdXJzLCBtaW51dGVzKTtcbiAgICAvLyBjb252ZXJ0IHRoZSBjYWxjdWxhdGVkIHRpbWUgaW50byBhIHJlYWRhYmxlIHN0cmluZzsgd2UgbmVlZCB0byBmb3JtYXQgaXQgdG8gZGlzdGluZ3Vpc2ggMC0yNCB2cyAwLTEyIGFtL3BtXG4gICAgY29uc3QgcmVmRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgcmVmRGF0ZS5zZXRIb3Vycyhob3VycywgbWludXRlcyB8fCAwLCAwKTtcbiAgICBjb25zdCBzdHIgPSB0aGlzLl90cmFuc2xhdGUuZm9ybWF0RGF0ZShyZWZEYXRlLCAnc2hvcnRUaW1lJyk7XG4gICAgLy8gcmVtb3ZlIHRoZSBleHRyYSBwYXJ0IChlLmcuIGFtL3BtKSwgYmFzZWQgb24gdGhlIHR5cGUgb2YgYnV0dG9uIHdlIGhhdmUgdG8gc2hvd1xuICAgIGNvbnN0IHN0ckFyciA9IHN0ci5zcGxpdCgnOicpO1xuICAgIHJldHVybiBTdHJpbmcoTnVtYmVyKHN0ckFyclswXSkpLmNvbmNhdChtaW51dGVzID8gJzonLmNvbmNhdChzdHJBcnJbMV0uc2xpY2UoMCwgMikpIDogJycpO1xuICB9XG4gIHByaXZhdGUgY29udGV4dHVhbGl6ZUhvdXIoaG91cnM6IG51bWJlciwgbWludXRlcz86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gYWRqdXN0IHRoZSBjb250ZW50IHRvIHRoZSBhZnRlcm5vb24gaG91cnMsIGlmIG5lZWRlZFxuICAgIGlmICh0aGlzLnBlcmlvZCA9PT0gUGVyaW9kcy5QTSkgaG91cnMgKz0gMTI7XG4gICAgLy8gaWYgd2UgYWxyZWFkeSBzZWxlY3RlZCB0aGUgc3RhcnQgb2YgdGhlIGludGVydmFsLCBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSB0aW1lOiB0aGUgY2VudGVyIG9mIHRoZVxuICAgIC8vIGNsb2NrIHdpbGwgYmUgbW92ZWQgdG8gdGhlIHNlbGVjdGVkIGhvdXIgKGZyb20pLCB0byBoYXZlIGEgcmVhc29uYWJsZSBzZXQgb2YgY2hvaWNlcyBmb3IgdGhlIGVuZCAodG8pXG4gICAgaWYgKHRoaXMuc2VnbWVudCA9PT0gU2VnbWVudHMuVE8gJiYgdGhpcy50aW1lVG9Ncyhob3VycywgbWludXRlcykgPCB0aGlzLnRpbWVJbnRlcnZhbFdDLmZyb20pXG4gICAgICBob3VycyArPSB0aGlzLnBlcmlvZCA9PT0gUGVyaW9kcy5QTSA/IC0xMiA6IDEyO1xuICAgIC8vIHNldCBtaWRuaWdodCB0byAwMFxuICAgIGlmIChob3VycyA9PT0gMjQpIGhvdXJzID0gMDtcbiAgICByZXR1cm4gaG91cnM7XG4gIH1cblxuICBlcXVhbHNGcm9tKGhvdXJzOiBudW1iZXIsIG1pbnV0ZXM/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBpZiB0aGUgc3RhcnQgb2YgdGhlIGludGVydmFsIGhhc24ndCBiZWVuIHNlbGVjdGVkIHlldCwgc2tpcCBpdFxuICAgIGlmICh0aGlzLnNlZ21lbnQgPT09IFNlZ21lbnRzLkZST00pIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGp1c3QgdGhlIGhvdXIgYmFzZWQgb24gdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBhbmQgdGhlIHNldHRpbmdzIG9mIGFtL3BtXG4gICAgaG91cnMgPSB0aGlzLmNvbnRleHR1YWxpemVIb3VyKGhvdXJzLCBtaW51dGVzKTtcbiAgICAvLyBjb21wYXJlIHRoZSB0d28gc3RyaW5ncyBiYXNlZCBvbiB0aGUgdGltZXN0YW1wcyBpbiBtc1xuICAgIHJldHVybiB0aGlzLm1zVG9UaW1lU3RyaW5nKHRoaXMudGltZUludGVydmFsV0MuZnJvbSkgPT09IHRoaXMubXNUb1RpbWVTdHJpbmcodGhpcy50aW1lVG9Ncyhob3VycywgbWludXRlcykpO1xuICB9XG5cbiAgaXNBbGxvd2VkKGhvdXJzOiBudW1iZXIsIG1pbnV0ZXM/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBhZGp1c3QgdGhlIGhvdXIgYmFzZWQgb24gdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBhbmQgdGhlIHNldHRpbmdzIG9mIGFtL3BtXG4gICAgaG91cnMgPSB0aGlzLmNvbnRleHR1YWxpemVIb3VyKGhvdXJzLCBtaW51dGVzKTtcbiAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBzZWxlY3RlZCB0aW1lIGlzIGluc2lkZSB0aGUgZ2l2ZW4gYm91bmRhcmllc1xuICAgIHJldHVybiAoXG4gICAgICAoIXRoaXMubm90RWFybGllclRoYW4gfHxcbiAgICAgICAgdGhpcy50aW1lVG9Ncyhob3VycywgbWludXRlcykgPj0gdGhpcy5ub3RFYXJsaWVyVGhhbiB8fFxuICAgICAgICB0aGlzLnRpbWVUb01zKGhvdXJzLCBtaW51dGVzKSA9PT0gMCkgJiZcbiAgICAgICghdGhpcy5ub3RMYXRlclRoYW4gfHwgdGhpcy50aW1lVG9Ncyhob3VycywgbWludXRlcykgPD0gdGhpcy5ub3RMYXRlclRoYW4pXG4gICAgKTtcbiAgfVxuXG4gIGlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbihob3VyczogbnVtYmVyLCBtaW51dGVzPzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gaWYgdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBoYXNuJ3QgYmVlbiBzZWxlY3RlZCB5ZXQsIHNraXAgaXRcbiAgICBpZiAodGhpcy5zZWdtZW50ID09PSBTZWdtZW50cy5GUk9NKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRqdXN0IHRoZSBob3VyIGJhc2VkIG9uIHRoZSBzdGFydCBvZiB0aGUgaW50ZXJ2YWwgYW5kIHRoZSBzZXR0aW5ncyBvZiBhbS9wbVxuICAgIGhvdXJzID0gdGhpcy5jb250ZXh0dWFsaXplSG91cihob3VycywgbWludXRlcyk7XG4gICAgLy8gY2FsY3VsYXRlIHRoZSBtcyBvZiB0aGUgc2VsZWN0ZWQgdGltZSBhbmQgb2YgXCJub29uXCIgdGltZSAodG8gZGV0ZXJtIHRoZSBtZXJpZGlhbilcbiAgICBjb25zdCB0aW1lTXMgPSB0aGlzLnRpbWVUb01zKGhvdXJzLCBtaW51dGVzKTtcbiAgICBjb25zdCBub29uTXMgPSB0aGlzLnRpbWVUb01zKDEyKTtcbiAgICAvLyByZXR1cm4gdHJ1ZSBpbiBjYXNlIHRoZSBob3VyIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBjdXJyZW50IG1lcmlkaWFuXG4gICAgcmV0dXJuICh0aGlzLnBlcmlvZCA9PT0gUGVyaW9kcy5BTSAmJiB0aW1lTXMgPiBub29uTXMpIHx8ICh0aGlzLnBlcmlvZCA9PT0gUGVyaW9kcy5QTSAmJiB0aW1lTXMgPCBub29uTXMpO1xuICB9XG5cbiAgbXNUb1RpbWVTdHJpbmcodGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXRpbWUpIHJldHVybiAnJztcbiAgICAvLyBub3RlOiB0aGUgdGltZSBtdXN0IGJlIGFsd2F5cyBjb25zaWRlcmVkIHdpdGhvdXQgYW55IHRpbWV6b25lIChVVEMpXG4gICAgY29uc3QgcmVmRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgcmVmRGF0ZS5zZXRUaW1lKHRpbWUpO1xuICAgIGNvbnN0IGRhdGVPcHRzID0geyB0aW1lWm9uZTogJ1VUQycsIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcgfSBhcyBjb25zdDtcbiAgICByZXR1cm4gcmVmRGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcodGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCksIGRhdGVPcHRzKTtcbiAgfVxuXG4gIHNhdmUoKTogdm9pZCB7XG4gICAgdGhpcy50aW1lSW50ZXJ2YWwubG9hZCh0aGlzLnRpbWVJbnRlcnZhbFdDKTtcbiAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKHRydWUpO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy50aW1lSW50ZXJ2YWwucmVzZXQoKTtcbiAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKGZhbHNlKTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsLmRpc21pc3MoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB0d28gc3RhZ2VzIG9mIHRoZSBjb21wb25lbnQsIHRvIHBpY2sgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBpbnRlcnZhbC5cbiAqL1xuZW51bSBTZWdtZW50cyB7XG4gIEZST00gPSAnRlJPTScsXG4gIFRPID0gJ1RPJ1xufVxuXG4vKipcbiAqIFRoZSB0d28gcG9zc2libGUgcGVyaW9kcyBvZiB0aGUgY29tcG9uZW50LCB0byBpbnRlcnByZXQgdGhlIGNsb2NrIHRoZSByaWdodCB3YXkuXG4gKi9cbmV4cG9ydCBlbnVtIFBlcmlvZHMge1xuICBBTSA9ICdBTScsXG4gIFBNID0gJ1BNJ1xufVxuIiwiPGlvbi1oZWFkZXI+XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cImlkZWFUb29sYmFyXCI+XG4gICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgPGlvbi1idXR0b24gW3RpdGxlXT1cIidDT01NT04uQ0xPU0UnIHwgdHJhbnNsYXRlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgPGlvbi10aXRsZT57eyB0aXRsZSB9fTwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICA8aW9uLWJ1dHRvbiBbdGl0bGVdPVwiJ0NPTU1PTi5SRVNFVCcgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwicmVzZXQoKVwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImFycm93LXVuZG9cIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuPGlvbi1jb250ZW50PlxuICA8aW9uLWdyaWQgY2xhc3M9XCJjbG9ja0dyaWRcIj5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjVcIj4mbmJzcDs8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDEyKSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDEyKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoMTIpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoMTIpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgxMikgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1sZWZ0XCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oMTIsIG1pbnV0ZXMpID8gJ3ByaW1hcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDEyLCBtaW51dGVzKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoMTIsIG1pbnV0ZXMpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoMTIsIG1pbnV0ZXMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgxMiwgbWludXRlcykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgW3NpemVdPVwiM1wiPiZuYnNwOzwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICA8aW9uLWNvbCBbc2l6ZV09XCIyXCI+Jm5ic3A7PC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSgxMSwgbWludXRlcykgPyAncHJpbWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oMTEsIG1pbnV0ZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCgxMSwgbWludXRlcylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRJbnRlcnZhbCgxMSwgbWludXRlcylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDExLCBtaW51dGVzKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWxlZnRcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSgxMSkgPyAncHJpbWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgIFtjbGFzcy5vcHBvc2l0ZU1lcmlkaWFuXT1cImlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbigxMSlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDExKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDExKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRDbG9ja0J1dHRvbkNvbnRlbnQoMTEpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHRcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSgxKSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDEpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCgxKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDEpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgxKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDEsIG1pbnV0ZXMpID8gJ3ByaW1hcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDEsIG1pbnV0ZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCgxLCBtaW51dGVzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDEsIG1pbnV0ZXMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgxLCBtaW51dGVzKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBbc2l6ZV09XCIyXCI+Jm5ic3A7PC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjFcIj4mbmJzcDs8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDEwLCBtaW51dGVzKSA/ICdwcmltYXJ5JyA6ICdsaWdodCdcIlxuICAgICAgICAgIFtjbGFzcy5vcHBvc2l0ZU1lcmlkaWFuXT1cImlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbigxMCwgbWludXRlcylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDEwLCBtaW51dGVzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDEwLCBtaW51dGVzKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRDbG9ja0J1dHRvbkNvbnRlbnQoMTAsIG1pbnV0ZXMpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtbGVmdFwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDEwKSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDEwKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoMTApXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoMTApXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgxMCkgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgW3NpemVdPVwiMlwiPiZuYnNwOzwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHRcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSgyKSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDIpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCgyKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDIpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgyKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDIsIG1pbnV0ZXMpID8gJ3ByaW1hcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDIsIG1pbnV0ZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCgyLCBtaW51dGVzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDIsIG1pbnV0ZXMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCgyLCBtaW51dGVzKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBbc2l6ZV09XCIxXCI+Jm5ic3A7PC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oOSwgbWludXRlcykgPyAncHJpbWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oOSwgbWludXRlcylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDksIG1pbnV0ZXMpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoOSwgbWludXRlcylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDksIG1pbnV0ZXMpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtbGVmdFwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDkpID8gJ3ByaW1hcnknIDogJ2RhcmsnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oOSlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDkpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoOSlcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDkpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGRpc3BsYXlUZXh0XCIgW3NpemVdPVwiNFwiPlxuICAgICAgICA8aW9uLXRleHQgW2NsYXNzLmZyb21TZWxlY3RlZF09XCJzZWdtZW50ID09PSBTZWdtZW50cy5UT1wiPlxuICAgICAgICAgIHt7ICdJREVBX1VOQ09NTU9OLkZUVFQuRlJPTScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICBAaWYgKHNlZ21lbnQgPT09IFNlZ21lbnRzLlRPKSB7XG4gICAgICAgICAgICA8c3Bhbj57eyBtc1RvVGltZVN0cmluZyh0aW1lSW50ZXJ2YWxXQy5mcm9tKSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIEBpZiAoc2VnbWVudCA9PT0gU2VnbWVudHMuVE8pIHtcbiAgICAgICAgICA8aW9uLXRleHQ+e3sgJ0lERUFfVU5DT01NT04uRlRUVC5UTycgfCB0cmFuc2xhdGUgfX08L2lvbi10ZXh0PlxuICAgICAgICB9XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LXJpZ2h0XCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJsYXJnZVwiXG4gICAgICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oMykgPyAncHJpbWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgIFtjbGFzcy5vcHBvc2l0ZU1lcmlkaWFuXT1cImlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbigzKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoMylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRJbnRlcnZhbCgzKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRDbG9ja0J1dHRvbkNvbnRlbnQoMykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSgzLCBtaW51dGVzKSA/ICdwcmltYXJ5JyA6ICdsaWdodCdcIlxuICAgICAgICAgIFtjbGFzcy5vcHBvc2l0ZU1lcmlkaWFuXT1cImlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbigzLCBtaW51dGVzKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoMywgbWludXRlcylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRJbnRlcnZhbCgzLCBtaW51dGVzKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRDbG9ja0J1dHRvbkNvbnRlbnQoMywgbWludXRlcykgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjFcIj4mbmJzcDs8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDgsIG1pbnV0ZXMpID8gJ3ByaW1hcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDgsIG1pbnV0ZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCg4LCBtaW51dGVzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDgsIG1pbnV0ZXMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCg4LCBtaW51dGVzKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWxlZnRcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSg4KSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCg4KVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCg4KSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBbc2l6ZV09XCIyXCI+Jm5ic3A7PC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1yaWdodFwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDQpID8gJ3ByaW1hcnknIDogJ2RhcmsnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oNClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDQpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoNClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDQpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oNCwgbWludXRlcykgPyAncHJpbWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oNCwgbWludXRlcylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDQsIG1pbnV0ZXMpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoNCwgbWludXRlcylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDQsIG1pbnV0ZXMpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjFcIj4mbmJzcDs8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGlvbi1jb2wgW3NpemVdPVwiMlwiPiZuYnNwOzwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oNywgbWludXRlcykgPyAncHJpbWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oNywgbWludXRlcylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDcsIG1pbnV0ZXMpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoNywgbWludXRlcylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDcsIG1pbnV0ZXMpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtbGVmdFwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDcpID8gJ3ByaW1hcnknIDogJ2RhcmsnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oNylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDcpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoNylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDcpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHRcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICBbY29sb3JdPVwiZXF1YWxzRnJvbSg1KSA/ICdwcmltYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDUpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCg1KVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDUpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCg1KSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiIFtzaXplXT1cIjJcIj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFtjb2xvcl09XCJlcXVhbHNGcm9tKDUsIG1pbnV0ZXMpID8gJ3ByaW1hcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgW2NsYXNzLm9wcG9zaXRlTWVyaWRpYW5dPVwiaXNIb3VyT2ZPcHBvc2l0ZU1lcmlkaWFuKDUsIG1pbnV0ZXMpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzQWxsb3dlZCg1LCBtaW51dGVzKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldEludGVydmFsKDUsIG1pbnV0ZXMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldENsb2NrQnV0dG9uQ29udGVudCg1LCBtaW51dGVzKSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBbc2l6ZV09XCIyXCI+Jm5ic3A7PC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjNcIj4mbmJzcDs8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LXJpZ2h0XCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oNiwgbWludXRlcykgPyAncHJpbWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgICBbY2xhc3Mub3Bwb3NpdGVNZXJpZGlhbl09XCJpc0hvdXJPZk9wcG9zaXRlTWVyaWRpYW4oNiwgbWludXRlcylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNBbGxvd2VkKDYsIG1pbnV0ZXMpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0SW50ZXJ2YWwoNiwgbWludXRlcylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0Q2xvY2tCdXR0b25Db250ZW50KDYsIG1pbnV0ZXMpIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMlwiPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJsYXJnZVwiXG4gICAgICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICAgICAgW2NvbG9yXT1cImVxdWFsc0Zyb20oNikgPyAncHJpbWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgIFtjbGFzcy5vcHBvc2l0ZU1lcmlkaWFuXT1cImlzSG91ck9mT3Bwb3NpdGVNZXJpZGlhbig2KVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0FsbG93ZWQoNilcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRJbnRlcnZhbCg2KVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRDbG9ja0J1dHRvbkNvbnRlbnQoNikgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgW3NpemVdPVwiNVwiPiZuYnNwOzwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LXJpZ2h0XCIgW3NpemVdPVwiM1wiIFtzaXplU21dPVwiN1wiPlxuICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJwcmVmTGFiZWxcIj57eyAnSURFQV9VTkNPTU1PTi5GVFRULlBFUklPRCcgfCB0cmFuc2xhdGUgfX06PC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDxpb24tY29sIFtzaXplXT1cIjlcIiBbc2l6ZVNtXT1cIjVcIj5cbiAgICAgICAgPGlvbi1zZWdtZW50IFt2YWx1ZV09XCJwZXJpb2RcIiAoaW9uQ2hhbmdlKT1cInBlcmlvZCA9ICRldmVudD8uZGV0YWlsPy52YWx1ZSB8fCBwZXJpb2RcIj5cbiAgICAgICAgICA8aW9uLXNlZ21lbnQtYnV0dG9uIFt2YWx1ZV09XCJQZXJpb2RzLkFNXCI+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPnt7ICdJREVBX1VOQ09NTU9OLkZUVFQuQU0nIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24tc2VnbWVudC1idXR0b24+XG4gICAgICAgICAgPGlvbi1zZWdtZW50LWJ1dHRvbiBbdmFsdWVdPVwiUGVyaW9kcy5QTVwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD57eyAnSURFQV9VTkNPTU1PTi5GVFRULlBNJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgICA8L2lvbi1zZWdtZW50PlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHRcIiBbc2l6ZV09XCIzXCIgW3NpemVTbV09XCI3XCI+XG4gICAgICAgIDxpb24tdGV4dCBjbGFzcz1cInByZWZMYWJlbFwiPnt7ICdJREVBX1VOQ09NTU9OLkZUVFQuTUlOVVRFU19QUkVGRVJFTkNFJyB8IHRyYW5zbGF0ZSB9fTo8L2lvbi10ZXh0PlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgW3NpemVdPVwiOVwiIFtzaXplU21dPVwiNVwiPlxuICAgICAgICA8aW9uLXNlZ21lbnQgW3ZhbHVlXT1cIm1pbnV0ZXNcIiAoaW9uQ2hhbmdlKT1cIm1pbnV0ZXMgPSAkZXZlbnQ/LmRldGFpbD8udmFsdWUgfHwgbWludXRlc1wiPlxuICAgICAgICAgIDxpb24tc2VnbWVudC1idXR0b24gdmFsdWU9XCIxNVwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD4xNTwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgICAgIDxpb24tc2VnbWVudC1idXR0b24gdmFsdWU9XCIzMFwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD4zMDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgICAgIDxpb24tc2VnbWVudC1idXR0b24gdmFsdWU9XCI0NVwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD40NTwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgICA8L2lvbi1zZWdtZW50PlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tZ3JpZD5cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
@@ -1,206 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, Input, Output, EventEmitter, inject } from '@angular/core';
3
- import { ModalController, IonItem, IonButton, IonIcon, IonText, IonLabel } from '@ionic/angular/standalone';
4
- import { IDEATranslationsService } from '@idea-ionic/common';
5
- import { IDEAFromTimeToTimeComponent, Periods } from './fromTimeToTime.component';
6
- import * as i0 from "@angular/core";
7
- export class IDEATimeIntervalComponent {
8
- constructor() {
9
- this._modal = inject(ModalController);
10
- this._translate = inject(IDEATranslationsService);
11
- /**
12
- * Whether we should start picking the time displaying the afternoon (PM) or the morning (AM, default).
13
- */
14
- this.period = Periods.AM;
15
- /**
16
- * On select event.
17
- */
18
- this.select = new EventEmitter();
19
- /**
20
- * Icon select.
21
- */
22
- this.iconSelect = new EventEmitter();
23
- /**
24
- * On select (with the field disabled) event.
25
- */
26
- this.selectWhenDisabled = new EventEmitter();
27
- this.isOpening = false;
28
- }
29
- ngOnInit() {
30
- // when the language changes, set the locale
31
- this.langChangeSubscription = this._translate.onLangChange.subscribe(() => {
32
- this.valueToDisplay = this.getValueToDisplay(this.timeInterval);
33
- });
34
- }
35
- ngOnDestroy() {
36
- if (this.langChangeSubscription)
37
- this.langChangeSubscription.unsubscribe();
38
- }
39
- ngOnChanges(changes) {
40
- if (changes.timeInterval)
41
- this.valueToDisplay = this.getValueToDisplay(changes.timeInterval.currentValue);
42
- }
43
- getValueToDisplay(timeInterval) {
44
- if (!timeInterval || !timeInterval.isSet())
45
- return '';
46
- // note: the time must be always considered without any timezone (UTC)
47
- const dateOpts = { timeZone: 'UTC', hour: '2-digit', minute: '2-digit' };
48
- return ''.concat(this._translate._('IDEA_UNCOMMON.FTTT.FROM'), ' ', new Date(timeInterval.from).toLocaleTimeString(this._translate.getCurrentLang(), dateOpts), ' ', this._translate._('IDEA_UNCOMMON.FTTT.TO').toLowerCase(), ' ', new Date(timeInterval.to).toLocaleTimeString(this._translate.getCurrentLang(), dateOpts));
49
- }
50
- async pickTimeInterval() {
51
- if (this.isOpening)
52
- return;
53
- this.isOpening = true;
54
- const modal = await this._modal.create({
55
- component: IDEAFromTimeToTimeComponent,
56
- componentProps: {
57
- timeInterval: this.timeInterval,
58
- period: this.period,
59
- notEarlierThan: this.notEarlierThan,
60
- notLaterThan: this.notLaterThan,
61
- title: this.label
62
- }
63
- });
64
- modal.onDidDismiss().then((res) => {
65
- // if the content changed, update the internal values and notify the parent component
66
- if (res.data === true || res.data === false) {
67
- this.valueToDisplay = this.getValueToDisplay(this.timeInterval);
68
- this.select.emit();
69
- }
70
- });
71
- modal.present();
72
- this.isOpening = false;
73
- }
74
- doSelectWhenDisabled() {
75
- if (this.disabled)
76
- this.selectWhenDisabled.emit();
77
- }
78
- doIconSelect(event) {
79
- if (event)
80
- event.stopPropagation();
81
- this.iconSelect.emit(event);
82
- }
83
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEATimeIntervalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
84
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEATimeIntervalComponent, isStandalone: true, selector: "idea-time-interval", inputs: { timeInterval: "timeInterval", period: "period", notEarlierThan: "notEarlierThan", notLaterThan: "notLaterThan", label: "label", icon: "icon", iconColor: "iconColor", placeholder: "placeholder", disabled: "disabled", tappableWhenDisabled: "tappableWhenDisabled", obligatory: "obligatory", lines: "lines", color: "color" }, outputs: { select: "select", iconSelect: "iconSelect", selectWhenDisabled: "selectWhenDisabled" }, usesOnChanges: true, ngImport: i0, template: `
85
- <ion-item
86
- class="timeIntervalItem"
87
- [color]="color"
88
- [lines]="lines"
89
- [button]="!disabled"
90
- [disabled]="isOpening"
91
- [title]="placeholder || valueToDisplay || ''"
92
- [class.withLabel]="label"
93
- (click)="disabled ? doSelectWhenDisabled() : pickTimeInterval()"
94
- >
95
- @if (icon) {
96
- <ion-button
97
- fill="clear"
98
- slot="start"
99
- [color]="iconColor"
100
- [class.marginTop]="label"
101
- (click)="doIconSelect($event)"
102
- >
103
- <ion-icon [name]="icon" slot="icon-only" />
104
- </ion-button>
105
- }
106
- @if (label) {
107
- <ion-label position="stacked" [class.selectable]="!disabled || tappableWhenDisabled">
108
- {{ label }}
109
- @if (obligatory && !disabled) {
110
- <ion-text class="obligatoryDot" />
111
- }
112
- </ion-label>
113
- }
114
- <ion-label class="description" [class.selectable]="!disabled || tappableWhenDisabled">
115
- @if (!valueToDisplay && !disabled) {
116
- <ion-text class="placeholder" [class.selectable]="!disabled">
117
- {{ placeholder }}
118
- </ion-text>
119
- }
120
- {{ valueToDisplay }}
121
- </ion-label>
122
- @if (!disabled) {
123
- <ion-icon slot="end" name="caret-down" class="selectIcon" [class.selectable]="!disabled" />
124
- }
125
- </ion-item>
126
- `, isInline: true, styles: [".timeIntervalItem{min-height:48px;height:auto}.timeIntervalItem .description{margin:10px 0;height:20px;line-height:20px;width:100%}.timeIntervalItem .placeholder{color:var(--ion-color-medium)}.timeIntervalItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.timeIntervalItem.withLabel{min-height:58px;height:auto}.timeIntervalItem.withLabel .selectIcon{padding-top:25px}.timeIntervalItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}\n"], dependencies: [{ kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: 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: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "ngmodule", type: CommonModule }] }); }
127
- }
128
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEATimeIntervalComponent, decorators: [{
129
- type: Component,
130
- args: [{ selector: 'idea-time-interval', standalone: true, imports: [IonLabel, IonText, IonIcon, IonButton, IonItem, CommonModule], template: `
131
- <ion-item
132
- class="timeIntervalItem"
133
- [color]="color"
134
- [lines]="lines"
135
- [button]="!disabled"
136
- [disabled]="isOpening"
137
- [title]="placeholder || valueToDisplay || ''"
138
- [class.withLabel]="label"
139
- (click)="disabled ? doSelectWhenDisabled() : pickTimeInterval()"
140
- >
141
- @if (icon) {
142
- <ion-button
143
- fill="clear"
144
- slot="start"
145
- [color]="iconColor"
146
- [class.marginTop]="label"
147
- (click)="doIconSelect($event)"
148
- >
149
- <ion-icon [name]="icon" slot="icon-only" />
150
- </ion-button>
151
- }
152
- @if (label) {
153
- <ion-label position="stacked" [class.selectable]="!disabled || tappableWhenDisabled">
154
- {{ label }}
155
- @if (obligatory && !disabled) {
156
- <ion-text class="obligatoryDot" />
157
- }
158
- </ion-label>
159
- }
160
- <ion-label class="description" [class.selectable]="!disabled || tappableWhenDisabled">
161
- @if (!valueToDisplay && !disabled) {
162
- <ion-text class="placeholder" [class.selectable]="!disabled">
163
- {{ placeholder }}
164
- </ion-text>
165
- }
166
- {{ valueToDisplay }}
167
- </ion-label>
168
- @if (!disabled) {
169
- <ion-icon slot="end" name="caret-down" class="selectIcon" [class.selectable]="!disabled" />
170
- }
171
- </ion-item>
172
- `, styles: [".timeIntervalItem{min-height:48px;height:auto}.timeIntervalItem .description{margin:10px 0;height:20px;line-height:20px;width:100%}.timeIntervalItem .placeholder{color:var(--ion-color-medium)}.timeIntervalItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.timeIntervalItem.withLabel{min-height:58px;height:auto}.timeIntervalItem.withLabel .selectIcon{padding-top:25px}.timeIntervalItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}\n"] }]
173
- }], propDecorators: { timeInterval: [{
174
- type: Input
175
- }], period: [{
176
- type: Input
177
- }], notEarlierThan: [{
178
- type: Input
179
- }], notLaterThan: [{
180
- type: Input
181
- }], label: [{
182
- type: Input
183
- }], icon: [{
184
- type: Input
185
- }], iconColor: [{
186
- type: Input
187
- }], placeholder: [{
188
- type: Input
189
- }], disabled: [{
190
- type: Input
191
- }], tappableWhenDisabled: [{
192
- type: Input
193
- }], obligatory: [{
194
- type: Input
195
- }], lines: [{
196
- type: Input
197
- }], color: [{
198
- type: Input
199
- }], select: [{
200
- type: Output
201
- }], iconSelect: [{
202
- type: Output
203
- }], selectWhenDisabled: [{
204
- type: Output
205
- }] } });
206
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZUludGVydmFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvdW5jb21tb24vc3JjL3RpbWVJbnRlcnZhbC90aW1lSW50ZXJ2YWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUtaLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUc1RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBc0ZsRixNQUFNLE9BQU8seUJBQXlCO0lBcEZ0QztRQXFGVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQU1yRDs7V0FFRztRQUNNLFdBQU0sR0FBWSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBNkN0Qzs7V0FFRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzVDOztXQUVHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDaEQ7O1dBRUc7UUFDTyx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBS3hELGNBQVMsR0FBRyxLQUFLLENBQUM7S0E4RG5CO0lBNURDLFFBQVE7UUFDTiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxVQUFVLENB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LENBQUMsS0FBVTtRQUNyQixJQUFJLEtBQUs7WUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQzs4R0FySVUseUJBQXlCO2tHQUF6Qix5QkFBeUIsa2hCQWhGMUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVCxna0JBM0NTLFFBQVEsNkZBQUUsT0FBTyxnRkFBRSxPQUFPLDJKQUFFLFNBQVMsb1BBQUUsT0FBTyx5TkFBRSxZQUFZOzsyRkFpRjNELHlCQUF5QjtrQkFwRnJDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUCxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLFlBQzdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ1Q7OEJBNkNRLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsTUFBTTtzQkFBZCxLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBSUcsWUFBWTtzQkFBcEIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsSUFBSTtzQkFBWixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFJRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlHLEtBQUs7c0JBQWIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUksTUFBTTtzQkFBZixNQUFNO2dCQUlHLFVBQVU7c0JBQW5CLE1BQU07Z0JBSUcsa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgT25DaGFuZ2VzLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIsIElvbkl0ZW0sIElvbkJ1dHRvbiwgSW9uSWNvbiwgSW9uVGV4dCwgSW9uTGFiZWwgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGltZUludGVydmFsIH0gZnJvbSAnaWRlYS10b29sYm94JztcbmltcG9ydCB7IElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQUZyb21UaW1lVG9UaW1lQ29tcG9uZW50LCBQZXJpb2RzIH0gZnJvbSAnLi9mcm9tVGltZVRvVGltZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLXRpbWUtaW50ZXJ2YWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbSW9uTGFiZWwsIElvblRleHQsIElvbkljb24sIElvbkJ1dHRvbiwgSW9uSXRlbSwgQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW9uLWl0ZW1cbiAgICAgIGNsYXNzPVwidGltZUludGVydmFsSXRlbVwiXG4gICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgW2xpbmVzXT1cImxpbmVzXCJcbiAgICAgIFtidXR0b25dPVwiIWRpc2FibGVkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJpc09wZW5pbmdcIlxuICAgICAgW3RpdGxlXT1cInBsYWNlaG9sZGVyIHx8IHZhbHVlVG9EaXNwbGF5IHx8ICcnXCJcbiAgICAgIFtjbGFzcy53aXRoTGFiZWxdPVwibGFiZWxcIlxuICAgICAgKGNsaWNrKT1cImRpc2FibGVkID8gZG9TZWxlY3RXaGVuRGlzYWJsZWQoKSA6IHBpY2tUaW1lSW50ZXJ2YWwoKVwiXG4gICAgPlxuICAgICAgQGlmIChpY29uKSB7XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICBzbG90PVwic3RhcnRcIlxuICAgICAgICAgIFtjb2xvcl09XCJpY29uQ29sb3JcIlxuICAgICAgICAgIFtjbGFzcy5tYXJnaW5Ub3BdPVwibGFiZWxcIlxuICAgICAgICAgIChjbGljayk9XCJkb0ljb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW9uLWljb24gW25hbWVdPVwiaWNvblwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKGxhYmVsKSB7XG4gICAgICAgIDxpb24tbGFiZWwgcG9zaXRpb249XCJzdGFja2VkXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkIHx8IHRhcHBhYmxlV2hlbkRpc2FibGVkXCI+XG4gICAgICAgICAge3sgbGFiZWwgfX1cbiAgICAgICAgICBAaWYgKG9ibGlnYXRvcnkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJvYmxpZ2F0b3J5RG90XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgfVxuICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkIHx8IHRhcHBhYmxlV2hlbkRpc2FibGVkXCI+XG4gICAgICAgIEBpZiAoIXZhbHVlVG9EaXNwbGF5ICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cInBsYWNlaG9sZGVyXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkXCI+XG4gICAgICAgICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIH1cbiAgICAgICAge3sgdmFsdWVUb0Rpc3BsYXkgfX1cbiAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgQGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwiY2FyZXQtZG93blwiIGNsYXNzPVwic2VsZWN0SWNvblwiIFtjbGFzcy5zZWxlY3RhYmxlXT1cIiFkaXNhYmxlZFwiIC8+XG4gICAgICB9XG4gICAgPC9pb24taXRlbT5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLnRpbWVJbnRlcnZhbEl0ZW0ge1xuICAgICAgICBtaW4taGVpZ2h0OiA0OHB4O1xuICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgIC5kZXNjcmlwdGlvbiB7XG4gICAgICAgICAgbWFyZ2luOiAxMHB4IDA7XG4gICAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG4gICAgICAgIC5wbGFjZWhvbGRlciB7XG4gICAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pO1xuICAgICAgICB9XG4gICAgICAgIC5zZWxlY3RJY29uIHtcbiAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gICAgICAgICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC50aW1lSW50ZXJ2YWxJdGVtLndpdGhMYWJlbCB7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDU4cHg7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgLnNlbGVjdEljb24ge1xuICAgICAgICAgIHBhZGRpbmctdG9wOiAyNXB4O1xuICAgICAgICB9XG4gICAgICAgIGlvbi1idXR0b25bc2xvdD0nc3RhcnQnXSB7XG4gICAgICAgICAgbWFyZ2luLXRvcDogMTZweDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLnNlbGVjdGFibGUge1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB9XG4gICAgYFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIElERUFUaW1lSW50ZXJ2YWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgcHJpdmF0ZSBfbW9kYWwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfdHJhbnNsYXRlID0gaW5qZWN0KElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlKTtcblxuICAvKipcbiAgICogVGhlIHRpbWUgaW50ZXJ2YWwgdG8gc2V0LlxuICAgKi9cbiAgQElucHV0KCkgdGltZUludGVydmFsOiBUaW1lSW50ZXJ2YWw7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHNob3VsZCBzdGFydCBwaWNraW5nIHRoZSB0aW1lIGRpc3BsYXlpbmcgdGhlIGFmdGVybm9vbiAoUE0pIG9yIHRoZSBtb3JuaW5nIChBTSwgZGVmYXVsdCkuXG4gICAqL1xuICBASW5wdXQoKSBwZXJpb2Q6IFBlcmlvZHMgPSBQZXJpb2RzLkFNO1xuICAvKipcbiAgICogQSB0aW1lIHRvIHVzZSBhcyBsb3dlciBsaW1pdCBmb3IgdGhlIHBvc3NpYmxlIGNob2ljZXMuXG4gICAqL1xuICBASW5wdXQoKSBub3RFYXJsaWVyVGhhbjogbnVtYmVyO1xuICAvKipcbiAgICogQSB0aW1lIHRvIHVzZSBhcyB1cHBlciBsaW1pdCBmb3IgdGhlIHBvc3NpYmxlIGNob2ljZXMuXG4gICAqL1xuICBASW5wdXQoKSBub3RMYXRlclRoYW46IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBsYWJlbCBmb3IgdGhlIGZpZWxkLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpY29uIGZvciB0aGUgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBpY29uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGljb24uXG4gICAqL1xuICBASW5wdXQoKSBpY29uQ29sb3I6IHN0cmluZztcbiAgLyoqXG4gICAqIEEgcGxhY2Vob2xkZXIgZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLlxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgZmllbGQgaGFzIGEgdGFwcGFibGUgZWZmZWN0IHdoZW4gZGlzYWJsZWQuXG4gICAqL1xuICBASW5wdXQoKSB0YXBwYWJsZVdoZW5EaXNhYmxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBvYmxpZ2F0b3J5IGRvdCBpcyBzaG93bi5cbiAgICovXG4gIEBJbnB1dCgpIG9ibGlnYXRvcnk6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMaW5lcyBwcmVmZXJlbmNlcyBmb3IgdGhlIGl0ZW0uXG4gICAqL1xuICBASW5wdXQoKSBsaW5lczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbG9yIGZvciB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgY29sb3I6IHN0cmluZztcbiAgLyoqXG4gICAqIE9uIHNlbGVjdCBldmVudC5cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKlxuICAgKiBJY29uIHNlbGVjdC5cbiAgICovXG4gIEBPdXRwdXQoKSBpY29uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogT24gc2VsZWN0ICh3aXRoIHRoZSBmaWVsZCBkaXNhYmxlZCkgZXZlbnQuXG4gICAqL1xuICBAT3V0cHV0KCkgc2VsZWN0V2hlbkRpc2FibGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHZhbHVlVG9EaXNwbGF5OiBzdHJpbmc7XG4gIHByaXZhdGUgbGFuZ0NoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGlzT3BlbmluZyA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIHdoZW4gdGhlIGxhbmd1YWdlIGNoYW5nZXMsIHNldCB0aGUgbG9jYWxlXG4gICAgdGhpcy5sYW5nQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5fdHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy52YWx1ZVRvRGlzcGxheSA9IHRoaXMuZ2V0VmFsdWVUb0Rpc3BsYXkodGhpcy50aW1lSW50ZXJ2YWwpO1xuICAgIH0pO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhbmdDaGFuZ2VTdWJzY3JpcHRpb24pIHRoaXMubGFuZ0NoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy50aW1lSW50ZXJ2YWwpIHRoaXMudmFsdWVUb0Rpc3BsYXkgPSB0aGlzLmdldFZhbHVlVG9EaXNwbGF5KGNoYW5nZXMudGltZUludGVydmFsLmN1cnJlbnRWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFZhbHVlVG9EaXNwbGF5KHRpbWVJbnRlcnZhbDogVGltZUludGVydmFsKTogc3RyaW5nIHtcbiAgICBpZiAoIXRpbWVJbnRlcnZhbCB8fCAhdGltZUludGVydmFsLmlzU2V0KCkpIHJldHVybiAnJztcbiAgICAvLyBub3RlOiB0aGUgdGltZSBtdXN0IGJlIGFsd2F5cyBjb25zaWRlcmVkIHdpdGhvdXQgYW55IHRpbWV6b25lIChVVEMpXG4gICAgY29uc3QgZGF0ZU9wdHMgPSB7IHRpbWVab25lOiAnVVRDJywgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9IGFzIGNvbnN0O1xuICAgIHJldHVybiAnJy5jb25jYXQoXG4gICAgICB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9VTkNPTU1PTi5GVFRULkZST00nKSxcbiAgICAgICcgJyxcbiAgICAgIG5ldyBEYXRlKHRpbWVJbnRlcnZhbC5mcm9tKS50b0xvY2FsZVRpbWVTdHJpbmcodGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCksIGRhdGVPcHRzKSxcbiAgICAgICcgJyxcbiAgICAgIHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX1VOQ09NTU9OLkZUVFQuVE8nKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgJyAnLFxuICAgICAgbmV3IERhdGUodGltZUludGVydmFsLnRvKS50b0xvY2FsZVRpbWVTdHJpbmcodGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCksIGRhdGVPcHRzKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBwaWNrVGltZUludGVydmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzT3BlbmluZykgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMuX21vZGFsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IElERUFGcm9tVGltZVRvVGltZUNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudFByb3BzOiB7XG4gICAgICAgIHRpbWVJbnRlcnZhbDogdGhpcy50aW1lSW50ZXJ2YWwsXG4gICAgICAgIHBlcmlvZDogdGhpcy5wZXJpb2QsXG4gICAgICAgIG5vdEVhcmxpZXJUaGFuOiB0aGlzLm5vdEVhcmxpZXJUaGFuLFxuICAgICAgICBub3RMYXRlclRoYW46IHRoaXMubm90TGF0ZXJUaGFuLFxuICAgICAgICB0aXRsZTogdGhpcy5sYWJlbFxuICAgICAgfVxuICAgIH0pO1xuICAgIG1vZGFsLm9uRGlkRGlzbWlzcygpLnRoZW4oKHJlczogYW55KTogdm9pZCA9PiB7XG4gICAgICAvLyBpZiB0aGUgY29udGVudCBjaGFuZ2VkLCB1cGRhdGUgdGhlIGludGVybmFsIHZhbHVlcyBhbmQgbm90aWZ5IHRoZSBwYXJlbnQgY29tcG9uZW50XG4gICAgICBpZiAocmVzLmRhdGEgPT09IHRydWUgfHwgcmVzLmRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMudmFsdWVUb0Rpc3BsYXkgPSB0aGlzLmdldFZhbHVlVG9EaXNwbGF5KHRoaXMudGltZUludGVydmFsKTtcbiAgICAgICAgdGhpcy5zZWxlY3QuZW1pdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG1vZGFsLnByZXNlbnQoKTtcbiAgICB0aGlzLmlzT3BlbmluZyA9IGZhbHNlO1xuICB9XG5cbiAgZG9TZWxlY3RXaGVuRGlzYWJsZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHRoaXMuc2VsZWN0V2hlbkRpc2FibGVkLmVtaXQoKTtcbiAgfVxuXG4gIGRvSWNvblNlbGVjdChldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmljb25TZWxlY3QuZW1pdChldmVudCk7XG4gIH1cbn1cbiJdfQ==
@@ -1,49 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- /**
4
- * @deprecated use a specific App service instead.
5
- */
6
- export class IDEATinCanService {
7
- constructor() {
8
- this.clear();
9
- }
10
- /**
11
- * Set a variable with the given value.
12
- * @param variable variable to set
13
- * @param value value to assign to the variable
14
- */
15
- set(variable, value) {
16
- this.data[variable] = value;
17
- }
18
- /**
19
- * Get the content of a variable.
20
- * @param variable variable to acquire
21
- * @param getAndDelete if set, delete the variable after the acquisition
22
- */
23
- get(variable, getAndDelete) {
24
- const ret = this.data[variable];
25
- if (getAndDelete)
26
- this.remove(variable);
27
- return ret;
28
- }
29
- /**
30
- * Remove a variable.
31
- * @param variable variable to remove
32
- */
33
- remove(variable) {
34
- delete this.data[variable];
35
- }
36
- /**
37
- * Clear all the variables.
38
- */
39
- clear() {
40
- this.data = {};
41
- }
42
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEATinCanService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
43
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEATinCanService, providedIn: 'root' }); }
44
- }
45
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEATinCanService, decorators: [{
46
- type: Injectable,
47
- args: [{ providedIn: 'root' }]
48
- }], ctorParameters: () => [] });
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGluQ2FuLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL3VuY29tbW9uL3NyYy90aW5DYW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQzs7R0FFRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFHNUI7UUFDRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxRQUFnQixFQUFFLEtBQVU7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsUUFBZ0IsRUFBRSxZQUFzQjtRQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksWUFBWTtZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFFBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0Q7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDakIsQ0FBQzs4R0FyQ1UsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FESixNQUFNOzsyRkFDbkIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgYSBzcGVjaWZpYyBBcHAgc2VydmljZSBpbnN0ZWFkLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIElERUFUaW5DYW5TZXJ2aWNlIHtcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuXG4gICAqIEBwYXJhbSB2YXJpYWJsZSB2YXJpYWJsZSB0byBzZXRcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGFzc2lnbiB0byB0aGUgdmFyaWFibGVcbiAgICovXG4gIHNldCh2YXJpYWJsZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5kYXRhW3ZhcmlhYmxlXSA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbnRlbnQgb2YgYSB2YXJpYWJsZS5cbiAgICogQHBhcmFtIHZhcmlhYmxlIHZhcmlhYmxlIHRvIGFjcXVpcmVcbiAgICogQHBhcmFtIGdldEFuZERlbGV0ZSBpZiBzZXQsIGRlbGV0ZSB0aGUgdmFyaWFibGUgYWZ0ZXIgdGhlIGFjcXVpc2l0aW9uXG4gICAqL1xuICBnZXQodmFyaWFibGU6IHN0cmluZywgZ2V0QW5kRGVsZXRlPzogYm9vbGVhbik6IGFueSB7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5kYXRhW3ZhcmlhYmxlXTtcbiAgICBpZiAoZ2V0QW5kRGVsZXRlKSB0aGlzLnJlbW92ZSh2YXJpYWJsZSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIGEgdmFyaWFibGUuXG4gICAqIEBwYXJhbSB2YXJpYWJsZSB2YXJpYWJsZSB0byByZW1vdmVcbiAgICovXG4gIHJlbW92ZSh2YXJpYWJsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgZGVsZXRlIHRoaXMuZGF0YVt2YXJpYWJsZV07XG4gIH1cbiAgLyoqXG4gICAqIENsZWFyIGFsbCB0aGUgdmFyaWFibGVzLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhID0ge307XG4gIH1cbn1cbiJdfQ==