@solidev/data 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/esm2022/lib/auth/auth-interceptor.service.mjs +3 -3
  2. package/esm2022/lib/data/data-backend.mjs +3 -3
  3. package/esm2022/lib/dispedit/choice.pipe.mjs +6 -6
  4. package/esm2022/lib/dispedit/dispedit/dispedit.component.mjs +3 -3
  5. package/esm2022/lib/dispedit/factor.pipe.mjs +6 -6
  6. package/esm2022/lib/dispedit/factorc.pipe.mjs +6 -6
  7. package/esm2022/lib/dispedit/fkselect/fkselect.component.mjs +10 -13
  8. package/esm2022/lib/dispedit/flags/flags.component.mjs +9 -12
  9. package/esm2022/lib/dispedit/m2mselect/m2mselect.component.mjs +10 -16
  10. package/esm2022/lib/dispedit/richedit/richedit.component.mjs +3 -3
  11. package/esm2022/lib/dispedit/sdelete/sdelete.component.mjs +3 -3
  12. package/esm2022/lib/messages/message-zone/message-zone.component.mjs +8 -12
  13. package/esm2022/lib/messages/message.service.mjs +3 -3
  14. package/esm2022/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +8 -12
  15. package/esm2022/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +3 -3
  16. package/esm2022/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +9 -12
  17. package/esm2022/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +3 -3
  18. package/esm2022/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +3 -3
  19. package/esm2022/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +3 -3
  20. package/esm2022/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +3 -3
  21. package/esm2022/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +3 -3
  22. package/esm2022/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +3 -3
  23. package/esm2022/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +3 -3
  24. package/esm2022/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +3 -3
  25. package/esm2022/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +3 -3
  26. package/esm2022/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +3 -3
  27. package/esm2022/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +3 -3
  28. package/esm2022/lib/modellist/model-list-filters/model-list-filter-group.mjs +19 -0
  29. package/esm2022/lib/modellist/model-list-filters/model-list-filter.mjs +9 -1
  30. package/esm2022/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +5 -5
  31. package/esm2022/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +27 -6
  32. package/esm2022/lib/modellist/model-list-filters/model-list-filters.mjs +70 -16
  33. package/esm2022/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +13 -14
  34. package/esm2022/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +3 -3
  35. package/esm2022/lib/modellist/model-list.service.mjs +4 -4
  36. package/esm2022/lib/routing/breadcrumb/breadcrumb.component.mjs +8 -12
  37. package/esm2022/lib/updates/update/update.component.mjs +3 -3
  38. package/esm2022/lib/updates/update.service.mjs +3 -3
  39. package/esm2022/lib/uploader/ng-file-drop.directive.mjs +3 -3
  40. package/esm2022/lib/uploader/ng-file-select.directive.mjs +3 -3
  41. package/esm2022/lib/uploader/ngx-uploader.module.mjs +4 -4
  42. package/esm2022/lib/utils/tab-memory.service.mjs +3 -3
  43. package/esm2022/public-api.mjs +3 -1
  44. package/fesm2022/solidev-data.mjs +410 -344
  45. package/fesm2022/solidev-data.mjs.map +1 -1
  46. package/lib/dispedit/fkselect/fkselect.component.d.ts +3 -4
  47. package/lib/dispedit/flags/flags.component.d.ts +3 -4
  48. package/lib/dispedit/m2mselect/m2mselect.component.d.ts +3 -7
  49. package/lib/messages/message-zone/message-zone.component.d.ts +3 -4
  50. package/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.d.ts +3 -4
  51. package/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.d.ts +3 -4
  52. package/lib/modellist/model-list-filters/model-list-filter-group.d.ts +11 -0
  53. package/lib/modellist/model-list-filters/model-list-filter.d.ts +4 -0
  54. package/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.d.ts +8 -2
  55. package/lib/modellist/model-list-filters/model-list-filters.d.ts +11 -5
  56. package/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.d.ts +3 -5
  57. package/lib/modellist/model-list.service.d.ts +2 -1
  58. package/lib/routing/breadcrumb/breadcrumb.component.d.ts +3 -4
  59. package/package.json +1 -1
  60. package/public-api.d.ts +2 -0
@@ -95,10 +95,10 @@ export class AuthInterceptor {
95
95
  },
96
96
  });
97
97
  }
98
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AuthInterceptor, deps: [{ token: DATA_AUTH_SERVICE }, { token: DATA_API_URL }, { token: DATA_AUTH_URLS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
99
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AuthInterceptor, providedIn: 'root' }); }
98
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: AuthInterceptor, deps: [{ token: DATA_AUTH_SERVICE }, { token: DATA_API_URL }, { token: DATA_AUTH_URLS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
99
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: AuthInterceptor, providedIn: 'root' }); }
100
100
  }
