@idea-ionic/uncommon 8.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +21 -0
  3. package/css/global.scss +15 -0
  4. package/esm2022/idea-ionic-uncommon.mjs +5 -0
  5. package/esm2022/public-api.mjs +35 -0
  6. package/esm2022/src/AWSAPI.service.mjs +430 -0
  7. package/esm2022/src/AWSAPISocket.service.mjs +187 -0
  8. package/esm2022/src/address/address.component.mjs +94 -0
  9. package/esm2022/src/address/address.module.mjs +21 -0
  10. package/esm2022/src/announcement/announcement.component.mjs +41 -0
  11. package/esm2022/src/announcement/announcement.module.mjs +21 -0
  12. package/esm2022/src/cachedResources.service.mjs +55 -0
  13. package/esm2022/src/colors/colorPicker.component.mjs +135 -0
  14. package/esm2022/src/colors/colorPicker.module.mjs +20 -0
  15. package/esm2022/src/contacts/contacts.component.mjs +64 -0
  16. package/esm2022/src/contacts/contacts.module.mjs +21 -0
  17. package/esm2022/src/dateTime/calendarPicker.component.mjs +196 -0
  18. package/esm2022/src/dateTime/dateTime.component.mjs +133 -0
  19. package/esm2022/src/dateTime/dateTime.module.mjs +22 -0
  20. package/esm2022/src/duration/duration.component.mjs +77 -0
  21. package/esm2022/src/duration/duration.module.mjs +21 -0
  22. package/esm2022/src/echo/echo.module.mjs +26 -0
  23. package/esm2022/src/echo/echo.page.mjs +165 -0
  24. package/esm2022/src/errorReporting.service.mjs +68 -0
  25. package/esm2022/src/mde/mde.component.mjs +44 -0
  26. package/esm2022/src/mde/mde.module.mjs +22 -0
  27. package/esm2022/src/mde/mdeToolbar.component.mjs +12 -0
  28. package/esm2022/src/offline/cacheableResource.component.mjs +18 -0
  29. package/esm2022/src/offline/offline.module.mjs +22 -0
  30. package/esm2022/src/offline/offline.service.mjs +62 -0
  31. package/esm2022/src/offline/offlineData.service.mjs +479 -0
  32. package/esm2022/src/offline/offlineIndicator.component.mjs +58 -0
  33. package/esm2022/src/offline/offlineManager.component.mjs +84 -0
  34. package/esm2022/src/pushNotifications.service.mjs +56 -0
  35. package/esm2022/src/sentiment/sentiment.component.mjs +71 -0
  36. package/esm2022/src/sentiment/sentiment.module.mjs +21 -0
  37. package/esm2022/src/timeInterval/fromTimeToTime.component.mjs +155 -0
  38. package/esm2022/src/timeInterval/timeInterval.component.mjs +122 -0
  39. package/esm2022/src/timeInterval/timeInterval.module.mjs +22 -0
  40. package/esm2022/src/tinCan.service.mjs +49 -0
  41. package/fesm2022/idea-ionic-uncommon.mjs +2891 -0
  42. package/fesm2022/idea-ionic-uncommon.mjs.map +1 -0
  43. package/index.d.ts +5 -0
  44. package/package.json +51 -0
  45. package/public-api.d.ts +34 -0
  46. package/src/AWSAPI.service.d.ts +178 -0
  47. package/src/AWSAPISocket.service.d.ts +129 -0
  48. package/src/address/address.component.d.ts +64 -0
  49. package/src/address/address.module.d.ts +11 -0
  50. package/src/announcement/announcement.component.d.ts +23 -0
  51. package/src/announcement/announcement.module.d.ts +11 -0
  52. package/src/cachedResources.service.d.ts +34 -0
  53. package/src/colors/colorPicker.component.d.ts +78 -0
  54. package/src/colors/colorPicker.module.d.ts +10 -0
  55. package/src/contacts/contacts.component.d.ts +31 -0
  56. package/src/contacts/contacts.module.d.ts +11 -0
  57. package/src/dateTime/calendarPicker.component.d.ts +45 -0
  58. package/src/dateTime/dateTime.component.d.ts +81 -0
  59. package/src/dateTime/dateTime.module.d.ts +12 -0
  60. package/src/duration/duration.component.d.ts +68 -0
  61. package/src/duration/duration.module.d.ts +11 -0
  62. package/src/echo/echo.module.d.ts +12 -0
  63. package/src/echo/echo.page.d.ts +34 -0
  64. package/src/errorReporting.service.d.ts +26 -0
  65. package/src/mde/mde.component.d.ts +39 -0
  66. package/src/mde/mde.module.d.ts +12 -0
  67. package/src/mde/mdeToolbar.component.d.ts +5 -0
  68. package/src/offline/cacheableResource.component.d.ts +11 -0
  69. package/src/offline/offline.module.d.ts +12 -0
  70. package/src/offline/offline.service.d.ts +39 -0
  71. package/src/offline/offlineData.service.d.ts +281 -0
  72. package/src/offline/offlineIndicator.component.d.ts +25 -0
  73. package/src/offline/offlineManager.component.d.ts +17 -0
  74. package/src/pushNotifications.service.d.ts +26 -0
  75. package/src/sentiment/sentiment.component.d.ts +35 -0
  76. package/src/sentiment/sentiment.module.d.ts +11 -0
  77. package/src/timeInterval/fromTimeToTime.component.d.ts +61 -0
  78. package/src/timeInterval/timeInterval.component.d.ts +84 -0
  79. package/src/timeInterval/timeInterval.module.d.ts +12 -0
  80. package/src/tinCan.service.d.ts +31 -0
