@cqa-lib/cqa-ui 1.1.502 → 1.1.504
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.
- package/esm2020/lib/test-case-details/ai-agent-step/ai-agent-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/ai-verify-step/ai-verify-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/api-mocking-card/api-mocking-card.component.mjs +41 -33
- package/esm2020/lib/test-case-details/api-step/api-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/custom-code-step/custom-code-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/database-step/database-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/restore-session-step/restore-session-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/screenshot-step/screenshot-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/scroll-step/scroll-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +3 -3
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +33 -6
- package/esm2020/lib/test-case-details/test-case-details.component.mjs +12 -4
- package/esm2020/lib/test-case-details/upload-step/upload-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/verify-url-step/verify-url-step.component.mjs +3 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +112 -69
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +112 -69
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/test-case-details/api-mocking-card/api-mocking-card.component.d.ts +23 -28
- package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +16 -9
- package/lib/test-case-details/test-case-details.component.d.ts +6 -2
- package/package.json +1 -1
|
@@ -55,6 +55,8 @@ export class TestCaseDetailsComponent {
|
|
|
55
55
|
* The two legacy `*CaptureEnabled` / `*RenewEnabled` inputs are no longer used.
|
|
56
56
|
*/
|
|
57
57
|
this.apiMockingRestoreMock = false;
|
|
58
|
+
/** "Renew and store API responses" — mutually exclusive with `apiMockingRestoreMock` when true. */
|
|
59
|
+
this.apiMockingStoreMock = false;
|
|
58
60
|
this.apiMockingMockedApisCount = 0;
|
|
59
61
|
this.apiMockingTotalApisCount = 0;
|
|
60
62
|
this.apiMockingProgressPercent = 0;
|
|
@@ -77,8 +79,10 @@ export class TestCaseDetailsComponent {
|
|
|
77
79
|
this.selectionChange = new EventEmitter();
|
|
78
80
|
this.labelAdded = new EventEmitter();
|
|
79
81
|
this.configureApiMocking = new EventEmitter();
|
|
80
|
-
/** Fired when the user flips
|
|
82
|
+
/** Fired when the user flips the Use-mock toggle — emits the new `restoreMock` value. */
|
|
81
83
|
this.apiMockingRestoreMockChange = new EventEmitter();
|
|
84
|
+
/** Fired when the user flips the Renew-and-store toggle — emits the new `storeMock` value. */
|
|
85
|
+
this.apiMockingStoreMockChange = new EventEmitter();
|
|
82
86
|
}
|
|
83
87
|
/** Resolved editing state: parent-controlled or internal */
|
|
84
88
|
get isEditing() {
|
|
@@ -171,10 +175,10 @@ export class TestCaseDetailsComponent {
|
|
|
171
175
|
}
|
|
172
176
|
}
|
|
173
177
|
TestCaseDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
174
|
-
TestCaseDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsComponent, selector: "cqa-test-case-details", inputs: { editing: "editing", startInEditMode: "startInEditMode", descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", showEditButton: "showEditButton", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides", isSaving: "isSaving", showApiMockingCard: "showApiMockingCard", apiMockingTitle: "apiMockingTitle", apiMockingStatusLabel: "apiMockingStatusLabel", apiMockingCaptureLabel: "apiMockingCaptureLabel", apiMockingRenewLabel: "apiMockingRenewLabel", apiMockingCaptureHint: "apiMockingCaptureHint", apiMockingRenewHint: "apiMockingRenewHint", apiMockingRestoreMock: "apiMockingRestoreMock", apiMockingMockedApisCount: "apiMockingMockedApisCount", apiMockingTotalApisCount: "apiMockingTotalApisCount", apiMockingProgressPercent: "apiMockingProgressPercent", apiMockingShowProgress: "apiMockingShowProgress", apiMockingSummaryText: "apiMockingSummaryText", apiMockingPercentText: "apiMockingPercentText", apiMockingConfigureButtonLabel: "apiMockingConfigureButtonLabel" }, outputs: { editDescription: "editDescription", cancel: "cancel", saveChanges: "saveChanges", metadataLinkClick: "metadataLinkClick", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded", configureApiMocking: "configureApiMocking", apiMockingRestoreMockChange: "apiMockingRestoreMockChange" }, usesOnChanges: true, ngImport: i0, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [isSaving]=\"isSaving\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [showApiMockingCard]=\"showApiMockingCard\"\n [apiMockingTitle]=\"apiMockingTitle\"\n [apiMockingStatusLabel]=\"apiMockingStatusLabel\"\n [apiMockingCaptureLabel]=\"apiMockingCaptureLabel\"\n [apiMockingCaptureHint]=\"apiMockingCaptureHint\"\n [apiMockingRenewLabel]=\"apiMockingRenewLabel\"\n [apiMockingRenewHint]=\"apiMockingRenewHint\"\n [apiMockingRestoreMock]=\"apiMockingRestoreMock\"\n [apiMockingMockedApisCount]=\"apiMockingMockedApisCount\"\n [apiMockingTotalApisCount]=\"apiMockingTotalApisCount\"\n [apiMockingProgressPercent]=\"apiMockingProgressPercent\"\n [apiMockingShowProgress]=\"apiMockingShowProgress\"\n [apiMockingSummaryText]=\"apiMockingSummaryText\"\n [apiMockingPercentText]=\"apiMockingPercentText\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\"\n (apiMockingRestoreMockChange)=\"apiMockingRestoreMockChange.emit($event)\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-rounded !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[#6B7280] cqa-text-xs cqa-font-semibold cqa-cursor-pointer cqa-transition-all hover:cqa-text-[#374151] hover:!cqa-border-[#9CA3AF] hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"!cqa-w-[14px] !cqa-h-[14px] !cqa-text-[14px]\">edit</mat-icon>\n <span>Edit</span>\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-1\">\n <div\n *ngIf=\"enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\"\n [innerHTML]=\"descriptionContent\"></div>\n <div\n *ngIf=\"!enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\">{{ descriptionContent }}</div>\n <button\n *ngIf=\"showDescriptionReadMore\"\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-xs cqa-font-medium hover:cqa-underline cqa-cursor-pointer cqa-bg-transparent cqa-border-none cqa-p-0 cqa-self-start focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"toggleDescriptionExpand()\">\n {{ descriptionExpanded ? 'Read less' : 'Read more' }}\n </button>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n <!-- API Mocking Card (read-only) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [restoreMock]=\"apiMockingRestoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [configureButtonLabel]=\"apiMockingConfigureButtonLabel\"\n [editing]=\"false\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n</div>\n", components: [{ type: i1.TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: ["descriptionTitle", "descriptionContent", "enableMarkdown", "metadataItems", "labels", "configTitle", "configSections", "configSectionsRow2", "isSaving", "prerequisiteCaseOptions", "platform", "isStepGroup", "selectConfigOverrides", "showApiMockingCard", "apiMockingTitle", "apiMockingStatusLabel", "apiMockingCaptureLabel", "apiMockingCaptureHint", "apiMockingRenewLabel", "apiMockingRenewHint", "apiMockingRestoreMock", "apiMockingMockedApisCount", "apiMockingTotalApisCount", "apiMockingProgressPercent", "apiMockingShowProgress", "apiMockingSummaryText", "apiMockingPercentText"], outputs: ["save", "cancel", "selectSearch", "selectLoadMore", "selectOpened", "selectionChange", "labelAdded", "apiMockingRestoreMockChange"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i4.ConfigurationCardComponent, selector: "cqa-configuration-card", inputs: ["icon", "title", "data"] }, { type: i5.ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: ["title", "statusLabel", "captureLabel", "captureHint", "renewLabel", "renewHint", "restoreMock", "mockedApisCount", "totalApisCount", "progressPercent", "summaryText", "percentText", "configureButtonLabel", "editing", "showProgress", "noDataHint"], outputs: ["configure", "restoreMockChange"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
178
|
+
TestCaseDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsComponent, selector: "cqa-test-case-details", inputs: { editing: "editing", startInEditMode: "startInEditMode", descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", showEditButton: "showEditButton", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides", isSaving: "isSaving", showApiMockingCard: "showApiMockingCard", apiMockingTitle: "apiMockingTitle", apiMockingStatusLabel: "apiMockingStatusLabel", apiMockingCaptureLabel: "apiMockingCaptureLabel", apiMockingRenewLabel: "apiMockingRenewLabel", apiMockingCaptureHint: "apiMockingCaptureHint", apiMockingRenewHint: "apiMockingRenewHint", apiMockingRestoreMock: "apiMockingRestoreMock", apiMockingStoreMock: "apiMockingStoreMock", apiMockingMockedApisCount: "apiMockingMockedApisCount", apiMockingTotalApisCount: "apiMockingTotalApisCount", apiMockingProgressPercent: "apiMockingProgressPercent", apiMockingShowProgress: "apiMockingShowProgress", apiMockingSummaryText: "apiMockingSummaryText", apiMockingPercentText: "apiMockingPercentText", apiMockingConfigureButtonLabel: "apiMockingConfigureButtonLabel" }, outputs: { editDescription: "editDescription", cancel: "cancel", saveChanges: "saveChanges", metadataLinkClick: "metadataLinkClick", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded", configureApiMocking: "configureApiMocking", apiMockingRestoreMockChange: "apiMockingRestoreMockChange", apiMockingStoreMockChange: "apiMockingStoreMockChange" }, usesOnChanges: true, ngImport: i0, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [isSaving]=\"isSaving\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [showApiMockingCard]=\"showApiMockingCard\"\n [apiMockingTitle]=\"apiMockingTitle\"\n [apiMockingStatusLabel]=\"apiMockingStatusLabel\"\n [apiMockingCaptureLabel]=\"apiMockingCaptureLabel\"\n [apiMockingCaptureHint]=\"apiMockingCaptureHint\"\n [apiMockingRenewLabel]=\"apiMockingRenewLabel\"\n [apiMockingRenewHint]=\"apiMockingRenewHint\"\n [apiMockingRestoreMock]=\"apiMockingRestoreMock\"\n [apiMockingStoreMock]=\"apiMockingStoreMock\"\n [apiMockingMockedApisCount]=\"apiMockingMockedApisCount\"\n [apiMockingTotalApisCount]=\"apiMockingTotalApisCount\"\n [apiMockingProgressPercent]=\"apiMockingProgressPercent\"\n [apiMockingShowProgress]=\"apiMockingShowProgress\"\n [apiMockingSummaryText]=\"apiMockingSummaryText\"\n [apiMockingPercentText]=\"apiMockingPercentText\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\"\n (apiMockingRestoreMockChange)=\"apiMockingRestoreMockChange.emit($event)\"\n (apiMockingStoreMockChange)=\"apiMockingStoreMockChange.emit($event)\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-rounded !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[#6B7280] cqa-text-xs cqa-font-semibold cqa-cursor-pointer cqa-transition-all hover:cqa-text-[#374151] hover:!cqa-border-[#9CA3AF] hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"!cqa-w-[14px] !cqa-h-[14px] !cqa-text-[14px]\">edit</mat-icon>\n <span>Edit</span>\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-1\">\n <div\n *ngIf=\"enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\"\n [innerHTML]=\"descriptionContent\"></div>\n <div\n *ngIf=\"!enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\">{{ descriptionContent }}</div>\n <button\n *ngIf=\"showDescriptionReadMore\"\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-xs cqa-font-medium hover:cqa-underline cqa-cursor-pointer cqa-bg-transparent cqa-border-none cqa-p-0 cqa-self-start focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"toggleDescriptionExpand()\">\n {{ descriptionExpanded ? 'Read less' : 'Read more' }}\n </button>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n <!-- API Mocking Card (read-only) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [restoreMock]=\"apiMockingRestoreMock\"\n [storeMock]=\"apiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [configureButtonLabel]=\"apiMockingConfigureButtonLabel\"\n [editing]=\"false\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n</div>\n", components: [{ type: i1.TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: ["descriptionTitle", "descriptionContent", "enableMarkdown", "metadataItems", "labels", "configTitle", "configSections", "configSectionsRow2", "isSaving", "prerequisiteCaseOptions", "platform", "isStepGroup", "selectConfigOverrides", "showApiMockingCard", "apiMockingTitle", "apiMockingStatusLabel", "apiMockingCaptureLabel", "apiMockingCaptureHint", "apiMockingRenewLabel", "apiMockingRenewHint", "apiMockingRestoreMock", "apiMockingStoreMock", "apiMockingMockedApisCount", "apiMockingTotalApisCount", "apiMockingProgressPercent", "apiMockingShowProgress", "apiMockingSummaryText", "apiMockingPercentText"], outputs: ["save", "cancel", "selectSearch", "selectLoadMore", "selectOpened", "selectionChange", "labelAdded", "apiMockingRestoreMockChange", "apiMockingStoreMockChange"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i4.ConfigurationCardComponent, selector: "cqa-configuration-card", inputs: ["icon", "title", "data"] }, { type: i5.ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: ["title", "statusLabel", "captureLabel", "captureHint", "renewLabel", "renewHint", "restoreMock", "storeMock", "mockedApisCount", "totalApisCount", "progressPercent", "summaryText", "percentText", "configureButtonLabel", "editing", "showProgress", "noDataHint"], outputs: ["configure", "restoreMockChange", "storeMockChange"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
175
179
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, decorators: [{
|
|
176
180
|
type: Component,
|
|
177
|
-
args: [{ selector: 'cqa-test-case-details', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [isSaving]=\"isSaving\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [showApiMockingCard]=\"showApiMockingCard\"\n [apiMockingTitle]=\"apiMockingTitle\"\n [apiMockingStatusLabel]=\"apiMockingStatusLabel\"\n [apiMockingCaptureLabel]=\"apiMockingCaptureLabel\"\n [apiMockingCaptureHint]=\"apiMockingCaptureHint\"\n [apiMockingRenewLabel]=\"apiMockingRenewLabel\"\n [apiMockingRenewHint]=\"apiMockingRenewHint\"\n [apiMockingRestoreMock]=\"apiMockingRestoreMock\"\n [apiMockingMockedApisCount]=\"apiMockingMockedApisCount\"\n [apiMockingTotalApisCount]=\"apiMockingTotalApisCount\"\n [apiMockingProgressPercent]=\"apiMockingProgressPercent\"\n [apiMockingShowProgress]=\"apiMockingShowProgress\"\n [apiMockingSummaryText]=\"apiMockingSummaryText\"\n [apiMockingPercentText]=\"apiMockingPercentText\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\"\n (apiMockingRestoreMockChange)=\"apiMockingRestoreMockChange.emit($event)\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-rounded !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[#6B7280] cqa-text-xs cqa-font-semibold cqa-cursor-pointer cqa-transition-all hover:cqa-text-[#374151] hover:!cqa-border-[#9CA3AF] hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"!cqa-w-[14px] !cqa-h-[14px] !cqa-text-[14px]\">edit</mat-icon>\n <span>Edit</span>\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-1\">\n <div\n *ngIf=\"enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\"\n [innerHTML]=\"descriptionContent\"></div>\n <div\n *ngIf=\"!enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\">{{ descriptionContent }}</div>\n <button\n *ngIf=\"showDescriptionReadMore\"\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-xs cqa-font-medium hover:cqa-underline cqa-cursor-pointer cqa-bg-transparent cqa-border-none cqa-p-0 cqa-self-start focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"toggleDescriptionExpand()\">\n {{ descriptionExpanded ? 'Read less' : 'Read more' }}\n </button>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n <!-- API Mocking Card (read-only) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [restoreMock]=\"apiMockingRestoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [configureButtonLabel]=\"apiMockingConfigureButtonLabel\"\n [editing]=\"false\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n</div>\n", styles: [] }]
|
|
181
|
+
args: [{ selector: 'cqa-test-case-details', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [isSaving]=\"isSaving\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [showApiMockingCard]=\"showApiMockingCard\"\n [apiMockingTitle]=\"apiMockingTitle\"\n [apiMockingStatusLabel]=\"apiMockingStatusLabel\"\n [apiMockingCaptureLabel]=\"apiMockingCaptureLabel\"\n [apiMockingCaptureHint]=\"apiMockingCaptureHint\"\n [apiMockingRenewLabel]=\"apiMockingRenewLabel\"\n [apiMockingRenewHint]=\"apiMockingRenewHint\"\n [apiMockingRestoreMock]=\"apiMockingRestoreMock\"\n [apiMockingStoreMock]=\"apiMockingStoreMock\"\n [apiMockingMockedApisCount]=\"apiMockingMockedApisCount\"\n [apiMockingTotalApisCount]=\"apiMockingTotalApisCount\"\n [apiMockingProgressPercent]=\"apiMockingProgressPercent\"\n [apiMockingShowProgress]=\"apiMockingShowProgress\"\n [apiMockingSummaryText]=\"apiMockingSummaryText\"\n [apiMockingPercentText]=\"apiMockingPercentText\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\"\n (apiMockingRestoreMockChange)=\"apiMockingRestoreMockChange.emit($event)\"\n (apiMockingStoreMockChange)=\"apiMockingStoreMockChange.emit($event)\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-rounded !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[#6B7280] cqa-text-xs cqa-font-semibold cqa-cursor-pointer cqa-transition-all hover:cqa-text-[#374151] hover:!cqa-border-[#9CA3AF] hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"!cqa-w-[14px] !cqa-h-[14px] !cqa-text-[14px]\">edit</mat-icon>\n <span>Edit</span>\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-1\">\n <div\n *ngIf=\"enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\"\n [innerHTML]=\"descriptionContent\"></div>\n <div\n *ngIf=\"!enableMarkdown\"\n class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\"\n [style]=\"(!descriptionExpanded && showDescriptionReadMore) ? 'display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;' : ''\">{{ descriptionContent }}</div>\n <button\n *ngIf=\"showDescriptionReadMore\"\n type=\"button\"\n class=\"cqa-text-[#3F43EE] cqa-text-xs cqa-font-medium hover:cqa-underline cqa-cursor-pointer cqa-bg-transparent cqa-border-none cqa-p-0 cqa-self-start focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"toggleDescriptionExpand()\">\n {{ descriptionExpanded ? 'Read less' : 'Read more' }}\n </button>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-[10px] cqa-h-[10px] cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n <!-- API Mocking Card (read-only) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [restoreMock]=\"apiMockingRestoreMock\"\n [storeMock]=\"apiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [configureButtonLabel]=\"apiMockingConfigureButtonLabel\"\n [editing]=\"false\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\n </div>\n </div>\n</div>\n", styles: [] }]
|
|
178
182
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { editing: [{
|
|
179
183
|
type: Input
|
|
180
184
|
}], startInEditMode: [{
|
|
@@ -221,6 +225,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
221
225
|
type: Input
|
|
222
226
|
}], apiMockingRestoreMock: [{
|
|
223
227
|
type: Input
|
|
228
|
+
}], apiMockingStoreMock: [{
|
|
229
|
+
type: Input
|
|
224
230
|
}], apiMockingMockedApisCount: [{
|
|
225
231
|
type: Input
|
|
226
232
|
}], apiMockingTotalApisCount: [{
|
|
@@ -257,5 +263,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
257
263
|
type: Output
|
|
258
264
|
}], apiMockingRestoreMockChange: [{
|
|
259
265
|
type: Output
|
|
266
|
+
}], apiMockingStoreMockChange: [{
|
|
267
|
+
type: Output
|
|
260
268
|
}] } });
|
|
261
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy90ZXN0LWNhc2UtZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEdBS3hCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQWdCdkIsTUFBTSxPQUFPLHdCQUF3QjtJQWVuQyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWQxQywyREFBMkQ7UUFDbkQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUt6Qiw0REFBNEQ7UUFDbkQsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFvQmpDLGdDQUFnQztRQUN2QixxQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFFMUMsK0JBQStCO1FBQ3RCLHVCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUVqQyxzRkFBc0Y7UUFDN0UsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFaEMsZ0VBQWdFO1FBQ3ZELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRWhDLDZGQUE2RjtRQUNwRixrQkFBYSxHQUFrQyxFQUFFLENBQUM7UUFFM0QscURBQXFEO1FBQzVDLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFFL0Isa0NBQWtDO1FBQ3pCLGdCQUFXLEdBQUcsZUFBZSxDQUFDO1FBRXZDLGdFQUFnRTtRQUN2RCxtQkFBYyxHQUFtQyxFQUFFLENBQUM7UUFFN0QsMEZBQTBGO1FBQ2pGLHVCQUFrQixHQUFtQyxFQUFFLENBQUM7UUFDakUsdUZBQXVGO1FBQzlFLGFBQVEsR0FBcUIsS0FBSyxDQUFDO1FBRTVDLGdIQUFnSDtRQUN2RyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUU3QixtRkFBbUY7UUFDMUUsMEJBQXFCLEdBQTBCLEVBQUUsQ0FBQztRQUMzRCwyQ0FBMkM7UUFDbEMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQiw4RUFBOEU7UUFDOUUsOEVBQThFO1FBQ3JFLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixvQkFBZSxHQUFHLGFBQWEsQ0FBQztRQUNoQywwQkFBcUIsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QywyQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztRQUNsRCx5QkFBb0IsR0FBRywrQkFBK0IsQ0FBQztRQUN2RCwwQkFBcUIsR0FBRyxxRUFBcUUsQ0FBQztRQUM5Rix3QkFBbUIsR0FBRyw4REFBOEQsQ0FBQztRQUM5Rjs7Ozs7V0FLRztRQUNNLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5Qiw4QkFBeUIsR0FBRyxDQUFDLENBQUM7UUFDOUIsNkJBQXdCLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLDhCQUF5QixHQUFHLENBQUMsQ0FBQztRQUN2QywyRkFBMkY7UUFDbEYsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBRy9CLG1DQUE4QixHQUFHLFdBQVcsQ0FBQztRQUV0RCx5REFBeUQ7UUFDeEMsb0NBQStCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFeEUsb0dBQW9HO1FBQ3BHLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUU1Qiw0RUFBNEU7UUFDM0QsaUNBQTRCLEdBQUcsR0FBRyxDQUFDO1FBMkIxQyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDM0MsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbEMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBK0IsQ0FBQztRQUM5RCxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBK0IsQ0FBQztRQUNwRSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFrQyxDQUFDO1FBQ2xFLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFDcEUsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUNuRCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFtQyxDQUFDO1FBQ3RFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3hDLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDekQsbUZBQW1GO1FBQ3pFLGdDQUEyQixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUF4SHZCLENBQUM7SUFMOUMsNERBQTREO0lBQzVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDbkUsQ0FBQztJQUlELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztTQUNsQztJQUNILENBQUM7SUF3RUQsSUFBSSx1QkFBdUI7UUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDbEcsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyw0QkFBNEI7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNqRSxnRUFBZ0U7UUFDaEUsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDeEQsT0FBTyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ3JELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxJQUFJLHFCQUFxQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7U0FDM0I7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUM5QixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQzFGLENBQUM7SUFDSixDQUFDO0lBZUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFpQztRQUM3QyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQ3ZCO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGtCQUFrQixDQUFDLEVBQVUsRUFBRSxPQUFxQztRQUNsRSxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUVELG9CQUFvQixDQUFDLEVBQVUsRUFBRSxJQUFpQztRQUNoRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUdELG1CQUFtQixDQUFDLElBQWlDO1FBQ25ELElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBaUM7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDakMsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3hCLEtBQUssUUFBUTtnQkFDWCxPQUFPLGtCQUFrQixDQUFDO1lBQzVCLEtBQUssS0FBSztnQkFDUixPQUFPLGtCQUFrQixDQUFDO1lBQzVCLEtBQUssT0FBTztnQkFDVixPQUFPLGtCQUFrQixDQUFDO1lBQzVCLEtBQUssTUFBTSxDQUFDO1lBQ1o7Z0JBQ0UsT0FBTyxrQkFBa0IsQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRCxxRUFBcUU7SUFDckUsaUJBQWlCLENBQUMsSUFBaUM7UUFDakQsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssRUFBRTtZQUM5QixPQUFPLG9CQUFvQixDQUFDO1NBQzdCO1FBQ0QsT0FBTyxvQkFBb0IsQ0FBQztJQUM5QixDQUFDOztxSEFyTVUsd0JBQXdCO3lHQUF4Qix3QkFBd0IsMnFEQzFCckMsOGpVQWlMQTsyRkR2SmEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHVCQUF1QixtQkFHaEIsdUJBQXVCLENBQUMsTUFBTTt3R0FPdEMsT0FBTztzQkFBZixLQUFLO2dCQUdHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBcUJHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBT0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFvQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFFRywyQkFBMkI7c0JBQXBDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uLFxuICBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0sXG59IGZyb20gJy4vdGVzdC1jYXNlLWRldGFpbHMubW9kZWxzJztcbmltcG9ydCB7XG4gIFRlc3RDYXNlRGV0YWlsc0VkaXRGb3JtRGF0YSxcbiAgU2VsZWN0Q29uZmlnT3ZlcnJpZGVzLFxufSBmcm9tICcuL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLWRldGFpbHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1jYXNlLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VEZXRhaWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogSW50ZXJuYWwgZWRpdGluZyBzdGF0ZSB3aGVuIG5vdCBjb250cm9sbGVkIGJ5IHBhcmVudCAqL1xuICBwcml2YXRlIF9lZGl0aW5nID0gZmFsc2U7XG5cbiAgLyoqIFdoZW4gcHJvdmlkZWQgYnkgcGFyZW50LCB1c2UgdGhpcyBpbnN0ZWFkIG9mIGludGVybmFsIHN0YXRlIChmaXhlcyBTdG9yeWJvb2sgZXZlbnQgZmxvdykuICovXG4gIEBJbnB1dCgpIGVkaXRpbmc/OiBib29sZWFuO1xuXG4gIC8qKiBXaGVuIHRydWUsIHN0YXJ0IGluIGVkaXQgbW9kZSAodXNlZnVsIGZvciBTdG9yeWJvb2spLiAqL1xuICBASW5wdXQoKSBzdGFydEluRWRpdE1vZGUgPSBmYWxzZTtcblxuICAvKiogUmVzb2x2ZWQgZWRpdGluZyBzdGF0ZTogcGFyZW50LWNvbnRyb2xsZWQgb3IgaW50ZXJuYWwgKi9cbiAgZ2V0IGlzRWRpdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nICE9PSB1bmRlZmluZWQgPyB0aGlzLmVkaXRpbmcgOiB0aGlzLl9lZGl0aW5nO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXJ0SW5FZGl0TW9kZSkge1xuICAgICAgdGhpcy5fZWRpdGluZyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkZXNjcmlwdGlvbkNvbnRlbnQnXSkge1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbkV4cGFuZGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIC8qKiBEZXNjcmlwdGlvbiBzZWN0aW9uIHRpdGxlICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uVGl0bGUgPSAnRGVzY3JpcHRpb24nO1xuXG4gIC8qKiBEZXNjcmlwdGlvbiB0ZXh0IGNvbnRlbnQgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb25Db250ZW50ID0gJyc7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgZGVzY3JpcHRpb24gc3VwcG9ydHMgcmljaCB0ZXh0IChIVE1MKS4gUmVuZGVycyBhcyBIVE1MIGluIHZpZXcgbW9kZS4gKi9cbiAgQElucHV0KCkgZW5hYmxlTWFya2Rvd24gPSBmYWxzZTtcblxuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBFZGl0IGJ1dHRvbiBpbiB0aGUgRGVzY3JpcHRpb24gaGVhZGVyICovXG4gIEBJbnB1dCgpIHNob3dFZGl0QnV0dG9uID0gZmFsc2U7XG5cbiAgLyoqIE1ldGFkYXRhIGl0ZW1zIChjcmVhdGVkT24sIHN0YXR1cywgcHJpb3JpdHksIGVudmlyb25tZW50LCB2ZXJzaW9uLCB0ZXN0UGxhbk5hbWUsIGV0Yy4pICovXG4gIEBJbnB1dCgpIG1ldGFkYXRhSXRlbXM6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbVtdID0gW107XG5cbiAgLyoqIExhYmVscy90YWdzIChlLmcuIEF1dG9tYXRpb24sIEFQSSwgU0RLLCBVSS9VWCkgKi9cbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBDb25maWd1cmF0aW9uIHNlY3Rpb24gdGl0bGUgKi9cbiAgQElucHV0KCkgY29uZmlnVGl0bGUgPSAnQ29uZmlndXJhdGlvbic7XG5cbiAgLyoqIENvbmZpZ3VyYXRpb24gc2VjdGlvbnMgKGUuZy4gRXhlY3V0aW9uLCBBSSBDb25maWd1cmF0aW9uKSAqL1xuICBASW5wdXQoKSBjb25maWdTZWN0aW9uczogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdID0gW107XG5cbiAgLyoqIE9wdGlvbmFsIGNvbmZpZyBzZWN0aW9ucyBkaXNwbGF5ZWQgaW4gYSAyLWNvbHVtbiByb3cgKGUuZy4gV2FpdHMgJiBSZXRyaWVzLCBEZXZpY2UpICovXG4gIEBJbnB1dCgpIGNvbmZpZ1NlY3Rpb25zUm93MjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdID0gW107XG4gIC8qKiBQbGF0Zm9ybTogJ3dlYicgb3IgJ21vYmlsZScuIERlZmF1bHRzIHRvICd3ZWInLiBVc2VkIGZvciBEZXZpY2UgU2V0dGluZ3MgZmllbGRzLiAqL1xuICBASW5wdXQoKSBwbGF0Zm9ybTogJ3dlYicgfCAnbW9iaWxlJyA9ICd3ZWInO1xuXG4gIC8qKiBXaGVuIHRydWUsIGZpbHRlcnMgb3V0IFByaW9yaXR5IGFuZCBUeXBlIGZyb20gbWV0YWRhdGEgKHN0ZXAgZ3JvdXBzIGRvbid0IGhhdmUgdGhlc2UpLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgQElucHV0KCkgaXNTdGVwR3JvdXAgPSBmYWxzZTtcblxuICAvKiogT3ZlcnJpZGUgY29uZmlnIHBlciBzZWxlY3QgZm9yIEFQSS1kcml2ZW4gb3B0aW9ucywgc2VydmVyIHNlYXJjaCwgbG9hZCBtb3JlLiAqL1xuICBASW5wdXQoKSBzZWxlY3RDb25maWdPdmVycmlkZXM6IFNlbGVjdENvbmZpZ092ZXJyaWRlcyA9IHt9O1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgc2F2aW5nIGNoYW5nZXMuICovXG4gIEBJbnB1dCgpIGlzU2F2aW5nID0gZmFsc2U7XG5cbiAgLy8g4pSA4pSAIEFQSSBNb2NraW5nIGNhcmQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8qKiBXaGVuIHRydWUsIHJlbmRlciB0aGUgQVBJIE1vY2tpbmcgY2FyZCBiZWxvdyB0aGUgY29uZmlndXJhdGlvbiBzZWN0aW9uLiAqL1xuICBASW5wdXQoKSBzaG93QXBpTW9ja2luZ0NhcmQgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1RpdGxlID0gJ0FQSSBNb2NraW5nJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ1N0YXR1c0xhYmVsID0gJ05vdCBjb25maWd1cmVkJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ0NhcHR1cmVMYWJlbCA9ICdVc2UgbW9jayBBUEkgcmVzcG9uc2VzJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ1JlbmV3TGFiZWwgPSAnUmVuZXcgYW5kIHN0b3JlIEFQSSByZXNwb25zZXMnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nQ2FwdHVyZUhpbnQgPSAnVXNlcyBzdG9yZWQgcmVzcG9uc2VzIG9uIG5leHQgcnVuLiBUdXJuIG9uIGFmdGVyIGNhcHR1cmUgY29tcGxldGVzLic7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZW5ld0hpbnQgPSAnUmUtY2FwdHVyZXMgZnJlc2ggcmVzcG9uc2VzIG9uIG5leHQgcnVuLiBUdXJucyBvZmYgVXNlIG1vY2suJztcbiAgLyoqXG4gICAqIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBBUEkgbW9ja2luZyBjYXJkJ3MgZHVhbCB0b2dnbGUgc3RhdGUuXG4gICAqICAgdHJ1ZSAg4oaSIFJlbmV3IEFQSSByZXNwb25zZXMgT04sICBDYXB0dXJlIEFQSSByZXNwb25zZXMgT0ZGXG4gICAqICAgZmFsc2Ug4oaSIFJlbmV3IEFQSSByZXNwb25zZXMgT0ZGLCBDYXB0dXJlIEFQSSByZXNwb25zZXMgT05cbiAgICogVGhlIHR3byBsZWdhY3kgYCpDYXB0dXJlRW5hYmxlZGAgLyBgKlJlbmV3RW5hYmxlZGAgaW5wdXRzIGFyZSBubyBsb25nZXIgdXNlZC5cbiAgICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZXN0b3JlTW9jayA9IGZhbHNlO1xuICBASW5wdXQoKSBhcGlNb2NraW5nTW9ja2VkQXBpc0NvdW50ID0gMDtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50ID0gMDtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1Byb2dyZXNzUGVyY2VudCA9IDA7XG4gIC8qKiBGb3J3YXJkZWQgdG8gYGNxYS1hcGktbW9ja2luZy1jYXJkYCDigJQgZ2F0ZXMgdGhlIFwiTW9ja2VkIC8gcHJvZ3Jlc3MgLyBwZXJjZW50XCIgYmxvY2suICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdTaG93UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1N1bW1hcnlUZXh0Pzogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlNb2NraW5nUGVyY2VudFRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdDb25maWd1cmVCdXR0b25MYWJlbCA9ICdDb25maWd1cmUnO1xuXG4gIC8qKiBMYWJlbHMgdG8gZmlsdGVyIG91dCBmcm9tIG1ldGFkYXRhIGZvciBzdGVwIGdyb3VwcyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0ZXBHcm91cEV4Y2x1ZGVkTWV0YWRhdGFMYWJlbHMgPSBbJ3ByaW9yaXR5JywgJ3R5cGUnXTtcblxuICAvKiogV2hlbiB0cnVlLCBkZXNjcmlwdGlvbiAodmlldyBtb2RlKSBpcyBleHBhbmRlZDsgd2hlbiBmYWxzZSwgY2xhbXBlZCB0byA0IGxpbmVzIHdpdGggUmVhZCBtb3JlICovXG4gIGRlc2NyaXB0aW9uRXhwYW5kZWQgPSBmYWxzZTtcblxuICAvKiogUm91Z2hseSA0IGxpbmVzIG9mIHRleHQ7IHNob3cgUmVhZCBtb3JlIHdoZW4gZGVzY3JpcHRpb24gZXhjZWVkcyB0aGlzICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzY3JpcHRpb25SZWFkTW9yZVRocmVzaG9sZCA9IDI4MDtcblxuICBnZXQgc2hvd0Rlc2NyaXB0aW9uUmVhZE1vcmUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5kZXNjcmlwdGlvbkNvbnRlbnQgPz8gJyc7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMuZW5hYmxlTWFya2Rvd24gPyByYXcucmVwbGFjZSgvPFtePl0qPi9nLCAnICcpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkgOiByYXc7XG4gICAgaWYgKHRleHQubGVuZ3RoID4gdGhpcy5kZXNjcmlwdGlvblJlYWRNb3JlVGhyZXNob2xkKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBbHNvIHNob3cgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIDQgbGluZXMgKG5ld2xpbmVzIG9yIDxicj4pXG4gICAgY29uc3Qgd2l0aEJyQXNOZXdsaW5lID0gcmF3LnJlcGxhY2UoLzxiclxccypcXC8/Pi9naSwgJ1xcbicpO1xuICAgIGNvbnN0IGxpbmVDb3VudCA9IHdpdGhCckFzTmV3bGluZS5zcGxpdCgvXFxyP1xcbi8pLmxlbmd0aDtcbiAgICByZXR1cm4gbGluZUNvdW50ID4gNDtcbiAgfVxuXG4gIHRvZ2dsZURlc2NyaXB0aW9uRXhwYW5kKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzY3JpcHRpb25FeHBhbmRlZCA9ICF0aGlzLmRlc2NyaXB0aW9uRXhwYW5kZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRmlsdGVyZWQgbWV0YWRhdGEgaXRlbXMgLSBleGNsdWRlcyBQcmlvcml0eSBhbmQgVHlwZSBmb3Igc3RlcCBncm91cHMgKi9cbiAgZ2V0IGZpbHRlcmVkTWV0YWRhdGFJdGVtcygpOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW1bXSB7XG4gICAgaWYgKCF0aGlzLmlzU3RlcEdyb3VwKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhdGhpcy5zdGVwR3JvdXBFeGNsdWRlZE1ldGFkYXRhTGFiZWxzLmluY2x1ZGVzKGl0ZW0ubGFiZWw/LnRvTG93ZXJDYXNlKCkgPz8gJycpXG4gICAgKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBlZGl0RGVzY3JpcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzYXZlQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhPigpO1xuICBAT3V0cHV0KCkgbWV0YWRhdGFMaW5rQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0TG9hZE1vcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdE9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICBAT3V0cHV0KCkgbGFiZWxBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY29uZmlndXJlQXBpTW9ja2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEZpcmVkIHdoZW4gdGhlIHVzZXIgZmxpcHMgZWl0aGVyIHRvZ2dsZSDigJQgZW1pdHMgdGhlIG5ldyBgcmVzdG9yZU1vY2tgIHZhbHVlLiAqL1xuICBAT3V0cHV0KCkgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIG9uRWRpdENsaWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZWRpdGluZyA9IHRydWU7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIHRoaXMuZWRpdERlc2NyaXB0aW9uLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2F2ZUNoYW5nZXMoZGF0YTogVGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lZGl0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnNhdmVDaGFuZ2VzLmVtaXQoZGF0YSk7XG4gIH1cblxuICBvbkNhbmNlbEVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIGlmICh0aGlzLmVkaXRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZWRpdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICB0cmFja0J5Q29uZmlnVGl0bGUoX2k6IG51bWJlciwgc2VjdGlvbjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNlY3Rpb24udGl0bGU7XG4gIH1cblxuICB0cmFja0J5TWV0YWRhdGFMYWJlbChfaTogbnVtYmVyLCBpdGVtOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0pOiBzdHJpbmcge1xuICAgIHJldHVybiBpdGVtLmxhYmVsO1xuICB9XG5cblxuICBvbk1ldGFkYXRhTGlua0NsaWNrKGl0ZW06IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSk6IHZvaWQge1xuICAgIGlmIChpdGVtLmxpbmspIHtcbiAgICAgIHRoaXMubWV0YWRhdGFMaW5rQ2xpY2suZW1pdChpdGVtKTtcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0dXNEb3RDbGFzcyhpdGVtOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0pOiBzdHJpbmcge1xuICAgIGlmICghaXRlbS5zdGF0dXNDb2xvcikgcmV0dXJuICcnO1xuICAgIHN3aXRjaCAoaXRlbS5zdGF0dXNDb2xvcikge1xuICAgICAgY2FzZSAneWVsbG93JzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyNFQUIzMDhdJztcbiAgICAgIGNhc2UgJ3JlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLWJnLVsjREMyNjI2XSc7XG4gICAgICBjYXNlICdncmVlbic6XG4gICAgICAgIHJldHVybiAnY3FhLWJnLVsjMTZBMzRBXSc7XG4gICAgICBjYXNlICdncmF5JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnY3FhLWJnLVsjOTRBM0I4XSc7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRleHQgY29sb3IgZm9yIG1ldGFkYXRhIHZhbHVlIChlLmcuIHJlZCBmb3IgY3JpdGljYWwgcHJpb3JpdHkpICovXG4gIGdldFZhbHVlVGV4dENsYXNzKGl0ZW06IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKGl0ZW0uc3RhdHVzQ29sb3IgPT09ICdyZWQnKSB7XG4gICAgICByZXR1cm4gJ2NxYS10ZXh0LVsjREMyNjI2XSc7XG4gICAgfVxuICAgIHJldHVybiAnY3FhLXRleHQtWyMxMTE4MjddJztcbiAgfVxufVxuIiwiPCEtLSBFZGl0IG1vZGU6IHNob3cgZWRpdCBmb3JtIChGaWdtYSBkZXNpZ24pIC0tPlxuPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1lZGl0XG4gICpuZ0lmPVwiaXNFZGl0aW5nXCJcbiAgW2Rlc2NyaXB0aW9uVGl0bGVdPVwiZGVzY3JpcHRpb25UaXRsZVwiXG4gIFtkZXNjcmlwdGlvbkNvbnRlbnRdPVwiZGVzY3JpcHRpb25Db250ZW50XCJcbiAgW2VuYWJsZU1hcmtkb3duXT1cImVuYWJsZU1hcmtkb3duXCJcbiAgW21ldGFkYXRhSXRlbXNdPVwibWV0YWRhdGFJdGVtc1wiXG4gIFtsYWJlbHNdPVwibGFiZWxzXCJcbiAgW2NvbmZpZ1RpdGxlXT1cImNvbmZpZ1RpdGxlXCJcbiAgW2NvbmZpZ1NlY3Rpb25zXT1cImNvbmZpZ1NlY3Rpb25zXCJcbiAgW2NvbmZpZ1NlY3Rpb25zUm93Ml09XCJjb25maWdTZWN0aW9uc1JvdzJcIlxuICBbcGxhdGZvcm1dPVwicGxhdGZvcm1cIlxuICBbaXNTdGVwR3JvdXBdPVwiaXNTdGVwR3JvdXBcIlxuICBbaXNTYXZpbmddPVwiaXNTYXZpbmdcIlxuICBbc2VsZWN0Q29uZmlnT3ZlcnJpZGVzXT1cInNlbGVjdENvbmZpZ092ZXJyaWRlc1wiXG4gIFtzaG93QXBpTW9ja2luZ0NhcmRdPVwic2hvd0FwaU1vY2tpbmdDYXJkXCJcbiAgW2FwaU1vY2tpbmdUaXRsZV09XCJhcGlNb2NraW5nVGl0bGVcIlxuICBbYXBpTW9ja2luZ1N0YXR1c0xhYmVsXT1cImFwaU1vY2tpbmdTdGF0dXNMYWJlbFwiXG4gIFthcGlNb2NraW5nQ2FwdHVyZUxhYmVsXT1cImFwaU1vY2tpbmdDYXB0dXJlTGFiZWxcIlxuICBbYXBpTW9ja2luZ0NhcHR1cmVIaW50XT1cImFwaU1vY2tpbmdDYXB0dXJlSGludFwiXG4gIFthcGlNb2NraW5nUmVuZXdMYWJlbF09XCJhcGlNb2NraW5nUmVuZXdMYWJlbFwiXG4gIFthcGlNb2NraW5nUmVuZXdIaW50XT1cImFwaU1vY2tpbmdSZW5ld0hpbnRcIlxuICBbYXBpTW9ja2luZ1Jlc3RvcmVNb2NrXT1cImFwaU1vY2tpbmdSZXN0b3JlTW9ja1wiXG4gIFthcGlNb2NraW5nTW9ja2VkQXBpc0NvdW50XT1cImFwaU1vY2tpbmdNb2NrZWRBcGlzQ291bnRcIlxuICBbYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50XT1cImFwaU1vY2tpbmdUb3RhbEFwaXNDb3VudFwiXG4gIFthcGlNb2NraW5nUHJvZ3Jlc3NQZXJjZW50XT1cImFwaU1vY2tpbmdQcm9ncmVzc1BlcmNlbnRcIlxuICBbYXBpTW9ja2luZ1Nob3dQcm9ncmVzc109XCJhcGlNb2NraW5nU2hvd1Byb2dyZXNzXCJcbiAgW2FwaU1vY2tpbmdTdW1tYXJ5VGV4dF09XCJhcGlNb2NraW5nU3VtbWFyeVRleHRcIlxuICBbYXBpTW9ja2luZ1BlcmNlbnRUZXh0XT1cImFwaU1vY2tpbmdQZXJjZW50VGV4dFwiXG4gIChzYXZlKT1cIm9uU2F2ZUNoYW5nZXMoJGV2ZW50KVwiXG4gIChjYW5jZWwpPVwib25DYW5jZWxFZGl0KClcIlxuICAoc2VsZWN0U2VhcmNoKT1cInNlbGVjdFNlYXJjaC5lbWl0KCRldmVudClcIlxuICAoc2VsZWN0TG9hZE1vcmUpPVwic2VsZWN0TG9hZE1vcmUuZW1pdCgkZXZlbnQpXCJcbiAgKHNlbGVjdE9wZW5lZCk9XCJzZWxlY3RPcGVuZWQuZW1pdCgkZXZlbnQpXCJcbiAgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgKGxhYmVsQWRkZWQpPVwibGFiZWxBZGRlZC5lbWl0KCRldmVudClcIlxuICAoYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlKT1cImFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZS5lbWl0KCRldmVudClcIj5cbjwvY3FhLXRlc3QtY2FzZS1kZXRhaWxzLWVkaXQ+XG5cbjwhLS0gVmlldyBtb2RlOiByZWFkLW9ubHkgZGV0YWlscyAtLT5cbjxkaXYgKm5nSWY9XCIhaXNFZGl0aW5nXCIgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1weS00IGNxYS1weC0wIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC00IGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC00IGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+XG4gICAgPCEtLSBEZXNjcmlwdGlvbiBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0yLjVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+ZGVzY3JpcHRpb248L21hdC1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+e3sgZGVzY3JpcHRpb25UaXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC0yLjUgY3FhLXB5LTEgY3FhLXJvdW5kZWQgIWNxYS1ib3JkZXIgIWNxYS1ib3JkZXItc29saWQgIWNxYS1ib3JkZXItWyNEMUQ1REJdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tYWxsIGhvdmVyOmNxYS10ZXh0LVsjMzc0MTUxXSBob3ZlcjohY3FhLWJvcmRlci1bIzlDQTNBRl0gaG92ZXI6Y3FhLWJnLVsjRjlGQUZCXSBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjM0Y0M0VFXSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLW9mZnNldC0yXCJcbiAgICAgICAgICAoY2xpY2spPVwib25FZGl0Q2xpY2soKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy1bMTRweF0gIWNxYS1oLVsxNHB4XSAhY3FhLXRleHQtWzE0cHhdXCI+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+RWRpdDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJkZXNjcmlwdGlvbkNvbnRlbnRcIiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTFcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiZW5hYmxlTWFya2Rvd25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS1wcm9zZSBjcWEtcHJvc2Utc20gY3FhLW1heC13LW5vbmVcIlxuICAgICAgICAgIFtzdHlsZV09XCIoIWRlc2NyaXB0aW9uRXhwYW5kZWQgJiYgc2hvd0Rlc2NyaXB0aW9uUmVhZE1vcmUpID8gJ2Rpc3BsYXk6IC13ZWJraXQtYm94OyAtd2Via2l0LWxpbmUtY2xhbXA6IDQ7IGxpbmUtY2xhbXA6IDQ7IC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7IG92ZXJmbG93OiBoaWRkZW47JyA6ICcnXCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImRlc2NyaXB0aW9uQ29udGVudFwiPjwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCIhZW5hYmxlTWFya2Rvd25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsXCJcbiAgICAgICAgICBbc3R5bGVdPVwiKCFkZXNjcmlwdGlvbkV4cGFuZGVkICYmIHNob3dEZXNjcmlwdGlvblJlYWRNb3JlKSA/ICdkaXNwbGF5OiAtd2Via2l0LWJveDsgLXdlYmtpdC1saW5lLWNsYW1wOiA0OyBsaW5lLWNsYW1wOiA0OyAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOyBvdmVyZmxvdzogaGlkZGVuOycgOiAnJ1wiPnt7IGRlc2NyaXB0aW9uQ29udGVudCB9fTwvZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93RGVzY3JpcHRpb25SZWFkTW9yZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGhvdmVyOmNxYS11bmRlcmxpbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtc2VsZi1zdGFydCBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjM0Y0M0VFXSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLW9mZnNldC0yXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGVzY3JpcHRpb25FeHBhbmQoKVwiPlxuICAgICAgICAgIHt7IGRlc2NyaXB0aW9uRXhwYW5kZWQgPyAnUmVhZCBsZXNzJyA6ICdSZWFkIG1vcmUnIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE1ldGFkYXRhIFNlY3Rpb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImZpbHRlcmVkTWV0YWRhdGFJdGVtcy5sZW5ndGhcIiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTIuNVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAteC0wIGNxYS1nYXAteS00XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRNZXRhZGF0YUl0ZW1zOyB0cmFja0J5OiB0cmFja0J5TWV0YWRhdGFMYWJlbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMC41XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXhzIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW1cIj57eyBpdGVtLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVs1cHhdIGNxYS1taW4tdy0wIGNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjVGNUY1XVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJpdGVtLmljb24gJiYgKCFpdGVtLmljb25MaWJyYXJ5IHx8IGl0ZW0uaWNvbkxpYnJhcnkgPT09ICdtYXQnKVwiIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXNtIGNxYS13LTQgY3FhLWgtNFwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0uaWNvbiB9fVxuICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0uc3RhdHVzQ29sb3JcIiBjbGFzcz1cImNxYS13LVsxMHB4XSBjcWEtaC1bMTBweF0gY3FhLXJvdW5kZWQtZnVsbCBjcWEtZmxleC1zaHJpbmstMFwiIFtuZ0NsYXNzXT1cImdldFN0YXR1c0RvdENsYXNzKGl0ZW0pXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5saW5rXCJcbiAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjMjU2M0VCXSBjcWEtdGV4dC14cyBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWZvbnQtbm9ybWFsIGhvdmVyOmNxYS11bmRlcmxpbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1ibG9jayBjcWEtdHJ1bmNhdGUgY3FhLW1pbi13LTBcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk1ldGFkYXRhTGlua0NsaWNrKGl0ZW0pOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0udmFsdWUgfX1cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpdGVtLmxpbmtcIiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLWFsaWduLW1pZGRsZVwiIFtuZ0NsYXNzXT1cImdldFZhbHVlVGV4dENsYXNzKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAge3sgaXRlbS52YWx1ZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTGFiZWxzIChGaWdtYTogTGFiZWxzIHRpdGxlLCBjcWEtYmFkZ2UgY2hpcHMgd2l0aCB0YWcgaWNvbikgLS0+XG4gICAgPGRpdiAqbmdJZj1cImxhYmVscy5sZW5ndGhcIiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTIgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF1cIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtbGVhZGluZy01XCI+TGFiZWxzPC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgbGFiZWwgb2YgbGFiZWxzXCJcbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgICAgIGljb249XCJsYWJlbFwiXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yPVwiI2ZmZmZmZlwiXG4gICAgICAgICAgdGV4dENvbG9yPVwiIzQ3NTU2OVwiXG4gICAgICAgICAgYm9yZGVyQ29sb3I9XCIjRTJFOEYwXCJcbiAgICAgICAgICBpY29uQ29sb3I9XCIjOTRBM0I4XCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENvbmZpZ3VyYXRpb24gU2VjdGlvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnU2VjdGlvbnMubGVuZ3RoIHx8IGNvbmZpZ1NlY3Rpb25zUm93Mi5sZW5ndGhcIiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTIuNVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+c2V0dGluZ3M8L21hdC1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+e3sgY29uZmlnVGl0bGUgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMi41XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1ncmlkIGNxYS1ncmlkLWNvbHMtMSBjcWEtZ2FwLTIuNVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgY29uZmlnU2VjdGlvbnM7IHRyYWNrQnk6IHRyYWNrQnlDb25maWdUaXRsZVwiPlxuICAgICAgICAgICAgPGNxYS1jb25maWd1cmF0aW9uLWNhcmRcbiAgICAgICAgICAgICAgW2ljb25dPVwic2VjdGlvbi5pY29uIHx8ICd0dW5lJ1wiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJzZWN0aW9uLnRpdGxlXCJcbiAgICAgICAgICAgICAgW2RhdGFdPVwic2VjdGlvbi5pdGVtc1wiPlxuICAgICAgICAgICAgPC9jcWEtY29uZmlndXJhdGlvbi1jYXJkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNvbmZpZ1NlY3Rpb25zUm93Mi5sZW5ndGhcIiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNCBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPlxuICAgICAgICAgIDxjcWEtY29uZmlndXJhdGlvbi1jYXJkXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBjb25maWdTZWN0aW9uc1JvdzI7IHRyYWNrQnk6IHRyYWNrQnlDb25maWdUaXRsZVwiXG4gICAgICAgICAgICBbaWNvbl09XCJzZWN0aW9uLmljb24gfHwgJ3R1bmUnXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJzZWN0aW9uLnRpdGxlXCJcbiAgICAgICAgICAgIFtkYXRhXT1cInNlY3Rpb24uaXRlbXNcIj5cbiAgICAgICAgICA8L2NxYS1jb25maWd1cmF0aW9uLWNhcmQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIEFQSSBNb2NraW5nIENhcmQgKHJlYWQtb25seSkgLS0+XG4gICAgICA8Y3FhLWFwaS1tb2NraW5nLWNhcmRcbiAgICAgICAgKm5nSWY9XCJzaG93QXBpTW9ja2luZ0NhcmRcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlO1wiXG4gICAgICAgIFt0aXRsZV09XCJhcGlNb2NraW5nVGl0bGVcIlxuICAgICAgICBbc3RhdHVzTGFiZWxdPVwiYXBpTW9ja2luZ1N0YXR1c0xhYmVsXCJcbiAgICAgICAgW2NhcHR1cmVMYWJlbF09XCJhcGlNb2NraW5nQ2FwdHVyZUxhYmVsXCJcbiAgICAgICAgW3JlbmV3TGFiZWxdPVwiYXBpTW9ja2luZ1JlbmV3TGFiZWxcIlxuICAgICAgICBbcmVzdG9yZU1vY2tdPVwiYXBpTW9ja2luZ1Jlc3RvcmVNb2NrXCJcbiAgICAgICAgW21vY2tlZEFwaXNDb3VudF09XCJhcGlNb2NraW5nTW9ja2VkQXBpc0NvdW50XCJcbiAgICAgICAgW3RvdGFsQXBpc0NvdW50XT1cImFwaU1vY2tpbmdUb3RhbEFwaXNDb3VudFwiXG4gICAgICAgIFtwcm9ncmVzc1BlcmNlbnRdPVwiYXBpTW9ja2luZ1Byb2dyZXNzUGVyY2VudFwiXG4gICAgICAgIFtzaG93UHJvZ3Jlc3NdPVwiYXBpTW9ja2luZ1Nob3dQcm9ncmVzc1wiXG4gICAgICAgIFtzdW1tYXJ5VGV4dF09XCJhcGlNb2NraW5nU3VtbWFyeVRleHRcIlxuICAgICAgICBbcGVyY2VudFRleHRdPVwiYXBpTW9ja2luZ1BlcmNlbnRUZXh0XCJcbiAgICAgICAgW2NvbmZpZ3VyZUJ1dHRvbkxhYmVsXT1cImFwaU1vY2tpbmdDb25maWd1cmVCdXR0b25MYWJlbFwiXG4gICAgICAgIFtlZGl0aW5nXT1cImZhbHNlXCJcbiAgICAgICAgKGNvbmZpZ3VyZSk9XCJjb25maWd1cmVBcGlNb2NraW5nLmVtaXQoKVwiPlxuICAgICAgPC9jcWEtYXBpLW1vY2tpbmctY2FyZD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
269
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy90ZXN0LWNhc2UtZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEdBS3hCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQWdCdkIsTUFBTSxPQUFPLHdCQUF3QjtJQWVuQyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWQxQywyREFBMkQ7UUFDbkQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUt6Qiw0REFBNEQ7UUFDbkQsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFvQmpDLGdDQUFnQztRQUN2QixxQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFFMUMsK0JBQStCO1FBQ3RCLHVCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUVqQyxzRkFBc0Y7UUFDN0UsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFaEMsZ0VBQWdFO1FBQ3ZELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRWhDLDZGQUE2RjtRQUNwRixrQkFBYSxHQUFrQyxFQUFFLENBQUM7UUFFM0QscURBQXFEO1FBQzVDLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFFL0Isa0NBQWtDO1FBQ3pCLGdCQUFXLEdBQUcsZUFBZSxDQUFDO1FBRXZDLGdFQUFnRTtRQUN2RCxtQkFBYyxHQUFtQyxFQUFFLENBQUM7UUFFN0QsMEZBQTBGO1FBQ2pGLHVCQUFrQixHQUFtQyxFQUFFLENBQUM7UUFDakUsdUZBQXVGO1FBQzlFLGFBQVEsR0FBcUIsS0FBSyxDQUFDO1FB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LEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBb0NJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsMkJBQTJCO3NCQUFwQyxNQUFNO2dCQUVHLHlCQUF5QjtzQkFBbEMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24sXG4gIFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSxcbn0gZnJvbSAnLi90ZXN0LWNhc2UtZGV0YWlscy5tb2RlbHMnO1xuaW1wb3J0IHtcbiAgVGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhLFxuICBTZWxlY3RDb25maWdPdmVycmlkZXMsXG59IGZyb20gJy4vdGVzdC1jYXNlLWRldGFpbHMtZWRpdC90ZXN0LWNhc2UtZGV0YWlscy1lZGl0LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWNhc2UtZGV0YWlscycsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXN0LWNhc2UtZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZURldGFpbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKiBJbnRlcm5hbCBlZGl0aW5nIHN0YXRlIHdoZW4gbm90IGNvbnRyb2xsZWQgYnkgcGFyZW50ICovXG4gIHByaXZhdGUgX2VkaXRpbmcgPSBmYWxzZTtcblxuICAvKiogV2hlbiBwcm92aWRlZCBieSBwYXJlbnQsIHVzZSB0aGlzIGluc3RlYWQgb2YgaW50ZXJuYWwgc3RhdGUgKGZpeGVzIFN0b3J5Ym9vayBldmVudCBmbG93KS4gKi9cbiAgQElucHV0KCkgZWRpdGluZz86IGJvb2xlYW47XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgc3RhcnQgaW4gZWRpdCBtb2RlICh1c2VmdWwgZm9yIFN0b3J5Ym9vaykuICovXG4gIEBJbnB1dCgpIHN0YXJ0SW5FZGl0TW9kZSA9IGZhbHNlO1xuXG4gIC8qKiBSZXNvbHZlZCBlZGl0aW5nIHN0YXRlOiBwYXJlbnQtY29udHJvbGxlZCBvciBpbnRlcm5hbCAqL1xuICBnZXQgaXNFZGl0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRpbmcgIT09IHVuZGVmaW5lZCA/IHRoaXMuZWRpdGluZyA6IHRoaXMuX2VkaXRpbmc7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhcnRJbkVkaXRNb2RlKSB7XG4gICAgICB0aGlzLl9lZGl0aW5nID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2Rlc2NyaXB0aW9uQ29udGVudCddKSB7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLyoqIERlc2NyaXB0aW9uIHNlY3Rpb24gdGl0bGUgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb25UaXRsZSA9ICdEZXNjcmlwdGlvbic7XG5cbiAgLyoqIERlc2NyaXB0aW9uIHRleHQgY29udGVudCAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbkNvbnRlbnQgPSAnJztcblxuICAvKiogV2hlbiB0cnVlLCBkZXNjcmlwdGlvbiBzdXBwb3J0cyByaWNoIHRleHQgKEhUTUwpLiBSZW5kZXJzIGFzIEhUTUwgaW4gdmlldyBtb2RlLiAqL1xuICBASW5wdXQoKSBlbmFibGVNYXJrZG93biA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIEVkaXQgYnV0dG9uIGluIHRoZSBEZXNjcmlwdGlvbiBoZWFkZXIgKi9cbiAgQElucHV0KCkgc2hvd0VkaXRCdXR0b24gPSBmYWxzZTtcblxuICAvKiogTWV0YWRhdGEgaXRlbXMgKGNyZWF0ZWRPbiwgc3RhdHVzLCBwcmlvcml0eSwgZW52aXJvbm1lbnQsIHZlcnNpb24sIHRlc3RQbGFuTmFtZSwgZXRjLikgKi9cbiAgQElucHV0KCkgbWV0YWRhdGFJdGVtczogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtW10gPSBbXTtcblxuICAvKiogTGFiZWxzL3RhZ3MgKGUuZy4gQXV0b21hdGlvbiwgQVBJLCBTREssIFVJL1VYKSAqL1xuICBASW5wdXQoKSBsYWJlbHM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqIENvbmZpZ3VyYXRpb24gc2VjdGlvbiB0aXRsZSAqL1xuICBASW5wdXQoKSBjb25maWdUaXRsZSA9ICdDb25maWd1cmF0aW9uJztcblxuICAvKiogQ29uZmlndXJhdGlvbiBzZWN0aW9ucyAoZS5nLiBFeGVjdXRpb24sIEFJIENvbmZpZ3VyYXRpb24pICovXG4gIEBJbnB1dCgpIGNvbmZpZ1NlY3Rpb25zOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10gPSBbXTtcblxuICAvKiogT3B0aW9uYWwgY29uZmlnIHNlY3Rpb25zIGRpc3BsYXllZCBpbiBhIDItY29sdW1uIHJvdyAoZS5nLiBXYWl0cyAmIFJldHJpZXMsIERldmljZSkgKi9cbiAgQElucHV0KCkgY29uZmlnU2VjdGlvbnNSb3cyOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10gPSBbXTtcbiAgLyoqIFBsYXRmb3JtOiAnd2ViJyBvciAnbW9iaWxlJy4gRGVmYXVsdHMgdG8gJ3dlYicuIFVzZWQgZm9yIERldmljZSBTZXR0aW5ncyBmaWVsZHMuICovXG4gIEBJbnB1dCgpIHBsYXRmb3JtOiAnd2ViJyB8ICdtb2JpbGUnID0gJ3dlYic7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgZmlsdGVycyBvdXQgUHJpb3JpdHkgYW5kIFR5cGUgZnJvbSBtZXRhZGF0YSAoc3RlcCBncm91cHMgZG9uJ3QgaGF2ZSB0aGVzZSkuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBASW5wdXQoKSBpc1N0ZXBHcm91cCA9IGZhbHNlO1xuXG4gIC8qKiBPdmVycmlkZSBjb25maWcgcGVyIHNlbGVjdCBmb3IgQVBJLWRyaXZlbiBvcHRpb25zLCBzZXJ2ZXIgc2VhcmNoLCBsb2FkIG1vcmUuICovXG4gIEBJbnB1dCgpIHNlbGVjdENvbmZpZ092ZXJyaWRlczogU2VsZWN0Q29uZmlnT3ZlcnJpZGVzID0ge307XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBzYXZpbmcgY2hhbmdlcy4gKi9cbiAgQElucHV0KCkgaXNTYXZpbmcgPSBmYWxzZTtcblxuICAvLyDilIDilIAgQVBJIE1vY2tpbmcgY2FyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLyoqIFdoZW4gdHJ1ZSwgcmVuZGVyIHRoZSBBUEkgTW9ja2luZyBjYXJkIGJlbG93IHRoZSBjb25maWd1cmF0aW9uIHNlY3Rpb24uICovXG4gIEBJbnB1dCgpIHNob3dBcGlNb2NraW5nQ2FyZCA9IGZhbHNlO1xuICBASW5wdXQoKSBhcGlNb2NraW5nVGl0bGUgPSAnQVBJIE1vY2tpbmcnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nU3RhdHVzTGFiZWwgPSAnTm90IGNvbmZpZ3VyZWQnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nQ2FwdHVyZUxhYmVsID0gJ1VzZSBtb2NrIEFQSSByZXNwb25zZXMnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nUmVuZXdMYWJlbCA9ICdSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlcyc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdDYXB0dXJlSGludCA9ICdVc2VzIHN0b3JlZCByZXNwb25zZXMgb24gbmV4dCBydW4uIFR1cm4gb24gYWZ0ZXIgY2FwdHVyZSBjb21wbGV0ZXMuJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ1JlbmV3SGludCA9ICdSZS1jYXB0dXJlcyBmcmVzaCByZXNwb25zZXMgb24gbmV4dCBydW4uIFR1cm5zIG9mZiBVc2UgbW9jay4nO1xuICAvKipcbiAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIEFQSSBtb2NraW5nIGNhcmQncyBkdWFsIHRvZ2dsZSBzdGF0ZS5cbiAgICogICB0cnVlICDihpIgUmVuZXcgQVBJIHJlc3BvbnNlcyBPTiwgIENhcHR1cmUgQVBJIHJlc3BvbnNlcyBPRkZcbiAgICogICBmYWxzZSDihpIgUmVuZXcgQVBJIHJlc3BvbnNlcyBPRkYsIENhcHR1cmUgQVBJIHJlc3BvbnNlcyBPTlxuICAgKiBUaGUgdHdvIGxlZ2FjeSBgKkNhcHR1cmVFbmFibGVkYCAvIGAqUmVuZXdFbmFibGVkYCBpbnB1dHMgYXJlIG5vIGxvbmdlciB1c2VkLlxuICAgKi9cbiAgQElucHV0KCkgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrID0gZmFsc2U7XG4gIC8qKiBcIlJlbmV3IGFuZCBzdG9yZSBBUEkgcmVzcG9uc2VzXCIg4oCUIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhcGlNb2NraW5nUmVzdG9yZU1vY2tgIHdoZW4gdHJ1ZS4gKi9cbiAgQElucHV0KCkgYXBpTW9ja2luZ1N0b3JlTW9jayA9IGZhbHNlO1xuICBASW5wdXQoKSBhcGlNb2NraW5nTW9ja2VkQXBpc0NvdW50ID0gMDtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50ID0gMDtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1Byb2dyZXNzUGVyY2VudCA9IDA7XG4gIC8qKiBGb3J3YXJkZWQgdG8gYGNxYS1hcGktbW9ja2luZy1jYXJkYCDigJQgZ2F0ZXMgdGhlIFwiTW9ja2VkIC8gcHJvZ3Jlc3MgLyBwZXJjZW50XCIgYmxvY2suICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdTaG93UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1N1bW1hcnlUZXh0Pzogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlNb2NraW5nUGVyY2VudFRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdDb25maWd1cmVCdXR0b25MYWJlbCA9ICdDb25maWd1cmUnO1xuXG4gIC8qKiBMYWJlbHMgdG8gZmlsdGVyIG91dCBmcm9tIG1ldGFkYXRhIGZvciBzdGVwIGdyb3VwcyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0ZXBHcm91cEV4Y2x1ZGVkTWV0YWRhdGFMYWJlbHMgPSBbJ3ByaW9yaXR5JywgJ3R5cGUnXTtcblxuICAvKiogV2hlbiB0cnVlLCBkZXNjcmlwdGlvbiAodmlldyBtb2RlKSBpcyBleHBhbmRlZDsgd2hlbiBmYWxzZSwgY2xhbXBlZCB0byA0IGxpbmVzIHdpdGggUmVhZCBtb3JlICovXG4gIGRlc2NyaXB0aW9uRXhwYW5kZWQgPSBmYWxzZTtcblxuICAvKiogUm91Z2hseSA0IGxpbmVzIG9mIHRleHQ7IHNob3cgUmVhZCBtb3JlIHdoZW4gZGVzY3JpcHRpb24gZXhjZWVkcyB0aGlzICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzY3JpcHRpb25SZWFkTW9yZVRocmVzaG9sZCA9IDI4MDtcblxuICBnZXQgc2hvd0Rlc2NyaXB0aW9uUmVhZE1vcmUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5kZXNjcmlwdGlvbkNvbnRlbnQgPz8gJyc7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMuZW5hYmxlTWFya2Rvd24gPyByYXcucmVwbGFjZSgvPFtePl0qPi9nLCAnICcpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkgOiByYXc7XG4gICAgaWYgKHRleHQubGVuZ3RoID4gdGhpcy5kZXNjcmlwdGlvblJlYWRNb3JlVGhyZXNob2xkKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBbHNvIHNob3cgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIDQgbGluZXMgKG5ld2xpbmVzIG9yIDxicj4pXG4gICAgY29uc3Qgd2l0aEJyQXNOZXdsaW5lID0gcmF3LnJlcGxhY2UoLzxiclxccypcXC8/Pi9naSwgJ1xcbicpO1xuICAgIGNvbnN0IGxpbmVDb3VudCA9IHdpdGhCckFzTmV3bGluZS5zcGxpdCgvXFxyP1xcbi8pLmxlbmd0aDtcbiAgICByZXR1cm4gbGluZUNvdW50ID4gNDtcbiAgfVxuXG4gIHRvZ2dsZURlc2NyaXB0aW9uRXhwYW5kKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzY3JpcHRpb25FeHBhbmRlZCA9ICF0aGlzLmRlc2NyaXB0aW9uRXhwYW5kZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRmlsdGVyZWQgbWV0YWRhdGEgaXRlbXMgLSBleGNsdWRlcyBQcmlvcml0eSBhbmQgVHlwZSBmb3Igc3RlcCBncm91cHMgKi9cbiAgZ2V0IGZpbHRlcmVkTWV0YWRhdGFJdGVtcygpOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW1bXSB7XG4gICAgaWYgKCF0aGlzLmlzU3RlcEdyb3VwKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhdGhpcy5zdGVwR3JvdXBFeGNsdWRlZE1ldGFkYXRhTGFiZWxzLmluY2x1ZGVzKGl0ZW0ubGFiZWw/LnRvTG93ZXJDYXNlKCkgPz8gJycpXG4gICAgKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBlZGl0RGVzY3JpcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzYXZlQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhPigpO1xuICBAT3V0cHV0KCkgbWV0YWRhdGFMaW5rQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0TG9hZE1vcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdE9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICBAT3V0cHV0KCkgbGFiZWxBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY29uZmlndXJlQXBpTW9ja2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEZpcmVkIHdoZW4gdGhlIHVzZXIgZmxpcHMgdGhlIFVzZS1tb2NrIHRvZ2dsZSDigJQgZW1pdHMgdGhlIG5ldyBgcmVzdG9yZU1vY2tgIHZhbHVlLiAqL1xuICBAT3V0cHV0KCkgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAvKiogRmlyZWQgd2hlbiB0aGUgdXNlciBmbGlwcyB0aGUgUmVuZXctYW5kLXN0b3JlIHRvZ2dsZSDigJQgZW1pdHMgdGhlIG5ldyBgc3RvcmVNb2NrYCB2YWx1ZS4gKi9cbiAgQE91dHB1dCgpIGFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgb25FZGl0Q2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lZGl0aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgdGhpcy5lZGl0RGVzY3JpcHRpb24uZW1pdCgpO1xuICB9XG5cbiAgb25TYXZlQ2hhbmdlcyhkYXRhOiBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2VkaXRpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuc2F2ZUNoYW5nZXMuZW1pdChkYXRhKTtcbiAgfVxuXG4gIG9uQ2FuY2VsRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgaWYgKHRoaXMuZWRpdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lZGl0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHRyYWNrQnlDb25maWdUaXRsZShfaTogbnVtYmVyLCBzZWN0aW9uOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2VjdGlvbi50aXRsZTtcbiAgfVxuXG4gIHRyYWNrQnlNZXRhZGF0YUxhYmVsKF9pOiBudW1iZXIsIGl0ZW06IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gIH1cblxuXG4gIG9uTWV0YWRhdGFMaW5rQ2xpY2soaXRlbTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0ubGluaykge1xuICAgICAgdGhpcy5tZXRhZGF0YUxpbmtDbGljay5lbWl0KGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c0RvdENsYXNzKGl0ZW06IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKCFpdGVtLnN0YXR1c0NvbG9yKSByZXR1cm4gJyc7XG4gICAgc3dpdGNoIChpdGVtLnN0YXR1c0NvbG9yKSB7XG4gICAgICBjYXNlICd5ZWxsb3cnOlxuICAgICAgICByZXR1cm4gJ2NxYS1iZy1bI0VBQjMwOF0nO1xuICAgICAgY2FzZSAncmVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyNEQzI2MjZdJztcbiAgICAgIGNhc2UgJ2dyZWVuJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyMxNkEzNEFdJztcbiAgICAgIGNhc2UgJ2dyYXknOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyM5NEEzQjhdJztcbiAgICB9XG4gIH1cblxuICAvKiogVGV4dCBjb2xvciBmb3IgbWV0YWRhdGEgdmFsdWUgKGUuZy4gcmVkIGZvciBjcml0aWNhbCBwcmlvcml0eSkgKi9cbiAgZ2V0VmFsdWVUZXh0Q2xhc3MoaXRlbTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtKTogc3RyaW5nIHtcbiAgICBpZiAoaXRlbS5zdGF0dXNDb2xvciA9PT0gJ3JlZCcpIHtcbiAgICAgIHJldHVybiAnY3FhLXRleHQtWyNEQzI2MjZdJztcbiAgICB9XG4gICAgcmV0dXJuICdjcWEtdGV4dC1bIzExMTgyN10nO1xuICB9XG59XG4iLCI8IS0tIEVkaXQgbW9kZTogc2hvdyBlZGl0IGZvcm0gKEZpZ21hIGRlc2lnbikgLS0+XG48Y3FhLXRlc3QtY2FzZS1kZXRhaWxzLWVkaXRcbiAgKm5nSWY9XCJpc0VkaXRpbmdcIlxuICBbZGVzY3JpcHRpb25UaXRsZV09XCJkZXNjcmlwdGlvblRpdGxlXCJcbiAgW2Rlc2NyaXB0aW9uQ29udGVudF09XCJkZXNjcmlwdGlvbkNvbnRlbnRcIlxuICBbZW5hYmxlTWFya2Rvd25dPVwiZW5hYmxlTWFya2Rvd25cIlxuICBbbWV0YWRhdGFJdGVtc109XCJtZXRhZGF0YUl0ZW1zXCJcbiAgW2xhYmVsc109XCJsYWJlbHNcIlxuICBbY29uZmlnVGl0bGVdPVwiY29uZmlnVGl0bGVcIlxuICBbY29uZmlnU2VjdGlvbnNdPVwiY29uZmlnU2VjdGlvbnNcIlxuICBbY29uZmlnU2VjdGlvbnNSb3cyXT1cImNvbmZpZ1NlY3Rpb25zUm93MlwiXG4gIFtwbGF0Zm9ybV09XCJwbGF0Zm9ybVwiXG4gIFtpc1N0ZXBHcm91cF09XCJpc1N0ZXBHcm91cFwiXG4gIFtpc1NhdmluZ109XCJpc1NhdmluZ1wiXG4gIFtzZWxlY3RDb25maWdPdmVycmlkZXNdPVwic2VsZWN0Q29uZmlnT3ZlcnJpZGVzXCJcbiAgW3Nob3dBcGlNb2NraW5nQ2FyZF09XCJzaG93QXBpTW9ja2luZ0NhcmRcIlxuICBbYXBpTW9ja2luZ1RpdGxlXT1cImFwaU1vY2tpbmdUaXRsZVwiXG4gIFthcGlNb2NraW5nU3RhdHVzTGFiZWxdPVwiYXBpTW9ja2luZ1N0YXR1c0xhYmVsXCJcbiAgW2FwaU1vY2tpbmdDYXB0dXJlTGFiZWxdPVwiYXBpTW9ja2luZ0NhcHR1cmVMYWJlbFwiXG4gIFthcGlNb2NraW5nQ2FwdHVyZUhpbnRdPVwiYXBpTW9ja2luZ0NhcHR1cmVIaW50XCJcbiAgW2FwaU1vY2tpbmdSZW5ld0xhYmVsXT1cImFwaU1vY2tpbmdSZW5ld0xhYmVsXCJcbiAgW2FwaU1vY2tpbmdSZW5ld0hpbnRdPVwiYXBpTW9ja2luZ1JlbmV3SGludFwiXG4gIFthcGlNb2NraW5nUmVzdG9yZU1vY2tdPVwiYXBpTW9ja2luZ1Jlc3RvcmVNb2NrXCJcbiAgW2FwaU1vY2tpbmdTdG9yZU1vY2tdPVwiYXBpTW9ja2luZ1N0b3JlTW9ja1wiXG4gIFthcGlNb2NraW5nTW9ja2VkQXBpc0NvdW50XT1cImFwaU1vY2tpbmdNb2NrZWRBcGlzQ291bnRcIlxuICBbYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50XT1cImFwaU1vY2tpbmdUb3RhbEFwaXNDb3VudFwiXG4gIFthcGlNb2NraW5nUHJvZ3Jlc3NQZXJjZW50XT1cImFwaU1vY2tpbmdQcm9ncmVzc1BlcmNlbnRcIlxuICBbYXBpTW9ja2luZ1Nob3dQcm9ncmVzc109XCJhcGlNb2NraW5nU2hvd1Byb2dyZXNzXCJcbiAgW2FwaU1vY2tpbmdTdW1tYXJ5VGV4dF09XCJhcGlNb2NraW5nU3VtbWFyeVRleHRcIlxuICBbYXBpTW9ja2luZ1BlcmNlbnRUZXh0XT1cImFwaU1vY2tpbmdQZXJjZW50VGV4dFwiXG4gIChzYXZlKT1cIm9uU2F2ZUNoYW5nZXMoJGV2ZW50KVwiXG4gIChjYW5jZWwpPVwib25DYW5jZWxFZGl0KClcIlxuICAoc2VsZWN0U2VhcmNoKT1cInNlbGVjdFNlYXJjaC5lbWl0KCRldmVudClcIlxuICAoc2VsZWN0TG9hZE1vcmUpPVwic2VsZWN0TG9hZE1vcmUuZW1pdCgkZXZlbnQpXCJcbiAgKHNlbGVjdE9wZW5lZCk9XCJzZWxlY3RPcGVuZWQuZW1pdCgkZXZlbnQpXCJcbiAgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgKGxhYmVsQWRkZWQpPVwibGFiZWxBZGRlZC5lbWl0KCRldmVudClcIlxuICAoYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlKT1cImFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZS5lbWl0KCRldmVudClcIlxuICAoYXBpTW9ja2luZ1N0b3JlTW9ja0NoYW5nZSk9XCJhcGlNb2NraW5nU3RvcmVNb2NrQ2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtZWRpdD5cblxuPCEtLSBWaWV3IG1vZGU6IHJlYWQtb25seSBkZXRhaWxzIC0tPlxuPGRpdiAqbmdJZj1cIiFpc0VkaXRpbmdcIiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLXB5LTQgY3FhLXB4LTAgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTQgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF1cIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTQgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF1cIj5cbiAgICA8IS0tIERlc2NyaXB0aW9uIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTIuNVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5kZXNjcmlwdGlvbjwvbWF0LWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzE5LjZweF1cIj57eyBkZXNjcmlwdGlvblRpdGxlIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0VkaXRCdXR0b25cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXB4LTIuNSBjcWEtcHktMSBjcWEtcm91bmRlZCAhY3FhLWJvcmRlciAhY3FhLWJvcmRlci1zb2xpZCAhY3FhLWJvcmRlci1bI0QxRDVEQl0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXhzIGNxYS1mb250LXNlbWlib2xkIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgaG92ZXI6Y3FhLXRleHQtWyMzNzQxNTFdIGhvdmVyOiFjcWEtYm9yZGVyLVsjOUNBM0FGXSBob3ZlcjpjcWEtYmctWyNGOUZBRkJdIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy0yIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctWyMzRjQzRUVdIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctb2Zmc2V0LTJcIlxuICAgICAgICAgIChjbGljayk9XCJvbkVkaXRDbGljaygpXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LVsxNHB4XSAhY3FhLWgtWzE0cHhdICFjcWEtdGV4dC1bMTRweF1cIj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3Bhbj5FZGl0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImRlc2NyaXB0aW9uQ29udGVudFwiIGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJlbmFibGVNYXJrZG93blwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXByb3NlIGNxYS1wcm9zZS1zbSBjcWEtbWF4LXctbm9uZVwiXG4gICAgICAgICAgW3N0eWxlXT1cIighZGVzY3JpcHRpb25FeHBhbmRlZCAmJiBzaG93RGVzY3JpcHRpb25SZWFkTW9yZSkgPyAnZGlzcGxheTogLXdlYmtpdC1ib3g7IC13ZWJraXQtbGluZS1jbGFtcDogNDsgbGluZS1jbGFtcDogNDsgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsgb3ZlcmZsb3c6IGhpZGRlbjsnIDogJydcIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwiZGVzY3JpcHRpb25Db250ZW50XCI+PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIiFlbmFibGVNYXJrZG93blwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWxcIlxuICAgICAgICAgIFtzdHlsZV09XCIoIWRlc2NyaXB0aW9uRXhwYW5kZWQgJiYgc2hvd0Rlc2NyaXB0aW9uUmVhZE1vcmUpID8gJ2Rpc3BsYXk6IC13ZWJraXQtYm94OyAtd2Via2l0LWxpbmUtY2xhbXA6IDQ7IGxpbmUtY2xhbXA6IDQ7IC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7IG92ZXJmbG93OiBoaWRkZW47JyA6ICcnXCI+e3sgZGVzY3JpcHRpb25Db250ZW50IH19PC9kaXY+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dEZXNjcmlwdGlvblJlYWRNb3JlXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gaG92ZXI6Y3FhLXVuZGVybGluZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1zZWxmLXN0YXJ0IGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy0yIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctWyMzRjQzRUVdIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctb2Zmc2V0LTJcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEZXNjcmlwdGlvbkV4cGFuZCgpXCI+XG4gICAgICAgICAge3sgZGVzY3JpcHRpb25FeHBhbmRlZCA/ICdSZWFkIGxlc3MnIDogJ1JlYWQgbW9yZScgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTWV0YWRhdGEgU2VjdGlvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyZWRNZXRhZGF0YUl0ZW1zLmxlbmd0aFwiIGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMi41XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZ3JpZCBjcWEtZ3JpZC1jb2xzLTIgY3FhLWdhcC14LTAgY3FhLWdhcC15LTRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZE1ldGFkYXRhSXRlbXM7IHRyYWNrQnk6IHRyYWNrQnlNZXRhZGF0YUxhYmVsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0wLjVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQteHMgY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bVwiPnt7IGl0ZW0ubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzVweF0gY3FhLW1pbi13LTAgY3FhLXctZnVsbCBjcWEtdGV4dC1sZWZ0IGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGNUY1RjVdXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIml0ZW0uaWNvbiAmJiAoIWl0ZW0uaWNvbkxpYnJhcnkgfHwgaXRlbS5pY29uTGlicmFyeSA9PT0gJ21hdCcpXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtc20gY3FhLXctNCBjcWEtaC00XCI+XG4gICAgICAgICAgICAgICAge3sgaXRlbS5pY29uIH19XG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5zdGF0dXNDb2xvclwiIGNsYXNzPVwiY3FhLXctWzEwcHhdIGNxYS1oLVsxMHB4XSBjcWEtcm91bmRlZC1mdWxsIGNxYS1mbGV4LXNocmluay0wXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzRG90Q2xhc3MoaXRlbSlcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmxpbmtcIlxuICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMyNTYzRUJdIGNxYS10ZXh0LXhzIGNxYS1sZWFkaW5nLVsxMnB4XSBjcWEtZm9udC1ub3JtYWwgaG92ZXI6Y3FhLXVuZGVybGluZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJsb2NrIGNxYS10cnVuY2F0ZSBjcWEtbWluLXctMFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWV0YWRhdGFMaW5rQ2xpY2soaXRlbSk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICAgICAgICAgICAge3sgaXRlbS52YWx1ZSB9fVxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWl0ZW0ubGlua1wiIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLWxlYWRpbmctWzEycHhdIGNxYS1mb250LW5vcm1hbCBjcWEtYWxpZ24tbWlkZGxlXCIgW25nQ2xhc3NdPVwiZ2V0VmFsdWVUZXh0Q2xhc3MoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLnZhbHVlIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMYWJlbHMgKEZpZ21hOiBMYWJlbHMgdGl0bGUsIGNxYS1iYWRnZSBjaGlwcyB3aXRoIHRhZyBpY29uKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibGFiZWxzLmxlbmd0aFwiIGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMiBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS1sZWFkaW5nLTVcIj5MYWJlbHM8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBsYWJlbHNcIlxuICAgICAgICAgIFtsYWJlbF09XCJsYWJlbFwiXG4gICAgICAgICAgaWNvbj1cImxhYmVsXCJcbiAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I9XCIjZmZmZmZmXCJcbiAgICAgICAgICB0ZXh0Q29sb3I9XCIjNDc1NTY5XCJcbiAgICAgICAgICBib3JkZXJDb2xvcj1cIiNFMkU4RjBcIlxuICAgICAgICAgIGljb25Db2xvcj1cIiM5NEEzQjhcIj5cbiAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ29uZmlndXJhdGlvbiBTZWN0aW9uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjb25maWdTZWN0aW9ucy5sZW5ndGggfHwgY29uZmlnU2VjdGlvbnNSb3cyLmxlbmd0aFwiIGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMi41XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5zZXR0aW5nczwvbWF0LWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzE5LjZweF1cIj57eyBjb25maWdUaXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0yLjVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWdyaWQgY3FhLWdyaWQtY29scy0xIGNxYS1nYXAtMi41XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBjb25maWdTZWN0aW9uczsgdHJhY2tCeTogdHJhY2tCeUNvbmZpZ1RpdGxlXCI+XG4gICAgICAgICAgICA8Y3FhLWNvbmZpZ3VyYXRpb24tY2FyZFxuICAgICAgICAgICAgICBbaWNvbl09XCJzZWN0aW9uLmljb24gfHwgJ3R1bmUnXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cInNlY3Rpb24udGl0bGVcIlxuICAgICAgICAgICAgICBbZGF0YV09XCJzZWN0aW9uLml0ZW1zXCI+XG4gICAgICAgICAgICA8L2NxYS1jb25maWd1cmF0aW9uLWNhcmQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnU2VjdGlvbnNSb3cyLmxlbmd0aFwiIGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+XG4gICAgICAgICAgPGNxYS1jb25maWd1cmF0aW9uLWNhcmRcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIGNvbmZpZ1NlY3Rpb25zUm93MjsgdHJhY2tCeTogdHJhY2tCeUNvbmZpZ1RpdGxlXCJcbiAgICAgICAgICAgIFtpY29uXT1cInNlY3Rpb24uaWNvbiB8fCAndHVuZSdcIlxuICAgICAgICAgICAgW3RpdGxlXT1cInNlY3Rpb24udGl0bGVcIlxuICAgICAgICAgICAgW2RhdGFdPVwic2VjdGlvbi5pdGVtc1wiPlxuICAgICAgICAgIDwvY3FhLWNvbmZpZ3VyYXRpb24tY2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gQVBJIE1vY2tpbmcgQ2FyZCAocmVhZC1vbmx5KSAtLT5cbiAgICAgIDxjcWEtYXBpLW1vY2tpbmctY2FyZFxuICAgICAgICAqbmdJZj1cInNob3dBcGlNb2NraW5nQ2FyZFwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCJcbiAgICAgICAgW3RpdGxlXT1cImFwaU1vY2tpbmdUaXRsZVwiXG4gICAgICAgIFtzdGF0dXNMYWJlbF09XCJhcGlNb2NraW5nU3RhdHVzTGFiZWxcIlxuICAgICAgICBbY2FwdHVyZUxhYmVsXT1cImFwaU1vY2tpbmdDYXB0dXJlTGFiZWxcIlxuICAgICAgICBbcmVuZXdMYWJlbF09XCJhcGlNb2NraW5nUmVuZXdMYWJlbFwiXG4gICAgICAgIFtyZXN0b3JlTW9ja109XCJhcGlNb2NraW5nUmVzdG9yZU1vY2tcIlxuICAgICAgICBbc3RvcmVNb2NrXT1cImFwaU1vY2tpbmdTdG9yZU1vY2tcIlxuICAgICAgICBbbW9ja2VkQXBpc0NvdW50XT1cImFwaU1vY2tpbmdNb2NrZWRBcGlzQ291bnRcIlxuICAgICAgICBbdG90YWxBcGlzQ291bnRdPVwiYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50XCJcbiAgICAgICAgW3Byb2dyZXNzUGVyY2VudF09XCJhcGlNb2NraW5nUHJvZ3Jlc3NQZXJjZW50XCJcbiAgICAgICAgW3Nob3dQcm9ncmVzc109XCJhcGlNb2NraW5nU2hvd1Byb2dyZXNzXCJcbiAgICAgICAgW3N1bW1hcnlUZXh0XT1cImFwaU1vY2tpbmdTdW1tYXJ5VGV4dFwiXG4gICAgICAgIFtwZXJjZW50VGV4dF09XCJhcGlNb2NraW5nUGVyY2VudFRleHRcIlxuICAgICAgICBbY29uZmlndXJlQnV0dG9uTGFiZWxdPVwiYXBpTW9ja2luZ0NvbmZpZ3VyZUJ1dHRvbkxhYmVsXCJcbiAgICAgICAgW2VkaXRpbmddPVwiZmFsc2VcIlxuICAgICAgICAoY29uZmlndXJlKT1cImNvbmZpZ3VyZUFwaU1vY2tpbmcuZW1pdCgpXCI+XG4gICAgICA8L2NxYS1hcGktbW9ja2luZy1jYXJkPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|