@libs-ui/components-preview-text-data 0.2.357-14 → 0.2.357-16

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.
@@ -349,10 +349,10 @@ export class LibsUiComponentsPreviewTextDataComponent {
349
349
  });
350
350
  }
351
351
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
352
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPreviewTextDataComponent, isStandalone: true, selector: "libs_ui-components-preview_text_data", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, langSelected: { classPropertyName: "langSelected", publicName: "langSelected", isSignal: true, isRequired: true, transformFunction: null }, langsAccept: { classPropertyName: "langsAccept", publicName: "langsAccept", isSignal: true, isRequired: false, transformFunction: null }, langsChangeLabel: { classPropertyName: "langsChangeLabel", publicName: "langsChangeLabel", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, hiddenAction: { classPropertyName: "hiddenAction", publicName: "hiddenAction", isSignal: true, isRequired: false, transformFunction: null }, minLines: { classPropertyName: "minLines", publicName: "minLines", isSignal: true, isRequired: false, transformFunction: null }, maxLines: { classPropertyName: "maxLines", publicName: "maxLines", isSignal: true, isRequired: false, transformFunction: null }, containerElement: { classPropertyName: "containerElement", publicName: "containerElement", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopover: { classPropertyName: "zIndexPopover", publicName: "zIndexPopover", isSignal: true, isRequired: false, transformFunction: null }, lintIgnorePatterns: { classPropertyName: "lintIgnorePatterns", publicName: "lintIgnorePatterns", isSignal: true, isRequired: false, transformFunction: null }, completions: { classPropertyName: "completions", publicName: "completions", isSignal: true, isRequired: false, transformFunction: null }, forbiddenPatterns: { classPropertyName: "forbiddenPatterns", publicName: "forbiddenPatterns", isSignal: true, isRequired: false, transformFunction: null }, background: { classPropertyName: "background", publicName: "background", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { langSelected: "langSelectedChange", outChange: "outChange", syntaxErrors: "syntaxErrors", outViolations: "outViolations" }, viewQueries: [{ propertyName: "containerPreview", first: true, predicate: ["containerPreview"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [zIndex]=\"zIndexPopover()\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
352
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPreviewTextDataComponent, isStandalone: true, selector: "libs_ui-components-preview_text_data", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, langSelected: { classPropertyName: "langSelected", publicName: "langSelected", isSignal: true, isRequired: true, transformFunction: null }, langsAccept: { classPropertyName: "langsAccept", publicName: "langsAccept", isSignal: true, isRequired: false, transformFunction: null }, langsChangeLabel: { classPropertyName: "langsChangeLabel", publicName: "langsChangeLabel", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, hiddenAction: { classPropertyName: "hiddenAction", publicName: "hiddenAction", isSignal: true, isRequired: false, transformFunction: null }, minLines: { classPropertyName: "minLines", publicName: "minLines", isSignal: true, isRequired: false, transformFunction: null }, maxLines: { classPropertyName: "maxLines", publicName: "maxLines", isSignal: true, isRequired: false, transformFunction: null }, containerElement: { classPropertyName: "containerElement", publicName: "containerElement", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopover: { classPropertyName: "zIndexPopover", publicName: "zIndexPopover", isSignal: true, isRequired: false, transformFunction: null }, lintIgnorePatterns: { classPropertyName: "lintIgnorePatterns", publicName: "lintIgnorePatterns", isSignal: true, isRequired: false, transformFunction: null }, completions: { classPropertyName: "completions", publicName: "completions", isSignal: true, isRequired: false, transformFunction: null }, forbiddenPatterns: { classPropertyName: "forbiddenPatterns", publicName: "forbiddenPatterns", isSignal: true, isRequired: false, transformFunction: null }, background: { classPropertyName: "background", publicName: "background", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { langSelected: "langSelectedChange", outChange: "outChange", syntaxErrors: "syntaxErrors", outViolations: "outViolations" }, viewQueries: [{ propertyName: "containerPreview", first: true, predicate: ["containerPreview"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [zIndex]=\"zIndexPopover()\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "onlyEmitMultiKeyWhenManualClick", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
353
353
  }
354
354
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, decorators: [{
355
355
  type: Component,
356
356
  args: [{ selector: 'libs_ui-components-preview_text_data', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent], template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [zIndex]=\"zIndexPopover()\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"] }]
357
357
  }], ctorParameters: () => [] });
358
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JMLE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBYSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBYyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBa0IsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2SSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRCxPQUFPLEVB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MnlFQzVCckQsMjZEQTBDQSxvM0JEaEJZLGlDQUFpQyx1M0RBQUUsc0NBQXNDOzs0RkFFeEUsd0NBQXdDO2tCQVRwRCxTQUFTOytCQUVFLHNDQUFzQyxjQUdwQyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxpQ0FBaUMsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpYWdub3N0aWMsIGxpbnRlciwgbGludEd1dHRlciB9IGZyb20gJ0Bjb2RlbWlycm9yL2xpbnQnO1xuaW1wb3J0IHsgQ29tcGFydG1lbnQsIEV4dGVuc2lvbiwgUHJlYyB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IEVkaXRvclZpZXcsIGxpbmVOdW1iZXJzLCBWaWV3VXBkYXRlIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgYmFzaWNTZXR1cCB9IGZyb20gJ2NvZGVtaXJyb3I2JztcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRMYW5ndWFnZSwgaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZywgbGFuZ3VhZ2VSZWdpc3RyeSwgb3B0aW9uc0xhbmdEYXRhIH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5kZWZpbmUnO1xuaW1wb3J0IHsgY29tcHV0ZUpzRGlhZ25vc3RpY3MgfSBmcm9tICcuL2xpbnRlcnMvanMtbGludGVyJztcbmltcG9ydCB7IGNvbXB1dGVKc29uRGlhZ25vc3RpY3MgfSBmcm9tICcuL2xpbnRlcnMvanNvbi1saW50ZXInO1xuaW1wb3J0IHsgY29tcHV0ZVNxbERpYWdub3N0aWNzIH0gZnJvbSAnLi9saW50ZXJzL3NxbC1saW50ZXInO1xuaW1wb3J0IHsgY29tcHV0ZVB5dGhvbkRpYWdub3N0aWNzIH0gZnJvbSAnLi9saW50ZXJzL3B5dGhvbi1saW50ZXInO1xuaW1wb3J0IHsgYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uIH0gZnJvbSAnLi9lZGl0b3IvZWRpdG9yLWNvbXBsZXRpb25zJztcbmltcG9ydCB7IGJ1aWxkRm9yYmlkZGVuRXh0ZW5zaW9uIH0gZnJvbSAnLi9lZGl0b3IvZWRpdG9yLWZvcmJpZGRlbic7XG5pbXBvcnQgeyBhcHBseU1heEhlaWdodCwgYXBwbHlNaW5MaW5lcyB9IGZyb20gJy4vZWRpdG9yL2VkaXRvci1oZWlnaHQnO1xuaW1wb3J0IHsgSUxhbmd1YWdlT3B0aW9ucywgSVByZXZpZXdUZXh0RGF0YUNoYW5nZSwgSVByZXZpZXdUZXh0RGF0YUNvbXBsZXRpb25JdGVtLCBJUHJldmlld1RleHREYXRhVmlvbGF0aW9uLCBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JULCBUX0ZvcmJpZGRlblBhdHRlcm4gfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmludGVyZmFjZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcHJldmlld190ZXh0X2RhdGEnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0xpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUHJldmlld1RleHREYXRhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBQUk9QRVJUSUVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBlZGl0b3JWaWV3SW5zdGFuY2U/OiBFZGl0b3JWaWV3O1xuICBwcml2YXRlIHJlYWRvbmx5IHdyYXBDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5lTnVtYmVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW50ZXJDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBsZXRpb25zQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JiaWRkZW5Db21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGVudFN0YXRlTm9XcmFwID0gc2lnbmFsKCcnKTtcblxuICAvKiogQ2FjaGUgxJHhu4MgdHLDoW5oIGxvYWQgbOG6oWkgbGFuZ3VhZ2UgxJHDoyBsb2FkICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFuZ3VhZ2VDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFeHRlbnNpb24+KCk7XG5cbiAgLyoqIEZsYWcgxJHhu4MgdHLDoW5oIHVwZGF0ZSBlZGl0b3Iga2hpIMSRYW5nIGto4bufaSB04bqhbyAqL1xuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJTkpFQ1RFRCBTRVJWSUNFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBST1RFQ1RFRCBTSUdOQUxTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzV3JhcCA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4oaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZygpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxhYmVsTGFuZyA9IGNvbXB1dGVkKCgpID0+IG9wdGlvbnNMYW5nRGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0aGlzLmxhbmdTZWxlY3RlZCgpKT8ubGFiZWwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjZXB0Q2hhbmdlTGFuZyA9IGNvbXB1dGVkKCgpID0+ICEodGhpcy5sYW5nU2VsZWN0ZWQoKSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/LmluY2x1ZGVzKHRoaXMubGFuZ1NlbGVjdGVkKCkpKSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5QVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgY29udGVudCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogc3RyaW5nKSA9PiB2YWx1ZSA/PyAnJyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbGFuZ1NlbGVjdGVkID0gbW9kZWwucmVxdWlyZWQ8UFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NBY2NlcHQgPSBpbnB1dDxBcnJheTxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NDaGFuZ2VMYWJlbCA9IGlucHV0PElMYW5ndWFnZU9wdGlvbnMgfCB1bmRlZmluZWQ+KCk7XG5cbiAgcmVhZG9ubHkgZWRpdGFibGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhpZGRlbkFjdGlvbiA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBib29sZWFuKSA9PiB2YWx1ZSA/PyBmYWxzZSxcbiAgfSk7XG5cbiAgLyoqIFPhu5EgZMOybmcgdOG7kWkgdGhp4buDdTogbuG6v3UgY29udGVudCDDrXQgZMOybmcgaMahbiBz4bq9IHThu7EgYsO5IGTDsm5nIHRy4buRbmcgKHjhu60gbMO9IDEgbOG6p24ga2hpIGto4bufaSB04bqhbyBlZGl0b3IpLiBC4buPIHRy4buRbmcgPSBraMO0bmcgYsO5LiAqL1xuICByZWFkb25seSBtaW5MaW5lcyA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4oKTtcbiAgLyoqIFPhu5EgZMOybmcgdOG7kWkgxJFhOiB2xrDhu6N0IHF1w6EgZWRpdG9yIHPhur0gZ2nhu5tpIGjhuqFuIGNoaeG7gXUgY2FvIHbDoCB4deG6pXQgaGnhu4duIHbDuW5nIGN14buZbiAoeOG7rSBsw70gMSBs4bqnbiBraGkga2jhu59pIHThuqFvIGVkaXRvcikuIELhu48gdHLhu5FuZyA9IGtow7RuZyBnaeG7m2kgaOG6oW4uICovXG4gIHJlYWRvbmx5IG1heExpbmVzID0gaW5wdXQ8bnVtYmVyIHwgdW5kZWZpbmVkPigpO1xuICAvKipcbiAgICogRWxlbWVudCBjb250YWluZXIgYsOqbiBuZ2/DoGkgxJHhu4MgZWRpdG9yIHThu7EgdMOtbmggY2hp4buBdSBjYW8gdGhlbyBgbWluLWhlaWdodGAvYG1heC1oZWlnaHRgIChDU1MpIGPhu6dhIG7Dsy5cbiAgICogS2hpIHRydXnhu4FuLCBlZGl0b3IgxJHhu41jIG1pbi9tYXgtaGVpZ2h0IGPhu6dhIGNvbnRhaW5lciwgdHLhu6sgcGjhuqduIGhlYWRlci90b29sYmFyIHBow61hIHRyw6puLCBy4buTaSBzbmFwXG4gICAqIGNoaeG7gXUgY2FvIHbDuW5nIGN14buZbiB24buBIMSRw7puZyBi4buZaSBz4buRIGTDsm5nIChraMO0bmcgY+G6r3QgbuG7rWEgZMOybmcpICsgYuG6rXQgc2Nyb2xsIGtoaSB2xrDhu6N0IG1heC5cbiAgICogQ+G6pE0gY+G6pXUgaMOsbmggxJHhu5NuZyB0aOG7nWkgduG7m2kgYG1pbkxpbmVzYC9gbWF4TGluZXNgIChz4bq9IHRocm93IGzhu5dpKSDigJQgY29udGFpbmVyIHThu7EgcXXhuqNuIGzDvSBtaW4vbWF4LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyRWxlbWVudCA9IGlucHV0PEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkPigpO1xuICAvKiogei1pbmRleCBjaG8gcG9wb3ZlciBkcm9wZG93biBjaOG7jW4gbmfDtG4gbmfhu68uICovXG4gIHJlYWRvbmx5IHpJbmRleFBvcG92ZXIgPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG5cbiAgcmVhZG9ubHkgbGludElnbm9yZVBhdHRlcm5zID0gaW5wdXQ8QXJyYXk8c3RyaW5nPiwgQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZD4oWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogQXJyYXk8c3RyaW5nPikgPT4gdmFsdWUgPz8gWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERhbmggc8OhY2ggxJHhu5FpIHTGsOG7o25nL2Jp4bq/biBn4bujaSDDvSBraGkgZ8O1IOKAlCBnaeG7kW5nIEludGVsbGlTZW5zZSB0cm9uZyBJREUuXG4gICAqIEjhu5cgdHLhu6MgZG90LW5vdGF0aW9uOiDEkeG7i25oIG5naMSpYSBgcHJvcGVydGllc2AgxJHhu4MgZ+G7o2kgw70gc2F1IGThuqV1IGAuYFxuICAgKiBAZXhhbXBsZVxuICAgKiBbY29tcGxldGlvbnNdPVwiW3sgbGFiZWw6ICd1c2VyJywgcHJvcGVydGllczogW3sgbGFiZWw6ICduYW1lJywgZGV0YWlsOiAnc3RyaW5nJyB9XSB9XVwiXG4gICAqL1xuICByZWFkb25seSBjb21wbGV0aW9ucyA9IGlucHV0PElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdLCBJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSB8IHVuZGVmaW5lZD4oW10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdKSA9PiB2YWx1ZSA/PyBbXSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERhbmggc8OhY2ggcGF0dGVybiBj4bqlbSDigJQgY2h14buXaSBsaXRlcmFsIGhv4bq3YyBSZWdFeHAuXG4gICAqIEtoaSBwaMOhdCBoaeG7h24gdmkgcGjhuqFtOiBoaWdobGlnaHQgxJHhu48gdOG6oWkgxJHDum5nIHbhu4sgdHLDrSArIGNo4bq3biBwYXN0ZSArIGVtaXQgYChvdXRWaW9sYXRpb25zKWAuXG4gICAqIETDuW5nIGBERUZBVUxUX1NFQ1VSSVRZX1BBVFRFUk5TYCDEkeG7gyDDoXAgZOG7pW5nIGLhu5kgcXV5IHThuq9jIGLhuqNvIG3huq10IG3hurdjIMSR4buLbmggY2hvIGxvdy1jb2RlLlxuICAgKiBAZXhhbXBsZVxuICAgKiBbZm9yYmlkZGVuUGF0dGVybnNdPVwiZGVmYXVsdFNlY3VyaXR5UGF0dGVybnNcIlxuICAgKiBbZm9yYmlkZGVuUGF0dGVybnNdPVwiWy9ldmFsXFxzKlxcKC8sICdsb2NhbFN0b3JhZ2UnXVwiXG4gICAqL1xuICByZWFkb25seSBmb3JiaWRkZW5QYXR0ZXJucyA9IGlucHV0PFRfRm9yYmlkZGVuUGF0dGVybltdLCBUX0ZvcmJpZGRlblBhdHRlcm5bXSB8IHVuZGVmaW5lZD4oW10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IFRfRm9yYmlkZGVuUGF0dGVybltdKSA9PiB2YWx1ZSA/PyBbXSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYmFja2dyb3VuZCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignI2Y4ZjlmYScsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IHN0cmluZykgPT4gdmFsdWUgPz8gJyNmOGY5ZmEnLFxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPVVRQVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgb3V0Q2hhbmdlID0gb3V0cHV0PElQcmV2aWV3VGV4dERhdGFDaGFuZ2U+KCk7XG4gIHJlYWRvbmx5IHN5bnRheEVycm9ycyA9IG91dHB1dDxEaWFnbm9zdGljW10+KCk7XG4gIHJlYWRvbmx5IG91dFZpb2xhdGlvbnMgPSBvdXRwdXQ8SVByZXZpZXdUZXh0RGF0YVZpb2xhdGlvbltdPigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFZJRVcgQ0hJTERSRU5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lclByZXZpZXcgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJQcmV2aWV3Jyk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ09OU1RSVUNUT1IgLSBTZXR1cCBlZmZlY3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRWZmZWN0IMSR4buDIHN5bmMgY29udGVudCB04burIGlucHV0IHbDoG8gZWRpdG9yXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSB0aGlzLmNvbnRlbnQoKTtcbiAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRlbnQgPSB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IGN1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgICB0bzogY3VycmVudENvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgICBpbnNlcnQ6IG5ld0NvbnRlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBFZmZlY3QgxJHhu4MgY+G6rXAgbmjhuq10IGN1c3RvbSBjb21wbGV0aW9ucyBraGkgaW5wdXQgdGhheSDEkeG7lWlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmNvbXBsZXRpb25zKCk7XG4gICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCB8fCAhdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHJldHVybjtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlLmRpc3BhdGNoKHtcbiAgICAgICAgZWZmZWN0czogdGhpcy5jb21wbGV0aW9uc0NvbXBhcnRtZW50LnJlY29uZmlndXJlKGl0ZW1zLmxlbmd0aCA/IGJ1aWxkQ29tcGxldGlvbkV4dGVuc2lvbihpdGVtcykgOiBbXSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEVmZmVjdCDEkeG7gyBj4bqtcCBuaOG6rXQgZm9yYmlkZGVuIHBhdHRlcm5zIGtoaSBpbnB1dCB0aGF5IMSR4buVaVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuZm9yYmlkZGVuUGF0dGVybnMoKTtcbiAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkIHx8ICF0aGlzLmVkaXRvclZpZXdJbnN0YW5jZSkgcmV0dXJuO1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICBlZmZlY3RzOiB0aGlzLmZvcmJpZGRlbkNvbXBhcnRtZW50LnJlY29uZmlndXJlKHBhdHRlcm5zLmxlbmd0aCA/IGJ1aWxkRm9yYmlkZGVuRXh0ZW5zaW9uKHBhdHRlcm5zLCAodmlvbGF0aW9ucykgPT4gdGhpcy5vdXRWaW9sYXRpb25zLmVtaXQodmlvbGF0aW9ucykpIDogW10pLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhbnVwIGtoaSBjb21wb25lbnQgYuG7iyBkZXN0cm95XG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgICAgdGhpcy5sYW5ndWFnZUNhY2hlLmNsZWFyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMSUZFQ1lDTEUgSE9PS1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYW5nc0FjY2VwdCgpPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcuc2V0KGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcodGhpcy5sYW5nc0FjY2VwdCgpLCB0aGlzLmxhbmdzQ2hhbmdlTGFiZWwoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVFZGl0b3IoKTtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gRWRpdG9yIGluaXRpYWxpemF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEto4bufaSB04bqhbyBlZGl0b3IgduG7m2kgY8OhYyBleHRlbnNpb25zIGPGoSBi4bqjblxuICAgKiBMYW5ndWFnZSDEkcaw4bujYyBsb2FkIGFzeW5jIMSR4buDIHThu5FpIMawdSBidW5kbGUgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplRWRpdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhbmd1YWdlRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGFuZ3VhZ2VFeHRlbnNpb24odGhpcy5sYW5nU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGludGVyRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKHRoaXMubGFuZ1NlbGVjdGVkKCkpO1xuXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UgPSBuZXcgRWRpdG9yVmlldyh7XG4gICAgICBkb2M6IGFwcGx5TWluTGluZXModGhpcy5jb250ZW50KCksIHRoaXMubWluTGluZXMoKSksXG4gICAgICBwYXJlbnQ6IHRoaXMuY29udGFpbmVyUHJldmlldygpLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmNyZWF0ZUV4dGVuc2lvbnMobGFuZ3VhZ2VFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbiksXG4gICAgfSk7XG4gICAgYXBwbHlNYXhIZWlnaHQodGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UsIHsgbWluTGluZXM6IHRoaXMubWluTGluZXMoKSwgbWF4TGluZXM6IHRoaXMubWF4TGluZXMoKSwgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBkYW5oIHPDoWNoIGV4dGVuc2lvbnMgY2hvIGVkaXRvclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFeHRlbnNpb25zKGxhbmd1YWdlRXh0ZW5zaW9uOiBFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbjogRXh0ZW5zaW9uKTogRXh0ZW5zaW9uW10ge1xuICAgIGNvbnN0IGluaXRpYWxDb21wbGV0aW9ucyA9IHRoaXMuY29tcGxldGlvbnMoKTtcbiAgICBjb25zdCBpbml0aWFsUGF0dGVybnMgPSB0aGlzLmZvcmJpZGRlblBhdHRlcm5zKCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGJhc2ljU2V0dXAsXG4gICAgICB0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQub2YobGFuZ3VhZ2VFeHRlbnNpb24pLFxuICAgICAgdGhpcy5saW50ZXJDb21wYXJ0bWVudC5vZihsaW50ZXJFeHRlbnNpb24pLFxuICAgICAgLy8gQ29tcGFydG1lbnQgY2hvIGN1c3RvbSBjb21wbGV0aW9ucyDigJQgUHJlYy5oaWdoZXN0IMSR4buDIG92ZXJyaWRlIGJhc2ljU2V0dXAncyBhdXRvY29tcGxldGlvblxuICAgICAgUHJlYy5oaWdoZXN0KHRoaXMuY29tcGxldGlvbnNDb21wYXJ0bWVudC5vZihpbml0aWFsQ29tcGxldGlvbnMubGVuZ3RoID8gYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uKGluaXRpYWxDb21wbGV0aW9ucykgOiBbXSkpLFxuICAgICAgdGhpcy5mb3JiaWRkZW5Db21wYXJ0bWVudC5vZihpbml0aWFsUGF0dGVybnMubGVuZ3RoID8gYnVpbGRGb3JiaWRkZW5FeHRlbnNpb24oaW5pdGlhbFBhdHRlcm5zLCAodmlvbGF0aW9ucykgPT4gdGhpcy5vdXRWaW9sYXRpb25zLmVtaXQodmlvbGF0aW9ucykpIDogW10pLFxuICAgICAgdGhpcy5jcmVhdGVMaWdodFRoZW1lKCksXG4gICAgICBFZGl0b3JWaWV3LmVkaXRhYmxlLm9mKHRoaXMuZWRpdGFibGUoKSksXG4gICAgICB0aGlzLndyYXBDb21wYXJ0bWVudC5vZihFZGl0b3JWaWV3LmxpbmVXcmFwcGluZyksXG4gICAgICB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5vZihsaW5lTnVtYmVycygpKSxcbiAgICAgIGxpbnRHdXR0ZXIoKSxcbiAgICAgIHRoaXMuY3JlYXRlQnJhY2tldFRoZW1lKCksXG4gICAgICB0aGlzLmNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxhbmd1YWdlIGV4dGVuc2lvbiB24bubaSBjYWNoaW5nXG4gICAqIE3hu5dpIGxhbmd1YWdlIGNo4buJIMSRxrDhu6NjIGxvYWQgMSBs4bqnblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGFuZ3VhZ2VFeHRlbnNpb24obGFuZzogUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCk6IFByb21pc2U8RXh0ZW5zaW9uPiB7XG4gICAgY29uc3QgbG93ZXJMYW5nID0gbGFuZy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5sYW5ndWFnZUNhY2hlLmdldChsb3dlckxhbmcpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdHJ5SXRlbSA9IGxhbmd1YWdlUmVnaXN0cnlbbG93ZXJMYW5nXTtcbiAgICBjb25zdCBleHRlbnNpb24gPSByZWdpc3RyeUl0ZW0gPyBhd2FpdCByZWdpc3RyeUl0ZW0ubG9hZGVyKCkgOiBhd2FpdCBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UoKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VDYWNoZS5zZXQobG93ZXJMYW5nLCBleHRlbnNpb24pO1xuICAgIHJldHVybiBleHRlbnNpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBsaW50ZXIgZXh0ZW5zaW9uIG7hur91IGPDs1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGludGVyRXh0ZW5zaW9uKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBQcm9taXNlPEV4dGVuc2lvbj4ge1xuICAgIGNvbnN0IGxvd2VyTGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCByZWdpc3RyeUl0ZW0gPSBsYW5ndWFnZVJlZ2lzdHJ5W2xvd2VyTGFuZ107XG5cbiAgICBpZiAocmVnaXN0cnlJdGVtPy5saW50ZXIpIHtcbiAgICAgIHJldHVybiByZWdpc3RyeUl0ZW0ubGludGVyKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW50ZXIoKCkgPT4gW10pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gVGhlbWUgY29uZmlndXJhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgY3JlYXRlTGlnaHRUaGVtZSgpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnRoZW1lKHtcbiAgICAgICcmJzogeyBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZCgpLCBjb2xvcjogJyMzMzMnIH0sXG4gICAgICAnLmNtLWNvbnRlbnQnOiB7IGNhcmV0Q29sb3I6ICcjMTExJyB9LFxuICAgICAgJy5jbS1hY3RpdmVMaW5lJzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZjBmMGYwJyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCcmFja2V0VGhlbWUoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnLmNtLW1hdGNoaW5nQnJhY2tldCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgxMDAsIDIwMCwgMjU1LCAwLjE1KScsXG4gICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCByZ2JhKDEwMCwgMjAwLCAyNTUsIDAuNCknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuMnMgZWFzZScsXG4gICAgICB9LFxuICAgICAgJy5jbS1ub25tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAxMDAsIDEwMCwgMC4xNSknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgyNTUsIDEwMCwgMTAwLCAwLjMpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBVcGRhdGUgbGlzdGVuZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudXBkYXRlTGlzdGVuZXIub2YoKHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkICYmIHRoaXMuZWRpdGFibGUoKSkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHVwZGF0ZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgY29udGVudDogbmV3VmFsdWUsXG4gICAgICAgICAgaXNXcmFwOiAhdGhpcy5pc1dyYXAoKSxcbiAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgICAgICBjb250ZXh0Q2hhbmdlOiAnY29udGVudCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFVCTElDIE1FVEhPRFMgLSBMaW50ZXIgZmFjdG9yaWVzICjEkcaw4bujYyBn4buNaSB04burIHJlZ2lzdHJ5KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgLyoqIEphdmFTY3JpcHQvVHlwZVNjcmlwdCBsaW50ZXIg4oCUIHBpcGVsaW5lIHRyb25nIGBsaW50ZXJzL2pzLWxpbnRlci50c2AgKGJhYmVsICsgdHJhaWxpbmctZG90ICsgdGhp4bq/dSBgO2AgKyBiaeG6v24gY2jGsGEga2hhaSBiw6FvKS4gKi9cbiAgY3JlYXRlSnNMaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKGFzeW5jICh2aWV3KSA9PiB7XG4gICAgICBjb25zdCBkaWFnbm9zdGljcyA9IGF3YWl0IGNvbXB1dGVKc0RpYWdub3N0aWNzKHZpZXcuc3RhdGUuZG9jLCB2aWV3LnN0YXRlLmRvYy50b1N0cmluZygpLCBuZXcgU2V0KHRoaXMuY29tcGxldGlvbnMoKS5tYXAoKGl0ZW0pID0+IGl0ZW0ubGFiZWwpKSk7XG4gICAgICB0aGlzLnN5bnRheEVycm9ycy5lbWl0KGRpYWdub3N0aWNzKTtcbiAgICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBKU09OIGxpbnRlciDigJQgbG9naWMgdHJvbmcgYGxpbnRlcnMvanNvbi1saW50ZXIudHNgLiAqL1xuICBjcmVhdGVKc29uTGludGVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIGxpbnRlcigodmlldykgPT4ge1xuICAgICAgY29uc3QgZGlhZ25vc3RpY3MgPSBjb21wdXRlSnNvbkRpYWdub3N0aWNzKHZpZXcpO1xuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU1FMIGxpbnRlciDigJQgbG9naWMgdHJvbmcgYGxpbnRlcnMvc3FsLWxpbnRlci50c2AuICovXG4gIGNyZWF0ZVNxbExpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gY29tcHV0ZVNxbERpYWdub3N0aWNzKHZpZXcpO1xuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUHl0aG9uIGxpbnRlciDigJQgbG9naWMgdHJvbmcgYGxpbnRlcnMvcHl0aG9uLWxpbnRlci50c2AuICovXG4gIGNyZWF0ZVB5dGhvbkxpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gY29tcHV0ZVB5dGhvbkRpYWdub3N0aWNzKHZpZXcpO1xuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUk9URUNURUQgTUVUSE9EUyAtIEV2ZW50IGhhbmRsZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDb3B5KCk6IHZvaWQge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuY29udGVudCgpIHx8ICcnKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEluZm8oJ1NhbyBjaMOpcCB0aMOgbmggY8O0bmcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTGluZVdyYXAoKTogdm9pZCB7XG4gICAgLy8gTOG6pXkgbuG7mWkgZHVuZyBt4bubaSBuaOG6pXQgdOG7qyBlZGl0b3Igc2F1IGtoaSDEkcOjIHjDs2EgbmV3bGluZXNcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5zdGF0ZS5kb2MudG9TdHJpbmcoKSB8fCAnJztcbiAgICBpZiAodGhpcy5pc1dyYXAoKSkge1xuICAgICAgdGhpcy5jb250ZW50U3RhdGVOb1dyYXAuc2V0KGN1cnJlbnRDb250ZW50KTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSB0aGlzLmlzV3JhcCgpICYmIGN1cnJlbnRDb250ZW50ID8gY3VycmVudENvbnRlbnQucmVwbGFjZSgvXFxuL2csICcgJykgOiB0aGlzLmNvbnRlbnRTdGF0ZU5vV3JhcCgpO1xuICAgIHRoaXMuaXNXcmFwLnVwZGF0ZSgodmFsKSA9PiAhdmFsKTtcblxuICAgIGlmIChjdXJyZW50Q29udGVudCAhPT0gdXBkYXRlZENvbnRlbnQpIHtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICAgIGNoYW5nZXM6IHsgZnJvbTogMCwgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCwgaW5zZXJ0OiB1cGRhdGVkQ29udGVudCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQmF0Y2ggY+G6oyAyIGRpc3BhdGNoIHRow6BuaCAxIMSR4buDIHThu5FpIMawdSBwZXJmb3JtYW5jZVxuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICBlZmZlY3RzOiBbdGhpcy53cmFwQ29tcGFydG1lbnQucmVjb25maWd1cmUodGhpcy5pc1dyYXAoKSA/IEVkaXRvclZpZXcubGluZVdyYXBwaW5nIDogW10pLCB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gbGluZU51bWJlcnMoKSA6IFtdKV0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdEtleShkYXRhPzogSUVtaXRTZWxlY3RLZXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWRhdGE/LmtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0xhbmcgPSBkYXRhLmtleSBhcyBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUO1xuICAgIHRoaXMubGFuZ1NlbGVjdGVkLnNldChuZXdMYW5nKTtcblxuICAgIC8vIExvYWQgbGFuZ3VhZ2UgdsOgIGxpbnRlciBt4bubaVxuICAgIGNvbnN0IFtsYW5ndWFnZUV4dGVuc2lvbiwgbGludGVyRXh0ZW5zaW9uXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLmxvYWRMYW5ndWFnZUV4dGVuc2lvbihuZXdMYW5nKSwgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKG5ld0xhbmcpXSk7XG5cbiAgICAvLyBSZWNvbmZpZ3VyZSB0aGF5IHbDrCB04bqhbyBt4bubaSBzdGF0ZSDEkeG7gyBnaeG7ryBs4bqhaSBkb2N1bWVudCBjb250ZW50XG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IFt0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQucmVjb25maWd1cmUobGFuZ3VhZ2VFeHRlbnNpb24pLCB0aGlzLmxpbnRlckNvbXBhcnRtZW50LnJlY29uZmlndXJlKGxpbnRlckV4dGVuc2lvbildLFxuICAgIH0pO1xuXG4gICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnQoKSxcbiAgICAgIGlzV3JhcDogIXRoaXMuaXNXcmFwKCksXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgIGNvbnRleHRDaGFuZ2U6ICdsYW5ndWFnZScsXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLXByZXZpZXctZGF0YS1jb250YWluZXIgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1hdXRvIHJvdW5kZWQtWzhweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCBweC1bOHB4XVwiXG4gIFtzdHlsZS4tLWJhY2tncm91bmQtY29sb3JdPVwiYmFja2dyb3VuZCgpXCJcbiAgW2NsYXNzLnB0LVs4cHhdXT1cIiFoaWRkZW5BY3Rpb24oKVwiPlxuICBAaWYgKCFoaWRkZW5BY3Rpb24oKSkge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWJldHdlZW4gY29sb3ItWyM2YTczODNdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgIGNsYXNzSW5jbHVkZT1cInctWzIwMHB4XVwiXG4gICAgICAgIFtsaXN0Q29uZmlnXT1cImNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnKClcIlxuICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICBbekluZGV4XT1cInpJbmRleFBvcG92ZXIoKVwiXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFlZGl0YWJsZSgpIHx8ICFhY2NlcHRDaGFuZ2VMYW5nKClcIlxuICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0S2V5KCRldmVudClcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCJsYWJlbExhbmcoKSB8fCAnJ1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCcgOiAnJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzBweF0nICsgKGVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJycgOiAnIXBvaW50ZXItZXZlbnRzLW5vbmUgIWN1cnNvci1kZWZhdWx0IGhvdmVyOiF0ZXh0LVsjNkE3MzgzXScpXCIgLz5cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwiaXNXcmFwKCkgPyAnaTE4bl9yZW1vdmVfbGluZV93cmFwJyA6ICdpMThuX2xpbmVfd3JhcCdcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImlzV3JhcCgpID8gJ2xpYnMtdWktaWNvbi11bndyYXAnIDogJ2xpYnMtdWktaWNvbi13cmFwJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4IG1vLWxpYi1tci0xNnB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJMaW5lV3JhcCgpXCIgLz5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCInaTE4bl9jb3B5J1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1jb3B5J1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDb3B5KClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbiAgPGRpdiAjY29udGFpbmVyUHJldmlldz48L2Rpdj5cbjwvZGl2PlxuIl19
358
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JMLE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBYSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBYyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBa0IsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2SSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRCxPQUFPLEVB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MnlFQzVCckQsMjZEQTBDQSxvM0JEaEJZLGlDQUFpQywwNURBQUUsc0NBQXNDOzs0RkFFeEUsd0NBQXdDO2tCQVRwRCxTQUFTOytCQUVFLHNDQUFzQyxjQUdwQyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxpQ0FBaUMsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpYWdub3N0aWMsIGxpbnRlciwgbGludEd1dHRlciB9IGZyb20gJ0Bjb2RlbWlycm9yL2xpbnQnO1xuaW1wb3J0IHsgQ29tcGFydG1lbnQsIEV4dGVuc2lvbiwgUHJlYyB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IEVkaXRvclZpZXcsIGxpbmVOdW1iZXJzLCBWaWV3VXBkYXRlIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgYmFzaWNTZXR1cCB9IGZyb20gJ2NvZGVtaXJyb3I2JztcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRMYW5ndWFnZSwgaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZywgbGFuZ3VhZ2VSZWdpc3RyeSwgb3B0aW9uc0xhbmdEYXRhIH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5kZWZpbmUnO1xuaW1wb3J0IHsgY29tcHV0ZUpzRGlhZ25vc3RpY3MgfSBmcm9tICcuL2xpbnRlcnMvanMtbGludGVyJztcbmltcG9ydCB7IGNvbXB1dGVKc29uRGlhZ25vc3RpY3MgfSBmcm9tICcuL2xpbnRlcnMvanNvbi1saW50ZXInO1xuaW1wb3J0IHsgY29tcHV0ZVNxbERpYWdub3N0aWNzIH0gZnJvbSAnLi9saW50ZXJzL3NxbC1saW50ZXInO1xuaW1wb3J0IHsgY29tcHV0ZVB5dGhvbkRpYWdub3N0aWNzIH0gZnJvbSAnLi9saW50ZXJzL3B5dGhvbi1saW50ZXInO1xuaW1wb3J0IHsgYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uIH0gZnJvbSAnLi9lZGl0b3IvZWRpdG9yLWNvbXBsZXRpb25zJztcbmltcG9ydCB7IGJ1aWxkRm9yYmlkZGVuRXh0ZW5zaW9uIH0gZnJvbSAnLi9lZGl0b3IvZWRpdG9yLWZvcmJpZGRlbic7XG5pbXBvcnQgeyBhcHBseU1heEhlaWdodCwgYXBwbHlNaW5MaW5lcyB9IGZyb20gJy4vZWRpdG9yL2VkaXRvci1oZWlnaHQnO1xuaW1wb3J0IHsgSUxhbmd1YWdlT3B0aW9ucywgSVByZXZpZXdUZXh0RGF0YUNoYW5nZSwgSVByZXZpZXdUZXh0RGF0YUNvbXBsZXRpb25JdGVtLCBJUHJldmlld1RleHREYXRhVmlvbGF0aW9uLCBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JULCBUX0ZvcmJpZGRlblBhdHRlcm4gfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmludGVyZmFjZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcHJldmlld190ZXh0X2RhdGEnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0xpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUHJldmlld1RleHREYXRhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBQUk9QRVJUSUVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBlZGl0b3JWaWV3SW5zdGFuY2U/OiBFZGl0b3JWaWV3O1xuICBwcml2YXRlIHJlYWRvbmx5IHdyYXBDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5lTnVtYmVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW50ZXJDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBsZXRpb25zQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JiaWRkZW5Db21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGVudFN0YXRlTm9XcmFwID0gc2lnbmFsKCcnKTtcblxuICAvKiogQ2FjaGUgxJHhu4MgdHLDoW5oIGxvYWQgbOG6oWkgbGFuZ3VhZ2UgxJHDoyBsb2FkICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFuZ3VhZ2VDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFeHRlbnNpb24+KCk7XG5cbiAgLyoqIEZsYWcgxJHhu4MgdHLDoW5oIHVwZGF0ZSBlZGl0b3Iga2hpIMSRYW5nIGto4bufaSB04bqhbyAqL1xuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJTkpFQ1RFRCBTRVJWSUNFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBST1RFQ1RFRCBTSUdOQUxTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzV3JhcCA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4oaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZygpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxhYmVsTGFuZyA9IGNvbXB1dGVkKCgpID0+IG9wdGlvbnNMYW5nRGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0aGlzLmxhbmdTZWxlY3RlZCgpKT8ubGFiZWwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjZXB0Q2hhbmdlTGFuZyA9IGNvbXB1dGVkKCgpID0+ICEodGhpcy5sYW5nU2VsZWN0ZWQoKSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/LmluY2x1ZGVzKHRoaXMubGFuZ1NlbGVjdGVkKCkpKSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5QVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgY29udGVudCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogc3RyaW5nKSA9PiB2YWx1ZSA/PyAnJyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbGFuZ1NlbGVjdGVkID0gbW9kZWwucmVxdWlyZWQ8UFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NBY2NlcHQgPSBpbnB1dDxBcnJheTxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NDaGFuZ2VMYWJlbCA9IGlucHV0PElMYW5ndWFnZU9wdGlvbnMgfCB1bmRlZmluZWQ+KCk7XG5cbiAgcmVhZG9ubHkgZWRpdGFibGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhpZGRlbkFjdGlvbiA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBib29sZWFuKSA9PiB2YWx1ZSA/PyBmYWxzZSxcbiAgfSk7XG5cbiAgLyoqIFPhu5EgZMOybmcgdOG7kWkgdGhp4buDdTogbuG6v3UgY29udGVudCDDrXQgZMOybmcgaMahbiBz4bq9IHThu7EgYsO5IGTDsm5nIHRy4buRbmcgKHjhu60gbMO9IDEgbOG6p24ga2hpIGto4bufaSB04bqhbyBlZGl0b3IpLiBC4buPIHRy4buRbmcgPSBraMO0bmcgYsO5LiAqL1xuICByZWFkb25seSBtaW5MaW5lcyA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4oKTtcbiAgLyoqIFPhu5EgZMOybmcgdOG7kWkgxJFhOiB2xrDhu6N0IHF1w6EgZWRpdG9yIHPhur0gZ2nhu5tpIGjhuqFuIGNoaeG7gXUgY2FvIHbDoCB4deG6pXQgaGnhu4duIHbDuW5nIGN14buZbiAoeOG7rSBsw70gMSBs4bqnbiBraGkga2jhu59pIHThuqFvIGVkaXRvcikuIELhu48gdHLhu5FuZyA9IGtow7RuZyBnaeG7m2kgaOG6oW4uICovXG4gIHJlYWRvbmx5IG1heExpbmVzID0gaW5wdXQ8bnVtYmVyIHwgdW5kZWZpbmVkPigpO1xuICAvKipcbiAgICogRWxlbWVudCBjb250YWluZXIgYsOqbiBuZ2/DoGkgxJHhu4MgZWRpdG9yIHThu7EgdMOtbmggY2hp4buBdSBjYW8gdGhlbyBgbWluLWhlaWdodGAvYG1heC1oZWlnaHRgIChDU1MpIGPhu6dhIG7Dsy5cbiAgICogS2hpIHRydXnhu4FuLCBlZGl0b3IgxJHhu41jIG1pbi9tYXgtaGVpZ2h0IGPhu6dhIGNvbnRhaW5lciwgdHLhu6sgcGjhuqduIGhlYWRlci90b29sYmFyIHBow61hIHRyw6puLCBy4buTaSBzbmFwXG4gICAqIGNoaeG7gXUgY2FvIHbDuW5nIGN14buZbiB24buBIMSRw7puZyBi4buZaSBz4buRIGTDsm5nIChraMO0bmcgY+G6r3QgbuG7rWEgZMOybmcpICsgYuG6rXQgc2Nyb2xsIGtoaSB2xrDhu6N0IG1heC5cbiAgICogQ+G6pE0gY+G6pXUgaMOsbmggxJHhu5NuZyB0aOG7nWkgduG7m2kgYG1pbkxpbmVzYC9gbWF4TGluZXNgIChz4bq9IHRocm93IGzhu5dpKSDigJQgY29udGFpbmVyIHThu7EgcXXhuqNuIGzDvSBtaW4vbWF4LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyRWxlbWVudCA9IGlucHV0PEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkPigpO1xuICAvKiogei1pbmRleCBjaG8gcG9wb3ZlciBkcm9wZG93biBjaOG7jW4gbmfDtG4gbmfhu68uICovXG4gIHJlYWRvbmx5IHpJbmRleFBvcG92ZXIgPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG5cbiAgcmVhZG9ubHkgbGludElnbm9yZVBhdHRlcm5zID0gaW5wdXQ8QXJyYXk8c3RyaW5nPiwgQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZD4oWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogQXJyYXk8c3RyaW5nPikgPT4gdmFsdWUgPz8gWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERhbmggc8OhY2ggxJHhu5FpIHTGsOG7o25nL2Jp4bq/biBn4bujaSDDvSBraGkgZ8O1IOKAlCBnaeG7kW5nIEludGVsbGlTZW5zZSB0cm9uZyBJREUuXG4gICAqIEjhu5cgdHLhu6MgZG90LW5vdGF0aW9uOiDEkeG7i25oIG5naMSpYSBgcHJvcGVydGllc2AgxJHhu4MgZ+G7o2kgw70gc2F1IGThuqV1IGAuYFxuICAgKiBAZXhhbXBsZVxuICAgKiBbY29tcGxldGlvbnNdPVwiW3sgbGFiZWw6ICd1c2VyJywgcHJvcGVydGllczogW3sgbGFiZWw6ICduYW1lJywgZGV0YWlsOiAnc3RyaW5nJyB9XSB9XVwiXG4gICAqL1xuICByZWFkb25seSBjb21wbGV0aW9ucyA9IGlucHV0PElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdLCBJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSB8IHVuZGVmaW5lZD4oW10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdKSA9PiB2YWx1ZSA/PyBbXSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERhbmggc8OhY2ggcGF0dGVybiBj4bqlbSDigJQgY2h14buXaSBsaXRlcmFsIGhv4bq3YyBSZWdFeHAuXG4gICAqIEtoaSBwaMOhdCBoaeG7h24gdmkgcGjhuqFtOiBoaWdobGlnaHQgxJHhu48gdOG6oWkgxJHDum5nIHbhu4sgdHLDrSArIGNo4bq3biBwYXN0ZSArIGVtaXQgYChvdXRWaW9sYXRpb25zKWAuXG4gICAqIETDuW5nIGBERUZBVUxUX1NFQ1VSSVRZX1BBVFRFUk5TYCDEkeG7gyDDoXAgZOG7pW5nIGLhu5kgcXV5IHThuq9jIGLhuqNvIG3huq10IG3hurdjIMSR4buLbmggY2hvIGxvdy1jb2RlLlxuICAgKiBAZXhhbXBsZVxuICAgKiBbZm9yYmlkZGVuUGF0dGVybnNdPVwiZGVmYXVsdFNlY3VyaXR5UGF0dGVybnNcIlxuICAgKiBbZm9yYmlkZGVuUGF0dGVybnNdPVwiWy9ldmFsXFxzKlxcKC8sICdsb2NhbFN0b3JhZ2UnXVwiXG4gICAqL1xuICByZWFkb25seSBmb3JiaWRkZW5QYXR0ZXJucyA9IGlucHV0PFRfRm9yYmlkZGVuUGF0dGVybltdLCBUX0ZvcmJpZGRlblBhdHRlcm5bXSB8IHVuZGVmaW5lZD4oW10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IFRfRm9yYmlkZGVuUGF0dGVybltdKSA9PiB2YWx1ZSA/PyBbXSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYmFja2dyb3VuZCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignI2Y4ZjlmYScsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IHN0cmluZykgPT4gdmFsdWUgPz8gJyNmOGY5ZmEnLFxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPVVRQVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgb3V0Q2hhbmdlID0gb3V0cHV0PElQcmV2aWV3VGV4dERhdGFDaGFuZ2U+KCk7XG4gIHJlYWRvbmx5IHN5bnRheEVycm9ycyA9IG91dHB1dDxEaWFnbm9zdGljW10+KCk7XG4gIHJlYWRvbmx5IG91dFZpb2xhdGlvbnMgPSBvdXRwdXQ8SVByZXZpZXdUZXh0RGF0YVZpb2xhdGlvbltdPigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFZJRVcgQ0hJTERSRU5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lclByZXZpZXcgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJQcmV2aWV3Jyk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ09OU1RSVUNUT1IgLSBTZXR1cCBlZmZlY3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRWZmZWN0IMSR4buDIHN5bmMgY29udGVudCB04burIGlucHV0IHbDoG8gZWRpdG9yXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSB0aGlzLmNvbnRlbnQoKTtcbiAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRlbnQgPSB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IGN1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgICB0bzogY3VycmVudENvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgICBpbnNlcnQ6IG5ld0NvbnRlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBFZmZlY3QgxJHhu4MgY+G6rXAgbmjhuq10IGN1c3RvbSBjb21wbGV0aW9ucyBraGkgaW5wdXQgdGhheSDEkeG7lWlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmNvbXBsZXRpb25zKCk7XG4gICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCB8fCAhdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHJldHVybjtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlLmRpc3BhdGNoKHtcbiAgICAgICAgZWZmZWN0czogdGhpcy5jb21wbGV0aW9uc0NvbXBhcnRtZW50LnJlY29uZmlndXJlKGl0ZW1zLmxlbmd0aCA/IGJ1aWxkQ29tcGxldGlvbkV4dGVuc2lvbihpdGVtcykgOiBbXSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEVmZmVjdCDEkeG7gyBj4bqtcCBuaOG6rXQgZm9yYmlkZGVuIHBhdHRlcm5zIGtoaSBpbnB1dCB0aGF5IMSR4buVaVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuZm9yYmlkZGVuUGF0dGVybnMoKTtcbiAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkIHx8ICF0aGlzLmVkaXRvclZpZXdJbnN0YW5jZSkgcmV0dXJuO1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICBlZmZlY3RzOiB0aGlzLmZvcmJpZGRlbkNvbXBhcnRtZW50LnJlY29uZmlndXJlKHBhdHRlcm5zLmxlbmd0aCA/IGJ1aWxkRm9yYmlkZGVuRXh0ZW5zaW9uKHBhdHRlcm5zLCAodmlvbGF0aW9ucykgPT4gdGhpcy5vdXRWaW9sYXRpb25zLmVtaXQodmlvbGF0aW9ucykpIDogW10pLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhbnVwIGtoaSBjb21wb25lbnQgYuG7iyBkZXN0cm95XG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgICAgdGhpcy5sYW5ndWFnZUNhY2hlLmNsZWFyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMSUZFQ1lDTEUgSE9PS1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYW5nc0FjY2VwdCgpPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcuc2V0KGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcodGhpcy5sYW5nc0FjY2VwdCgpLCB0aGlzLmxhbmdzQ2hhbmdlTGFiZWwoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVFZGl0b3IoKTtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gRWRpdG9yIGluaXRpYWxpemF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEto4bufaSB04bqhbyBlZGl0b3IgduG7m2kgY8OhYyBleHRlbnNpb25zIGPGoSBi4bqjblxuICAgKiBMYW5ndWFnZSDEkcaw4bujYyBsb2FkIGFzeW5jIMSR4buDIHThu5FpIMawdSBidW5kbGUgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplRWRpdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhbmd1YWdlRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGFuZ3VhZ2VFeHRlbnNpb24odGhpcy5sYW5nU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGludGVyRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKHRoaXMubGFuZ1NlbGVjdGVkKCkpO1xuXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UgPSBuZXcgRWRpdG9yVmlldyh7XG4gICAgICBkb2M6IGFwcGx5TWluTGluZXModGhpcy5jb250ZW50KCksIHRoaXMubWluTGluZXMoKSksXG4gICAgICBwYXJlbnQ6IHRoaXMuY29udGFpbmVyUHJldmlldygpLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmNyZWF0ZUV4dGVuc2lvbnMobGFuZ3VhZ2VFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbiksXG4gICAgfSk7XG4gICAgYXBwbHlNYXhIZWlnaHQodGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UsIHsgbWluTGluZXM6IHRoaXMubWluTGluZXMoKSwgbWF4TGluZXM6IHRoaXMubWF4TGluZXMoKSwgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lckVsZW1lbnQoKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBkYW5oIHPDoWNoIGV4dGVuc2lvbnMgY2hvIGVkaXRvclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFeHRlbnNpb25zKGxhbmd1YWdlRXh0ZW5zaW9uOiBFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbjogRXh0ZW5zaW9uKTogRXh0ZW5zaW9uW10ge1xuICAgIGNvbnN0IGluaXRpYWxDb21wbGV0aW9ucyA9IHRoaXMuY29tcGxldGlvbnMoKTtcbiAgICBjb25zdCBpbml0aWFsUGF0dGVybnMgPSB0aGlzLmZvcmJpZGRlblBhdHRlcm5zKCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGJhc2ljU2V0dXAsXG4gICAgICB0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQub2YobGFuZ3VhZ2VFeHRlbnNpb24pLFxuICAgICAgdGhpcy5saW50ZXJDb21wYXJ0bWVudC5vZihsaW50ZXJFeHRlbnNpb24pLFxuICAgICAgLy8gQ29tcGFydG1lbnQgY2hvIGN1c3RvbSBjb21wbGV0aW9ucyDigJQgUHJlYy5oaWdoZXN0IMSR4buDIG92ZXJyaWRlIGJhc2ljU2V0dXAncyBhdXRvY29tcGxldGlvblxuICAgICAgUHJlYy5oaWdoZXN0KHRoaXMuY29tcGxldGlvbnNDb21wYXJ0bWVudC5vZihpbml0aWFsQ29tcGxldGlvbnMubGVuZ3RoID8gYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uKGluaXRpYWxDb21wbGV0aW9ucykgOiBbXSkpLFxuICAgICAgdGhpcy5mb3JiaWRkZW5Db21wYXJ0bWVudC5vZihpbml0aWFsUGF0dGVybnMubGVuZ3RoID8gYnVpbGRGb3JiaWRkZW5FeHRlbnNpb24oaW5pdGlhbFBhdHRlcm5zLCAodmlvbGF0aW9ucykgPT4gdGhpcy5vdXRWaW9sYXRpb25zLmVtaXQodmlvbGF0aW9ucykpIDogW10pLFxuICAgICAgdGhpcy5jcmVhdGVMaWdodFRoZW1lKCksXG4gICAgICBFZGl0b3JWaWV3LmVkaXRhYmxlLm9mKHRoaXMuZWRpdGFibGUoKSksXG4gICAgICB0aGlzLndyYXBDb21wYXJ0bWVudC5vZihFZGl0b3JWaWV3LmxpbmVXcmFwcGluZyksXG4gICAgICB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5vZihsaW5lTnVtYmVycygpKSxcbiAgICAgIGxpbnRHdXR0ZXIoKSxcbiAgICAgIHRoaXMuY3JlYXRlQnJhY2tldFRoZW1lKCksXG4gICAgICB0aGlzLmNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxhbmd1YWdlIGV4dGVuc2lvbiB24bubaSBjYWNoaW5nXG4gICAqIE3hu5dpIGxhbmd1YWdlIGNo4buJIMSRxrDhu6NjIGxvYWQgMSBs4bqnblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGFuZ3VhZ2VFeHRlbnNpb24obGFuZzogUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCk6IFByb21pc2U8RXh0ZW5zaW9uPiB7XG4gICAgY29uc3QgbG93ZXJMYW5nID0gbGFuZy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5sYW5ndWFnZUNhY2hlLmdldChsb3dlckxhbmcpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdHJ5SXRlbSA9IGxhbmd1YWdlUmVnaXN0cnlbbG93ZXJMYW5nXTtcbiAgICBjb25zdCBleHRlbnNpb24gPSByZWdpc3RyeUl0ZW0gPyBhd2FpdCByZWdpc3RyeUl0ZW0ubG9hZGVyKCkgOiBhd2FpdCBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UoKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VDYWNoZS5zZXQobG93ZXJMYW5nLCBleHRlbnNpb24pO1xuICAgIHJldHVybiBleHRlbnNpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBsaW50ZXIgZXh0ZW5zaW9uIG7hur91IGPDs1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGludGVyRXh0ZW5zaW9uKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBQcm9taXNlPEV4dGVuc2lvbj4ge1xuICAgIGNvbnN0IGxvd2VyTGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCByZWdpc3RyeUl0ZW0gPSBsYW5ndWFnZVJlZ2lzdHJ5W2xvd2VyTGFuZ107XG5cbiAgICBpZiAocmVnaXN0cnlJdGVtPy5saW50ZXIpIHtcbiAgICAgIHJldHVybiByZWdpc3RyeUl0ZW0ubGludGVyKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW50ZXIoKCkgPT4gW10pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gVGhlbWUgY29uZmlndXJhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgY3JlYXRlTGlnaHRUaGVtZSgpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnRoZW1lKHtcbiAgICAgICcmJzogeyBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZCgpLCBjb2xvcjogJyMzMzMnIH0sXG4gICAgICAnLmNtLWNvbnRlbnQnOiB7IGNhcmV0Q29sb3I6ICcjMTExJyB9LFxuICAgICAgJy5jbS1hY3RpdmVMaW5lJzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZjBmMGYwJyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCcmFja2V0VGhlbWUoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnLmNtLW1hdGNoaW5nQnJhY2tldCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgxMDAsIDIwMCwgMjU1LCAwLjE1KScsXG4gICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCByZ2JhKDEwMCwgMjAwLCAyNTUsIDAuNCknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuMnMgZWFzZScsXG4gICAgICB9LFxuICAgICAgJy5jbS1ub25tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAxMDAsIDEwMCwgMC4xNSknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgyNTUsIDEwMCwgMTAwLCAwLjMpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBVcGRhdGUgbGlzdGVuZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudXBkYXRlTGlzdGVuZXIub2YoKHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkICYmIHRoaXMuZWRpdGFibGUoKSkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHVwZGF0ZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgY29udGVudDogbmV3VmFsdWUsXG4gICAgICAgICAgaXNXcmFwOiAhdGhpcy5pc1dyYXAoKSxcbiAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgICAgICBjb250ZXh0Q2hhbmdlOiAnY29udGVudCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFVCTElDIE1FVEhPRFMgLSBMaW50ZXIgZmFjdG9yaWVzICjEkcaw4bujYyBn4buNaSB04burIHJlZ2lzdHJ5KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgLyoqIEphdmFTY3JpcHQvVHlwZVNjcmlwdCBsaW50ZXIg4oCUIHBpcGVsaW5lIHRyb25nIGBsaW50ZXJzL2pzLWxpbnRlci50c2AgKGJhYmVsICsgdHJhaWxpbmctZG90ICsgdGhp4bq/dSBgO2AgKyBiaeG6v24gY2jGsGEga2hhaSBiw6FvKS4gKi9cbiAgY3JlYXRlSnNMaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKGFzeW5jICh2aWV3KSA9PiB7XG4gICAgICBjb25zdCBkaWFnbm9zdGljcyA9IGF3YWl0IGNvbXB1dGVKc0RpYWdub3N0aWNzKHZpZXcuc3RhdGUuZG9jLCB2aWV3LnN0YXRlLmRvYy50b1N0cmluZygpLCBuZXcgU2V0KHRoaXMuY29tcGxldGlvbnMoKS5tYXAoKGl0ZW0pID0+IGl0ZW0ubGFiZWwpKSk7XG4gICAgICB0aGlzLnN5bnRheEVycm9ycy5lbWl0KGRpYWdub3N0aWNzKTtcbiAgICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBKU09OIGxpbnRlciDigJQgbG9naWMgdHJvbmcgYGxpbnRlcnMvanNvbi1saW50ZXIudHNgLiAqL1xuICBjcmVhdGVKc29uTGludGVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIGxpbnRlcigodmlldykgPT4ge1xuICAgICAgY29uc3QgZGlhZ25vc3RpY3MgPSBjb21wdXRlSnNvbkRpYWdub3N0aWNzKHZpZXcpO1xuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU1FMIGxpbnRlciDigJQgbG9naWMgdHJvbmcgYGxpbnRlcnMvc3FsLWxpbnRlci50c2AuICovXG4gIGNyZWF0ZVNxbExpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gY29tcHV0ZVNxbERpYWdub3N0aWNzKHZpZXcpO1xuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUHl0aG9uIGxpbnRlciDigJQgbG9naWMgdHJvbmcgYGxpbnRlcnMvcHl0aG9uLWxpbnRlci50c2AuICovXG4gIGNyZWF0ZVB5dGhvbkxpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gY29tcHV0ZVB5dGhvbkRpYWdub3N0aWNzKHZpZXcpO1xuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUk9URUNURUQgTUVUSE9EUyAtIEV2ZW50IGhhbmRsZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDb3B5KCk6IHZvaWQge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuY29udGVudCgpIHx8ICcnKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEluZm8oJ1NhbyBjaMOpcCB0aMOgbmggY8O0bmcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTGluZVdyYXAoKTogdm9pZCB7XG4gICAgLy8gTOG6pXkgbuG7mWkgZHVuZyBt4bubaSBuaOG6pXQgdOG7qyBlZGl0b3Igc2F1IGtoaSDEkcOjIHjDs2EgbmV3bGluZXNcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5zdGF0ZS5kb2MudG9TdHJpbmcoKSB8fCAnJztcbiAgICBpZiAodGhpcy5pc1dyYXAoKSkge1xuICAgICAgdGhpcy5jb250ZW50U3RhdGVOb1dyYXAuc2V0KGN1cnJlbnRDb250ZW50KTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSB0aGlzLmlzV3JhcCgpICYmIGN1cnJlbnRDb250ZW50ID8gY3VycmVudENvbnRlbnQucmVwbGFjZSgvXFxuL2csICcgJykgOiB0aGlzLmNvbnRlbnRTdGF0ZU5vV3JhcCgpO1xuICAgIHRoaXMuaXNXcmFwLnVwZGF0ZSgodmFsKSA9PiAhdmFsKTtcblxuICAgIGlmIChjdXJyZW50Q29udGVudCAhPT0gdXBkYXRlZENvbnRlbnQpIHtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICAgIGNoYW5nZXM6IHsgZnJvbTogMCwgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCwgaW5zZXJ0OiB1cGRhdGVkQ29udGVudCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQmF0Y2ggY+G6oyAyIGRpc3BhdGNoIHRow6BuaCAxIMSR4buDIHThu5FpIMawdSBwZXJmb3JtYW5jZVxuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICBlZmZlY3RzOiBbdGhpcy53cmFwQ29tcGFydG1lbnQucmVjb25maWd1cmUodGhpcy5pc1dyYXAoKSA/IEVkaXRvclZpZXcubGluZVdyYXBwaW5nIDogW10pLCB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gbGluZU51bWJlcnMoKSA6IFtdKV0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdEtleShkYXRhPzogSUVtaXRTZWxlY3RLZXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWRhdGE/LmtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0xhbmcgPSBkYXRhLmtleSBhcyBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUO1xuICAgIHRoaXMubGFuZ1NlbGVjdGVkLnNldChuZXdMYW5nKTtcblxuICAgIC8vIExvYWQgbGFuZ3VhZ2UgdsOgIGxpbnRlciBt4bubaVxuICAgIGNvbnN0IFtsYW5ndWFnZUV4dGVuc2lvbiwgbGludGVyRXh0ZW5zaW9uXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLmxvYWRMYW5ndWFnZUV4dGVuc2lvbihuZXdMYW5nKSwgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKG5ld0xhbmcpXSk7XG5cbiAgICAvLyBSZWNvbmZpZ3VyZSB0aGF5IHbDrCB04bqhbyBt4bubaSBzdGF0ZSDEkeG7gyBnaeG7ryBs4bqhaSBkb2N1bWVudCBjb250ZW50XG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IFt0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQucmVjb25maWd1cmUobGFuZ3VhZ2VFeHRlbnNpb24pLCB0aGlzLmxpbnRlckNvbXBhcnRtZW50LnJlY29uZmlndXJlKGxpbnRlckV4dGVuc2lvbildLFxuICAgIH0pO1xuXG4gICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnQoKSxcbiAgICAgIGlzV3JhcDogIXRoaXMuaXNXcmFwKCksXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgIGNvbnRleHRDaGFuZ2U6ICdsYW5ndWFnZScsXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLXByZXZpZXctZGF0YS1jb250YWluZXIgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1hdXRvIHJvdW5kZWQtWzhweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCBweC1bOHB4XVwiXG4gIFtzdHlsZS4tLWJhY2tncm91bmQtY29sb3JdPVwiYmFja2dyb3VuZCgpXCJcbiAgW2NsYXNzLnB0LVs4cHhdXT1cIiFoaWRkZW5BY3Rpb24oKVwiPlxuICBAaWYgKCFoaWRkZW5BY3Rpb24oKSkge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWJldHdlZW4gY29sb3ItWyM2YTczODNdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgIGNsYXNzSW5jbHVkZT1cInctWzIwMHB4XVwiXG4gICAgICAgIFtsaXN0Q29uZmlnXT1cImNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnKClcIlxuICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICBbekluZGV4XT1cInpJbmRleFBvcG92ZXIoKVwiXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFlZGl0YWJsZSgpIHx8ICFhY2NlcHRDaGFuZ2VMYW5nKClcIlxuICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0S2V5KCRldmVudClcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCJsYWJlbExhbmcoKSB8fCAnJ1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCcgOiAnJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzBweF0nICsgKGVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJycgOiAnIXBvaW50ZXItZXZlbnRzLW5vbmUgIWN1cnNvci1kZWZhdWx0IGhvdmVyOiF0ZXh0LVsjNkE3MzgzXScpXCIgLz5cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwiaXNXcmFwKCkgPyAnaTE4bl9yZW1vdmVfbGluZV93cmFwJyA6ICdpMThuX2xpbmVfd3JhcCdcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImlzV3JhcCgpID8gJ2xpYnMtdWktaWNvbi11bndyYXAnIDogJ2xpYnMtdWktaWNvbi13cmFwJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4IG1vLWxpYi1tci0xNnB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJMaW5lV3JhcCgpXCIgLz5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCInaTE4bl9jb3B5J1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1jb3B5J1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDb3B5KClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbiAgPGRpdiAjY29udGFpbmVyUHJldmlldz48L2Rpdj5cbjwvZGl2PlxuIl19
@@ -1146,7 +1146,7 @@ class LibsUiComponentsPreviewTextDataComponent {
1146
1146
  });
1147
1147
  }
1148
1148
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1149
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPreviewTextDataComponent, isStandalone: true, selector: "libs_ui-components-preview_text_data", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, langSelected: { classPropertyName: "langSelected", publicName: "langSelected", isSignal: true, isRequired: true, transformFunction: null }, langsAccept: { classPropertyName: "langsAccept", publicName: "langsAccept", isSignal: true, isRequired: false, transformFunction: null }, langsChangeLabel: { classPropertyName: "langsChangeLabel", publicName: "langsChangeLabel", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, hiddenAction: { classPropertyName: "hiddenAction", publicName: "hiddenAction", isSignal: true, isRequired: false, transformFunction: null }, minLines: { classPropertyName: "minLines", publicName: "minLines", isSignal: true, isRequired: false, transformFunction: null }, maxLines: { classPropertyName: "maxLines", publicName: "maxLines", isSignal: true, isRequired: false, transformFunction: null }, containerElement: { classPropertyName: "containerElement", publicName: "containerElement", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopover: { classPropertyName: "zIndexPopover", publicName: "zIndexPopover", isSignal: true, isRequired: false, transformFunction: null }, lintIgnorePatterns: { classPropertyName: "lintIgnorePatterns", publicName: "lintIgnorePatterns", isSignal: true, isRequired: false, transformFunction: null }, completions: { classPropertyName: "completions", publicName: "completions", isSignal: true, isRequired: false, transformFunction: null }, forbiddenPatterns: { classPropertyName: "forbiddenPatterns", publicName: "forbiddenPatterns", isSignal: true, isRequired: false, transformFunction: null }, background: { classPropertyName: "background", publicName: "background", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { langSelected: "langSelectedChange", outChange: "outChange", syntaxErrors: "syntaxErrors", outViolations: "outViolations" }, viewQueries: [{ propertyName: "containerPreview", first: true, predicate: ["containerPreview"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [zIndex]=\"zIndexPopover()\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1149
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPreviewTextDataComponent, isStandalone: true, selector: "libs_ui-components-preview_text_data", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, langSelected: { classPropertyName: "langSelected", publicName: "langSelected", isSignal: true, isRequired: true, transformFunction: null }, langsAccept: { classPropertyName: "langsAccept", publicName: "langsAccept", isSignal: true, isRequired: false, transformFunction: null }, langsChangeLabel: { classPropertyName: "langsChangeLabel", publicName: "langsChangeLabel", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, hiddenAction: { classPropertyName: "hiddenAction", publicName: "hiddenAction", isSignal: true, isRequired: false, transformFunction: null }, minLines: { classPropertyName: "minLines", publicName: "minLines", isSignal: true, isRequired: false, transformFunction: null }, maxLines: { classPropertyName: "maxLines", publicName: "maxLines", isSignal: true, isRequired: false, transformFunction: null }, containerElement: { classPropertyName: "containerElement", publicName: "containerElement", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopover: { classPropertyName: "zIndexPopover", publicName: "zIndexPopover", isSignal: true, isRequired: false, transformFunction: null }, lintIgnorePatterns: { classPropertyName: "lintIgnorePatterns", publicName: "lintIgnorePatterns", isSignal: true, isRequired: false, transformFunction: null }, completions: { classPropertyName: "completions", publicName: "completions", isSignal: true, isRequired: false, transformFunction: null }, forbiddenPatterns: { classPropertyName: "forbiddenPatterns", publicName: "forbiddenPatterns", isSignal: true, isRequired: false, transformFunction: null }, background: { classPropertyName: "background", publicName: "background", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { langSelected: "langSelectedChange", outChange: "outChange", syntaxErrors: "syntaxErrors", outViolations: "outViolations" }, viewQueries: [{ propertyName: "containerPreview", first: true, predicate: ["containerPreview"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [zIndex]=\"zIndexPopover()\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "onlyEmitMultiKeyWhenManualClick", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1150
1150
  }
1151
1151
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPreviewTextDataComponent, decorators: [{
1152
1152
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-preview-text-data.mjs","sources":["../../../../../libs-ui/components/preview-text-data/src/preview-text-data.define.ts","../../../../../libs-ui/components/preview-text-data/src/linters/linter-shared.ts","../../../../../libs-ui/components/preview-text-data/src/linters/js-linter.ts","../../../../../libs-ui/components/preview-text-data/src/linters/json-linter.ts","../../../../../libs-ui/components/preview-text-data/src/linters/sql-linter.ts","../../../../../libs-ui/components/preview-text-data/src/linters/python-linter.ts","../../../../../libs-ui/components/preview-text-data/src/editor/editor-completions.ts","../../../../../libs-ui/components/preview-text-data/src/editor/editor-forbidden.ts","../../../../../libs-ui/components/preview-text-data/src/editor/editor-height.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.html","../../../../../libs-ui/components/preview-text-data/src/libs-ui-components-preview-text-data.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { Extension } from '@codemirror/state';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { IHttpRequestConfig, returnListObject } from '@libs-ui/services-http-request';\nimport { UtilsHttpParamsRequest } from '@libs-ui/utils';\nimport { LibsUiComponentsPreviewTextDataComponent } from './preview-text-data.component';\nimport { ILanguageOptions, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n/**\n * Danh sách các ngôn ngữ được hỗ trợ\n * Sử dụng const array để tránh tạo mới mỗi lần truy cập\n */\nexport const optionsLangData: Array<ILanguageOptions> = [\n { id: 'text', label: 'Plain Text' },\n { id: 'javascript', label: 'JavaScript/TypeScript' },\n { id: 'html', label: 'HTML' },\n { id: 'css', label: 'CSS/SCSS/SASS' },\n { id: 'markdown', label: 'Markdown' },\n { id: 'json', label: 'JSON' },\n { id: 'sql', label: 'SQL' },\n { id: 'xml', label: 'XML' },\n { id: 'yaml', label: 'YAML' },\n { id: 'python', label: 'Python' },\n { id: 'java', label: 'Java' },\n { id: 'cpp', label: 'C/C++' },\n { id: 'php', label: 'PHP' },\n { id: 'go', label: 'Go' },\n] as const;\n\nexport const httpRequestConfigGetOptionsLang = (langsAccept?: Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>, langsChangeLabel?: ILanguageOptions): IListConfigItem => {\n const langs = [...optionsLangData].filter((item) => !langsAccept?.length || (langsAccept as string[]).includes(item.id));\n\n langs.forEach((item) => ({\n id: item.id,\n label: langsChangeLabel?.label || item.label,\n }));\n\n return {\n type: 'text',\n httpRequestData: signal<IHttpRequestConfig>({\n objectInstance: returnListObject(langs),\n functionName: 'list',\n argumentsValue: [new UtilsHttpParamsRequest({ fromObject: { page: 1, per_page: 40 } })],\n }),\n configTemplateText: signal({\n fieldKey: 'id',\n notUseVirtualScroll: true,\n }),\n };\n};\n\ntype T_LanguageLoader = () => Promise<Extension>;\ntype T_LinterLoader = (component: LibsUiComponentsPreviewTextDataComponent) => Promise<Extension>;\ninterface I_LanguageRegistryItem {\n loader: T_LanguageLoader;\n linter?: T_LinterLoader;\n}\n\nexport const languageRegistry: Record<string, I_LanguageRegistryItem> = {\n javascript: {\n loader: async () => {\n const { javascript } = await import('@codemirror/lang-javascript');\n return javascript({ jsx: true, typescript: true });\n },\n linter: async (component) => component.createJsLinter(),\n },\n html: {\n loader: async () => {\n const { html } = await import('@codemirror/lang-html');\n return html();\n },\n },\n css: {\n loader: async () => {\n const { css } = await import('@codemirror/lang-css');\n return css();\n },\n },\n markdown: {\n loader: async () => {\n const { markdown } = await import('@codemirror/lang-markdown');\n return markdown();\n },\n },\n json: {\n loader: async () => {\n const { json } = await import('@codemirror/lang-json');\n return json();\n },\n linter: async (component) => component.createJsonLinter(),\n },\n sql: {\n loader: async () => {\n const { sql } = await import('@codemirror/lang-sql');\n return sql();\n },\n linter: async (component) => component.createSqlLinter(),\n },\n xml: {\n loader: async () => {\n const { xml } = await import('@codemirror/lang-xml');\n return xml();\n },\n },\n yaml: {\n loader: async () => {\n const { yaml } = await import('@codemirror/lang-yaml');\n return yaml();\n },\n },\n python: {\n loader: async () => {\n const { python } = await import('@codemirror/lang-python');\n return python();\n },\n linter: async (component) => component.createPythonLinter(),\n },\n java: {\n loader: async () => {\n const { java } = await import('@codemirror/lang-java');\n return java();\n },\n },\n cpp: {\n loader: async () => {\n const { cpp } = await import('@codemirror/lang-cpp');\n return cpp();\n },\n },\n php: {\n loader: async () => {\n const { php } = await import('@codemirror/lang-php');\n return php();\n },\n },\n go: {\n loader: async () => {\n const { go } = await import('@codemirror/lang-go');\n return go();\n },\n },\n};\n\n/**\n * Bộ pattern bảo mật mặc định cho low-code platform.\n * Chặn các API nguy hiểm: eval, network calls, storage, DOM injection...\n */\nexport const DEFAULT_SECURITY_PATTERNS: T_ForbiddenPattern[] = [\n /eval\\s*\\(/i,\n /new\\s+Function\\s*\\(/i,\n /document\\.cookie/i,\n /localStorage/i,\n /sessionStorage/i,\n /fetch\\s*\\(/i,\n /new\\s+XMLHttpRequest/i,\n /require\\s*\\(/i,\n /import\\s*\\(/i,\n /process\\.env/i,\n /<script/i,\n /document\\.write\\s*\\(/i,\n /window\\.location\\s*=/i,\n];\n\n/**\n * Các key của AST node KHÔNG phải node con (metadata vị trí, comment...) — bỏ qua khi duyệt.\n */\nexport const astSkipKeys = new Set<string>(['loc', 'start', 'end', 'range', 'leadingComments', 'trailingComments', 'innerComments', 'extra', 'comments', 'tokens']);\n\n/**\n * Các key chứa annotation kiểu TypeScript → con của nó nằm trong \"type context\" (không phải biến giá trị).\n */\nexport const astTypeKeys = new Set<string>(['typeAnnotation', 'returnType', 'typeParameters', 'typeArguments', 'superTypeParameters']);\n\n/**\n * Các node `TS*` mang GIÁ TRỊ (không phải type thuần) → con của chúng vẫn là biến giá trị bình thường.\n */\nexport const tsValueNodes = new Set<string>(['TSEnumDeclaration', 'TSEnumMember', 'TSModuleDeclaration', 'TSModuleBlock', 'TSAsExpression', 'TSNonNullExpression', 'TSParameterProperty', 'TSExportAssignment', 'TSImportEqualsDeclaration', 'TSExternalModuleReference', 'TSSatisfiesExpression']);\n\n/**\n * Tạo default language extension cho plain text\n * Sử dụng khi ngôn ngữ không được hỗ trợ\n */\nexport const createDefaultLanguage = async (): Promise<Extension> => {\n const { StreamLanguage } = await import('@codemirror/language');\n return StreamLanguage.define({\n token(stream) {\n stream.skipToEnd();\n return null;\n },\n });\n};\n","import { Text } from '@codemirror/state';\n\n/** Lấy token (chuỗi không khoảng trắng) liền trước vị trí `pos` trong document. Dùng chung cho JS/SQL/Python. */\nexport const getTokenBefore = (doc: Text, pos: number): string => {\n const start = Math.max(0, pos - 30);\n const text = doc.sliceString(start, pos);\n const match = /(\\S+)\\s*$/.exec(text);\n return match?.[1] ?? '';\n};\n","import { Diagnostic } from '@codemirror/lint';\nimport { Text } from '@codemirror/state';\nimport { get } from '@libs-ui/utils';\nimport { astSkipKeys, astTypeKeys, tsValueNodes } from '../preview-text-data.define';\nimport { T_AstNode } from '../preview-text-data.type';\nimport { getTokenBefore } from './linter-shared';\n\ntype T_BabelError = { loc?: { line: number; column: number }; message: string };\ntype T_AstReference = { name: string; line: number; column: number };\n\n// Cache module-level (chia sẻ giữa các instance editor) — đều immutable, lazy-load 1 lần.\nlet babelParserModule: typeof import('@babel/parser') | undefined;\nlet knownGlobalsSet: Set<string> | undefined;\n\n/** Lazy-load + cache module @babel/parser (chỉ tải lần đầu khi lint JS/TS). */\nconst getBabelParser = async (): Promise<typeof import('@babel/parser')> => {\n if (!babelParserModule) {\n babelParserModule = await import('@babel/parser');\n }\n return babelParserModule;\n};\n\n/** Lazy-load + cache tập biến toàn cục JS/DOM hợp lệ từ package `globals` (JSON thuần, browser-safe). */\nconst getKnownGlobals = async (): Promise<Set<string>> => {\n if (!knownGlobalsSet) {\n const globalsModule = (await import('globals')) as unknown as { default?: Record<string, Record<string, boolean>> };\n const globalsData = (globalsModule.default ?? globalsModule) as Record<string, Record<string, boolean>>;\n knownGlobalsSet = new Set<string>([...Object.keys(globalsData['builtin'] ?? {}), ...Object.keys(globalsData['browser'] ?? {}), ...Object.keys(globalsData['es2021'] ?? {})]);\n }\n return knownGlobalsSet;\n};\n\n/**\n * Parse code, trả về vừa danh sách lỗi cú pháp vừa AST (nếu parse sạch).\n * `errorRecovery` gom nhiều lỗi vào `result.errors`; lỗi nặng vẫn `throw` → bắt thêm ở catch.\n */\nexport const parseJs = (parser: typeof import('@babel/parser'), code: string): { errors: T_BabelError[]; ast?: object } => {\n try {\n const result = parser.parse(code, {\n sourceType: 'module',\n errorRecovery: true,\n plugins: ['typescript', 'jsx'],\n allowReturnOutsideFunction: true,\n allowAwaitOutsideFunction: true,\n allowImportExportEverywhere: true,\n allowSuperOutsideMethod: true,\n allowNewTargetOutsideFunction: true,\n allowUndeclaredExports: true,\n });\n return { errors: result.errors as T_BabelError[], ast: result };\n } catch (error: unknown) {\n const loc = get(error, 'loc') as { line: number; column: number } | undefined;\n const message = (get(error, 'message') as string) || 'JavaScript syntax error';\n return { errors: [{ loc, message }] };\n }\n};\n\n/** Giữ cho test/back-compat: chỉ lấy danh sách lỗi cú pháp. */\nexport const collectBabelErrors = (parser: typeof import('@babel/parser'), code: string): T_BabelError[] => parseJs(parser, code).errors;\n\n/**\n * Quét text từng dòng, flag dấu \".\" cuối dòng (incomplete property access) tại ĐÚNG vị trí dấu chấm.\n * Thu thập `taintedLines` (dòng có trailing dot) + `dotPositions` (offset dấu chấm để vá khi parse).\n */\nexport const collectTrailingDotDiagnostics = (doc: Text, diagnostics: Diagnostic[], taintedLines: Set<number>, dotPositions: number[]): void => {\n for (let lineNumber = 1; lineNumber <= doc.lines; lineNumber++) {\n const line = doc.line(lineNumber);\n const trimmed = line.text.trimEnd();\n const match = /(\\w+)\\.\\s*$/.exec(trimmed);\n if (!match) {\n continue;\n }\n taintedLines.add(lineNumber);\n const dotPosition = line.from + trimmed.lastIndexOf('.');\n dotPositions.push(dotPosition);\n diagnostics.push({ from: dotPosition, to: dotPosition + 1, severity: 'error', message: `Incomplete property access on \"${match[1]}\"` });\n }\n};\n\n/** Thay các ký tự tại `positions` bằng space, giữ nguyên độ dài chuỗi (để offset không đổi). */\nconst replaceCharsWithSpace = (code: string, positions: number[]): string => {\n if (!positions.length) {\n return code;\n }\n const chars = code.split('');\n for (const position of positions) {\n if (position >= 0 && position < chars.length) {\n chars[position] = ' ';\n }\n }\n return chars.join('');\n};\n\n/** VariableDeclaration ở `for(let i=0;...)` / `for..in` / `for..of` KHÔNG cần `;` cuối. */\nconst requiresSemicolon = (nodeType: string, parentType: string, keyInParent: string): boolean => {\n if (nodeType === 'VariableDeclaration') {\n if (parentType === 'ForStatement' && keyInParent === 'init') return false;\n if ((parentType === 'ForInStatement' || parentType === 'ForOfStatement') && keyInParent === 'left') return false;\n }\n return true;\n};\n\n/**\n * Rule custom \"require semicolon\": câu lệnh (const/let/return/expression...) không kết thúc bằng `;` → báo lỗi.\n * Dùng vị trí `node.end` của AST babel; bỏ qua dòng tainted (trailing dot) để không chồng lỗi.\n */\nexport const collectMissingSemicolonDiagnostics = (ast: object, code: string, diagnostics: Diagnostic[], taintedLines: Set<number>): void => {\n const semiNodes = new Set(['ExpressionStatement', 'VariableDeclaration', 'ReturnStatement', 'ThrowStatement', 'BreakStatement', 'ContinueStatement', 'DoWhileStatement', 'DebuggerStatement']);\n const seen = new Set<number>();\n const lineOf = (offset: number) => code.slice(0, offset).split('\\n').length;\n const walk = (node: unknown, parentType: string, keyInParent: string): void => {\n if (Array.isArray(node)) {\n for (const item of node) walk(item, parentType, keyInParent);\n return;\n }\n if (!node || typeof node !== 'object') return;\n const current = node as T_AstNode;\n if (typeof current.type !== 'string') return;\n\n if (semiNodes.has(current.type) && requiresSemicolon(current.type, parentType, keyInParent) && typeof current.end === 'number') {\n const end = Math.min(current.end, code.length);\n if (end > 0 && code.charAt(end - 1) !== ';' && !seen.has(end) && !taintedLines.has(lineOf(end - 1))) {\n seen.add(end);\n diagnostics.push({ from: end - 1, to: end, severity: 'error', message: 'Missing semicolon' });\n }\n }\n\n for (const childKey of Object.keys(current)) {\n if (astSkipKeys.has(childKey)) continue;\n walk(current[childKey], current.type, childKey);\n }\n };\n walk((ast as { program?: unknown }).program ?? ast, '', '');\n};\n\n/** Chuẩn hóa message: thân thiện cho trailing dot + heuristic kiểu cũ cho \"Unexpected token\"; bỏ hậu tố \"(line:col)\". */\nexport const buildJsErrorMessage = (doc: Text, from: number, rawMessage: string): string => {\n const charBefore = from > 0 ? doc.sliceString(from - 1, from) : '';\n if (charBefore === '.') {\n const owner = getTokenBefore(doc, from).replace(/\\.$/, '');\n return owner ? `Incomplete property access on \"${owner}\"` : 'Incomplete property access';\n }\n\n const cleaned = rawMessage.replace(/\\s*\\(\\d+:\\d+\\)\\s*$/, '').trim();\n if (/missing semicolon/i.test(cleaned)) {\n return 'Unexpected token — missing operator or separator between expressions';\n }\n if (/^unexpected token$/i.test(cleaned)) {\n const prevToken = getTokenBefore(doc, from);\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n if (prevToken.endsWith('[')) return 'Missing closing \"]\"';\n if (/^function$/i.test(prevToken)) return 'Expected function name or \"(\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^=>$/.test(prevToken)) return 'Expected function body after \"=>\"';\n if (/^const$|^let$|^var$/i.test(prevToken)) return 'Expected variable name';\n }\n return `JavaScript syntax error: ${cleaned}`;\n};\n\n/** Lấy tên binding từ pattern (Identifier, destructuring object/array, default, rest). */\nconst collectPatternNames = (node: T_AstNode | null | undefined, declared: Set<string>): void => {\n if (!node || typeof node.type !== 'string') return;\n switch (node.type) {\n case 'Identifier':\n if (node.name) declared.add(node.name);\n return;\n case 'ObjectPattern':\n if (node.properties) for (const property of node.properties) collectPatternNames(property.type === 'RestElement' ? property.argument : property.value, declared);\n return;\n case 'ArrayPattern':\n if (node.elements) for (const element of node.elements) collectPatternNames(element, declared);\n return;\n case 'AssignmentPattern':\n collectPatternNames(node.left, declared);\n return;\n case 'RestElement':\n collectPatternNames(node.argument, declared);\n return;\n case 'TSParameterProperty':\n collectPatternNames(node.parameter, declared);\n return;\n default:\n return;\n }\n};\n\n/** Thu thập tên binding (biến/hàm/class/param/import/enum...) từ 1 node vào tập `declared`. */\nconst collectBindingNames = (node: T_AstNode, declared: Set<string>): void => {\n switch (node.type) {\n case 'VariableDeclarator':\n collectPatternNames(node.id, declared);\n return;\n case 'FunctionDeclaration':\n case 'FunctionExpression':\n case 'ClassDeclaration':\n case 'ClassExpression':\n if (node.id?.name) declared.add(node.id.name);\n if (node.params) for (const param of node.params) collectPatternNames(param, declared);\n return;\n case 'ArrowFunctionExpression':\n if (node.params) for (const param of node.params) collectPatternNames(param, declared);\n return;\n case 'CatchClause':\n collectPatternNames(node.param, declared);\n return;\n case 'ImportDefaultSpecifier':\n case 'ImportNamespaceSpecifier':\n case 'ImportSpecifier':\n if (node.local?.name) declared.add(node.local.name);\n return;\n case 'TSEnumDeclaration':\n case 'TSModuleDeclaration':\n if (node.id?.name) declared.add(node.id.name);\n return;\n default:\n return;\n }\n};\n\n/** Xác định 1 Identifier có phải tham chiếu giá trị không (loại property access, key object, declaration id, label...). */\nconst isReferenceIdentifier = (parent: T_AstNode | null, keyInParent: string): boolean => {\n if (!parent) return true;\n const parentType = parent.type;\n if ((parentType === 'MemberExpression' || parentType === 'OptionalMemberExpression') && keyInParent === 'property' && !parent.computed) return false;\n if ((parentType === 'ObjectProperty' || parentType === 'ObjectMethod' || parentType === 'ClassMethod' || parentType === 'ClassProperty' || parentType === 'ClassPrivateProperty' || parentType === 'PropertyDefinition') && keyInParent === 'key' && !parent.computed) return false;\n if (keyInParent === 'label') return false;\n if (parentType === 'TSQualifiedName' && keyInParent === 'right') return false;\n if (parentType === 'VariableDeclarator' && keyInParent === 'id') return false;\n if ((parentType === 'FunctionDeclaration' || parentType === 'FunctionExpression' || parentType === 'ClassDeclaration' || parentType === 'ClassExpression') && keyInParent === 'id') return false;\n if (parentType === 'ImportSpecifier' || parentType === 'ImportDefaultSpecifier' || parentType === 'ImportNamespaceSpecifier' || parentType === 'ExportSpecifier') return false;\n if (parentType === 'MetaProperty') return false;\n if (parentType === 'TSEnumMember' && keyInParent === 'id') return false;\n return true;\n};\n\n/** Duyệt đệ quy AST: gom binding name vào `declared`, gom identifier tham chiếu vào `references`. */\nconst walkAstNode = (node: unknown, parent: T_AstNode | null, keyInParent: string, inType: boolean, declared: Set<string>, references: T_AstReference[]): void => {\n if (Array.isArray(node)) {\n for (const item of node) walkAstNode(item, parent, keyInParent, inType, declared, references);\n return;\n }\n if (!node || typeof node !== 'object') return;\n const current = node as T_AstNode;\n if (typeof current.type !== 'string') return;\n\n collectBindingNames(current, declared);\n\n if (current.type === 'Identifier' && !inType && isReferenceIdentifier(parent, keyInParent)) {\n const start = current.loc?.start;\n if (current.name && start) references.push({ name: current.name, line: start.line, column: start.column });\n }\n\n const opensType = inType || (current.type.startsWith('TS') && !tsValueNodes.has(current.type));\n for (const childKey of Object.keys(current)) {\n if (astSkipKeys.has(childKey)) continue;\n const child = current[childKey];\n const childOpensType = typeof child === 'object' && child !== null && typeof (child as T_AstNode).type === 'string' && (child as T_AstNode).type.startsWith('TS') && !tsValueNodes.has((child as T_AstNode).type);\n const childInType = opensType || astTypeKeys.has(childKey) || childOpensType;\n walkAstNode(child, current, childKey, childInType, declared, references);\n }\n};\n\n/**\n * Pass ngữ nghĩa: báo biến CHƯA KHAI BÁO. Tự duyệt AST (object thuần) — KHÔNG dùng `@babel/traverse`\n * (cần `process` của Node → crash browser). Hợp lệ = binding trong code + global JS/DOM + `completionLabels`.\n */\nexport const collectUndeclaredIdentifiers = async (ast: object, doc: Text, completionLabels: Set<string>, taintedLines: Set<number> = new Set()): Promise<Diagnostic[]> => {\n const globalsSet = await getKnownGlobals();\n const declared = new Set<string>();\n const references: T_AstReference[] = [];\n\n walkAstNode(ast as T_AstNode, null, '', false, declared, references);\n\n const diagnostics: Diagnostic[] = [];\n const seen = new Set<string>();\n for (const reference of references) {\n const { name, line: startLine, column: startColumn } = reference;\n if (declared.has(name) || globalsSet.has(name) || completionLabels.has(name)) continue;\n if (taintedLines.has(startLine)) continue;\n\n const dedupeKey = `${startLine}:${startColumn}:${name}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n\n const line = doc.line(Math.min(Math.max(startLine, 1), doc.lines));\n const from = Math.min(line.from + Math.max(startColumn, 0), doc.length);\n const to = Math.min(from + name.length, doc.length);\n diagnostics.push({ from, to: Math.max(from + 1, to), severity: 'error', message: `\"${name}\" is not defined` });\n }\n return diagnostics;\n};\n\n/**\n * Toàn bộ pipeline validate JS/TS:\n * - Pass 1: trailing dot (text) — flag đúng vị trí dấu `.` cuối dòng + đánh dấu dòng tainted.\n * - Pass 2: lỗi cú pháp babel — bỏ lỗi trên dòng tainted (cascading).\n * - Pass 3: rule cần AST (thiếu `;`, biến chưa khai báo). Trailing dot được \"vá\" (`.`→space) để babel\n * vẫn parse được phần còn lại → rule vẫn chạy cho các dòng KHÁC.\n */\nexport const computeJsDiagnostics = async (doc: Text, code: string, completionLabels: Set<string>): Promise<Diagnostic[]> => {\n const diagnostics: Diagnostic[] = [];\n if (code.trim() === '') {\n return diagnostics;\n }\n\n const taintedLines = new Set<number>();\n const dotPositions: number[] = [];\n collectTrailingDotDiagnostics(doc, diagnostics, taintedLines, dotPositions);\n\n const parseCode = replaceCharsWithSpace(code, dotPositions);\n const parser = await getBabelParser();\n const { errors, ast } = parseJs(parser, parseCode);\n const seen = new Set<string>();\n for (const error of errors) {\n const location = error.loc;\n if (!location) continue;\n const lineNumber = Math.min(Math.max(location.line, 1), doc.lines);\n if (taintedLines.has(lineNumber)) continue;\n const line = doc.line(lineNumber);\n const errorPos = Math.min(line.from + Math.max(location.column, 0), doc.length);\n const to = Math.min(errorPos + 1, doc.length);\n const from = errorPos >= to && errorPos > 0 ? errorPos - 1 : errorPos;\n const message = buildJsErrorMessage(doc, errorPos, error.message);\n const dedupeKey = `${from}:${message}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n diagnostics.push({ from, to: Math.max(from + 1, to), severity: 'error', message });\n }\n\n if (errors.length === 0 && ast) {\n collectMissingSemicolonDiagnostics(ast, code, diagnostics, taintedLines);\n diagnostics.push(...(await collectUndeclaredIdentifiers(ast, doc, completionLabels, taintedLines)));\n }\n\n return diagnostics;\n};\n","import { Diagnostic } from '@codemirror/lint';\nimport { EditorView } from '@codemirror/view';\nimport { get } from '@libs-ui/utils';\n\n/** Validate JSON bằng `JSON.parse`. Lỗi → 1 diagnostic phủ toàn bộ nội dung. */\nexport const computeJsonDiagnostics = (view: EditorView): Diagnostic[] => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n try {\n JSON.parse(text);\n } catch (error: unknown) {\n diagnostics.push({ from: 0, to: text.length, severity: 'error', message: get(error, 'message', '') });\n }\n return diagnostics;\n};\n","import { syntaxTree } from '@codemirror/language';\nimport { Diagnostic } from '@codemirror/lint';\nimport { Text } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { getTokenBefore } from './linter-shared';\n\nconst buildSqlErrorMessage = (doc: Text, node: SyntaxNodeRef): string => {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to);\n return `SQL syntax error near \"${text}\"`;\n }\n const prevToken = getTokenBefore(doc, node.from);\n if (!prevToken) return 'SQL syntax error at beginning of statement';\n if (/FROM$/i.test(prevToken)) return 'Expected table name after FROM';\n if (/SELECT$/i.test(prevToken)) return 'Expected column list after SELECT';\n if (/WHERE$/i.test(prevToken)) return 'Expected condition after WHERE';\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n return `Unexpected end of SQL after \"${prevToken}\"`;\n};\n\n/** Phát hiện lỗi cú pháp SQL từ error node của syntaxTree (Lezer). */\nexport const computeSqlDiagnostics = (view: EditorView): Diagnostic[] => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n syntaxTree(view.state).iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n diagnostics.push({ from: Math.max(0, node.from - 1), to: node.from, severity: 'error', message: buildSqlErrorMessage(doc, node) });\n },\n });\n return diagnostics;\n};\n","import { syntaxTree } from '@codemirror/language';\nimport { Diagnostic } from '@codemirror/lint';\nimport { Text } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { getTokenBefore } from './linter-shared';\n\nconst buildPythonErrorMessage = (doc: Text, node: SyntaxNodeRef): string => {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to).trim();\n return `Python syntax error${text ? ` near \"${text}\"` : ''}`;\n }\n const prevToken = getTokenBefore(doc, node.from);\n if (!prevToken) return 'Python syntax error';\n if (/^def$/i.test(prevToken)) return 'Expected function name after \"def\"';\n if (/^class$/i.test(prevToken)) return 'Expected class name after \"class\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^import$/i.test(prevToken)) return 'Expected module name after \"import\"';\n if (/^from$/i.test(prevToken)) return 'Expected module name after \"from\"';\n if (/^if$/i.test(prevToken)) return 'Expected condition after \"if\"';\n if (/^elif$/i.test(prevToken)) return 'Expected condition after \"elif\"';\n if (/^while$/i.test(prevToken)) return 'Expected condition after \"while\"';\n if (/^for$/i.test(prevToken)) return 'Expected variable after \"for\"';\n if (prevToken.endsWith('.')) return `Incomplete attribute access on \"${prevToken.slice(0, -1)}\"`;\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n if (prevToken.endsWith('[')) return 'Missing closing \"]\"';\n return `Python syntax error near \"${prevToken}\"`;\n};\n\n/** Phát hiện lỗi cú pháp Python từ error node của syntaxTree (Lezer) — cùng approach SQL. */\nexport const computePythonDiagnostics = (view: EditorView): Diagnostic[] => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n syntaxTree(view.state).iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n const from = Math.max(0, node.from - 1);\n const to = node.from === node.to ? node.from + 1 : node.to;\n diagnostics.push({ from, to: Math.min(to, doc.length), severity: 'error', message: buildPythonErrorMessage(doc, node) });\n },\n });\n return diagnostics;\n};\n","import { autocompletion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport { Extension } from '@codemirror/state';\nimport { IPreviewTextDataCompletionItem } from '../preview-text-data.interfaces';\n\n/**\n * Tạo extension autocomplete từ danh sách `items`:\n * 1. Gõ `obj.` → gợi ý properties của obj (dot-notation).\n * 2. Gõ ký tự → gợi ý tên biến/object top-level.\n */\nexport const buildCompletionExtension = (items: IPreviewTextDataCompletionItem[]): Extension => {\n const completionSource = (context: CompletionContext): CompletionResult | null => {\n // Cho phép path nhiều cấp (a.b.c.) — [\\w.]+ bắt trọn chuỗi trước con trỏ.\n const dotMatch = context.matchBefore(/[\\w.]+\\.\\w*/);\n if (dotMatch) {\n const segments = dotMatch.text.split('.');\n const partial = segments[segments.length - 1]; // phần đang gõ dở sau dấu '.' cuối\n const pathSegments = segments.slice(0, -1); // các cấp đã hoàn tất\n\n let current = items.find((item) => item.label === pathSegments[0]);\n for (let level = 1; level < pathSegments.length && current; level++) {\n current = current.properties?.find((property) => property.label === pathSegments[level]);\n }\n if (current?.properties?.length) {\n return {\n from: context.pos - partial.length,\n options: current.properties.map((p) => ({ label: p.label, type: p.type ?? 'property', detail: p.detail ?? '', info: p.info ?? '' })),\n };\n }\n }\n const word = context.matchBefore(/\\w*/);\n if (!word || (word.from === word.to && !context.explicit)) return null;\n\n return {\n from: word.from,\n options: items.map((item) => ({ label: item.label, type: item.type ?? 'variable', detail: item.detail ?? '', info: item.info ?? '' })),\n };\n };\n\n return autocompletion({ override: [completionSource] });\n};\n","import { syntaxTree } from '@codemirror/language';\nimport { Diagnostic, linter } from '@codemirror/lint';\nimport { EditorState, Extension, Transaction } from '@codemirror/state';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { IPreviewTextDataViolation, T_ForbiddenPattern } from '../preview-text-data.interfaces';\n\nconst escapeRegex = (str: string): string => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst toGlobalRegex = (pattern: T_ForbiddenPattern): RegExp => {\n if (pattern instanceof RegExp) {\n const flags = pattern.flags.includes('g') ? pattern.flags : `${pattern.flags}g`;\n return new RegExp(pattern.source, flags);\n }\n return new RegExp(escapeRegex(pattern), 'gi');\n};\n\n/**\n * Extension bảo mật gồm 2 layer:\n * 1. Linter: highlight đỏ tại đúng vị trí match (bỏ qua match trong comment) + gọi `emitViolations`.\n * 2. Transaction filter: chặn paste nếu nội dung paste chứa pattern cấm.\n */\nexport const buildForbiddenExtension = (patterns: T_ForbiddenPattern[], emitViolations: (violations: IPreviewTextDataViolation[]) => void): Extension => {\n const forbiddenLinter = linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const violations: IPreviewTextDataViolation[] = [];\n const text = view.state.doc.toString();\n\n const commentRanges: { from: number; to: number }[] = [];\n syntaxTree(view.state).iterate({\n enter: (node: SyntaxNodeRef) => {\n if (node.type.name.toLowerCase().includes('comment')) {\n commentRanges.push({ from: node.from, to: node.to });\n }\n },\n });\n const isInComment = (from: number, to: number): boolean => commentRanges.some((r) => from >= r.from && to <= r.to);\n\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = re.exec(text)) !== null) {\n const from = match.index;\n const to = from + match[0].length;\n if (isInComment(from, to)) continue;\n const line = view.state.doc.lineAt(from).number;\n const patternLabel = pattern instanceof RegExp ? pattern.source : pattern;\n diagnostics.push({ from, to, severity: 'error', message: `Mã bị cấm: \"${match[0]}\" — vi phạm chính sách bảo mật` });\n violations.push({ from, to, line, pattern: patternLabel, matched: match[0] });\n }\n }\n\n emitViolations(violations);\n return diagnostics;\n });\n\n const pasteFilter = EditorState.transactionFilter.of((tr: Transaction) => {\n if (!tr.docChanged) return tr;\n if (!tr.annotation(Transaction.userEvent)?.startsWith('input.paste')) return tr;\n const newText = tr.newDoc.toString();\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n if (re.test(newText)) return [];\n }\n return tr;\n });\n\n return [forbiddenLinter, pasteFilter];\n};\n","import { EditorView } from '@codemirror/view';\n\n/** Parse giá trị CSS px → number. Trả về undefined nếu không phải px hợp lệ (vd `none`, `0`). */\nexport const parsePx = (raw: string): number | undefined => {\n if (!raw || !raw.endsWith('px')) {\n return undefined;\n }\n const value = parseFloat(raw);\n return Number.isFinite(value) && value > 0 ? value : undefined;\n};\n\n/** Bù dòng trống cho đủ `minLines` (xử lý 1 lần khi khởi tạo). Đủ rồi giữ nguyên, không cắt bớt. */\nexport const applyMinLines = (content: string, minLines?: number): string => {\n const value = content ?? '';\n if (!minLines || minLines <= 0) {\n return value;\n }\n const currentLines = value === '' ? 1 : value.split('\\n').length;\n if (currentLines >= minLines) {\n return value;\n }\n return value + '\\n'.repeat(minLines - currentLines);\n};\n\n/**\n * Tính min/max-height vùng cuộn theo CSS của container ngoài, snap về bội số dòng.\n * Trừ offset phần header/toolbar (giữa đỉnh container và đỉnh vùng cuộn) để vừa khít container.\n */\nexport const applyContainerHeight = (view: EditorView, container: HTMLElement): void => {\n const style = getComputedStyle(container);\n const minPx = parsePx(style.minHeight);\n const maxPx = parsePx(style.maxHeight);\n if (minPx === undefined && maxPx === undefined) {\n return;\n }\n view.requestMeasure({\n read: (measureView) => {\n const line = measureView.contentDOM.querySelector('.cm-line');\n const lineHeight = (line ? line.getBoundingClientRect().height : measureView.defaultLineHeight) || 20;\n const offsetTop = Math.max(measureView.scrollDOM.getBoundingClientRect().top - container.getBoundingClientRect().top, 0);\n const toLines = (px: number) => Math.max(1, Math.floor((px - offsetTop - 8) / lineHeight));\n return { lineHeight, minLines: minPx === undefined ? undefined : toLines(minPx), maxLines: maxPx === undefined ? undefined : toLines(maxPx) };\n },\n write: ({ lineHeight, minLines, maxLines }, writeView) => {\n if (maxLines !== undefined) {\n writeView.scrollDOM.style.maxHeight = `${maxLines * lineHeight + 8}px`;\n writeView.scrollDOM.style.overflowY = 'auto';\n }\n // min-height: bù dòng trống vào content (hiện đủ line-number 1..N), giống cơ chế minLines.\n if (minLines !== undefined) {\n const currentLines = writeView.state.doc.lines;\n if (currentLines < minLines) {\n queueMicrotask(() => writeView.dispatch({ changes: { from: writeView.state.doc.length, insert: '\\n'.repeat(minLines - currentLines) } }));\n }\n }\n },\n });\n};\n\n/**\n * Giới hạn chiều cao editor (xử lý 1 lần). 2 chế độ loại trừ nhau:\n * - `maxLines`: cap theo số dòng truyền vào.\n * - `container`: tự tính số dòng theo `min-height`/`max-height` (CSS) của container, snap bội số dòng.\n * Cấu hình đồng thời `container` + `minLines`/`maxLines` → throw.\n */\nexport const applyMaxHeight = (view: EditorView | undefined, options: { minLines?: number; maxLines?: number; container?: HTMLElement }): void => {\n const { minLines, maxLines, container } = options;\n if (container && (minLines || maxLines)) {\n throw new Error('[preview-text-data] CẤM cấu hình [containerElement] cùng [minLines]/[maxLines]. Container tự quản lý min/max height.');\n }\n if (!view) {\n return;\n }\n if (container) {\n applyContainerHeight(view, container);\n return;\n }\n if (!maxLines || maxLines <= 0) {\n return;\n }\n view.requestMeasure({\n read: (measureView) => {\n const line = measureView.contentDOM.querySelector('.cm-line');\n return (line ? line.getBoundingClientRect().height : measureView.defaultLineHeight) || 20;\n },\n write: (lineHeight, writeView) => {\n writeView.scrollDOM.style.maxHeight = `${maxLines * lineHeight + 8}px`;\n writeView.scrollDOM.style.overflowY = 'auto';\n },\n });\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, input, model, OnInit, output, signal, viewChild } from '@angular/core';\nimport { Diagnostic, linter, lintGutter } from '@codemirror/lint';\nimport { Compartment, Extension, Prec } from '@codemirror/state';\nimport { EditorView, lineNumbers, ViewUpdate } from '@codemirror/view';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { LibsUiNotificationService } from '@libs-ui/services-notification';\nimport { basicSetup } from 'codemirror6';\nimport { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';\nimport { computeJsDiagnostics } from './linters/js-linter';\nimport { computeJsonDiagnostics } from './linters/json-linter';\nimport { computeSqlDiagnostics } from './linters/sql-linter';\nimport { computePythonDiagnostics } from './linters/python-linter';\nimport { buildCompletionExtension } from './editor/editor-completions';\nimport { buildForbiddenExtension } from './editor/editor-forbidden';\nimport { applyMaxHeight, applyMinLines } from './editor/editor-height';\nimport { ILanguageOptions, IPreviewTextDataChange, IPreviewTextDataCompletionItem, IPreviewTextDataViolation, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-preview_text_data',\n templateUrl: './preview-text-data.component.html',\n styleUrls: ['./preview-text-data.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent],\n})\nexport class LibsUiComponentsPreviewTextDataComponent implements OnInit, AfterViewInit {\n // ==========================================================================\n // PRIVATE PROPERTIES\n // ==========================================================================\n\n private editorViewInstance?: EditorView;\n private readonly wrapCompartment = new Compartment();\n private readonly languageCompartment = new Compartment();\n private readonly lineNumberCompartment = new Compartment();\n private readonly linterCompartment = new Compartment();\n private readonly completionsCompartment = new Compartment();\n private readonly forbiddenCompartment = new Compartment();\n\n private readonly contentStateNoWrap = signal('');\n\n /** Cache để tránh load lại language đã load */\n private readonly languageCache = new Map<string, Extension>();\n\n /** Flag để tránh update editor khi đang khởi tạo */\n private isInitialized = false;\n\n // ==========================================================================\n // INJECTED SERVICES\n // ==========================================================================\n\n private readonly notificationService = inject(LibsUiNotificationService);\n private readonly destroyRef = inject(DestroyRef);\n\n // ==========================================================================\n // PROTECTED SIGNALS\n // ==========================================================================\n\n protected readonly isWrap = signal<boolean>(true);\n protected readonly configLoadDataIsHttpConfig = signal<IListConfigItem>(httpRequestConfigGetOptionsLang());\n protected readonly labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);\n protected readonly acceptChangeLang = computed(() => !(this.langSelected() && this.langsAccept()?.length === 1 && this.langsAccept()?.includes(this.langSelected())));\n\n // ==========================================================================\n // INPUTS\n // ==========================================================================\n\n readonly content = input<string, string | undefined>('', {\n transform: (value?: string) => value ?? '',\n });\n\n readonly langSelected = model.required<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>();\n readonly langsAccept = input<Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT> | undefined>();\n readonly langsChangeLabel = input<ILanguageOptions | undefined>();\n\n readonly editable = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly hiddenAction = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n /** Số dòng tối thiểu: nếu content ít dòng hơn sẽ tự bù dòng trống (xử lý 1 lần khi khởi tạo editor). Bỏ trống = không bù. */\n readonly minLines = input<number | undefined>();\n /** Số dòng tối đa: vượt quá editor sẽ giới hạn chiều cao và xuất hiện vùng cuộn (xử lý 1 lần khi khởi tạo editor). Bỏ trống = không giới hạn. */\n readonly maxLines = input<number | undefined>();\n /**\n * Element container bên ngoài để editor tự tính chiều cao theo `min-height`/`max-height` (CSS) của nó.\n * Khi truyền, editor đọc min/max-height của container, trừ phần header/toolbar phía trên, rồi snap\n * chiều cao vùng cuộn về đúng bội số dòng (không cắt nửa dòng) + bật scroll khi vượt max.\n * CẤM cấu hình đồng thời với `minLines`/`maxLines` (sẽ throw lỗi) — container tự quản lý min/max.\n */\n readonly containerElement = input<HTMLElement | undefined>();\n /** z-index cho popover dropdown chọn ngôn ngữ. */\n readonly zIndexPopover = input<number | undefined>();\n\n readonly lintIgnorePatterns = input<Array<string>, Array<string> | undefined>(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {\n transform: (value?: Array<string>) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],\n });\n\n /**\n * Danh sách đối tượng/biến gợi ý khi gõ — giống IntelliSense trong IDE.\n * Hỗ trợ dot-notation: định nghĩa `properties` để gợi ý sau dấu `.`\n * @example\n * [completions]=\"[{ label: 'user', properties: [{ label: 'name', detail: 'string' }] }]\"\n */\n readonly completions = input<IPreviewTextDataCompletionItem[], IPreviewTextDataCompletionItem[] | undefined>([], {\n transform: (value?: IPreviewTextDataCompletionItem[]) => value ?? [],\n });\n\n /**\n * Danh sách pattern cấm — chuỗi literal hoặc RegExp.\n * Khi phát hiện vi phạm: highlight đỏ tại đúng vị trí + chặn paste + emit `(outViolations)`.\n * Dùng `DEFAULT_SECURITY_PATTERNS` để áp dụng bộ quy tắc bảo mật mặc định cho low-code.\n * @example\n * [forbiddenPatterns]=\"defaultSecurityPatterns\"\n * [forbiddenPatterns]=\"[/eval\\s*\\(/, 'localStorage']\"\n */\n readonly forbiddenPatterns = input<T_ForbiddenPattern[], T_ForbiddenPattern[] | undefined>([], {\n transform: (value?: T_ForbiddenPattern[]) => value ?? [],\n });\n\n readonly background = input<string, string | undefined>('#f8f9fa', {\n transform: (value?: string) => value ?? '#f8f9fa',\n });\n\n // ==========================================================================\n // OUTPUTS\n // ==========================================================================\n\n readonly outChange = output<IPreviewTextDataChange>();\n readonly syntaxErrors = output<Diagnostic[]>();\n readonly outViolations = output<IPreviewTextDataViolation[]>();\n\n // ==========================================================================\n // VIEW CHILDREN\n // ==========================================================================\n\n private readonly containerPreview = viewChild.required<ElementRef<HTMLDivElement>>('containerPreview');\n\n // ==========================================================================\n // CONSTRUCTOR - Setup effects\n // ==========================================================================\n\n constructor() {\n // Effect để sync content từ input vào editor\n effect(() => {\n const newContent = this.content();\n if (this.isInitialized && this.editorViewInstance) {\n const currentContent = this.editorViewInstance.state.doc.toString();\n if (newContent !== currentContent) {\n this.editorViewInstance.dispatch({\n changes: {\n from: 0,\n to: currentContent.length,\n insert: newContent,\n },\n });\n }\n }\n });\n\n // Effect để cập nhật custom completions khi input thay đổi\n effect(() => {\n const items = this.completions();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.completionsCompartment.reconfigure(items.length ? buildCompletionExtension(items) : []),\n });\n });\n\n // Effect để cập nhật forbidden patterns khi input thay đổi\n effect(() => {\n const patterns = this.forbiddenPatterns();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.forbiddenCompartment.reconfigure(patterns.length ? buildForbiddenExtension(patterns, (violations) => this.outViolations.emit(violations)) : []),\n });\n });\n\n // Cleanup khi component bị destroy\n this.destroyRef.onDestroy(() => {\n this.editorViewInstance?.destroy();\n this.languageCache.clear();\n });\n }\n\n // ==========================================================================\n // LIFECYCLE HOOKS\n // ==========================================================================\n\n ngOnInit(): void {\n if (this.langsAccept()?.length) {\n this.configLoadDataIsHttpConfig.set(httpRequestConfigGetOptionsLang(this.langsAccept(), this.langsChangeLabel()));\n }\n }\n\n async ngAfterViewInit(): Promise<void> {\n await this.initializeEditor();\n this.isInitialized = true;\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Editor initialization\n // ==========================================================================\n\n /**\n * Khởi tạo editor với các extensions cơ bản\n * Language được load async để tối ưu bundle size\n */\n private async initializeEditor(): Promise<void> {\n const languageExtension = await this.loadLanguageExtension(this.langSelected());\n const linterExtension = await this.loadLinterExtension(this.langSelected());\n\n this.editorViewInstance = new EditorView({\n doc: applyMinLines(this.content(), this.minLines()),\n parent: this.containerPreview().nativeElement,\n extensions: this.createExtensions(languageExtension, linterExtension),\n });\n applyMaxHeight(this.editorViewInstance, { minLines: this.minLines(), maxLines: this.maxLines(), container: this.containerElement() });\n }\n\n /**\n * Tạo danh sách extensions cho editor\n */\n private createExtensions(languageExtension: Extension, linterExtension: Extension): Extension[] {\n const initialCompletions = this.completions();\n const initialPatterns = this.forbiddenPatterns();\n return [\n basicSetup,\n this.languageCompartment.of(languageExtension),\n this.linterCompartment.of(linterExtension),\n // Compartment cho custom completions — Prec.highest để override basicSetup's autocompletion\n Prec.highest(this.completionsCompartment.of(initialCompletions.length ? buildCompletionExtension(initialCompletions) : [])),\n this.forbiddenCompartment.of(initialPatterns.length ? buildForbiddenExtension(initialPatterns, (violations) => this.outViolations.emit(violations)) : []),\n this.createLightTheme(),\n EditorView.editable.of(this.editable()),\n this.wrapCompartment.of(EditorView.lineWrapping),\n this.lineNumberCompartment.of(lineNumbers()),\n lintGutter(),\n this.createBracketTheme(),\n this.createUpdateListener(),\n ];\n }\n\n /**\n * Load language extension với caching\n * Mỗi language chỉ được load 1 lần\n */\n private async loadLanguageExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n\n const cached = this.languageCache.get(lowerLang);\n if (cached) {\n return cached;\n }\n const registryItem = languageRegistry[lowerLang];\n const extension = registryItem ? await registryItem.loader() : await createDefaultLanguage();\n\n this.languageCache.set(lowerLang, extension);\n return extension;\n }\n\n /**\n * Load linter extension nếu có\n */\n private async loadLinterExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n const registryItem = languageRegistry[lowerLang];\n\n if (registryItem?.linter) {\n return registryItem.linter(this);\n }\n\n return linter(() => []);\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Theme configuration\n // ==========================================================================\n\n private createLightTheme(): Extension {\n return EditorView.theme({\n '&': { backgroundColor: this.background(), color: '#333' },\n '.cm-content': { caretColor: '#111' },\n '.cm-activeLine': { backgroundColor: '#f0f0f0' },\n });\n }\n\n private createBracketTheme(): Extension {\n return EditorView.theme({\n '.cm-matchingBracket': {\n backgroundColor: 'rgba(100, 200, 255, 0.15)',\n border: '1px solid rgba(100, 200, 255, 0.4)',\n borderRadius: '3px',\n transition: 'all 0.2s ease',\n },\n '.cm-nonmatchingBracket': {\n backgroundColor: 'rgba(255, 100, 100, 0.15)',\n border: '1px solid rgba(255, 100, 100, 0.3)',\n borderRadius: '3px',\n },\n });\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Update listener\n // ==========================================================================\n\n private createUpdateListener(): Extension {\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.docChanged && this.editable()) {\n const newValue = update.state.doc.toString();\n this.outChange.emit({\n content: newValue,\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'content',\n });\n }\n });\n }\n\n // ==========================================================================\n // PUBLIC METHODS - Linter factories (được gọi từ registry)\n // ==========================================================================\n\n\n /** JavaScript/TypeScript linter — pipeline trong `linters/js-linter.ts` (babel + trailing-dot + thiếu `;` + biến chưa khai báo). */\n createJsLinter(): Extension {\n return linter(async (view) => {\n const diagnostics = await computeJsDiagnostics(view.state.doc, view.state.doc.toString(), new Set(this.completions().map((item) => item.label)));\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /** JSON linter — logic trong `linters/json-linter.ts`. */\n createJsonLinter(): Extension {\n return linter((view) => {\n const diagnostics = computeJsonDiagnostics(view);\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /** SQL linter — logic trong `linters/sql-linter.ts`. */\n createSqlLinter(): Extension {\n return linter((view) => {\n const diagnostics = computeSqlDiagnostics(view);\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /** Python linter — logic trong `linters/python-linter.ts`. */\n createPythonLinter(): Extension {\n return linter((view) => {\n const diagnostics = computePythonDiagnostics(view);\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n // ==========================================================================\n // PROTECTED METHODS - Event handlers\n // ==========================================================================\n\n protected handlerCopy(): void {\n navigator.clipboard.writeText(this.content() || '');\n this.notificationService.showCompTypeTextInfo('Sao chép thành công');\n }\n\n protected handlerLineWrap(): void {\n // Lấy nội dung mới nhất từ editor sau khi đã xóa newlines\n const currentContent = this.editorViewInstance?.state.doc.toString() || '';\n if (this.isWrap()) {\n this.contentStateNoWrap.set(currentContent);\n }\n const updatedContent = this.isWrap() && currentContent ? currentContent.replace(/\\n/g, ' ') : this.contentStateNoWrap();\n this.isWrap.update((val) => !val);\n\n if (currentContent !== updatedContent) {\n this.editorViewInstance?.dispatch({\n changes: { from: 0, to: currentContent.length, insert: updatedContent },\n });\n }\n\n // Batch cả 2 dispatch thành 1 để tối ưu performance\n this.editorViewInstance?.dispatch({\n effects: [this.wrapCompartment.reconfigure(this.isWrap() ? EditorView.lineWrapping : []), this.lineNumberCompartment.reconfigure(this.isWrap() ? lineNumbers() : [])],\n });\n }\n\n protected async handlerSelectKey(data?: IEmitSelectKey): Promise<void> {\n if (!data?.key) {\n return;\n }\n\n const newLang = data.key as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT;\n this.langSelected.set(newLang);\n\n // Load language và linter mới\n const [languageExtension, linterExtension] = await Promise.all([this.loadLanguageExtension(newLang), this.loadLinterExtension(newLang)]);\n\n // Reconfigure thay vì tạo mới state để giữ lại document content\n this.editorViewInstance?.dispatch({\n effects: [this.languageCompartment.reconfigure(languageExtension), this.linterCompartment.reconfigure(linterExtension)],\n });\n\n this.outChange.emit({\n content: this.content(),\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'language',\n });\n }\n}\n","<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [zIndex]=\"zIndexPopover()\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libs-ui-components-preview-text-data.mjs","sources":["../../../../../libs-ui/components/preview-text-data/src/preview-text-data.define.ts","../../../../../libs-ui/components/preview-text-data/src/linters/linter-shared.ts","../../../../../libs-ui/components/preview-text-data/src/linters/js-linter.ts","../../../../../libs-ui/components/preview-text-data/src/linters/json-linter.ts","../../../../../libs-ui/components/preview-text-data/src/linters/sql-linter.ts","../../../../../libs-ui/components/preview-text-data/src/linters/python-linter.ts","../../../../../libs-ui/components/preview-text-data/src/editor/editor-completions.ts","../../../../../libs-ui/components/preview-text-data/src/editor/editor-forbidden.ts","../../../../../libs-ui/components/preview-text-data/src/editor/editor-height.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.html","../../../../../libs-ui/components/preview-text-data/src/libs-ui-components-preview-text-data.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { Extension } from '@codemirror/state';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { IHttpRequestConfig, returnListObject } from '@libs-ui/services-http-request';\nimport { UtilsHttpParamsRequest } from '@libs-ui/utils';\nimport { LibsUiComponentsPreviewTextDataComponent } from './preview-text-data.component';\nimport { ILanguageOptions, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n/**\n * Danh sách các ngôn ngữ được hỗ trợ\n * Sử dụng const array để tránh tạo mới mỗi lần truy cập\n */\nexport const optionsLangData: Array<ILanguageOptions> = [\n { id: 'text', label: 'Plain Text' },\n { id: 'javascript', label: 'JavaScript/TypeScript' },\n { id: 'html', label: 'HTML' },\n { id: 'css', label: 'CSS/SCSS/SASS' },\n { id: 'markdown', label: 'Markdown' },\n { id: 'json', label: 'JSON' },\n { id: 'sql', label: 'SQL' },\n { id: 'xml', label: 'XML' },\n { id: 'yaml', label: 'YAML' },\n { id: 'python', label: 'Python' },\n { id: 'java', label: 'Java' },\n { id: 'cpp', label: 'C/C++' },\n { id: 'php', label: 'PHP' },\n { id: 'go', label: 'Go' },\n] as const;\n\nexport const httpRequestConfigGetOptionsLang = (langsAccept?: Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>, langsChangeLabel?: ILanguageOptions): IListConfigItem => {\n const langs = [...optionsLangData].filter((item) => !langsAccept?.length || (langsAccept as string[]).includes(item.id));\n\n langs.forEach((item) => ({\n id: item.id,\n label: langsChangeLabel?.label || item.label,\n }));\n\n return {\n type: 'text',\n httpRequestData: signal<IHttpRequestConfig>({\n objectInstance: returnListObject(langs),\n functionName: 'list',\n argumentsValue: [new UtilsHttpParamsRequest({ fromObject: { page: 1, per_page: 40 } })],\n }),\n configTemplateText: signal({\n fieldKey: 'id',\n notUseVirtualScroll: true,\n }),\n };\n};\n\ntype T_LanguageLoader = () => Promise<Extension>;\ntype T_LinterLoader = (component: LibsUiComponentsPreviewTextDataComponent) => Promise<Extension>;\ninterface I_LanguageRegistryItem {\n loader: T_LanguageLoader;\n linter?: T_LinterLoader;\n}\n\nexport const languageRegistry: Record<string, I_LanguageRegistryItem> = {\n javascript: {\n loader: async () => {\n const { javascript } = await import('@codemirror/lang-javascript');\n return javascript({ jsx: true, typescript: true });\n },\n linter: async (component) => component.createJsLinter(),\n },\n html: {\n loader: async () => {\n const { html } = await import('@codemirror/lang-html');\n return html();\n },\n },\n css: {\n loader: async () => {\n const { css } = await import('@codemirror/lang-css');\n return css();\n },\n },\n markdown: {\n loader: async () => {\n const { markdown } = await import('@codemirror/lang-markdown');\n return markdown();\n },\n },\n json: {\n loader: async () => {\n const { json } = await import('@codemirror/lang-json');\n return json();\n },\n linter: async (component) => component.createJsonLinter(),\n },\n sql: {\n loader: async () => {\n const { sql } = await import('@codemirror/lang-sql');\n return sql();\n },\n linter: async (component) => component.createSqlLinter(),\n },\n xml: {\n loader: async () => {\n const { xml } = await import('@codemirror/lang-xml');\n return xml();\n },\n },\n yaml: {\n loader: async () => {\n const { yaml } = await import('@codemirror/lang-yaml');\n return yaml();\n },\n },\n python: {\n loader: async () => {\n const { python } = await import('@codemirror/lang-python');\n return python();\n },\n linter: async (component) => component.createPythonLinter(),\n },\n java: {\n loader: async () => {\n const { java } = await import('@codemirror/lang-java');\n return java();\n },\n },\n cpp: {\n loader: async () => {\n const { cpp } = await import('@codemirror/lang-cpp');\n return cpp();\n },\n },\n php: {\n loader: async () => {\n const { php } = await import('@codemirror/lang-php');\n return php();\n },\n },\n go: {\n loader: async () => {\n const { go } = await import('@codemirror/lang-go');\n return go();\n },\n },\n};\n\n/**\n * Bộ pattern bảo mật mặc định cho low-code platform.\n * Chặn các API nguy hiểm: eval, network calls, storage, DOM injection...\n */\nexport const DEFAULT_SECURITY_PATTERNS: T_ForbiddenPattern[] = [\n /eval\\s*\\(/i,\n /new\\s+Function\\s*\\(/i,\n /document\\.cookie/i,\n /localStorage/i,\n /sessionStorage/i,\n /fetch\\s*\\(/i,\n /new\\s+XMLHttpRequest/i,\n /require\\s*\\(/i,\n /import\\s*\\(/i,\n /process\\.env/i,\n /<script/i,\n /document\\.write\\s*\\(/i,\n /window\\.location\\s*=/i,\n];\n\n/**\n * Các key của AST node KHÔNG phải node con (metadata vị trí, comment...) — bỏ qua khi duyệt.\n */\nexport const astSkipKeys = new Set<string>(['loc', 'start', 'end', 'range', 'leadingComments', 'trailingComments', 'innerComments', 'extra', 'comments', 'tokens']);\n\n/**\n * Các key chứa annotation kiểu TypeScript → con của nó nằm trong \"type context\" (không phải biến giá trị).\n */\nexport const astTypeKeys = new Set<string>(['typeAnnotation', 'returnType', 'typeParameters', 'typeArguments', 'superTypeParameters']);\n\n/**\n * Các node `TS*` mang GIÁ TRỊ (không phải type thuần) → con của chúng vẫn là biến giá trị bình thường.\n */\nexport const tsValueNodes = new Set<string>(['TSEnumDeclaration', 'TSEnumMember', 'TSModuleDeclaration', 'TSModuleBlock', 'TSAsExpression', 'TSNonNullExpression', 'TSParameterProperty', 'TSExportAssignment', 'TSImportEqualsDeclaration', 'TSExternalModuleReference', 'TSSatisfiesExpression']);\n\n/**\n * Tạo default language extension cho plain text\n * Sử dụng khi ngôn ngữ không được hỗ trợ\n */\nexport const createDefaultLanguage = async (): Promise<Extension> => {\n const { StreamLanguage } = await import('@codemirror/language');\n return StreamLanguage.define({\n token(stream) {\n stream.skipToEnd();\n return null;\n },\n });\n};\n","import { Text } from '@codemirror/state';\n\n/** Lấy token (chuỗi không khoảng trắng) liền trước vị trí `pos` trong document. Dùng chung cho JS/SQL/Python. */\nexport const getTokenBefore = (doc: Text, pos: number): string => {\n const start = Math.max(0, pos - 30);\n const text = doc.sliceString(start, pos);\n const match = /(\\S+)\\s*$/.exec(text);\n return match?.[1] ?? '';\n};\n","import { Diagnostic } from '@codemirror/lint';\nimport { Text } from '@codemirror/state';\nimport { get } from '@libs-ui/utils';\nimport { astSkipKeys, astTypeKeys, tsValueNodes } from '../preview-text-data.define';\nimport { T_AstNode } from '../preview-text-data.type';\nimport { getTokenBefore } from './linter-shared';\n\ntype T_BabelError = { loc?: { line: number; column: number }; message: string };\ntype T_AstReference = { name: string; line: number; column: number };\n\n// Cache module-level (chia sẻ giữa các instance editor) — đều immutable, lazy-load 1 lần.\nlet babelParserModule: typeof import('@babel/parser') | undefined;\nlet knownGlobalsSet: Set<string> | undefined;\n\n/** Lazy-load + cache module @babel/parser (chỉ tải lần đầu khi lint JS/TS). */\nconst getBabelParser = async (): Promise<typeof import('@babel/parser')> => {\n if (!babelParserModule) {\n babelParserModule = await import('@babel/parser');\n }\n return babelParserModule;\n};\n\n/** Lazy-load + cache tập biến toàn cục JS/DOM hợp lệ từ package `globals` (JSON thuần, browser-safe). */\nconst getKnownGlobals = async (): Promise<Set<string>> => {\n if (!knownGlobalsSet) {\n const globalsModule = (await import('globals')) as unknown as { default?: Record<string, Record<string, boolean>> };\n const globalsData = (globalsModule.default ?? globalsModule) as Record<string, Record<string, boolean>>;\n knownGlobalsSet = new Set<string>([...Object.keys(globalsData['builtin'] ?? {}), ...Object.keys(globalsData['browser'] ?? {}), ...Object.keys(globalsData['es2021'] ?? {})]);\n }\n return knownGlobalsSet;\n};\n\n/**\n * Parse code, trả về vừa danh sách lỗi cú pháp vừa AST (nếu parse sạch).\n * `errorRecovery` gom nhiều lỗi vào `result.errors`; lỗi nặng vẫn `throw` → bắt thêm ở catch.\n */\nexport const parseJs = (parser: typeof import('@babel/parser'), code: string): { errors: T_BabelError[]; ast?: object } => {\n try {\n const result = parser.parse(code, {\n sourceType: 'module',\n errorRecovery: true,\n plugins: ['typescript', 'jsx'],\n allowReturnOutsideFunction: true,\n allowAwaitOutsideFunction: true,\n allowImportExportEverywhere: true,\n allowSuperOutsideMethod: true,\n allowNewTargetOutsideFunction: true,\n allowUndeclaredExports: true,\n });\n return { errors: result.errors as T_BabelError[], ast: result };\n } catch (error: unknown) {\n const loc = get(error, 'loc') as { line: number; column: number } | undefined;\n const message = (get(error, 'message') as string) || 'JavaScript syntax error';\n return { errors: [{ loc, message }] };\n }\n};\n\n/** Giữ cho test/back-compat: chỉ lấy danh sách lỗi cú pháp. */\nexport const collectBabelErrors = (parser: typeof import('@babel/parser'), code: string): T_BabelError[] => parseJs(parser, code).errors;\n\n/**\n * Quét text từng dòng, flag dấu \".\" cuối dòng (incomplete property access) tại ĐÚNG vị trí dấu chấm.\n * Thu thập `taintedLines` (dòng có trailing dot) + `dotPositions` (offset dấu chấm để vá khi parse).\n */\nexport const collectTrailingDotDiagnostics = (doc: Text, diagnostics: Diagnostic[], taintedLines: Set<number>, dotPositions: number[]): void => {\n for (let lineNumber = 1; lineNumber <= doc.lines; lineNumber++) {\n const line = doc.line(lineNumber);\n const trimmed = line.text.trimEnd();\n const match = /(\\w+)\\.\\s*$/.exec(trimmed);\n if (!match) {\n continue;\n }\n taintedLines.add(lineNumber);\n const dotPosition = line.from + trimmed.lastIndexOf('.');\n dotPositions.push(dotPosition);\n diagnostics.push({ from: dotPosition, to: dotPosition + 1, severity: 'error', message: `Incomplete property access on \"${match[1]}\"` });\n }\n};\n\n/** Thay các ký tự tại `positions` bằng space, giữ nguyên độ dài chuỗi (để offset không đổi). */\nconst replaceCharsWithSpace = (code: string, positions: number[]): string => {\n if (!positions.length) {\n return code;\n }\n const chars = code.split('');\n for (const position of positions) {\n if (position >= 0 && position < chars.length) {\n chars[position] = ' ';\n }\n }\n return chars.join('');\n};\n\n/** VariableDeclaration ở `for(let i=0;...)` / `for..in` / `for..of` KHÔNG cần `;` cuối. */\nconst requiresSemicolon = (nodeType: string, parentType: string, keyInParent: string): boolean => {\n if (nodeType === 'VariableDeclaration') {\n if (parentType === 'ForStatement' && keyInParent === 'init') return false;\n if ((parentType === 'ForInStatement' || parentType === 'ForOfStatement') && keyInParent === 'left') return false;\n }\n return true;\n};\n\n/**\n * Rule custom \"require semicolon\": câu lệnh (const/let/return/expression...) không kết thúc bằng `;` → báo lỗi.\n * Dùng vị trí `node.end` của AST babel; bỏ qua dòng tainted (trailing dot) để không chồng lỗi.\n */\nexport const collectMissingSemicolonDiagnostics = (ast: object, code: string, diagnostics: Diagnostic[], taintedLines: Set<number>): void => {\n const semiNodes = new Set(['ExpressionStatement', 'VariableDeclaration', 'ReturnStatement', 'ThrowStatement', 'BreakStatement', 'ContinueStatement', 'DoWhileStatement', 'DebuggerStatement']);\n const seen = new Set<number>();\n const lineOf = (offset: number) => code.slice(0, offset).split('\\n').length;\n const walk = (node: unknown, parentType: string, keyInParent: string): void => {\n if (Array.isArray(node)) {\n for (const item of node) walk(item, parentType, keyInParent);\n return;\n }\n if (!node || typeof node !== 'object') return;\n const current = node as T_AstNode;\n if (typeof current.type !== 'string') return;\n\n if (semiNodes.has(current.type) && requiresSemicolon(current.type, parentType, keyInParent) && typeof current.end === 'number') {\n const end = Math.min(current.end, code.length);\n if (end > 0 && code.charAt(end - 1) !== ';' && !seen.has(end) && !taintedLines.has(lineOf(end - 1))) {\n seen.add(end);\n diagnostics.push({ from: end - 1, to: end, severity: 'error', message: 'Missing semicolon' });\n }\n }\n\n for (const childKey of Object.keys(current)) {\n if (astSkipKeys.has(childKey)) continue;\n walk(current[childKey], current.type, childKey);\n }\n };\n walk((ast as { program?: unknown }).program ?? ast, '', '');\n};\n\n/** Chuẩn hóa message: thân thiện cho trailing dot + heuristic kiểu cũ cho \"Unexpected token\"; bỏ hậu tố \"(line:col)\". */\nexport const buildJsErrorMessage = (doc: Text, from: number, rawMessage: string): string => {\n const charBefore = from > 0 ? doc.sliceString(from - 1, from) : '';\n if (charBefore === '.') {\n const owner = getTokenBefore(doc, from).replace(/\\.$/, '');\n return owner ? `Incomplete property access on \"${owner}\"` : 'Incomplete property access';\n }\n\n const cleaned = rawMessage.replace(/\\s*\\(\\d+:\\d+\\)\\s*$/, '').trim();\n if (/missing semicolon/i.test(cleaned)) {\n return 'Unexpected token — missing operator or separator between expressions';\n }\n if (/^unexpected token$/i.test(cleaned)) {\n const prevToken = getTokenBefore(doc, from);\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n if (prevToken.endsWith('[')) return 'Missing closing \"]\"';\n if (/^function$/i.test(prevToken)) return 'Expected function name or \"(\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^=>$/.test(prevToken)) return 'Expected function body after \"=>\"';\n if (/^const$|^let$|^var$/i.test(prevToken)) return 'Expected variable name';\n }\n return `JavaScript syntax error: ${cleaned}`;\n};\n\n/** Lấy tên binding từ pattern (Identifier, destructuring object/array, default, rest). */\nconst collectPatternNames = (node: T_AstNode | null | undefined, declared: Set<string>): void => {\n if (!node || typeof node.type !== 'string') return;\n switch (node.type) {\n case 'Identifier':\n if (node.name) declared.add(node.name);\n return;\n case 'ObjectPattern':\n if (node.properties) for (const property of node.properties) collectPatternNames(property.type === 'RestElement' ? property.argument : property.value, declared);\n return;\n case 'ArrayPattern':\n if (node.elements) for (const element of node.elements) collectPatternNames(element, declared);\n return;\n case 'AssignmentPattern':\n collectPatternNames(node.left, declared);\n return;\n case 'RestElement':\n collectPatternNames(node.argument, declared);\n return;\n case 'TSParameterProperty':\n collectPatternNames(node.parameter, declared);\n return;\n default:\n return;\n }\n};\n\n/** Thu thập tên binding (biến/hàm/class/param/import/enum...) từ 1 node vào tập `declared`. */\nconst collectBindingNames = (node: T_AstNode, declared: Set<string>): void => {\n switch (node.type) {\n case 'VariableDeclarator':\n collectPatternNames(node.id, declared);\n return;\n case 'FunctionDeclaration':\n case 'FunctionExpression':\n case 'ClassDeclaration':\n case 'ClassExpression':\n if (node.id?.name) declared.add(node.id.name);\n if (node.params) for (const param of node.params) collectPatternNames(param, declared);\n return;\n case 'ArrowFunctionExpression':\n if (node.params) for (const param of node.params) collectPatternNames(param, declared);\n return;\n case 'CatchClause':\n collectPatternNames(node.param, declared);\n return;\n case 'ImportDefaultSpecifier':\n case 'ImportNamespaceSpecifier':\n case 'ImportSpecifier':\n if (node.local?.name) declared.add(node.local.name);\n return;\n case 'TSEnumDeclaration':\n case 'TSModuleDeclaration':\n if (node.id?.name) declared.add(node.id.name);\n return;\n default:\n return;\n }\n};\n\n/** Xác định 1 Identifier có phải tham chiếu giá trị không (loại property access, key object, declaration id, label...). */\nconst isReferenceIdentifier = (parent: T_AstNode | null, keyInParent: string): boolean => {\n if (!parent) return true;\n const parentType = parent.type;\n if ((parentType === 'MemberExpression' || parentType === 'OptionalMemberExpression') && keyInParent === 'property' && !parent.computed) return false;\n if ((parentType === 'ObjectProperty' || parentType === 'ObjectMethod' || parentType === 'ClassMethod' || parentType === 'ClassProperty' || parentType === 'ClassPrivateProperty' || parentType === 'PropertyDefinition') && keyInParent === 'key' && !parent.computed) return false;\n if (keyInParent === 'label') return false;\n if (parentType === 'TSQualifiedName' && keyInParent === 'right') return false;\n if (parentType === 'VariableDeclarator' && keyInParent === 'id') return false;\n if ((parentType === 'FunctionDeclaration' || parentType === 'FunctionExpression' || parentType === 'ClassDeclaration' || parentType === 'ClassExpression') && keyInParent === 'id') return false;\n if (parentType === 'ImportSpecifier' || parentType === 'ImportDefaultSpecifier' || parentType === 'ImportNamespaceSpecifier' || parentType === 'ExportSpecifier') return false;\n if (parentType === 'MetaProperty') return false;\n if (parentType === 'TSEnumMember' && keyInParent === 'id') return false;\n return true;\n};\n\n/** Duyệt đệ quy AST: gom binding name vào `declared`, gom identifier tham chiếu vào `references`. */\nconst walkAstNode = (node: unknown, parent: T_AstNode | null, keyInParent: string, inType: boolean, declared: Set<string>, references: T_AstReference[]): void => {\n if (Array.isArray(node)) {\n for (const item of node) walkAstNode(item, parent, keyInParent, inType, declared, references);\n return;\n }\n if (!node || typeof node !== 'object') return;\n const current = node as T_AstNode;\n if (typeof current.type !== 'string') return;\n\n collectBindingNames(current, declared);\n\n if (current.type === 'Identifier' && !inType && isReferenceIdentifier(parent, keyInParent)) {\n const start = current.loc?.start;\n if (current.name && start) references.push({ name: current.name, line: start.line, column: start.column });\n }\n\n const opensType = inType || (current.type.startsWith('TS') && !tsValueNodes.has(current.type));\n for (const childKey of Object.keys(current)) {\n if (astSkipKeys.has(childKey)) continue;\n const child = current[childKey];\n const childOpensType = typeof child === 'object' && child !== null && typeof (child as T_AstNode).type === 'string' && (child as T_AstNode).type.startsWith('TS') && !tsValueNodes.has((child as T_AstNode).type);\n const childInType = opensType || astTypeKeys.has(childKey) || childOpensType;\n walkAstNode(child, current, childKey, childInType, declared, references);\n }\n};\n\n/**\n * Pass ngữ nghĩa: báo biến CHƯA KHAI BÁO. Tự duyệt AST (object thuần) — KHÔNG dùng `@babel/traverse`\n * (cần `process` của Node → crash browser). Hợp lệ = binding trong code + global JS/DOM + `completionLabels`.\n */\nexport const collectUndeclaredIdentifiers = async (ast: object, doc: Text, completionLabels: Set<string>, taintedLines: Set<number> = new Set()): Promise<Diagnostic[]> => {\n const globalsSet = await getKnownGlobals();\n const declared = new Set<string>();\n const references: T_AstReference[] = [];\n\n walkAstNode(ast as T_AstNode, null, '', false, declared, references);\n\n const diagnostics: Diagnostic[] = [];\n const seen = new Set<string>();\n for (const reference of references) {\n const { name, line: startLine, column: startColumn } = reference;\n if (declared.has(name) || globalsSet.has(name) || completionLabels.has(name)) continue;\n if (taintedLines.has(startLine)) continue;\n\n const dedupeKey = `${startLine}:${startColumn}:${name}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n\n const line = doc.line(Math.min(Math.max(startLine, 1), doc.lines));\n const from = Math.min(line.from + Math.max(startColumn, 0), doc.length);\n const to = Math.min(from + name.length, doc.length);\n diagnostics.push({ from, to: Math.max(from + 1, to), severity: 'error', message: `\"${name}\" is not defined` });\n }\n return diagnostics;\n};\n\n/**\n * Toàn bộ pipeline validate JS/TS:\n * - Pass 1: trailing dot (text) — flag đúng vị trí dấu `.` cuối dòng + đánh dấu dòng tainted.\n * - Pass 2: lỗi cú pháp babel — bỏ lỗi trên dòng tainted (cascading).\n * - Pass 3: rule cần AST (thiếu `;`, biến chưa khai báo). Trailing dot được \"vá\" (`.`→space) để babel\n * vẫn parse được phần còn lại → rule vẫn chạy cho các dòng KHÁC.\n */\nexport const computeJsDiagnostics = async (doc: Text, code: string, completionLabels: Set<string>): Promise<Diagnostic[]> => {\n const diagnostics: Diagnostic[] = [];\n if (code.trim() === '') {\n return diagnostics;\n }\n\n const taintedLines = new Set<number>();\n const dotPositions: number[] = [];\n collectTrailingDotDiagnostics(doc, diagnostics, taintedLines, dotPositions);\n\n const parseCode = replaceCharsWithSpace(code, dotPositions);\n const parser = await getBabelParser();\n const { errors, ast } = parseJs(parser, parseCode);\n const seen = new Set<string>();\n for (const error of errors) {\n const location = error.loc;\n if (!location) continue;\n const lineNumber = Math.min(Math.max(location.line, 1), doc.lines);\n if (taintedLines.has(lineNumber)) continue;\n const line = doc.line(lineNumber);\n const errorPos = Math.min(line.from + Math.max(location.column, 0), doc.length);\n const to = Math.min(errorPos + 1, doc.length);\n const from = errorPos >= to && errorPos > 0 ? errorPos - 1 : errorPos;\n const message = buildJsErrorMessage(doc, errorPos, error.message);\n const dedupeKey = `${from}:${message}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n diagnostics.push({ from, to: Math.max(from + 1, to), severity: 'error', message });\n }\n\n if (errors.length === 0 && ast) {\n collectMissingSemicolonDiagnostics(ast, code, diagnostics, taintedLines);\n diagnostics.push(...(await collectUndeclaredIdentifiers(ast, doc, completionLabels, taintedLines)));\n }\n\n return diagnostics;\n};\n","import { Diagnostic } from '@codemirror/lint';\nimport { EditorView } from '@codemirror/view';\nimport { get } from '@libs-ui/utils';\n\n/** Validate JSON bằng `JSON.parse`. Lỗi → 1 diagnostic phủ toàn bộ nội dung. */\nexport const computeJsonDiagnostics = (view: EditorView): Diagnostic[] => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n try {\n JSON.parse(text);\n } catch (error: unknown) {\n diagnostics.push({ from: 0, to: text.length, severity: 'error', message: get(error, 'message', '') });\n }\n return diagnostics;\n};\n","import { syntaxTree } from '@codemirror/language';\nimport { Diagnostic } from '@codemirror/lint';\nimport { Text } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { getTokenBefore } from './linter-shared';\n\nconst buildSqlErrorMessage = (doc: Text, node: SyntaxNodeRef): string => {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to);\n return `SQL syntax error near \"${text}\"`;\n }\n const prevToken = getTokenBefore(doc, node.from);\n if (!prevToken) return 'SQL syntax error at beginning of statement';\n if (/FROM$/i.test(prevToken)) return 'Expected table name after FROM';\n if (/SELECT$/i.test(prevToken)) return 'Expected column list after SELECT';\n if (/WHERE$/i.test(prevToken)) return 'Expected condition after WHERE';\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n return `Unexpected end of SQL after \"${prevToken}\"`;\n};\n\n/** Phát hiện lỗi cú pháp SQL từ error node của syntaxTree (Lezer). */\nexport const computeSqlDiagnostics = (view: EditorView): Diagnostic[] => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n syntaxTree(view.state).iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n diagnostics.push({ from: Math.max(0, node.from - 1), to: node.from, severity: 'error', message: buildSqlErrorMessage(doc, node) });\n },\n });\n return diagnostics;\n};\n","import { syntaxTree } from '@codemirror/language';\nimport { Diagnostic } from '@codemirror/lint';\nimport { Text } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { getTokenBefore } from './linter-shared';\n\nconst buildPythonErrorMessage = (doc: Text, node: SyntaxNodeRef): string => {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to).trim();\n return `Python syntax error${text ? ` near \"${text}\"` : ''}`;\n }\n const prevToken = getTokenBefore(doc, node.from);\n if (!prevToken) return 'Python syntax error';\n if (/^def$/i.test(prevToken)) return 'Expected function name after \"def\"';\n if (/^class$/i.test(prevToken)) return 'Expected class name after \"class\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^import$/i.test(prevToken)) return 'Expected module name after \"import\"';\n if (/^from$/i.test(prevToken)) return 'Expected module name after \"from\"';\n if (/^if$/i.test(prevToken)) return 'Expected condition after \"if\"';\n if (/^elif$/i.test(prevToken)) return 'Expected condition after \"elif\"';\n if (/^while$/i.test(prevToken)) return 'Expected condition after \"while\"';\n if (/^for$/i.test(prevToken)) return 'Expected variable after \"for\"';\n if (prevToken.endsWith('.')) return `Incomplete attribute access on \"${prevToken.slice(0, -1)}\"`;\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n if (prevToken.endsWith('[')) return 'Missing closing \"]\"';\n return `Python syntax error near \"${prevToken}\"`;\n};\n\n/** Phát hiện lỗi cú pháp Python từ error node của syntaxTree (Lezer) — cùng approach SQL. */\nexport const computePythonDiagnostics = (view: EditorView): Diagnostic[] => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n syntaxTree(view.state).iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n const from = Math.max(0, node.from - 1);\n const to = node.from === node.to ? node.from + 1 : node.to;\n diagnostics.push({ from, to: Math.min(to, doc.length), severity: 'error', message: buildPythonErrorMessage(doc, node) });\n },\n });\n return diagnostics;\n};\n","import { autocompletion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport { Extension } from '@codemirror/state';\nimport { IPreviewTextDataCompletionItem } from '../preview-text-data.interfaces';\n\n/**\n * Tạo extension autocomplete từ danh sách `items`:\n * 1. Gõ `obj.` → gợi ý properties của obj (dot-notation).\n * 2. Gõ ký tự → gợi ý tên biến/object top-level.\n */\nexport const buildCompletionExtension = (items: IPreviewTextDataCompletionItem[]): Extension => {\n const completionSource = (context: CompletionContext): CompletionResult | null => {\n // Cho phép path nhiều cấp (a.b.c.) — [\\w.]+ bắt trọn chuỗi trước con trỏ.\n const dotMatch = context.matchBefore(/[\\w.]+\\.\\w*/);\n if (dotMatch) {\n const segments = dotMatch.text.split('.');\n const partial = segments[segments.length - 1]; // phần đang gõ dở sau dấu '.' cuối\n const pathSegments = segments.slice(0, -1); // các cấp đã hoàn tất\n\n let current = items.find((item) => item.label === pathSegments[0]);\n for (let level = 1; level < pathSegments.length && current; level++) {\n current = current.properties?.find((property) => property.label === pathSegments[level]);\n }\n if (current?.properties?.length) {\n return {\n from: context.pos - partial.length,\n options: current.properties.map((p) => ({ label: p.label, type: p.type ?? 'property', detail: p.detail ?? '', info: p.info ?? '' })),\n };\n }\n }\n const word = context.matchBefore(/\\w*/);\n if (!word || (word.from === word.to && !context.explicit)) return null;\n\n return {\n from: word.from,\n options: items.map((item) => ({ label: item.label, type: item.type ?? 'variable', detail: item.detail ?? '', info: item.info ?? '' })),\n };\n };\n\n return autocompletion({ override: [completionSource] });\n};\n","import { syntaxTree } from '@codemirror/language';\nimport { Diagnostic, linter } from '@codemirror/lint';\nimport { EditorState, Extension, Transaction } from '@codemirror/state';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { IPreviewTextDataViolation, T_ForbiddenPattern } from '../preview-text-data.interfaces';\n\nconst escapeRegex = (str: string): string => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst toGlobalRegex = (pattern: T_ForbiddenPattern): RegExp => {\n if (pattern instanceof RegExp) {\n const flags = pattern.flags.includes('g') ? pattern.flags : `${pattern.flags}g`;\n return new RegExp(pattern.source, flags);\n }\n return new RegExp(escapeRegex(pattern), 'gi');\n};\n\n/**\n * Extension bảo mật gồm 2 layer:\n * 1. Linter: highlight đỏ tại đúng vị trí match (bỏ qua match trong comment) + gọi `emitViolations`.\n * 2. Transaction filter: chặn paste nếu nội dung paste chứa pattern cấm.\n */\nexport const buildForbiddenExtension = (patterns: T_ForbiddenPattern[], emitViolations: (violations: IPreviewTextDataViolation[]) => void): Extension => {\n const forbiddenLinter = linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const violations: IPreviewTextDataViolation[] = [];\n const text = view.state.doc.toString();\n\n const commentRanges: { from: number; to: number }[] = [];\n syntaxTree(view.state).iterate({\n enter: (node: SyntaxNodeRef) => {\n if (node.type.name.toLowerCase().includes('comment')) {\n commentRanges.push({ from: node.from, to: node.to });\n }\n },\n });\n const isInComment = (from: number, to: number): boolean => commentRanges.some((r) => from >= r.from && to <= r.to);\n\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = re.exec(text)) !== null) {\n const from = match.index;\n const to = from + match[0].length;\n if (isInComment(from, to)) continue;\n const line = view.state.doc.lineAt(from).number;\n const patternLabel = pattern instanceof RegExp ? pattern.source : pattern;\n diagnostics.push({ from, to, severity: 'error', message: `Mã bị cấm: \"${match[0]}\" — vi phạm chính sách bảo mật` });\n violations.push({ from, to, line, pattern: patternLabel, matched: match[0] });\n }\n }\n\n emitViolations(violations);\n return diagnostics;\n });\n\n const pasteFilter = EditorState.transactionFilter.of((tr: Transaction) => {\n if (!tr.docChanged) return tr;\n if (!tr.annotation(Transaction.userEvent)?.startsWith('input.paste')) return tr;\n const newText = tr.newDoc.toString();\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n if (re.test(newText)) return [];\n }\n return tr;\n });\n\n return [forbiddenLinter, pasteFilter];\n};\n","import { EditorView } from '@codemirror/view';\n\n/** Parse giá trị CSS px → number. Trả về undefined nếu không phải px hợp lệ (vd `none`, `0`). */\nexport const parsePx = (raw: string): number | undefined => {\n if (!raw || !raw.endsWith('px')) {\n return undefined;\n }\n const value = parseFloat(raw);\n return Number.isFinite(value) && value > 0 ? value : undefined;\n};\n\n/** Bù dòng trống cho đủ `minLines` (xử lý 1 lần khi khởi tạo). Đủ rồi giữ nguyên, không cắt bớt. */\nexport const applyMinLines = (content: string, minLines?: number): string => {\n const value = content ?? '';\n if (!minLines || minLines <= 0) {\n return value;\n }\n const currentLines = value === '' ? 1 : value.split('\\n').length;\n if (currentLines >= minLines) {\n return value;\n }\n return value + '\\n'.repeat(minLines - currentLines);\n};\n\n/**\n * Tính min/max-height vùng cuộn theo CSS của container ngoài, snap về bội số dòng.\n * Trừ offset phần header/toolbar (giữa đỉnh container và đỉnh vùng cuộn) để vừa khít container.\n */\nexport const applyContainerHeight = (view: EditorView, container: HTMLElement): void => {\n const style = getComputedStyle(container);\n const minPx = parsePx(style.minHeight);\n const maxPx = parsePx(style.maxHeight);\n if (minPx === undefined && maxPx === undefined) {\n return;\n }\n view.requestMeasure({\n read: (measureView) => {\n const line = measureView.contentDOM.querySelector('.cm-line');\n const lineHeight = (line ? line.getBoundingClientRect().height : measureView.defaultLineHeight) || 20;\n const offsetTop = Math.max(measureView.scrollDOM.getBoundingClientRect().top - container.getBoundingClientRect().top, 0);\n const toLines = (px: number) => Math.max(1, Math.floor((px - offsetTop - 8) / lineHeight));\n return { lineHeight, minLines: minPx === undefined ? undefined : toLines(minPx), maxLines: maxPx === undefined ? undefined : toLines(maxPx) };\n },\n write: ({ lineHeight, minLines, maxLines }, writeView) => {\n if (maxLines !== undefined) {\n writeView.scrollDOM.style.maxHeight = `${maxLines * lineHeight + 8}px`;\n writeView.scrollDOM.style.overflowY = 'auto';\n }\n // min-height: bù dòng trống vào content (hiện đủ line-number 1..N), giống cơ chế minLines.\n if (minLines !== undefined) {\n const currentLines = writeView.state.doc.lines;\n if (currentLines < minLines) {\n queueMicrotask(() => writeView.dispatch({ changes: { from: writeView.state.doc.length, insert: '\\n'.repeat(minLines - currentLines) } }));\n }\n }\n },\n });\n};\n\n/**\n * Giới hạn chiều cao editor (xử lý 1 lần). 2 chế độ loại trừ nhau:\n * - `maxLines`: cap theo số dòng truyền vào.\n * - `container`: tự tính số dòng theo `min-height`/`max-height` (CSS) của container, snap bội số dòng.\n * Cấu hình đồng thời `container` + `minLines`/`maxLines` → throw.\n */\nexport const applyMaxHeight = (view: EditorView | undefined, options: { minLines?: number; maxLines?: number; container?: HTMLElement }): void => {\n const { minLines, maxLines, container } = options;\n if (container && (minLines || maxLines)) {\n throw new Error('[preview-text-data] CẤM cấu hình [containerElement] cùng [minLines]/[maxLines]. Container tự quản lý min/max height.');\n }\n if (!view) {\n return;\n }\n if (container) {\n applyContainerHeight(view, container);\n return;\n }\n if (!maxLines || maxLines <= 0) {\n return;\n }\n view.requestMeasure({\n read: (measureView) => {\n const line = measureView.contentDOM.querySelector('.cm-line');\n return (line ? line.getBoundingClientRect().height : measureView.defaultLineHeight) || 20;\n },\n write: (lineHeight, writeView) => {\n writeView.scrollDOM.style.maxHeight = `${maxLines * lineHeight + 8}px`;\n writeView.scrollDOM.style.overflowY = 'auto';\n },\n });\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, input, model, OnInit, output, signal, viewChild } from '@angular/core';\nimport { Diagnostic, linter, lintGutter } from '@codemirror/lint';\nimport { Compartment, Extension, Prec } from '@codemirror/state';\nimport { EditorView, lineNumbers, ViewUpdate } from '@codemirror/view';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { LibsUiNotificationService } from '@libs-ui/services-notification';\nimport { basicSetup } from 'codemirror6';\nimport { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';\nimport { computeJsDiagnostics } from './linters/js-linter';\nimport { computeJsonDiagnostics } from './linters/json-linter';\nimport { computeSqlDiagnostics } from './linters/sql-linter';\nimport { computePythonDiagnostics } from './linters/python-linter';\nimport { buildCompletionExtension } from './editor/editor-completions';\nimport { buildForbiddenExtension } from './editor/editor-forbidden';\nimport { applyMaxHeight, applyMinLines } from './editor/editor-height';\nimport { ILanguageOptions, IPreviewTextDataChange, IPreviewTextDataCompletionItem, IPreviewTextDataViolation, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-preview_text_data',\n templateUrl: './preview-text-data.component.html',\n styleUrls: ['./preview-text-data.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent],\n})\nexport class LibsUiComponentsPreviewTextDataComponent implements OnInit, AfterViewInit {\n // ==========================================================================\n // PRIVATE PROPERTIES\n // ==========================================================================\n\n private editorViewInstance?: EditorView;\n private readonly wrapCompartment = new Compartment();\n private readonly languageCompartment = new Compartment();\n private readonly lineNumberCompartment = new Compartment();\n private readonly linterCompartment = new Compartment();\n private readonly completionsCompartment = new Compartment();\n private readonly forbiddenCompartment = new Compartment();\n\n private readonly contentStateNoWrap = signal('');\n\n /** Cache để tránh load lại language đã load */\n private readonly languageCache = new Map<string, Extension>();\n\n /** Flag để tránh update editor khi đang khởi tạo */\n private isInitialized = false;\n\n // ==========================================================================\n // INJECTED SERVICES\n // ==========================================================================\n\n private readonly notificationService = inject(LibsUiNotificationService);\n private readonly destroyRef = inject(DestroyRef);\n\n // ==========================================================================\n // PROTECTED SIGNALS\n // ==========================================================================\n\n protected readonly isWrap = signal<boolean>(true);\n protected readonly configLoadDataIsHttpConfig = signal<IListConfigItem>(httpRequestConfigGetOptionsLang());\n protected readonly labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);\n protected readonly acceptChangeLang = computed(() => !(this.langSelected() && this.langsAccept()?.length === 1 && this.langsAccept()?.includes(this.langSelected())));\n\n // ==========================================================================\n // INPUTS\n // ==========================================================================\n\n readonly content = input<string, string | undefined>('', {\n transform: (value?: string) => value ?? '',\n });\n\n readonly langSelected = model.required<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>();\n readonly langsAccept = input<Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT> | undefined>();\n readonly langsChangeLabel = input<ILanguageOptions | undefined>();\n\n readonly editable = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly hiddenAction = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n /** Số dòng tối thiểu: nếu content ít dòng hơn sẽ tự bù dòng trống (xử lý 1 lần khi khởi tạo editor). Bỏ trống = không bù. */\n readonly minLines = input<number | undefined>();\n /** Số dòng tối đa: vượt quá editor sẽ giới hạn chiều cao và xuất hiện vùng cuộn (xử lý 1 lần khi khởi tạo editor). Bỏ trống = không giới hạn. */\n readonly maxLines = input<number | undefined>();\n /**\n * Element container bên ngoài để editor tự tính chiều cao theo `min-height`/`max-height` (CSS) của nó.\n * Khi truyền, editor đọc min/max-height của container, trừ phần header/toolbar phía trên, rồi snap\n * chiều cao vùng cuộn về đúng bội số dòng (không cắt nửa dòng) + bật scroll khi vượt max.\n * CẤM cấu hình đồng thời với `minLines`/`maxLines` (sẽ throw lỗi) — container tự quản lý min/max.\n */\n readonly containerElement = input<HTMLElement | undefined>();\n /** z-index cho popover dropdown chọn ngôn ngữ. */\n readonly zIndexPopover = input<number | undefined>();\n\n readonly lintIgnorePatterns = input<Array<string>, Array<string> | undefined>(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {\n transform: (value?: Array<string>) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],\n });\n\n /**\n * Danh sách đối tượng/biến gợi ý khi gõ — giống IntelliSense trong IDE.\n * Hỗ trợ dot-notation: định nghĩa `properties` để gợi ý sau dấu `.`\n * @example\n * [completions]=\"[{ label: 'user', properties: [{ label: 'name', detail: 'string' }] }]\"\n */\n readonly completions = input<IPreviewTextDataCompletionItem[], IPreviewTextDataCompletionItem[] | undefined>([], {\n transform: (value?: IPreviewTextDataCompletionItem[]) => value ?? [],\n });\n\n /**\n * Danh sách pattern cấm — chuỗi literal hoặc RegExp.\n * Khi phát hiện vi phạm: highlight đỏ tại đúng vị trí + chặn paste + emit `(outViolations)`.\n * Dùng `DEFAULT_SECURITY_PATTERNS` để áp dụng bộ quy tắc bảo mật mặc định cho low-code.\n * @example\n * [forbiddenPatterns]=\"defaultSecurityPatterns\"\n * [forbiddenPatterns]=\"[/eval\\s*\\(/, 'localStorage']\"\n */\n readonly forbiddenPatterns = input<T_ForbiddenPattern[], T_ForbiddenPattern[] | undefined>([], {\n transform: (value?: T_ForbiddenPattern[]) => value ?? [],\n });\n\n readonly background = input<string, string | undefined>('#f8f9fa', {\n transform: (value?: string) => value ?? '#f8f9fa',\n });\n\n // ==========================================================================\n // OUTPUTS\n // ==========================================================================\n\n readonly outChange = output<IPreviewTextDataChange>();\n readonly syntaxErrors = output<Diagnostic[]>();\n readonly outViolations = output<IPreviewTextDataViolation[]>();\n\n // ==========================================================================\n // VIEW CHILDREN\n // ==========================================================================\n\n private readonly containerPreview = viewChild.required<ElementRef<HTMLDivElement>>('containerPreview');\n\n // ==========================================================================\n // CONSTRUCTOR - Setup effects\n // ==========================================================================\n\n constructor() {\n // Effect để sync content từ input vào editor\n effect(() => {\n const newContent = this.content();\n if (this.isInitialized && this.editorViewInstance) {\n const currentContent = this.editorViewInstance.state.doc.toString();\n if (newContent !== currentContent) {\n this.editorViewInstance.dispatch({\n changes: {\n from: 0,\n to: currentContent.length,\n insert: newContent,\n },\n });\n }\n }\n });\n\n // Effect để cập nhật custom completions khi input thay đổi\n effect(() => {\n const items = this.completions();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.completionsCompartment.reconfigure(items.length ? buildCompletionExtension(items) : []),\n });\n });\n\n // Effect để cập nhật forbidden patterns khi input thay đổi\n effect(() => {\n const patterns = this.forbiddenPatterns();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.forbiddenCompartment.reconfigure(patterns.length ? buildForbiddenExtension(patterns, (violations) => this.outViolations.emit(violations)) : []),\n });\n });\n\n // Cleanup khi component bị destroy\n this.destroyRef.onDestroy(() => {\n this.editorViewInstance?.destroy();\n this.languageCache.clear();\n });\n }\n\n // ==========================================================================\n // LIFECYCLE HOOKS\n // ==========================================================================\n\n ngOnInit(): void {\n if (this.langsAccept()?.length) {\n this.configLoadDataIsHttpConfig.set(httpRequestConfigGetOptionsLang(this.langsAccept(), this.langsChangeLabel()));\n }\n }\n\n async ngAfterViewInit(): Promise<void> {\n await this.initializeEditor();\n this.isInitialized = true;\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Editor initialization\n // ==========================================================================\n\n /**\n * Khởi tạo editor với các extensions cơ bản\n * Language được load async để tối ưu bundle size\n */\n private async initializeEditor(): Promise<void> {\n const languageExtension = await this.loadLanguageExtension(this.langSelected());\n const linterExtension = await this.loadLinterExtension(this.langSelected());\n\n this.editorViewInstance = new EditorView({\n doc: applyMinLines(this.content(), this.minLines()),\n parent: this.containerPreview().nativeElement,\n extensions: this.createExtensions(languageExtension, linterExtension),\n });\n applyMaxHeight(this.editorViewInstance, { minLines: this.minLines(), maxLines: this.maxLines(), container: this.containerElement() });\n }\n\n /**\n * Tạo danh sách extensions cho editor\n */\n private createExtensions(languageExtension: Extension, linterExtension: Extension): Extension[] {\n const initialCompletions = this.completions();\n const initialPatterns = this.forbiddenPatterns();\n return [\n basicSetup,\n this.languageCompartment.of(languageExtension),\n this.linterCompartment.of(linterExtension),\n // Compartment cho custom completions — Prec.highest để override basicSetup's autocompletion\n Prec.highest(this.completionsCompartment.of(initialCompletions.length ? buildCompletionExtension(initialCompletions) : [])),\n this.forbiddenCompartment.of(initialPatterns.length ? buildForbiddenExtension(initialPatterns, (violations) => this.outViolations.emit(violations)) : []),\n this.createLightTheme(),\n EditorView.editable.of(this.editable()),\n this.wrapCompartment.of(EditorView.lineWrapping),\n this.lineNumberCompartment.of(lineNumbers()),\n lintGutter(),\n this.createBracketTheme(),\n this.createUpdateListener(),\n ];\n }\n\n /**\n * Load language extension với caching\n * Mỗi language chỉ được load 1 lần\n */\n private async loadLanguageExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n\n const cached = this.languageCache.get(lowerLang);\n if (cached) {\n return cached;\n }\n const registryItem = languageRegistry[lowerLang];\n const extension = registryItem ? await registryItem.loader() : await createDefaultLanguage();\n\n this.languageCache.set(lowerLang, extension);\n return extension;\n }\n\n /**\n * Load linter extension nếu có\n */\n private async loadLinterExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n const registryItem = languageRegistry[lowerLang];\n\n if (registryItem?.linter) {\n return registryItem.linter(this);\n }\n\n return linter(() => []);\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Theme configuration\n // ==========================================================================\n\n private createLightTheme(): Extension {\n return EditorView.theme({\n '&': { backgroundColor: this.background(), color: '#333' },\n '.cm-content': { caretColor: '#111' },\n '.cm-activeLine': { backgroundColor: '#f0f0f0' },\n });\n }\n\n private createBracketTheme(): Extension {\n return EditorView.theme({\n '.cm-matchingBracket': {\n backgroundColor: 'rgba(100, 200, 255, 0.15)',\n border: '1px solid rgba(100, 200, 255, 0.4)',\n borderRadius: '3px',\n transition: 'all 0.2s ease',\n },\n '.cm-nonmatchingBracket': {\n backgroundColor: 'rgba(255, 100, 100, 0.15)',\n border: '1px solid rgba(255, 100, 100, 0.3)',\n borderRadius: '3px',\n },\n });\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Update listener\n // ==========================================================================\n\n private createUpdateListener(): Extension {\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.docChanged && this.editable()) {\n const newValue = update.state.doc.toString();\n this.outChange.emit({\n content: newValue,\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'content',\n });\n }\n });\n }\n\n // ==========================================================================\n // PUBLIC METHODS - Linter factories (được gọi từ registry)\n // ==========================================================================\n\n\n /** JavaScript/TypeScript linter — pipeline trong `linters/js-linter.ts` (babel + trailing-dot + thiếu `;` + biến chưa khai báo). */\n createJsLinter(): Extension {\n return linter(async (view) => {\n const diagnostics = await computeJsDiagnostics(view.state.doc, view.state.doc.toString(), new Set(this.completions().map((item) => item.label)));\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /** JSON linter — logic trong `linters/json-linter.ts`. */\n createJsonLinter(): Extension {\n return linter((view) => {\n const diagnostics = computeJsonDiagnostics(view);\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /** SQL linter — logic trong `linters/sql-linter.ts`. */\n createSqlLinter(): Extension {\n return linter((view) => {\n const diagnostics = computeSqlDiagnostics(view);\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /** Python linter — logic trong `linters/python-linter.ts`. */\n createPythonLinter(): Extension {\n return linter((view) => {\n const diagnostics = computePythonDiagnostics(view);\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n // ==========================================================================\n // PROTECTED METHODS - Event handlers\n // ==========================================================================\n\n protected handlerCopy(): void {\n navigator.clipboard.writeText(this.content() || '');\n this.notificationService.showCompTypeTextInfo('Sao chép thành công');\n }\n\n protected handlerLineWrap(): void {\n // Lấy nội dung mới nhất từ editor sau khi đã xóa newlines\n const currentContent = this.editorViewInstance?.state.doc.toString() || '';\n if (this.isWrap()) {\n this.contentStateNoWrap.set(currentContent);\n }\n const updatedContent = this.isWrap() && currentContent ? currentContent.replace(/\\n/g, ' ') : this.contentStateNoWrap();\n this.isWrap.update((val) => !val);\n\n if (currentContent !== updatedContent) {\n this.editorViewInstance?.dispatch({\n changes: { from: 0, to: currentContent.length, insert: updatedContent },\n });\n }\n\n // Batch cả 2 dispatch thành 1 để tối ưu performance\n this.editorViewInstance?.dispatch({\n effects: [this.wrapCompartment.reconfigure(this.isWrap() ? EditorView.lineWrapping : []), this.lineNumberCompartment.reconfigure(this.isWrap() ? lineNumbers() : [])],\n });\n }\n\n protected async handlerSelectKey(data?: IEmitSelectKey): Promise<void> {\n if (!data?.key) {\n return;\n }\n\n const newLang = data.key as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT;\n this.langSelected.set(newLang);\n\n // Load language và linter mới\n const [languageExtension, linterExtension] = await Promise.all([this.loadLanguageExtension(newLang), this.loadLinterExtension(newLang)]);\n\n // Reconfigure thay vì tạo mới state để giữ lại document content\n this.editorViewInstance?.dispatch({\n effects: [this.languageCompartment.reconfigure(languageExtension), this.linterCompartment.reconfigure(linterExtension)],\n });\n\n this.outChange.emit({\n content: this.content(),\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'language',\n });\n }\n}\n","<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [zIndex]=\"zIndexPopover()\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "name": "@libs-ui/components-preview-text-data",
3
- "version": "0.2.357-14",
3
+ "version": "0.2.357-16",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=18.0.0",
6
6
  "@babel/parser": ">=7.0.0",
7
7
  "globals": ">=13.0.0",
8
- "@libs-ui/components-buttons-button": "0.2.357-14",
9
- "@libs-ui/components-dropdown": "0.2.357-14",
10
- "@libs-ui/services-notification": "0.2.357-14",
11
- "@libs-ui/utils": "0.2.357-14",
8
+ "@libs-ui/components-buttons-button": "0.2.357-16",
9
+ "@libs-ui/components-dropdown": "0.2.357-16",
10
+ "@libs-ui/services-notification": "0.2.357-16",
11
+ "@libs-ui/utils": "0.2.357-16",
12
12
  "@codemirror/autocomplete": "6.20.2",
13
13
  "@codemirror/language": "6.12.3",
14
14
  "@codemirror/lint": "6.9.1",
15
15
  "@codemirror/state": "6.6.0",
16
16
  "@codemirror/view": "6.38.6",
17
17
  "@lezer/common": "1.5.2",
18
- "@libs-ui/components-list": "0.2.357-14",
18
+ "@libs-ui/components-list": "0.2.357-16",
19
19
  "codemirror6": "npm:codemirror@6.0.2",
20
- "@libs-ui/services-http-request": "0.2.357-14",
20
+ "@libs-ui/services-http-request": "0.2.357-16",
21
21
  "@codemirror/lang-javascript": "6.2.4",
22
22
  "@codemirror/lang-html": "6.4.11",
23
23
  "@codemirror/lang-css": "6.3.1",