@@ -0,0 +1,84 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { ModalController, AlertController } from '@ionic/angular';
3
+ import { Browser } from '@capacitor/browser';
4
+ import { IDEAActionSheetController, IDEATranslationsService } from '@idea-ionic/common';
5
+ import { IDEAOfflineDataService } from './offlineData.service';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ionic/angular";
8
+ import * as i2 from "./cacheableResource.component";
9
+ import * as i3 from "@idea-ionic/common";
10
+ export class IDEAOfflineManagerComponent {
11
+ constructor() {
12
+ this._modal = inject(ModalController);
13
+ this._alert = inject(AlertController);
14
+ this._actions = inject(IDEAActionSheetController);
15
+ this._translate = inject(IDEATranslationsService);
16
+ this._offline = inject(IDEAOfflineDataService);
17
+ }
18
+ async sync() {
19
+ const alert = await this._alert.create({
20
+ header: this._translate._('IDEA_UNCOMMON.OFFLINE.SYNC_NOW'),
21
+ message: this._translate._('IDEA_UNCOMMON.OFFLINE.DONT_EXIT_APP_DISCLAIMER'),
22
+ buttons: [
23
+ { text: this._translate._('COMMON.CANCEL') },
24
+ { text: this._translate._('COMMON.GOT_IT'), handler: () => this._offline.synchronize(true) }
25
+ ]
26
+ });
27
+ alert.present();
28
+ }
29
+ async deleteRequest(request) {
30
+ const alert = await this._alert.create({
31
+ header: this._translate._('COMMON.ARE_YOU_SURE'),
32
+ message: this._translate._('IDEA_UNCOMMON.OFFLINE.DELETION_IS_IRREVERSIBLE'),
33
+ buttons: [
34
+ { text: this._translate._('COMMON.CANCEL') },
35
+ {
36
+ text: this._translate._('COMMON.CONFIRM'),
37
+ handler: () => this._offline.deleteRequest(request)
38
+ }
39
+ ]
40
+ });
41
+ alert.present();
42
+ }
43
+ downloadRequestLog(request) {
44
+ const dataURL = window.URL.createObjectURL(new Blob([JSON.stringify(request)], { type: 'text/json' }));
45
+ Browser.open({ url: dataURL });
46
+ }
47
+ async actions() {
48
+ const buttons = [
49
+ {
50
+ text: this._translate._('IDEA_UNCOMMON.OFFLINE.FORCE_FULL_SYNC'),
51
+ icon: 'sync',
52
+ handler: () => this.forceFullSync()
53
+ },
54
+ { text: this._translate._('COMMON.CANCEL'), role: 'cancel', icon: 'arrow-undo' }
55
+ ];
56
+ const actions = await this._actions.create({
57
+ header: this._translate._('IDEA_UNCOMMON.OFFLINE.ADVANCED_ACTIONS'),
58
+ buttons
59
+ });
60
+ actions.present();
61
+ }
62
+ async forceFullSync() {
63
+ const alert = await this._alert.create({
64
+ header: this._translate._('IDEA_UNCOMMON.OFFLINE.FORCE_FULL_SYNC'),
65
+ subHeader: this._translate._('COMMON.ARE_YOU_SURE'),
66
+ message: this._translate._('IDEA_UNCOMMON.OFFLINE.FULL_SYNC_DISCLAIMER'),
67
+ buttons: [
68
+ { text: this._translate._('COMMON.CANCEL'), role: 'cancel' },
69
+ { text: this._translate._('COMMON.CONFIRM'), handler: () => this._offline.forceFullSync() }
70
+ ]
71
+ });
72
+ alert.present();
73
+ }
74
+ close() {
75
+ this._modal.dismiss();
76
+ }
77
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAOfflineManagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
78
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: IDEAOfflineManagerComponent, selector: "idea-offline-manager", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>\n {{ 'IDEA_UNCOMMON.OFFLINE.OFFLINE_MANAGER' | translate }}\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'IDEA_UNCOMMON.OFFLINE.ADVANCED_ACTIONS' | translate\" (click)=\"actions()\">\n <ion-icon slot=\"icon-only\" name=\"ellipsis-vertical\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-list class=\"aList\">\n @if (!_offline.synchronizing && _offline.requiresManualConfirmation) {\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.HUGE_SYNC_NEED_MANUAL_CONFIRMATION' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n }\n @if (!_offline.synchronizing) {\n <ion-list-header>\n <ion-label class=\"ion-text-wrap\">\n <h3 class=\"lastSyncAt\">\n {{ 'IDEA_UNCOMMON.OFFLINE.LAST_SYNC' | translate }}:\n <ion-text>\n {{\n _offline.lastSyncAt\n ? (_offline.lastSyncAt | dateLocale: 'medium')\n : ('IDEA_UNCOMMON.OFFLINE.NEVER' | translate)\n }}\n </ion-text>\n </h3>\n @if (_offline.errorInLastSync) {\n <p>\n <ion-text color=\"danger\">\n <b>{{ 'IDEA_UNCOMMON.OFFLINE.ERROR_DURING_LAST_SYNC' | translate }}</b>\n </ion-text>\n </p>\n }\n </ion-label>\n <ion-button\n size=\"small\"\n fill=\"solid\"\n [color]=\"_offline.errorInLastSync ? 'danger' : 'dark'\"\n [disabled]=\"_offline.isOffline()\"\n (click)=\"sync()\"\n >\n <ion-icon slot=\"start\" name=\"sync\" /> {{ 'IDEA_UNCOMMON.OFFLINE.SYNC_NOW' | translate }}\n </ion-button>\n </ion-list-header>\n }\n </ion-list>\n @if (_offline.synchronizing) {\n <ion-list class=\"aList\">\n <ion-item>\n <ion-label class=\"ion-text-center\">\n <ion-spinner name=\"crescent\" color=\"primary\" />\n </ion-label>\n </ion-item>\n </ion-list>\n }\n @if (_offline.useQueueAPIRequests) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.UPLOAD' | translate }}</h2>\n <p>{{ 'IDEA_UNCOMMON.OFFLINE.UPLOAD_QUEUE_REQUESTS_EXPLANATION' | translate }}</p>\n </ion-label>\n </ion-list-header>\n @if (!_offline.queueAPIRequests.length) {\n <ion-item>\n <i>{{ 'IDEA_UNCOMMON.OFFLINE.NO_ELEMENTS_TO_UPLOAD' | translate }}</i>\n <ion-icon slot=\"end\" size=\"small\" name=\"checkmark\" color=\"success\" />\n </ion-item>\n }\n @for (r of _offline.queueAPIRequests; track r; let odd = $odd) {\n <ion-item [class.oddItem]=\"odd\">\n <ion-label class=\"ion-text-wrap\">\n {{ r.description }}\n @if (r.error) {\n <p>\n <ion-text color=\"danger\">\n <b>{{ 'IDEA_UNCOMMON.OFFLINE.ERROR_CODE' | translate }}: {{ r.error }}</b>\n </ion-text>\n <br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_I' | translate }}<br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_II' | translate }}<br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_III' | translate }}\n </p>\n }\n </ion-label>\n @if (r.error) {\n <ion-button\n fill=\"clear\"\n slot=\"end\"\n color=\"danger\"\n [title]=\"'IDEA_UNCOMMON.OFFLINE.CANCEL_REQUEST' | translate\"\n (click)=\"deleteRequest(r)\"\n >\n <ion-icon slot=\"icon-only\" name=\"trash\" />\n </ion-button>\n }\n @if (r.error) {\n <ion-button\n fill=\"clear\"\n slot=\"end\"\n color=\"medium\"\n [title]=\"'IDEA_UNCOMMON.OFFLINE.DOWNLOAD_LOG' | translate\"\n (click)=\"downloadRequestLog(r)\"\n >\n <ion-icon slot=\"icon-only\" name=\"download\" />\n </ion-button>\n }\n @if (_offline.synchronizing) {\n <ion-spinner slot=\"end\" name=\"dots\" />\n }\n </ion-item>\n }\n </ion-list>\n }\n @if (_offline.getResources().length) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.DOWNLOAD' | translate }}</h2>\n <p>{{ 'IDEA_UNCOMMON.OFFLINE.DOWNLOAD_RESOURCES_EXPLANATION' | translate }}</p>\n </ion-label>\n </ion-list-header>\n @for (r of _offline.getResources(); track r) {\n <idea-cacheable-resource [resource]=\"_offline.getCacheableResource(r)\" />\n }\n </ion-list>\n }\n</ion-content>\n", styles: [".aList{max-width:500px;margin:0 auto}.aList ion-list-header{padding-right:10px}.aList ion-list-header h3.lastSyncAt{margin-top:6px}\n"], dependencies: [{ kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i1.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i1.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IDEACacheableResourceComponent, selector: "idea-cacheable-resource", inputs: ["resource"] }, { kind: "pipe", type: i3.IDEATranslatePipe, name: "translate" }, { kind: "pipe", type: i3.IDEALocalizedDatePipe, name: "dateLocale" }] }); }
79
+ }
80
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAOfflineManagerComponent, decorators: [{
81
+ type: Component,
82
+ args: [{ selector: 'idea-offline-manager', template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>\n {{ 'IDEA_UNCOMMON.OFFLINE.OFFLINE_MANAGER' | translate }}\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'IDEA_UNCOMMON.OFFLINE.ADVANCED_ACTIONS' | translate\" (click)=\"actions()\">\n <ion-icon slot=\"icon-only\" name=\"ellipsis-vertical\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-list class=\"aList\">\n @if (!_offline.synchronizing && _offline.requiresManualConfirmation) {\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.HUGE_SYNC_NEED_MANUAL_CONFIRMATION' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n }\n @if (!_offline.synchronizing) {\n <ion-list-header>\n <ion-label class=\"ion-text-wrap\">\n <h3 class=\"lastSyncAt\">\n {{ 'IDEA_UNCOMMON.OFFLINE.LAST_SYNC' | translate }}:\n <ion-text>\n {{\n _offline.lastSyncAt\n ? (_offline.lastSyncAt | dateLocale: 'medium')\n : ('IDEA_UNCOMMON.OFFLINE.NEVER' | translate)\n }}\n </ion-text>\n </h3>\n @if (_offline.errorInLastSync) {\n <p>\n <ion-text color=\"danger\">\n <b>{{ 'IDEA_UNCOMMON.OFFLINE.ERROR_DURING_LAST_SYNC' | translate }}</b>\n </ion-text>\n </p>\n }\n </ion-label>\n <ion-button\n size=\"small\"\n fill=\"solid\"\n [color]=\"_offline.errorInLastSync ? 'danger' : 'dark'\"\n [disabled]=\"_offline.isOffline()\"\n (click)=\"sync()\"\n >\n <ion-icon slot=\"start\" name=\"sync\" /> {{ 'IDEA_UNCOMMON.OFFLINE.SYNC_NOW' | translate }}\n </ion-button>\n </ion-list-header>\n }\n </ion-list>\n @if (_offline.synchronizing) {\n <ion-list class=\"aList\">\n <ion-item>\n <ion-label class=\"ion-text-center\">\n <ion-spinner name=\"crescent\" color=\"primary\" />\n </ion-label>\n </ion-item>\n </ion-list>\n }\n @if (_offline.useQueueAPIRequests) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.UPLOAD' | translate }}</h2>\n <p>{{ 'IDEA_UNCOMMON.OFFLINE.UPLOAD_QUEUE_REQUESTS_EXPLANATION' | translate }}</p>\n </ion-label>\n </ion-list-header>\n @if (!_offline.queueAPIRequests.length) {\n <ion-item>\n <i>{{ 'IDEA_UNCOMMON.OFFLINE.NO_ELEMENTS_TO_UPLOAD' | translate }}</i>\n <ion-icon slot=\"end\" size=\"small\" name=\"checkmark\" color=\"success\" />\n </ion-item>\n }\n @for (r of _offline.queueAPIRequests; track r; let odd = $odd) {\n <ion-item [class.oddItem]=\"odd\">\n <ion-label class=\"ion-text-wrap\">\n {{ r.description }}\n @if (r.error) {\n <p>\n <ion-text color=\"danger\">\n <b>{{ 'IDEA_UNCOMMON.OFFLINE.ERROR_CODE' | translate }}: {{ r.error }}</b>\n </ion-text>\n <br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_I' | translate }}<br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_II' | translate }}<br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_III' | translate }}\n </p>\n }\n </ion-label>\n @if (r.error) {\n <ion-button\n fill=\"clear\"\n slot=\"end\"\n color=\"danger\"\n [title]=\"'IDEA_UNCOMMON.OFFLINE.CANCEL_REQUEST' | translate\"\n (click)=\"deleteRequest(r)\"\n >\n <ion-icon slot=\"icon-only\" name=\"trash\" />\n </ion-button>\n }\n @if (r.error) {\n <ion-button\n fill=\"clear\"\n slot=\"end\"\n color=\"medium\"\n [title]=\"'IDEA_UNCOMMON.OFFLINE.DOWNLOAD_LOG' | translate\"\n (click)=\"downloadRequestLog(r)\"\n >\n <ion-icon slot=\"icon-only\" name=\"download\" />\n </ion-button>\n }\n @if (_offline.synchronizing) {\n <ion-spinner slot=\"end\" name=\"dots\" />\n }\n </ion-item>\n }\n </ion-list>\n }\n @if (_offline.getResources().length) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.DOWNLOAD' | translate }}</h2>\n <p>{{ 'IDEA_UNCOMMON.OFFLINE.DOWNLOAD_RESOURCES_EXPLANATION' | translate }}</p>\n </ion-label>\n </ion-list-header>\n @for (r of _offline.getResources(); track r) {\n <idea-cacheable-resource [resource]=\"_offline.getCacheableResource(r)\" />\n }\n </ion-list>\n }\n</ion-content>\n", styles: [".aList{max-width:500px;margin:0 auto}.aList ion-list-header{padding-right:10px}.aList ion-list-header h3.lastSyncAt{margin-top:6px}\n"] }]
83
+ }] });
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZU1hbmFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvb2ZmbGluZS9vZmZsaW5lTWFuYWdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3VuY29tbW9uL3NyYy9vZmZsaW5lL29mZmxpbmVNYW5hZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhGLE9BQU8sRUFBRSxzQkFBc0IsRUFBYyxNQUFNLHVCQUF1QixDQUFDOzs7OztBQU8zRSxNQUFNLE9BQU8sMkJBQTJCO0lBTHhDO1FBTVUsV0FBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLGFBQVEsR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxlQUFVLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDckQsYUFBUSxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0tBaUUzQztJQS9EQyxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDO1lBQzNELE9BQU8sRUFBRSxJ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RUFBRTtnQkFDUCxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUM1RCxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxFQUFFO2FBQ2xHO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDOzhHQXJFVSwyQkFBMkI7a0dBQTNCLDJCQUEyQiw0RENaeEMsd2lLQTZJQTs7MkZEaklhLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBBbGVydENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBCcm93c2VyIH0gZnJvbSAnQGNhcGFjaXRvci9icm93c2VyJztcbmltcG9ydCB7IElERUFBY3Rpb25TaGVldENvbnRyb2xsZXIsIElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQU9mZmxpbmVEYXRhU2VydmljZSwgQVBJUmVxdWVzdCB9IGZyb20gJy4vb2ZmbGluZURhdGEuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lkZWEtb2ZmbGluZS1tYW5hZ2VyJyxcbiAgdGVtcGxhdGVVcmw6ICdvZmZsaW5lTWFuYWdlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydvZmZsaW5lTWFuYWdlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIElERUFPZmZsaW5lTWFuYWdlckNvbXBvbmVudCB7XG4gIHByaXZhdGUgX21vZGFsID0gaW5qZWN0KE1vZGFsQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX2FsZXJ0ID0gaW5qZWN0KEFsZXJ0Q29udHJvbGxlcik7XG4gIHByaXZhdGUgX2FjdGlvbnMgPSBpbmplY3QoSURFQUFjdGlvblNoZWV0Q29udHJvbGxlcik7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG4gIF9vZmZsaW5lID0gaW5qZWN0KElERUFPZmZsaW5lRGF0YVNlcnZpY2UpO1xuXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLl9hbGVydC5jcmVhdGUoe1xuICAgICAgaGVhZGVyOiB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9VTkNPTU1PTi5PRkZMSU5FLlNZTkNfTk9XJyksXG4gICAgICBtZXNzYWdlOiB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9VTkNPTU1PTi5PRkZMSU5FLkRPTlRfRVhJVF9BUFBfRElTQ0xBSU1FUicpLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7IHRleHQ6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uQ0FOQ0VMJykgfSxcbiAgICAgICAgeyB0ZXh0OiB0aGlzLl90cmFuc2xhdGUuXygnQ09NTU9OLkdPVF9JVCcpLCBoYW5kbGVyOiAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLl9vZmZsaW5lLnN5bmNocm9uaXplKHRydWUpIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBhbGVydC5wcmVzZW50KCk7XG4gIH1cblxuICBhc3luYyBkZWxldGVSZXF1ZXN0KHJlcXVlc3Q6IEFQSVJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGVydCA9IGF3YWl0IHRoaXMuX2FsZXJ0LmNyZWF0ZSh7XG4gICAgICBoZWFkZXI6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uQVJFX1lPVV9TVVJFJyksXG4gICAgICBtZXNzYWdlOiB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9VTkNPTU1PTi5PRkZMSU5FLkRFTEVUSU9OX0lTX0lSUkVWRVJTSUJMRScpLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7IHRleHQ6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uQ0FOQ0VMJykgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uQ09ORklSTScpLFxuICAgICAgICAgIGhhbmRsZXI6ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMuX29mZmxpbmUuZGVsZXRlUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gICAgYWxlcnQucHJlc2VudCgpO1xuICB9XG4gIGRvd25sb2FkUmVxdWVzdExvZyhyZXF1ZXN0OiBBUElSZXF1ZXN0KTogdm9pZCB7XG4gICAgY29uc3QgZGF0YVVSTCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShyZXF1ZXN0KV0sIHsgdHlwZTogJ3RleHQvanNvbicgfSkpO1xuICAgIEJyb3dzZXIub3Blbih7IHVybDogZGF0YVVSTCB9KTtcbiAgfVxuXG4gIGFzeW5jIGFjdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYnV0dG9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfVU5DT01NT04uT0ZGTElORS5GT1JDRV9GVUxMX1NZTkMnKSxcbiAgICAgICAgaWNvbjogJ3N5bmMnLFxuICAgICAgICBoYW5kbGVyOiAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLmZvcmNlRnVsbFN5bmMoKVxuICAgICAgfSxcbiAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5DQU5DRUwnKSwgcm9sZTogJ2NhbmNlbCcsIGljb246ICdhcnJvdy11bmRvJyB9XG4gICAgXTtcbiAgICBjb25zdCBhY3Rpb25zID0gYXdhaXQgdGhpcy5fYWN0aW9ucy5jcmVhdGUoe1xuICAgICAgaGVhZGVyOiB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9VTkNPTU1PTi5PRkZMSU5FLkFEVkFOQ0VEX0FDVElPTlMnKSxcbiAgICAgIGJ1dHRvbnNcbiAgICB9KTtcbiAgICBhY3Rpb25zLnByZXNlbnQoKTtcbiAgfVxuXG4gIGFzeW5jIGZvcmNlRnVsbFN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLl9hbGVydC5jcmVhdGUoe1xuICAgICAgaGVhZGVyOiB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9VTkNPTU1PTi5PRkZMSU5FLkZPUkNFX0ZVTExfU1lOQycpLFxuICAgICAgc3ViSGVhZGVyOiB0aGlzLl90cmFuc2xhdGUuXygnQ09NTU9OLkFSRV9ZT1VfU1VSRScpLFxuICAgICAgbWVzc2FnZTogdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfVU5DT01NT04uT0ZGTElORS5GVUxMX1NZTkNfRElTQ0xBSU1FUicpLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7IHRleHQ6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uQ0FOQ0VMJyksIHJvbGU6ICdjYW5jZWwnIH0sXG4gICAgICAgIHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5DT05GSVJNJyksIGhhbmRsZXI6ICgpOiB2b2lkID0+IHRoaXMuX29mZmxpbmUuZm9yY2VGdWxsU3luYygpIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBhbGVydC5wcmVzZW50KCk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKCk7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2xvc2VcIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tdGl0bGU+XG4gICAgICB7eyAnSURFQV9VTkNPTU1PTi5PRkZMSU5FLk9GRkxJTkVfTUFOQUdFUicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2lvbi10aXRsZT5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgPGlvbi1idXR0b24gW3RpdGxlXT1cIidJREVBX1VOQ09NTU9OLk9GRkxJTkUuQURWQU5DRURfQUNUSU9OUycgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwiYWN0aW9ucygpXCI+XG4gICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImVsbGlwc2lzLXZlcnRpY2FsXCIgLz5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuPGlvbi1jb250ZW50PlxuICA8aW9uLWxpc3QgY2xhc3M9XCJhTGlzdFwiPlxuICAgIEBpZiAoIV9vZmZsaW5lLnN5bmNocm9uaXppbmcgJiYgX29mZmxpbmUucmVxdWlyZXNNYW51YWxDb25maXJtYXRpb24pIHtcbiAgICAgIDxpb24tbGlzdC1oZWFkZXI+XG4gICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgPGgyPnt7ICdJREVBX1VOQ09NTU9OLk9GRkxJTkUuSFVHRV9TWU5DX05FRURfTUFOVUFMX0NPTkZJUk1BVElPTicgfCB0cmFuc2xhdGUgfX08L2gyPlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgIDwvaW9uLWxpc3QtaGVhZGVyPlxuICAgIH1cbiAgICBAaWYgKCFfb2ZmbGluZS5zeW5jaHJvbml6aW5nKSB7XG4gICAgICA8aW9uLWxpc3QtaGVhZGVyPlxuICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiaW9uLXRleHQtd3JhcFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImxhc3RTeW5jQXRcIj5cbiAgICAgICAgICAgIHt7ICdJREVBX1VOQ09NTU9OLk9GRkxJTkUuTEFTVF9TWU5DJyB8IHRyYW5zbGF0ZSB9fTpcbiAgICAgICAgICAgIDxpb24tdGV4dD5cbiAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICBfb2ZmbGluZS5sYXN0U3luY0F0XG4gICAgICAgICAgICAgICAgICA/IChfb2ZmbGluZS5sYXN0U3luY0F0IHwgZGF0ZUxvY2FsZTogJ21lZGl1bScpXG4gICAgICAgICAgICAgICAgICA6ICgnSURFQV9VTkNPTU1PTi5PRkZMSU5FLk5FVkVSJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICBAaWYgKF9vZmZsaW5lLmVycm9ySW5MYXN0U3luYykge1xuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhbmdlclwiPlxuICAgICAgICAgICAgICAgIDxiPnt7ICdJREVBX1VOQ09NTU9OLk9GRkxJTkUuRVJST1JfRFVSSU5HX0xBU1RfU1lOQycgfCB0cmFuc2xhdGUgfX08L2I+XG4gICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIGZpbGw9XCJzb2xpZFwiXG4gICAgICAgICAgW2NvbG9yXT1cIl9vZmZsaW5lLmVycm9ySW5MYXN0U3luYyA/ICdkYW5nZXInIDogJ2RhcmsnXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiX29mZmxpbmUuaXNPZmZsaW5lKClcIlxuICAgICAgICAgIChjbGljayk9XCJzeW5jKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJzeW5jXCIgLz4ge3sgJ0lERUFfVU5DT01NT04uT0ZGTElORS5TWU5DX05PVycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tbGlzdC1oZWFkZXI+XG4gICAgfVxuICA8L2lvbi1saXN0PlxuICBAaWYgKF9vZmZsaW5lLnN5bmNocm9uaXppbmcpIHtcbiAgICA8aW9uLWxpc3QgY2xhc3M9XCJhTGlzdFwiPlxuICAgICAgPGlvbi1pdGVtPlxuICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiIGNvbG9yPVwicHJpbWFyeVwiIC8+XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgPC9pb24taXRlbT5cbiAgICA8L2lvbi1saXN0PlxuICB9XG4gIEBpZiAoX29mZmxpbmUudXNlUXVldWVBUElSZXF1ZXN0cykge1xuICAgIDxpb24tbGlzdCBjbGFzcz1cImFMaXN0XCI+XG4gICAgICA8aW9uLWxpc3QtaGVhZGVyPlxuICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgIDxoMj57eyAnSURFQV9VTkNPTU1PTi5PRkZMSU5FLlVQTE9BRCcgfCB0cmFuc2xhdGUgfX08L2gyPlxuICAgICAgICAgIDxwPnt7ICdJREVBX1VOQ09NTU9OLk9GRkxJTkUuVVBMT0FEX1FVRVVFX1JFUVVFU1RTX0VYUExBTkFUSU9OJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICA8L2lvbi1saXN0LWhlYWRlcj5cbiAgICAgIEBpZiAoIV9vZmZsaW5lLnF1ZXVlQVBJUmVxdWVzdHMubGVuZ3RoKSB7XG4gICAgICAgIDxpb24taXRlbT5cbiAgICAgICAgICA8aT57eyAnSURFQV9VTkNPTU1PTi5PRkZMSU5FLk5PX0VMRU1FTlRTX1RPX1VQTE9BRCcgfCB0cmFuc2xhdGUgfX08L2k+XG4gICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBzaXplPVwic21hbGxcIiBuYW1lPVwiY2hlY2ttYXJrXCIgY29sb3I9XCJzdWNjZXNzXCIgLz5cbiAgICAgICAgPC9pb24taXRlbT5cbiAgICAgIH1cbiAgICAgIEBmb3IgKHIgb2YgX29mZmxpbmUucXVldWVBUElSZXF1ZXN0czsgdHJhY2sgcjsgbGV0IG9kZCA9ICRvZGQpIHtcbiAgICAgICAgPGlvbi1pdGVtIFtjbGFzcy5vZGRJdGVtXT1cIm9kZFwiPlxuICAgICAgICAgIDxpb24tbGFiZWwgY2xhc3M9XCJpb24tdGV4dC13cmFwXCI+XG4gICAgICAgICAgICB7eyByLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICBAaWYgKHIuZXJyb3IpIHtcbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICA8Yj57eyAnSURFQV9VTkNPTU1PTi5PRkZMSU5FLkVSUk9SX0NPREUnIHwgdHJhbnNsYXRlIH19OiB7eyByLmVycm9yIH19PC9iPlxuICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAge3sgJ0lERUFfVU5DT01NT04uT0ZGTElORS5SRVFVRVNUX0ZBSUxFRF9FWFBMQU5BVElPTl9JJyB8IHRyYW5zbGF0ZSB9fTxiciAvPlxuICAgICAgICAgICAgICAgIHt7ICdJREVBX1VOQ09NTU9OLk9GRkxJTkUuUkVRVUVTVF9GQUlMRURfRVhQTEFOQVRJT05fSUknIHwgdHJhbnNsYXRlIH19PGJyIC8+XG4gICAgICAgICAgICAgICAge3sgJ0lERUFfVU5DT01NT04uT0ZGTElORS5SRVFVRVNUX0ZBSUxFRF9FWFBMQU5BVElPTl9JSUknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICBAaWYgKHIuZXJyb3IpIHtcbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5PRkZMSU5FLkNBTkNFTF9SRVFVRVNUJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVSZXF1ZXN0KHIpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwidHJhc2hcIiAvPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKHIuZXJyb3IpIHtcbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICAgICAgICBjb2xvcj1cIm1lZGl1bVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5PRkZMSU5FLkRPV05MT0FEX0xPRycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRSZXF1ZXN0TG9nKHIpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiZG93bmxvYWRcIiAvPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKF9vZmZsaW5lLnN5bmNocm9uaXppbmcpIHtcbiAgICAgICAgICAgIDxpb24tc3Bpbm5lciBzbG90PVwiZW5kXCIgbmFtZT1cImRvdHNcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9pb24taXRlbT5cbiAgICAgIH1cbiAgICA8L2lvbi1saXN0PlxuICB9XG4gIEBpZiAoX29mZmxpbmUuZ2V0UmVzb3VyY2VzKCkubGVuZ3RoKSB7XG4gICAgPGlvbi1saXN0IGNsYXNzPVwiYUxpc3RcIj5cbiAgICAgIDxpb24tbGlzdC1oZWFkZXI+XG4gICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgPGgyPnt7ICdJREVBX1VOQ09NTU9OLk9GRkxJTkUuRE9XTkxPQUQnIHwgdHJhbnNsYXRlIH19PC9oMj5cbiAgICAgICAgICA8cD57eyAnSURFQV9VTkNPTU1PTi5PRkZMSU5FLkRPV05MT0FEX1JFU09VUkNFU19FWFBMQU5BVElPTicgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgPC9pb24tbGlzdC1oZWFkZXI+XG4gICAgICBAZm9yIChyIG9mIF9vZmZsaW5lLmdldFJlc291cmNlcygpOyB0cmFjayByKSB7XG4gICAgICAgIDxpZGVhLWNhY2hlYWJsZS1yZXNvdXJjZSBbcmVzb3VyY2VdPVwiX29mZmxpbmUuZ2V0Q2FjaGVhYmxlUmVzb3VyY2UocilcIiAvPlxuICAgICAgfVxuICAgIDwvaW9uLWxpc3Q+XG4gIH1cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
@@ -0,0 +1,56 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { Platform } from '@ionic/angular';
3
+ import { PushNotifications } from '@capacitor/push-notifications';
4
+ import { Observable } from 'rxjs';
5
+ import { PushNotificationsDevice, PushNotificationsPlatforms } from 'idea-toolbox';
6
+ import { IDEAErrorReportingService } from './errorReporting.service';
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * To subscribe push notifications events.
10
+ */
11
+ export class IDEAPushNotificationsService {
12
+ constructor() {
13
+ this._platform = inject(Platform);
14
+ this._errorReporting = inject(IDEAErrorReportingService);
15
+ if (!this.isAvailable())
16
+ return;
17
+ this.registrations = new Observable(observer => {
18
+ PushNotifications.addListener('registration', token => observer.next(new PushNotificationsDevice({ token: token.value, platform: PushNotificationsPlatforms.FCM })));
19
+ });
20
+ this.errors = new Observable(observer => {
21
+ // rif. https://forum.ionicframework.com/t/226376
22
+ PushNotifications.addListener('registrationError', (err) => {
23
+ this._errorReporting.sendReport(err);
24
+ observer.next(err);
25
+ });
26
+ });
27
+ this.notifications = new Observable(observer => {
28
+ PushNotifications.addListener('pushNotificationReceived', n => observer.next(n));
29
+ });
30
+ }
31
+ /**
32
+ * Return true if the device is supported.
33
+ */
34
+ isAvailable() {
35
+ return this._platform.is('capacitor') && !!PushNotifications;
36
+ }
37
+ /**
38
+ * To fire the registration of a new device: it will rewquest the permission to use Push Notification.
39
+ * On iOS will prompt the request, on Android it's automatic.
40
+ */
41
+ async registerDevice() {
42
+ if (!this.isAvailable())
43
+ return;
44
+ let permStatus = await PushNotifications.checkPermissions();
45
+ if (permStatus.receive === 'prompt')
46
+ permStatus = await PushNotifications.requestPermissions();
47
+ if (permStatus.receive === 'granted')
48
+ PushNotifications.register();
49
+ }
50
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAPushNotificationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
51
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAPushNotificationsService }); }
52
+ }
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEAPushNotificationsService, decorators: [{
54
+ type: Injectable
55
+ }], ctorParameters: () => [] });
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVzaE5vdGlmaWNhdGlvbnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL21vZHVsZXMvdW5jb21tb24vc3JjL3B1c2hOb3RpZmljYXRpb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBMEIsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVuRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFFckU7O0dBRUc7QUFFSCxNQUFNLE9BQU8sNEJBQTRCO0lBUXZDO1FBUFEsY0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixvQkFBZSxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBTzFELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQUUsT0FBTztRQUVoQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzdDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FDcEQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLHVCQUF1QixDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FDN0csQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN0QyxpREFBaUQ7WUFDaEQsaUJBQXlCLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUMsR0FBVSxFQUFRLEVBQUU7Z0JBQy9FLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzdDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGNBQWM7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPO1FBRWhDLElBQUksVUFBVSxHQUFHLE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU1RCxJQUFJLFVBQVUsQ0FBQyxPQUFPLEtBQUssUUFBUTtZQUFFLFVBQVUsR0FBRyxNQUFNLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFL0YsSUFBSSxVQUFVLENBQUMsT0FBTyxLQUFLLFNBQVM7WUFBRSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyRSxDQUFDOzhHQS9DVSw0QkFBNEI7a0hBQTVCLDRCQUE0Qjs7MkZBQTVCLDRCQUE0QjtrQkFEeEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBQdXNoTm90aWZpY2F0aW9ucywgUHVzaE5vdGlmaWNhdGlvblNjaGVtYSB9IGZyb20gJ0BjYXBhY2l0b3IvcHVzaC1ub3RpZmljYXRpb25zJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFB1c2hOb3RpZmljYXRpb25zRGV2aWNlLCBQdXNoTm90aWZpY2F0aW9uc1BsYXRmb3JtcyB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5cbmltcG9ydCB7IElERUFFcnJvclJlcG9ydGluZ1NlcnZpY2UgfSBmcm9tICcuL2Vycm9yUmVwb3J0aW5nLnNlcnZpY2UnO1xuXG4vKipcbiAqIFRvIHN1YnNjcmliZSBwdXNoIG5vdGlmaWNhdGlvbnMgZXZlbnRzLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSURFQVB1c2hOb3RpZmljYXRpb25zU2VydmljZSB7XG4gIHByaXZhdGUgX3BsYXRmb3JtID0gaW5qZWN0KFBsYXRmb3JtKTtcbiAgcHJpdmF0ZSBfZXJyb3JSZXBvcnRpbmcgPSBpbmplY3QoSURFQUVycm9yUmVwb3J0aW5nU2VydmljZSk7XG5cbiAgcmVnaXN0cmF0aW9uczogT2JzZXJ2YWJsZTxQdXNoTm90aWZpY2F0aW9uc0RldmljZT47XG4gIG5vdGlmaWNhdGlvbnM6IE9ic2VydmFibGU8UHVzaE5vdGlmaWNhdGlvblNjaGVtYT47XG4gIGVycm9yczogT2JzZXJ2YWJsZTxFcnJvcj47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmlzQXZhaWxhYmxlKCkpIHJldHVybjtcblxuICAgIHRoaXMucmVnaXN0cmF0aW9ucyA9IG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICAgIFB1c2hOb3RpZmljYXRpb25zLmFkZExpc3RlbmVyKCdyZWdpc3RyYXRpb24nLCB0b2tlbiA9PlxuICAgICAgICBvYnNlcnZlci5uZXh0KG5ldyBQdXNoTm90aWZpY2F0aW9uc0RldmljZSh7IHRva2VuOiB0b2tlbi52YWx1ZSwgcGxhdGZvcm06IFB1c2hOb3RpZmljYXRpb25zUGxhdGZvcm1zLkZDTSB9KSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5lcnJvcnMgPSBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICAvLyByaWYuIGh0dHBzOi8vZm9ydW0uaW9uaWNmcmFtZXdvcmsuY29tL3QvMjI2Mzc2XG4gICAgICAoUHVzaE5vdGlmaWNhdGlvbnMgYXMgYW55KS5hZGRMaXN0ZW5lcigncmVnaXN0cmF0aW9uRXJyb3InLCAoZXJyOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLl9lcnJvclJlcG9ydGluZy5zZW5kUmVwb3J0KGVycik7XG4gICAgICAgIG9ic2VydmVyLm5leHQoZXJyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICAgIFB1c2hOb3RpZmljYXRpb25zLmFkZExpc3RlbmVyKCdwdXNoTm90aWZpY2F0aW9uUmVjZWl2ZWQnLCBuID0+IG9ic2VydmVyLm5leHQobikpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkLlxuICAgKi9cbiAgaXNBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYXRmb3JtLmlzKCdjYXBhY2l0b3InKSAmJiAhIVB1c2hOb3RpZmljYXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGZpcmUgdGhlIHJlZ2lzdHJhdGlvbiBvZiBhIG5ldyBkZXZpY2U6IGl0IHdpbGwgcmV3cXVlc3QgdGhlIHBlcm1pc3Npb24gdG8gdXNlIFB1c2ggTm90aWZpY2F0aW9uLlxuICAgKiBPbiBpT1Mgd2lsbCBwcm9tcHQgdGhlIHJlcXVlc3QsIG9uIEFuZHJvaWQgaXQncyBhdXRvbWF0aWMuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckRldmljZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNBdmFpbGFibGUoKSkgcmV0dXJuO1xuXG4gICAgbGV0IHBlcm1TdGF0dXMgPSBhd2FpdCBQdXNoTm90aWZpY2F0aW9ucy5jaGVja1Blcm1pc3Npb25zKCk7XG5cbiAgICBpZiAocGVybVN0YXR1cy5yZWNlaXZlID09PSAncHJvbXB0JykgcGVybVN0YXR1cyA9IGF3YWl0IFB1c2hOb3RpZmljYXRpb25zLnJlcXVlc3RQZXJtaXNzaW9ucygpO1xuXG4gICAgaWYgKHBlcm1TdGF0dXMucmVjZWl2ZSA9PT0gJ2dyYW50ZWQnKSBQdXNoTm90aWZpY2F0aW9ucy5yZWdpc3RlcigpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,71 @@
1
+ import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
2
+ import { Sentiment } from 'idea-toolbox';
3
+ import { IDEAEnvironment, IDEATranslationsService } from '@idea-ionic/common';
4
+ import { IDEAAWSAPIService } from '../AWSAPI.service';
5
+ import { IDEAOfflineService } from '../offline/offline.service';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ionic/angular";
8
+ import * as i2 from "@idea-ionic/common";
9
+ export class IDEASentimentComponent {
10
+ constructor() {
11
+ this._env = inject(IDEAEnvironment);
12
+ this._API = inject(IDEAAWSAPIService);
13
+ this._translate = inject(IDEATranslationsService);
14
+ this._offline = inject(IDEAOfflineService);
15
+ /**
16
+ * Triggers when the sentiment change.
17
+ */
18
+ this.change = new EventEmitter();
19
+ }
20
+ ngOnChanges(changes) {
21
+ if (changes.text.previousValue !== changes.text.currentValue)
22
+ this.detectSentiment(changes.text.currentValue);
23
+ }
24
+ async detectSentiment(text) {
25
+ if (!text || this._offline.isOffline())
26
+ this.sentiment = null;
27
+ else {
28
+ try {
29
+ const { sentiment } = await this._API.postResource('sentiment', {
30
+ idea: true,
31
+ body: { project: this._env.idea.project, language: this._translate.getCurrentLang(), text: this.text }
32
+ });
33
+ this.sentiment = sentiment;
34
+ this.change.emit(this.sentiment);
35
+ }
36
+ catch (error) {
37
+ this.sentiment = null;
38
+ }
39
+ }
40
+ }
41
+ getColorBySentiment(sentiment) {
42
+ sentiment = sentiment || this.sentiment;
43
+ switch (sentiment) {
44
+ case Sentiment.POSITIVE:
45
+ return 'success';
46
+ case Sentiment.NEGATIVE:
47
+ return 'danger';
48
+ case Sentiment.MIXED:
49
+ return 'warning';
50
+ case Sentiment.NEUTRAL:
51
+ return 'medium';
52
+ default:
53
+ return 'light';
54
+ }
55
+ }
56
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEASentimentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
57
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: IDEASentimentComponent, selector: "idea-sentiment", inputs: { text: "text", lines: "lines", color: "color" }, outputs: { change: "change" }, usesOnChanges: true, ngImport: i0, template: "@if (text && _offline.isOnline()) {\n <ion-item [lines]=\"lines\" [color]=\"color\">\n @if (!sentiment) {\n <ion-spinner slot=\"end\" size=\"small\" />\n }\n @if (sentiment) {\n <ion-badge\n slot=\"end\"\n size=\"small\"\n [color]=\"getColorBySentiment()\"\n [title]=\"'IDEA_UNCOMMON.SENTIMENT.RESULT_HINT' | translate: { sentiment: sentiment }\"\n >\n {{ 'IDEA_UNCOMMON.SENTIMENT.RESULT.' + sentiment | translate }}\n </ion-badge>\n }\n </ion-item>\n}\n", styles: [""], dependencies: [{ kind: "component", type: i1.IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "pipe", type: i2.IDEATranslatePipe, name: "translate" }] }); }
58
+ }
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEASentimentComponent, decorators: [{
60
+ type: Component,
61
+ args: [{ selector: 'idea-sentiment', template: "@if (text && _offline.isOnline()) {\n <ion-item [lines]=\"lines\" [color]=\"color\">\n @if (!sentiment) {\n <ion-spinner slot=\"end\" size=\"small\" />\n }\n @if (sentiment) {\n <ion-badge\n slot=\"end\"\n size=\"small\"\n [color]=\"getColorBySentiment()\"\n [title]=\"'IDEA_UNCOMMON.SENTIMENT.RESULT_HINT' | translate: { sentiment: sentiment }\"\n >\n {{ 'IDEA_UNCOMMON.SENTIMENT.RESULT.' + sentiment | translate }}\n </ion-badge>\n }\n </ion-item>\n}\n" }]
62
+ }], propDecorators: { text: [{
63
+ type: Input
64
+ }], lines: [{
65
+ type: Input
66
+ }], color: [{
67
+ type: Input
68
+ }], change: [{
69
+ type: Output
70
+ }] } });
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudGltZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvdW5jb21tb24vc3JjL3NlbnRpbWVudC9zZW50aW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvc2VudGltZW50L3NlbnRpbWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFPaEUsTUFBTSxPQUFPLHNCQUFzQjtJQUxuQztRQU1ZLFNBQUksR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsU0FBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRCxhQUFRLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFrQnRDOztXQUVHO1FBQ08sV0FBTSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7S0FvQ2xEO0lBbENDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoSCxDQUFDO0lBQ08sS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFZO1FBQ3hDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7WUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzthQUN6RCxDQUFDO1lBQ0osSUFBSSxDQUFDO2dCQUNILE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRTtvQkFDOUQsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRTtpQkFDdkcsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsU0FBOEI7UUFDaEQsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hDLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEIsS0FBSyxTQUFTLENBQUMsUUFBUTtnQkFDckIsT0FBTyxTQUFTLENBQUM7WUFDbkIsS0FBSyxTQUFTLENBQUMsUUFBUTtnQkFDckIsT0FBTyxRQUFRLENBQUM7WUFDbEIsS0FBSyxTQUFTLENBQUMsS0FBSztnQkFDbEIsT0FBTyxTQUFTLENBQUM7WUFDbkIsS0FBSyxTQUFTLENBQUMsT0FBTztnQkFDcEIsT0FBTyxRQUFRLENBQUM7WUFDbEI7Z0JBQ0UsT0FBTyxPQUFPLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7OEdBNURVLHNCQUFzQjtrR0FBdEIsc0JBQXNCLG9LQ1puQyw2Z0JBaUJBOzsyRkRMYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsZ0JBQWdCOzhCQWlCakIsSUFBSTtzQkFBWixLQUFLO2dCQUlHLEtBQUs7c0JBQWIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUksTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZW50aW1lbnQgfSBmcm9tICdpZGVhLXRvb2xib3gnO1xuaW1wb3J0IHsgSURFQUVudmlyb25tZW50LCBJREVBVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbmltcG9ydCB7IElERUFBV1NBUElTZXJ2aWNlIH0gZnJvbSAnLi4vQVdTQVBJLnNlcnZpY2UnO1xuaW1wb3J0IHsgSURFQU9mZmxpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vb2ZmbGluZS9vZmZsaW5lLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLXNlbnRpbWVudCcsXG4gIHRlbXBsYXRlVXJsOiAnc2VudGltZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3NlbnRpbWVudC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIElERUFTZW50aW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBwcm90ZWN0ZWQgX2VudiA9IGluamVjdChJREVBRW52aXJvbm1lbnQpO1xuICBwcml2YXRlIF9BUEkgPSBpbmplY3QoSURFQUFXU0FQSVNlcnZpY2UpO1xuICBwcml2YXRlIF90cmFuc2xhdGUgPSBpbmplY3QoSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UpO1xuICBfb2ZmbGluZSA9IGluamVjdChJREVBT2ZmbGluZVNlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VudGltZW50IGRldGVjdGVkIGZyb20gdGhlIGlucHV0IHRleHQuXG4gICAqL1xuICBzZW50aW1lbnQ6IFNlbnRpbWVudDtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCB0ZXh0LlxuICAgKi9cbiAgQElucHV0KCkgdGV4dDogc3RyaW5nO1xuICAvKipcbiAgICogTGluZXMgcHJlZmVyZW5jZXMgZm9yIHRoZSBpdGVtLlxuICAgKi9cbiAgQElucHV0KCkgbGluZXM6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb2xvciBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGNvbG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUcmlnZ2VycyB3aGVuIHRoZSBzZW50aW1lbnQgY2hhbmdlLlxuICAgKi9cbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VudGltZW50PigpO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy50ZXh0LnByZXZpb3VzVmFsdWUgIT09IGNoYW5nZXMudGV4dC5jdXJyZW50VmFsdWUpIHRoaXMuZGV0ZWN0U2VudGltZW50KGNoYW5nZXMudGV4dC5jdXJyZW50VmFsdWUpO1xuICB9XG4gIHByaXZhdGUgYXN5bmMgZGV0ZWN0U2VudGltZW50KHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGV4dCB8fCB0aGlzLl9vZmZsaW5lLmlzT2ZmbGluZSgpKSB0aGlzLnNlbnRpbWVudCA9IG51bGw7XG4gICAgZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHNlbnRpbWVudCB9ID0gYXdhaXQgdGhpcy5fQVBJLnBvc3RSZXNvdXJjZSgnc2VudGltZW50Jywge1xuICAgICAgICAgIGlkZWE6IHRydWUsXG4gICAgICAgICAgYm9keTogeyBwcm9qZWN0OiB0aGlzLl9lbnYuaWRlYS5wcm9qZWN0LCBsYW5ndWFnZTogdGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCksIHRleHQ6IHRoaXMudGV4dCB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlbnRpbWVudCA9IHNlbnRpbWVudDtcbiAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLnNlbnRpbWVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnNlbnRpbWVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29sb3JCeVNlbnRpbWVudChzZW50aW1lbnQ/OiBTZW50aW1lbnQgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHNlbnRpbWVudCA9IHNlbnRpbWVudCB8fCB0aGlzLnNlbnRpbWVudDtcbiAgICBzd2l0Y2ggKHNlbnRpbWVudCkge1xuICAgICAgY2FzZSBTZW50aW1lbnQuUE9TSVRJVkU6XG4gICAgICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gICAgICBjYXNlIFNlbnRpbWVudC5ORUdBVElWRTpcbiAgICAgICAgcmV0dXJuICdkYW5nZXInO1xuICAgICAgY2FzZSBTZW50aW1lbnQuTUlYRUQ6XG4gICAgICAgIHJldHVybiAnd2FybmluZyc7XG4gICAgICBjYXNlIFNlbnRpbWVudC5ORVVUUkFMOlxuICAgICAgICByZXR1cm4gJ21lZGl1bSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2xpZ2h0JztcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAodGV4dCAmJiBfb2ZmbGluZS5pc09ubGluZSgpKSB7XG4gIDxpb24taXRlbSBbbGluZXNdPVwibGluZXNcIiBbY29sb3JdPVwiY29sb3JcIj5cbiAgICBAaWYgKCFzZW50aW1lbnQpIHtcbiAgICAgIDxpb24tc3Bpbm5lciBzbG90PVwiZW5kXCIgc2l6ZT1cInNtYWxsXCIgLz5cbiAgICB9XG4gICAgQGlmIChzZW50aW1lbnQpIHtcbiAgICAgIDxpb24tYmFkZ2VcbiAgICAgICAgc2xvdD1cImVuZFwiXG4gICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgIFtjb2xvcl09XCJnZXRDb2xvckJ5U2VudGltZW50KClcIlxuICAgICAgICBbdGl0bGVdPVwiJ0lERUFfVU5DT01NT04uU0VOVElNRU5ULlJFU1VMVF9ISU5UJyB8IHRyYW5zbGF0ZTogeyBzZW50aW1lbnQ6IHNlbnRpbWVudCB9XCJcbiAgICAgID5cbiAgICAgICAge3sgJ0lERUFfVU5DT01NT04uU0VOVElNRU5ULlJFU1VMVC4nICsgc2VudGltZW50IHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2lvbi1iYWRnZT5cbiAgICB9XG4gIDwvaW9uLWl0ZW0+XG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { IonicModule } from '@ionic/angular';
5
+ import { IDEATranslationsModule } from '@idea-ionic/common';
6
+ import { IDEASentimentComponent } from './sentiment.component';
7
+ import * as i0 from "@angular/core";
8
+ export class IDEASentimentModule {
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEASentimentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.1", ngImport: i0, type: IDEASentimentModule, declarations: [IDEASentimentComponent], imports: [CommonModule, FormsModule, IonicModule, IDEATranslationsModule], exports: [IDEASentimentComponent] }); }
11
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEASentimentModule, imports: [CommonModule, FormsModule, IonicModule, IDEATranslationsModule] }); }
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEASentimentModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ imports: [CommonModule, FormsModule, IonicModule, IDEATranslationsModule],
17
+ declarations: [IDEASentimentComponent],
18
+ exports: [IDEASentimentComponent]
19
+ }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudGltZW50Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvdW5jb21tb24vc3JjL3NlbnRpbWVudC9zZW50aW1lbnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBTy9ELE1BQU0sT0FBTyxtQkFBbUI7OEdBQW5CLG1CQUFtQjsrR0FBbkIsbUJBQW1CLGlCQUhmLHNCQUFzQixhQUQzQixZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsYUFFOUQsc0JBQXNCOytHQUVyQixtQkFBbUIsWUFKcEIsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsc0JBQXNCOzsyRkFJN0QsbUJBQW1CO2tCQUwvQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixDQUFDO29CQUN6RSxZQUFZLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDdEMsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ2xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbmljTW9kdWxlIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgSURFQVRyYW5zbGF0aW9uc01vZHVsZSB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbmltcG9ydCB7IElERUFTZW50aW1lbnRDb21wb25lbnQgfSBmcm9tICcuL3NlbnRpbWVudC5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgSW9uaWNNb2R1bGUsIElERUFUcmFuc2xhdGlvbnNNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtJREVBU2VudGltZW50Q29tcG9uZW50XSxcbiAgZXhwb3J0czogW0lERUFTZW50aW1lbnRDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIElERUFTZW50aW1lbnRNb2R1bGUge31cbiJdfQ==