101
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AuthInterceptor, decorators: [{
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: AuthInterceptor, decorators: [{
102
102
  type: Injectable,
103
103
  args: [{
104
104
  providedIn: 'root',
@@ -109,10 +109,10 @@ export class DataBackend {
109
109
  list(collection, url, { params = {}, headers = {} } = {}) {
110
110
  return this._cachedGet(collection, url, { headers, params });
111
111
  }
112
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: DataBackend, deps: [{ token: i1.HttpClient }, { token: i0.TransferState }, { token: PLATFORM_ID }, { token: DATA_API_URL }, { token: DATA_MAX_TRANSFERSTATE_TIME, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
113
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: DataBackend, providedIn: 'root' }); }
112
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DataBackend, deps: [{ token: i1.HttpClient }, { token: i0.TransferState }, { token: PLATFORM_ID }, { token: DATA_API_URL }, { token: DATA_MAX_TRANSFERSTATE_TIME, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
113
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DataBackend, providedIn: 'root' }); }
114
114
  }
115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: DataBackend, decorators: [{
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DataBackend, decorators: [{
116
116
  type: Injectable,
117
117
  args: [{
118
118
  providedIn: 'root',
@@ -26,10 +26,10 @@ export class ChoicePipe {
26
26
  }
27
27
  return `[${fvalue}] ??`;
28
28
  }
29
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
30
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.6", ngImport: i0, type: ChoicePipe, isStandalone: true, name: "choice" }); }
29
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: ChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
30
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: ChoicePipe, isStandalone: true, name: "choice" }); }
31
31
  }
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ChoicePipe, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: ChoicePipe, decorators: [{
33
33
  type: Pipe,
34
34
  args: [{
35
35
  name: 'choice',
@@ -66,10 +66,10 @@ export class PChoicePipe {
66
66
  }
67
67
  return `[${fvalue}] ??`;
68
68
  }
69
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: PChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
70
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.6", ngImport: i0, type: PChoicePipe, isStandalone: true, name: "pchoice" }); }
69
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PChoicePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
70
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: PChoicePipe, isStandalone: true, name: "pchoice" }); }
71
71
  }
72
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: PChoicePipe, decorators: [{
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PChoicePipe, decorators: [{
73
73
  type: Pipe,
74
74
  args: [{
75
75
  name: 'pchoice',
@@ -421,10 +421,10 @@ export class DispeditComponent {
421
421
  }
422
422
  }
423
423
  _setDisplayClasses() { }
424
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: DispeditComponent, deps: [{ token: DATA_DISPLAY_CONFIG, optional: true }, { token: i1.DataMessageService }], target: i0.ɵɵFactoryTarget.Component }); }
425
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: DispeditComponent, isStandalone: true, selector: "data-dispedit", inputs: { model: "model", field: "field", form: "form", edit: "edit", editable: "editable", mode: "mode", choices: "choices", inputClasses: "inputClasses", editor: "editor", viewer: "viewer", default: "default", placeholder: "placeholder", help: "help", hideLabel: "hideLabel", queryset: "queryset", collection: "collection", display: "display", filter: "filter" }, outputs: { changed: "changed" }, usesOnChanges: true, ngImport: i0, template: "\n<ng-template #titleTpl>\n <ng-content></ng-content>\n</ng-template>\n<ng-template #dispTpl>\n <ng-container [ngSwitch]=\"realDisplay\"><span class=\"editable disp-text\" *ngSwitchCase=\"'text'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-choice\" *ngSwitchCase=\"'choice'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-decimal\" *ngSwitchCase=\"'decimal'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-boolean\" *ngSwitchCase=\"'boolean'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-fkdetails\" *ngSwitchCase=\"'fkdetails'\" (click)=\"enableEditMode()\">\n <div class=\"fkitem\">{{txtValue}}</div></span><span class=\"editable disp-m2mdetails\" *ngSwitchCase=\"'m2mdetails'\" (click)=\"enableEditMode()\">\n <div class=\"m2mitem\" *ngFor=\"let v of txtValues\">{{v}}</div></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'datetime'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'short'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'date'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'shortDate'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span></ng-container>\n</ng-template>\n<ng-template #editTpl let-form=\"form\">\n <ng-container [ngSwitch]=\"realEditor\">\n <ng-container *ngSwitchCase=\"'input.text'\">\n <input type=\"text\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.email'\">\n <input type=\"email\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['email']\">Format d'email invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.password'\">\n <input type=\"password\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.datetime'\">\n <input type=\"datetime-local\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.date'\">\n <input type=\"date\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.number'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.decimal'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.checkbox'\">\n <input class=\"form-check-input\" type=\"checkbox\" [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'textarea'\">\n <textarea [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" [ngClass]=\"inputClasses\" (keyup.control.enter)=\"update()\" [placeholder]=\"realPlaceholder\"></textarea>\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fkselect'\">\n <data-fkselect [collection]=\"collection\" [filter]=\"filter\" (selected)=\"selectedRefItem($event)\" [placeholder]=\"placeholder\" (cancelled)=\"unsetEdit()\" (cleared)=\"selectedRefItem(null)\"></data-fkselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'m2mselect'\">\n <data-m2mselect [collection]=\"collection\" [filter]=\"filter\" (changed)=\"update()\" [formControl]=\"form.get(field)\" (detailsChanged)=\"onM2MValuesChanges($event)\" [model]=\"model\" [field]=\"field\" [placeholder]=\"placeholder\"></data-m2mselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'select'\">\n <select [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\" [ngClass]=\"inputClasses\">\n <option *ngFor=\"let c of realChoices\" [ngValue]=\"c.value!==undefined ? c.value : c\">{{c.desc ? c.desc : c}}</option>\n </select>\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Disp/edit toggler-->\n<ng-template #dispeditTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"fg\">\n <form [formGroup]=\"fg\" (submit)=\"update()\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: fg}\"></ng-container>\n </form>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- DispEdit noform-->\n<ng-template #dispeditFormTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"form\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: form}\"></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Dd display-->\n<ng-container *ngIf=\"mode==='dd'\">\n <dt [class.required]=\"required\" *ngIf=\"!hideLabel\"><span class=\"editable\" (click)=\"toggleEdit()\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container></span><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span></dt>\n <dd [class.mb-0]=\"hideLabel\">\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n </dd>\n</ng-container>\n<!-- Inline display-->\n<ng-container *ngIf=\"mode==='inline'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n</ng-container>\n<!-- Form display-->\n<ng-container *ngIf=\"mode==='form'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditFormTpl\"></ng-container>\n</ng-container>", styles: [".editable{cursor:pointer}form.inline{display:inline-block}.required{font-weight:700}.required:after{content:\" (*)\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FkselectComponent, selector: "data-fkselect", inputs: ["model", "field", "edit", "value", "queryset", "collection", "update", "filter", "mode", "display", "search", "label", "placeholder", "inputClasses"], outputs: ["selected", "cancelled", "cleared"] }, { kind: "component", type: M2mselectComponent, selector: "data-m2mselect", inputs: ["model", "field", "edit", "values", "queryset", "collection", "filter", "mode", "display", "search", "label", "placeholder", "emptyLabel", "inputClasses"], outputs: ["added", "removed", "cancelled", "cleared", "detailsChanged", "changed"] }] }); }
424
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DispeditComponent, deps: [{ token: DATA_DISPLAY_CONFIG, optional: true }, { token: i1.DataMessageService }], target: i0.ɵɵFactoryTarget.Component }); }
425
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: DispeditComponent, isStandalone: true, selector: "data-dispedit", inputs: { model: "model", field: "field", form: "form", edit: "edit", editable: "editable", mode: "mode", choices: "choices", inputClasses: "inputClasses", editor: "editor", viewer: "viewer", default: "default", placeholder: "placeholder", help: "help", hideLabel: "hideLabel", queryset: "queryset", collection: "collection", display: "display", filter: "filter" }, outputs: { changed: "changed" }, usesOnChanges: true, ngImport: i0, template: "\n<ng-template #titleTpl>\n <ng-content></ng-content>\n</ng-template>\n<ng-template #dispTpl>\n <ng-container [ngSwitch]=\"realDisplay\"><span class=\"editable disp-text\" *ngSwitchCase=\"'text'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-choice\" *ngSwitchCase=\"'choice'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-decimal\" *ngSwitchCase=\"'decimal'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-boolean\" *ngSwitchCase=\"'boolean'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-fkdetails\" *ngSwitchCase=\"'fkdetails'\" (click)=\"enableEditMode()\">\n <div class=\"fkitem\">{{txtValue}}</div></span><span class=\"editable disp-m2mdetails\" *ngSwitchCase=\"'m2mdetails'\" (click)=\"enableEditMode()\">\n <div class=\"m2mitem\" *ngFor=\"let v of txtValues\">{{v}}</div></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'datetime'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'short'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'date'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'shortDate'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span></ng-container>\n</ng-template>\n<ng-template #editTpl let-form=\"form\">\n <ng-container [ngSwitch]=\"realEditor\">\n <ng-container *ngSwitchCase=\"'input.text'\">\n <input type=\"text\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.email'\">\n <input type=\"email\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['email']\">Format d'email invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.password'\">\n <input type=\"password\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.datetime'\">\n <input type=\"datetime-local\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.date'\">\n <input type=\"date\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.number'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.decimal'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.checkbox'\">\n <input class=\"form-check-input\" type=\"checkbox\" [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'textarea'\">\n <textarea [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" [ngClass]=\"inputClasses\" (keyup.control.enter)=\"update()\" [placeholder]=\"realPlaceholder\"></textarea>\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form &amp;&amp; !form.controls[field].pristine &amp;&amp; form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fkselect'\">\n <data-fkselect [collection]=\"collection\" [filter]=\"filter\" (selected)=\"selectedRefItem($event)\" [placeholder]=\"placeholder\" (cancelled)=\"unsetEdit()\" (cleared)=\"selectedRefItem(null)\"></data-fkselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'m2mselect'\">\n <data-m2mselect [collection]=\"collection\" [filter]=\"filter\" (changed)=\"update()\" [formControl]=\"form.get(field)\" (detailsChanged)=\"onM2MValuesChanges($event)\" [model]=\"model\" [field]=\"field\" [placeholder]=\"placeholder\"></data-m2mselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'select'\">\n <select [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\" [ngClass]=\"inputClasses\">\n <option *ngFor=\"let c of realChoices\" [ngValue]=\"c.value!==undefined ? c.value : c\">{{c.desc ? c.desc : c}}</option>\n </select>\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Disp/edit toggler-->\n<ng-template #dispeditTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"fg\">\n <form [formGroup]=\"fg\" (submit)=\"update()\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: fg}\"></ng-container>\n </form>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- DispEdit noform-->\n<ng-template #dispeditFormTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"form\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: form}\"></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Dd display-->\n<ng-container *ngIf=\"mode==='dd'\">\n <dt [class.required]=\"required\" *ngIf=\"!hideLabel\"><span class=\"editable\" (click)=\"toggleEdit()\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container></span><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span></dt>\n <dd [class.mb-0]=\"hideLabel\">\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n </dd>\n</ng-container>\n<!-- Inline display-->\n<ng-container *ngIf=\"mode==='inline'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n</ng-container>\n<!-- Form display-->\n<ng-container *ngIf=\"mode==='form'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined &amp;&amp; edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditFormTpl\"></ng-container>\n</ng-container>", styles: [".editable{cursor:pointer}form.inline{display:inline-block}.required{font-weight:700}.required:after{content:\" (*)\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FkselectComponent, selector: "data-fkselect", inputs: ["model", "field", "edit", "value", "queryset", "collection", "update", "filter", "mode", "display", "search", "label", "placeholder", "inputClasses"], outputs: ["selected", "cancelled", "cleared"] }, { kind: "component", type: M2mselectComponent, selector: "data-m2mselect", inputs: ["model", "field", "edit", "values", "queryset", "collection", "filter", "mode", "display", "search", "label", "placeholder", "emptyLabel", "inputClasses"], outputs: ["added", "removed", "cancelled", "cleared", "detailsChanged", "changed"] }] }); }
426
426
  }
427
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: DispeditComponent, decorators: [{
427
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DispeditComponent, decorators: [{
428
428
  type: Component,
429
429
  args: [{ selector: 'data-dispedit', standalone: true, imports: [
430
430
  CommonModule,
@@ -32,10 +32,10 @@ export class FactorPipe {
32
32
  const num = strToNumber(fvalue);
33
33
  return formatNumber(num / factor, locale, digitsInfo);
34
34
  }
35
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FactorPipe, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Pipe }); }
36
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.6", ngImport: i0, type: FactorPipe, isStandalone: true, name: "factor" }); }
35
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FactorPipe, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Pipe }); }
36
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: FactorPipe, isStandalone: true, name: "factor" }); }
37
37
  }
