@sinequa/assistant 3.7.7 → 3.9.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 (149) hide show
  1. package/chat/charts/chart/chart.component.d.ts +13 -13
  2. package/chat/chat-message/chat-message.component.d.ts +85 -81
  3. package/chat/chat-message/i18n/en.json +11 -0
  4. package/chat/chat-message/i18n/fr.json +11 -0
  5. package/chat/chat-reference/chat-reference.component.d.ts +14 -14
  6. package/chat/chat-reference/i18n/en.json +4 -0
  7. package/chat/chat-reference/i18n/fr.json +4 -0
  8. package/chat/chat-settings-v3/chat-settings-v3.component.d.ts +48 -49
  9. package/chat/chat-settings-v3/i18n/en.json +14 -0
  10. package/chat/chat-settings-v3/i18n/fr.json +14 -0
  11. package/chat/chat.component.d.ts +388 -1410
  12. package/chat/chat.service.d.ts +247 -228
  13. package/chat/debug-message/debug-message.component.d.ts +17 -17
  14. package/chat/debug-message/i18n/en.json +3 -0
  15. package/chat/debug-message/i18n/fr.json +3 -0
  16. package/chat/dialogs/delete-saved-chat.component.d.ts +22 -0
  17. package/chat/dialogs/i18n/en.json +19 -0
  18. package/chat/dialogs/i18n/fr.json +19 -0
  19. package/chat/dialogs/rename-saved-chat.component.d.ts +21 -0
  20. package/chat/dialogs/updates.component.d.ts +15 -0
  21. package/chat/documents-upload/document-list/document-list.component.d.ts +68 -0
  22. package/chat/documents-upload/document-overview/document-overview.component.d.ts +31 -0
  23. package/chat/documents-upload/document-upload/document-upload.component.d.ts +96 -0
  24. package/chat/documents-upload/documents-upload.model.d.ts +66 -0
  25. package/chat/documents-upload/documents-upload.service.d.ts +170 -0
  26. package/chat/documents-upload/i18n/en.json +24 -0
  27. package/chat/documents-upload/i18n/fr.json +24 -0
  28. package/chat/format-icon/format-icon.component.d.ts +10 -10
  29. package/chat/format-icon/icons.d.ts +5 -5
  30. package/chat/i18n/en.json +42 -0
  31. package/chat/i18n/fr.json +42 -0
  32. package/chat/index.d.ts +5 -5
  33. package/chat/initials-avatar/initials-avatar.component.d.ts +35 -35
  34. package/chat/instance-manager.service.d.ts +28 -28
  35. package/chat/pipes/message-content.pipe.d.ts +16 -0
  36. package/chat/prompt.component.d.ts +25 -21
  37. package/chat/public-api.d.ts +17 -12
  38. package/chat/references/i18n/en.json +6 -0
  39. package/chat/references/i18n/fr.json +6 -0
  40. package/chat/references/inline-image-reference.d.ts +21 -0
  41. package/chat/references/inline-page-reference.d.ts +21 -0
  42. package/chat/rest-chat.service.d.ts +31 -33
  43. package/chat/saved-chats/i18n/en.json +4 -0
  44. package/chat/saved-chats/i18n/fr.json +4 -0
  45. package/chat/saved-chats/saved-chats.component.d.ts +30 -36
  46. package/chat/services/app.service.d.ts +8 -0
  47. package/chat/services/dialog.service.d.ts +12 -0
  48. package/chat/services/notification.service.d.ts +10 -0
  49. package/chat/services/principal.service.d.ts +7 -0
  50. package/chat/services/search.service.d.ts +7 -0
  51. package/chat/services/signalR.web.service.d.ts +45 -0
  52. package/chat/services/ui.service.d.ts +13 -0
  53. package/chat/services/user-settings.service.d.ts +7 -0
  54. package/chat/styles/assistant.scss +2 -0
  55. package/chat/token-progress-bar/i18n/en.json +4 -0
  56. package/chat/token-progress-bar/i18n/fr.json +4 -0
  57. package/chat/token-progress-bar/token-progress-bar.component.d.ts +24 -27
  58. package/chat/tooltip/tooltip.component.d.ts +12 -0
  59. package/chat/tooltip/tooltip.directive.d.ts +81 -0
  60. package/chat/types/message-content.types.d.ts +54 -0
  61. package/chat/types/message-reference.types.d.ts +11 -0
  62. package/chat/types.d.ts +913 -817
  63. package/chat/unified-plugins/embedded-image-reference.plugin.d.ts +3 -0
  64. package/chat/unified-plugins/embedded-page-reference.plugin.d.ts +3 -0
  65. package/chat/utils/assistant-json.d.ts +2 -0
  66. package/chat/websocket-chat.service.d.ts +102 -103
  67. package/esm2022/chat/charts/chart/chart.component.mjs +40 -0
  68. package/esm2022/chat/chat-message/chat-message.component.mjs +351 -0
  69. package/esm2022/chat/chat-reference/chat-reference.component.mjs +40 -0
  70. package/esm2022/chat/chat-settings-v3/chat-settings-v3.component.mjs +118 -0
  71. package/esm2022/chat/chat.component.mjs +1090 -0
  72. package/esm2022/chat/chat.service.mjs +417 -0
  73. package/esm2022/chat/debug-message/debug-message.component.mjs +43 -0
  74. package/esm2022/chat/dialogs/delete-saved-chat.component.mjs +81 -0
  75. package/esm2022/chat/dialogs/rename-saved-chat.component.mjs +84 -0
  76. package/esm2022/chat/dialogs/updates.component.mjs +61 -0
  77. package/esm2022/chat/documents-upload/document-list/document-list.component.mjs +140 -0
  78. package/esm2022/chat/documents-upload/document-overview/document-overview.component.mjs +65 -0
  79. package/esm2022/chat/documents-upload/document-upload/document-upload.component.mjs +256 -0
  80. package/esm2022/chat/documents-upload/documents-upload.model.mjs +2 -0
  81. package/esm2022/chat/documents-upload/documents-upload.service.mjs +291 -0
  82. package/{esm2020 → esm2022}/chat/format-icon/format-icon.component.mjs +23 -23
  83. package/{esm2020 → esm2022}/chat/format-icon/icons.mjs +137 -137
  84. package/{esm2020 → esm2022}/chat/initials-avatar/initials-avatar.component.mjs +60 -60
  85. package/esm2022/chat/instance-manager.service.mjs +46 -0
  86. package/esm2022/chat/pipes/message-content.pipe.mjs +34 -0
  87. package/esm2022/chat/prompt.component.mjs +88 -0
  88. package/esm2022/chat/public-api.mjs +18 -0
  89. package/esm2022/chat/references/inline-image-reference.mjs +110 -0
  90. package/esm2022/chat/references/inline-page-reference.mjs +110 -0
  91. package/esm2022/chat/rest-chat.service.mjs +296 -0
  92. package/esm2022/chat/saved-chats/saved-chats.component.mjs +82 -0
  93. package/esm2022/chat/services/app.service.mjs +19 -0
  94. package/esm2022/chat/services/dialog.service.mjs +40 -0
  95. package/esm2022/chat/services/notification.service.mjs +25 -0
  96. package/esm2022/chat/services/principal.service.mjs +16 -0
  97. package/esm2022/chat/services/search.service.mjs +13 -0
  98. package/esm2022/chat/services/signalR.web.service.mjs +79 -0
  99. package/esm2022/chat/services/ui.service.mjs +61 -0
  100. package/esm2022/chat/services/user-settings.service.mjs +22 -0
  101. package/{esm2020 → esm2022}/chat/sinequa-assistant-chat.mjs +4 -4
  102. package/esm2022/chat/token-progress-bar/token-progress-bar.component.mjs +52 -0
  103. package/esm2022/chat/tooltip/tooltip.component.mjs +44 -0
  104. package/esm2022/chat/tooltip/tooltip.directive.mjs +203 -0
  105. package/esm2022/chat/types/message-content.types.mjs +2 -0
  106. package/esm2022/chat/types/message-reference.types.mjs +2 -0
  107. package/esm2022/chat/types.mjs +130 -0
  108. package/esm2022/chat/unified-plugins/embedded-image-reference.plugin.mjs +57 -0
  109. package/esm2022/chat/unified-plugins/embedded-page-reference.plugin.mjs +57 -0
  110. package/esm2022/chat/utils/assistant-json.mjs +12 -0
  111. package/esm2022/chat/websocket-chat.service.mjs +654 -0
  112. package/{esm2020 → esm2022}/public-api.mjs +2 -2
  113. package/{esm2020 → esm2022}/sinequa-assistant.mjs +4 -4
  114. package/fesm2022/sinequa-assistant-chat.mjs +5340 -0
  115. package/fesm2022/sinequa-assistant-chat.mjs.map +1 -0
  116. package/{fesm2015 → fesm2022}/sinequa-assistant.mjs +3 -3
  117. package/index.d.ts +5 -5
  118. package/package.json +51 -22
  119. package/public-api.d.ts +1 -1
  120. package/chat/messages/de.d.ts +0 -4
  121. package/chat/messages/en.d.ts +0 -4
  122. package/chat/messages/fr.d.ts +0 -4
  123. package/chat/messages/index.d.ts +0 -4
  124. package/esm2020/chat/charts/chart/chart.component.mjs +0 -40
  125. package/esm2020/chat/chat-message/chat-message.component.mjs +0 -263
  126. package/esm2020/chat/chat-reference/chat-reference.component.mjs +0 -40
  127. package/esm2020/chat/chat-settings-v3/chat-settings-v3.component.mjs +0 -114
  128. package/esm2020/chat/chat.component.mjs +0 -1072
  129. package/esm2020/chat/chat.service.mjs +0 -333
  130. package/esm2020/chat/debug-message/debug-message.component.mjs +0 -43
  131. package/esm2020/chat/instance-manager.service.mjs +0 -46
  132. package/esm2020/chat/messages/de.mjs +0 -4
  133. package/esm2020/chat/messages/en.mjs +0 -4
  134. package/esm2020/chat/messages/fr.mjs +0 -4
  135. package/esm2020/chat/messages/index.mjs +0 -9
  136. package/esm2020/chat/prompt.component.mjs +0 -88
  137. package/esm2020/chat/public-api.mjs +0 -13
  138. package/esm2020/chat/rest-chat.service.mjs +0 -241
  139. package/esm2020/chat/saved-chats/saved-chats.component.mjs +0 -175
  140. package/esm2020/chat/token-progress-bar/token-progress-bar.component.mjs +0 -54
  141. package/esm2020/chat/types.mjs +0 -101
  142. package/esm2020/chat/websocket-chat.service.mjs +0 -641
  143. package/fesm2015/sinequa-assistant-chat.mjs +0 -3416
  144. package/fesm2015/sinequa-assistant-chat.mjs.map +0 -1
  145. package/fesm2020/sinequa-assistant-chat.mjs +0 -3388
  146. package/fesm2020/sinequa-assistant-chat.mjs.map +0 -1
  147. package/fesm2020/sinequa-assistant.mjs +0 -9
  148. package/fesm2020/sinequa-assistant.mjs.map +0 -1
  149. /package/{fesm2015 → fesm2022}/sinequa-assistant.mjs.map +0 -0
