@tehw0lf/wordlist-generator 0.20.7 → 0.21.1
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.
|
@@ -107,10 +107,10 @@ class WordlistGeneratorService {
|
|
|
107
107
|
estimateWordlistSize(charsets) {
|
|
108
108
|
return charsets.reduce((total, charset) => total * charset.length, 1);
|
|
109
109
|
}
|
|
110
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
111
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
110
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
111
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }
|
|
112
112
|
}
|
|
113
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: WordlistGeneratorService, decorators: [{
|
|
114
114
|
type: Injectable,
|
|
115
115
|
args: [{
|
|
116
116
|
providedIn: 'root'
|
|
@@ -266,10 +266,10 @@ class WordlistGeneratorComponent {
|
|
|
266
266
|
this.charsets.removeAt(i);
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
270
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: WordlistGeneratorComponent, isStandalone: true, selector: "wordlist-generator", inputs: { buttonStyle: { classPropertyName: "buttonStyle", publicName: "buttonStyle", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: "dragStyle", publicName: "dragStyle", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: "textStyle", publicName: "textStyle", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n [disabled]=\"isGenerating()\"\n >\n @if (isGenerating()) {\n Generating...\n } @else {\n Generate wordlist\n }\n </button>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType.set(type)\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType()) {\n {{ this.fileType() }}\n }\n </button>\n }\n </div>\n \n @if (isGenerating() && isLargeDataset()) {\n <div class=\"progress-container\">\n <mat-progress-bar mode=\"indeterminate\" role=\"progressbar\" aria-label=\"Generating wordlist\"></mat-progress-bar>\n <p [ngStyle]=\"textStyle()\">Processing large dataset using Web Worker...</p>\n </div>\n }\n \n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (hasWordlist()) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist()) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist() }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n <!-- Wordlist is already loaded in the signal for large datasets -->\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i7.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
269
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: WordlistGeneratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
270
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: WordlistGeneratorComponent, isStandalone: true, selector: "wordlist-generator", inputs: { buttonStyle: { classPropertyName: "buttonStyle", publicName: "buttonStyle", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: "dragStyle", publicName: "dragStyle", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: "textStyle", publicName: "textStyle", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n [disabled]=\"isGenerating()\"\n >\n @if (isGenerating()) {\n Generating...\n } @else {\n Generate wordlist\n }\n </button>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType.set(type)\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType()) {\n {{ this.fileType() }}\n }\n </button>\n }\n </div>\n \n @if (isGenerating() && isLargeDataset()) {\n <div class=\"progress-container\">\n <mat-progress-bar mode=\"indeterminate\" role=\"progressbar\" aria-label=\"Generating wordlist\"></mat-progress-bar>\n <p [ngStyle]=\"textStyle()\">Processing large dataset using Web Worker...</p>\n </div>\n }\n \n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (hasWordlist()) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist()) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist() }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n <!-- Wordlist is already loaded in the signal for large datasets -->\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width:430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i7.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
271
271
|
}
|
|
272
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
272
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{
|
|
273
273
|
type: Component,
|
|
274
274
|
args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, imports: [
|
|
275
275
|
MatButtonModule,
|
|
@@ -282,8 +282,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
282
282
|
CdkDrag,
|
|
283
283
|
MatIconModule,
|
|
284
284
|
MatProgressBarModule
|
|
285
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n [disabled]=\"isGenerating()\"\n >\n @if (isGenerating()) {\n Generating...\n } @else {\n Generate wordlist\n }\n </button>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType.set(type)\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType()) {\n {{ this.fileType() }}\n }\n </button>\n }\n </div>\n \n @if (isGenerating() && isLargeDataset()) {\n <div class=\"progress-container\">\n <mat-progress-bar mode=\"indeterminate\" role=\"progressbar\" aria-label=\"Generating wordlist\"></mat-progress-bar>\n <p [ngStyle]=\"textStyle()\">Processing large dataset using Web Worker...</p>\n </div>\n }\n \n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (hasWordlist()) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist()) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist() }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n <!-- Wordlist is already loaded in the signal for large datasets -->\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width:
|
|
286
|
-
}], ctorParameters: () => [] });
|
|
285
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n [disabled]=\"isGenerating()\"\n >\n @if (isGenerating()) {\n Generating...\n } @else {\n Generate wordlist\n }\n </button>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType.set(type)\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType()) {\n {{ this.fileType() }}\n }\n </button>\n }\n </div>\n \n @if (isGenerating() && isLargeDataset()) {\n <div class=\"progress-container\">\n <mat-progress-bar mode=\"indeterminate\" role=\"progressbar\" aria-label=\"Generating wordlist\"></mat-progress-bar>\n <p [ngStyle]=\"textStyle()\">Processing large dataset using Web Worker...</p>\n </div>\n }\n \n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (hasWordlist()) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist()) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist() }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n <!-- Wordlist is already loaded in the signal for large datasets -->\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width:430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"] }]
|
|
286
|
+
}], ctorParameters: () => [], propDecorators: { buttonStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonStyle", required: false }] }], dragStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "dragStyle", required: false }] }], textStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "textStyle", required: false }] }] } });
|
|
287
287
|
|
|
288
288
|
/**
|
|
289
289
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tehw0lf-wordlist-generator.mjs","sources":["../tmp-esm2022/lib/filetypes.js","../tmp-esm2022/lib/parsers.js","../tmp-esm2022/lib/wordlist-generator.service.js","../tmp-esm2022/lib/wordlist-generator.component.js","../tmp-esm2022/tehw0lf-wordlist-generator.js"],"sourcesContent":["export var FileType;\n(function (FileType) {\n FileType[\"plaintext\"] = \"txt\";\n FileType[\"xml\"] = \"xml\";\n FileType[\"csv\"] = \"csv\";\n})(FileType || (FileType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy93b3JkbGlzdC1nZW5lcmF0b3Ivc3JjL2xpYi9maWxldHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksUUFJWDtBQUpELFdBQVksUUFBUTtJQUNsQiw2QkFBaUIsQ0FBQTtJQUNqQix1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtBQUNiLENBQUMsRUFKVyxRQUFRLEtBQVIsUUFBUSxRQUluQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIEZpbGVUeXBlIHtcbiAgcGxhaW50ZXh0ID0gJ3R4dCcsXG4gIHhtbCA9ICd4bWwnLFxuICBjc3YgPSAnY3N2J1xufVxuIl19","export const toPlaintext = (wordlist) => ({\n wordlist,\n contentType: 'text/plain'\n});\nexport const toXML = (wordlist) => {\n const head = '<wordlist><word>';\n const glue = '</word><word>';\n const tail = '</word></wordlist>';\n return {\n wordlist: head + wordlist.replace(/\\n/g, glue) + tail,\n contentType: 'text/xml'\n };\n};\nexport const toCSV = (wordlist) => {\n const glue = ',';\n return {\n wordlist: wordlist.replace(/\\n/g, glue),\n contentType: 'text/csv'\n };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvcGFyc2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FDekIsUUFBZ0IsRUFDMkIsRUFBRSxDQUFDLENBQUM7SUFDL0MsUUFBUTtJQUNSLFdBQVcsRUFBRSxZQUFZO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUNuQixRQUFnQixFQUMyQixFQUFFO0lBQzdDLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsUUFBUSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJO1FBQ3JELFdBQVcsRUFBRSxVQUFVO0tBQ3hCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FDbkIsUUFBZ0IsRUFDMkIsRUFBRTtJQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7SUFDakIsT0FBTztRQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDdkMsV0FBVyxFQUFFLFVBQVU7S0FDeEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0b1BsYWludGV4dCA9IChcbiAgd29yZGxpc3Q6IHN0cmluZ1xuKTogeyB3b3JkbGlzdDogc3RyaW5nOyBjb250ZW50VHlwZTogc3RyaW5nIH0gPT4gKHtcbiAgd29yZGxpc3QsXG4gIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbidcbn0pO1xuXG5leHBvcnQgY29uc3QgdG9YTUwgPSAoXG4gIHdvcmRsaXN0OiBzdHJpbmdcbik6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgaGVhZCA9ICc8d29yZGxpc3Q+PHdvcmQ+JztcbiAgY29uc3QgZ2x1ZSA9ICc8L3dvcmQ+PHdvcmQ+JztcbiAgY29uc3QgdGFpbCA9ICc8L3dvcmQ+PC93b3JkbGlzdD4nO1xuICByZXR1cm4ge1xuICAgIHdvcmRsaXN0OiBoZWFkICsgd29yZGxpc3QucmVwbGFjZSgvXFxuL2csIGdsdWUpICsgdGFpbCxcbiAgICBjb250ZW50VHlwZTogJ3RleHQveG1sJ1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvQ1NWID0gKFxuICB3b3JkbGlzdDogc3RyaW5nXG4pOiB7IHdvcmRsaXN0OiBzdHJpbmc7IGNvbnRlbnRUeXBlOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGdsdWUgPSAnLCc7XG4gIHJldHVybiB7XG4gICAgd29yZGxpc3Q6IHdvcmRsaXN0LnJlcGxhY2UoL1xcbi9nLCBnbHVlKSxcbiAgICBjb250ZW50VHlwZTogJ3RleHQvY3N2J1xuICB9O1xufTtcbiJdfQ==","import { Injectable } from '@angular/core';\nimport { product } from 'cartesian-product-generator';\nimport { from, Subject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport * as i0 from \"@angular/core\";\nexport class WordlistGeneratorService {\n constructor() {\n this.LARGE_DATASET_THRESHOLD = 50000;\n }\n generateWordlist(...charsets) {\n const estimatedSize = this.estimateWordlistSize(charsets);\n if (estimatedSize > this.LARGE_DATASET_THRESHOLD) {\n return this.generateWithWebWorker(charsets);\n }\n return this.generateSynchronously(charsets);\n }\n generateSynchronously(charsets) {\n return from(product(...charsets)).pipe(map((word) => word.join('')));\n }\n generateWithWebWorker(charsets) {\n const subject = new Subject();\n if (typeof Worker !== 'undefined') {\n const worker = new Worker(new URL('./wordlist.worker', import.meta.url));\n worker.onmessage = ({ data }) => {\n switch (data.type) {\n case 'batch':\n if (data.words) {\n data.words.forEach(word => subject.next(word));\n }\n break;\n case 'complete':\n subject.complete();\n worker.terminate();\n break;\n case 'error':\n subject.error(new Error(data.error || 'Worker error'));\n worker.terminate();\n break;\n }\n };\n worker.onerror = (error) => {\n subject.error(error);\n worker.terminate();\n };\n const message = {\n type: 'generate',\n charsets,\n batchSize: 1000\n };\n worker.postMessage(message);\n }\n else {\n // Fallback for environments without Worker support\n this.generateSynchronously(charsets).subscribe({\n next: (word) => subject.next(word),\n error: (err) => subject.error(err),\n complete: () => subject.complete()\n });\n }\n return subject.asObservable();\n }\n estimateWordlistSize(charsets) {\n return charsets.reduce((total, charset) => total * charset.length, 1);\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: WordlistGeneratorService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root'\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvbGliL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFpQnJDLE1BQU0sT0FBTyx3QkFBd0I7SUFIckM7UUFJbUIsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO0tBcUVsRDtJQW5FQyxnQkFBZ0IsQ0FBQyxHQUFHLFFBQWtCO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUxRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLHFCQUFxQixDQUFDLFFBQWtCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxRQUFrQjtRQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRXRDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXpFLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBd0MsRUFBRSxFQUFFO2dCQUNwRSxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDbEIsS0FBSyxPQUFPO3dCQUNWLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNqRCxDQUFDO3dCQUNELE1BQU07b0JBQ1IsS0FBSyxVQUFVO3dCQUNiLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDbkIsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNuQixNQUFNO29CQUNSLEtBQUssT0FBTzt3QkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQzt3QkFDdkQsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNuQixNQUFNO2dCQUNWLENBQUM7WUFDSCxDQUFDLENBQUM7WUFFRixNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixDQUFDLENBQUM7WUFFRixNQUFNLE9BQU8sR0FBMEI7Z0JBQ3JDLElBQUksRUFBRSxVQUFVO2dCQUNoQixRQUFRO2dCQUNSLFNBQVMsRUFBRSxJQUFJO2FBQ2hCLENBQUM7WUFFRixNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ04sbURBQW1EO1lBQ25ELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzdDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2xDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBQ2xDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO2FBQ25DLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU8sb0JBQW9CLENBQUMsUUFBa0I7UUFDN0MsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQzs4R0FyRVUsd0JBQXdCO2tIQUF4Qix3QkFBd0IsY0FGdkIsTUFBTTs7MkZBRVAsd0JBQXdCO2tCQUhwQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHByb2R1Y3QgfSBmcm9tICdjYXJ0ZXNpYW4tcHJvZHVjdC1nZW5lcmF0b3InO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbnRlcmZhY2UgV29yZGxpc3RXb3JrZXJNZXNzYWdlIHtcbiAgdHlwZTogJ2dlbmVyYXRlJztcbiAgY2hhcnNldHM6IHN0cmluZ1tdO1xuICBiYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBXb3JkbGlzdFdvcmtlclJlc3BvbnNlIHtcbiAgdHlwZTogJ2JhdGNoJyB8ICdjb21wbGV0ZScgfCAnZXJyb3InO1xuICB3b3Jkcz86IHN0cmluZ1tdO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgV29yZGxpc3RHZW5lcmF0b3JTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBMQVJHRV9EQVRBU0VUX1RIUkVTSE9MRCA9IDUwMDAwO1xuXG4gIGdlbmVyYXRlV29yZGxpc3QoLi4uY2hhcnNldHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBlc3RpbWF0ZWRTaXplID0gdGhpcy5lc3RpbWF0ZVdvcmRsaXN0U2l6ZShjaGFyc2V0cyk7XG4gICAgXG4gICAgaWYgKGVzdGltYXRlZFNpemUgPiB0aGlzLkxBUkdFX0RBVEFTRVRfVEhSRVNIT0xEKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVdpdGhXZWJXb3JrZXIoY2hhcnNldHMpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVN5bmNocm9ub3VzbHkoY2hhcnNldHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVN5bmNocm9ub3VzbHkoY2hhcnNldHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gZnJvbShwcm9kdWN0KC4uLmNoYXJzZXRzKSkucGlwZShcbiAgICAgIG1hcCgod29yZDogc3RyaW5nW10pID0+IHdvcmQuam9pbignJykpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVXaXRoV2ViV29ya2VyKGNoYXJzZXRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBcbiAgICBpZiAodHlwZW9mIFdvcmtlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIobmV3IFVSTCgnLi93b3JkbGlzdC53b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKTtcbiAgICAgIFxuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfTogTWVzc2FnZUV2ZW50PFdvcmRsaXN0V29ya2VyUmVzcG9uc2U+KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnYmF0Y2gnOlxuICAgICAgICAgICAgaWYgKGRhdGEud29yZHMpIHtcbiAgICAgICAgICAgICAgZGF0YS53b3Jkcy5mb3JFYWNoKHdvcmQgPT4gc3ViamVjdC5uZXh0KHdvcmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2NvbXBsZXRlJzpcbiAgICAgICAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1dvcmtlciBlcnJvcicpKTtcbiAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICB3b3JrZXIub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICBzdWJqZWN0LmVycm9yKGVycm9yKTtcbiAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3QgbWVzc2FnZTogV29yZGxpc3RXb3JrZXJNZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiAnZ2VuZXJhdGUnLFxuICAgICAgICBjaGFyc2V0cyxcbiAgICAgICAgYmF0Y2hTaXplOiAxMDAwXG4gICAgICB9O1xuICAgICAgXG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBXb3JrZXIgc3VwcG9ydFxuICAgICAgdGhpcy5nZW5lcmF0ZVN5bmNocm9ub3VzbHkoY2hhcnNldHMpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICh3b3JkKSA9PiBzdWJqZWN0Lm5leHQod29yZCksXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBzdWJqZWN0LmVycm9yKGVyciksXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiBzdWJqZWN0LmNvbXBsZXRlKClcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXN0aW1hdGVXb3JkbGlzdFNpemUoY2hhcnNldHM6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY2hhcnNldHMucmVkdWNlKCh0b3RhbCwgY2hhcnNldCkgPT4gdG90YWwgKiBjaGFyc2V0Lmxlbmd0aCwgMSk7XG4gIH1cbn1cbiJdfQ==","import { CdkDrag, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, signal, ViewEncapsulation } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { Subject } from 'rxjs';\nimport { finalize, reduce, shareReplay, takeUntil } from 'rxjs/operators';\nimport { FileType } from './filetypes';\nimport { toCSV, toPlaintext, toXML } from './parsers';\nimport { WordlistGeneratorService } from './wordlist-generator.service';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/material/button\";\nimport * as i2 from \"@angular/material/menu\";\nimport * as i3 from \"@angular/forms\";\nimport * as i4 from \"@angular/material/form-field\";\nimport * as i5 from \"@angular/material/input\";\nimport * as i6 from \"@angular/material/icon\";\nimport * as i7 from \"@angular/material/progress-bar\";\n/* eslint-disable @angular-eslint/component-selector */\nexport class WordlistGeneratorComponent {\n constructor() {\n this.formBuilder = inject(UntypedFormBuilder);\n this.wordlistGenerator = inject(WordlistGeneratorService);\n this.buttonStyle = input({\n 'background-color': '#333333',\n color: '#cc7832'\n }, ...(ngDevMode ? [{ debugName: \"buttonStyle\" }] : []));\n this.dragStyle = input({ color: '#cc7832' }, ...(ngDevMode ? [{ debugName: \"dragStyle\" }] : []));\n this.textStyle = input({ color: '#cc7832' }, ...(ngDevMode ? [{ debugName: \"textStyle\" }] : []));\n this.wordlist = signal('', ...(ngDevMode ? [{ debugName: \"wordlist\" }] : []));\n this.displayWordlist = signal(false, ...(ngDevMode ? [{ debugName: \"displayWordlist\" }] : []));\n this.fileType = signal(FileType.plaintext, ...(ngDevMode ? [{ debugName: \"fileType\" }] : []));\n this.fileTypes = Object.values(FileType);\n this.filteredCharset = signal([], ...(ngDevMode ? [{ debugName: \"filteredCharset\" }] : []));\n this.prefix = signal('', ...(ngDevMode ? [{ debugName: \"prefix\" }] : []));\n this.suffix = signal('', ...(ngDevMode ? [{ debugName: \"suffix\" }] : []));\n this.isGenerating = signal(false, ...(ngDevMode ? [{ debugName: \"isGenerating\" }] : []));\n this.isLargeDataset = signal(false, ...(ngDevMode ? [{ debugName: \"isLargeDataset\" }] : []));\n this.wordsGenerated = signal(undefined, ...(ngDevMode ? [{ debugName: \"wordsGenerated\" }] : []));\n this.canGenerate = computed(() => this.charsetForm?.valid && this.filteredCharset().length > 0, ...(ngDevMode ? [{ debugName: \"canGenerate\" }] : []));\n this.hasWordlist = computed(() => this.wordlist().length > 0, ...(ngDevMode ? [{ debugName: \"hasWordlist\" }] : []));\n this.unsubscribe$ = new Subject();\n this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');\n this.generateForm();\n }\n ngOnDestroy() {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n get charsets() {\n if (this.charsetForm) {\n return this.charsetForm.get('charsets');\n }\n return undefined;\n }\n addCharset() {\n if (this.charsets) {\n this.charsets.push(this.formBuilder.control('', Validators.required));\n }\n }\n cloneCharset(index) {\n if (this.charsets) {\n const charset = this.charsets.value[index];\n this.charsets.insert(index, this.formBuilder.control(charset, Validators.required));\n }\n }\n downloadWordlist() {\n if (this.charsets) {\n const currentCharset = this.filterCharset(this.charsets.value);\n if (JSON.stringify(this.filteredCharset()) !==\n JSON.stringify(currentCharset)) {\n this.generateWordlist();\n }\n const filename = `wordlist_${this.wordsGenerated()}_words_${this.charsets.length}_positions.${this.fileType()}`;\n const wordlistContent = this.wordlist();\n if (wordlistContent && wordlistContent.length > 0) {\n this.performDownload(wordlistContent, filename);\n }\n }\n }\n performDownload(wordlistContent, filename) {\n const parsed = this.parseWordlist(wordlistContent);\n const file = new Blob([parsed.wordlist], {\n type: parsed.contentType\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (window.navigator.msSaveOrOpenBlob) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n window.navigator.msSaveOrOpenBlob(file, filename);\n }\n else {\n const a = document.createElement('a');\n const url = URL.createObjectURL(file);\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }, 0);\n }\n }\n drop(event) {\n if (this.charsets) {\n moveItemInArray(this.charsets.controls, event.previousIndex, event.currentIndex);\n this.charsets.updateValueAndValidity();\n }\n }\n generateForm() {\n this.charsetForm = this.formBuilder.group({\n charsets: this.formBuilder.array([\n this.formBuilder.control('', Validators.required)\n ]),\n prefix: this.formBuilder.control(''),\n suffix: this.formBuilder.control('')\n });\n }\n generateWordlist() {\n if (this.charsetForm && this.charsets && this.charsets.valid) {\n this.filteredCharset.set(this.filterCharset(this.charsets.value));\n this.prefix.set(this.charsetForm.get('prefix')?.value || '');\n this.suffix.set(this.charsetForm.get('suffix')?.value || '');\n const wordsCount = this.filteredCharset()\n .map((charset) => charset.length)\n .reduce((previousLength, currentLength) => previousLength * currentLength);\n this.wordsGenerated.set(wordsCount);\n this.isLargeDataset.set(wordsCount > 50000);\n this.displayWordlist.set(wordsCount <= 100);\n this.isGenerating.set(true);\n // Generate wordlist and update signal\n this.getWordlist()\n .pipe(takeUntil(this.unsubscribe$))\n .subscribe({\n next: (wordlist) => this.wordlist.set(wordlist),\n error: (error) => {\n console.error('Error generating wordlist:', error);\n this.isGenerating.set(false);\n }\n });\n }\n }\n getWordlist() {\n return this.wordlistGenerator\n .generateWordlist(...this.filteredCharset())\n .pipe(shareReplay({ bufferSize: 1, refCount: true }), reduce((wordlist, word) => `${wordlist}${this.prefix()}${word}${this.suffix()}\\n`, ''), finalize(() => {\n this.isGenerating.set(false);\n }), takeUntil(this.unsubscribe$));\n }\n filterCharset(charsets) {\n return charsets.map((charset) => this.removeDuplicates(charset));\n }\n parseWordlist(wordlist) {\n switch (this.fileType()) {\n case FileType.plaintext:\n return toPlaintext(wordlist);\n case FileType.xml:\n return toXML(wordlist);\n case FileType.csv:\n return toCSV(wordlist);\n }\n }\n removeCharset(i) {\n if (this.charsets && this.charsets.length > 1) {\n this.charsets.removeAt(i);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: WordlistGeneratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.3\", type: WordlistGeneratorComponent, isStandalone: true, selector: \"wordlist-generator\", inputs: { buttonStyle: { classPropertyName: \"buttonStyle\", publicName: \"buttonStyle\", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: \"dragStyle\", publicName: \"dragStyle\", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: \"textStyle\", publicName: \"textStyle\", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n [disabled]=\\\"isGenerating()\\\"\\n >\\n @if (isGenerating()) {\\n Generating...\\n } @else {\\n Generate wordlist\\n }\\n </button>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType.set(type)\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType()) {\\n {{ this.fileType() }}\\n }\\n </button>\\n }\\n </div>\\n \\n @if (isGenerating() && isLargeDataset()) {\\n <div class=\\\"progress-container\\\">\\n <mat-progress-bar mode=\\\"indeterminate\\\" role=\\\"progressbar\\\" aria-label=\\\"Generating wordlist\\\"></mat-progress-bar>\\n <p [ngStyle]=\\\"textStyle()\\\">Processing large dataset using Web Worker...</p>\\n </div>\\n }\\n \\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (hasWordlist()) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist()) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist() }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n <!-- Wordlist is already loaded in the signal for large datasets -->\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"], dependencies: [{ kind: \"ngmodule\", type: MatButtonModule }, { kind: \"component\", type: i1.MatButton, selector: \" button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] \", inputs: [\"matButton\"], exportAs: [\"matButton\", \"matAnchor\"] }, { kind: \"directive\", type: NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"ngmodule\", type: MatMenuModule }, { kind: \"component\", type: i2.MatMenu, selector: \"mat-menu\", inputs: [\"backdropClass\", \"aria-label\", \"aria-labelledby\", \"aria-describedby\", \"xPosition\", \"yPosition\", \"overlapTrigger\", \"hasBackdrop\", \"class\", \"classList\"], outputs: [\"closed\", \"close\"], exportAs: [\"matMenu\"] }, { kind: \"component\", type: i2.MatMenuItem, selector: \"[mat-menu-item]\", inputs: [\"role\", \"disabled\", \"disableRipple\"], exportAs: [\"matMenuItem\"] }, { kind: \"directive\", type: i2.MatMenuTrigger, selector: \"[mat-menu-trigger-for], [matMenuTriggerFor]\", inputs: [\"mat-menu-trigger-for\", \"matMenuTriggerFor\", \"matMenuTriggerData\", \"matMenuTriggerRestoreFocus\"], outputs: [\"menuOpened\", \"onMenuOpen\", \"menuClosed\", \"onMenuClose\"], exportAs: [\"matMenuTrigger\"] }, { kind: \"ngmodule\", type: ReactiveFormsModule }, { kind: \"directive\", type: i3.ɵNgNoValidate, selector: \"form:not([ngNoForm]):not([ngNativeValidate])\" }, { kind: \"directive\", type: i3.DefaultValueAccessor, selector: \"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]\" }, { kind: \"directive\", type: i3.NgControlStatus, selector: \"[formControlName],[ngModel],[formControl]\" }, { kind: \"directive\", type: i3.NgControlStatusGroup, selector: \"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]\" }, { kind: \"directive\", type: i3.RequiredValidator, selector: \":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]\", inputs: [\"required\"] }, { kind: \"directive\", type: i3.FormGroupDirective, selector: \"[formGroup]\", inputs: [\"formGroup\"], outputs: [\"ngSubmit\"], exportAs: [\"ngForm\"] }, { kind: \"directive\", type: i3.FormControlName, selector: \"[formControlName]\", inputs: [\"formControlName\", \"disabled\", \"ngModel\"], outputs: [\"ngModelChange\"] }, { kind: \"directive\", type: i3.FormArrayName, selector: \"[formArrayName]\", inputs: [\"formArrayName\"] }, { kind: \"ngmodule\", type: MatFormFieldModule }, { kind: \"component\", type: i4.MatFormField, selector: \"mat-form-field\", inputs: [\"hideRequiredMarker\", \"color\", \"floatLabel\", \"appearance\", \"subscriptSizing\", \"hintLabel\"], exportAs: [\"matFormField\"] }, { kind: \"directive\", type: i4.MatLabel, selector: \"mat-label\" }, { kind: \"ngmodule\", type: MatInputModule }, { kind: \"directive\", type: i5.MatInput, selector: \"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]\", inputs: [\"disabled\", \"id\", \"placeholder\", \"name\", \"required\", \"type\", \"errorStateMatcher\", \"aria-describedby\", \"value\", \"readonly\", \"disabledInteractive\"], exportAs: [\"matInput\"] }, { kind: \"directive\", type: CdkDropList, selector: \"[cdkDropList], cdk-drop-list\", inputs: [\"cdkDropListConnectedTo\", \"cdkDropListData\", \"cdkDropListOrientation\", \"id\", \"cdkDropListLockAxis\", \"cdkDropListDisabled\", \"cdkDropListSortingDisabled\", \"cdkDropListEnterPredicate\", \"cdkDropListSortPredicate\", \"cdkDropListAutoScrollDisabled\", \"cdkDropListAutoScrollStep\", \"cdkDropListElementContainer\", \"cdkDropListHasAnchor\"], outputs: [\"cdkDropListDropped\", \"cdkDropListEntered\", \"cdkDropListExited\", \"cdkDropListSorted\"], exportAs: [\"cdkDropList\"] }, { kind: \"directive\", type: CdkDrag, selector: \"[cdkDrag]\", inputs: [\"cdkDragData\", \"cdkDragLockAxis\", \"cdkDragRootElement\", \"cdkDragBoundary\", \"cdkDragStartDelay\", \"cdkDragFreeDragPosition\", \"cdkDragDisabled\", \"cdkDragConstrainPosition\", \"cdkDragPreviewClass\", \"cdkDragPreviewContainer\", \"cdkDragScale\"], outputs: [\"cdkDragStarted\", \"cdkDragReleased\", \"cdkDragEnded\", \"cdkDragEntered\", \"cdkDragExited\", \"cdkDragDropped\", \"cdkDragMoved\"], exportAs: [\"cdkDrag\"] }, { kind: \"ngmodule\", type: MatIconModule }, { kind: \"component\", type: i6.MatIcon, selector: \"mat-icon\", inputs: [\"color\", \"inline\", \"svgIcon\", \"fontSet\", \"fontIcon\"], exportAs: [\"matIcon\"] }, { kind: \"ngmodule\", type: MatProgressBarModule }, { kind: \"component\", type: i7.MatProgressBar, selector: \"mat-progress-bar\", inputs: [\"color\", \"value\", \"bufferValue\", \"mode\"], outputs: [\"animationEnd\"], exportAs: [\"matProgressBar\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{\n type: Component,\n args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, imports: [\n MatButtonModule,\n NgStyle,\n MatMenuModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n CdkDropList,\n CdkDrag,\n MatIconModule,\n MatProgressBarModule\n ], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n [disabled]=\\\"isGenerating()\\\"\\n >\\n @if (isGenerating()) {\\n Generating...\\n } @else {\\n Generate wordlist\\n }\\n </button>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType.set(type)\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType()) {\\n {{ this.fileType() }}\\n }\\n </button>\\n }\\n </div>\\n \\n @if (isGenerating() && isLargeDataset()) {\\n <div class=\\\"progress-container\\\">\\n <mat-progress-bar mode=\\\"indeterminate\\\" role=\\\"progressbar\\\" aria-label=\\\"Generating wordlist\\\"></mat-progress-bar>\\n <p [ngStyle]=\\\"textStyle()\\\">Processing large dataset using Web Worker...</p>\\n </div>\\n }\\n \\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (hasWordlist()) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist()) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist() }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n <!-- Wordlist is already loaded in the signal for large datasets -->\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsV0FBVyxFQUNYLGVBQWUsRUFDaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBRW5CLGtCQUFrQixFQUVsQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUs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LGNBQWMsa1lBQ2QsV0FBVyxzaEJBQ1gsT0FBTyx1Y0FDUCxhQUFhLG1MQUNiLG9CQUFvQjs7MkZBSVgsMEJBQTBCO2tCQW5CdEMsU0FBUzsrQkFDRSxvQkFBb0IsaUJBR2YsaUJBQWlCLENBQUMsSUFBSSxXQUM1Qjt3QkFDUCxlQUFlO3dCQUNmLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxXQUFXO3dCQUNYLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixvQkFBb0I7cUJBQ3JCLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2RrRHJhZyxcbiAgQ2RrRHJhZ0Ryb3AsXG4gIENka0Ryb3BMaXN0LFxuICBtb3ZlSXRlbUluQXJyYXlcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIHNpZ25hbCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBVbnR5cGVkRm9ybUFycmF5LFxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgcmVkdWNlLCBzaGFyZVJlcGxheSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGaWxlVHlwZSB9IGZyb20gJy4vZmlsZXR5cGVzJztcbmltcG9ydCB7IHRvQ1NWLCB0b1BsYWludGV4dCwgdG9YTUwgfSBmcm9tICcuL3BhcnNlcnMnO1xuaW1wb3J0IHsgV29yZGxpc3RHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi93b3JkbGlzdC1nZW5lcmF0b3Iuc2VydmljZSc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3IgKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dvcmRsaXN0LWdlbmVyYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBOZ1N0eWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgQ2RrRHJvcExpc3QsXG4gICAgQ2RrRHJhZyxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBmb3JtQnVpbGRlciA9IGluamVjdChVbnR5cGVkRm9ybUJ1aWxkZXIpO1xuICBwcml2YXRlIHdvcmRsaXN0R2VuZXJhdG9yID0gaW5qZWN0KFdvcmRsaXN0R2VuZXJhdG9yU2VydmljZSk7XG5cbiAgYnV0dG9uU3R5bGUgPSBpbnB1dCh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzMzMzMzMycsXG4gICAgY29sb3I6ICcjY2M3ODMyJ1xuICB9KTtcblxuICBkcmFnU3R5bGUgPSBpbnB1dCh7IGNvbG9yOiAnI2NjNzgzMicgfSk7XG4gIHRleHRTdHlsZSA9IGlucHV0KHsgY29sb3I6ICcjY2M3ODMyJyB9KTtcblxuICBjaGFyc2V0Rm9ybTogVW50eXBlZEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcbiAgd29yZGxpc3QgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgZGlzcGxheVdvcmRsaXN0ID0gc2lnbmFsKGZhbHNlKTtcbiAgZmlsZVR5cGUgPSBzaWduYWwoRmlsZVR5cGUucGxhaW50ZXh0KTtcbiAgZmlsZVR5cGVzID0gT2JqZWN0LnZhbHVlcyhGaWxlVHlwZSk7XG4gIGZpbHRlcmVkQ2hhcnNldCA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuICBwcmVmaXggPSBzaWduYWwoJycpO1xuICBzdWZmaXggPSBzaWduYWwoJycpO1xuICBpc0dlbmVyYXRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBpc0xhcmdlRGF0YXNldCA9IHNpZ25hbChmYWxzZSk7XG4gIHdvcmRzR2VuZXJhdGVkID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBjYW5HZW5lcmF0ZSA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuY2hhcnNldEZvcm0/LnZhbGlkICYmIHRoaXMuZmlsdGVyZWRDaGFyc2V0KCkubGVuZ3RoID4gMFxuICApO1xuXG4gIGhhc1dvcmRsaXN0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy53b3JkbGlzdCgpLmxlbmd0aCA+IDApO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmdlbmVyYXRlRm9ybSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBnZXQgY2hhcnNldHMoKTogVW50eXBlZEZvcm1BcnJheSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldEZvcm0pIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYXJzZXRGb3JtLmdldCgnY2hhcnNldHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgYWRkQ2hhcnNldCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0cykge1xuICAgICAgdGhpcy5jaGFyc2V0cy5wdXNoKHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCkpO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lQ2hhcnNldChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIGNvbnN0IGNoYXJzZXQgPSB0aGlzLmNoYXJzZXRzLnZhbHVlW2luZGV4XTtcbiAgICAgIHRoaXMuY2hhcnNldHMuaW5zZXJ0KFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKGNoYXJzZXQsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkV29yZGxpc3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDaGFyc2V0ID0gdGhpcy5maWx0ZXJDaGFyc2V0KHRoaXMuY2hhcnNldHMudmFsdWUpO1xuICAgICAgaWYgKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcmVkQ2hhcnNldCgpKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY3VycmVudENoYXJzZXQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVdvcmRsaXN0KCk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGB3b3JkbGlzdF8ke3RoaXMud29yZHNHZW5lcmF0ZWQoKX1fd29yZHNfJHt0aGlzLmNoYXJzZXRzLmxlbmd0aH1fcG9zaXRpb25zLiR7dGhpcy5maWxlVHlwZSgpfWA7XG4gICAgICBjb25zdCB3b3JkbGlzdENvbnRlbnQgPSB0aGlzLndvcmRsaXN0KCk7XG5cbiAgICAgIGlmICh3b3JkbGlzdENvbnRlbnQgJiYgd29yZGxpc3RDb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5wZXJmb3JtRG93bmxvYWQod29yZGxpc3RDb250ZW50LCBmaWxlbmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwZXJmb3JtRG93bmxvYWQod29yZGxpc3RDb250ZW50OiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlV29yZGxpc3Qod29yZGxpc3RDb250ZW50KTtcbiAgICBjb25zdCBmaWxlID0gbmV3IEJsb2IoW3BhcnNlZC53b3JkbGlzdF0sIHtcbiAgICAgIHR5cGU6IHBhcnNlZC5jb250ZW50VHlwZVxuICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKCh3aW5kb3cubmF2aWdhdG9yIGFzIGFueSkubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICh3aW5kb3cubmF2aWdhdG9yIGFzIGFueSkubXNTYXZlT3JPcGVuQmxvYihmaWxlLCBmaWxlbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgIGEuY2xpY2soKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIG1vdmVJdGVtSW5BcnJheShcbiAgICAgICAgdGhpcy5jaGFyc2V0cy5jb250cm9scyxcbiAgICAgICAgZXZlbnQucHJldmlvdXNJbmRleCxcbiAgICAgICAgZXZlbnQuY3VycmVudEluZGV4XG4gICAgICApO1xuICAgICAgdGhpcy5jaGFyc2V0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnNldEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGNoYXJzZXRzOiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgXSksXG4gICAgICBwcmVmaXg6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJyksXG4gICAgICBzdWZmaXg6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJylcbiAgICB9KTtcbiAgfVxuXG4gIGdlbmVyYXRlV29yZGxpc3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldEZvcm0gJiYgdGhpcy5jaGFyc2V0cyAmJiB0aGlzLmNoYXJzZXRzLnZhbGlkKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ2hhcnNldC5zZXQodGhpcy5maWx0ZXJDaGFyc2V0KHRoaXMuY2hhcnNldHMudmFsdWUpKTtcbiAgICAgIHRoaXMucHJlZml4LnNldCh0aGlzLmNoYXJzZXRGb3JtLmdldCgncHJlZml4Jyk/LnZhbHVlIHx8ICcnKTtcbiAgICAgIHRoaXMuc3VmZml4LnNldCh0aGlzLmNoYXJzZXRGb3JtLmdldCgnc3VmZml4Jyk/LnZhbHVlIHx8ICcnKTtcblxuICAgICAgY29uc3Qgd29yZHNDb3VudCA9IHRoaXMuZmlsdGVyZWRDaGFyc2V0KClcbiAgICAgICAgLm1hcCgoY2hhcnNldDogc3RyaW5nKSA9PiBjaGFyc2V0Lmxlbmd0aClcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAocHJldmlvdXNMZW5ndGg6IG51bWJlciwgY3VycmVudExlbmd0aDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgcHJldmlvdXNMZW5ndGggKiBjdXJyZW50TGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgIHRoaXMud29yZHNHZW5lcmF0ZWQuc2V0KHdvcmRzQ291bnQpO1xuICAgICAgdGhpcy5pc0xhcmdlRGF0YXNldC5zZXQod29yZHNDb3VudCA+IDUwMDAwKTtcbiAgICAgIHRoaXMuZGlzcGxheVdvcmRsaXN0LnNldCh3b3Jkc0NvdW50IDw9IDEwMCk7XG4gICAgICB0aGlzLmlzR2VuZXJhdGluZy5zZXQodHJ1ZSk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIHdvcmRsaXN0IGFuZCB1cGRhdGUgc2lnbmFsXG4gICAgICB0aGlzLmdldFdvcmRsaXN0KClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHdvcmRsaXN0KSA9PiB0aGlzLndvcmRsaXN0LnNldCh3b3JkbGlzdCksXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyB3b3JkbGlzdDonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmlzR2VuZXJhdGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXb3JkbGlzdCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLndvcmRsaXN0R2VuZXJhdG9yXG4gICAgICAuZ2VuZXJhdGVXb3JkbGlzdCguLi50aGlzLmZpbHRlcmVkQ2hhcnNldCgpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSksXG4gICAgICAgIHJlZHVjZShcbiAgICAgICAgICAod29yZGxpc3Q6IHN0cmluZywgd29yZDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgYCR7d29yZGxpc3R9JHt0aGlzLnByZWZpeCgpfSR7d29yZH0ke3RoaXMuc3VmZml4KCl9XFxuYCxcbiAgICAgICAgICAnJ1xuICAgICAgICApLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0dlbmVyYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgICk7XG4gIH1cblxuICBmaWx0ZXJDaGFyc2V0KGNoYXJzZXRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gY2hhcnNldHMubWFwKChjaGFyc2V0OiBzdHJpbmcpID0+IHRoaXMucmVtb3ZlRHVwbGljYXRlcyhjaGFyc2V0KSk7XG4gIH1cblxuICBwYXJzZVdvcmRsaXN0KHdvcmRsaXN0OiBzdHJpbmcpOiB7IHdvcmRsaXN0OiBzdHJpbmc7IGNvbnRlbnRUeXBlOiBzdHJpbmcgfSB7XG4gICAgc3dpdGNoICh0aGlzLmZpbGVUeXBlKCkpIHtcbiAgICAgIGNhc2UgRmlsZVR5cGUucGxhaW50ZXh0OlxuICAgICAgICByZXR1cm4gdG9QbGFpbnRleHQod29yZGxpc3QpO1xuICAgICAgY2FzZSBGaWxlVHlwZS54bWw6XG4gICAgICAgIHJldHVybiB0b1hNTCh3b3JkbGlzdCk7XG4gICAgICBjYXNlIEZpbGVUeXBlLmNzdjpcbiAgICAgICAgcmV0dXJuIHRvQ1NWKHdvcmRsaXN0KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGFyc2V0KGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5jaGFyc2V0cy5yZW1vdmVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVEdXBsaWNhdGVzID0gKHVuZmlsdGVyZWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIFsuLi5uZXcgU2V0KHVuZmlsdGVyZWQpXS5qb2luKCcnKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJtZXRhLWNvbnRhaW5lciBmbGV4LXJvdy13cmFwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBmbGV4LWNvbHVtbiBmbGV4LWZ4ZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy13cmFwIGJvdHRvbS0xMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImdlbmVyYXRlLXdvcmRsaXN0XCJcbiAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJnZW5lcmF0ZVdvcmRsaXN0KClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNHZW5lcmF0aW5nKClcIlxuICAgICAgPlxuICAgICAgICBAaWYgKGlzR2VuZXJhdGluZygpKSB7XG4gICAgICAgICAgR2VuZXJhdGluZy4uLlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICBHZW5lcmF0ZSB3b3JkbGlzdFxuICAgICAgICB9XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIEBpZiAoaGFzV29yZGxpc3QoKSAmJiAhaXNHZW5lcmF0aW5nKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiY2hvb3NlLWZvcm1hdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiXG4gICAgICAgID5cbiAgICAgICAgICBDaG9vc2UgZm9ybWF0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICBAZm9yICh0eXBlIG9mIGZpbGVUeXBlczsgdHJhY2sgdHlwZSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImZpbGVUeXBlLnNldCh0eXBlKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdHlwZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L21hdC1tZW51PlxuICAgICAgQGlmIChoYXNXb3JkbGlzdCgpICYmICFpc0dlbmVyYXRpbmcoKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJkb3dubG9hZC13b3JkbGlzdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRXb3JkbGlzdCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIERvd25sb2FkIGFzXG4gICAgICAgICAgQGlmICh0aGlzLmZpbGVUeXBlKCkpIHtcbiAgICAgICAgICAgIHt7IHRoaXMuZmlsZVR5cGUoKSB9fVxuICAgICAgICAgIH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgXG4gICAgQGlmIChpc0dlbmVyYXRpbmcoKSAmJiBpc0xhcmdlRGF0YXNldCgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtY29udGFpbmVyXCI+XG4gICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS1sYWJlbD1cIkdlbmVyYXRpbmcgd29yZGxpc3RcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgICAgIDxwIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCI+UHJvY2Vzc2luZyBsYXJnZSBkYXRhc2V0IHVzaW5nIFdlYiBXb3JrZXIuLi48L3A+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgXG4gICAgQGlmIChjaGFyc2V0Rm9ybSkge1xuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjaGFyc2V0Rm9ybVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmaXhlZC13aWR0aCBib3R0b20tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgIDxtYXQtbGFiZWwgW25nU3R5bGVdPVwidGV4dFN0eWxlKClcIj5wcmVmaXggKG9wdGlvbmFsKTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgW25nU3R5bGVdPVwidGV4dFN0eWxlKClcIlxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGlkPVwicHJlZml4XCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByZWZpeFwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiY2hhcnNldHNcIj5cbiAgICAgICAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgY2hhcnNldCBvZiBjaGFyc2V0cz8uY29udHJvbHM7XG4gICAgICAgICAgICAgIHRyYWNrIGNoYXJzZXQ7XG4gICAgICAgICAgICAgIGxldCBpID0gJGluZGV4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJzZXQtY29udGFpbmVyXCIgY2RrRHJhZz5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJkcmFnLWluZGljYXRvclwiIFtuZ1N0eWxlXT1cImRyYWdTdHlsZSgpXCJcbiAgICAgICAgICAgICAgICAgID5kcmFnX2luZGljYXRvcjwvbWF0LWljb25cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY2hhcnNldCBib3R0b20tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiPlxuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc2V0IGZvciBzdHJpbmcgcG9zaXRpb24ge3sgaSB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwidGV4dFN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicG9zaXRpb24te3sgaSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbG9uZS1jaGFyc2V0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb25lQ2hhcnNldChpKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm93LWJ1dHRvbi1pY29uXCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZW1vdmUtY2hhcnNldFwiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJidXR0b25TdHlsZSgpXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDaGFyc2V0KGkpXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzLmNoYXJzZXRzPy52YWx1ZS5sZW5ndGggPT09IDFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInJvdy1idXR0b24taWNvblwiPnJlbW92ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENoYXJzZXQoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm93LWJ1dHRvbi1pY29uXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmaXhlZC13aWR0aFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiPnN1ZmZpeCAob3B0aW9uYWwpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgaWQ9XCJzdWZmaXhcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3VmZml4XCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9mb3JtPlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoaGFzV29yZGxpc3QoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJ3b3JkbGlzdC1jb250YWluZXIgZmxleC1jb2x1bW4gZmxleC1meGZsZXhcIj5cbiAgICAgIEBpZiAoZGlzcGxheVdvcmRsaXN0KCkpIHtcbiAgICAgICAgPGgzIGNsYXNzPVwid29yZGxpc3QtaGVhZGVyXCI+R2VuZXJhdGVkIHdvcmRsaXN0OjwvaDM+XG4gICAgICAgIDxjb2RlIGNsYXNzPVwid29yZGxpc3RcIj5cbiAgICAgICAgICB7eyB3b3JkbGlzdCgpIH19XG4gICAgICAgIDwvY29kZT5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICBUaGUgZ2VuZXJhdGVkIHdvcmRsaXN0IGlzIHRvbyBsYXJnZSB0byBiZSBkaXNwbGF5ZWQuIFlvdSBjYW4gc3RpbGxcbiAgICAgICAgZG93bmxvYWQgaXQuXG4gICAgICAgIDwhLS0gV29yZGxpc3QgaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHNpZ25hbCBmb3IgbGFyZ2UgZGF0YXNldHMgLS0+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvdGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tehw0lf-wordlist-generator.mjs","sources":["../../../../libs/wordlist-generator/src/lib/filetypes.ts","../../../../libs/wordlist-generator/src/lib/parsers.ts","../../../../libs/wordlist-generator/src/lib/wordlist-generator.service.ts","../../../../libs/wordlist-generator/src/lib/wordlist-generator.component.ts","../../../../libs/wordlist-generator/src/lib/wordlist-generator.component.html","../../../../libs/wordlist-generator/src/tehw0lf-wordlist-generator.ts"],"sourcesContent":["export enum FileType {\n plaintext = 'txt',\n xml = 'xml',\n csv = 'csv'\n}\n","export const toPlaintext = (\n wordlist: string\n): { wordlist: string; contentType: string } => ({\n wordlist,\n contentType: 'text/plain'\n});\n\nexport const toXML = (\n wordlist: string\n): { wordlist: string; contentType: string } => {\n const head = '<wordlist><word>';\n const glue = '</word><word>';\n const tail = '</word></wordlist>';\n return {\n wordlist: head + wordlist.replace(/\\n/g, glue) + tail,\n contentType: 'text/xml'\n };\n};\n\nexport const toCSV = (\n wordlist: string\n): { wordlist: string; contentType: string } => {\n const glue = ',';\n return {\n wordlist: wordlist.replace(/\\n/g, glue),\n contentType: 'text/csv'\n };\n};\n","import { Injectable } from '@angular/core';\nimport { product } from 'cartesian-product-generator';\nimport { from, Observable, Subject } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\ninterface WordlistWorkerMessage {\n type: 'generate';\n charsets: string[];\n batchSize?: number;\n}\n\ninterface WordlistWorkerResponse {\n type: 'batch' | 'complete' | 'error';\n words?: string[];\n error?: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WordlistGeneratorService {\n private readonly LARGE_DATASET_THRESHOLD = 50000;\n\n generateWordlist(...charsets: string[]): Observable<string> {\n const estimatedSize = this.estimateWordlistSize(charsets);\n \n if (estimatedSize > this.LARGE_DATASET_THRESHOLD) {\n return this.generateWithWebWorker(charsets);\n }\n \n return this.generateSynchronously(charsets);\n }\n\n private generateSynchronously(charsets: string[]): Observable<string> {\n return from(product(...charsets)).pipe(\n map((word: string[]) => word.join(''))\n );\n }\n\n private generateWithWebWorker(charsets: string[]): Observable<string> {\n const subject = new Subject<string>();\n \n if (typeof Worker !== 'undefined') {\n const worker = new Worker(new URL('./wordlist.worker', import.meta.url));\n \n worker.onmessage = ({ data }: MessageEvent<WordlistWorkerResponse>) => {\n switch (data.type) {\n case 'batch':\n if (data.words) {\n data.words.forEach(word => subject.next(word));\n }\n break;\n case 'complete':\n subject.complete();\n worker.terminate();\n break;\n case 'error':\n subject.error(new Error(data.error || 'Worker error'));\n worker.terminate();\n break;\n }\n };\n \n worker.onerror = (error) => {\n subject.error(error);\n worker.terminate();\n };\n \n const message: WordlistWorkerMessage = {\n type: 'generate',\n charsets,\n batchSize: 1000\n };\n \n worker.postMessage(message);\n } else {\n // Fallback for environments without Worker support\n this.generateSynchronously(charsets).subscribe({\n next: (word) => subject.next(word),\n error: (err) => subject.error(err),\n complete: () => subject.complete()\n });\n }\n \n return subject.asObservable();\n }\n\n private estimateWordlistSize(charsets: string[]): number {\n return charsets.reduce((total, charset) => total * charset.length, 1);\n }\n}\n","import {\n CdkDrag,\n CdkDragDrop,\n CdkDropList,\n moveItemInArray\n} from '@angular/cdk/drag-drop';\nimport { NgStyle } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n OnDestroy,\n signal,\n ViewEncapsulation\n} from '@angular/core';\nimport {\n ReactiveFormsModule,\n UntypedFormArray,\n UntypedFormBuilder,\n UntypedFormGroup,\n Validators\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { Observable, Subject } from 'rxjs';\nimport { finalize, reduce, shareReplay, takeUntil } from 'rxjs/operators';\n\nimport { FileType } from './filetypes';\nimport { toCSV, toPlaintext, toXML } from './parsers';\nimport { WordlistGeneratorService } from './wordlist-generator.service';\n\n/* eslint-disable @angular-eslint/component-selector */\n@Component({\n selector: 'wordlist-generator',\n templateUrl: './wordlist-generator.component.html',\n styleUrls: ['./wordlist-generator.component.scss'],\n encapsulation: ViewEncapsulation.None,\n imports: [\n MatButtonModule,\n NgStyle,\n MatMenuModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n CdkDropList,\n CdkDrag,\n MatIconModule,\n MatProgressBarModule\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class WordlistGeneratorComponent implements OnDestroy {\n private formBuilder = inject(UntypedFormBuilder);\n private wordlistGenerator = inject(WordlistGeneratorService);\n\n buttonStyle = input({\n 'background-color': '#333333',\n color: '#cc7832'\n });\n\n dragStyle = input({ color: '#cc7832' });\n textStyle = input({ color: '#cc7832' });\n\n charsetForm: UntypedFormGroup | undefined;\n wordlist = signal<string>('');\n\n displayWordlist = signal(false);\n fileType = signal(FileType.plaintext);\n fileTypes = Object.values(FileType);\n filteredCharset = signal<string[]>([]);\n prefix = signal('');\n suffix = signal('');\n isGenerating = signal(false);\n isLargeDataset = signal(false);\n wordsGenerated = signal<number | undefined>(undefined);\n\n canGenerate = computed(\n () => this.charsetForm?.valid && this.filteredCharset().length > 0\n );\n\n hasWordlist = computed(() => this.wordlist().length > 0);\n\n private unsubscribe$ = new Subject<void>();\n\n constructor() {\n this.generateForm();\n }\n\n ngOnDestroy(): void {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n\n get charsets(): UntypedFormArray | undefined {\n if (this.charsetForm) {\n return this.charsetForm.get('charsets') as UntypedFormArray;\n }\n return undefined;\n }\n\n addCharset(): void {\n if (this.charsets) {\n this.charsets.push(this.formBuilder.control('', Validators.required));\n }\n }\n\n cloneCharset(index: number): void {\n if (this.charsets) {\n const charset = this.charsets.value[index];\n this.charsets.insert(\n index,\n this.formBuilder.control(charset, Validators.required)\n );\n }\n }\n\n downloadWordlist(): void {\n if (this.charsets) {\n const currentCharset = this.filterCharset(this.charsets.value);\n if (\n JSON.stringify(this.filteredCharset()) !==\n JSON.stringify(currentCharset)\n ) {\n this.generateWordlist();\n }\n const filename = `wordlist_${this.wordsGenerated()}_words_${this.charsets.length}_positions.${this.fileType()}`;\n const wordlistContent = this.wordlist();\n\n if (wordlistContent && wordlistContent.length > 0) {\n this.performDownload(wordlistContent, filename);\n }\n }\n }\n\n private performDownload(wordlistContent: string, filename: string): void {\n const parsed = this.parseWordlist(wordlistContent);\n const file = new Blob([parsed.wordlist], {\n type: parsed.contentType\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((window.navigator as any).msSaveOrOpenBlob) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window.navigator as any).msSaveOrOpenBlob(file, filename);\n } else {\n const a = document.createElement('a');\n const url = URL.createObjectURL(file);\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }, 0);\n }\n }\n\n drop(event: CdkDragDrop<string[]>): void {\n if (this.charsets) {\n moveItemInArray(\n this.charsets.controls,\n event.previousIndex,\n event.currentIndex\n );\n this.charsets.updateValueAndValidity();\n }\n }\n\n generateForm(): void {\n this.charsetForm = this.formBuilder.group({\n charsets: this.formBuilder.array([\n this.formBuilder.control('', Validators.required)\n ]),\n prefix: this.formBuilder.control(''),\n suffix: this.formBuilder.control('')\n });\n }\n\n generateWordlist(): void {\n if (this.charsetForm && this.charsets && this.charsets.valid) {\n this.filteredCharset.set(this.filterCharset(this.charsets.value));\n this.prefix.set(this.charsetForm.get('prefix')?.value || '');\n this.suffix.set(this.charsetForm.get('suffix')?.value || '');\n\n const wordsCount = this.filteredCharset()\n .map((charset: string) => charset.length)\n .reduce(\n (previousLength: number, currentLength: number) =>\n previousLength * currentLength\n );\n\n this.wordsGenerated.set(wordsCount);\n this.isLargeDataset.set(wordsCount > 50000);\n this.displayWordlist.set(wordsCount <= 100);\n this.isGenerating.set(true);\n\n // Generate wordlist and update signal\n this.getWordlist()\n .pipe(takeUntil(this.unsubscribe$))\n .subscribe({\n next: (wordlist) => this.wordlist.set(wordlist),\n error: (error) => {\n console.error('Error generating wordlist:', error);\n this.isGenerating.set(false);\n }\n });\n }\n }\n\n private getWordlist(): Observable<string> {\n return this.wordlistGenerator\n .generateWordlist(...this.filteredCharset())\n .pipe(\n shareReplay({ bufferSize: 1, refCount: true }),\n reduce(\n (wordlist: string, word: string) =>\n `${wordlist}${this.prefix()}${word}${this.suffix()}\\n`,\n ''\n ),\n finalize(() => {\n this.isGenerating.set(false);\n }),\n takeUntil(this.unsubscribe$)\n );\n }\n\n filterCharset(charsets: string[]): string[] {\n return charsets.map((charset: string) => this.removeDuplicates(charset));\n }\n\n parseWordlist(wordlist: string): { wordlist: string; contentType: string } {\n switch (this.fileType()) {\n case FileType.plaintext:\n return toPlaintext(wordlist);\n case FileType.xml:\n return toXML(wordlist);\n case FileType.csv:\n return toCSV(wordlist);\n }\n }\n\n removeCharset(i: number): void {\n if (this.charsets && this.charsets.length > 1) {\n this.charsets.removeAt(i);\n }\n }\n\n removeDuplicates = (unfiltered: string): string =>\n [...new Set(unfiltered)].join('');\n}\n","<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n [disabled]=\"isGenerating()\"\n >\n @if (isGenerating()) {\n Generating...\n } @else {\n Generate wordlist\n }\n </button>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType.set(type)\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType()) {\n {{ this.fileType() }}\n }\n </button>\n }\n </div>\n \n @if (isGenerating() && isLargeDataset()) {\n <div class=\"progress-container\">\n <mat-progress-bar mode=\"indeterminate\" role=\"progressbar\" aria-label=\"Generating wordlist\"></mat-progress-bar>\n <p [ngStyle]=\"textStyle()\">Processing large dataset using Web Worker...</p>\n </div>\n }\n \n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (hasWordlist()) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist()) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist() }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n <!-- Wordlist is already loaded in the signal for large datasets -->\n }\n </div>\n }\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,32 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tehw0lf/wordlist-generator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.1",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"homepage": "https://github.com/tehw0lf/
|
|
5
|
+
"homepage": "https://github.com/tehw0lf/tehwol.fi.git",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "git+https://github.com/tehw0lf/
|
|
8
|
+
"url": "git+https://github.com/tehw0lf/tehwol.fi.git"
|
|
9
9
|
},
|
|
10
10
|
"peerDependencies": {
|
|
11
|
-
"@angular/animations": "
|
|
12
|
-
"@angular/cdk": "
|
|
13
|
-
"@angular/common": "
|
|
14
|
-
"@angular/core": "
|
|
15
|
-
"@angular/forms": "
|
|
16
|
-
"@angular/material": "
|
|
17
|
-
"@tehw0lf/mvc": "0.0.
|
|
11
|
+
"@angular/animations": "21.0.6",
|
|
12
|
+
"@angular/cdk": "21.0.5",
|
|
13
|
+
"@angular/common": "21.0.6",
|
|
14
|
+
"@angular/core": "21.0.6",
|
|
15
|
+
"@angular/forms": "21.0.6",
|
|
16
|
+
"@angular/material": "21.0.5",
|
|
17
|
+
"@tehw0lf/mvc": "0.0.8"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"tslib": "2.8.1"
|
|
21
21
|
},
|
|
22
22
|
"module": "fesm2022/tehw0lf-wordlist-generator.mjs",
|
|
23
|
-
"typings": "
|
|
23
|
+
"typings": "types/tehw0lf-wordlist-generator.d.ts",
|
|
24
24
|
"exports": {
|
|
25
25
|
"./package.json": {
|
|
26
26
|
"default": "./package.json"
|
|
27
27
|
},
|
|
28
28
|
".": {
|
|
29
|
-
"types": "./
|
|
29
|
+
"types": "./types/tehw0lf-wordlist-generator.d.ts",
|
|
30
30
|
"default": "./fesm2022/tehw0lf-wordlist-generator.mjs"
|
|
31
31
|
}
|
|
32
32
|
},
|
|
File without changes
|