@cqa-lib/cqa-ui 1.1.247 → 1.1.249

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 (27) hide show
  1. package/esm2020/lib/dynamic-select/dynamic-select-field.component.mjs +31 -17
  2. package/esm2020/lib/execution-screen/recording-banner/recording-banner.component.mjs +30 -0
  3. package/esm2020/lib/execution-screen/review-recorded-steps-modal/review-recorded-steps-modal.component.mjs +112 -0
  4. package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +19 -6
  5. package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +6 -3
  6. package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +6 -3
  7. package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +493 -56
  8. package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +3 -3
  9. package/esm2020/lib/test-case-details/delete-steps/delete-steps.component.mjs +2 -3
  10. package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +3 -3
  11. package/esm2020/lib/ui-kit.module.mjs +11 -1
  12. package/esm2020/public-api.mjs +3 -1
  13. package/fesm2015/cqa-lib-cqa-ui.mjs +709 -92
  14. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  15. package/fesm2020/cqa-lib-cqa-ui.mjs +695 -87
  16. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  17. package/lib/dynamic-select/dynamic-select-field.component.d.ts +8 -0
  18. package/lib/execution-screen/recording-banner/recording-banner.component.d.ts +13 -0
  19. package/lib/execution-screen/review-recorded-steps-modal/review-recorded-steps-modal.component.d.ts +37 -0
  20. package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +7 -3
  21. package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +5 -1
  22. package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +5 -1
  23. package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +29 -1
  24. package/lib/ui-kit.module.d.ts +97 -95
  25. package/package.json +1 -1
  26. package/public-api.d.ts +2 -0
  27. package/styles.css +1 -1
