@lenne.tech/ng-base 15.0.0-beta → 15.0.0-beta-2

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 (109) hide show
  1. package/base-components/base-components.module.d.ts +3 -1
  2. package/base-components/components/input/input.component.d.ts +2 -1
  3. package/base-components/components/refence-input/refence-input.component.d.ts +10 -2
  4. package/base-components/components/select/select.component.d.ts +2 -1
  5. package/base-components/components/tags/tags.component.d.ts +2 -1
  6. package/base-components/components/textarea/textarea.component.d.ts +9 -2
  7. package/base-components/components/upload-image/upload-image.component.d.ts +19 -4
  8. package/base-prototype/pages/login/login.component.d.ts +5 -8
  9. package/base-prototype/pages/profile/profile.component.d.ts +5 -29
  10. package/base-prototype/pages/register/register.component.d.ts +6 -2
  11. package/esm2020/base-cms/base-cms-routing.module.mjs +4 -4
  12. package/esm2020/base-cms/base-cms.module.mjs +4 -4
  13. package/esm2020/base-cms/pages/base-cms/base-cms.component.mjs +5 -5
  14. package/esm2020/base-components/base-components.module.mjs +9 -7
  15. package/esm2020/base-components/components/breadcrumb/breadcrumb.component.mjs +3 -3
  16. package/esm2020/base-components/components/change-password/change-password.component.mjs +3 -3
  17. package/esm2020/base-components/components/checkbox/checkbox.component.mjs +3 -3
  18. package/esm2020/base-components/components/delete-account/delete-account.component.mjs +3 -3
  19. package/esm2020/base-components/components/fab-button/fab-button.component.mjs +3 -3
  20. package/esm2020/base-components/components/input/input.component.mjs +8 -5
  21. package/esm2020/base-components/components/loading-bar/loading-bar.component.mjs +3 -3
  22. package/esm2020/base-components/components/model-form/model-form-base.component.mjs +3 -3
  23. package/esm2020/base-components/components/model-form/model-form.component.mjs +14 -14
  24. package/esm2020/base-components/components/model-form-sub/model-form-sub.component.mjs +5 -5
  25. package/esm2020/base-components/components/model-table/model-table.component.mjs +3 -3
  26. package/esm2020/base-components/components/refence-input/refence-input.component.mjs +24 -10
  27. package/esm2020/base-components/components/select/select.component.mjs +9 -6
  28. package/esm2020/base-components/components/skeleton-loader/skeleton-loader.component.mjs +3 -3
  29. package/esm2020/base-components/components/tags/tags.component.mjs +8 -5
  30. package/esm2020/base-components/components/textarea/textarea.component.mjs +41 -7
  31. package/esm2020/base-components/components/toast/toast.component.mjs +3 -3
  32. package/esm2020/base-components/components/upload-image/upload-image.component.mjs +100 -28
  33. package/esm2020/base-components/directives/back-button.directive.mjs +3 -3
  34. package/esm2020/base-components/directives/context-menu.directive.mjs +3 -3
  35. package/esm2020/base-components/directives/sort.directive.mjs +3 -3
  36. package/esm2020/base-components/directives/stop-propagation.directive.mjs +3 -3
  37. package/esm2020/base-components/pipes/ellipses.pipe.mjs +3 -3
  38. package/esm2020/base-prototype/base-prototype.module.mjs +4 -4
  39. package/esm2020/base-prototype/pages/email-verification/email-verification.component.mjs +3 -3
  40. package/esm2020/base-prototype/pages/forgot-password/forgot-password.component.mjs +3 -3
  41. package/esm2020/base-prototype/pages/login/login.component.mjs +17 -10
  42. package/esm2020/base-prototype/pages/profile/profile.component.mjs +15 -5
  43. package/esm2020/base-prototype/pages/register/register.component.mjs +15 -8
  44. package/esm2020/base-prototype/pages/set-password/set-password.component.mjs +3 -3
  45. package/esm2020/shared/classes/auth.class.mjs +2 -1
  46. package/esm2020/shared/interfaces/cms-field-config.interface.mjs +1 -1
  47. package/esm2020/shared/interfaces/cropping-options.interface.mjs +2 -0
  48. package/esm2020/shared/interfaces/login-config.interface.mjs +2 -0
  49. package/esm2020/shared/public-api.mjs +3 -1
  50. package/esm2020/shared/services/auth.service.mjs +88 -17
  51. package/esm2020/shared/services/breadcrumb.service.mjs +9 -9
  52. package/esm2020/shared/services/cms.service.mjs +3 -3
  53. package/esm2020/shared/services/file.service.mjs +3 -3
  54. package/esm2020/shared/services/forms.service.mjs +3 -3
  55. package/esm2020/shared/services/graphql-meta.service.mjs +3 -3
  56. package/esm2020/shared/services/graphql-plus.service.mjs +3 -3
  57. package/esm2020/shared/services/graphql.service.mjs +3 -3
  58. package/esm2020/shared/services/image.service.mjs +3 -3
  59. package/esm2020/shared/services/loader.service.mjs +3 -3
  60. package/esm2020/shared/services/navigation.service.mjs +3 -3
  61. package/esm2020/shared/services/scroll.service.mjs +3 -3
  62. package/esm2020/shared/services/storage.service.mjs +3 -3
  63. package/esm2020/shared/services/toast.service.mjs +3 -3
  64. package/esm2020/shared/services/user.service.mjs +12 -10
  65. package/esm2020/shared/services/ws.service.mjs +3 -3
  66. package/esm2020/src/base.module.mjs +4 -4
  67. package/esm2020/src/directives/lazy-load.directive.mjs +3 -3
  68. package/esm2020/src/directives/match-height.directive.mjs +9 -4
  69. package/esm2020/src/directives/resizable.directive.mjs +3 -3
  70. package/esm2020/src/factories/apollo-options.factory.mjs +45 -4
  71. package/esm2020/src/guards/auth.guard.mjs +28 -9
  72. package/esm2020/src/guards/can-deactivate.guard.mjs +3 -3
  73. package/esm2020/src/guards/logout.guard.mjs +3 -3
  74. package/esm2020/src/pipes/date-ago.pipe.mjs +3 -3
  75. package/esm2020/src/pipes/safe-html.pipe.mjs +3 -3
  76. package/esm2020/src/services/fullscreen.service.mjs +3 -3
  77. package/esm2020/src/services/seo.service.mjs +3 -3
  78. package/esm2020/src/services/theme.service.mjs +14 -14
  79. package/fesm2015/lenne.tech-ng-base-base-cms.mjs +12 -13
  80. package/fesm2015/lenne.tech-ng-base-base-cms.mjs.map +1 -1
  81. package/fesm2015/lenne.tech-ng-base-base-components.mjs +234 -117
  82. package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +1 -1
  83. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +55 -33
  84. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
  85. package/fesm2015/lenne.tech-ng-base-shared.mjs +353 -283
  86. package/fesm2015/lenne.tech-ng-base-shared.mjs.map +1 -1
  87. package/fesm2015/lenne.tech-ng-base.mjs +119 -58
  88. package/fesm2015/lenne.tech-ng-base.mjs.map +1 -1
  89. package/fesm2020/lenne.tech-ng-base-base-cms.mjs +12 -13
  90. package/fesm2020/lenne.tech-ng-base-base-cms.mjs.map +1 -1
  91. package/fesm2020/lenne.tech-ng-base-base-components.mjs +241 -117
  92. package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +1 -1
  93. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs +55 -33
  94. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
  95. package/fesm2020/lenne.tech-ng-base-shared.mjs +350 -278
  96. package/fesm2020/lenne.tech-ng-base-shared.mjs.map +1 -1
  97. package/fesm2020/lenne.tech-ng-base.mjs +120 -57
  98. package/fesm2020/lenne.tech-ng-base.mjs.map +1 -1
  99. package/package.json +9 -7
  100. package/shared/classes/auth.class.d.ts +1 -0
  101. package/shared/interfaces/cms-field-config.interface.d.ts +6 -1
  102. package/shared/interfaces/cropping-options.interface.d.ts +12 -0
  103. package/shared/interfaces/field.interface.d.ts +1 -1
  104. package/shared/interfaces/login-config.interface.d.ts +6 -0
  105. package/shared/public-api.d.ts +2 -0
  106. package/shared/services/auth.service.d.ts +16 -4
  107. package/shared/types/graphql-fields.type.d.ts +1 -1
  108. package/shared/types/storage.type.d.ts +1 -1
  109. package/src/directives/match-height.directive.d.ts +1 -0
@@ -24,8 +24,10 @@ import * as i22 from "./pipes/ellipses.pipe";
24
24
  import * as i23 from "@angular/forms";
25
25
  import * as i24 from "@angular/common";
26
26
  import * as i25 from "@angular/router";
27
+ import * as i26 from "ngx-image-cropper";
28
+ import * as i27 from "@ng-bootstrap/ng-bootstrap";
27
29
  export declare class BaseComponentsModule {
28
30
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseComponentsModule, never>;
29
- static ɵmod: i0.ɵɵNgModuleDeclaration<BaseComponentsModule, [typeof i1.SortDirective, typeof i2.BackButtonDirective, typeof i3.ContextMenuDirective, typeof i4.StopPropagationDirective, typeof i5.InputComponent, typeof i6.SelectComponent, typeof i7.CheckboxComponent, typeof i8.TextareaComponent, typeof i9.ToastComponent, typeof i10.TagsComponent, typeof i11.LoadingBarComponent, typeof i12.SkeletonLoaderComponent, typeof i13.BreadcrumbComponent, typeof i14.ModelFormComponent, typeof i15.ModelTableComponent, typeof i16.ModelFormSubComponent, typeof i17.UploadImageComponent, typeof i18.RefenceInputComponent, typeof i19.ChangePasswordComponent, typeof i20.DeleteAccountComponent, typeof i21.FabButtonComponent, typeof i22.EllipsesPipe], [typeof i23.FormsModule, typeof i23.ReactiveFormsModule, typeof i24.CommonModule, typeof i25.RouterModule], [typeof i1.SortDirective, typeof i2.BackButtonDirective, typeof i3.ContextMenuDirective, typeof i4.StopPropagationDirective, typeof i5.InputComponent, typeof i6.SelectComponent, typeof i7.CheckboxComponent, typeof i8.TextareaComponent, typeof i9.ToastComponent, typeof i10.TagsComponent, typeof i11.LoadingBarComponent, typeof i12.SkeletonLoaderComponent, typeof i13.BreadcrumbComponent, typeof i14.ModelFormComponent, typeof i15.ModelTableComponent, typeof i16.ModelFormSubComponent, typeof i17.UploadImageComponent, typeof i18.RefenceInputComponent, typeof i19.ChangePasswordComponent, typeof i20.DeleteAccountComponent, typeof i21.FabButtonComponent, typeof i22.EllipsesPipe]>;
31
+ static ɵmod: i0.ɵɵNgModuleDeclaration<BaseComponentsModule, [typeof i1.SortDirective, typeof i2.BackButtonDirective, typeof i3.ContextMenuDirective, typeof i4.StopPropagationDirective, typeof i5.InputComponent, typeof i6.SelectComponent, typeof i7.CheckboxComponent, typeof i8.TextareaComponent, typeof i9.ToastComponent, typeof i10.TagsComponent, typeof i11.LoadingBarComponent, typeof i12.SkeletonLoaderComponent, typeof i13.BreadcrumbComponent, typeof i14.ModelFormComponent, typeof i15.ModelTableComponent, typeof i16.ModelFormSubComponent, typeof i17.UploadImageComponent, typeof i18.RefenceInputComponent, typeof i19.ChangePasswordComponent, typeof i20.DeleteAccountComponent, typeof i21.FabButtonComponent, typeof i22.EllipsesPipe], [typeof i23.FormsModule, typeof i23.ReactiveFormsModule, typeof i24.CommonModule, typeof i25.RouterModule, typeof i26.ImageCropperModule, typeof i27.NgbTooltipModule], [typeof i1.SortDirective, typeof i2.BackButtonDirective, typeof i3.ContextMenuDirective, typeof i4.StopPropagationDirective, typeof i5.InputComponent, typeof i6.SelectComponent, typeof i7.CheckboxComponent, typeof i8.TextareaComponent, typeof i9.ToastComponent, typeof i10.TagsComponent, typeof i11.LoadingBarComponent, typeof i12.SkeletonLoaderComponent, typeof i13.BreadcrumbComponent, typeof i14.ModelFormComponent, typeof i15.ModelTableComponent, typeof i16.ModelFormSubComponent, typeof i17.UploadImageComponent, typeof i18.RefenceInputComponent, typeof i19.ChangePasswordComponent, typeof i20.DeleteAccountComponent, typeof i21.FabButtonComponent, typeof i22.EllipsesPipe]>;
30
32
  static ɵinj: i0.ɵɵInjectorDeclaration<BaseComponentsModule>;
31
33
  }
