{"version":3,"file":"index.mjs","sources":["../../../../../projects/components/widgets/input/file-upload/src/file-upload.props.ts","../../../../../projects/components/widgets/input/file-upload/src/file-upload.component.ts","../../../../../projects/components/widgets/input/file-upload/src/file-upload.component.html","../../../../../projects/components/widgets/input/file-upload/src/index.ts"],"sourcesContent":["import {PROP_BOOLEAN, PROP_NUMBER, PROP_STRING, register, registerFormWidget} from '@wm/components/base';\nimport {FormWidgetType} from '@wm/core';\n\nexport const registerProps = () => {\n    register(\n        'wm-fileupload',\n        new Map(\n            [\n                ['caption', PROP_STRING],\n                ['name', PROP_STRING],\n                ['hint', PROP_STRING],\n                ['arialabel', PROP_STRING],\n                ['tabindex', PROP_NUMBER],\n                ['multiple', PROP_BOOLEAN],\n                ['fileuploadmessage' , PROP_STRING],\n                ['show', {value: true, ...PROP_BOOLEAN}],\n                ['disabled', PROP_BOOLEAN],\n                ['contenttype', PROP_STRING],\n                ['maxfilesize', PROP_NUMBER],\n                ['iconclass', {value: 'wi wi-file-upload', ...PROP_STRING}],\n                ['cleariconclass', {value: '', ...PROP_STRING}],\n                ['cleariconhint', {value: 'Clear', ...PROP_STRING}],\n                ['class', PROP_STRING],\n                ['uploadpath', {...PROP_STRING}],\n                ['datasource', PROP_STRING],\n                ['selectedFiles', PROP_STRING],\n                ['destination', PROP_STRING],\n                ['filelistheight', PROP_NUMBER],\n                ['width', {value: 'auto', ...PROP_STRING}],\n                ['showprogressbar', PROP_BOOLEAN],\n                ['showprogressbarpercentage', PROP_BOOLEAN],\n                ['deleteiconhint', {value: 'Delete', ...PROP_STRING}]\n            ]\n        )\n    );\n    registerFormWidget(\n        FormWidgetType.UPLOAD,\n        new Map([\n            ['disabled', PROP_BOOLEAN],\n            ['extensions', PROP_STRING],\n            ['filetype', PROP_STRING],\n            ['multiple', PROP_BOOLEAN],\n            ['readonly', PROP_BOOLEAN],\n            ['required', PROP_BOOLEAN]\n        ])\n    );\n};\n","import { CommonModule } from '@angular/common';\nimport {AfterViewInit, Attribute, Component, Inject, Injector, OnDestroy, OnInit, Optional} from '@angular/core';\n\nimport { Subject, Subscription } from 'rxjs';\n\nimport { App, DataSource, getWmProjectProperties, isAudioFile, isImageFile, isVideoFile, AbstractDialogService, IDGenerator } from '@wm/core';\nimport {FileIconClassPipe, FileSizePipe, provideAsWidgetRef, StateClassPipe, StylableComponent, styler } from '@wm/components/base';\n\nimport {registerProps} from './file-upload.props';\nimport {forEach, includes, isEmpty, toLower} from \"lodash-es\";\n\ndeclare const $;\n\nconst DEFAULT_CLS = 'app-fileupload';\nconst WIDGET_CONFIG = {\n    widgetType: 'wm-fileupload',\n    hostClass: DEFAULT_CLS\n};\n\n@Component({\n    standalone: true,\n    imports: [CommonModule, FileIconClassPipe, StateClassPipe, FileSizePipe],\n    selector: '[wmFileUpload]',\n    templateUrl: './file-upload.component.html',\n    providers: [\n        provideAsWidgetRef(FileUploadComponent)\n    ]\n})\n\nexport class FileUploadComponent extends StylableComponent implements OnInit, AfterViewInit, OnDestroy {\n    static initializeProps = registerProps();\n    selectedFiles: any = [];\n    uploadedFiles: any = [];\n    selectedFolders: any = [];\n    progressObservable: Subject<any>;\n    deleteFileObservable: Subject<any>;\n    name;\n    hint;\n    arialabel;\n    multiple;\n    fileTransfers = {};\n    caption = 'Upload';\n    formName = '';\n    maxfilesize;\n    cleariconclass;\n    cleariconhint;\n    selectedUploadTypePath;\n    DEFAULT_CAPTIONS = {\n        MULTIPLE_SELECT: 'Drop your files here.',\n        SELECT: 'Select'\n    };\n    DEVICE_CONTENTTYPES = {\n        IMAGE: 'image',\n        VIDEO: 'video',\n        AUDIO: 'audio',\n        FILES: 'files'\n    };\n    FILESIZE_MB = 1048576;\n    widgetProps;\n    _isMobileType;\n    // parentPrefabScope = element.closest('.app-prefab').isolateScope(),\n    CONSTANT_FILE_SERVICE = 'FileService';\n    uploadData = {\n        file: undefined,\n        uploadPath: undefined\n    };\n    allowedFileUploadExtensions = getWmProjectProperties().allowedFileUploadExtensions;\n    defaultAllowedExtensions = this.allowedFileUploadExtensions.split(',').map(item => item.trim()).map(item => item.endsWith('/*') ? item : `.${item}`);\n    chooseFilter = this.defaultAllowedExtensions.includes('*/*') ? '' : this.defaultAllowedExtensions;\n    datasource;\n    deletedatasource;\n    fileUploadMessage = 'Drop your files here or click here to browse';\n    highlightDropArea;\n    showprogressbar;\n    showprogressbarpercentage;\n    deleteiconhint;\n    private uploadProgressSubscription: Subscription;\n    private deleteProgressSubscription: Subscription;\n    private idGenerator = new IDGenerator('file-');\n    // MEMORY LEAK FIX: Store bound functions for proper cleanup\n    private boundDragOverCb: (e: Event) => void;\n    private boundDropCb: () => void;\n    private boundDisableDropZone: () => void;\n    /*_hasOnSuccessEvt = WM.isDefined(attrs.onSuccess);\n     _hasOnErrorEvt = WM.isDefined(attrs.onError);*/\n\n    // Checking if the selected file is valid for the choosen filter type\n    isValidFile(filename, contenttype, extensionName, isMobileType) {\n        let isValid, contentTypes;\n\n        if (!contenttype) {\n            return true;\n        }\n        contentTypes = toLower(contenttype).split(',');\n\n        if (includes(contentTypes, 'image/*') || (includes(contentTypes, 'image') && isMobileType)) {\n            isValid = isImageFile(filename);\n            // If one of the content type chosen is image and user uploads image it is valid file\n            if (isValid) {\n                return isValid;\n            }\n        }\n        if (includes(contentTypes, 'audio/*') || (includes(contentTypes, 'audio') && isMobileType)) {\n            isValid = isAudioFile(filename);\n            // If one of the content type chosen is audio/* and user uploads audio it is valid file\n            if (isValid) {\n                return isValid;\n            }\n        }\n        if (includes(contentTypes, 'video/*') || (includes(contentTypes, 'video') && isMobileType)) {\n            isValid = isVideoFile(filename);\n            // If one of the content type chosen is video/* and user uploads video it is valid file\n            if (isValid) {\n                return isValid;\n            }\n        }\n        /*content type and the uploaded file extension should be same*/\n        if (includes(contentTypes, '.' + toLower(extensionName))) {\n            isValid = true;\n        }\n        return isValid;\n    }\n\n    /* this return the array of files which are having the file size not more than maxfilesize and filters based on contenttype */\n    getValidFiles($files) {\n        const validFiles = [];\n        const errorFiles = [];\n        const MAXFILEUPLOAD_SIZE = parseFloat(this.maxfilesize) * this.FILESIZE_MB || this.FILESIZE_MB;\n        const MAX_FILE_UPLOAD_FORMATTED_SIZE = (this.maxfilesize || '1') + 'MB';\n\n        // if contenttype is files for mobile projects.\n        if (this.chooseFilter === this.DEVICE_CONTENTTYPES.FILES) {\n            this.chooseFilter = '';\n        }\n\n        forEach($files, (file) => {\n            /* check for the file content type before uploading */\n            if (!this.isValidFile(file.name, this.chooseFilter, this.getFileExtension(file.name), this._isMobileType)) {\n                const msg = `${this.appLocale.LABEL_FILE_EXTENTION_VALIDATION_MESSAGE} ${this.chooseFilter}`;\n                this.handleErrorFiles('INVALID_FILE_EXTENSION', msg, file, errorFiles);\n                return;\n            }\n            if (file.size > MAXFILEUPLOAD_SIZE) {\n                const msg = `${this.appLocale.LABEL_FILE_EXCEED_VALIDATION_MESSAGE} ${MAX_FILE_UPLOAD_FORMATTED_SIZE}`;\n                this.handleErrorFiles('INVALID_FILE_SIZE', msg, file, errorFiles);\n                return;\n            }\n            validFiles.push(file);\n        });\n        return {\n            validFiles: validFiles,\n            errorFiles: errorFiles\n        };\n    }\n\n    handleErrorFiles(key, msg, file, errorFiles) {\n        // Check whether the error callback exist or not. If it exists then dont show taoster message\n        if (!this.hasEventCallback('error')) {\n            this.app.notifyApp(msg, 'Error');\n        }\n        const error = {\n            key: key,\n            message: msg\n        };\n        file.error = error;\n        errorFiles.push(file);\n    }\n\n    /*Overwrite the caption only if they are default*/\n    getCaption(caption, isMultiple, isMobileType) {\n        if (includes(this.DEFAULT_CAPTIONS, caption)) {\n            return isMultiple && !isMobileType ? this.DEFAULT_CAPTIONS.MULTIPLE_SELECT : this.DEFAULT_CAPTIONS.SELECT;\n        }\n        return caption;\n    }\n\n    uploadUrl = 'services';\n\n    /* change server path based on user option */\n    changeServerUploadPath(path) {\n        this.selectedUploadTypePath = path;\n    }\n\n    /* this function returns the fileextension */\n    getFileExtension(fileName) {\n        if (fileName && includes(fileName, '.')) {\n            return fileName.substring(fileName.lastIndexOf('.') + 1);\n        }\n        return 'file';\n    }\n\n    /**\n     * Calls select Event\n     * @param $event\n     * @param $files\n     */\n    onSelectEventCall($event, $files) {\n        $files.forEach(file => {\n            file.uniqueId = this.idGenerator.nextUid();\n        })\n        this.selectedFiles = $files;\n        this.uploadedFiles = this.multiple ? [...this.uploadedFiles, ...$files] : $files;\n        setTimeout(() => {\n            this.invokeEventCallback('select', {\n                $event: $.extend($event.$files || {}, $files),\n                selectedFiles: $files\n            });\n        });\n    }\n\n    onFileElemClick($event) {\n        this.highlightDropArea = true;\n\n        //The file upload widget value should be set to null to reupload the same file.\n        this.$element.find('.file-input')[0].value = null;\n        $event.stopPropagation();\n\n        // MEMORY LEAK FIX: Use stored bound function reference\n        // when the filepicker is not there on the window, remove the dropzone highlight\n        window.addEventListener('focus', this.boundDisableDropZone);\n    }\n\n    disableDropZone() {\n        this.highlightDropArea = false;\n        // MEMORY LEAK FIX: Remove using stored bound function reference\n        window.removeEventListener('focus', this.boundDisableDropZone);\n    }\n\n    /*this function to clear the specified file. if argument is not provided, it clears the complete list  */\n    clear(fileObj) {\n        this.selectedFiles = (fileObj) ? this.clearFile(this.selectedFiles, fileObj) : [];\n        this.uploadedFiles = (fileObj) ? this.clearFile(this.uploadedFiles, fileObj) : [];\n    }\n\n    private clearFile(files, fileObj) {\n        return files.filter((file) => file?._response?.fileName !== fileObj?._response?.fileName || file?.name !== fileObj?.name || file !== fileObj);\n    }\n\n    /*this function to set the class names for clear icon */\n    setClearIconClass(classValue) {\n        this.cleariconclass = classValue;\n    }\n    /*this function to set the hint for clear icon */\n    setClearIconHint(hint) {\n        this.cleariconhint = hint;\n    }\n\n\n    /*this function to append upload status dom elements to widget */\n    onFileSelect($event, $files) {\n        let beforeSelectVal;\n        const files = this.getValidFiles($files);\n        $files = files.validFiles;\n\n        // If the user has previously tried uploading folders using drop, and then uploading using click method we clear the folders dom\n        if ($event.type === \"change\") {\n            this.selectedFolders = [];\n        }\n\n        // Trigger error callback event if any invalid file found.\n        if (!isEmpty(files.errorFiles)) {\n            this.invokeEventCallback('error', {\n                $event,\n                files: files.errorFiles\n            });\n        }\n\n        // Make call if there are valid files else no call is made\n        if ($files.length) {\n            // EVENT: ON_BEFORE_SELECT\n            beforeSelectVal = this.invokeEventCallback('beforeselect', {\n                $event: $.extend($event.$files || {}, $files),\n                files: $files\n            });\n            if (this.datasource) {\n                if(!this.uploadProgressSubscription) {\n                    this.progressObservable = new Subject();\n                    this.datasource._progressObservable = this.progressObservable;\n                    this.uploadProgressSubscription = this.datasource._progressObservable.asObservable().subscribe((progressObj) => {\n                        forEach(this.uploadedFiles, (file) => {\n                            if (file.name === progressObj.fileName && file.uniqueId === progressObj.uniqueId) {\n                                file.progress = progressObj.progress;\n                                if (file.progress === 100) {\n                                    file.status = 'success';\n                                } else {\n                                    file.status = progressObj.status;\n                                    if (progressObj.errMsg) {\n                                        file.errMsg = progressObj.errMsg;\n                                        this.invokeEventCallback('error', {\n                                            $event,\n                                            files: file\n                                        });\n                                    }\n                                }\n                            }\n                        });\n                    });\n                }\n            } else {\n                this.selectedFiles = $files;\n            }\n            if (beforeSelectVal !== false) {\n                // EVENT: ON_SELECT\n                this.onSelectEventCall($event, $files);\n            }\n        }\n    }\n\n    onFileDelete($event, file) {\n        if(!file) {\n            return;\n        }\n\n        const beforeDeleteVal = this.invokeEventCallback('beforedelete', { $event: file });\n\n        if (beforeDeleteVal !== false) {\n            this.dialogService.showAppConfirmDialog({\n                title: \"Delete file\",\n                message: \"Are you sure you want to delete this file?\",\n                oktext: \"Ok\",\n                canceltext: \"Cancel\",\n                onOk: () => {\n                    if (this.deletedatasource) {\n                        this.deletedatasource.setInput('file', file._response.fileName || file.name);\n\n                        if(!this.deleteProgressSubscription) {\n                            this.deleteFileObservable = new Subject();\n                            this.deletedatasource._deleteFileObservable = this.deleteFileObservable;\n                            this.deletedatasource._deleteFileObservable.asObservable().subscribe((response) => {\n                                if(response.status === \"success\") {\n                                    this.selectedFiles = this.selectedFiles.filter((fileObj) => file !== fileObj) || [];\n                                    this.uploadedFiles = this.uploadedFiles.filter((fileObj) => file !== fileObj) || [];\n                                }\n                            });\n                        }\n                    }\n                    this.invokeEventCallback('delete', { $event: file });\n                    this.dialogService.closeAppConfirmDialog();\n                },\n                onCancel: () => {\n                    this.dialogService.closeAppConfirmDialog();\n                },\n                onOpen: () => {\n                    $('.cancel-action').focus();\n                }\n            });\n        }\n    }\n\n    // Prevent default behavior (Prevent file from being opened)\n    dragOverHandler($event) {\n        $event.preventDefault();\n        $event.stopPropagation();\n    }\n\n    // Get the file data if it exists and call the onFileSelect function\n    onFileDrop($event) {\n        $event.preventDefault();\n        let listOfFiles = [];\n        this.selectedFolders = [];\n        const filesData = $event.dataTransfer.items;\n        if (filesData.length > 0) {\n            // Use DataTransferItemList interface to access the file(s)\n            for (var i = 0; i < filesData.length; i++) {\n                 // Get all the files and push them into an array\n                if (filesData[i].webkitGetAsEntry().isFile) {\n                    listOfFiles.push(filesData[i].getAsFile());\n                }\n                // If a selected item is directory push the folder element into an array and display error message by adding to dom\n                else if(filesData[i].webkitGetAsEntry().isDirectory) {\n                    this.selectedFolders.push(filesData[i].getAsFile());\n                }\n            }\n            this.onFileSelect($event, listOfFiles);\n        }\n    }\n\n    dragOverCb(e) {\n        e.preventDefault();\n        $(this.nativeElement).find('#dropzone').addClass('highlight-drop-box');\n    }\n\n    dropCb() {\n        $(this.nativeElement).find('#dropzone').removeClass('highlight-drop-box');\n    }\n\n    // this function triggers file select window, when clicked anywhere on the file upload widget in case of multi select\n    triggerFileSelect() {\n        this.$element.find('.file-input').trigger('click');\n    }\n\n    /**\n     * Aborts a file upload request\n     * @param $file, the file for which the request is to be aborted\n     */\n    abortFileUpload($file) {\n        this.datasource.execute(DataSource.Operation.CANCEL, $file);\n    }\n\n    isMimeType(file: string) {\n        return (this.defaultAllowedExtensions.includes('image/*') && isImageFile(file))\n            || (this.defaultAllowedExtensions.includes('audio/*') && isAudioFile(file))\n            || (this.defaultAllowedExtensions.includes('video/*') && isVideoFile(file));\n    }\n\n    /* Define the property change handler. This function will be triggered when there is a change in the widget property */\n    onPropertyChange(key, nv, ov) {\n        /*Monitoring changes for styles or properties and accordingly handling respective changes.*/\n        switch (key) {\n            case 'uploadpath':\n                // TODO Srinivas: why do we need uploadpath\n                this.changeServerUploadPath(nv);\n                break;\n            case 'contenttype':\n                if (this.defaultAllowedExtensions.includes('*/*')) {\n                    this.chooseFilter = nv.split(' ').join(',')\n                } else {\n                    this.chooseFilter = nv.split(' ').filter(item => this.defaultAllowedExtensions.includes(item) || this.isMimeType(item)).join(',');\n                    if (isEmpty(this.chooseFilter)) {\n                        this.chooseFilter = this.defaultAllowedExtensions;\n                    }\n                }\n\n                break;\n            case 'multiple':\n                this.formName = this.name + (this.multiple ? '-multiple-fileupload' : '-single-fileupload');\n                this.caption = this.getCaption(this.caption, this.multiple, this._isMobileType);\n                break;\n            case 'fileuploadmessage':\n                this.fileUploadMessage = nv;\n        }\n\n        super.onPropertyChange(key, nv, ov);\n    }\n\n    constructor(inj: Injector, private app: App, @Attribute('select.event') public onSelectEvt, private dialogService: AbstractDialogService, @Inject('EXPLICIT_CONTEXT') @Optional() explicitContext: any) {\n        super(inj, WIDGET_CONFIG, explicitContext);\n        // styler(this.nativeElement, this);\n    }\n\n    ngOnInit() {\n        super.ngOnInit();\n        \n        // MEMORY LEAK FIX: Store bound function references for proper removal\n        this.boundDragOverCb = this.dragOverCb.bind(this);\n        this.boundDropCb = this.dropCb.bind(this);\n        this.boundDisableDropZone = this.disableDropZone.bind(this);\n        \n        // adding, dragover and drop on the document as when file is dragged on to the page highlight the dropzones and remove highlight on file drop\n        document.addEventListener('dragover', this.boundDragOverCb);\n        document.addEventListener('drop', this.boundDropCb);\n\n        // adding mouseleave evnt to remove highlight when file is dropped outside the window\n        document.addEventListener('mouseleave', this.boundDropCb);\n    }\n\n    ngAfterViewInit() {\n        styler( this.nativeElement.querySelector('.app-button, .drop-box'), this);\n    }\n\n    ngOnDestroy() {\n        // MEMORY LEAK FIX: Remove using stored bound function references\n        if (this.boundDragOverCb) {\n            document.removeEventListener('dragover', this.boundDragOverCb);\n            this.boundDragOverCb = null;\n        }\n        if (this.boundDropCb) {\n            document.removeEventListener('drop', this.boundDropCb);\n            document.removeEventListener('mouseleave', this.boundDropCb);\n            this.boundDropCb = null;\n        }\n        if (this.boundDisableDropZone) {\n            window.removeEventListener('focus', this.boundDisableDropZone);\n            this.boundDisableDropZone = null;\n        }\n        \n        super.ngOnDestroy();\n\n        const subscriptions = [this.uploadProgressSubscription, this.deleteProgressSubscription];\n        subscriptions.forEach(subscription => {\n            if (subscription) {\n                subscription.unsubscribe();\n            }\n        });\n    }\n}\n","<div class=\"app-fileupload\" init-widget>\n  <!-- drag and drop files UI in web -->\n  @if (!_isMobileType && multiple) {\n    <div class=\"app-multi-file-upload\">\n      <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n        <i class=\"{{iconclass}}\"></i>\n        <div class=\"message\">\n          <label [innerHtml]=\"caption\" class=\"upload-label\"></label>\n          <form class=\"form-horizontal\" name=\"{{formName}}\">\n            @if (multiple) {\n              <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n            }\n            <a class=\"app-anchor upload-label\" href=\"javascript:void(0);\">{{ fileUploadMessage }}</a>\n          </form>\n          @if (chooseFilter) {\n            <label [innerHtml]=\"chooseFilter + ' only '\" class=\"upload-extensions\"></label>\n          }\n          @if (chooseFilter && maxfilesize) {\n            <span class=\"upload-extensions\"> . </span>\n          }\n          @if (maxfilesize) {\n            <label [innerHtml]=\"maxfilesize + 'MB max'\" class=\"upload-extensions\"></label>\n          }\n        </div>\n      </div>\n    </div>\n  }\n  <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n  @if ((!multiple || _isMobileType)) {\n    <div class=\"app-single-file-upload\">\n      <div class=\"app-button-wrapper\">\n        <form class=\"form-horizontal\" name=\"{{formName}}\">\n          <!-- support for file upload in Mobileapp in its runmode (Web) -->\n          @if (multiple) {\n            <input (change)=\"onFileSelect($event, $event.target.files)\" (click)=\"onFileElemClick($event)\"\n              [accept]=\"chooseFilter\" [attr.aria-label]=\"arialabel || 'File selection field'\" [disabled]=\"disabled\" class=\"file-input\"\n              multiple name=\"files\" type=\"file\">\n          }\n          @if (!multiple) {\n            <input (change)=\"onFileSelect($event, $event.target.files)\" (click)=\"onFileElemClick($event)\"\n              [accept]=\"chooseFilter\" [attr.aria-label]=\"arialabel || 'File selection field'\" [disabled]=\"disabled\" class=\"file-input\"\n              name=\"files\" type=\"file\">\n          }\n          <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n            <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n            <span class=\"caption\" [innerHTML]=\"caption\"></span>\n          </button>\n        </form>\n      </div>\n      <div class=\"app-files-upload-status single\"></div>\n    </div>\n  }\n  <!-- list of selectedfiles UI -->\n  @if (uploadedFiles.length > 0) {\n    <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\"\n      tabindex=\"0\">\n      @for (ft of uploadedFiles; track ft) {\n        @if (ft.status !== 'abort') {\n          <li class=\"list-group-item file-upload-status\" tabindex=\"0\">\n            <div class=\"media upload-file-list\">\n              <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n              <div class=\"media-body media-middle file-details\">\n                <p class=\"uploaddetails col-md-3\">\n                  <span class=\"upload-title\">{{ ft.storageName || ft.name }}</span>\n                  @if (ft.status === 'success' && (!datasource || (datasource && ft._response?.success))) {\n                    <span\n                    class=\"status-icon {{ft.status | stateClass }}\"></span>\n                  }\n                  <br/>\n                  @if (ft.fileLength  !== 0) {\n                    <span class=\"filesize\">{{ft.size | filesize:0}}</span>\n                  }\n                  @if (ft.status === 'error') {\n                    <span\n                      class=\"status-icon {{ft.status | stateClass }}\"\n                    title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\"></span>\n                  }\n                  @if (ft.status === 'error') {\n                    <span class=\"error-message\">Upload Failed</span>\n                  }\n                </p>\n                @if (ft.status === 'onProgress' || showprogressbar) {\n                  <div\n                    class=\"progress col-md-7 upload-progress\">\n                    <div [ngClass]=\"ft.status === 'error' ? 'progress-bar-danger' : 'progress-bar-info'\"\n                      [ngStyle]=\"{width: (ft.progress +'%')}\"\n                    class=\"progress-bar progress-bar-striped\"></div>\n                  </div>\n                }\n                @if ((ft.status === 'onProgress' || showprogressbar && showprogressbarpercentage) && ft.progress ) {\n                  <div\n                    class=\"col-md-1 upload-progress-percentage\">{{ ft.progress + '%' }}\n                  </div>\n                }\n              </div>\n              @if (ft.status === 'onProgress' || ft.status === 'queued') {\n                <div class=\"media-right media-middle\">\n                  <a href=\"javascript:void(0)\" class=\"btn btn-transparent file-upload-stop\" type=\"button\"\n                    (click)=\"abortFileUpload(ft)\">\n                    <i class=\"wi wi-close\"></i>\n                  </a>\n                </div>\n              }\n              <div class=\"media-right media-middle\">\n                @if (cleariconclass !== '' && ft.status !== 'onProgress') {\n                  <a href=\"javascript:void(0)\" (click)=\"clear(ft)\"\n                    class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n                    <i class=\"{{cleariconclass}}\"></i>\n                  </a>\n                }\n              </div>\n              @if (ft.status === 'success' && (!datasource || (datasource && ft._response?.success))) {\n                <div class=\"media-right media-middle\">\n                  <a href=\"javascript:void(0)\" (click)=\"onFileDelete($event, ft)\"\n                    class=\"btn btn-transparent btn-default status-icon\" title=\"{{deleteiconhint}}\" type=\"button\">\n                    <i class=\"wi wi-delete\"></i>\n                  </a>\n                </div>\n              }\n            </div>\n          </li>\n        }\n      }\n    </ul>\n  }\n  <!-- list of selectedfolders UI to show the error in title -->\n  @if (selectedFolders.length > 0) {\n    <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" >\n      @for (ft of selectedFolders; track ft) {\n        <li class=\"list-group-item file-upload-status\">\n          <div class=\"media upload-file-list\">\n            <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n            <div class=\"media-body media-middle file-details\">\n              <p class=\"uploaddetails\">\n                <label class=\"upload-title\">{{ft.name}}</label><br/>\n              </p>\n            </div>\n            <div class=\"media-right media-middle\" >\n              <span class=\"status-icon  wi wi-cancel text-danger\"></span>\n            </div>\n          </div>\n        </li>\n      }\n    </ul>\n  }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;;;;AAGO,MAAM,aAAa,GAAG,MAAK;AAC9B,IAAA,QAAQ,CACJ,eAAe,EACf,IAAI,GAAG,CACH;QACI,CAAC,SAAS,EAAE,WAAW,CAAC;QACxB,CAAC,MAAM,EAAE,WAAW,CAAC;QACrB,CAAC,MAAM,EAAE,WAAW,CAAC;QACrB,CAAC,WAAW,EAAE,WAAW,CAAC;QAC1B,CAAC,UAAU,EAAE,WAAW,CAAC;QACzB,CAAC,UAAU,EAAE,YAAY,CAAC;QAC1B,CAAC,mBAAmB,EAAG,WAAW,CAAC;QACnC,CAAC,MAAM,EAAE,EAAC,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,EAAC,CAAC;QACxC,CAAC,UAAU,EAAE,YAAY,CAAC;QAC1B,CAAC,aAAa,EAAE,WAAW,CAAC;QAC5B,CAAC,aAAa,EAAE,WAAW,CAAC;QAC5B,CAAC,WAAW,EAAE,EAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,WAAW,EAAC,CAAC;QAC3D,CAAC,gBAAgB,EAAE,EAAC,KAAK,EAAE,EAAE,EAAE,GAAG,WAAW,EAAC,CAAC;QAC/C,CAAC,eAAe,EAAE,EAAC,KAAK,EAAE,OAAO,EAAE,GAAG,WAAW,EAAC,CAAC;QACnD,CAAC,OAAO,EAAE,WAAW,CAAC;AACtB,QAAA,CAAC,YAAY,EAAE,EAAC,GAAG,WAAW,EAAC,CAAC;QAChC,CAAC,YAAY,EAAE,WAAW,CAAC;QAC3B,CAAC,eAAe,EAAE,WAAW,CAAC;QAC9B,CAAC,aAAa,EAAE,WAAW,CAAC;QAC5B,CAAC,gBAAgB,EAAE,WAAW,CAAC;QAC/B,CAAC,OAAO,EAAE,EAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,EAAC,CAAC;QAC1C,CAAC,iBAAiB,EAAE,YAAY,CAAC;QACjC,CAAC,2BAA2B,EAAE,YAAY,CAAC;QAC3C,CAAC,gBAAgB,EAAE,EAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAC;AACvD,KAAA,CACJ,CACJ;AACD,IAAA,kBAAkB,CACd,cAAc,CAAC,MAAM,EACrB,IAAI,GAAG,CAAC;QACJ,CAAC,UAAU,EAAE,YAAY,CAAC;QAC1B,CAAC,YAAY,EAAE,WAAW,CAAC;QAC3B,CAAC,UAAU,EAAE,WAAW,CAAC;QACzB,CAAC,UAAU,EAAE,YAAY,CAAC;QAC1B,CAAC,UAAU,EAAE,YAAY,CAAC;QAC1B,CAAC,UAAU,EAAE,YAAY;AAC5B,KAAA,CAAC,CACL;AACL,CAAC;;ACjCD,MAAM,WAAW,GAAG,gBAAgB;AACpC,MAAM,aAAa,GAAG;AAClB,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,SAAS,EAAE;CACd;AAYK,MAAO,mBAAoB,SAAQ,iBAAiB,CAAA;AAC/C,IAAA,SAAA,IAAA,CAAA,eAAe,GAAG,aAAa,EAAhB,CAAmB;AAqDzC;AACgD;;AAGhD,IAAA,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAA;QAC1D,IAAI,OAAO,EAAE,YAAY;QAEzB,IAAI,CAAC,WAAW,EAAE;AACd,YAAA,OAAO,IAAI;QACf;QACA,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AAE9C,QAAA,IAAI,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,YAAY,CAAC,EAAE;AACxF,YAAA,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC;;YAE/B,IAAI,OAAO,EAAE;AACT,gBAAA,OAAO,OAAO;YAClB;QACJ;AACA,QAAA,IAAI,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,YAAY,CAAC,EAAE;AACxF,YAAA,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC;;YAE/B,IAAI,OAAO,EAAE;AACT,gBAAA,OAAO,OAAO;YAClB;QACJ;AACA,QAAA,IAAI,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,YAAY,CAAC,EAAE;AACxF,YAAA,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC;;YAE/B,IAAI,OAAO,EAAE;AACT,gBAAA,OAAO,OAAO;YAClB;QACJ;;AAEA,QAAA,IAAI,QAAQ,CAAC,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE;YACtD,OAAO,GAAG,IAAI;QAClB;AACA,QAAA,OAAO,OAAO;IAClB;;AAGA,IAAA,aAAa,CAAC,MAAM,EAAA;QAChB,MAAM,UAAU,GAAG,EAAE;QACrB,MAAM,UAAU,GAAG,EAAE;AACrB,QAAA,MAAM,kBAAkB,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW;QAC9F,MAAM,8BAA8B,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,GAAG,IAAI,IAAI;;QAGvE,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE;AACtD,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE;QAC1B;AAEA,QAAA,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,KAAI;;YAErB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE;AACvG,gBAAA,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,uCAAuC,CAAA,CAAA,EAAI,IAAI,CAAC,YAAY,EAAE;gBAC5F,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC;gBACtE;YACJ;AACA,YAAA,IAAI,IAAI,CAAC,IAAI,GAAG,kBAAkB,EAAE;gBAChC,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,oCAAoC,CAAA,CAAA,EAAI,8BAA8B,CAAA,CAAE;gBACtG,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC;gBACjE;YACJ;AACA,YAAA,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,QAAA,CAAC,CAAC;QACF,OAAO;AACH,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,UAAU,EAAE;SACf;IACL;AAEA,IAAA,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAA;;QAEvC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE;YACjC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC;QACpC;AACA,QAAA,MAAM,KAAK,GAAG;AACV,YAAA,GAAG,EAAE,GAAG;AACR,YAAA,OAAO,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IACzB;;AAGA,IAAA,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAA;QACxC,IAAI,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE;YAC1C,OAAO,UAAU,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM;QAC7G;AACA,QAAA,OAAO,OAAO;IAClB;;AAKA,IAAA,sBAAsB,CAAC,IAAI,EAAA;AACvB,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;IACtC;;AAGA,IAAA,gBAAgB,CAAC,QAAQ,EAAA;QACrB,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;AACrC,YAAA,OAAO,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5D;AACA,QAAA,OAAO,MAAM;IACjB;AAEA;;;;AAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAA;AAC5B,QAAA,MAAM,CAAC,OAAO,CAAC,IAAI,IAAG;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AAC9C,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM;QAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM;QAChF,UAAU,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;AAC/B,gBAAA,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC;AAC7C,gBAAA,aAAa,EAAE;AAClB,aAAA,CAAC;AACN,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,eAAe,CAAC,MAAM,EAAA;AAClB,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;;AAG7B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI;QACjD,MAAM,CAAC,eAAe,EAAE;;;QAIxB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC;IAC/D;IAEA,eAAe,GAAA;AACX,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;;QAE9B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC;IAClE;;AAGA,IAAA,KAAK,CAAC,OAAO,EAAA;QACT,IAAI,CAAC,aAAa,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE;QACjF,IAAI,CAAC,aAAa,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE;IACrF;IAEQ,SAAS,CAAC,KAAK,EAAE,OAAO,EAAA;AAC5B,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO,EAAE,IAAI,IAAI,IAAI,KAAK,OAAO,CAAC;IACjJ;;AAGA,IAAA,iBAAiB,CAAC,UAAU,EAAA;AACxB,QAAA,IAAI,CAAC,cAAc,GAAG,UAAU;IACpC;;AAEA,IAAA,gBAAgB,CAAC,IAAI,EAAA;AACjB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;IAC7B;;IAIA,YAAY,CAAC,MAAM,EAAE,MAAM,EAAA;AACvB,QAAA,IAAI,eAAe;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AACxC,QAAA,MAAM,GAAG,KAAK,CAAC,UAAU;;AAGzB,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC1B,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;QAC7B;;QAGA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE;gBAC9B,MAAM;gBACN,KAAK,EAAE,KAAK,CAAC;AAChB,aAAA,CAAC;QACN;;AAGA,QAAA,IAAI,MAAM,CAAC,MAAM,EAAE;;AAEf,YAAA,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE;AACvD,gBAAA,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC;AAC7C,gBAAA,KAAK,EAAE;AACV,aAAA,CAAC;AACF,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACjB,gBAAA,IAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE;AACjC,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,OAAO,EAAE;oBACvC,IAAI,CAAC,UAAU,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB;AAC7D,oBAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,WAAW,KAAI;wBAC3G,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,KAAI;AACjC,4BAAA,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,EAAE;AAC9E,gCAAA,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ;AACpC,gCAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;AACvB,oCAAA,IAAI,CAAC,MAAM,GAAG,SAAS;gCAC3B;qCAAO;AACH,oCAAA,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM;AAChC,oCAAA,IAAI,WAAW,CAAC,MAAM,EAAE;AACpB,wCAAA,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM;AAChC,wCAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE;4CAC9B,MAAM;AACN,4CAAA,KAAK,EAAE;AACV,yCAAA,CAAC;oCACN;gCACJ;4BACJ;AACJ,wBAAA,CAAC,CAAC;AACN,oBAAA,CAAC,CAAC;gBACN;YACJ;iBAAO;AACH,gBAAA,IAAI,CAAC,aAAa,GAAG,MAAM;YAC/B;AACA,YAAA,IAAI,eAAe,KAAK,KAAK,EAAE;;AAE3B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC;YAC1C;QACJ;IACJ;IAEA,YAAY,CAAC,MAAM,EAAE,IAAI,EAAA;QACrB,IAAG,CAAC,IAAI,EAAE;YACN;QACJ;AAEA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAElF,QAAA,IAAI,eAAe,KAAK,KAAK,EAAE;AAC3B,YAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC;AACpC,gBAAA,KAAK,EAAE,aAAa;AACpB,gBAAA,OAAO,EAAE,4CAA4C;AACrD,gBAAA,MAAM,EAAE,IAAI;AACZ,gBAAA,UAAU,EAAE,QAAQ;gBACpB,IAAI,EAAE,MAAK;AACP,oBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACvB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC;AAE5E,wBAAA,IAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE;AACjC,4BAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,OAAO,EAAE;4BACzC,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,GAAG,IAAI,CAAC,oBAAoB;AACvE,4BAAA,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,KAAI;AAC9E,gCAAA,IAAG,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE;oCAC9B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE;oCACnF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE;gCACvF;AACJ,4BAAA,CAAC,CAAC;wBACN;oBACJ;oBACA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACpD,oBAAA,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE;gBAC9C,CAAC;gBACD,QAAQ,EAAE,MAAK;AACX,oBAAA,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE;gBAC9C,CAAC;gBACD,MAAM,EAAE,MAAK;AACT,oBAAA,CAAC,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE;gBAC/B;AACH,aAAA,CAAC;QACN;IACJ;;AAGA,IAAA,eAAe,CAAC,MAAM,EAAA;QAClB,MAAM,CAAC,cAAc,EAAE;QACvB,MAAM,CAAC,eAAe,EAAE;IAC5B;;AAGA,IAAA,UAAU,CAAC,MAAM,EAAA;QACb,MAAM,CAAC,cAAc,EAAE;QACvB,IAAI,WAAW,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK;AAC3C,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;;AAEtB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;;gBAEvC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE;oBACxC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC9C;;qBAEK,IAAG,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,WAAW,EAAE;AACjD,oBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACvD;YACJ;AACA,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC;QAC1C;IACJ;AAEA,IAAA,UAAU,CAAC,CAAC,EAAA;QACR,CAAC,CAAC,cAAc,EAAE;AAClB,QAAA,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC1E;IAEA,MAAM,GAAA;AACF,QAAA,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC;IAC7E;;IAGA,iBAAiB,GAAA;AACb,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACtD;AAEA;;;AAGG;AACH,IAAA,eAAe,CAAC,KAAK,EAAA;AACjB,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;IAC/D;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;AACnB,QAAA,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;AACvE,gBAAC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;AACvE,gBAAC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACnF;;AAGA,IAAA,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAA;;QAExB,QAAQ,GAAG;AACP,YAAA,KAAK,YAAY;;AAEb,gBAAA,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBAC/B;AACJ,YAAA,KAAK,aAAa;gBACd,IAAI,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC/C,oBAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC/C;qBAAO;AACH,oBAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACjI,oBAAA,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;AAC5B,wBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,wBAAwB;oBACrD;gBACJ;gBAEA;AACJ,YAAA,KAAK,UAAU;gBACX,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AAC3F,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC;gBAC/E;AACJ,YAAA,KAAK,mBAAmB;AACpB,gBAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;;QAGnC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;IACvC;IAEA,WAAA,CAAY,GAAa,EAAU,GAAQ,EAAoC,WAAW,EAAU,aAAoC,EAA0C,eAAoB,EAAA;AAClM,QAAA,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,eAAe,CAAC;QADX,IAAA,CAAA,GAAG,GAAH,GAAG;QAAyC,IAAA,CAAA,WAAW,GAAX,WAAW;QAAU,IAAA,CAAA,aAAa,GAAb,aAAa;QApZjH,IAAA,CAAA,aAAa,GAAQ,EAAE;QACvB,IAAA,CAAA,aAAa,GAAQ,EAAE;QACvB,IAAA,CAAA,eAAe,GAAQ,EAAE;QAOzB,IAAA,CAAA,aAAa,GAAG,EAAE;QAClB,IAAA,CAAA,OAAO,GAAG,QAAQ;QAClB,IAAA,CAAA,QAAQ,GAAG,EAAE;AAKb,QAAA,IAAA,CAAA,gBAAgB,GAAG;AACf,YAAA,eAAe,EAAE,uBAAuB;AACxC,YAAA,MAAM,EAAE;SACX;AACD,QAAA,IAAA,CAAA,mBAAmB,GAAG;AAClB,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,KAAK,EAAE;SACV;QACD,IAAA,CAAA,WAAW,GAAG,OAAO;;QAIrB,IAAA,CAAA,qBAAqB,GAAG,aAAa;AACrC,QAAA,IAAA,CAAA,UAAU,GAAG;AACT,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,UAAU,EAAE;SACf;AACD,QAAA,IAAA,CAAA,2BAA2B,GAAG,sBAAsB,EAAE,CAAC,2BAA2B;QAClF,IAAA,CAAA,wBAAwB,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAC;AACpJ,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,wBAAwB;QAGjG,IAAA,CAAA,iBAAiB,GAAG,8CAA8C;AAO1D,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC;QAkG9C,IAAA,CAAA,SAAS,GAAG,UAAU;;IAsQtB;IAEA,QAAQ,GAAA;QACJ,KAAK,CAAC,QAAQ,EAAE;;QAGhB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;;QAG3D,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC;QAC3D,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;;QAGnD,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC;IAC7D;IAEA,eAAe,GAAA;AACX,QAAA,MAAM,CAAE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC;IAC7E;IAEA,WAAW,GAAA;;AAEP,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;YACtB,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC;AAC9D,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC/B;AACA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,QAAQ,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;YACtD,QAAQ,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC;AAC5D,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QAC3B;AACA,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC3B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC;AAC9D,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;QACpC;QAEA,KAAK,CAAC,WAAW,EAAE;QAEnB,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC,0BAA0B,CAAC;AACxF,QAAA,aAAa,CAAC,OAAO,CAAC,YAAY,IAAG;YACjC,IAAI,YAAY,EAAE;gBACd,YAAY,CAAC,WAAW,EAAE;YAC9B;AACJ,QAAA,CAAC,CAAC;IACN;+GAvcS,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,GAAA,EAAA,EAAA,EAAA,KAAA,EAsZ4B,cAAc,EAAA,SAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,EAAA,EAAA,KAAA,EAA4E,kBAAkB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAtZ3J,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,SAAA,EALjB;YACP,kBAAkB,CAAC,mBAAmB;SACzC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1BL,0gPAkJA,2CD7Hc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,cAAc,8CAAE,YAAY,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAQ9D,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAV/B,SAAS;AACM,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,CAAC,EAAA,QAAA,EAC9D,gBAAgB,EAAA,SAAA,EAEf;AACP,wBAAA,kBAAkB,CAAA,mBAAA;AACrB,qBAAA,EAAA,QAAA,EAAA,0gPAAA,EAAA;;0BAyZ6C,SAAS;2BAAC,cAAc;;0BAAqE,MAAM;2BAAC,kBAAkB;;0BAAG;;;AEnb3K;;AAEG;;;;"}