38
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FactorPipe, decorators: [{
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FactorPipe, decorators: [{
39
39
  type: Pipe,
40
40
  args: [{
41
41
  name: 'factor',
@@ -65,10 +65,10 @@ export class PFactorPipe {
65
65
  const num = strToNumber(fvalue);
66
66
  return formatNumber(num / factor, locale, digitsInfo);
67
67
  }
68
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: PFactorPipe, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Pipe }); }
69
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.6", ngImport: i0, type: PFactorPipe, isStandalone: true, name: "pfactor" }); }
68
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PFactorPipe, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Pipe }); }
69
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: PFactorPipe, isStandalone: true, name: "pfactor" }); }
70
70
  }
71
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: PFactorPipe, decorators: [{
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PFactorPipe, decorators: [{
72
72
  type: Pipe,
73
73
  args: [{
74
74
  name: 'pfactor',
@@ -31,10 +31,10 @@ export class FactorcPipe {
31
31
  const num = strToNumber(fvalue);
32
32
  return formatCurrency(num / factor, locale, currency, currencyCode, digitsInfo);
33
33
  }
34
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FactorcPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe }); }
35
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.6", ngImport: i0, type: FactorcPipe, isStandalone: true, name: "factorc" }); }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FactorcPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe }); }
35
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: FactorcPipe, isStandalone: true, name: "factorc" }); }
36
36
  }
37
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FactorcPipe, decorators: [{
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FactorcPipe, decorators: [{
38
38
  type: Pipe,
39
39
  args: [{
40
40
  name: 'factorc',
@@ -80,10 +80,10 @@ export class PFactorcPipe {
80
80
  const num = strToNumber(fvalue);
81
81
  return formatCurrency(num / factor, locale, currency, currencyCode, digitsInfo);
82
82
  }
83
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: PFactorcPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe }); }
84
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.6", ngImport: i0, type: PFactorcPipe, isStandalone: true, name: "pfactorc" }); }
83
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PFactorcPipe, deps: [{ token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }], target: i0.ɵɵFactoryTarget.Pipe }); }
84
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: PFactorcPipe, isStandalone: true, name: "pfactorc" }); }
85
85
  }