@@ -3,6 +3,7 @@ import * as i0 from "@angular/core";
3
3
  export declare class InputComponent {
4
4
  id: string;
5
5
  name: string;
6
+ infoText: string;
6
7
  label?: string;
7
8
  placeholder?: string;
8
9
  autocomplete?: string;
@@ -22,5 +23,5 @@ export declare class InputComponent {
22
23
  */
23
24
  togglePasswordType(): void;
24
25
  static ɵfac: i0.ɵɵFactoryDeclaration<InputComponent, never>;
25
- static ɵcmp: i0.ɵɵComponentDeclaration<InputComponent, "base-input", never, { "id": "id"; "name": "name"; "label": "label"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "tabIndex": "tabIndex"; "control": "control"; "type": "type"; "required": "required"; "eyeButton": "eyeButton"; "objectPath": "objectPath"; }, { "enter": "enter"; }, never, never, false, never>;
26
+ static ɵcmp: i0.ɵɵComponentDeclaration<InputComponent, "base-input", never, { "id": "id"; "name": "name"; "infoText": "infoText"; "label": "label"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "tabIndex": "tabIndex"; "control": "control"; "type": "type"; "required": "required"; "eyeButton": "eyeButton"; "objectPath": "objectPath"; }, { "enter": "enter"; }, never, never, false, never>;
26
27
  }
@@ -1,11 +1,14 @@
1
1
  import { OnDestroy, OnInit } from '@angular/core';
2
2
  import { GraphQLService } from '@lenne.tech/ng-base/shared';
3
3
  import { Subscription } from 'rxjs';
4
+ import { Router } from '@angular/router';
4
5
  import * as i0 from "@angular/core";
5
6
  export declare class RefenceInputComponent implements OnInit, OnDestroy {
6
7
  private graphQLService;
8
+ private router;
7
9
  id: string;
8
10
  name: string;
11
+ infoText: string;
9
12
  label?: string;
10
13
  isList: boolean;
11
14
  search: boolean;
@@ -21,14 +24,19 @@ export declare class RefenceInputComponent implements OnInit, OnDestroy {
21
24
  valueField: string;
22
25
  objectPath: string;
23
26
  nameField: string[] | string;
27
+ creationLink: string;
24
28
  objects: any[];
25
29
  currentValue: any;
26
30
  optionsForTagInput: any[];
27
31
  selectedElement: HTMLElement;
28
32
  subscription: Subscription;
29
- constructor(graphQLService: GraphQLService);
33
+ constructor(graphQLService: GraphQLService, router: Router);
30
34
  ngOnInit(): Promise<void>;
31
35
  ngOnDestroy(): void;
36
+ /**
37
+ * Open creation link for new reference if enabled
38
+ */
39
+ openLink(): void;
32
40
  /**
33
41
  * It gets the references from the GraphQL server and sets the value of the select
34
42
  */
@@ -72,5 +80,5 @@ export declare class RefenceInputComponent implements OnInit, OnDestroy {
72
80
  */
73
81
  checkForNameFields(object: any): any;
74
82
  static ɵfac: i0.ɵɵFactoryDeclaration<RefenceInputComponent, never>;
75
- static ɵcmp: i0.ɵɵComponentDeclaration<RefenceInputComponent, "base-refence-input", never, { "id": "id"; "name": "name"; "label": "label"; "isList": "isList"; "search": "search"; "useParamAsArg": "useParamAsArg"; "param": "param"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "tabIndex": "tabIndex"; "control": "control"; "required": "required"; "method": "method"; "fields": "fields"; "valueField": "valueField"; "objectPath": "objectPath"; "nameField": "nameField"; }, {}, never, never, false, never>;
83
+ static ɵcmp: i0.ɵɵComponentDeclaration<RefenceInputComponent, "base-refence-input", never, { "id": "id"; "name": "name"; "infoText": "infoText"; "label": "label"; "isList": "isList"; "search": "search"; "useParamAsArg": "useParamAsArg"; "param": "param"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "tabIndex": "tabIndex"; "control": "control"; "required": "required"; "method": "method"; "fields": "fields"; "valueField": "valueField"; "objectPath": "objectPath"; "nameField": "nameField"; "creationLink": "creationLink"; }, {}, never, never, false, never>;
76
84
  }
@@ -8,6 +8,7 @@ export declare class SelectComponent implements OnInit {
8
8
  select: ElementRef;
9
9
  id: string;
10
10
  name: string;
11
+ infoText: string;
11
12
  label?: string;
12
13
  placeholder?: string;
13
14
  objectPath: string;
@@ -19,6 +20,6 @@ export declare class SelectComponent implements OnInit {
19
20
  options: Option[];
20
21
  ngOnInit(): void;
21
22
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectComponent, never>;
22
- static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent, "base-select", never, { "id": "id"; "name": "name"; "label": "label"; "placeholder": "placeholder"; "objectPath": "objectPath"; "control": "control"; "tabIndex": "tabIndex"; "required": "required"; "multiple": "multiple"; "search": "search"; "options": "options"; }, {}, never, never, false, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<SelectComponent, "base-select", never, { "id": "id"; "name": "name"; "infoText": "infoText"; "label": "label"; "placeholder": "placeholder"; "objectPath": "objectPath"; "control": "control"; "tabIndex": "tabIndex"; "required": "required"; "multiple": "multiple"; "search": "search"; "options": "options"; }, {}, never, never, false, never>;
23
24
  }
24
25
  export {};
@@ -3,6 +3,7 @@ import * as i0 from "@angular/core";
3
3
  export declare class TagsComponent {
4
4
  id: string;
5
5
  name: string;
6
+ infoText: string;
6
7
  label?: string;
7
8
  placeholder?: string;
8
9
  autocomplete?: string;
@@ -55,5 +56,5 @@ export declare class TagsComponent {
55
56
  */
56
57
  onFocus(event?: any): void;
57
58
  static ɵfac: i0.ɵɵFactoryDeclaration<TagsComponent, never>;
58
- static ɵcmp: i0.ɵɵComponentDeclaration<TagsComponent, "base-tags", never, { "id": "id"; "name": "name"; "label": "label"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "tabIndex": "tabIndex"; "control": "control"; "options": "options"; "custom": "custom"; "removeByKey": "removeByKey"; "required": "required"; "objectPath": "objectPath"; "validators": "validators"; }, {}, never, never, false, never>;
59
+ static ɵcmp: i0.ɵɵComponentDeclaration<TagsComponent, "base-tags", never, { "id": "id"; "name": "name"; "infoText": "infoText"; "label": "label"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "tabIndex": "tabIndex"; "control": "control"; "options": "options"; "custom": "custom"; "removeByKey": "removeByKey"; "required": "required"; "objectPath": "objectPath"; "validators": "validators"; }, {}, never, never, false, never>;
59
60
  }
@@ -1,14 +1,21 @@
1
+ import { ElementRef, OnChanges, SimpleChanges } from '@angular/core';
1
2
  import * as i0 from "@angular/core";
2
- export declare class TextareaComponent {
3
+ export declare class TextareaComponent implements OnChanges {
4
+ textarea: ElementRef;
3
5
  id: string;
4
6
  name: string;
7
+ infoText: string;
5
8
  label?: string;
6
9
  placeholder?: string;
7
10
  control: any;
8
11
  rows: number;
9
12
  required: boolean;
13
+ autoHeight: boolean;
10
14
  tabIndex?: number;
11
15
  objectPath: string;
16
+ ngOnChanges(changes: SimpleChanges): void;
17
+ adjustInitHeight(): void;
18
+ adjustHeight(event: any): void;
12
19
  static ɵfac: i0.ɵɵFactoryDeclaration<TextareaComponent, never>;
13
- static ɵcmp: i0.ɵɵComponentDeclaration<TextareaComponent, "base-textarea", never, { "id": "id"; "name": "name"; "label": "label"; "placeholder": "placeholder"; "control": "control"; "rows": "rows"; "required": "required"; "tabIndex": "tabIndex"; "objectPath": "objectPath"; }, {}, never, never, false, never>;
20
+ static ɵcmp: i0.ɵɵComponentDeclaration<TextareaComponent, "base-textarea", never, { "id": "id"; "name": "name"; "infoText": "infoText"; "label": "label"; "placeholder": "placeholder"; "control": "control"; "rows": "rows"; "required": "required"; "autoHeight": "autoHeight"; "tabIndex": "tabIndex"; "objectPath": "objectPath"; }, {}, never, never, false, never>;
14
21
  }
@@ -1,14 +1,17 @@
1
- import { EventEmitter } from '@angular/core';
1
+ import { ElementRef, EventEmitter, OnInit } from '@angular/core';
2
2
  import { HttpClient } from '@angular/common/http';
3
- import { AuthService, CompressOptions, FileService, ToastService } from '@lenne.tech/ng-base/shared';
3
+ import { AuthService, CompressOptions, CroppingOptions, FileService, ToastService } from '@lenne.tech/ng-base/shared';
4
+ import { ImageCroppedEvent } from 'ngx-image-cropper';
4
5
  import * as i0 from "@angular/core";
5
- export declare class UploadImageComponent {
6
+ export declare class UploadImageComponent implements OnInit {
6
7
  private httpClient;
7
8
  private authService;
8
9
  private fileService;
9
10
  private toastService;
11
+ fileInput: ElementRef;
10
12
  id: string;
11
13
  name: string;
14
+ infoText: string;
12
15
  label?: string;
13
16
  supportText: string;
14
17
  required: boolean;
@@ -25,6 +28,8 @@ export declare class UploadImageComponent {
25
28
  compressOptions: CompressOptions;
26
29
  maxSize: number;
27
30
  uploadDirectly: boolean;
31
+ croppingImage: boolean;
32
+ croppingOptions: CroppingOptions;
28
33
  objectPath: string;
29
34
  mode: 'file' | 'base64';
30
35
  imageUploaded: EventEmitter<any>;
@@ -37,9 +42,14 @@ export declare class UploadImageComponent {
37
42
  dragActive: boolean;
38
43
  dragText: string;
39
44
  selectedFile: File;
45
+ croppedFile: File;
40
46
  fileUrl: string;
41
47
  loading: boolean;
48
+ croppedInProgress: boolean;
49
+ fileEvent: any;
50
+ cOptions: CroppingOptions;
42
51
  constructor(httpClient: HttpClient, authService: AuthService, fileService: FileService, toastService: ToastService);
52
+ ngOnInit(): void;
43
53
  /**
44
54
  * The dragOver function is called when the user drags a file over the dropzone. It prevents the default action of the
45
55
  * event, and sets the dragText to 'Release to Upload' and the dragActive to true
@@ -70,6 +80,7 @@ export declare class UploadImageComponent {
70
80
  * @param file - any - this is the file that is selected by the user.
71
81
  */
72
82
  setUrl(file: File): void;
83
+ checkFile(file: File): boolean;
73
84
  /**
74
85
  * The function takes an event as an argument, and then sets the url of the file to the first file in the event's
75
86
  * target's files array
@@ -91,6 +102,10 @@ export declare class UploadImageComponent {
91
102
  * Convert a file into a BASE64 encoded string
92
103
  */
93
104
  protected getBase64(file: any): Promise<string>;
105
+ base64ToFile(base64: string, fileName: string, fileType: string): Promise<File>;
106
+ imageCropped($event: ImageCroppedEvent, fileEvent: any): Promise<void>;
107
+ finishedCropping(): void;
108
+ loadImageFailed(): void;
94
109
  static ɵfac: i0.ɵɵFactoryDeclaration<UploadImageComponent, never>;
95
- static ɵcmp: i0.ɵɵComponentDeclaration<UploadImageComponent, "base-upload-image", never, { "id": "id"; "name": "name"; "label": "label"; "supportText": "supportText"; "required": "required"; "defaultDragText": "defaultDragText"; "defaultReleaseText": "defaultReleaseText"; "preButtonText": "preButtonText"; "buttonText": "buttonText"; "validExtensions": "validExtensions"; "control": "control"; "url": "url"; "uploadPath": "uploadPath"; "deletePath": "deletePath"; "path": "path"; "compressOptions": "compressOptions"; "maxSize": "maxSize"; "uploadDirectly": "uploadDirectly"; "objectPath": "objectPath"; "mode": "mode"; }, { "imageUploaded": "imageUploaded"; "imageDeleted": "imageDeleted"; "fileChanged": "fileChanged"; }, never, never, false, never>;
110
+ static ɵcmp: i0.ɵɵComponentDeclaration<UploadImageComponent, "base-upload-image", never, { "id": "id"; "name": "name"; "infoText": "infoText"; "label": "label"; "supportText": "supportText"; "required": "required"; "defaultDragText": "defaultDragText"; "defaultReleaseText": "defaultReleaseText"; "preButtonText": "preButtonText"; "buttonText": "buttonText"; "validExtensions": "validExtensions"; "control": "control"; "url": "url"; "uploadPath": "uploadPath"; "deletePath": "deletePath"; "path": "path"; "compressOptions": "compressOptions"; "maxSize": "maxSize"; "uploadDirectly": "uploadDirectly"; "croppingImage": "croppingImage"; "croppingOptions": "croppingOptions"; "objectPath": "objectPath"; "mode": "mode"; }, { "imageUploaded": "imageUploaded"; "imageDeleted": "imageDeleted"; "fileChanged": "fileChanged"; }, never, never, false, never>;
96
111
  }
@@ -1,7 +1,7 @@
1
1
  import { OnDestroy, OnInit } from '@angular/core';
2
2
  import { UntypedFormGroup } from '@angular/forms';
3
3
  import { ActivatedRoute, Router } from '@angular/router';
4
- import { FormsService, UserService } from '@lenne.tech/ng-base/shared';
4
+ import { FormsService, LoginConfig, UserService } from '@lenne.tech/ng-base/shared';
5
5
  import { Subscription } from 'rxjs';
6
6
  import * as i0 from "@angular/core";
7
7
  export declare class LoginComponent implements OnInit, OnDestroy {
@@ -9,16 +9,13 @@ export declare class LoginComponent implements OnInit, OnDestroy {
9
9
  private userService;
10
10
  private router;
11
11
  private route;
12
+ config: LoginConfig;
12
13
  form: UntypedFormGroup;
13
14
  error: string;
14
15
  loading: boolean;
15
16
  subscription: Subscription;
16
- config: {
17
- redirectUrl: string;
18
- showPasswordForget: boolean;
19
- showRegister: boolean;
20
- logoUrl: string;
21
- };
17
+ loginConfig: LoginConfig;
18
+ redirectUrl: '';
22
19
  constructor(formsService: FormsService, userService: UserService, router: Router, route: ActivatedRoute);
23
20
  ngOnInit(): void;
24
21
  ngOnDestroy(): void;
@@ -32,5 +29,5 @@ export declare class LoginComponent implements OnInit, OnDestroy {
32
29
  submit(): void;
33
30
  scrollToTop(): void;
34
31
  static ɵfac: i0.ɵɵFactoryDeclaration<LoginComponent, never>;
35
- static ɵcmp: i0.ɵɵComponentDeclaration<LoginComponent, "base-login", never, {}, {}, never, never, false, never>;
32
+ static ɵcmp: i0.ɵɵComponentDeclaration<LoginComponent, "base-login", never, { "config": "config"; }, {}, never, never, false, never>;
36
33
  }
@@ -1,40 +1,16 @@
1
1
  import { OnInit } from '@angular/core';
2
- import { AuthService, BasicUser, UserService } from '@lenne.tech/ng-base/shared';
2
+ import { AuthService, BasicUser, CMSFieldConfig, UserService } from '@lenne.tech/ng-base/shared';
3
3
  import { ActivatedRoute } from '@angular/router';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class ProfileComponent implements OnInit {
6
6
  private authService;
7
7
  private route;
8
8
  private userService;
9
- config: any;
9
+ config: {
10
+ [key: string]: CMSFieldConfig;
11
+ };
10
12
  profileConfig: {
11
- avatar: {
12
- label: string;
13
- placeholder: string;
14
- };
15
- email: {
16
- label: string;
17
- placeholder: string;
18
- };
19
- firstName: {
20
- label: string;
21
- placeholder: string;
22
- };
23
- lastName: {
24
- label: string;
25
- placeholder: string;
26
- };
27
- roles: {
28
- exclude: boolean;
29
- roles: string[];
30
- };
31
- username: {
32
- label: string;
33
- placeholder: string;
34
- };
35
- password: {
36
- exclude: boolean;
37
- };
13
+ [key: string]: CMSFieldConfig;
38
14
  };
39
15
  currentUser: BasicUser;
40
16
  constructor(authService: AuthService, route: ActivatedRoute, userService: UserService);
@@ -1,16 +1,20 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import { UntypedFormGroup } from '@angular/forms';
3
3
  import { FormsService, UserService } from '@lenne.tech/ng-base/shared';
4
- import { Router } from '@angular/router';
4
+ import { ActivatedRoute, Router } from '@angular/router';
5
+ import { Subscription } from 'rxjs';
5
6
  import * as i0 from "@angular/core";
6
7
  export declare class RegisterComponent implements OnInit {
7
8
  private formsService;
8
9
  private userService;
9
10
  private router;
11
+ private route;
10
12
  form: UntypedFormGroup;
11
13
  error: string;
12
14
  loading: boolean;
13
- constructor(formsService: FormsService, userService: UserService, router: Router);
15
+ redirectUrl: string;
16
+ subscription: Subscription;
17
+ constructor(formsService: FormsService, userService: UserService, router: Router, route: ActivatedRoute);
14
18
  ngOnInit(): void;
15
19
  /**
16
20
  * Create login form
@@ -19,10 +19,10 @@ const routes = [
19
19
  ];
20
20
  export class BaseCMSRoutingModule {
21
21
  }
22
- BaseCMSRoutingModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: BaseCMSRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
23
- BaseCMSRoutingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.2", ngImport: i0, type: BaseCMSRoutingModule, imports: [i1.RouterModule], exports: [RouterModule] });
24
- BaseCMSRoutingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: BaseCMSRoutingModule, imports: [RouterModule.forChild(routes), RouterModule] });
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: BaseCMSRoutingModule, decorators: [{
22
+ BaseCMSRoutingModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: BaseCMSRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
23
+ BaseCMSRoutingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.5", ngImport: i0, type: BaseCMSRoutingModule, imports: [i1.RouterModule], exports: [RouterModule] });
24
+ BaseCMSRoutingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: BaseCMSRoutingModule, imports: [RouterModule.forChild(routes), RouterModule] });
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: BaseCMSRoutingModule, decorators: [{
26
26
  type: NgModule,
27
27
  args: [{
28
28
  imports: [RouterModule.forChild(routes)],
@@ -18,14 +18,14 @@ export function CMSConfigFactory() {
18
18
  }
19
19
  export class BaseCMSModule {
20
20
  }
21
- BaseCMSModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: BaseCMSModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
22
- BaseCMSModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.2", ngImport: i0, type: BaseCMSModule, declarations: [BaseCmsComponent], imports: [
21
+ BaseCMSModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: BaseCMSModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
22
+ BaseCMSModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.5", ngImport: i0, type: BaseCMSModule, declarations: [BaseCmsComponent], imports: [
23
23
  // Modules
24
24
  CommonModule,
25
25
  ReactiveFormsModule,
26
26
  BaseCMSRoutingModule,
27
27
  BaseComponentsModule] });
28
- BaseCMSModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: BaseCMSModule, providers: [
28
+ BaseCMSModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: BaseCMSModule, providers: [
29
29
  {
30
30
  provide: BASE_CMS_MODULE_CONFIG,
31
31
  useFactory: CMSConfigFactory,
@@ -36,7 +36,7 @@ BaseCMSModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
36
36
  ReactiveFormsModule,
37
37
  BaseCMSRoutingModule,
38
38
  BaseComponentsModule] });
39
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: BaseCMSModule, decorators: [{
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: BaseCMSModule, decorators: [{
40
40
  type: NgModule,
41
41
  args: [{
42
42
  imports: [
@@ -210,13 +210,13 @@ export class BaseCmsComponent {
210
210
  this.sideBarWidth = window.innerWidth < 768 ? '8%' : '22%';
211
211
  }
212
212
  }
213
- BaseCmsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: BaseCmsComponent, deps: [{ token: BASE_CMS_MODULE_CONFIG }, { token: i1.GraphQLMetaService }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i1.AuthService }, { token: i1.CmsService }], target: i0.ɵɵFactoryTarget.Component });
214
- BaseCmsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: BaseCmsComponent, selector: "app-base-cms", ngImport: i0, template: "<div class=\"main\">\n <div class=\"sidebar\" [ngStyle]=\"{ 'flex-basis': !responsiveToggle ? sideBarWidth : '100%' }\">\n <div class=\"d-none d-md-flex flex-column flex-shrink-0 p-3 h-100\">\n <ng-container *ngIf=\"moduleConfig.branding\">\n <a\n href=\"/\"\n class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none\"\n *ngIf=\"!moduleConfig?.logoUrl\"\n >\n <span class=\"d-block fs-4\"><b class=\"text-primary\">Base</b>CMS</span>\n <small class=\"fw-lighter\">The auto generated GraphQL CMS</small>\n </a>\n\n <a\n href=\"/\"\n class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none w-100\"\n *ngIf=\"moduleConfig?.logoUrl\"\n >\n <img [src]=\"moduleConfig.logoUrl\" class=\"img-responsive w-100\" alt=\"Logo\" />\n </a>\n <hr />\n </ng-container>\n <ul class=\"nav nav-pills flex-column mb-auto\" *ngIf=\"types\">\n <li class=\"nav-item\" *ngFor=\"let type of types\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + toKebabCase(type?.name)\"\n [ngClass]=\"{ active: toKebabCase(type?.name) === toKebabCase(this.modelName) }\"\n >\n {{\n moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n : moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n : type.name + 's'\n }}\n </a>\n </li>\n </ul>\n </div>\n <div class=\"d-flex flex-column d-md-none p-3 h-100\">\n <div class=\"d-flex justify-content-end\">\n <i\n class=\"bi\"\n [ngClass]=\"{ 'bi-chevron-left': !responsiveToggle, 'bi-chevron-right': responsiveToggle }\"\n (click)=\"responsiveToggle = !responsiveToggle\"\n ></i>\n </div>\n <ul\n class=\"nav nav-pills responsive-pills flex-column mb-auto\"\n [ngClass]=\"{ 'w-100-transition': responsiveToggle }\"\n *ngIf=\"types\"\n >\n <li class=\"nav-item\" *ngFor=\"let type of types\" (click)=\"responsiveToggle = !responsiveToggle\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + toKebabCase(type?.name)\"\n [ngClass]=\"{ active: toKebabCase(type?.name) === toKebabCase(this.modelName) }\"\n >\n {{\n moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n : moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n : type.name + 's'\n }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"sidebar-content\" [ngStyle]=\"{ 'flex-basis': !responsiveToggle ? 'unset' : '0' }\">\n <div class=\"p-3 p-md-5 mb-3\">\n <base-model-table\n [modelConfig]=\"moduleConfig?.modelConfig[camelModelName]\"\n [config]=\"moduleConfig?.fieldConfig[camelModelName] || {}\"\n [modelName]=\"modelName\"\n [logging]=\"moduleConfig?.logging\"\n [objectId]=\"id !== 'neu' ? id : ''\"\n [createMode]=\"id === 'neu'\"\n (createModeChanged)=\"onCreateModeChanged($event)\"\n (idSelected)=\"idSelected($event)\"\n [import]=\"isImportPossible()\"\n [export]=\"isExportPossible()\"\n [create]=\"isCreatePossible()\"\n [update]=\"isUpdatePossible()\"\n [delete]=\"isDeletePossible()\"\n [duplicate]=\"isDuplicatePossible()\"\n [showFavButton]=\"!responsiveToggle\"\n ></base-model-table>\n </div>\n </div>\n</div>\n", styles: [".active{color:var(--bs-primary)!important;background-color:rgba(var(--bs-primary-rgb),.2)!important;font-weight:700}.nav-link{color:var(--bs-body-color)}.sidebar{box-shadow:#7090b014 14px 17px 40px 4px;transition:all .2s linear 0s;z-index:99}.main{display:flex;flex-direction:row;overflow:hidden;height:100%}.main .sidebar{flex-grow:1}@media only screen and (min-width: 992px){.main .sidebar{max-width:300px}}.main .sidebar-content{flex-grow:999;overflow-y:auto;background-color:#f5f7fe;min-height:100vh}.nav-flush .nav-link{border-radius:0}.responsive-pills{width:0;text-align:center;overflow:hidden}.w-100-transition{width:100%;transition:width .2s}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i4.ModelTableComponent, selector: "base-model-table", inputs: ["modelName", "objectId", "createMode", "logging", "create", "update", "delete", "import", "export", "duplicate", "modelConfig", "config", "showFavButton"], outputs: ["idSelected", "createModeChanged"] }] });
215
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: BaseCmsComponent, decorators: [{
213
+ BaseCmsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: BaseCmsComponent, deps: [{ token: BASE_CMS_MODULE_CONFIG }, { token: i1.GraphQLMetaService }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i1.AuthService }, { token: i1.CmsService }], target: i0.ɵɵFactoryTarget.Component });
214
+ BaseCmsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.5", type: BaseCmsComponent, selector: "app-base-cms", ngImport: i0, template: "<div class=\"main\">\n <div\n class=\"sidebar\"\n [ngStyle]=\"{\n 'flex-basis': !responsiveToggle ? sideBarWidth : '100%',\n 'min-width': !responsiveToggle ? sideBarWidth : ''\n }\"\n >\n <div class=\"d-none d-md-flex flex-column flex-shrink-0 p-3 h-100\">\n <ng-container *ngIf=\"moduleConfig.branding\">\n <a\n href=\"/\"\n class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none\"\n *ngIf=\"!moduleConfig?.logoUrl\"\n >\n <span class=\"d-block fs-4\"><b class=\"text-primary\">Base</b>CMS</span>\n <small class=\"fw-lighter\">The auto generated GraphQL CMS</small>\n </a>\n\n <a\n href=\"/\"\n class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none w-100\"\n *ngIf=\"moduleConfig?.logoUrl\"\n >\n <img [src]=\"moduleConfig.logoUrl\" class=\"img-responsive w-100\" alt=\"Logo\" />\n </a>\n <hr />\n </ng-container>\n <ul class=\"nav nav-pills flex-column mb-auto\" *ngIf=\"types\">\n <li class=\"nav-item\" *ngFor=\"let type of types\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + toKebabCase(type?.name)\"\n [ngClass]=\"{ active: toKebabCase(type?.name) === toKebabCase(this.modelName) }\"\n >\n {{\n moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n : moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n : type.name + 's'\n }}\n </a>\n </li>\n </ul>\n </div>\n <div class=\"d-flex flex-column d-md-none p-3 h-100\">\n <div class=\"d-flex justify-content-end\">\n <i\n class=\"bi\"\n [ngClass]=\"{ 'bi-chevron-left': !responsiveToggle, 'bi-chevron-right': responsiveToggle }\"\n (click)=\"responsiveToggle = !responsiveToggle\"\n ></i>\n </div>\n <ul\n class=\"nav nav-pills responsive-pills flex-column mb-auto\"\n [ngClass]=\"{ 'w-100-transition': responsiveToggle }\"\n *ngIf=\"types\"\n >\n <li class=\"nav-item\" *ngFor=\"let type of types\" (click)=\"responsiveToggle = !responsiveToggle\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + toKebabCase(type?.name)\"\n [ngClass]=\"{ active: toKebabCase(type?.name) === toKebabCase(this.modelName) }\"\n >\n {{\n moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n : moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n : type.name + 's'\n }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"sidebar-content\" [ngStyle]=\"{ 'flex-basis': !responsiveToggle ? 'unset' : '0' }\">\n <div class=\"p-3 p-md-5 mb-3\">\n <base-model-table\n [modelConfig]=\"moduleConfig?.modelConfig[camelModelName]\"\n [config]=\"moduleConfig?.fieldConfig[camelModelName] || {}\"\n [modelName]=\"modelName\"\n [logging]=\"moduleConfig?.logging\"\n [objectId]=\"id !== 'neu' ? id : ''\"\n [createMode]=\"id === 'neu'\"\n (createModeChanged)=\"onCreateModeChanged($event)\"\n (idSelected)=\"idSelected($event)\"\n [import]=\"isImportPossible()\"\n [export]=\"isExportPossible()\"\n [create]=\"isCreatePossible()\"\n [update]=\"isUpdatePossible()\"\n [delete]=\"isDeletePossible()\"\n [duplicate]=\"isDuplicatePossible()\"\n [showFavButton]=\"!responsiveToggle\"\n ></base-model-table>\n </div>\n </div>\n</div>\n", styles: [".active{color:var(--bs-primary)!important;background-color:rgba(var(--bs-primary-rgb),.2)!important;font-weight:700}.nav-link{color:var(--bs-body-color)}.sidebar{box-shadow:#7090b014 14px 17px 40px 4px;transition:all .2s linear 0s;z-index:99}.main{display:flex;flex-direction:row;overflow:hidden;height:100%}.main .sidebar{flex-grow:1}@media only screen and (min-width: 992px){.main .sidebar{max-width:300px}}.main .sidebar-content{flex-grow:999;overflow-y:auto;background-color:#f5f7fe;min-height:100vh}.nav-flush .nav-link{border-radius:0}.responsive-pills{width:0;text-align:center;overflow:hidden}.w-100-transition{width:100%;transition:width .2s}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i4.ModelTableComponent, selector: "base-model-table", inputs: ["modelName", "objectId", "createMode", "logging", "create", "update", "delete", "import", "export", "duplicate", "modelConfig", "config", "showFavButton"], outputs: ["idSelected", "createModeChanged"] }] });
215
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: BaseCmsComponent, decorators: [{
216
216
  type: Component,
217
- args: [{ selector: 'app-base-cms', template: "<div class=\"main\">\n <div class=\"sidebar\" [ngStyle]=\"{ 'flex-basis': !responsiveToggle ? sideBarWidth : '100%' }\">\n <div class=\"d-none d-md-flex flex-column flex-shrink-0 p-3 h-100\">\n <ng-container *ngIf=\"moduleConfig.branding\">\n <a\n href=\"/\"\n class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none\"\n *ngIf=\"!moduleConfig?.logoUrl\"\n >\n <span class=\"d-block fs-4\"><b class=\"text-primary\">Base</b>CMS</span>\n <small class=\"fw-lighter\">The auto generated GraphQL CMS</small>\n </a>\n\n <a\n href=\"/\"\n class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none w-100\"\n *ngIf=\"moduleConfig?.logoUrl\"\n >\n <img [src]=\"moduleConfig.logoUrl\" class=\"img-responsive w-100\" alt=\"Logo\" />\n </a>\n <hr />\n </ng-container>\n <ul class=\"nav nav-pills flex-column mb-auto\" *ngIf=\"types\">\n <li class=\"nav-item\" *ngFor=\"let type of types\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + toKebabCase(type?.name)\"\n [ngClass]=\"{ active: toKebabCase(type?.name) === toKebabCase(this.modelName) }\"\n >\n {{\n moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n : moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n : type.name + 's'\n }}\n </a>\n </li>\n </ul>\n </div>\n <div class=\"d-flex flex-column d-md-none p-3 h-100\">\n <div class=\"d-flex justify-content-end\">\n <i\n class=\"bi\"\n [ngClass]=\"{ 'bi-chevron-left': !responsiveToggle, 'bi-chevron-right': responsiveToggle }\"\n (click)=\"responsiveToggle = !responsiveToggle\"\n ></i>\n </div>\n <ul\n class=\"nav nav-pills responsive-pills flex-column mb-auto\"\n [ngClass]=\"{ 'w-100-transition': responsiveToggle }\"\n *ngIf=\"types\"\n >\n <li class=\"nav-item\" *ngFor=\"let type of types\" (click)=\"responsiveToggle = !responsiveToggle\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + toKebabCase(type?.name)\"\n [ngClass]=\"{ active: toKebabCase(type?.name) === toKebabCase(this.modelName) }\"\n >\n {{\n moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n : moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n : type.name + 's'\n }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"sidebar-content\" [ngStyle]=\"{ 'flex-basis': !responsiveToggle ? 'unset' : '0' }\">\n <div class=\"p-3 p-md-5 mb-3\">\n <base-model-table\n [modelConfig]=\"moduleConfig?.modelConfig[camelModelName]\"\n [config]=\"moduleConfig?.fieldConfig[camelModelName] || {}\"\n [modelName]=\"modelName\"\n [logging]=\"moduleConfig?.logging\"\n [objectId]=\"id !== 'neu' ? id : ''\"\n [createMode]=\"id === 'neu'\"\n (createModeChanged)=\"onCreateModeChanged($event)\"\n (idSelected)=\"idSelected($event)\"\n [import]=\"isImportPossible()\"\n [export]=\"isExportPossible()\"\n [create]=\"isCreatePossible()\"\n [update]=\"isUpdatePossible()\"\n [delete]=\"isDeletePossible()\"\n [duplicate]=\"isDuplicatePossible()\"\n [showFavButton]=\"!responsiveToggle\"\n ></base-model-table>\n </div>\n </div>\n</div>\n", styles: [".active{color:var(--bs-primary)!important;background-color:rgba(var(--bs-primary-rgb),.2)!important;font-weight:700}.nav-link{color:var(--bs-body-color)}.sidebar{box-shadow:#7090b014 14px 17px 40px 4px;transition:all .2s linear 0s;z-index:99}.main{display:flex;flex-direction:row;overflow:hidden;height:100%}.main .sidebar{flex-grow:1}@media only screen and (min-width: 992px){.main .sidebar{max-width:300px}}.main .sidebar-content{flex-grow:999;overflow-y:auto;background-color:#f5f7fe;min-height:100vh}.nav-flush .nav-link{border-radius:0}.responsive-pills{width:0;text-align:center;overflow:hidden}.w-100-transition{width:100%;transition:width .2s}\n"] }]
217
+ args: [{ selector: 'app-base-cms', template: "<div class=\"main\">\n <div\n class=\"sidebar\"\n [ngStyle]=\"{\n 'flex-basis': !responsiveToggle ? sideBarWidth : '100%',\n 'min-width': !responsiveToggle ? sideBarWidth : ''\n }\"\n >\n <div class=\"d-none d-md-flex flex-column flex-shrink-0 p-3 h-100\">\n <ng-container *ngIf=\"moduleConfig.branding\">\n <a\n href=\"/\"\n class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none\"\n *ngIf=\"!moduleConfig?.logoUrl\"\n >\n <span class=\"d-block fs-4\"><b class=\"text-primary\">Base</b>CMS</span>\n <small class=\"fw-lighter\">The auto generated GraphQL CMS</small>\n </a>\n\n <a\n href=\"/\"\n class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none w-100\"\n *ngIf=\"moduleConfig?.logoUrl\"\n >\n <img [src]=\"moduleConfig.logoUrl\" class=\"img-responsive w-100\" alt=\"Logo\" />\n </a>\n <hr />\n </ng-container>\n <ul class=\"nav nav-pills flex-column mb-auto\" *ngIf=\"types\">\n <li class=\"nav-item\" *ngFor=\"let type of types\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + toKebabCase(type?.name)\"\n [ngClass]=\"{ active: toKebabCase(type?.name) === toKebabCase(this.modelName) }\"\n >\n {{\n moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n : moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n : type.name + 's'\n }}\n </a>\n </li>\n </ul>\n </div>\n <div class=\"d-flex flex-column d-md-none p-3 h-100\">\n <div class=\"d-flex justify-content-end\">\n <i\n class=\"bi\"\n [ngClass]=\"{ 'bi-chevron-left': !responsiveToggle, 'bi-chevron-right': responsiveToggle }\"\n (click)=\"responsiveToggle = !responsiveToggle\"\n ></i>\n </div>\n <ul\n class=\"nav nav-pills responsive-pills flex-column mb-auto\"\n [ngClass]=\"{ 'w-100-transition': responsiveToggle }\"\n *ngIf=\"types\"\n >\n <li class=\"nav-item\" *ngFor=\"let type of types\" (click)=\"responsiveToggle = !responsiveToggle\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + toKebabCase(type?.name)\"\n [ngClass]=\"{ active: toKebabCase(type?.name) === toKebabCase(this.modelName) }\"\n >\n {{\n moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.plural\n : moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n ? moduleConfig?.modelConfig[lowerCaseFirstLetter(type?.name)]?.label\n : type.name + 's'\n }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"sidebar-content\" [ngStyle]=\"{ 'flex-basis': !responsiveToggle ? 'unset' : '0' }\">\n <div class=\"p-3 p-md-5 mb-3\">\n <base-model-table\n [modelConfig]=\"moduleConfig?.modelConfig[camelModelName]\"\n [config]=\"moduleConfig?.fieldConfig[camelModelName] || {}\"\n [modelName]=\"modelName\"\n [logging]=\"moduleConfig?.logging\"\n [objectId]=\"id !== 'neu' ? id : ''\"\n [createMode]=\"id === 'neu'\"\n (createModeChanged)=\"onCreateModeChanged($event)\"\n (idSelected)=\"idSelected($event)\"\n [import]=\"isImportPossible()\"\n [export]=\"isExportPossible()\"\n [create]=\"isCreatePossible()\"\n [update]=\"isUpdatePossible()\"\n [delete]=\"isDeletePossible()\"\n [duplicate]=\"isDuplicatePossible()\"\n [showFavButton]=\"!responsiveToggle\"\n ></base-model-table>\n </div>\n </div>\n</div>\n", styles: [".active{color:var(--bs-primary)!important;background-color:rgba(var(--bs-primary-rgb),.2)!important;font-weight:700}.nav-link{color:var(--bs-body-color)}.sidebar{box-shadow:#7090b014 14px 17px 40px 4px;transition:all .2s linear 0s;z-index:99}.main{display:flex;flex-direction:row;overflow:hidden;height:100%}.main .sidebar{flex-grow:1}@media only screen and (min-width: 992px){.main .sidebar{max-width:300px}}.main .sidebar-content{flex-grow:999;overflow-y:auto;background-color:#f5f7fe;min-height:100vh}.nav-flush .nav-link{border-radius:0}.responsive-pills{width:0;text-align:center;overflow:hidden}.w-100-transition{width:100%;transition:width .2s}\n"] }]
218
218
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
219
219
  type: Inject,
220
220
  args: [BASE_CMS_MODULE_CONFIG]
221
221
  }] }, { type: i1.GraphQLMetaService }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i1.AuthService }, { type: i1.CmsService }]; } });
222
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNtcy9wYWdlcy9iYXNlLWNtcy9iYXNlLWNtcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY21zL3BhZ2VzL2Jhc2UtY21zL2Jhc2UtY21zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBRUwsU0FBUyxHQUtWLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLG1EQUFtRCxDQUFDO0FBQ2hILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQU9wQyxNQUFNLE9BQU8sZ0JBQWdCO0lBVTNCLFlBQ3lDLFlBQWlDLEVBQ2hFLGtCQUFzQyxFQUN0QyxLQUFxQixFQUNyQixNQUFjLEVBQ2QsV0FBd0IsRUFDeEIsVUFBc0I7UUFMUyxpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDaEUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQVhoQyxVQUFLLEdBQXNCLEVBQUUsQ0FBQztRQUM5QixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBVXZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUNu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SyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0IsQ0FBQyxLQUFhO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3RCxDQUFDOzs2R0EvT1UsZ0JBQWdCLGtCQVdqQixzQkFBc0I7aUdBWHJCLGdCQUFnQixvRENsQjdCLDRqSUFnR0E7MkZEOUVhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxjQUFjOzswQkFlckIsTUFBTTsyQkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEF1dGhTZXJ2aWNlLFxuICBCYXNpY1VzZXIsXG4gIENtc1NlcnZpY2UsXG4gIEdyYXBocWxDcnVkVHlwZSxcbiAgR3JhcGhRTE1ldGEsXG4gIEdyYXBoUUxNZXRhU2VydmljZSxcbn0gZnJvbSAnQGxlbm5lLnRlY2gvbmctYmFzZS9zaGFyZWQnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCQVNFX0NNU19NT0RVTEVfQ09ORklHLCBCYXNlQ01TTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9iYXNlLWNtcy1tb2R1bGUtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWJhc2UtY21zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2UtY21zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFzZS1jbXMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQmFzZUNtc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgbWV0YTogR3JhcGhRTE1ldGE7XG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBjYW1lbE1vZGVsTmFtZTogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xuICB0eXBlczogR3JhcGhxbENydWRUeXBlW10gPSBbXTtcbiAgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBzaWRlQmFyV2lkdGggPSAnMjIlJztcbiAgcmVzcG9uc2l2ZVRvZ2dsZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoQkFTRV9DTVNfTU9EVUxFX0NPTkZJRykgcHVibGljIG1vZHVsZUNvbmZpZzogQmFzZUNNU01vZHVsZUNvbmZpZyxcbiAgICBwcml2YXRlIGdyYXBoUUxNZXRhU2VydmljZTogR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjbXNTZXJ2aWNlOiBDbXNTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuY2FsY1NpZGVCYXJXaWR0aCgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlWydtb2RlbE5hbWUnXSkge1xuICAgICAgICAgIGNvbnN0IGV4Y2x1ZGUgPSB0aGlzLm1vZHVsZUNvbmZpZy5tb2RlbENvbmZpZ1t2YWx1ZVsnbW9kZWxOYW1lJ11dPy5leGNsdWRlO1xuXG4gICAgICAgICAgaWYgKGV4Y2x1ZGUgIT09IG51bGwgJiYgIWV4Y2x1ZGUpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWxOYW1lID0gdmFsdWVbJ21vZGVsTmFtZSddO1xuICAgICAgICAgICAgdGhpcy5jYW1lbE1vZGVsTmFtZSA9IHRoaXMudG9DYW1lbENhc2UodGhpcy5tb2RlbE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXQoKS50aGVuKCh0eXBlczogR3JhcGhxbENydWRUeXBlW10pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLi8nICsgdGhpcy50b0tlYmFiQ2FzZSh0eXBlc1swXS5uYW1lKV0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZVsnaWQnXSkge1xuICAgICAgICAgIHRoaXMuaWQgPSB2YWx1ZVsnaWQnXTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgR3JhcGhxbENydWRUeXBlIG9iamVjdHNcbiAgICpcbiAgICogQHJldHVybnMgVGhlIHR5cGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgdXNlci5cbiAgICovXG4gIGluaXQoKTogUHJvbWlzZTxHcmFwaHFsQ3J1ZFR5cGVbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdyYXBoUUxNZXRhU2VydmljZS5nZXRNZXRhKCkuc3Vic2NyaWJlKChtZXRhKSA9PiB7XG4gICAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgICAgaWYgKHRoaXMucm91dGUuc25hcHNob3Q/LnBhcmFtcz8uWydtb2RlbE5hbWUnXSkge1xuICAgICAgICAgIHRoaXMubW9kZWxOYW1lID0gdGhpcy5yb3V0ZS5zbmFwc2hvdD8ucGFyYW1zPy5bJ21vZGVsTmFtZSddO1xuICAgICAgICAgIHRoaXMuY2FtZWxNb2RlbE5hbWUgPSB0aGlzLnRvQ2FtZWxDYXNlKHRoaXMubW9kZWxOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90Py5wYXJhbXM/LlsnaWQnXSkge1xuICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90Py5wYXJhbXM/LlsnaWQnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHR5cGVzID0gbWV0YS5nZXRUeXBlcyh0aGlzLm1vZHVsZUNvbmZpZz8ubG9nZ2luZyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGV4Y2x1ZGVkIHR5cGVzXG4gICAgICAgIGxldCBmaWx0ZXJlZFR5cGVzID0gdHlwZXMuZmlsdGVyKChlKSA9PiAhdGhpcy5tb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW2UubmFtZS50b0xvd2VyQ2FzZSgpXT8uZXhjbHVkZSk7XG5cbiAgICAgICAgLy8gU29ydCB0eXBlc1xuICAgICAgICBmaWx0ZXJlZFR5cGVzID0gZmlsdGVyZWRUeXBlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0aGlzLm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbYS5uYW1lLnRvTG93ZXJDYXNlKCldPy5vcmRlclxuICAgICAgICAgICAgICA/IHRoaXMubW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1thLm5hbWUudG9Mb3dlckNhc2UoKV0/Lm9yZGVyXG4gICAgICAgICAgICAgIDogOTkpIC1cbiAgICAgICAgICAgICh0aGlzLm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbYi5uYW1lLnRvTG93ZXJDYXNlKCldPy5vcmRlclxuICAgICAgICAgICAgICA/IHRoaXMubW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tiLm5hbWUudG9Mb3dlckNhc2UoKV0/Lm9yZGVyXG4gICAgICAgICAgICAgIDogOTkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIHJlc3RyaWN0ZWQgdHlwZXNcbiAgICAgICAgdGhpcy50eXBlcyA9IGZpbHRlcmVkVHlwZXMuZmlsdGVyKChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tlLm5hbWUudG9Mb3dlckNhc2UoKV0/LnJlc3RyaWN0ZWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZT8uY3VycmVudFVzZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuYXV0aFNlcnZpY2U/LmN1cnJlbnRVc2VyO1xuICAgICAgICAgICAgY29uc3QgbWFwcGVkVXNlciA9IEJhc2ljVXNlci5tYXAodXNlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBtYXBwZWRVc2VyPy5oYXNBbGxSb2xlcyh0aGlzLm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbZS5uYW1lLnRvTG93ZXJDYXNlKCldPy5yb2xlcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9kdWxlQ29uZmlnPy5sb2dnaW5nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Jhc2VDbXNDb21wb25lbnQ6OmluaXQtPnR5cGVzJywgdGhpcy50eXBlcyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Jhc2VDbXNDb21wb25lbnQ6OmluaXQtPmNhbWVsTW9kZWxOYW1lJywgdGhpcy5jYW1lbE1vZGVsTmFtZSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Jhc2VDbXNDb21wb25lbnQ6OmluaXQtPmZpZWxkQ29uZmlnJywgdGhpcy5tb2R1bGVDb25maWc/LmZpZWxkQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUodGhpcy50eXBlcyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsTmFtZSAmJiB0aGlzLnR5cGVzKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLycgKyB0aGlzLnRvS2ViYWJDYXNlKHRoaXMudHlwZXNbMF0ubmFtZSldLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBtb2RlbCBuYW1lIGlzIHNldCBhbmQgdGhlIHR5cGVzIGFyZSBzZXQsIHRoZW4gcmV0dXJuIHRoZSB0eXBlIHRoYXQgbWF0Y2hlcyB0aGUgbW9kZWwgbmFtZVxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHlwZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBtb2RlbCBuYW1lLlxuICAgKi9cbiAgZ2V0VHlwZUJ5TW9kZWxOYW1lKCkge1xuICAgIGlmICh0aGlzLm1vZGVsTmFtZSAmJiB0aGlzLnR5cGVzKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlcy5maW5kKChlKSA9PiB0aGlzLnRvS2ViYWJDYXNlKGUubmFtZSkgPT09IHRoaXMudG9LZWJhYkNhc2UodGhpcy5tb2RlbE5hbWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIGNyZWF0ZU1vZGVDaGFuZ2VkIGV2ZW50IGlzIGVtaXR0ZWQsIGlmIHRoZSBjcmVhdGVNb2RlIGlzIHRydWUsIG5hdmlnYXRlIHRvIHRoZSBuZXcgcm91dGVcbiAgICpcbiAgICogQHBhcmFtIGNyZWF0ZU1vZGUgLSBib29sZWFuIC0gVGhpcyBpcyBhIGJvb2xlYW4gdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpcyBpbiBjcmVhdGUgbW9kZSBvclxuICAgKiBub3QuXG4gICAqL1xuICBvbkNyZWF0ZU1vZGVDaGFuZ2VkKGNyZWF0ZU1vZGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoY3JlYXRlTW9kZSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLycgKyAnbmV1J10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHR5cGUgZXhpc3RzLCByZXR1cm4gdGhlIGNyZWF0ZSBwcm9wZXJ0eSBvZiB0aGUgdHlwZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBib29sZWFuIHZhbHVlLlxuICAgKi9cbiAgaXNDcmVhdGVQb3NzaWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5nZXRUeXBlQnlNb2RlbE5hbWUoKTtcbiAgICByZXR1cm4gdHlwZSA/IHR5cGUuY3JlYXRlIDogZmFsc2U7XG4gIH1cblxuICBpc0ltcG9ydFBvc3NpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbdGhpcy5jYW1lbE1vZGVsTmFtZV0/LmltcG9ydDtcblxuICAgIGlmIChjb25maWcgIT09IG51bGwgJiYgY29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdCA9IGNvbmZpZztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaXNFeHBvcnRQb3NzaWJsZSgpOiBib29sZWFuIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5tb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW3RoaXMuY2FtZWxNb2RlbE5hbWVdPy5leHBvcnQ7XG5cbiAgICBpZiAoY29uZmlnICE9PSBudWxsICYmIGNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSBjb25maWc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgbW9kZWwgbmFtZSBpcyBmb3VuZCBpbiB0aGUgdHlwZSBtYXAsIHJldHVybiB0aGUgdXBkYXRlIHByb3BlcnR5IG9mIHRoZSB0eXBlIG9iamVjdFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gdmFsdWUuXG4gICAqL1xuICBpc1VwZGF0ZVBvc3NpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmdldFR5cGVCeU1vZGVsTmFtZSgpO1xuICAgIHJldHVybiB0eXBlID8gdHlwZS51cGRhdGUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgdHlwZSBpcyBkZWZpbmVkLCByZXR1cm4gdGhlIGRlbGV0ZSBwcm9wZXJ0eSBvZiB0aGUgdHlwZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZVxuICAgKlxuICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gdmFsdWUuXG4gICAqL1xuICBpc0RlbGV0ZVBvc3NpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmdldFR5cGVCeU1vZGVsTmFtZSgpO1xuICAgIHJldHVybiB0eXBlID8gdHlwZS5kZWxldGUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgbW9kZWwgbmFtZSBpcyBmb3VuZCBpbiB0aGUgdHlwZSBhcnJheSwgcmV0dXJuIHRoZSBkdXBsaWNhdGUgcHJvcGVydHkgb2YgdGhlIHR5cGUgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiB2YWx1ZS5cbiAgICovXG4gIGlzRHVwbGljYXRlUG9zc2libGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZUJ5TW9kZWxOYW1lKCk7XG4gICAgcmV0dXJuIHR5cGUgPyB0eXBlLmR1cGxpY2F0ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBpZCBpcyB0cnV0aHksIG5hdmlnYXRlIHRvIHRoZSBpZCwgb3RoZXJ3aXNlIG5hdmlnYXRlIHRvIHRoZSBwYXJlbnQgcm91dGVcbiAgICovXG4gIGlkU2VsZWN0ZWQoaWQ6IHN0cmluZykge1xuICAgIGlmIChpZCkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLycgKyBpZF0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLiddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBzdHJpbmcgdG8ga2ViYWIgY2FzZVxuICAgKi9cbiAgdG9LZWJhYkNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyPy5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBzdHJpbmcgdG8gY2FtZWwgY2FzZVxuICAgKi9cbiAgdG9DYW1lbENhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyPy5yZXBsYWNlKC8tLi9nLCAobWF0Y2gpID0+IG1hdGNoWzFdLnRvVXBwZXJDYXNlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBmaXJzdCBsZXR0ZXIgdG8gbG93ZXIgY2FzZVxuICAgKi9cbiAgbG93ZXJDYXNlRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNtc1NlcnZpY2UubG93ZXJDYXNlRmlyc3RMZXR0ZXIodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgc2lkZWJhciB3aWR0aCBiYXNlZCBvbiBzY3JlZW4gc2l6ZVxuICAgKi9cbiAgY2FsY1NpZGVCYXJXaWR0aCgpIHtcbiAgICB0aGlzLnNpZGVCYXJXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNzY4ID8gJzglJyA6ICcyMiUnO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibWFpblwiPlxuICA8ZGl2IGNsYXNzPVwic2lkZWJhclwiIFtuZ1N0eWxlXT1cInsgJ2ZsZXgtYmFzaXMnOiAhcmVzcG9uc2l2ZVRvZ2dsZSA/IHNpZGVCYXJXaWR0aCA6ICcxMDAlJyB9XCI+XG4gICAgPGRpdiBjbGFzcz1cImQtbm9uZSBkLW1kLWZsZXggZmxleC1jb2x1bW4gZmxleC1zaHJpbmstMCBwLTMgaC0xMDBcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2R1bGVDb25maWcuYnJhbmRpbmdcIj5cbiAgICAgICAgPGFcbiAgICAgICAgICBocmVmPVwiL1wiXG4gICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtc3RhcnQgbWItMyBtdC0zIG1lLW1kLWF1dG8gbGluay1kYXJrIHRleHQtZGVjb3JhdGlvbi1ub25lXCJcbiAgICAgICAgICAqbmdJZj1cIiFtb2R1bGVDb25maWc/LmxvZ29VcmxcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWJsb2NrIGZzLTRcIj48YiBjbGFzcz1cInRleHQtcHJpbWFyeVwiPkJhc2U8L2I+Q01TPC9zcGFuPlxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImZ3LWxpZ2h0ZXJcIj5UaGUgYXV0byBnZW5lcmF0ZWQgR3JhcGhRTCBDTVM8L3NtYWxsPlxuICAgICAgICA8L2E+XG5cbiAgICAgICAgPGFcbiAgICAgICAgICBocmVmPVwiL1wiXG4gICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtc3RhcnQgbWItMyBtdC0zIG1lLW1kLWF1dG8gbGluay1kYXJrIHRleHQtZGVjb3JhdGlvbi1ub25lIHctMTAwXCJcbiAgICAgICAgICAqbmdJZj1cIm1vZHVsZUNvbmZpZz8ubG9nb1VybFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW1nIFtzcmNdPVwibW9kdWxlQ29uZmlnLmxvZ29VcmxcIiBjbGFzcz1cImltZy1yZXNwb25zaXZlIHctMTAwXCIgYWx0PVwiTG9nb1wiIC8+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPGhyIC8+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXYtcGlsbHMgZmxleC1jb2x1bW4gbWItYXV0b1wiICpuZ0lmPVwidHlwZXNcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIiAqbmdGb3I9XCJsZXQgdHlwZSBvZiB0eXBlc1wiPlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rXCJcbiAgICAgICAgICAgIGFyaWEtY3VycmVudD1cInBhZ2VcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiKGlkID8gJy4uLy4uLycgOiAnLi4vJykgKyB0b0tlYmFiQ2FzZSh0eXBlPy5uYW1lKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogdG9LZWJhYkNhc2UodHlwZT8ubmFtZSkgPT09IHRvS2ViYWJDYXNlKHRoaXMubW9kZWxOYW1lKSB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICBtb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW2xvd2VyQ2FzZUZpcnN0TGV0dGVyKHR5cGU/Lm5hbWUpXT8ucGx1cmFsXG4gICAgICAgICAgICAgICAgPyBtb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW2xvd2VyQ2FzZUZpcnN0TGV0dGVyKHR5cGU/Lm5hbWUpXT8ucGx1cmFsXG4gICAgICAgICAgICAgICAgOiBtb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW2xvd2VyQ2FzZUZpcnN0TGV0dGVyKHR5cGU/Lm5hbWUpXT8ubGFiZWxcbiAgICAgICAgICAgICAgICA/IG1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbbG93ZXJDYXNlRmlyc3RMZXR0ZXIodHlwZT8ubmFtZSldPy5sYWJlbFxuICAgICAgICAgICAgICAgIDogdHlwZS5uYW1lICsgJ3MnXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBkLW1kLW5vbmUgcC0zIGgtMTAwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgPGlcbiAgICAgICAgICBjbGFzcz1cImJpXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7ICdiaS1jaGV2cm9uLWxlZnQnOiAhcmVzcG9uc2l2ZVRvZ2dsZSwgJ2JpLWNoZXZyb24tcmlnaHQnOiByZXNwb25zaXZlVG9nZ2xlIH1cIlxuICAgICAgICAgIChjbGljayk9XCJyZXNwb25zaXZlVG9nZ2xlID0gIXJlc3BvbnNpdmVUb2dnbGVcIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8dWxcbiAgICAgICAgY2xhc3M9XCJuYXYgbmF2LXBpbGxzIHJlc3BvbnNpdmUtcGlsbHMgZmxleC1jb2x1bW4gbWItYXV0b1wiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ3ctMTAwLXRyYW5zaXRpb24nOiByZXNwb25zaXZlVG9nZ2xlIH1cIlxuICAgICAgICAqbmdJZj1cInR5cGVzXCJcbiAgICAgID5cbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIiAqbmdGb3I9XCJsZXQgdHlwZSBvZiB0eXBlc1wiIChjbGljayk9XCJyZXNwb25zaXZlVG9nZ2xlID0gIXJlc3BvbnNpdmVUb2dnbGVcIj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGlua1wiXG4gICAgICAgICAgICBhcmlhLWN1cnJlbnQ9XCJwYWdlXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIihpZCA/ICcuLi8uLi8nIDogJy4uLycpICsgdG9LZWJhYkNhc2UodHlwZT8ubmFtZSlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHRvS2ViYWJDYXNlKHR5cGU/Lm5hbWUpID09PSB0b0tlYmFiQ2FzZSh0aGlzLm1vZGVsTmFtZSkgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgbW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tsb3dlckNhc2VGaXJzdExldHRlcih0eXBlPy5uYW1lKV0/LnBsdXJhbFxuICAgICAgICAgICAgICAgID8gbW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tsb3dlckNhc2VGaXJzdExldHRlcih0eXBlPy5uYW1lKV0/LnBsdXJhbFxuICAgICAgICAgICAgICAgIDogbW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tsb3dlckNhc2VGaXJzdExldHRlcih0eXBlPy5uYW1lKV0/LmxhYmVsXG4gICAgICAgICAgICAgICAgPyBtb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW2xvd2VyQ2FzZUZpcnN0TGV0dGVyKHR5cGU/Lm5hbWUpXT8ubGFiZWxcbiAgICAgICAgICAgICAgICA6IHR5cGUubmFtZSArICdzJ1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic2lkZWJhci1jb250ZW50XCIgW25nU3R5bGVdPVwieyAnZmxleC1iYXNpcyc6ICFyZXNwb25zaXZlVG9nZ2xlID8gJ3Vuc2V0JyA6ICcwJyB9XCI+XG4gICAgPGRpdiBjbGFzcz1cInAtMyBwLW1kLTUgbWItM1wiPlxuICAgICAgPGJhc2UtbW9kZWwtdGFibGVcbiAgICAgICAgW21vZGVsQ29uZmlnXT1cIm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbY2FtZWxNb2RlbE5hbWVdXCJcbiAgICAgICAgW2NvbmZpZ109XCJtb2R1bGVDb25maWc/LmZpZWxkQ29uZmlnW2NhbWVsTW9kZWxOYW1lXSB8fCB7fVwiXG4gICAgICAgIFttb2RlbE5hbWVdPVwibW9kZWxOYW1lXCJcbiAgICAgICAgW2xvZ2dpbmddPVwibW9kdWxlQ29uZmlnPy5sb2dnaW5nXCJcbiAgICAgICAgW29iamVjdElkXT1cImlkICE9PSAnbmV1JyA/IGlkIDogJydcIlxuICAgICAgICBbY3JlYXRlTW9kZV09XCJpZCA9PT0gJ25ldSdcIlxuICAgICAgICAoY3JlYXRlTW9kZUNoYW5nZWQpPVwib25DcmVhdGVNb2RlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgKGlkU2VsZWN0ZWQpPVwiaWRTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgW2ltcG9ydF09XCJpc0ltcG9ydFBvc3NpYmxlKClcIlxuICAgICAgICBbZXhwb3J0XT1cImlzRXhwb3J0UG9zc2libGUoKVwiXG4gICAgICAgIFtjcmVhdGVdPVwiaXNDcmVhdGVQb3NzaWJsZSgpXCJcbiAgICAgICAgW3VwZGF0ZV09XCJpc1VwZGF0ZVBvc3NpYmxlKClcIlxuICAgICAgICBbZGVsZXRlXT1cImlzRGVsZXRlUG9zc2libGUoKVwiXG4gICAgICAgIFtkdXBsaWNhdGVdPVwiaXNEdXBsaWNhdGVQb3NzaWJsZSgpXCJcbiAgICAgICAgW3Nob3dGYXZCdXR0b25dPVwiIXJlc3BvbnNpdmVUb2dnbGVcIlxuICAgICAgPjwvYmFzZS1tb2RlbC10YWJsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNtcy9wYWdlcy9iYXNlLWNtcy9iYXNlLWNtcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY21zL3BhZ2VzL2Jhc2UtY21zL2Jhc2UtY21zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBRUwsU0FBUyxHQUtWLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLG1EQUFtRCxDQUFDO0FBQ2hILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQU9wQyxNQUFNLE9BQU8sZ0JBQWdCO0lBVTNCLFlBQ3lDLFlBQWlDLEVBQ2hFLGtCQUFzQyxFQUN0QyxLQUFxQixFQUNyQixNQUFjLEVBQ2QsV0FBd0IsRUFDeEIsVUFBc0I7UUFMUyxpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDaEUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQVhoQyxVQUFLLEdBQXNCLEVBQUUsQ0FBQztRQUM5QixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBVXZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUNu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SyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0IsQ0FBQyxLQUFhO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3RCxDQUFDOzs2R0EvT1UsZ0JBQWdCLGtCQVdqQixzQkFBc0I7aUdBWHJCLGdCQUFnQixvRENsQjdCLGlwSUFzR0E7MkZEcEZhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxjQUFjOzswQkFlckIsTUFBTTsyQkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEF1dGhTZXJ2aWNlLFxuICBCYXNpY1VzZXIsXG4gIENtc1NlcnZpY2UsXG4gIEdyYXBocWxDcnVkVHlwZSxcbiAgR3JhcGhRTE1ldGEsXG4gIEdyYXBoUUxNZXRhU2VydmljZSxcbn0gZnJvbSAnQGxlbm5lLnRlY2gvbmctYmFzZS9zaGFyZWQnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCQVNFX0NNU19NT0RVTEVfQ09ORklHLCBCYXNlQ01TTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9iYXNlLWNtcy1tb2R1bGUtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWJhc2UtY21zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2UtY21zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFzZS1jbXMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQmFzZUNtc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgbWV0YTogR3JhcGhRTE1ldGE7XG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBjYW1lbE1vZGVsTmFtZTogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xuICB0eXBlczogR3JhcGhxbENydWRUeXBlW10gPSBbXTtcbiAgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBzaWRlQmFyV2lkdGggPSAnMjIlJztcbiAgcmVzcG9uc2l2ZVRvZ2dsZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoQkFTRV9DTVNfTU9EVUxFX0NPTkZJRykgcHVibGljIG1vZHVsZUNvbmZpZzogQmFzZUNNU01vZHVsZUNvbmZpZyxcbiAgICBwcml2YXRlIGdyYXBoUUxNZXRhU2VydmljZTogR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjbXNTZXJ2aWNlOiBDbXNTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuY2FsY1NpZGVCYXJXaWR0aCgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlWydtb2RlbE5hbWUnXSkge1xuICAgICAgICAgIGNvbnN0IGV4Y2x1ZGUgPSB0aGlzLm1vZHVsZUNvbmZpZy5tb2RlbENvbmZpZ1t2YWx1ZVsnbW9kZWxOYW1lJ11dPy5leGNsdWRlO1xuXG4gICAgICAgICAgaWYgKGV4Y2x1ZGUgIT09IG51bGwgJiYgIWV4Y2x1ZGUpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWxOYW1lID0gdmFsdWVbJ21vZGVsTmFtZSddO1xuICAgICAgICAgICAgdGhpcy5jYW1lbE1vZGVsTmFtZSA9IHRoaXMudG9DYW1lbENhc2UodGhpcy5tb2RlbE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXQoKS50aGVuKCh0eXBlczogR3JhcGhxbENydWRUeXBlW10pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLi8nICsgdGhpcy50b0tlYmFiQ2FzZSh0eXBlc1swXS5uYW1lKV0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZVsnaWQnXSkge1xuICAgICAgICAgIHRoaXMuaWQgPSB2YWx1ZVsnaWQnXTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgR3JhcGhxbENydWRUeXBlIG9iamVjdHNcbiAgICpcbiAgICogQHJldHVybnMgVGhlIHR5cGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgdXNlci5cbiAgICovXG4gIGluaXQoKTogUHJvbWlzZTxHcmFwaHFsQ3J1ZFR5cGVbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdyYXBoUUxNZXRhU2VydmljZS5nZXRNZXRhKCkuc3Vic2NyaWJlKChtZXRhKSA9PiB7XG4gICAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgICAgaWYgKHRoaXMucm91dGUuc25hcHNob3Q/LnBhcmFtcz8uWydtb2RlbE5hbWUnXSkge1xuICAgICAgICAgIHRoaXMubW9kZWxOYW1lID0gdGhpcy5yb3V0ZS5zbmFwc2hvdD8ucGFyYW1zPy5bJ21vZGVsTmFtZSddO1xuICAgICAgICAgIHRoaXMuY2FtZWxNb2RlbE5hbWUgPSB0aGlzLnRvQ2FtZWxDYXNlKHRoaXMubW9kZWxOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90Py5wYXJhbXM/LlsnaWQnXSkge1xuICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90Py5wYXJhbXM/LlsnaWQnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHR5cGVzID0gbWV0YS5nZXRUeXBlcyh0aGlzLm1vZHVsZUNvbmZpZz8ubG9nZ2luZyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGV4Y2x1ZGVkIHR5cGVzXG4gICAgICAgIGxldCBmaWx0ZXJlZFR5cGVzID0gdHlwZXMuZmlsdGVyKChlKSA9PiAhdGhpcy5tb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW2UubmFtZS50b0xvd2VyQ2FzZSgpXT8uZXhjbHVkZSk7XG5cbiAgICAgICAgLy8gU29ydCB0eXBlc1xuICAgICAgICBmaWx0ZXJlZFR5cGVzID0gZmlsdGVyZWRUeXBlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0aGlzLm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbYS5uYW1lLnRvTG93ZXJDYXNlKCldPy5vcmRlclxuICAgICAgICAgICAgICA/IHRoaXMubW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1thLm5hbWUudG9Mb3dlckNhc2UoKV0/Lm9yZGVyXG4gICAgICAgICAgICAgIDogOTkpIC1cbiAgICAgICAgICAgICh0aGlzLm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbYi5uYW1lLnRvTG93ZXJDYXNlKCldPy5vcmRlclxuICAgICAgICAgICAgICA/IHRoaXMubW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tiLm5hbWUudG9Mb3dlckNhc2UoKV0/Lm9yZGVyXG4gICAgICAgICAgICAgIDogOTkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIHJlc3RyaWN0ZWQgdHlwZXNcbiAgICAgICAgdGhpcy50eXBlcyA9IGZpbHRlcmVkVHlwZXMuZmlsdGVyKChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tlLm5hbWUudG9Mb3dlckNhc2UoKV0/LnJlc3RyaWN0ZWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZT8uY3VycmVudFVzZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuYXV0aFNlcnZpY2U/LmN1cnJlbnRVc2VyO1xuICAgICAgICAgICAgY29uc3QgbWFwcGVkVXNlciA9IEJhc2ljVXNlci5tYXAodXNlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBtYXBwZWRVc2VyPy5oYXNBbGxSb2xlcyh0aGlzLm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbZS5uYW1lLnRvTG93ZXJDYXNlKCldPy5yb2xlcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9kdWxlQ29uZmlnPy5sb2dnaW5nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Jhc2VDbXNDb21wb25lbnQ6OmluaXQtPnR5cGVzJywgdGhpcy50eXBlcyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Jhc2VDbXNDb21wb25lbnQ6OmluaXQtPmNhbWVsTW9kZWxOYW1lJywgdGhpcy5jYW1lbE1vZGVsTmFtZSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Jhc2VDbXNDb21wb25lbnQ6OmluaXQtPmZpZWxkQ29uZmlnJywgdGhpcy5tb2R1bGVDb25maWc/LmZpZWxkQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUodGhpcy50eXBlcyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsTmFtZSAmJiB0aGlzLnR5cGVzKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLycgKyB0aGlzLnRvS2ViYWJDYXNlKHRoaXMudHlwZXNbMF0ubmFtZSldLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBtb2RlbCBuYW1lIGlzIHNldCBhbmQgdGhlIHR5cGVzIGFyZSBzZXQsIHRoZW4gcmV0dXJuIHRoZSB0eXBlIHRoYXQgbWF0Y2hlcyB0aGUgbW9kZWwgbmFtZVxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHlwZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBtb2RlbCBuYW1lLlxuICAgKi9cbiAgZ2V0VHlwZUJ5TW9kZWxOYW1lKCkge1xuICAgIGlmICh0aGlzLm1vZGVsTmFtZSAmJiB0aGlzLnR5cGVzKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlcy5maW5kKChlKSA9PiB0aGlzLnRvS2ViYWJDYXNlKGUubmFtZSkgPT09IHRoaXMudG9LZWJhYkNhc2UodGhpcy5tb2RlbE5hbWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIGNyZWF0ZU1vZGVDaGFuZ2VkIGV2ZW50IGlzIGVtaXR0ZWQsIGlmIHRoZSBjcmVhdGVNb2RlIGlzIHRydWUsIG5hdmlnYXRlIHRvIHRoZSBuZXcgcm91dGVcbiAgICpcbiAgICogQHBhcmFtIGNyZWF0ZU1vZGUgLSBib29sZWFuIC0gVGhpcyBpcyBhIGJvb2xlYW4gdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpcyBpbiBjcmVhdGUgbW9kZSBvclxuICAgKiBub3QuXG4gICAqL1xuICBvbkNyZWF0ZU1vZGVDaGFuZ2VkKGNyZWF0ZU1vZGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoY3JlYXRlTW9kZSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLycgKyAnbmV1J10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHR5cGUgZXhpc3RzLCByZXR1cm4gdGhlIGNyZWF0ZSBwcm9wZXJ0eSBvZiB0aGUgdHlwZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBib29sZWFuIHZhbHVlLlxuICAgKi9cbiAgaXNDcmVhdGVQb3NzaWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5nZXRUeXBlQnlNb2RlbE5hbWUoKTtcbiAgICByZXR1cm4gdHlwZSA/IHR5cGUuY3JlYXRlIDogZmFsc2U7XG4gIH1cblxuICBpc0ltcG9ydFBvc3NpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbdGhpcy5jYW1lbE1vZGVsTmFtZV0/LmltcG9ydDtcblxuICAgIGlmIChjb25maWcgIT09IG51bGwgJiYgY29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdCA9IGNvbmZpZztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaXNFeHBvcnRQb3NzaWJsZSgpOiBib29sZWFuIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5tb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW3RoaXMuY2FtZWxNb2RlbE5hbWVdPy5leHBvcnQ7XG5cbiAgICBpZiAoY29uZmlnICE9PSBudWxsICYmIGNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSBjb25maWc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgbW9kZWwgbmFtZSBpcyBmb3VuZCBpbiB0aGUgdHlwZSBtYXAsIHJldHVybiB0aGUgdXBkYXRlIHByb3BlcnR5IG9mIHRoZSB0eXBlIG9iamVjdFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gdmFsdWUuXG4gICAqL1xuICBpc1VwZGF0ZVBvc3NpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmdldFR5cGVCeU1vZGVsTmFtZSgpO1xuICAgIHJldHVybiB0eXBlID8gdHlwZS51cGRhdGUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgdHlwZSBpcyBkZWZpbmVkLCByZXR1cm4gdGhlIGRlbGV0ZSBwcm9wZXJ0eSBvZiB0aGUgdHlwZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZVxuICAgKlxuICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gdmFsdWUuXG4gICAqL1xuICBpc0RlbGV0ZVBvc3NpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmdldFR5cGVCeU1vZGVsTmFtZSgpO1xuICAgIHJldHVybiB0eXBlID8gdHlwZS5kZWxldGUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgbW9kZWwgbmFtZSBpcyBmb3VuZCBpbiB0aGUgdHlwZSBhcnJheSwgcmV0dXJuIHRoZSBkdXBsaWNhdGUgcHJvcGVydHkgb2YgdGhlIHR5cGUgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiB2YWx1ZS5cbiAgICovXG4gIGlzRHVwbGljYXRlUG9zc2libGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZUJ5TW9kZWxOYW1lKCk7XG4gICAgcmV0dXJuIHR5cGUgPyB0eXBlLmR1cGxpY2F0ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBpZCBpcyB0cnV0aHksIG5hdmlnYXRlIHRvIHRoZSBpZCwgb3RoZXJ3aXNlIG5hdmlnYXRlIHRvIHRoZSBwYXJlbnQgcm91dGVcbiAgICovXG4gIGlkU2VsZWN0ZWQoaWQ6IHN0cmluZykge1xuICAgIGlmIChpZCkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLycgKyBpZF0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLiddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBzdHJpbmcgdG8ga2ViYWIgY2FzZVxuICAgKi9cbiAgdG9LZWJhYkNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyPy5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBzdHJpbmcgdG8gY2FtZWwgY2FzZVxuICAgKi9cbiAgdG9DYW1lbENhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyPy5yZXBsYWNlKC8tLi9nLCAobWF0Y2gpID0+IG1hdGNoWzFdLnRvVXBwZXJDYXNlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBmaXJzdCBsZXR0ZXIgdG8gbG93ZXIgY2FzZVxuICAgKi9cbiAgbG93ZXJDYXNlRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNtc1NlcnZpY2UubG93ZXJDYXNlRmlyc3RMZXR0ZXIodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgc2lkZWJhciB3aWR0aCBiYXNlZCBvbiBzY3JlZW4gc2l6ZVxuICAgKi9cbiAgY2FsY1NpZGVCYXJXaWR0aCgpIHtcbiAgICB0aGlzLnNpZGVCYXJXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNzY4ID8gJzglJyA6ICcyMiUnO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibWFpblwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJzaWRlYmFyXCJcbiAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAnZmxleC1iYXNpcyc6ICFyZXNwb25zaXZlVG9nZ2xlID8gc2lkZUJhcldpZHRoIDogJzEwMCUnLFxuICAgICAgJ21pbi13aWR0aCc6ICFyZXNwb25zaXZlVG9nZ2xlID8gc2lkZUJhcldpZHRoIDogJydcbiAgICB9XCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUgZC1tZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtc2hyaW5rLTAgcC0zIGgtMTAwXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kdWxlQ29uZmlnLmJyYW5kaW5nXCI+XG4gICAgICAgIDxhXG4gICAgICAgICAgaHJlZj1cIi9cIlxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0IG1iLTMgbXQtMyBtZS1tZC1hdXRvIGxpbmstZGFyayB0ZXh0LWRlY29yYXRpb24tbm9uZVwiXG4gICAgICAgICAgKm5nSWY9XCIhbW9kdWxlQ29uZmlnPy5sb2dvVXJsXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9jayBmcy00XCI+PGIgY2xhc3M9XCJ0ZXh0LXByaW1hcnlcIj5CYXNlPC9iPkNNUzwvc3Bhbj5cbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJmdy1saWdodGVyXCI+VGhlIGF1dG8gZ2VuZXJhdGVkIEdyYXBoUUwgQ01TPC9zbWFsbD5cbiAgICAgICAgPC9hPlxuXG4gICAgICAgIDxhXG4gICAgICAgICAgaHJlZj1cIi9cIlxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0IG1iLTMgbXQtMyBtZS1tZC1hdXRvIGxpbmstZGFyayB0ZXh0LWRlY29yYXRpb24tbm9uZSB3LTEwMFwiXG4gICAgICAgICAgKm5nSWY9XCJtb2R1bGVDb25maWc/LmxvZ29VcmxcIlxuICAgICAgICA+XG4gICAgICAgICAgPGltZyBbc3JjXT1cIm1vZHVsZUNvbmZpZy5sb2dvVXJsXCIgY2xhc3M9XCJpbWctcmVzcG9uc2l2ZSB3LTEwMFwiIGFsdD1cIkxvZ29cIiAvPlxuICAgICAgICA8L2E+XG4gICAgICAgIDxociAvPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXBpbGxzIGZsZXgtY29sdW1uIG1iLWF1dG9cIiAqbmdJZj1cInR5cGVzXCI+XG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCIgKm5nRm9yPVwibGV0IHR5cGUgb2YgdHlwZXNcIj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGlua1wiXG4gICAgICAgICAgICBhcmlhLWN1cnJlbnQ9XCJwYWdlXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIihpZCA/ICcuLi8uLi8nIDogJy4uLycpICsgdG9LZWJhYkNhc2UodHlwZT8ubmFtZSlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHRvS2ViYWJDYXNlKHR5cGU/Lm5hbWUpID09PSB0b0tlYmFiQ2FzZSh0aGlzLm1vZGVsTmFtZSkgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgbW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tsb3dlckNhc2VGaXJzdExldHRlcih0eXBlPy5uYW1lKV0/LnBsdXJhbFxuICAgICAgICAgICAgICAgID8gbW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tsb3dlckNhc2VGaXJzdExldHRlcih0eXBlPy5uYW1lKV0/LnBsdXJhbFxuICAgICAgICAgICAgICAgIDogbW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tsb3dlckNhc2VGaXJzdExldHRlcih0eXBlPy5uYW1lKV0/LmxhYmVsXG4gICAgICAgICAgICAgICAgPyBtb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW2xvd2VyQ2FzZUZpcnN0TGV0dGVyKHR5cGU/Lm5hbWUpXT8ubGFiZWxcbiAgICAgICAgICAgICAgICA6IHR5cGUubmFtZSArICdzJ1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZC1tZC1ub25lIHAtMyBoLTEwMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJiaVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnYmktY2hldnJvbi1sZWZ0JzogIXJlc3BvbnNpdmVUb2dnbGUsICdiaS1jaGV2cm9uLXJpZ2h0JzogcmVzcG9uc2l2ZVRvZ2dsZSB9XCJcbiAgICAgICAgICAoY2xpY2spPVwicmVzcG9uc2l2ZVRvZ2dsZSA9ICFyZXNwb25zaXZlVG9nZ2xlXCJcbiAgICAgICAgPjwvaT5cbiAgICAgIDwvZGl2PlxuICAgICAgPHVsXG4gICAgICAgIGNsYXNzPVwibmF2IG5hdi1waWxscyByZXNwb25zaXZlLXBpbGxzIGZsZXgtY29sdW1uIG1iLWF1dG9cIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICd3LTEwMC10cmFuc2l0aW9uJzogcmVzcG9uc2l2ZVRvZ2dsZSB9XCJcbiAgICAgICAgKm5nSWY9XCJ0eXBlc1wiXG4gICAgICA+XG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCIgKm5nRm9yPVwibGV0IHR5cGUgb2YgdHlwZXNcIiAoY2xpY2spPVwicmVzcG9uc2l2ZVRvZ2dsZSA9ICFyZXNwb25zaXZlVG9nZ2xlXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmtcIlxuICAgICAgICAgICAgYXJpYS1jdXJyZW50PVwicGFnZVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCIoaWQgPyAnLi4vLi4vJyA6ICcuLi8nKSArIHRvS2ViYWJDYXNlKHR5cGU/Lm5hbWUpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiB0b0tlYmFiQ2FzZSh0eXBlPy5uYW1lKSA9PT0gdG9LZWJhYkNhc2UodGhpcy5tb2RlbE5hbWUpIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgIG1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbbG93ZXJDYXNlRmlyc3RMZXR0ZXIodHlwZT8ubmFtZSldPy5wbHVyYWxcbiAgICAgICAgICAgICAgICA/IG1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbbG93ZXJDYXNlRmlyc3RMZXR0ZXIodHlwZT8ubmFtZSldPy5wbHVyYWxcbiAgICAgICAgICAgICAgICA6IG1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbbG93ZXJDYXNlRmlyc3RMZXR0ZXIodHlwZT8ubmFtZSldPy5sYWJlbFxuICAgICAgICAgICAgICAgID8gbW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tsb3dlckNhc2VGaXJzdExldHRlcih0eXBlPy5uYW1lKV0/LmxhYmVsXG4gICAgICAgICAgICAgICAgOiB0eXBlLm5hbWUgKyAncydcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInNpZGViYXItY29udGVudFwiIFtuZ1N0eWxlXT1cInsgJ2ZsZXgtYmFzaXMnOiAhcmVzcG9uc2l2ZVRvZ2dsZSA/ICd1bnNldCcgOiAnMCcgfVwiPlxuICAgIDxkaXYgY2xhc3M9XCJwLTMgcC1tZC01IG1iLTNcIj5cbiAgICAgIDxiYXNlLW1vZGVsLXRhYmxlXG4gICAgICAgIFttb2RlbENvbmZpZ109XCJtb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW2NhbWVsTW9kZWxOYW1lXVwiXG4gICAgICAgIFtjb25maWddPVwibW9kdWxlQ29uZmlnPy5maWVsZENvbmZpZ1tjYW1lbE1vZGVsTmFtZV0gfHwge31cIlxuICAgICAgICBbbW9kZWxOYW1lXT1cIm1vZGVsTmFtZVwiXG4gICAgICAgIFtsb2dnaW5nXT1cIm1vZHVsZUNvbmZpZz8ubG9nZ2luZ1wiXG4gICAgICAgIFtvYmplY3RJZF09XCJpZCAhPT0gJ25ldScgPyBpZCA6ICcnXCJcbiAgICAgICAgW2NyZWF0ZU1vZGVdPVwiaWQgPT09ICduZXUnXCJcbiAgICAgICAgKGNyZWF0ZU1vZGVDaGFuZ2VkKT1cIm9uQ3JlYXRlTW9kZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIChpZFNlbGVjdGVkKT1cImlkU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIFtpbXBvcnRdPVwiaXNJbXBvcnRQb3NzaWJsZSgpXCJcbiAgICAgICAgW2V4cG9ydF09XCJpc0V4cG9ydFBvc3NpYmxlKClcIlxuICAgICAgICBbY3JlYXRlXT1cImlzQ3JlYXRlUG9zc2libGUoKVwiXG4gICAgICAgIFt1cGRhdGVdPVwiaXNVcGRhdGVQb3NzaWJsZSgpXCJcbiAgICAgICAgW2RlbGV0ZV09XCJpc0RlbGV0ZVBvc3NpYmxlKClcIlxuICAgICAgICBbZHVwbGljYXRlXT1cImlzRHVwbGljYXRlUG9zc2libGUoKVwiXG4gICAgICAgIFtzaG93RmF2QnV0dG9uXT1cIiFyZXNwb25zaXZlVG9nZ2xlXCJcbiAgICAgID48L2Jhc2UtbW9kZWwtdGFibGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=