@@ -0,0 +1,30 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../button/button.component";
4
+ import * as i2 from "@angular/common";
5
+ export class RecordingBannerComponent {
6
+ constructor() {
7
+ /** Whether the banner is visible (recording active) */
8
+ this.isVisible = false;
9
+ /** Number of steps captured so far */
10
+ this.stepsCaptured = 0;
11
+ /** Emitted when the user clicks Stop */
12
+ this.stopRecording = new EventEmitter();
13
+ }
14
+ onStop() {
15
+ this.stopRecording.emit();
16
+ }
17
+ }
18
+ RecordingBannerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: RecordingBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19
+ RecordingBannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: RecordingBannerComponent, selector: "cqa-recording-banner", inputs: { isVisible: "isVisible", stepsCaptured: "stepsCaptured" }, outputs: { stopRecording: "stopRecording" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div\n *ngIf=\"isVisible\"\n class=\"cqa-fixed cqa-left-1/2 cqa-top-6 cqa-z-[60] cqa-flex cqa-items-center cqa-justify-center cqa--translate-x-1/2\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Recording in progress\"\n>\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-6 cqa-px-6 cqa-py-3 cqa-bg-red-500 cqa-rounded-full cqa-shadow-md cqa-text-white\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-shrink-0\">\n <span class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-bg-white cqa-border cqa-border-white cqa-opacity-100 cqa-flex-shrink-0\" aria-hidden=\"true\"></span>\n <span class=\"cqa-font-[Inter] cqa-font-normal cqa-text-[14px] cqa-leading-[18px] cqa-tracking-normal cqa-text-white cqa-align-middle cqa-whitespace-nowrap\">Recording</span>\n <span class=\"cqa-font-[Inter] cqa-font-normal cqa-text-[14px] cqa-text-[#FFFFFF] cqa-leading-[18px] cqa-tracking-normal cqa-text-white cqa-align-middle cqa-whitespace-nowrap\">{{ stepsCaptured }} steps captured</span>\n </div>\n <cqa-button\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"'Stop'\"\n icon=\"crop_square\"\n iconColor=\"#FFFFFF\"\n customClass=\"!cqa-bg-[#F9FAFB33] !cqa-border-[#F9FAFB33] !cqa-text-white cqa-text-[14px] cqa-w-[77px] cqa-h-[28px] cqa-min-h-[28px] cqa-gap-[6px] cqa-pl-[12px] cqa-pr-[12px] cqa-rounded-[6px] cqa-flex-shrink-0\"\n (clicked)=\"onStop()\">\n </cqa-button>\n </div>\n</div>\n", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: RecordingBannerComponent, decorators: [{
21
+ type: Component,
22
+ args: [{ selector: 'cqa-recording-banner', host: { class: 'cqa-ui-root' }, template: "<div\n *ngIf=\"isVisible\"\n class=\"cqa-fixed cqa-left-1/2 cqa-top-6 cqa-z-[60] cqa-flex cqa-items-center cqa-justify-center cqa--translate-x-1/2\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Recording in progress\"\n>\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-6 cqa-px-6 cqa-py-3 cqa-bg-red-500 cqa-rounded-full cqa-shadow-md cqa-text-white\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-shrink-0\">\n <span class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-bg-white cqa-border cqa-border-white cqa-opacity-100 cqa-flex-shrink-0\" aria-hidden=\"true\"></span>\n <span class=\"cqa-font-[Inter] cqa-font-normal cqa-text-[14px] cqa-leading-[18px] cqa-tracking-normal cqa-text-white cqa-align-middle cqa-whitespace-nowrap\">Recording</span>\n <span class=\"cqa-font-[Inter] cqa-font-normal cqa-text-[14px] cqa-text-[#FFFFFF] cqa-leading-[18px] cqa-tracking-normal cqa-text-white cqa-align-middle cqa-whitespace-nowrap\">{{ stepsCaptured }} steps captured</span>\n </div>\n <cqa-button\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"md\"\n [text]=\"'Stop'\"\n icon=\"crop_square\"\n iconColor=\"#FFFFFF\"\n customClass=\"!cqa-bg-[#F9FAFB33] !cqa-border-[#F9FAFB33] !cqa-text-white cqa-text-[14px] cqa-w-[77px] cqa-h-[28px] cqa-min-h-[28px] cqa-gap-[6px] cqa-pl-[12px] cqa-pr-[12px] cqa-rounded-[6px] cqa-flex-shrink-0\"\n (clicked)=\"onStop()\">\n </cqa-button>\n </div>\n</div>\n", styles: [] }]
23
+ }], propDecorators: { isVisible: [{
24
+ type: Input
25
+ }], stepsCaptured: [{
26
+ type: Input
27
+ }], stopRecording: [{
28
+ type: Output
29
+ }] } });
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLWJhbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vcmVjb3JkaW5nLWJhbm5lci9yZWNvcmRpbmctYmFubmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9yZWNvcmRpbmctYmFubmVyL3JlY29yZGluZy1iYW5uZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQVF2RSxNQUFNLE9BQU8sd0JBQXdCO0lBTnJDO1FBT0UsdURBQXVEO1FBQzlDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFcEMsc0NBQXNDO1FBQzdCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBRW5DLHdDQUF3QztRQUM5QixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FLcEQ7SUFIQyxNQUFNO1FBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDOztxSEFaVSx3QkFBd0I7eUdBQXhCLHdCQUF3QixzTkNSckMsdy9DQTJCQTsyRkRuQmEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHNCQUFzQixRQUcxQixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7OEJBSXJCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXJlY29yZGluZy1iYW5uZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVjb3JkaW5nLWJhbm5lci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbn0pXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nQmFubmVyQ29tcG9uZW50IHtcbiAgLyoqIFdoZXRoZXIgdGhlIGJhbm5lciBpcyB2aXNpYmxlIChyZWNvcmRpbmcgYWN0aXZlKSAqL1xuICBASW5wdXQoKSBpc1Zpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogTnVtYmVyIG9mIHN0ZXBzIGNhcHR1cmVkIHNvIGZhciAqL1xuICBASW5wdXQoKSBzdGVwc0NhcHR1cmVkOiBudW1iZXIgPSAwO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFN0b3AgKi9cbiAgQE91dHB1dCgpIHN0b3BSZWNvcmRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgb25TdG9wKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlY29yZGluZy5lbWl0KCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCJpc1Zpc2libGVcIlxuICBjbGFzcz1cImNxYS1maXhlZCBjcWEtbGVmdC0xLzIgY3FhLXRvcC02IGNxYS16LVs2MF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLS10cmFuc2xhdGUteC0xLzJcIlxuICByb2xlPVwic3RhdHVzXCJcbiAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgYXJpYS1sYWJlbD1cIlJlY29yZGluZyBpbiBwcm9ncmVzc1wiXG4+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTYgY3FhLXB4LTYgY3FhLXB5LTMgY3FhLWJnLXJlZC01MDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtc2hhZG93LW1kIGNxYS10ZXh0LXdoaXRlXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdy1bMTBweF0gY3FhLWgtWzEwcHhdIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLXdoaXRlIGNxYS1ib3JkZXIgY3FhLWJvcmRlci13aGl0ZSBjcWEtb3BhY2l0eS0xMDAgY3FhLWZsZXgtc2hyaW5rLTBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LVtJbnRlcl0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtdGV4dC13aGl0ZSBjcWEtYWxpZ24tbWlkZGxlIGNxYS13aGl0ZXNwYWNlLW5vd3JhcFwiPlJlY29yZGluZzwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtW0ludGVyXSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWzE0cHhdIGNxYS10ZXh0LVsjRkZGRkZGXSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRyYWNraW5nLW5vcm1hbCBjcWEtdGV4dC13aGl0ZSBjcWEtYWxpZ24tbWlkZGxlIGNxYS13aGl0ZXNwYWNlLW5vd3JhcFwiPnt7IHN0ZXBzQ2FwdHVyZWQgfX0gc3RlcHMgY2FwdHVyZWQ8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGNxYS1idXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICBbdGV4dF09XCInU3RvcCdcIlxuICAgICAgaWNvbj1cImNyb3Bfc3F1YXJlXCJcbiAgICAgIGljb25Db2xvcj1cIiNGRkZGRkZcIlxuICAgICAgY3VzdG9tQ2xhc3M9XCIhY3FhLWJnLVsjRjlGQUZCMzNdICFjcWEtYm9yZGVyLVsjRjlGQUZCMzNdICFjcWEtdGV4dC13aGl0ZSBjcWEtdGV4dC1bMTRweF0gY3FhLXctWzc3cHhdIGNxYS1oLVsyOHB4XSBjcWEtbWluLWgtWzI4cHhdIGNxYS1nYXAtWzZweF0gY3FhLXBsLVsxMnB4XSBjcWEtcHItWzEycHhdIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgIChjbGlja2VkKT1cIm9uU3RvcCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,112 @@
1
+ import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../button/button.component";
4
+ import * as i2 from "@angular/material/icon";
5
+ import * as i3 from "@angular/material/radio";
6
+ import * as i4 from "@angular/common";
7
+ import * as i5 from "ngx-drag-drop";
8
+ export class ReviewRecordedStepsModalComponent {
9
+ constructor() {
10
+ this.isOpen = false;
11
+ this.title = 'Review Recorded Steps';
12
+ this.steps = [];
13
+ this.saveOption = 'run_only';
14
+ this.saveButtonDisabled = false;
15
+ this.closeModal = new EventEmitter();
16
+ this.discard = new EventEmitter();
17
+ this.save = new EventEmitter();
18
+ this.saveOptionChange = new EventEmitter();
19
+ this.stepLabelChange = new EventEmitter();
20
+ this.removeStep = new EventEmitter();
21
+ this.reorderSteps = new EventEmitter();
22
+ }
23
+ onBackdropClick(event) {
24
+ const target = event.target;
25
+ const currentTarget = event.currentTarget;
26
+ if (target === currentTarget || target.classList.contains('cqa-review-recorded-steps-backdrop')) {
27
+ this.onClose();
28
+ }
29
+ }
30
+ onClose() {
31
+ this.closeModal.emit();
32
+ }
33
+ onDiscard() {
34
+ this.discard.emit();
35
+ }
36
+ onSave() {
37
+ if (!this.saveButtonDisabled) {
38
+ this.save.emit();
39
+ }
40
+ }
41
+ onSaveOptionChange(value) {
42
+ this.saveOption = value;
43
+ this.saveOptionChange.emit(value);
44
+ }
45
+ onStepLabelChange(id, label) {
46
+ this.stepLabelChange.emit({ id, label });
47
+ }
48
+ onRemoveStep(id, event) {
49
+ event.preventDefault();
50
+ event.stopPropagation();
51
+ this.removeStep.emit(id);
52
+ }
53
+ onDndDrop(event) {
54
+ if (event.data == null || event.index == null)
55
+ return;
56
+ const droppedStep = event.data;
57
+ let dropIndex = event.index;
58
+ const currentIndex = this.steps.findIndex((s) => s.id === droppedStep.id);
59
+ if (currentIndex < 0)
60
+ return;
61
+ if (currentIndex === dropIndex)
62
+ return;
63
+ const newSteps = [...this.steps];
64
+ newSteps.splice(currentIndex, 1);
65
+ if (currentIndex < dropIndex)
66
+ dropIndex--;
67
+ newSteps.splice(dropIndex, 0, droppedStep);
68
+ this.reorderSteps.emit(newSteps);
69
+ }
70
+ onEscape() {
71
+ if (this.isOpen) {
72
+ this.onClose();
73
+ }
74
+ }
75
+ trackByStepId(_index, step) {
76
+ return step.id;
77
+ }
78
+ }
79
+ ReviewRecordedStepsModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ReviewRecordedStepsModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
80
+ ReviewRecordedStepsModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ReviewRecordedStepsModalComponent, selector: "cqa-review-recorded-steps-modal", inputs: { isOpen: "isOpen", title: "title", steps: "steps", saveOption: "saveOption", saveButtonDisabled: "saveButtonDisabled" }, outputs: { closeModal: "closeModal", discard: "discard", save: "save", saveOptionChange: "saveOptionChange", stepLabelChange: "stepLabelChange", removeStep: "removeStep", reorderSteps: "reorderSteps" }, host: { listeners: { "document:keydown.escape": "onEscape()" }, classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div\n *ngIf=\"isOpen\"\n class=\"cqa-review-recorded-steps-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"review-recorded-steps-title\"\n aria-describedby=\"review-recorded-steps-content\">\n <div\n class=\"cqa-rounded-xl cqa-bg-[#FBFCFF] cqa-border cqa-border-[#E5E5E5] cqa-w-full cqa-max-w-[499px] cqa-max-h-[90vh] cqa-overflow-hidden cqa-flex cqa-flex-col cqa-shadow-[0_4px_6px_-1px_#00000040,0_2px_4px_-2px_#00000040]\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-4 cqa-pb-4\" style=\"border-bottom: 1px solid #E5E7EB\">\n <h2\n id=\"review-recorded-steps-title\"\n class=\"cqa-text-[16px] cqa-font-semibold cqa-leading-7 cqa-text-gray-800 cqa-m-0\">\n {{ title }}\n </h2>\n <cqa-button\n type=\"button\"\n variant=\"text\"\n btnSize=\"md\"\n icon=\"close\"\n iconColor=\"#4A5565\"\n [tooltip]=\"'Close'\"\n tooltipPosition=\"below\"\n customClass=\"!cqa-min-w-0 cqa-p-1\"\n (clicked)=\"onClose()\">\n </cqa-button>\n </div>\n\n <!-- Content -->\n <div id=\"review-recorded-steps-content\" class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-6 cqa-py-4 cqa-flex cqa-flex-col cqa-gap-5\">\n\n <!-- Alert: Recording Finished -->\n <div class=\"cqa-flex cqa-items-start cqa-gap-3 cqa-px-4 cqa-py-3 cqa-bg-[#EFF6FF] cqa-border cqa-border-[#DBEAFE] cqa-rounded-lg\">\n <mat-icon fontSet=\"material-symbols-outlined\" class=\"cqa-flex-shrink-0 cqa-w-6 cqa-h-5 cqa-text-[#1E40AF] cqa-text-xl\" aria-hidden=\"true\">videocam</mat-icon>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-w-0\">\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#1E40AF]\">Recording Finished</span>\n <p class=\"cqa-text-xs cqa-font-normal cqa-text-[#1E40AF] cqa-m-0\">\n Review the steps captured below before adding them to your test. You can rename, delete, or reorder them.\n </p>\n </div>\n </div>\n\n <!-- Recorded steps list -->\n <section class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0\" aria-labelledby=\"recorded-steps-heading\">\n <h3 id=\"recorded-steps-heading\" class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900 cqa-m-0 cqa-sr-only\">Recorded steps</h3>\n <div\n class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[240px] cqa-overflow-y-auto cqa-min-h-0\"\n [dndDropzone]=\"['recorded-step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"cqa-opacity-70\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"cqa-rounded-lg cqa-border cqa-border-dashed cqa-border-[#E5E7EB] cqa-p-2 cqa-min-h-[44px] cqa-bg-[#F3F4F6]\"></div>\n <div\n *ngFor=\"let step of steps; let i = index; trackBy: trackByStepId\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-rounded-lg cqa-p-2 cqa-bg-[#F9FAFB] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\"\n [dndDraggable]=\"step\"\n [dndDisableIf]=\"steps.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"recorded-step\">\n <span dndHandle class=\"cqa-flex-shrink-0 cqa-text-[#9CA3AF] cqa-cursor-grab cqa-p-1 active:cqa-cursor-grabbing\" aria-hidden=\"true\" title=\"Drag to reorder\">\n <mat-icon class=\"cqa-w-5 cqa-h-5 cqa-text-[20px] cqa-block cqa-leading-none\">drag_indicator</mat-icon>\n </span>\n <span class=\"cqa-flex-shrink-0 cqa-text-[12px] cqa-text-[#9CA3AF]\">{{ i + 1 }}</span>\n <span class=\"cqa-flex-1 cqa-min-w-0 cqa-text-sm cqa-font-normal cqa-text-gray-800 cqa-truncate\">{{ step.label || 'Step' }}</span>\n <!-- <cqa-custom-input\n [value]=\"step.label\"\n [placeholder]=\"'Step name'\"\n [fullWidth]=\"true\"\n size=\"md\"\n (valueChange)=\"onStepLabelChange(step.id, $event)\">\n </cqa-custom-input>\n <cqa-button\n type=\"button\"\n variant=\"text\"\n btnSize=\"md\"\n icon=\"delete_outline\"\n iconColor=\"#99999E\"\n [tooltip]=\"'Remove step'\"\n tooltipPosition=\"below\"\n customClass=\"cqa-shrink-0\"\n (clicked)=\"onRemoveStep(step.id, $event)\">\n </cqa-button> -->\n </div>\n </div>\n </section>\n\n <!-- Save option -->\n <section class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-rounded-lg cqa-p-4\" aria-labelledby=\"save-option-heading\">\n <h3 id=\"save-option-heading\" class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900 cqa-m-0\">Save option</h3>\n <mat-radio-group\n [value]=\"saveOption\"\n (change)=\"onSaveOptionChange($any($event).value)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <label class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-cursor-pointer\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-radio-button value=\"run_only\" color=\"primary\"></mat-radio-button>\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Save for this run only</span>\n </span>\n <span class=\"cqa-text-sm cqa-font-normal cqa-text-gray-500 cqa-pl-6\">Changes will be reverted after this debug session</span>\n </label>\n <label class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-cursor-pointer\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-radio-button value=\"test_case\" color=\"primary\"></mat-radio-button>\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Save to test case</span>\n </span>\n <span class=\"cqa-text-sm cqa-font-normal cqa-text-gray-500 cqa-pl-6\">Changes will be permanently saved</span>\n </label>\n </mat-radio-group>\n </section>\n </div>\n\n <!-- Footer -->\n <div class=\"cqa-px-6 cqa-pb-6 cqa-border-t cqa-border-gray-200 cqa-grid cqa-grid-cols-2 cqa-gap-3 cqa-w-full\">\n <cqa-button\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"lg\"\n [text]=\"'Discard'\"\n [fullWidth]=\"true\"\n customClass=\"cqa-w-full cqa-bg-white cqa-border cqa-border-[#414146] cqa-text-[#414146] cqa-rounded-lg hover:cqa-bg-gray-50\"\n (clicked)=\"onDiscard()\">\n </cqa-button>\n <cqa-button\n type=\"button\"\n variant=\"filled\"\n btnSize=\"lg\"\n [text]=\"'Save'\"\n [disabled]=\"saveButtonDisabled\"\n [fullWidth]=\"true\"\n customClass=\"cqa-w-full cqa-bg-[#4F46E5] cqa-border-[#4F46E5] cqa-text-white cqa-rounded-lg\"\n (clicked)=\"onSave()\">\n </cqa-button>\n </div>\n </div>\n</div>\n", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i5.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { type: i5.DndHandleDirective, selector: "[dndHandle]" }, { type: i3.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }] });
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ReviewRecordedStepsModalComponent, decorators: [{
82
+ type: Component,
83
+ args: [{ selector: 'cqa-review-recorded-steps-modal', host: { class: 'cqa-ui-root' }, template: "<div\n *ngIf=\"isOpen\"\n class=\"cqa-review-recorded-steps-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"review-recorded-steps-title\"\n aria-describedby=\"review-recorded-steps-content\">\n <div\n class=\"cqa-rounded-xl cqa-bg-[#FBFCFF] cqa-border cqa-border-[#E5E5E5] cqa-w-full cqa-max-w-[499px] cqa-max-h-[90vh] cqa-overflow-hidden cqa-flex cqa-flex-col cqa-shadow-[0_4px_6px_-1px_#00000040,0_2px_4px_-2px_#00000040]\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-4 cqa-pb-4\" style=\"border-bottom: 1px solid #E5E7EB\">\n <h2\n id=\"review-recorded-steps-title\"\n class=\"cqa-text-[16px] cqa-font-semibold cqa-leading-7 cqa-text-gray-800 cqa-m-0\">\n {{ title }}\n </h2>\n <cqa-button\n type=\"button\"\n variant=\"text\"\n btnSize=\"md\"\n icon=\"close\"\n iconColor=\"#4A5565\"\n [tooltip]=\"'Close'\"\n tooltipPosition=\"below\"\n customClass=\"!cqa-min-w-0 cqa-p-1\"\n (clicked)=\"onClose()\">\n </cqa-button>\n </div>\n\n <!-- Content -->\n <div id=\"review-recorded-steps-content\" class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-6 cqa-py-4 cqa-flex cqa-flex-col cqa-gap-5\">\n\n <!-- Alert: Recording Finished -->\n <div class=\"cqa-flex cqa-items-start cqa-gap-3 cqa-px-4 cqa-py-3 cqa-bg-[#EFF6FF] cqa-border cqa-border-[#DBEAFE] cqa-rounded-lg\">\n <mat-icon fontSet=\"material-symbols-outlined\" class=\"cqa-flex-shrink-0 cqa-w-6 cqa-h-5 cqa-text-[#1E40AF] cqa-text-xl\" aria-hidden=\"true\">videocam</mat-icon>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-w-0\">\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#1E40AF]\">Recording Finished</span>\n <p class=\"cqa-text-xs cqa-font-normal cqa-text-[#1E40AF] cqa-m-0\">\n Review the steps captured below before adding them to your test. You can rename, delete, or reorder them.\n </p>\n </div>\n </div>\n\n <!-- Recorded steps list -->\n <section class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0\" aria-labelledby=\"recorded-steps-heading\">\n <h3 id=\"recorded-steps-heading\" class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900 cqa-m-0 cqa-sr-only\">Recorded steps</h3>\n <div\n class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[240px] cqa-overflow-y-auto cqa-min-h-0\"\n [dndDropzone]=\"['recorded-step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"cqa-opacity-70\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"cqa-rounded-lg cqa-border cqa-border-dashed cqa-border-[#E5E7EB] cqa-p-2 cqa-min-h-[44px] cqa-bg-[#F3F4F6]\"></div>\n <div\n *ngFor=\"let step of steps; let i = index; trackBy: trackByStepId\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-rounded-lg cqa-p-2 cqa-bg-[#F9FAFB] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\"\n [dndDraggable]=\"step\"\n [dndDisableIf]=\"steps.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"recorded-step\">\n <span dndHandle class=\"cqa-flex-shrink-0 cqa-text-[#9CA3AF] cqa-cursor-grab cqa-p-1 active:cqa-cursor-grabbing\" aria-hidden=\"true\" title=\"Drag to reorder\">\n <mat-icon class=\"cqa-w-5 cqa-h-5 cqa-text-[20px] cqa-block cqa-leading-none\">drag_indicator</mat-icon>\n </span>\n <span class=\"cqa-flex-shrink-0 cqa-text-[12px] cqa-text-[#9CA3AF]\">{{ i + 1 }}</span>\n <span class=\"cqa-flex-1 cqa-min-w-0 cqa-text-sm cqa-font-normal cqa-text-gray-800 cqa-truncate\">{{ step.label || 'Step' }}</span>\n <!-- <cqa-custom-input\n [value]=\"step.label\"\n [placeholder]=\"'Step name'\"\n [fullWidth]=\"true\"\n size=\"md\"\n (valueChange)=\"onStepLabelChange(step.id, $event)\">\n </cqa-custom-input>\n <cqa-button\n type=\"button\"\n variant=\"text\"\n btnSize=\"md\"\n icon=\"delete_outline\"\n iconColor=\"#99999E\"\n [tooltip]=\"'Remove step'\"\n tooltipPosition=\"below\"\n customClass=\"cqa-shrink-0\"\n (clicked)=\"onRemoveStep(step.id, $event)\">\n </cqa-button> -->\n </div>\n </div>\n </section>\n\n <!-- Save option -->\n <section class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-rounded-lg cqa-p-4\" aria-labelledby=\"save-option-heading\">\n <h3 id=\"save-option-heading\" class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900 cqa-m-0\">Save option</h3>\n <mat-radio-group\n [value]=\"saveOption\"\n (change)=\"onSaveOptionChange($any($event).value)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <label class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-cursor-pointer\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-radio-button value=\"run_only\" color=\"primary\"></mat-radio-button>\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Save for this run only</span>\n </span>\n <span class=\"cqa-text-sm cqa-font-normal cqa-text-gray-500 cqa-pl-6\">Changes will be reverted after this debug session</span>\n </label>\n <label class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-cursor-pointer\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-radio-button value=\"test_case\" color=\"primary\"></mat-radio-button>\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">Save to test case</span>\n </span>\n <span class=\"cqa-text-sm cqa-font-normal cqa-text-gray-500 cqa-pl-6\">Changes will be permanently saved</span>\n </label>\n </mat-radio-group>\n </section>\n </div>\n\n <!-- Footer -->\n <div class=\"cqa-px-6 cqa-pb-6 cqa-border-t cqa-border-gray-200 cqa-grid cqa-grid-cols-2 cqa-gap-3 cqa-w-full\">\n <cqa-button\n type=\"button\"\n variant=\"outlined\"\n btnSize=\"lg\"\n [text]=\"'Discard'\"\n [fullWidth]=\"true\"\n customClass=\"cqa-w-full cqa-bg-white cqa-border cqa-border-[#414146] cqa-text-[#414146] cqa-rounded-lg hover:cqa-bg-gray-50\"\n (clicked)=\"onDiscard()\">\n </cqa-button>\n <cqa-button\n type=\"button\"\n variant=\"filled\"\n btnSize=\"lg\"\n [text]=\"'Save'\"\n [disabled]=\"saveButtonDisabled\"\n [fullWidth]=\"true\"\n customClass=\"cqa-w-full cqa-bg-[#4F46E5] cqa-border-[#4F46E5] cqa-text-white cqa-rounded-lg\"\n (clicked)=\"onSave()\">\n </cqa-button>\n </div>\n </div>\n</div>\n", styles: [] }]
84
+ }], propDecorators: { isOpen: [{
85
+ type: Input
86
+ }], title: [{
87
+ type: Input
88
+ }], steps: [{
89
+ type: Input
90
+ }], saveOption: [{
91
+ type: Input
92
+ }], saveButtonDisabled: [{
93
+ type: Input
94
+ }], closeModal: [{
95
+ type: Output
96
+ }], discard: [{
97
+ type: Output
98
+ }], save: [{
99
+ type: Output
100
+ }], saveOptionChange: [{
101
+ type: Output
102
+ }], stepLabelChange: [{
103
+ type: Output
104
+ }], removeStep: [{
105
+ type: Output
106
+ }], reorderSteps: [{
107
+ type: Output
108
+ }], onEscape: [{
109
+ type: HostListener,
110
+ args: ['document:keydown.escape']
111
+ }] } });
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2aWV3LXJlY29yZGVkLXN0ZXBzLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9yZXZpZXctcmVjb3JkZWQtc3RlcHMtbW9kYWwvcmV2aWV3LXJlY29yZGVkLXN0ZXBzLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9yZXZpZXctcmVjb3JkZWQtc3RlcHMtbW9kYWwvcmV2aWV3LXJlY29yZGVkLXN0ZXBzLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBZ0JyRixNQUFNLE9BQU8saUNBQWlDO0lBTjlDO1FBT1csV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixVQUFLLEdBQVcsdUJBQXVCLENBQUM7UUFDeEMsVUFBSyxHQUF1QixFQUFFLENBQUM7UUFDL0IsZUFBVSxHQUFlLFVBQVUsQ0FBQztRQUNwQyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFFbkMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDdEMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbkMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDaEMscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUNsRCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDO1FBQ3BFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7S0FnRWpFO0lBOURDLGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixNQUFNLE1BQU0sR0FB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Q0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBdURQLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEbmREcm9wRXZlbnQgfSBmcm9tICduZ3gtZHJhZy1kcm9wJztcblxuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlZFN0ZXBJdGVtIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2F2ZU9wdGlvbiA9ICdydW5fb25seScgfCAndGVzdF9jYXNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXJldmlldy1yZWNvcmRlZC1zdGVwcy1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXZpZXctcmVjb3JkZWQtc3RlcHMtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG59KVxuZXhwb3J0IGNsYXNzIFJldmlld1JlY29yZGVkU3RlcHNNb2RhbENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ1JldmlldyBSZWNvcmRlZCBTdGVwcyc7XG4gIEBJbnB1dCgpIHN0ZXBzOiBSZWNvcmRlZFN0ZXBJdGVtW10gPSBbXTtcbiAgQElucHV0KCkgc2F2ZU9wdGlvbjogU2F2ZU9wdGlvbiA9ICdydW5fb25seSc7XG4gIEBJbnB1dCgpIHNhdmVCdXR0b25EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBjbG9zZU1vZGFsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZGlzY2FyZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzYXZlT3B0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTYXZlT3B0aW9uPigpO1xuICBAT3V0cHV0KCkgc3RlcExhYmVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIHJlbW92ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJlb3JkZXJTdGVwcyA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkZWRTdGVwSXRlbVtdPigpO1xuXG4gIG9uQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0ID09PSBjdXJyZW50VGFyZ2V0IHx8IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2NxYS1yZXZpZXctcmVjb3JkZWQtc3RlcHMtYmFja2Ryb3AnKSkge1xuICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlTW9kYWwuZW1pdCgpO1xuICB9XG5cbiAgb25EaXNjYXJkKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY2FyZC5lbWl0KCk7XG4gIH1cblxuICBvblNhdmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNhdmVCdXR0b25EaXNhYmxlZCkge1xuICAgICAgdGhpcy5zYXZlLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBvblNhdmVPcHRpb25DaGFuZ2UodmFsdWU6IFNhdmVPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNhdmVPcHRpb24gPSB2YWx1ZTtcbiAgICB0aGlzLnNhdmVPcHRpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvblN0ZXBMYWJlbENoYW5nZShpZDogc3RyaW5nLCBsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdGVwTGFiZWxDaGFuZ2UuZW1pdCh7IGlkLCBsYWJlbCB9KTtcbiAgfVxuXG4gIG9uUmVtb3ZlU3RlcChpZDogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVtb3ZlU3RlcC5lbWl0KGlkKTtcbiAgfVxuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmRhdGEgPT0gbnVsbCB8fCBldmVudC5pbmRleCA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgZHJvcHBlZFN0ZXAgPSBldmVudC5kYXRhIGFzIFJlY29yZGVkU3RlcEl0ZW07XG4gICAgbGV0IGRyb3BJbmRleCA9IGV2ZW50LmluZGV4O1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuc3RlcHMuZmluZEluZGV4KChzKSA9PiBzLmlkID09PSBkcm9wcGVkU3RlcC5pZCk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHJldHVybjtcbiAgICBpZiAoY3VycmVudEluZGV4ID09PSBkcm9wSW5kZXgpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld1N0ZXBzID0gWy4uLnRoaXMuc3RlcHNdO1xuICAgIG5ld1N0ZXBzLnNwbGljZShjdXJyZW50SW5kZXgsIDEpO1xuICAgIGlmIChjdXJyZW50SW5kZXggPCBkcm9wSW5kZXgpIGRyb3BJbmRleC0tO1xuICAgIG5ld1N0ZXBzLnNwbGljZShkcm9wSW5kZXgsIDAsIGRyb3BwZWRTdGVwKTtcbiAgICB0aGlzLnJlb3JkZXJTdGVwcy5lbWl0KG5ld1N0ZXBzKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5U3RlcElkKF9pbmRleDogbnVtYmVyLCBzdGVwOiBSZWNvcmRlZFN0ZXBJdGVtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RlcC5pZDtcbiAgfVxufVxuIiwiPGRpdlxuICAqbmdJZj1cImlzT3BlblwiXG4gIGNsYXNzPVwiY3FhLXJldmlldy1yZWNvcmRlZC1zdGVwcy1iYWNrZHJvcCBjcWEtZml4ZWQgY3FhLWluc2V0LTAgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS16LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIlxuICAoY2xpY2spPVwib25CYWNrZHJvcENsaWNrKCRldmVudClcIlxuICByb2xlPVwiZGlhbG9nXCJcbiAgYXJpYS1tb2RhbD1cInRydWVcIlxuICBhcmlhLWxhYmVsbGVkYnk9XCJyZXZpZXctcmVjb3JkZWQtc3RlcHMtdGl0bGVcIlxuICBhcmlhLWRlc2NyaWJlZGJ5PVwicmV2aWV3LXJlY29yZGVkLXN0ZXBzLWNvbnRlbnRcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLXJvdW5kZWQteGwgY3FhLWJnLVsjRkJGQ0ZGXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS13LWZ1bGwgY3FhLW1heC13LVs0OTlweF0gY3FhLW1heC1oLVs5MHZoXSBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtc2hhZG93LVswXzRweF82cHhfLTFweF8jMDAwMDAwNDAsMF8ycHhfNHB4Xy0ycHhfIzAwMDAwMDQwXVwiXG4gICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuXG4gICAgPCEtLSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtNiBjcWEtcHQtNCBjcWEtcGItNFwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU3RUJcIj5cbiAgICAgIDxoMlxuICAgICAgICBpZD1cInJldmlldy1yZWNvcmRlZC1zdGVwcy10aXRsZVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLTcgY3FhLXRleHQtZ3JheS04MDAgY3FhLW0tMFwiPlxuICAgICAgICB7eyB0aXRsZSB9fVxuICAgICAgPC9oMj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB2YXJpYW50PVwidGV4dFwiXG4gICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgIGljb25Db2xvcj1cIiM0QTU1NjVcIlxuICAgICAgICBbdG9vbHRpcF09XCInQ2xvc2UnXCJcbiAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICBjdXN0b21DbGFzcz1cIiFjcWEtbWluLXctMCBjcWEtcC0xXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DbG9zZSgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENvbnRlbnQgLS0+XG4gICAgPGRpdiBpZD1cInJldmlldy1yZWNvcmRlZC1zdGVwcy1jb250ZW50XCIgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLXB4LTYgY3FhLXB5LTQgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNVwiPlxuXG4gICAgICA8IS0tIEFsZXJ0OiBSZWNvcmRpbmcgRmluaXNoZWQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMyBjcWEtcHgtNCBjcWEtcHktMyBjcWEtYmctWyNFRkY2RkZdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0RCRUFGRV0gY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtdy02IGNxYS1oLTUgY3FhLXRleHQtWyMxRTQwQUZdIGNxYS10ZXh0LXhsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+dmlkZW9jYW08L21hdC1pY29uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxRTQwQUZdXCI+UmVjb3JkaW5nIEZpbmlzaGVkPC9zcGFuPlxuICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMUU0MEFGXSBjcWEtbS0wXCI+XG4gICAgICAgICAgICBSZXZpZXcgdGhlIHN0ZXBzIGNhcHR1cmVkIGJlbG93IGJlZm9yZSBhZGRpbmcgdGhlbSB0byB5b3VyIHRlc3QuIFlvdSBjYW4gcmVuYW1lLCBkZWxldGUsIG9yIHJlb3JkZXIgdGhlbS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUmVjb3JkZWQgc3RlcHMgbGlzdCAtLT5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLWgtMFwiIGFyaWEtbGFiZWxsZWRieT1cInJlY29yZGVkLXN0ZXBzLWhlYWRpbmdcIj5cbiAgICAgICAgPGgzIGlkPVwicmVjb3JkZWQtc3RlcHMtaGVhZGluZ1wiIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktOTAwIGNxYS1tLTAgY3FhLXNyLW9ubHlcIj5SZWNvcmRlZCBzdGVwczwvaDM+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1heC1oLVsyNDBweF0gY3FhLW92ZXJmbG93LXktYXV0byBjcWEtbWluLWgtMFwiXG4gICAgICAgICAgW2RuZERyb3B6b25lXT1cIlsncmVjb3JkZWQtc3RlcCddXCJcbiAgICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICAgZG5kRHJhZ292ZXJDbGFzcz1cImNxYS1vcGFjaXR5LTcwXCJcbiAgICAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJjcWEtcm91bmRlZC1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1wLTIgY3FhLW1pbi1oLVs0NHB4XSBjcWEtYmctWyNGM0Y0RjZdXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlTdGVwSWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcm91bmRlZC1sZyBjcWEtcC0yIGNxYS1iZy1bI0Y5RkFGQl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdXCJcbiAgICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwic3RlcFwiXG4gICAgICAgICAgICBbZG5kRGlzYWJsZUlmXT1cInN0ZXBzLmxlbmd0aCA8PSAxXCJcbiAgICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgIGRuZFR5cGU9XCJyZWNvcmRlZC1zdGVwXCI+XG4gICAgICAgICAgICA8c3BhbiBkbmRIYW5kbGUgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLWN1cnNvci1ncmFiIGNxYS1wLTEgYWN0aXZlOmNxYS1jdXJzb3ItZ3JhYmJpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkRyYWcgdG8gcmVvcmRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXRleHQtWzIwcHhdIGNxYS1ibG9jayBjcWEtbGVhZGluZy1ub25lXCI+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM5Q0EzQUZdXCI+e3sgaSArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTAgY3FhLXRleHQtc20gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LWdyYXktODAwIGNxYS10cnVuY2F0ZVwiPnt7IHN0ZXAubGFiZWwgfHwgJ1N0ZXAnIH19PC9zcGFuPlxuICAgICAgICAgICAgPCEtLSA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICBbdmFsdWVdPVwic3RlcC5sYWJlbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU3RlcCBuYW1lJ1wiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblN0ZXBMYWJlbENoYW5nZShzdGVwLmlkLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdmFyaWFudD1cInRleHRcIlxuICAgICAgICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICAgICAgICBpY29uPVwiZGVsZXRlX291dGxpbmVcIlxuICAgICAgICAgICAgICBpY29uQ29sb3I9XCIjOTk5OTlFXCJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlbW92ZSBzdGVwJ1wiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtc2hyaW5rLTBcIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvblJlbW92ZVN0ZXAoc3RlcC5pZCwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPiAtLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NlY3Rpb24+XG5cbiAgICAgIDwhLS0gU2F2ZSBvcHRpb24gLS0+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTRcIiBhcmlhLWxhYmVsbGVkYnk9XCJzYXZlLW9wdGlvbi1oZWFkaW5nXCI+XG4gICAgICAgIDxoMyBpZD1cInNhdmUtb3B0aW9uLWhlYWRpbmdcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTkwMCBjcWEtbS0wXCI+U2F2ZSBvcHRpb248L2gzPlxuICAgICAgICA8bWF0LXJhZGlvLWdyb3VwXG4gICAgICAgICAgW3ZhbHVlXT1cInNhdmVPcHRpb25cIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25TYXZlT3B0aW9uQ2hhbmdlKCRhbnkoJGV2ZW50KS52YWx1ZSlcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwicnVuX29ubHlcIiBjb2xvcj1cInByaW1hcnlcIj48L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktOTAwXCI+U2F2ZSBmb3IgdGhpcyBydW4gb25seTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LWdyYXktNTAwIGNxYS1wbC02XCI+Q2hhbmdlcyB3aWxsIGJlIHJldmVydGVkIGFmdGVyIHRoaXMgZGVidWcgc2Vzc2lvbjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwidGVzdF9jYXNlXCIgY29sb3I9XCJwcmltYXJ5XCI+PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTkwMFwiPlNhdmUgdG8gdGVzdCBjYXNlPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtZ3JheS01MDAgY3FhLXBsLTZcIj5DaGFuZ2VzIHdpbGwgYmUgcGVybWFuZW50bHkgc2F2ZWQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEZvb3RlciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXB4LTYgY3FhLXBiLTYgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZ3JheS0yMDAgY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtMyBjcWEtdy1mdWxsXCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgYnRuU2l6ZT1cImxnXCJcbiAgICAgICAgW3RleHRdPVwiJ0Rpc2NhcmQnXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgY3VzdG9tQ2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM0MTQxNDZdIGNxYS10ZXh0LVsjNDE0MTQ2XSBjcWEtcm91bmRlZC1sZyBob3ZlcjpjcWEtYmctZ3JheS01MFwiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRGlzY2FyZCgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICAgIGJ0blNpemU9XCJsZ1wiXG4gICAgICAgIFt0ZXh0XT1cIidTYXZlJ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJzYXZlQnV0dG9uRGlzYWJsZWRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBjdXN0b21DbGFzcz1cImNxYS13LWZ1bGwgY3FhLWJnLVsjNEY0NkU1XSBjcWEtYm9yZGVyLVsjNEY0NkU1XSBjcWEtdGV4dC13aGl0ZSBjcWEtcm91bmRlZC1sZ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uU2F2ZSgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=