@@ -1,88 +0,0 @@
1
- import { Component, Inject } from "@angular/core";
2
- import { CommonModule } from "@angular/common";
3
- import { UntypedFormControl, Validators } from '@angular/forms';
4
- import { MODAL_MODEL, ModalButton } from "@sinequa/core/modal";
5
- import { Utils } from '@sinequa/core/base';
6
- import { BsModalModule } from "@sinequa/components/modal";
7
- import { ValidationModule } from "@sinequa/core/validation";
8
- import { ReactiveFormsModule } from "@angular/forms";
9
- import { IntlModule } from "@sinequa/core/intl";
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@sinequa/core/modal";
12
- import * as i2 from "@angular/forms";
13
- import * as i3 from "@angular/common";
14
- import * as i4 from "@sinequa/components/modal";
15
- import * as i5 from "@sinequa/core/validation";
16
- import * as i6 from "@sinequa/core/intl";
17
- export class ChatPrompt {
18
- constructor(model, modalRef, formBuilder) {
19
- this.model = model;
20
- this.modalRef = modalRef;
21
- this.formBuilder = formBuilder;
22
- this.defaultButtons = [
23
- new ModalButton({
24
- result: -1 /* ModalResult.OK */,
25
- primary: true,
26
- validation: this.form
27
- }),
28
- new ModalButton({
29
- result: -2 /* ModalResult.Cancel */
30
- })
31
- ];
32
- }
33
- ngOnInit() {
34
- this.inputControl = new UntypedFormControl(this.model.output, this.model.validators || Validators.required);
35
- this.form = this.formBuilder.group({
36
- input: this.inputControl
37
- });
38
- this.formChanges = Utils.subscribe(this.form.valueChanges, (value) => {
39
- this.model.output = this.inputControl.value;
40
- });
41
- }
42
- ngOnDestroy() {
43
- this.formChanges.unsubscribe();
44
- }
45
- get title() {
46
- return this.model.title ? this.model.title : "msg#modal.prompt.title";
47
- }
48
- get buttons() {
49
- return (this.model.buttons && this.model.buttons.length > 0) ? this.model.buttons : this.defaultButtons;
50
- }
51
- }
52
- ChatPrompt.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatPrompt, deps: [{ token: MODAL_MODEL }, { token: i1.ModalRef }, { token: i2.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component });
53
- ChatPrompt.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatPrompt, isStandalone: true, selector: "sq-chat-prompt", ngImport: i0, template: `
54
- <form name="prompt" novalidate [formGroup]="form">
55
- <sq-modal [title]="title" [buttons]="buttons">
56
- <div class="mb-3 sq-form-group">
57
- <label class="form-label" for="input">{{model.message | sqMessage:model.messageParams}}</label>
58
- <input [sqValidation]="form" type="text" class="form-control" id="input" formControlName="input" spellcheck="off" sqAutofocus *ngIf="!model.rowCount">
59
- <textarea [sqValidation]="form" type="text" class="form-control" id="input" formControlName="input" spellcheck="on" rows="{{model.rowCount}}" sqAutofocus *ngIf="!!model.rowCount">
60
- </textarea>
61
- </div>
62
- </sq-modal>
63
- </form>
64
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: BsModalModule }, { kind: "component", type: i4.BsModal, selector: "sq-modal", inputs: ["title", "buttons", "showHeader", "showFooter", "isProcessingState"] }, { kind: "ngmodule", type: ValidationModule }, { kind: "directive", type: i5.ValidationDirective, selector: "[sqValidation]", inputs: ["sqValidation"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: IntlModule }, { kind: "pipe", type: i6.MessagePipe, name: "sqMessage" }] });
65
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatPrompt, decorators: [{
66
- type: Component,
67
- args: [{
68
- selector: "sq-chat-prompt",
69
- template: `
70
- <form name="prompt" novalidate [formGroup]="form">
71
- <sq-modal [title]="title" [buttons]="buttons">
72
- <div class="mb-3 sq-form-group">
73
- <label class="form-label" for="input">{{model.message | sqMessage:model.messageParams}}</label>
74
- <input [sqValidation]="form" type="text" class="form-control" id="input" formControlName="input" spellcheck="off" sqAutofocus *ngIf="!model.rowCount">
75
- <textarea [sqValidation]="form" type="text" class="form-control" id="input" formControlName="input" spellcheck="on" rows="{{model.rowCount}}" sqAutofocus *ngIf="!!model.rowCount">
76
- </textarea>
77
- </div>
78
- </sq-modal>
79
- </form>
80
- `,
81
- standalone: true,
82
- imports: [CommonModule, BsModalModule, ValidationModule, ReactiveFormsModule, IntlModule],
83
- }]
84
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
85
- type: Inject,
86
- args: [MODAL_MODEL]
87
- }] }, { type: i1.ModalRef }, { type: i2.UntypedFormBuilder }]; } });
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbXB0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3Byb21wdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQXNCLFVBQVUsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RyxPQUFPLEVBQUUsV0FBVyxFQUEyQixXQUFXLEVBQWUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7QUFtQmhELE1BQU0sT0FBTyxVQUFVO0lBTW5CLFlBQ2dDLEtBQW9CLEVBQ3RDLFFBQWtCLEVBQ2xCLFdBQStCO1FBRmIsVUFBSyxHQUFMLEtBQUssQ0FBZTtRQUN0QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHO1lBQ3BCLElBQUksV0FBVyxDQUFDO2dCQUNaLE1BQU0seUJBQWdCO2dCQUN0QixPQUFPLEVBQUUsSUFBSTtnQkFDYixVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUk7YUFDeEIsQ0FBQztZQUNGLElBQUksV0FBVyxDQUFDO2dCQUNaLE1BQU0sNkJBQW9CO2FBQzdCLENBQUM7U0FDSCxDQUFDO0lBQ1IsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQzNCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFDckQsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUM7SUFDMUUsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzVHLENBQUM7O3VHQTNDUSxVQUFVLGtCQU9QLFdBQVc7MkZBUGQsVUFBVSwwRUFmVDs7Ozs7Ozs7Ozs7S0FXVCwyREFFUyxZQUFZLGtJQUFFLGFBQWEsNEtBQUUsZ0JBQWdCLHlJQUFFLG1CQUFtQiw0OEJBQUUsVUFBVTsyRkFFL0UsVUFBVTtrQkFqQnRCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsUUFBUSxFQUFFOzs7Ozs7Ozs7OztLQVdUO29CQUNELFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLFVBQVUsQ0FBQztpQkFDNUY7OzBCQVFRLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTU9EQUxfTU9ERUwsIFByb21wdE9wdGlvbnMsIE1vZGFsUmVmLCBNb2RhbEJ1dHRvbiwgTW9kYWxSZXN1bHQgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9tb2RhbFwiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdAc2luZXF1YS9jb3JlL2Jhc2UnO1xuaW1wb3J0IHsgQnNNb2RhbE1vZHVsZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL21vZGFsXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uTW9kdWxlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgSW50bE1vZHVsZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2ludGxcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwic3EtY2hhdC1wcm9tcHRcIixcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8Zm9ybSBuYW1lPVwicHJvbXB0XCIgbm92YWxpZGF0ZSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICAgICAgICAgIDxzcS1tb2RhbCBbdGl0bGVdPVwidGl0bGVcIiBbYnV0dG9uc109XCJidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgc3EtZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiaW5wdXRcIj57e21vZGVsLm1lc3NhZ2UgfCBzcU1lc3NhZ2U6bW9kZWwubWVzc2FnZVBhcmFtc319PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtzcVZhbGlkYXRpb25dPVwiZm9ybVwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImlucHV0XCIgZm9ybUNvbnRyb2xOYW1lPVwiaW5wdXRcIiBzcGVsbGNoZWNrPVwib2ZmXCIgc3FBdXRvZm9jdXMgKm5nSWY9XCIhbW9kZWwucm93Q291bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIFtzcVZhbGlkYXRpb25dPVwiZm9ybVwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImlucHV0XCIgZm9ybUNvbnRyb2xOYW1lPVwiaW5wdXRcIiBzcGVsbGNoZWNrPVwib25cIiByb3dzPVwie3ttb2RlbC5yb3dDb3VudH19XCIgc3FBdXRvZm9jdXMgKm5nSWY9XCIhIW1vZGVsLnJvd0NvdW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3NxLW1vZGFsPlxuICAgICAgICA8L2Zvcm0+XG4gICAgYCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJzTW9kYWxNb2R1bGUsIFZhbGlkYXRpb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEludGxNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGF0UHJvbXB0IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIGlucHV0Q29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICAgIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gICAgZm9ybUNoYW5nZXM6IFN1YnNjcmlwdGlvbjtcbiAgICBkZWZhdWx0QnV0dG9uczogTW9kYWxCdXR0b25bXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KE1PREFMX01PREVMKSBwdWJsaWMgbW9kZWw6IFByb21wdE9wdGlvbnMsXG4gICAgICAgIHByb3RlY3RlZCBtb2RhbFJlZjogTW9kYWxSZWYsXG4gICAgICAgIHByb3RlY3RlZCBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyKSB7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0QnV0dG9ucyA9IFtcbiAgICAgICAgICAgIG5ldyBNb2RhbEJ1dHRvbih7XG4gICAgICAgICAgICAgICAgcmVzdWx0OiBNb2RhbFJlc3VsdC5PSyxcbiAgICAgICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHRoaXMuZm9ybVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgTW9kYWxCdXR0b24oe1xuICAgICAgICAgICAgICAgIHJlc3VsdDogTW9kYWxSZXN1bHQuQ2FuY2VsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF07XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuaW5wdXRDb250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh0aGlzLm1vZGVsLm91dHB1dCwgdGhpcy5tb2RlbC52YWxpZGF0b3JzIHx8IFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGlucHV0OiB0aGlzLmlucHV0Q29udHJvbFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mb3JtQ2hhbmdlcyA9IFV0aWxzLnN1YnNjcmliZSh0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLFxuICAgICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5vdXRwdXQgPSB0aGlzLmlucHV0Q29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmZvcm1DaGFuZ2VzLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLnRpdGxlID8gdGhpcy5tb2RlbC50aXRsZSA6IFwibXNnI21vZGFsLnByb21wdC50aXRsZVwiO1xuICAgIH1cblxuICAgIGdldCBidXR0b25zKCk6IE1vZGFsQnV0dG9uW10ge1xuICAgICAgICByZXR1cm4gKHRoaXMubW9kZWwuYnV0dG9ucyAmJiB0aGlzLm1vZGVsLmJ1dHRvbnMubGVuZ3RoID4gMCkgPyB0aGlzLm1vZGVsLmJ1dHRvbnMgOiB0aGlzLmRlZmF1bHRCdXR0b25zO1xuICAgIH1cblxufVxuIl19
@@ -1,13 +0,0 @@
1
- export * from './chat-settings-v3/chat-settings-v3.component';
2
- export * from './chat.component';
3
- export * from './chat.service';
4
- export * from './saved-chats/saved-chats.component';
5
- export * from './initials-avatar/initials-avatar.component';
6
- export * from './format-icon/format-icon.component';
7
- export * from './types';
8
- export * from './messages/index';
9
- export * from './websocket-chat.service';
10
- export * from './rest-chat.service';
11
- export * from './instance-manager.service';
12
- export * from './prompt.component';
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jaGF0LXNldHRpbmdzLXYzL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY2hhdC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9jaGF0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zYXZlZC1jaGF0cy9zYXZlZC1jaGF0cy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbml0aWFscy1hdmF0YXIvaW5pdGlhbHMtYXZhdGFyLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdC1pY29uL2Zvcm1hdC1pY29uLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnZXMvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi93ZWJzb2NrZXQtY2hhdC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcmVzdC1jaGF0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnN0YW5jZS1tYW5hZ2VyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9tcHQuY29tcG9uZW50JztcbiJdfQ==
@@ -1,241 +0,0 @@
1
- import { Injectable, inject } from '@angular/core';
2
- import { ChatService } from './chat.service';
3
- import { catchError, filter, finalize, forkJoin, map, shareReplay, switchMap, take, tap, throwError } from 'rxjs';
4
- import { JsonMethodPluginService } from '@sinequa/core/web-services';
5
- import * as i0 from "@angular/core";
6
- export class RestChatService extends ChatService {
7
- constructor() {
8
- super();
9
- this.jsonMethodWebService = inject(JsonMethodPluginService);
10
- }
11
- /**
12
- * Initialize the chat process after the login is complete.
13
- * It listens for the 'login-complete' event, initializes necessary URL, and performs parallel requests for models, functions and quota data.
14
- * @returns An Observable<boolean> indicating the success of the initialization process.
15
- */
16
- init() {
17
- return this.loginService.events.pipe(filter((e) => e.type === 'login-complete'), tap(() => this.getRequestsUrl()),
18
- // Execute parallel requests for models and functions
19
- switchMap(() => forkJoin([
20
- this.listModels(),
21
- this.listFunctions()
22
- ])),
23
- // Map the results of parallel requests to a boolean indicating success
24
- map(([models, functions]) => {
25
- const result = !!models && !!functions;
26
- this.initProcess$.next(result);
27
- return result;
28
- }),
29
- // Any errors during the process are caught, logged, and re-thrown to propagate the error further
30
- catchError((error) => {
31
- console.error('Error occurred:', error);
32
- return throwError(() => error);
33
- }),
34
- // cache and replay the emitted value for subsequent subscribers, ensuring the initialization logic is only executed once even if there are multiple subscribers
35
- shareReplay(1));
36
- }
37
- /**
38
- * Define the GLLM plugin to use for the http requests
39
- * It can be overridden by the app config
40
- */
41
- getRequestsUrl() {
42
- if (this.assistantConfig$.value.connectionSettings.restEndpoint) {
43
- this.REQUEST_URL = this.assistantConfig$.value.connectionSettings.restEndpoint;
44
- }
45
- else {
46
- throw new Error(`The property 'restEndpoint' must be provided when attempting to use 'REST' in assistant instance`);
47
- }
48
- }
49
- overrideUser() {
50
- const error = new Error('Override user is not supported in REST');
51
- console.error(error);
52
- }
53
- listModels() {
54
- const data = {
55
- action: "listmodels",
56
- debug: this.assistantConfig$.value.defaultValues.debug
57
- };
58
- return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(map(res => res.models), tap(models => this.models = models?.filter(model => !!model.enable)), catchError((error) => {
59
- console.error('Error invoking listmodels:', error);
60
- return throwError(() => error);
61
- }));
62
- }
63
- listFunctions() {
64
- const data = {
65
- action: "listfunctions",
66
- debug: this.assistantConfig$.value.defaultValues.debug
67
- };
68
- return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(map(res => res.functions), tap((functions) => this.functions = functions?.filter(func => func.enabled && !!this.assistantConfig$.value.defaultValues.functions.find(fn => fn.name === func.functionName))), catchError((error) => {
69
- console.error('Error invoking listfunctions:', error);
70
- return throwError(() => error);
71
- }));
72
- }
73
- fetch(messages, query) {
74
- // Start streaming by invoking the Chat method
75
- this.streaming$.next(true);
76
- // Prepare the payload to send to the Chat method
77
- const data = {
78
- action: "chat",
79
- history: messages,
80
- functions: this.assistantConfig$.value.defaultValues.functions?.filter(func => func.enabled).map(func => func.name),
81
- debug: this.assistantConfig$.value.defaultValues.debug,
82
- serviceSettings: {
83
- service_id: this.assistantConfig$.value.defaultValues.service_id,
84
- model_id: this.assistantConfig$.value.defaultValues.model_id,
85
- top_p: this.assistantConfig$.value.defaultValues.top_p,
86
- temperature: this.assistantConfig$.value.defaultValues.temperature,
87
- max_tokens: this.assistantConfig$.value.defaultValues.max_tokens,
88
- ...this.assistantConfig$.value.additionalServiceSettings
89
- },
90
- appQuery: {
91
- app: this.appService.appName,
92
- query
93
- },
94
- genericChatErrorMessage: this.assistantConfig$.value.globalSettings.genericChatErrorMessage
95
- };
96
- if (this.assistantConfig$.value.savedChatSettings.enabled) {
97
- data.instanceId = this.chatInstanceId;
98
- data.savedChatId = this.savedChatId;
99
- }
100
- // Request the Chat endpoint
101
- return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(tap((res) => this.updateQuota(res.quota, true)), map((res) => {
102
- // Define $progress from the actions property of the response
103
- let $progress;
104
- if (res.actions?.length > 0) {
105
- const actions = Object.values(res.actions.reduce((acc, item) => {
106
- acc[item.guid] = { ...(acc[item.guid] || {}), ...item };
107
- return acc;
108
- }, {}));
109
- $progress = actions.map((a) => ({
110
- title: a.displayName ?? "",
111
- content: a.displayValue ?? "",
112
- done: a.executionTime !== undefined,
113
- time: a.executionTime,
114
- }));
115
- }
116
- // Re-attach the $progress and $attachment of the last response to the last assistant's response in the chat history
117
- const response = { ...res.history.at(-1) };
118
- if ($progress)
119
- response.additionalProperties.$progress = $progress;
120
- if (res.context)
121
- response.additionalProperties.$attachment = res.context.map((ctx) => ctx.additionalProperties);
122
- if (res.suggestedActions)
123
- response.additionalProperties.$suggestedAction = res.suggestedActions;
124
- // Emit the updated chat usage metrics once the generation of the assistant response is completed
125
- if (!!response.additionalProperties.usageMetrics) {
126
- this.updateChatUsageMetrics(response.additionalProperties.usageMetrics);
127
- }
128
- // Update the chat history with the incoming history property of the res AND the processed response message
129
- this.chatHistory = res.history;
130
- this.chatHistory[this.chatHistory.length - 1] = response;
131
- // Save/update the chat if savedChat enabled
132
- if (this.assistantConfig$.value.savedChatSettings.enabled && this.chatHistory.some((msg) => msg.additionalProperties?.isUserInput === true)) {
133
- const action = !this.savedChatId ? this.addSavedChat(this.chatHistory) : this.updateSavedChat(this.savedChatId, undefined, this.chatHistory);
134
- action.pipe(take(1)).subscribe();
135
- }
136
- // Generate audit event
137
- const details = {
138
- 'duration': res.executionTime,
139
- 'text': response.content,
140
- 'role': response.role,
141
- 'rank': this.chatHistory.length - 1,
142
- 'generation-tokencount': response.additionalProperties.usageMetrics?.completionTokenCount,
143
- 'prompt-tokencount': response.additionalProperties.usageMetrics?.promptTokenCount,
144
- 'attachments': response.additionalProperties.$attachment?.map(({ recordId, contextId, parts, type }) => ({
145
- recordId,
146
- contextId,
147
- parts: parts.map(({ partId, text }) => ({ partId, text })),
148
- type
149
- }))
150
- };
151
- this.generateAuditEvent('message', details);
152
- // Return the result
153
- return { history: [...messages, response], executionTime: res.executionTime };
154
- }), finalize(() => this.streaming$.next(false)));
155
- }
156
- stopGeneration() {
157
- const error = new Error('Not supported in REST');
158
- console.error(error);
159
- return throwError(() => error);
160
- }
161
- listSavedChat() {
162
- if (!this.assistantConfig$.value.savedChatSettings.enabled) {
163
- return;
164
- }
165
- const data = {
166
- action: "SavedChatList",
167
- instanceId: this.chatInstanceId,
168
- debug: this.assistantConfig$.value.defaultValues.debug
169
- };
170
- this.jsonMethodWebService.get(this.REQUEST_URL, data).subscribe(res => this.savedChats$.next(res.savedChats), error => {
171
- console.error('Error occurred while calling the SavedChatList API:', error.error.errorMessage);
172
- this.notificationsService.error('Error occurred while calling the SavedChatList API:', error.error.errorMessage);
173
- });
174
- }
175
- addSavedChat(messages) {
176
- const data = {
177
- action: "SavedChatAdd",
178
- instanceId: this.chatInstanceId,
179
- savedChatId: this.chatId,
180
- history: messages,
181
- debug: this.assistantConfig$.value.defaultValues.debug
182
- };
183
- return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(map(res => res.savedChat), tap((savedChat) => {
184
- this.setSavedChatId(savedChat.id); // Persist the savedChatId
185
- this.generateAuditEvent('saved-chat.add', {}, savedChat.id); // Generate audit event
186
- }), catchError((error) => {
187
- console.error('Error occurred while calling the SavedChatAdd API:', error.error.errorMessage);
188
- this.notificationsService.error('Error occurred while calling the SavedChatAdd API:', error.error.errorMessage);
189
- return throwError(() => error);
190
- }));
191
- }
192
- getSavedChat(id) {
193
- const data = {
194
- action: "SavedChatGet",
195
- instanceId: this.chatInstanceId,
196
- savedChatId: id,
197
- debug: this.assistantConfig$.value.defaultValues.debug
198
- };
199
- return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(map(res => res.savedChat), catchError((error) => {
200
- console.error('Error occurred while calling the SavedChatGet API:', error.error.errorMessage);
201
- this.notificationsService.error('Error occurred while calling the SavedChatGet API:', error.error.errorMessage);
202
- return throwError(() => error);
203
- }));
204
- }
205
- updateSavedChat(id, name, messages) {
206
- const data = {
207
- action: "SavedChatUpdate",
208
- instanceId: this.chatInstanceId,
209
- savedChatId: id,
210
- debug: this.assistantConfig$.value.defaultValues.debug
211
- };
212
- if (name)
213
- data["title"] = name;
214
- if (messages)
215
- data["history"] = messages;
216
- return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(map(res => res.savedChat), catchError((error) => {
217
- console.error('Error occurred while calling the SavedChatUpdate API:', error.error.errorMessage);
218
- this.notificationsService.error('Error occurred while calling the SavedChatUpdate API:', error.error.errorMessage);
219
- return throwError(() => error);
220
- }));
221
- }
222
- deleteSavedChat(ids) {
223
- const data = {
224
- action: "SavedChatDelete",
225
- instanceId: this.chatInstanceId,
226
- savedChatIds: ids,
227
- debug: this.assistantConfig$.value.defaultValues.debug
228
- };
229
- return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(map(res => res.deletedCount), catchError((error) => {
230
- console.error('Error occurred while calling the SavedChatDelete API:', error.error.errorMessage);
231
- this.notificationsService.error('Error occurred while calling the SavedChatDelete API:', error.error.errorMessage);
232
- return throwError(() => error);
233
- }));
234
- }
235
- }
236
- RestChatService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RestChatService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
237
- RestChatService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RestChatService });
238
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RestChatService, decorators: [{
239
- type: Injectable
240
- }], ctorParameters: function () { return []; } });
241
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1jaGF0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9yZXN0LWNoYXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5SCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFJckUsTUFBTSxPQUFPLGVBQWdCLFNBQVEsV0FBVztJQUk5QztRQUNFLEtBQUssRUFBRSxDQUFDO1FBSEgseUJBQW9CLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFJOUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxFQUMxQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLHFEQUFxRDtRQUNyRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQ2IsUUFBUSxDQUFDO1lBQ1AsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMsYUFBYSxFQUFFO1NBQ3JCLENBQUMsQ0FDSDtRQUNELHVFQUF1RTtRQUN2RSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFB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O1lBQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYztZQUMvQixZQUFZLEVBQUUsR0FBRztZQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQU0sQ0FBQyxhQUFhLENBQUMsS0FBSztTQUN4RCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUNoRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQzVCLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsdURBQXVELEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLHVEQUF1RCxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkgsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OzRHQW5SVSxlQUFlO2dIQUFmLGVBQWU7MkZBQWYsZUFBZTtrQkFEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tICcuL2NoYXQuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjYXRjaEVycm9yLCBmaWx0ZXIsIGZpbmFsaXplLCBmb3JrSm9pbiwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YWtlLCB0YXAsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFjdGlvbk1lc3NhZ2UsIENoYXRNZXNzYWdlLCBDaGF0UGF5bG9hZCwgQ2hhdFByb2dyZXNzLCBDaGF0UmVzcG9uc2UsIEdsbG1GdW5jdGlvbiwgR2xsbU1vZGVsRGVzY3JpcHRpb24sIEh0dHBDaGF0UmVzcG9uc2UsIFNhdmVkQ2hhdCwgU2F2ZWRDaGF0SGlzdG9yeSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgSnNvbk1ldGhvZFBsdWdpblNlcnZpY2UgfSBmcm9tICdAc2luZXF1YS9jb3JlL3dlYi1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2FwcC11dGlsc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVzdENoYXRTZXJ2aWNlIGV4dGVuZHMgQ2hhdFNlcnZpY2Uge1xuXG4gIHB1YmxpYyBqc29uTWV0aG9kV2ViU2VydmljZSA9IGluamVjdChKc29uTWV0aG9kUGx1Z2luU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjaGF0IHByb2Nlc3MgYWZ0ZXIgdGhlIGxvZ2luIGlzIGNvbXBsZXRlLlxuICAgKiBJdCBsaXN0ZW5zIGZvciB0aGUgJ2xvZ2luLWNvbXBsZXRlJyBldmVudCwgaW5pdGlhbGl6ZXMgbmVjZXNzYXJ5IFVSTCwgYW5kIHBlcmZvcm1zIHBhcmFsbGVsIHJlcXVlc3RzIGZvciBtb2RlbHMsIGZ1bmN0aW9ucyBhbmQgcXVvdGEgZGF0YS5cbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZTxib29sZWFuPiBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgaW5pdCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2dpblNlcnZpY2UuZXZlbnRzLnBpcGUoXG4gICAgICBmaWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gJ2xvZ2luLWNvbXBsZXRlJyksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5nZXRSZXF1ZXN0c1VybCgpKSxcbiAgICAgIC8vIEV4ZWN1dGUgcGFyYWxsZWwgcmVxdWVzdHMgZm9yIG1vZGVscyBhbmQgZnVuY3Rpb25zXG4gICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgZm9ya0pvaW4oW1xuICAgICAgICAgIHRoaXMubGlzdE1vZGVscygpLFxuICAgICAgICAgIHRoaXMubGlzdEZ1bmN0aW9ucygpXG4gICAgICAgIF0pXG4gICAgICApLFxuICAgICAgLy8gTWFwIHRoZSByZXN1bHRzIG9mIHBhcmFsbGVsIHJlcXVlc3RzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3NcbiAgICAgIG1hcCgoW21vZGVscywgZnVuY3Rpb25zXSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAhIW1vZGVscyAmJiAhIWZ1bmN0aW9ucztcbiAgICAgICAgdGhpcy5pbml0UHJvY2VzcyQubmV4dChyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICAvLyBBbnkgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2VzcyBhcmUgY2F1Z2h0LCBsb2dnZWQsIGFuZCByZS10aHJvd24gdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBmdXJ0aGVyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZDonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pLFxuICAgICAgLy8gY2FjaGUgYW5kIHJlcGxheSB0aGUgZW1pdHRlZCB2YWx1ZSBmb3Igc3Vic2VxdWVudCBzdWJzY3JpYmVycywgZW5zdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIGxvZ2ljIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBldmVuIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdWJzY3JpYmVyc1xuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgR0xMTSBwbHVnaW4gdG8gdXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0c1xuICAgKiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwIGNvbmZpZ1xuICAgKi9cbiAgZ2V0UmVxdWVzdHNVcmwoKSB7XG4gICAgaWYgKHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuY29ubmVjdGlvblNldHRpbmdzLnJlc3RFbmRwb2ludCkge1xuICAgICAgdGhpcy5SRVFVRVNUX1VSTCA9IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuY29ubmVjdGlvblNldHRpbmdzLnJlc3RFbmRwb2ludDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgJ3Jlc3RFbmRwb2ludCcgbXVzdCBiZSBwcm92aWRlZCB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlICdSRVNUJyBpbiBhc3Npc3RhbnQgaW5zdGFuY2VgKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBvdmVycmlkZVVzZXIoKTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ092ZXJyaWRlIHVzZXIgaXMgbm90IHN1cHBvcnRlZCBpbiBSRVNUJyk7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gIH1cblxuICBsaXN0TW9kZWxzKCk6IE9ic2VydmFibGU8R2xsbU1vZGVsRGVzY3JpcHRpb25bXSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwibGlzdG1vZGVsc1wiLFxuICAgICAgZGVidWc6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UuZ2V0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5tb2RlbHMpLFxuICAgICAgdGFwKG1vZGVscyA9PiB0aGlzLm1vZGVscyA9IG1vZGVscz8uZmlsdGVyKG1vZGVsID0+ICEhbW9kZWwuZW5hYmxlKSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBsaXN0bW9kZWxzOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbGlzdEZ1bmN0aW9ucygpOiBPYnNlcnZhYmxlPEdsbG1GdW5jdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJsaXN0ZnVuY3Rpb25zXCIsXG4gICAgICBkZWJ1ZzogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5nZXQodGhpcy5SRVFVRVNUX1VSTCwgZGF0YSkucGlwZShcbiAgICAgIG1hcChyZXMgPT4gcmVzLmZ1bmN0aW9ucyksXG4gICAgICB0YXAoKGZ1bmN0aW9uczogR2xsbUZ1bmN0aW9uW10gfCB1bmRlZmluZWQpID0+IHRoaXMuZnVuY3Rpb25zID0gZnVuY3Rpb25zPy5maWx0ZXIoZnVuYyA9PiBmdW5jLmVuYWJsZWQgJiYgICEhdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucy5maW5kKGZuID0+IGZuLm5hbWUgPT09IGZ1bmMuZnVuY3Rpb25OYW1lKSkpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgbGlzdGZ1bmN0aW9uczonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLCBxdWVyeTogUXVlcnkpOiBPYnNlcnZhYmxlPENoYXRSZXNwb25zZT4ge1xuICAgIC8vIFN0YXJ0IHN0cmVhbWluZyBieSBpbnZva2luZyB0aGUgQ2hhdCBtZXRob2RcbiAgICB0aGlzLnN0cmVhbWluZyQubmV4dCh0cnVlKTtcblxuICAgIC8vIFByZXBhcmUgdGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgQ2hhdCBtZXRob2RcbiAgICBjb25zdCBkYXRhOiBDaGF0UGF5bG9hZCAmIHthY3Rpb246IFwiY2hhdFwifSA9IHtcbiAgICAgIGFjdGlvbjogXCJjaGF0XCIsXG4gICAgICBoaXN0b3J5OiBtZXNzYWdlcyxcbiAgICAgIGZ1bmN0aW9uczogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucz8uZmlsdGVyKGZ1bmMgPT4gZnVuYy5lbmFibGVkKS5tYXAoZnVuYyA9PiBmdW5jLm5hbWUpLFxuICAgICAgZGVidWc6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1ZyxcbiAgICAgIHNlcnZpY2VTZXR0aW5nczoge1xuICAgICAgICBzZXJ2aWNlX2lkOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuc2VydmljZV9pZCxcbiAgICAgICAgbW9kZWxfaWQ6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5tb2RlbF9pZCxcbiAgICAgICAgdG9wX3A6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy50b3BfcCxcbiAgICAgICAgdGVtcGVyYXR1cmU6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy50ZW1wZXJhdHVyZSxcbiAgICAgICAgbWF4X3Rva2VuczogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLm1heF90b2tlbnMsXG4gICAgICAgIC4uLnRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuYWRkaXRpb25hbFNlcnZpY2VTZXR0aW5nc1xuICAgICAgfSxcbiAgICAgIGFwcFF1ZXJ5OiB7XG4gICAgICAgIGFwcDogdGhpcy5hcHBTZXJ2aWNlLmFwcE5hbWUsXG4gICAgICAgIHF1ZXJ5XG4gICAgICB9LFxuICAgICAgZ2VuZXJpY0NoYXRFcnJvck1lc3NhZ2U6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZ2xvYmFsU2V0dGluZ3MuZ2VuZXJpY0NoYXRFcnJvck1lc3NhZ2VcbiAgICB9XG4gICAgaWYgKHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgZGF0YS5pbnN0YW5jZUlkID0gdGhpcy5jaGF0SW5zdGFuY2VJZDtcbiAgICAgIGRhdGEuc2F2ZWRDaGF0SWQgPSB0aGlzLnNhdmVkQ2hhdElkO1xuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgdGhlIENoYXQgZW5kcG9pbnRcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5wb3N0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICB0YXAoKHJlczogSHR0cENoYXRSZXNwb25zZSkgPT4gdGhpcy51cGRhdGVRdW90YShyZXMucXVvdGEsIHRydWUpKSxcbiAgICAgIG1hcCgocmVzOiBIdHRwQ2hhdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIC8vIERlZmluZSAkcHJvZ3Jlc3MgZnJvbSB0aGUgYWN0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgcmVzcG9uc2VcbiAgICAgICAgbGV0ICRwcm9ncmVzczogQ2hhdFByb2dyZXNzW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmKCByZXMuYWN0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnM6IEFjdGlvbk1lc3NhZ2VbXSA9IE9iamVjdC52YWx1ZXMocmVzLmFjdGlvbnMucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGFjY1tpdGVtLmd1aWRdID0geyAuLi4oYWNjW2l0ZW0uZ3VpZF0gfHwge30pLCAuLi5pdGVtIH07XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIHt9KSk7XG4gICAgICAgICAgJHByb2dyZXNzID0gYWN0aW9ucy5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgICB0aXRsZTogYS5kaXNwbGF5TmFtZSA/PyBcIlwiLFxuICAgICAgICAgICAgY29udGVudDogYS5kaXNwbGF5VmFsdWUgPz8gXCJcIixcbiAgICAgICAgICAgIGRvbmU6IGEuZXhlY3V0aW9uVGltZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgdGltZTogYS5leGVjdXRpb25UaW1lLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlLWF0dGFjaCB0aGUgJHByb2dyZXNzIGFuZCAkYXR0YWNobWVudCBvZiB0aGUgbGFzdCByZXNwb25zZSB0byB0aGUgbGFzdCBhc3Npc3RhbnQncyByZXNwb25zZSBpbiB0aGUgY2hhdCBoaXN0b3J5XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gey4uLihyZXMuaGlzdG9yeSBhcyBBcnJheTxDaGF0TWVzc2FnZT4pLmF0KC0xKX0gYXMgQ2hhdE1lc3NhZ2U7XG4gICAgICAgIGlmKCRwcm9ncmVzcykgcmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJHByb2dyZXNzID0gJHByb2dyZXNzO1xuICAgICAgICBpZihyZXMuY29udGV4dCkgcmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQgPSByZXMuY29udGV4dC5tYXAoKGN0eCkgPT4gY3R4LmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcbiAgICAgICAgaWYocmVzLnN1Z2dlc3RlZEFjdGlvbnMpIHJlc3BvbnNlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRzdWdnZXN0ZWRBY3Rpb24gPSByZXMuc3VnZ2VzdGVkQWN0aW9ucztcbiAgICAgICAgLy8gRW1pdCB0aGUgdXBkYXRlZCBjaGF0IHVzYWdlIG1ldHJpY3Mgb25jZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgYXNzaXN0YW50IHJlc3BvbnNlIGlzIGNvbXBsZXRlZFxuICAgICAgICBpZiAoISFyZXNwb25zZS5hZGRpdGlvbmFsUHJvcGVydGllcy51c2FnZU1ldHJpY3MpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXRVc2FnZU1ldHJpY3MocmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMudXNhZ2VNZXRyaWNzISk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBjaGF0IGhpc3Rvcnkgd2l0aCB0aGUgaW5jb21pbmcgaGlzdG9yeSBwcm9wZXJ0eSBvZiB0aGUgcmVzIEFORCB0aGUgcHJvY2Vzc2VkIHJlc3BvbnNlIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5jaGF0SGlzdG9yeSA9IHJlcy5oaXN0b3J5O1xuICAgICAgICB0aGlzLmNoYXRIaXN0b3J5W3RoaXMuY2hhdEhpc3RvcnkubGVuZ3RoIC0gMV0gPSByZXNwb25zZTtcbiAgICAgICAgLy8gU2F2ZS91cGRhdGUgdGhlIGNoYXQgaWYgc2F2ZWRDaGF0IGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCAmJiB0aGlzLmNoYXRIaXN0b3J5LnNvbWUoKG1zZykgPT4gbXNnLmFkZGl0aW9uYWxQcm9wZXJ0aWVzPy5pc1VzZXJJbnB1dCA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICBjb25zdCBhY3Rpb24gPSAhdGhpcy5zYXZlZENoYXRJZCA/IHRoaXMuYWRkU2F2ZWRDaGF0KHRoaXMuY2hhdEhpc3RvcnkpIDogdGhpcy51cGRhdGVTYXZlZENoYXQodGhpcy5zYXZlZENoYXRJZCwgdW5kZWZpbmVkLCB0aGlzLmNoYXRIaXN0b3J5KTtcbiAgICAgICAgICBhY3Rpb24ucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBHZW5lcmF0ZSBhdWRpdCBldmVudFxuICAgICAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgICAgICdkdXJhdGlvbic6IHJlcy5leGVjdXRpb25UaW1lLFxuICAgICAgICAgICd0ZXh0JzogcmVzcG9uc2UuY29udGVudCxcbiAgICAgICAgICAncm9sZSc6IHJlc3BvbnNlLnJvbGUsIC8vICdhc3Npc3RhbnQnXG4gICAgICAgICAgJ3JhbmsnOiB0aGlzLmNoYXRIaXN0b3J5Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgJ2dlbmVyYXRpb24tdG9rZW5jb3VudCc6IHJlc3BvbnNlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnVzYWdlTWV0cmljcz8uY29tcGxldGlvblRva2VuQ291bnQsXG4gICAgICAgICAgJ3Byb21wdC10b2tlbmNvdW50JzogcmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMudXNhZ2VNZXRyaWNzPy5wcm9tcHRUb2tlbkNvdW50LFxuICAgICAgICAgICdhdHRhY2htZW50cyc6IHJlc3BvbnNlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRhdHRhY2htZW50Py5tYXAoKHsgcmVjb3JkSWQsIGNvbnRleHRJZCwgcGFydHMsIHR5cGUgfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHM6IHBhcnRzLm1hcCgoeyBwYXJ0SWQsIHRleHQgfSkgPT4gKHsgcGFydElkLCB0ZXh0IH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVBdWRpdEV2ZW50KCdtZXNzYWdlJywgZGV0YWlscyk7XG4gICAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0XG4gICAgICAgIHJldHVybiB7IGhpc3Rvcnk6IFsuLi5tZXNzYWdlcywgcmVzcG9uc2VdLCBleGVjdXRpb25UaW1lOiByZXMuZXhlY3V0aW9uVGltZSB9O1xuICAgICAgfSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLnN0cmVhbWluZyQubmV4dChmYWxzZSkpXG4gICAgKTtcbiAgfVxuXG4gIHN0b3BHZW5lcmF0aW9uKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgaW4gUkVTVCcpO1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgfVxuXG4gIGxpc3RTYXZlZENoYXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLnNhdmVkQ2hhdFNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcIlNhdmVkQ2hhdExpc3RcIixcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBkZWJ1ZzogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcbiAgICB0aGlzLmpzb25NZXRob2RXZWJTZXJ2aWNlLmdldCh0aGlzLlJFUVVFU1RfVVJMLCBkYXRhKS5zdWJzY3JpYmUoXG4gICAgICByZXMgPT4gdGhpcy5zYXZlZENoYXRzJC5uZXh0KHJlcy5zYXZlZENoYXRzKSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0TGlzdCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0TGlzdCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBhZGRTYXZlZENoYXQobWVzc2FnZXM6IENoYXRNZXNzYWdlW10pOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdD4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0QWRkXCIsXG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgc2F2ZWRDaGF0SWQ6IHRoaXMuY2hhdElkLFxuICAgICAgaGlzdG9yeTogbWVzc2FnZXMsXG4gICAgICBkZWJ1ZzogdGhpcy5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmpzb25NZXRob2RXZWJTZXJ2aWNlLnBvc3QodGhpcy5SRVFVRVNUX1VSTCwgZGF0YSkucGlwZShcbiAgICAgIG1hcChyZXMgPT4gcmVzLnNhdmVkQ2hhdCksXG4gICAgICB0YXAoKHNhdmVkQ2hhdDogU2F2ZWRDaGF0KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U2F2ZWRDaGF0SWQoc2F2ZWRDaGF0LmlkKTsgLy8gUGVyc2lzdCB0aGUgc2F2ZWRDaGF0SWRcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ3NhdmVkLWNoYXQuYWRkJywge30sIHNhdmVkQ2hhdC5pZCk7IC8vIEdlbmVyYXRlIGF1ZGl0IGV2ZW50XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdEFkZCBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0QWRkIEFQSTonLCBlcnJvci5lcnJvci5lcnJvck1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRTYXZlZENoYXQoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U2F2ZWRDaGF0SGlzdG9yeSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0R2V0XCIsXG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgc2F2ZWRDaGF0SWQ6IGlkLFxuICAgICAgZGVidWc6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UuZ2V0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5zYXZlZENoYXQpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0R2V0IEFQSTonLCBlcnJvci5lcnJvci5lcnJvck1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRHZXQgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVNhdmVkQ2hhdChpZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBtZXNzYWdlcz86IENoYXRNZXNzYWdlW10pOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdD4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0VXBkYXRlXCIsXG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgc2F2ZWRDaGF0SWQ6IGlkLFxuICAgICAgZGVidWc6IHRoaXMuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICBpZihuYW1lKSBkYXRhW1widGl0bGVcIl0gPSBuYW1lO1xuICAgIGlmKG1lc3NhZ2VzKSBkYXRhW1wiaGlzdG9yeVwiXSA9IG1lc3NhZ2VzO1xuXG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UucG9zdCh0aGlzLlJFUVVFU1RfVVJMLCBkYXRhKS5waXBlKFxuICAgICAgbWFwKHJlcyA9PiByZXMuc2F2ZWRDaGF0KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdFVwZGF0ZSBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0VXBkYXRlIEFQSTonLCBlcnJvci5lcnJvci5lcnJvck1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBkZWxldGVTYXZlZENoYXQoaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJTYXZlZENoYXREZWxldGVcIixcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBzYXZlZENoYXRJZHM6IGlkcyxcbiAgICAgIGRlYnVnOiB0aGlzLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWdcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmpzb25NZXRob2RXZWJTZXJ2aWNlLnBvc3QodGhpcy5SRVFVRVNUX1VSTCwgZGF0YSkucGlwZShcbiAgICAgIG1hcChyZXMgPT4gcmVzLmRlbGV0ZWRDb3VudCksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXREZWxldGUgQVBJOicsIGVycm9yLmVycm9yLmVycm9yTWVzc2FnZSk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdERlbGV0ZSBBUEk6JywgZXJyb3IuZXJyb3IuZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbn1cbiJdfQ==