86
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: PFactorcPipe, decorators: [{
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PFactorcPipe, decorators: [{
87
87
  type: Pipe,
88
88
  args: [{
89
89
  name: 'pfactorc',
@@ -1,9 +1,10 @@
1
- import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
- import { debounceTime, distinctUntilChanged, Subject, takeUntil, } from 'rxjs';
1
+ import { Component, DestroyRef, EventEmitter, inject, Input, Output, } from '@angular/core';
2
+ import { debounceTime, distinctUntilChanged } from 'rxjs';
3
3
  import { switchMap } from 'rxjs/operators';
4
4
  import { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
5
5
  import { CommonModule } from '@angular/common';
6
6
  import { NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstrap';
7
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@angular/common";
9
10
  import * as i2 from "@angular/forms";
@@ -24,11 +25,7 @@ export class FkselectComponent {
24
25
  this.cleared = new EventEmitter();
25
26
  this.searchFn = this._search.bind(this);
26
27
  this.displayFn = this._display.bind(this);
27
- this._subscription = new Subject();
28
- }
29
- ngOnDestroy() {
30
- this._subscription.next();
31
- this._subscription.complete();
28
+ this.destroy$ = inject(DestroyRef);
32
29
  }
33
30
  ngOnInit() {
34
31
  // Create queryset if not given
@@ -42,7 +39,7 @@ export class FkselectComponent {
42
39
  }
43
40
  this.fc = new UntypedFormControl('');
44
41
  this.fc.valueChanges
45
- .pipe(takeUntil(this._subscription), distinctUntilChanged())
42
+ .pipe(takeUntilDestroyed(this.destroy$), distinctUntilChanged())
46
43
  .subscribe((value) => {
47
44
  if (value) {
48
45
  this.selected.emit(value);
@@ -85,7 +82,7 @@ export class FkselectComponent {
85
82
  return '';
86
83
  }
87
84
  _search(text$) {
88
- return text$.pipe(takeUntil(this._subscription), debounceTime(750), distinctUntilChanged(), switchMap((term) => {
85
+ return text$.pipe(takeUntilDestroyed(this.destroy$), debounceTime(750), distinctUntilChanged(), switchMap((term) => {
89
86
  const f = {};
90
87
  for (const k of Object.keys(this.filter)) {
91
88
  if (this.filter[k] !== null || this.filter[k] !== undefined) {
@@ -98,10 +95,10 @@ export class FkselectComponent {
98
95
  return qs.get();
99
96
  }));
100
97
  }
101
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FkselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
102
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: FkselectComponent, isStandalone: true, selector: "data-fkselect", inputs: { model: "model", field: "field", edit: "edit", value: "value", queryset: "queryset", collection: "collection", update: "update", filter: "filter", mode: "mode", display: "display", search: "search", label: "label", placeholder: "placeholder", inputClasses: "inputClasses" }, outputs: { selected: "selected", cancelled: "cancelled", cleared: "cleared" }, ngImport: i0, template: "\n<div class=\"form-group\">\n <label *ngIf=\"label\">{{label}}</label>\n <div class=\"input-group\">\n <input class=\"form-control\" [formControl]=\"fc\" [placeholder]=\"placeholder\" [ngbTypeahead]=\"searchFn\" [editable]=\"false\" [focusFirst]=\"true\" [inputFormatter]=\"displayFn\" [resultFormatter]=\"displayFn\" (keyup.escape)=\"cancelled.emit()\">\n <div class=\"input-group-text\"><i class=\"bi bi-trash float-end pointer\" (click)=\"clearAction()\"></i></div>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: NgbTypeaheadModule }, { kind: "directive", type: i3.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }] }); }
98
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FkselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
99
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: FkselectComponent, isStandalone: true, selector: "data-fkselect", inputs: { model: "model", field: "field", edit: "edit", value: "value", queryset: "queryset", collection: "collection", update: "update", filter: "filter", mode: "mode", display: "display", search: "search", label: "label", placeholder: "placeholder", inputClasses: "inputClasses" }, outputs: { selected: "selected", cancelled: "cancelled", cleared: "cleared" }, ngImport: i0, template: "\n<div class=\"form-group\">\n <label *ngIf=\"label\">{{label}}</label>\n <div class=\"input-group\">\n <input class=\"form-control\" [formControl]=\"fc\" [placeholder]=\"placeholder\" [ngbTypeahead]=\"searchFn\" [editable]=\"false\" [focusFirst]=\"true\" [inputFormatter]=\"displayFn\" [resultFormatter]=\"displayFn\" (keyup.escape)=\"cancelled.emit()\">\n <div class=\"input-group-text\"><i class=\"bi bi-trash float-end pointer\" (click)=\"clearAction()\"></i></div>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: NgbTypeaheadModule }, { kind: "directive", type: i3.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }] }); }
103
100
  }
104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FkselectComponent, decorators: [{
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FkselectComponent, decorators: [{
105
102
  type: Component,
106
103
  args: [{ selector: 'data-fkselect', standalone: true, imports: [CommonModule, ReactiveFormsModule, NgbTypeaheadModule], template: "\n<div class=\"form-group\">\n <label *ngIf=\"label\">{{label}}</label>\n <div class=\"input-group\">\n <input class=\"form-control\" [formControl]=\"fc\" [placeholder]=\"placeholder\" [ngbTypeahead]=\"searchFn\" [editable]=\"false\" [focusFirst]=\"true\" [inputFormatter]=\"displayFn\" [resultFormatter]=\"displayFn\" (keyup.escape)=\"cancelled.emit()\">\n <div class=\"input-group-text\"><i class=\"bi bi-trash float-end pointer\" (click)=\"clearAction()\"></i></div>\n </div>\n</div>" }]
107
104
  }], ctorParameters: () => [], propDecorators: { model: [{
@@ -139,4 +136,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
139
136
  }], cleared: [{
140
137
  type: Output
141
138
  }] } });
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmtzZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2Rpc3BlZGl0L2Zrc2VsZWN0L2Zrc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9ma3NlbGVjdC9ma3NlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBRXBCLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7OztBQVdoRSxNQUFNLE9BQU8saUJBQWlCO0lBZ0M1QjtRQTFCZ0IsU0FBSSxHQUFHLEtBQUssQ0FBQztRQU1iLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsV0FBTSxHQUFlLEVBQUUsQ0FBQztRQUN4QixTQUFJLEdBQXVDLE1BQU0sQ0FBQztRQUVsRCxXQUFNLEdBQUcsUUFBUSxDQUFDO1FBRWxDLFVBQVU7UUFDTSxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsaUJBQVksR0FBc0IsRUFBRSxDQUFDO1FBRXBDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO1FBQ2pDLGNBQVMsR0FBRyxJ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QUFtQixFQUFFLGtCQUFrQixDQUFDO3dEQU1oRCxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFFVSxLQUFLO3NCQUFwQixLQUFLO2dCQUVVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxNQUFNO3NCQUFyQixLQUFLO2dCQUNVLE1BQU07c0JBQXJCLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLE1BQU07c0JBQXJCLEtBQUs7Z0JBR1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxXQUFXO3NCQUExQixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBRVcsUUFBUTtzQkFBeEIsTUFBTTtnQkFDVSxTQUFTO3NCQUF6QixNQUFNO2dCQUNVLE9BQU87c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vZGF0YS9kYXRhLW1vZGVsJztcbmltcG9ydCB7IEZpbHRlckRhdGEsIFF1ZXJ5c2V0IH0gZnJvbSAnLi4vLi4vZGF0YS9kYXRhLXF1ZXJ5JztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi9kYXRhL2RhdGEtY29sbGVjdGlvbic7XG5pbXBvcnQge1xuICBkZWJvdW5jZVRpbWUsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICB0YWtlVW50aWwsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nYlR5cGVhaGVhZE1vZHVsZSB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcblxuZXhwb3J0IHR5cGUgVHBsRnVuPFQgZXh0ZW5kcyBEYXRhTW9kZWw+ID0gKGRhdGE6IFQpID0+IHN0cmluZztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0YS1ma3NlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ma3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zrc2VsZWN0LmNvbXBvbmVudC5zYXNzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE5nYlR5cGVhaGVhZE1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIEZrc2VsZWN0Q29tcG9uZW50PFQgZXh0ZW5kcyBEYXRhTW9kZWwsIFIgZXh0ZW5kcyBEYXRhTW9kZWw+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3lcbntcbiAgLy8gTW9kZWwgZmllbGQgdmFsdWUgJiB1cGRhdGUgZGF0YVxuICBASW5wdXQoKSBwdWJsaWMgbW9kZWw/OiBUO1xuICBASW5wdXQoKSBwdWJsaWMgZmllbGQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0ID0gZmFsc2U7XG4gIC8vIFJhdyB2YWx1ZVxuICBASW5wdXQoKSBwdWJsaWMgdmFsdWU/OiBSO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBxdWVyeXNldD86IFF1ZXJ5c2V0PFI+O1xuICBASW5wdXQoKSBwdWJsaWMgY29sbGVjdGlvbj86IENvbGxlY3Rpb248Uj47XG4gIEBJbnB1dCgpIHB1YmxpYyB1cGRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGZpbHRlcjogRmlsdGVyRGF0YSA9IHt9O1xuICBASW5wdXQoKSBwdWJsaWMgbW9kZTogJ2F1dG9jb21wbGV0ZScgfCAnc2VsZWN0JyB8ICdhdXRvJyA9ICdhdXRvJztcbiAgQElucHV0KCkgcHVibGljIGRpc3BsYXk/OiBzdHJpbmcgfCBUcGxGdW48Uj47XG4gIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2ggPSAnc2VhcmNoJztcblxuICAvLyBEaXNwbGF5XG4gIEBJbnB1dCgpIHB1YmxpYyBsYWJlbCA9ICcnO1xuICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXIgPSAnJztcbiAgQElucHV0KCkgcHVibGljIGlucHV0Q2xhc3Nlczogc3RyaW5nW10gfCBzdHJpbmcgPSBbXTtcblxuICBAT3V0cHV0KCkgcHVibGljIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBjbGVhcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBwdWJsaWMgZmMhOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBzZWFyY2hGbiA9IHRoaXMuX3NlYXJjaC5iaW5kKHRoaXMpO1xuICBwdWJsaWMgZGlzcGxheUZuID0gdGhpcy5fZGlzcGxheS5iaW5kKHRoaXMpO1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF90cGwhOiBUcGxGdW48Uj47XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24ubmV4dCgpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBxdWVyeXNldCBpZiBub3QgZ2l2ZW5cbiAgICAvLyBxdWVyeXNldCBpcyBjcmVhdGUgdGhyb3VnaCBtb2RlbFxuICAgIGlmICghdGhpcy5xdWVyeXNldCAmJiB0aGlzLmNvbGxlY3Rpb24pIHtcbiAgICAgIHRoaXMucXVlcnlzZXQgPSB0aGlzLmNvbGxlY3Rpb24ucXVlcnlzZXQoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnF1ZXJ5c2V0ICYmIHRoaXMubW9kZWwgJiYgdGhpcy5tb2RlbC5fY29sbGVjdGlvbikge1xuICAgICAgdGhpcy5jb2xsZWN0aW9uID0gdGhpcy5tb2RlbC5fY29sbGVjdGlvbjtcbiAgICAgIHRoaXMucXVlcnlzZXQgPSB0aGlzLmNvbGxlY3Rpb24ucXVlcnlzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5mYyA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycpO1xuICAgIHRoaXMuZmMudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fc3Vic2NyaXB0aW9uKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGlmICh0aGlzLmRpc3BsYXkpIHtcbiAgICAgIGlmICh0aGlzLmRpc3BsYXkgJiYgdHlwZW9mIHRoaXMuZGlzcGxheSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fdHBsID0gKG1vZGVsOiBSKSA9PiBgJHsobW9kZWwgYXMgYW55KVt0aGlzLmRpc3BsYXkgYXMgc3RyaW5nXX1gO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpc3BsYXkgJiYgdHlwZW9mIHRoaXMuZGlzcGxheSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLl90cGwgPSB0aGlzLmRpc3BsYXkuYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdHBsID0gKG1vZGVsOiBSKSA9PlxuICAgICAgICBgJHtcbiAgICAgICAgICAobW9kZWwgYXMgYW55KVsnbmFtZSddIHx8XG4gICAgICAgICAgKG1vZGVsIGFzIGFueSlbJ3RpdGxlJ10gfHxcbiAgICAgICAgICAobW9kZWwgYXMgYW55KVsnaWQnXVxuICAgICAgICB9YDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXJBY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGZ1bmN0aW9uLiBVc2VzIGRlc2NmaWVsZCBvciBkZXNjIHRwbCAobG9kYXNoIHRlbXBsYXRlIHVzaW5nIG1vZGVsIGZpZWxkcykuXG4gICAqL1xuICBwcml2YXRlIF9kaXNwbGF5KHg6IGFueSk6IGFueSB7XG4gICAgaWYgKHgpIHtcbiAgICAgIGlmICh4Ll9kaXNwbGF5KSB7XG4gICAgICAgIGlmICh4Ll9kaXNwbGF5IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4geC5fZGlzcGxheSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB4Ll9kaXNwbGF5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fdHBsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cGwoeCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3NlYXJjaCh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGV4dCQucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9zdWJzY3JpcHRpb24pLFxuICAgICAgZGVib3VuY2VUaW1lKDc1MCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc3dpdGNoTWFwKCh0ZXJtKSA9PiB7XG4gICAgICAgIGNvbnN0IGY6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXModGhpcy5maWx0ZXIpKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZmlsdGVyW2tdICE9PSBudWxsIHx8IHRoaXMuZmlsdGVyW2tdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZba10gPSB0aGlzLmZpbHRlcltrXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZlt0aGlzLnNlYXJjaF0gPSB0ZXJtO1xuICAgICAgICBjb25zdCBxcyA9IHRoaXMucXVlcnlzZXQgYXMgUXVlcnlzZXQ8YW55PjtcbiAgICAgICAgcXMuZmlsdGVyKGYsIHRydWUpO1xuICAgICAgICByZXR1cm4gcXMuZ2V0KCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsIlxuPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIj57e2xhYmVsfX08L2xhYmVsPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbZm9ybUNvbnRyb2xdPVwiZmNcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbbmdiVHlwZWFoZWFkXT1cInNlYXJjaEZuXCIgW2VkaXRhYmxlXT1cImZhbHNlXCIgW2ZvY3VzRmlyc3RdPVwidHJ1ZVwiIFtpbnB1dEZvcm1hdHRlcl09XCJkaXNwbGF5Rm5cIiBbcmVzdWx0Rm9ybWF0dGVyXT1cImRpc3BsYXlGblwiIChrZXl1cC5lc2NhcGUpPVwiY2FuY2VsbGVkLmVtaXQoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+PGkgY2xhc3M9XCJiaSBiaS10cmFzaCBmbG9hdC1lbmQgcG9pbnRlclwiIChjbGljayk9XCJjbGVhckFjdGlvbigpXCI+PC9pPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmtzZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2Rpc3BlZGl0L2Zrc2VsZWN0L2Zrc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9ma3NlbGVjdC9ma3NlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7OztBQVdoRSxNQUFNLE9BQU8saUJBQWlCO0lBZ0M1QjtRQTFCZ0IsU0FBSSxHQUFHLEtBQUssQ0FBQztRQU1iLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsV0FBTSxHQUFlLEVBQUUsQ0FBQztRQUN4QixTQUFJLEdBQXVDLE1BQU0sQ0FBQztRQUVsRCxXQUFNLEdBQUcsUUFBUSxDQUFDO1FBRWxDLFVBQVU7UUFDTSxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsaUJBQVksR0FBc0IsRUFBRSxDQUFDO1FBRXBDLGFB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VSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBRVUsS0FBSztzQkFBcEIsS0FBSztnQkFFVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFDVSxNQUFNO3NCQUFyQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxNQUFNO3NCQUFyQixLQUFLO2dCQUdVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUVXLFFBQVE7c0JBQXhCLE1BQU07Z0JBQ1UsU0FBUztzQkFBekIsTUFBTTtnQkFDVSxPQUFPO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGFNb2RlbCB9IGZyb20gJy4uLy4uL2RhdGEvZGF0YS1tb2RlbCc7XG5pbXBvcnQgeyBGaWx0ZXJEYXRhLCBRdWVyeXNldCB9IGZyb20gJy4uLy4uL2RhdGEvZGF0YS1xdWVyeSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vZGF0YS9kYXRhLWNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nYlR5cGVhaGVhZE1vZHVsZSB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuZXhwb3J0IHR5cGUgVHBsRnVuPFQgZXh0ZW5kcyBEYXRhTW9kZWw+ID0gKGRhdGE6IFQpID0+IHN0cmluZztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0YS1ma3NlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ma3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zrc2VsZWN0LmNvbXBvbmVudC5zYXNzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE5nYlR5cGVhaGVhZE1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIEZrc2VsZWN0Q29tcG9uZW50PFQgZXh0ZW5kcyBEYXRhTW9kZWwsIFIgZXh0ZW5kcyBEYXRhTW9kZWw+XG4gIGltcGxlbWVudHMgT25Jbml0XG57XG4gIC8vIE1vZGVsIGZpZWxkIHZhbHVlICYgdXBkYXRlIGRhdGFcbiAgQElucHV0KCkgcHVibGljIG1vZGVsPzogVDtcbiAgQElucHV0KCkgcHVibGljIGZpZWxkPzogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgZWRpdCA9IGZhbHNlO1xuICAvLyBSYXcgdmFsdWVcbiAgQElucHV0KCkgcHVibGljIHZhbHVlPzogUjtcblxuICBASW5wdXQoKSBwdWJsaWMgcXVlcnlzZXQ/OiBRdWVyeXNldDxSPjtcbiAgQElucHV0KCkgcHVibGljIGNvbGxlY3Rpb24/OiBDb2xsZWN0aW9uPFI+O1xuICBASW5wdXQoKSBwdWJsaWMgdXBkYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBmaWx0ZXI6IEZpbHRlckRhdGEgPSB7fTtcbiAgQElucHV0KCkgcHVibGljIG1vZGU6ICdhdXRvY29tcGxldGUnIHwgJ3NlbGVjdCcgfCAnYXV0bycgPSAnYXV0byc7XG4gIEBJbnB1dCgpIHB1YmxpYyBkaXNwbGF5Pzogc3RyaW5nIHwgVHBsRnVuPFI+O1xuICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoID0gJ3NlYXJjaCc7XG5cbiAgLy8gRGlzcGxheVxuICBASW5wdXQoKSBwdWJsaWMgbGFiZWwgPSAnJztcbiAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIHB1YmxpYyBpbnB1dENsYXNzZXM6IHN0cmluZ1tdIHwgc3RyaW5nID0gW107XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY2xlYXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgcHVibGljIGZjITogVW50eXBlZEZvcm1Db250cm9sO1xuICBwdWJsaWMgc2VhcmNoRm4gPSB0aGlzLl9zZWFyY2guYmluZCh0aGlzKTtcbiAgcHVibGljIGRpc3BsYXlGbiA9IHRoaXMuX2Rpc3BsYXkuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfdHBsITogVHBsRnVuPFI+O1xuICBwcml2YXRlIGRlc3Ryb3kkID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIHF1ZXJ5c2V0IGlmIG5vdCBnaXZlblxuICAgIC8vIHF1ZXJ5c2V0IGlzIGNyZWF0ZSB0aHJvdWdoIG1vZGVsXG4gICAgaWYgKCF0aGlzLnF1ZXJ5c2V0ICYmIHRoaXMuY29sbGVjdGlvbikge1xuICAgICAgdGhpcy5xdWVyeXNldCA9IHRoaXMuY29sbGVjdGlvbi5xdWVyeXNldCgpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMucXVlcnlzZXQgJiYgdGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLl9jb2xsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbGxlY3Rpb24gPSB0aGlzLm1vZGVsLl9jb2xsZWN0aW9uO1xuICAgICAgdGhpcy5xdWVyeXNldCA9IHRoaXMuY29sbGVjdGlvbi5xdWVyeXNldCgpO1xuICAgIH1cbiAgICB0aGlzLmZjID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJyk7XG4gICAgdGhpcy5mYy52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3kkKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGlmICh0aGlzLmRpc3BsYXkpIHtcbiAgICAgIGlmICh0aGlzLmRpc3BsYXkgJiYgdHlwZW9mIHRoaXMuZGlzcGxheSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fdHBsID0gKG1vZGVsOiBSKSA9PiBgJHsobW9kZWwgYXMgYW55KVt0aGlzLmRpc3BsYXkgYXMgc3RyaW5nXX1gO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpc3BsYXkgJiYgdHlwZW9mIHRoaXMuZGlzcGxheSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLl90cGwgPSB0aGlzLmRpc3BsYXkuYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdHBsID0gKG1vZGVsOiBSKSA9PlxuICAgICAgICBgJHtcbiAgICAgICAgICAobW9kZWwgYXMgYW55KVsnbmFtZSddIHx8XG4gICAgICAgICAgKG1vZGVsIGFzIGFueSlbJ3RpdGxlJ10gfHxcbiAgICAgICAgICAobW9kZWwgYXMgYW55KVsnaWQnXVxuICAgICAgICB9YDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXJBY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGZ1bmN0aW9uLiBVc2VzIGRlc2NmaWVsZCBvciBkZXNjIHRwbCAobG9kYXNoIHRlbXBsYXRlIHVzaW5nIG1vZGVsIGZpZWxkcykuXG4gICAqL1xuICBwcml2YXRlIF9kaXNwbGF5KHg6IGFueSk6IGFueSB7XG4gICAgaWYgKHgpIHtcbiAgICAgIGlmICh4Ll9kaXNwbGF5KSB7XG4gICAgICAgIGlmICh4Ll9kaXNwbGF5IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4geC5fZGlzcGxheSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB4Ll9kaXNwbGF5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fdHBsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cGwoeCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3NlYXJjaCh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGV4dCQucGlwZShcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgIGRlYm91bmNlVGltZSg3NTApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN3aXRjaE1hcCgodGVybSkgPT4ge1xuICAgICAgICBjb25zdCBmOiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKSkge1xuICAgICAgICAgIGlmICh0aGlzLmZpbHRlcltrXSAhPT0gbnVsbCB8fCB0aGlzLmZpbHRlcltrXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmW2tdID0gdGhpcy5maWx0ZXJba107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZbdGhpcy5zZWFyY2hdID0gdGVybTtcbiAgICAgICAgY29uc3QgcXMgPSB0aGlzLnF1ZXJ5c2V0IGFzIFF1ZXJ5c2V0PGFueT47XG4gICAgICAgIHFzLmZpbHRlcihmLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHFzLmdldCgpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIiwiXG48ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiPnt7bGFiZWx9fTwvbGFiZWw+XG4gIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtmb3JtQ29udHJvbF09XCJmY1wiIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtuZ2JUeXBlYWhlYWRdPVwic2VhcmNoRm5cIiBbZWRpdGFibGVdPVwiZmFsc2VcIiBbZm9jdXNGaXJzdF09XCJ0cnVlXCIgW2lucHV0Rm9ybWF0dGVyXT1cImRpc3BsYXlGblwiIFtyZXN1bHRGb3JtYXR0ZXJdPVwiZGlzcGxheUZuXCIgKGtleXVwLmVzY2FwZSk9XCJjYW5jZWxsZWQuZW1pdCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIj48aSBjbGFzcz1cImJpIGJpLXRyYXNoIGZsb2F0LWVuZCBwb2ludGVyXCIgKGNsaWNrKT1cImNsZWFyQWN0aW9uKClcIj48L2k+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
@@ -1,7 +1,8 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, DestroyRef, inject, Input } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
- import { debounceTime, firstValueFrom, Subject, takeUntil, } from 'rxjs';
3
+ import { debounceTime, firstValueFrom } from 'rxjs';
4
4
  import { FormControl, ReactiveFormsModule } from '@angular/forms';
5
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "../../messages/message.service";
7
8
  import * as i2 from "@angular/common";
@@ -21,11 +22,7 @@ export class FlagsComponent {
21
22
  this.txtflag = '';
22
23
  this.selflag = '';
23
24
  this.flaglist = [];
24
- this._subscriptions$ = new Subject();
25
- }
26
- ngOnDestroy() {
27
- this._subscriptions$.next();
28
- this._subscriptions$.complete();
25
+ this.destroy$ = inject(DestroyRef);
29
26
  }
30
27
  async ngOnInit() {
31
28
  if (!this.flags && this.model._collection) {
@@ -41,7 +38,7 @@ export class FlagsComponent {
41
38
  this.ft = new FormControl('');
42
39
  this.fs = new FormControl('');
43
40
  this.fs.valueChanges
44
- .pipe(takeUntil(this._subscriptions$), debounceTime(250))
41
+ .pipe(takeUntilDestroyed(this.destroy$), debounceTime(250))
45
42
  .subscribe((value) => {
46
43
  if (value) {
47
44
  this.addFlag(value);
@@ -112,10 +109,10 @@ export class FlagsComponent {
112
109
  this.edit = false;
113
110
  }
114
111
  }
115
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FlagsComponent, deps: [{ token: i1.DataMessageService }], target: i0.ɵɵFactoryTarget.Component }); }
116
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: FlagsComponent, isStandalone: true, selector: "data-flags", inputs: { model: "model", field: "field", get_flags_endpoint: "get_flags_endpoint", edit: "edit", editable: "editable", flags: "flags", free: "free", create: "create", action: "action" }, ngImport: i0, template: "\n<dt (click)=\"toggleEdit()\" role=\"button\">\n <ng-content></ng-content>\n</dt>\n<dd *ngIf=\"!edit\" (click)=\"toggleEdit()\" role=\"button\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\">{{flag}}</span></dd>\n<dd *ngIf=\"edit\">\n <div class=\"row\">\n <ng-container *ngIf=\"!free\">\n <div class=\"col\">\n <select class=\"form-select form-select-sm\" [formControl]=\"fs\">\n <option *ngFor=\"let flag of flaglist\" [value]=\"flag.flag\">{{flag.flag}}<span class=\"ms-1\" *ngIf=\"flag.count\">({{flag.count}})</span></option>\n </select>\n </div>\n <div class=\"col\" *ngIf=\"create\">\n <input class=\"form-control form-control-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\">\n </div>\n </ng-container>\n <ng-container *ngIf=\"free\">\n <div class=\"col-12\">\n <input class=\"form-control form-select-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\" (keyup.escape)=\"toggleEdit()\">\n </div>\n </ng-container>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-12\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\" (click)=\"removeFlag(flag)\" role=\"button\"><i class=\"bi bi-trash me-1\"></i>{{flag}}</span><i class=\"bi bi-x-lg text-muted ms-2\" role=\"button\" (click)=\"toggleEdit()\"></i></div>\n </div>\n</dd>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
112
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FlagsComponent, deps: [{ token: i1.DataMessageService }], target: i0.ɵɵFactoryTarget.Component }); }
113
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: FlagsComponent, isStandalone: true, selector: "data-flags", inputs: { model: "model", field: "field", get_flags_endpoint: "get_flags_endpoint", edit: "edit", editable: "editable", flags: "flags", free: "free", create: "create", action: "action" }, ngImport: i0, template: "\n<dt (click)=\"toggleEdit()\" role=\"button\">\n <ng-content></ng-content>\n</dt>\n<dd *ngIf=\"!edit\" (click)=\"toggleEdit()\" role=\"button\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\">{{flag}}</span></dd>\n<dd *ngIf=\"edit\">\n <div class=\"row\">\n <ng-container *ngIf=\"!free\">\n <div class=\"col\">\n <select class=\"form-select form-select-sm\" [formControl]=\"fs\">\n <option *ngFor=\"let flag of flaglist\" [value]=\"flag.flag\">{{flag.flag}}<span class=\"ms-1\" *ngIf=\"flag.count\">({{flag.count}})</span></option>\n </select>\n </div>\n <div class=\"col\" *ngIf=\"create\">\n <input class=\"form-control form-control-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\">\n </div>\n </ng-container>\n <ng-container *ngIf=\"free\">\n <div class=\"col-12\">\n <input class=\"form-control form-select-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\" (keyup.escape)=\"toggleEdit()\">\n </div>\n </ng-container>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-12\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\" (click)=\"removeFlag(flag)\" role=\"button\"><i class=\"bi bi-trash me-1\"></i>{{flag}}</span><i class=\"bi bi-x-lg text-muted ms-2\" role=\"button\" (click)=\"toggleEdit()\"></i></div>\n </div>\n</dd>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
117
114
  }
118
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FlagsComponent, decorators: [{
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FlagsComponent, decorators: [{
119
116
  type: Component,
120
117
  args: [{ selector: 'data-flags', standalone: true, imports: [CommonModule, ReactiveFormsModule], template: "\n<dt (click)=\"toggleEdit()\" role=\"button\">\n <ng-content></ng-content>\n</dt>\n<dd *ngIf=\"!edit\" (click)=\"toggleEdit()\" role=\"button\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\">{{flag}}</span></dd>\n<dd *ngIf=\"edit\">\n <div class=\"row\">\n <ng-container *ngIf=\"!free\">\n <div class=\"col\">\n <select class=\"form-select form-select-sm\" [formControl]=\"fs\">\n <option *ngFor=\"let flag of flaglist\" [value]=\"flag.flag\">{{flag.flag}}<span class=\"ms-1\" *ngIf=\"flag.count\">({{flag.count}})</span></option>\n </select>\n </div>\n <div class=\"col\" *ngIf=\"create\">\n <input class=\"form-control form-control-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\">\n </div>\n </ng-container>\n <ng-container *ngIf=\"free\">\n <div class=\"col-12\">\n <input class=\"form-control form-select-sm\" placeholder=\"Nouveau flag\" [formControl]=\"ft\" (keyup.enter)=\"addFreeFlag()\" (keyup.escape)=\"toggleEdit()\">\n </div>\n </ng-container>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-12\"><span class=\"badge bg-info me-1\" *ngFor=\"let flag of curflags\" (click)=\"removeFlag(flag)\" role=\"button\"><i class=\"bi bi-trash me-1\"></i>{{flag}}</span><i class=\"bi bi-x-lg text-muted ms-2\" role=\"button\" (click)=\"toggleEdit()\"></i></div>\n </div>\n</dd>" }]
121
118
  }], ctorParameters: () => [{ type: i1.DataMessageService }], propDecorators: { model: [{
@@ -137,4 +134,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
137
134
  }], action: [{
138
135
  type: Input
139
136
  }] } });
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2Rpc3BlZGl0L2ZsYWdzL2ZsYWdzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9mbGFncy9mbGFncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osY0FBYyxFQUVkLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBZWxFLE1BQU0sT0FBTyxjQUFjO0lBbUJ6QixZQUFvQixJQUF3QjtRQUF4QixTQUFJLEdBQUosSUFBSSxDQUFvQjtRQWpCNUIsVUFBSyxHQUFHLE9BQU8sQ0FBQztRQUNoQyx3REFBd0Q7UUFDeEMsdUJBQWtCLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLFNBQUksR0FBWSxLQUFLLENBQUM7UUFDdEIsYUFBUSxHQUFZLElBQUksQ0FBQztRQUV6QixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLFdBQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyw2REFBNkQ7UUFHdEYsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUN4QixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLGFBQVEsR0FBZ0IsRUFBRSxDQUFDO1FBQzFCLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVDLENBQUM7SUFFekMs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QUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsVUFBVTtRQUNyQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2FBQ2xCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO2FBQ25CO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1NBQ25CO0lBQ0gsQ0FBQzs4R0EzSFUsY0FBYztrR0FBZCxjQUFjLGtRQ3pCM0IsdTVDQTBCSyx5RERMTyxZQUFZLCtQQUFFLG1CQUFtQjs7MkZBSWhDLGNBQWM7a0JBUDFCLFNBQVM7K0JBQ0UsWUFBWSxjQUNWLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQzt1RkFLNUIsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUVVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLE1BQU07c0JBQXJCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vZGF0YS9kYXRhLW1vZGVsJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGFNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL21lc3NhZ2VzL21lc3NhZ2Uuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZsYWdJdGVtIHtcbiAgZmxhZzogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYXRhLWZsYWdzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9mbGFncy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZsYWdzLmNvbXBvbmVudC5zYXNzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZsYWdzQ29tcG9uZW50PFQgZXh0ZW5kcyBEYXRhTW9kZWw+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwdWJsaWMgbW9kZWwhOiBUO1xuICBASW5wdXQoKSBwdWJsaWMgZmllbGQgPSAnZmxhZ3MnO1xuICAvLyBGSVhNRTogbWFrZSBhbGwgZmxhZ3MgZW5kcG9pbnQgYXMgb3B0aW9uYWwgcGFyYW1ldGVyc1xuICBASW5wdXQoKSBwdWJsaWMgZ2V0X2ZsYWdzX2VuZHBvaW50ID0gJ2dldF9mbGFncyc7XG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBmbGFncyE6IE9ic2VydmFibGU8SUZsYWdJdGVtW10+O1xuICBASW5wdXQoKSBwdWJsaWMgZnJlZSA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgY3JlYXRlID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGFjdGlvbiA9IGZhbHNlOyAvLyBpZiBzZXQgdG8gdHJ1ZSwgdXNlIGFkZF9mbGFnIGFuZCByZW1vdmVfZmxhZyBtb2RlbCBhY3Rpb25zXG4gIHB1YmxpYyBmdCE6IEZvcm1Db250cm9sO1xuICBwdWJsaWMgZnMhOiBGb3JtQ29udHJvbDtcbiAgcHVibGljIGN1cmZsYWdzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgdHh0ZmxhZyA9ICcnO1xuICBwdWJsaWMgc2VsZmxhZyA9ICcnO1xuICBwdWJsaWMgZmxhZ2xpc3Q6IElGbGFnSXRlbVtdID0gW107XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tc2c6IERhdGFNZXNzYWdlU2VydmljZSkge31cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyQubmV4dCgpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuZmxhZ3MgJiYgdGhpcy5tb2RlbC5fY29sbGVjdGlvbikge1xuICAgICAgdGhpcy5mbGFncyA9IHRoaXMubW9kZWwuX2NvbGxlY3Rpb24uYWN0aW9uKFxuICAgICAgICBudWxsLFxuICAgICAgICAnR0VUJyxcbiAgICAgICAgdGhpcy5nZXRfZmxhZ3NfZW5kcG9pbnRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGVsICYmIHRoaXMuZmllbGQgJiYgKHRoaXMubW9kZWwgYXMgYW55KVt0aGlzLmZpZWxkXSkge1xuICAgICAgdGhpcy5jdXJmbGFncyA9ICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTW9kZWwgb3IgZmllbGQgcHJvYmxlbSBpbiBmbGFnc2ZpZWxkIGNvbXBvbmVudCcpO1xuICAgICAgdGhpcy5jdXJmbGFncyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmZ0ID0gbmV3IEZvcm1Db250cm9sKCcnKTtcbiAgICB0aGlzLmZzID0gbmV3IEZvcm1Db250cm9sKCcnKTtcbiAgICB0aGlzLmZzLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3N1YnNjcmlwdGlvbnMkKSwgZGVib3VuY2VUaW1lKDI1MCkpXG4gICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuYWRkRmxhZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZEZyZWVGbGFnKCk6IFByb21pc2U8YW55PiB7XG4gICAgYXdhaXQgdGhpcy5hZGRGbGFnKHRoaXMuZnQudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZEZsYWcoZmxhZzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuZmxhZ1ByZXNlbnQoZmxhZykpIHtcbiAgICAgIHRoaXMuY3VyZmxhZ3MucHVzaChmbGFnKTtcbiAgICAgIGlmICh0aGlzLmFjdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgICAgdGhpcy5tb2RlbC5hY3Rpb24oJ1BPU1QnLCAnYWRkX2ZsYWcnLCB7IGJvZHk6IHsgZmxhZyB9IH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9tc2cuc3VjY2VzcygnRmxhZyBlbnJlZ2lzdHLDqSBhdmVjIHN1Y2PDqHMnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMuX21zZy5lcnJvcignRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZScsIGUgYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlKCk6IFByb21pc2U8YW55PiB7XG4gICAgKHRoaXMubW9kZWwgYXMgYW55KVt0aGlzLmZpZWxkXSA9IHRoaXMuY3VyZmxhZ3M7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMubW9kZWwudXBkYXRlKFt0aGlzLmZpZWxkXSkpO1xuICAgICAgdGhpcy5mcy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5mdC5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5fbXNnLnN1Y2Nlc3MoJ0ZsYWcgZW5yZWdpc3Ryw6kgYXZlYyBzdWNjw6hzJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX21zZy5lcnJvcihcbiAgICAgICAgJ0VycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUnLFxuICAgICAgICBgQVBJIFJldHVybiA6ICR7ZXJyb3J9YCxcbiAgICAgICAgKGVycm9yIGFzIGFueSkuX2JvZHlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZsYWdQcmVzZW50KGZsYWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1cmZsYWdzLmZpbmRJbmRleCgoZikgPT4gZmxhZyA9PT0gZikgIT09IC0xO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlbW92ZUZsYWcoZmxhZzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLmN1cmZsYWdzLnNwbGljZShcbiAgICAgIHRoaXMuY3VyZmxhZ3MuZmluZEluZGV4KChmKSA9PiBmbGFnID09PSBmKSxcbiAgICAgIDFcbiAgICApO1xuICAgIGlmICh0aGlzLmFjdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5tb2RlbC5hY3Rpb24oJ1BPU1QnLCAncmVtb3ZlX2ZsYWcnLCB7IGJvZHk6IHsgZmxhZyB9IH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX21zZy5zdWNjZXNzKCdSZW1vdmVkJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMuX21zZy5lcnJvcignUmVtb3ZpbmcgZmxhZyBmYWlsZWQnLCBlIGFzIGFueSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHRvZ2dsZUVkaXQoKSB7XG4gICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcbiAgICAgIGlmICghdGhpcy5lZGl0KSB7XG4gICAgICAgIHRoaXMuZmxhZ2xpc3QgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmZsYWdzKTtcbiAgICAgICAgdGhpcy5lZGl0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiIsIlxuPGR0IChjbGljayk9XCJ0b2dnbGVFZGl0KClcIiByb2xlPVwiYnV0dG9uXCI+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZHQ+XG48ZGQgKm5nSWY9XCIhZWRpdFwiIChjbGljayk9XCJ0b2dnbGVFZGl0KClcIiByb2xlPVwiYnV0dG9uXCI+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1pbmZvIG1lLTFcIiAqbmdGb3I9XCJsZXQgZmxhZyBvZiBjdXJmbGFnc1wiPnt7ZmxhZ319PC9zcGFuPjwvZGQ+XG48ZGQgKm5nSWY9XCJlZGl0XCI+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZyZWVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgW2Zvcm1Db250cm9sXT1cImZzXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZmxhZyBvZiBmbGFnbGlzdFwiIFt2YWx1ZV09XCJmbGFnLmZsYWdcIj57e2ZsYWcuZmxhZ319PHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJmbGFnLmNvdW50XCI+KHt7ZmxhZy5jb3VudH19KTwvc3Bhbj48L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIiAqbmdJZj1cImNyZWF0ZVwiPlxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgcGxhY2Vob2xkZXI9XCJOb3V2ZWF1IGZsYWdcIiBbZm9ybUNvbnRyb2xdPVwiZnRcIiAoa2V5dXAuZW50ZXIpPVwiYWRkRnJlZUZsYWcoKVwiPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZyZWVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tc2VsZWN0LXNtXCIgcGxhY2Vob2xkZXI9XCJOb3V2ZWF1IGZsYWdcIiBbZm9ybUNvbnRyb2xdPVwiZnRcIiAoa2V5dXAuZW50ZXIpPVwiYWRkRnJlZUZsYWcoKVwiIChrZXl1cC5lc2NhcGUpPVwidG9nZ2xlRWRpdCgpXCI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyXCI+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1pbmZvIG1lLTFcIiAqbmdGb3I9XCJsZXQgZmxhZyBvZiBjdXJmbGFnc1wiIChjbGljayk9XCJyZW1vdmVGbGFnKGZsYWcpXCIgcm9sZT1cImJ1dHRvblwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2ggbWUtMVwiPjwvaT57e2ZsYWd9fTwvc3Bhbj48aSBjbGFzcz1cImJpIGJpLXgtbGcgdGV4dC1tdXRlZCBtcy0yXCIgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCJ0b2dnbGVFZGl0KClcIj48L2k+PC9kaXY+XG4gIDwvZGl2PlxuPC9kZD4iXX0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2Rpc3BlZGl0L2ZsYWdzL2ZsYWdzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9mbGFncy9mbGFncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7O0FBY2hFLE1BQU0sT0FBTyxjQUFjO0lBbUJ6QixZQUFvQixJQUF3QjtRQUF4QixTQUFJLEdBQUosSUFBSSxDQUFvQjtRQWpCNUIsVUFBSyxHQUFHLE9BQU8sQ0FBQztRQUNoQyx3REFBd0Q7UUFDeEMsdUJBQWtCLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLFNBQUksR0FBWSxLQUFLLENBQUM7UUFDdEIsYUFBUSxHQUFZLElBQUksQ0FBQztRQUV6QixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLFdBQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyw2REFBNkQ7UUFHdEYsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUN4QixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLGFBQVEsR0FBZ0IsRUFBRSxDQUFDO1FBQzFCLGFB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QUssQ0FBQyxVQUFVO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7YUFDbEI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7YUFDbkI7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7U0FDbkI7SUFDSCxDQUFDOzhHQXRIVSxjQUFjO2tHQUFkLGNBQWMsa1FDcEIzQix1NUNBMEJLLHlERFZPLFlBQVksK1BBQUUsbUJBQW1COzsyRkFJaEMsY0FBYztrQkFQMUIsU0FBUzsrQkFDRSxZQUFZLGNBQ1YsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDO3VGQUs1QixLQUFLO3NCQUFwQixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBRVUsa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFDVSxNQUFNO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBpbmplY3QsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi9kYXRhL2RhdGEtbW9kZWwnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaXJzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRhTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9tZXNzYWdlcy9tZXNzYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElGbGFnSXRlbSB7XG4gIGZsYWc6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0YS1mbGFncycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vZmxhZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mbGFncy5jb21wb25lbnQuc2FzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGbGFnc0NvbXBvbmVudDxUIGV4dGVuZHMgRGF0YU1vZGVsPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHB1YmxpYyBtb2RlbCE6IFQ7XG4gIEBJbnB1dCgpIHB1YmxpYyBmaWVsZCA9ICdmbGFncyc7XG4gIC8vIEZJWE1FOiBtYWtlIGFsbCBmbGFncyBlbmRwb2ludCBhcyBvcHRpb25hbCBwYXJhbWV0ZXJzXG4gIEBJbnB1dCgpIHB1YmxpYyBnZXRfZmxhZ3NfZW5kcG9pbnQgPSAnZ2V0X2ZsYWdzJztcbiAgQElucHV0KCkgcHVibGljIGVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGVkaXRhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGZsYWdzITogT2JzZXJ2YWJsZTxJRmxhZ0l0ZW1bXT47XG4gIEBJbnB1dCgpIHB1YmxpYyBmcmVlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBjcmVhdGUgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgYWN0aW9uID0gZmFsc2U7IC8vIGlmIHNldCB0byB0cnVlLCB1c2UgYWRkX2ZsYWcgYW5kIHJlbW92ZV9mbGFnIG1vZGVsIGFjdGlvbnNcbiAgcHVibGljIGZ0ITogRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBmcyE6IEZvcm1Db250cm9sO1xuICBwdWJsaWMgY3VyZmxhZ3M6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyB0eHRmbGFnID0gJyc7XG4gIHB1YmxpYyBzZWxmbGFnID0gJyc7XG4gIHB1YmxpYyBmbGFnbGlzdDogSUZsYWdJdGVtW10gPSBbXTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tc2c6IERhdGFNZXNzYWdlU2VydmljZSkge31cblxuICBwdWJsaWMgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuZmxhZ3MgJiYgdGhpcy5tb2RlbC5fY29sbGVjdGlvbikge1xuICAgICAgdGhpcy5mbGFncyA9IHRoaXMubW9kZWwuX2NvbGxlY3Rpb24uYWN0aW9uKFxuICAgICAgICBudWxsLFxuICAgICAgICAnR0VUJyxcbiAgICAgICAgdGhpcy5nZXRfZmxhZ3NfZW5kcG9pbnQsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlbCAmJiB0aGlzLmZpZWxkICYmICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0pIHtcbiAgICAgIHRoaXMuY3VyZmxhZ3MgPSAodGhpcy5tb2RlbCBhcyBhbnkpW3RoaXMuZmllbGRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ01vZGVsIG9yIGZpZWxkIHByb2JsZW0gaW4gZmxhZ3NmaWVsZCBjb21wb25lbnQnKTtcbiAgICAgIHRoaXMuY3VyZmxhZ3MgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5mdCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gICAgdGhpcy5mcyA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gICAgdGhpcy5mcy52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDI1MCkpXG4gICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuYWRkRmxhZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZEZyZWVGbGFnKCk6IFByb21pc2U8YW55PiB7XG4gICAgYXdhaXQgdGhpcy5hZGRGbGFnKHRoaXMuZnQudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZEZsYWcoZmxhZzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuZmxhZ1ByZXNlbnQoZmxhZykpIHtcbiAgICAgIHRoaXMuY3VyZmxhZ3MucHVzaChmbGFnKTtcbiAgICAgIGlmICh0aGlzLmFjdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgICAgdGhpcy5tb2RlbC5hY3Rpb24oJ1BPU1QnLCAnYWRkX2ZsYWcnLCB7IGJvZHk6IHsgZmxhZyB9IH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fbXNnLnN1Y2Nlc3MoJ0ZsYWcgZW5yZWdpc3Ryw6kgYXZlYyBzdWNjw6hzJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLl9tc2cuZXJyb3IoJ0VycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUnLCBlIGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZSgpOiBQcm9taXNlPGFueT4ge1xuICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gPSB0aGlzLmN1cmZsYWdzO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLm1vZGVsLnVwZGF0ZShbdGhpcy5maWVsZF0pKTtcbiAgICAgIHRoaXMuZnMuc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuZnQuc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuX21zZy5zdWNjZXNzKCdGbGFnIGVucmVnaXN0csOpIGF2ZWMgc3VjY8OocycpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9tc2cuZXJyb3IoXG4gICAgICAgICdFcnJldXIgbG9ycyBkZSBsYSBzYXV2ZWdhcmRlJyxcbiAgICAgICAgYEFQSSBSZXR1cm4gOiAke2Vycm9yfWAsXG4gICAgICAgIChlcnJvciBhcyBhbnkpLl9ib2R5LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmxhZ1ByZXNlbnQoZmxhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VyZmxhZ3MuZmluZEluZGV4KChmKSA9PiBmbGFnID09PSBmKSAhPT0gLTE7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVtb3ZlRmxhZyhmbGFnOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuY3VyZmxhZ3Muc3BsaWNlKFxuICAgICAgdGhpcy5jdXJmbGFncy5maW5kSW5kZXgoKGYpID0+IGZsYWcgPT09IGYpLFxuICAgICAgMSxcbiAgICApO1xuICAgIGlmICh0aGlzLmFjdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5tb2RlbC5hY3Rpb24oJ1BPU1QnLCAncmVtb3ZlX2ZsYWcnLCB7IGJvZHk6IHsgZmxhZyB9IH0pLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9tc2cuc3VjY2VzcygnUmVtb3ZlZCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLl9tc2cuZXJyb3IoJ1JlbW92aW5nIGZsYWcgZmFpbGVkJywgZSBhcyBhbnkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0b2dnbGVFZGl0KCkge1xuICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XG4gICAgICBpZiAoIXRoaXMuZWRpdCkge1xuICAgICAgICB0aGlzLmZsYWdsaXN0ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5mbGFncyk7XG4gICAgICAgIHRoaXMuZWRpdCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCJcbjxkdCAoY2xpY2spPVwidG9nZ2xlRWRpdCgpXCIgcm9sZT1cImJ1dHRvblwiPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2R0PlxuPGRkICpuZ0lmPVwiIWVkaXRcIiAoY2xpY2spPVwidG9nZ2xlRWRpdCgpXCIgcm9sZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctaW5mbyBtZS0xXCIgKm5nRm9yPVwibGV0IGZsYWcgb2YgY3VyZmxhZ3NcIj57e2ZsYWd9fTwvc3Bhbj48L2RkPlxuPGRkICpuZ0lmPVwiZWRpdFwiPlxuICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmcmVlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIFtmb3JtQ29udHJvbF09XCJmc1wiPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGZsYWcgb2YgZmxhZ2xpc3RcIiBbdmFsdWVdPVwiZmxhZy5mbGFnXCI+e3tmbGFnLmZsYWd9fTxzcGFuIGNsYXNzPVwibXMtMVwiICpuZ0lmPVwiZmxhZy5jb3VudFwiPih7e2ZsYWcuY291bnR9fSk8L3NwYW4+PC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sXCIgKm5nSWY9XCJjcmVhdGVcIj5cbiAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIHBsYWNlaG9sZGVyPVwiTm91dmVhdSBmbGFnXCIgW2Zvcm1Db250cm9sXT1cImZ0XCIgKGtleXVwLmVudGVyKT1cImFkZEZyZWVGbGFnKClcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmcmVlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLXNlbGVjdC1zbVwiIHBsYWNlaG9sZGVyPVwiTm91dmVhdSBmbGFnXCIgW2Zvcm1Db250cm9sXT1cImZ0XCIgKGtleXVwLmVudGVyKT1cImFkZEZyZWVGbGFnKClcIiAoa2V5dXAuZXNjYXBlKT1cInRvZ2dsZUVkaXQoKVwiPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMlwiPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctaW5mbyBtZS0xXCIgKm5nRm9yPVwibGV0IGZsYWcgb2YgY3VyZmxhZ3NcIiAoY2xpY2spPVwicmVtb3ZlRmxhZyhmbGFnKVwiIHJvbGU9XCJidXR0b25cIj48aSBjbGFzcz1cImJpIGJpLXRyYXNoIG1lLTFcIj48L2k+e3tmbGFnfX08L3NwYW4+PGkgY2xhc3M9XCJiaSBiaS14LWxnIHRleHQtbXV0ZWQgbXMtMlwiIHJvbGU9XCJidXR0b25cIiAoY2xpY2spPVwidG9nZ2xlRWRpdCgpXCI+PC9pPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGQ+Il19