{"version":3,"sources":["../node_modules/reactstrap/es/UncontrolledTooltip.js","components/dialog/zip-download-dialog.js","components/shared-link-file-uploader/upload-list-item.js","components/shared-link-file-uploader/forbid-upload-list-item.js","components/shared-link-file-uploader/upload-progress-dialog.js","components/shared-link-file-uploader/file-uploader.js","components/dialog/save-shared-dir-dialog.js","shared-dir-view.js","components/dialog/image-dialog.js","components/dialog/list-taggedfiles-dialog.js","models/draft.js","components/dialog/list-repo-drafts-dialog.js","components/dialog/readme-dialog.js","components/repo-info-bar.js","components/dialog/copy-move-dirent-progress-dialog.js"],"names":["ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","omitKeys","UncontrolledTooltip","_Component","props","_this","call","this","state","isOpen","defaultOpen","toggle","bind","_assertThisInitialized","_inheritsLoose","_proto","prototype","setState","render","React","createElement","Tooltip","_extends","omit","Component","propTypes","target","i","arguments","length","source","forEach","key","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_objectSpread","PropTypes","bool","interval","ZipDownloadDialog","queryZipProgress","zipToken","seafileAPI","then","res","data","failed","clearInterval","isLoading","errorMsg","failed_reason","zipProgress","total","zipped","toFixed","toggleDialog","location","href","fileServerRoot","catch","error","Utils","getErrorMsg","cancelZipTask","token","path","repoID","getShareLinkDirentsZipTask","getShareLinkZipTask","zipDownload","setInterval","gettext","Content","className","UPLOAD_UPLOADING","UPLOAD_ERROR","UPLOAD_ISSAVING","UPLOAD_UPLOADED","UploadListItem","onUploadCancel","e","preventDefault","resumableFile","onUploadRetry","formatFileSize","size","uploadState","nextProps","remainingTime","isSaved","progress","Math","round","fileName","newFileName","title","isUploading","role","style","width","formatTime","dangerouslySetInnerHTML","__html","onClick","ForbidUploadListItem","file","msg","replace","maxUploadFileSize","name","colSpan","UploadProgressDialog","onCancelAllUploading","onMinimizeUpload","nativeEvent","stopImmediatePropagation","isMinimized","onCloseUpload","onCloseUploadDialog","uploadBitrate","formatBitRate","uploadedMessage","uploadingMessage","totalProgress","uploadingOptions","uploadedOptions","allFilesUploaded","retryFileList","height","onUploadRetryAll","forbidUploadFileList","map","index","uploadFileList","FileUploader","componentWillUnmount","window","onbeforeunload","dragAndDrop","resumable","disableDropOnDocument","uploader","isUploadProgressDialogShow","bindCallbackHandler","minFileSizeErrorCallback","fileTypeErrorCallback","maxFilesErrorCallback","opts","maxFileSizeErrorCallback","bindEventHandler","on","onChunkingComplete","onFileAdded","filesAddedComplete","onFileProgress","onFileUploadSuccess","onProgress","onComplete","onPause","onFileRetry","onFileError","onError","onBeforeCancel","onCancel","onDragStart","files","errorCount","maxFiles","maxNumberOfFilesForFileupload","message","toaster","danger","relativePath","isFile","formData","parent_dir","relative_path","slice","lastIndexOf","setUploadFileList","sharedLinkGetFileUploadUrl","upload_link","resumableUpload","errMessage","isUploadLinkLoaded","upload","getFileUploadedBytes","uploadedBytes","blockSize","parseInt","resumableUploadFileBlockSize","offset","floor","markChunksCompleted","registerGlobalVariable","getBitrate","item","uniqueIdentifier","lastSize","time","loaded","now","Date","getTime","timestamp","timeDiff","bitrateInterval","currentTime","JSON","parse","dirent","id","type","mtime","errorMessage","notifiedFolders","setHeaders","chunkSize","getOpt","fileSize","startByte","endByte","min","encodeURI","setQuery","generateUniqueIdentifier","webkitRelativePath","MD5","stopPropagation","onFileUpload","uploadInput","current","removeAttribute","click","onFolderUpload","setAttribute","uploadingItem","cancel","retryUploadFile","bootstrap","firedRetry","resumableObj","uploadFile","isUploadRemindDialogShow","cancelFileUpload","pop","currentResumableFile","createRef","Resumablejs","query","fileType","filetypes","undefined","maxFileSize","testMethod","testChunks","headers","withCredentials","simultaneousUploads","fileParameterName","forceChunkSize","maxChunkRetries","minFileSize","assignBrowse","enableDropOnDocument","ref","SaveSharedDirDialog","onSaveSharedFile","handleSaveSharedDir","repo","repo_id","selectedPath","onDirentItemClick","onRepoItemClick","Modal","ModalHeader","toggleCancel","ModalBody","isShowFile","mode","Alert","color","ModalFooter","Button","disabled","moment","locale","app","config","lang","loginUser","pageOptions","shared","dirName","dirPath","sharedBy","thumbnailSize","trafficOverLimit","canDownload","noQuota","canUpload","enableVideoThumbnail","showDownloadIcon","SharedDirView","sortItems","sortBy","sortOrder","items","sortDirentsInSharedDir","getThumbnails","is_dir","imageCheck","file_name","videoCheck","encoded_thumbnail_src","len","getThumbnail","curItem","getShareLinkThumbnail","file_path","renderPath","Fragment","encodeURIComponent","zipDownloadFolder","folderPath","useGoFileserver","isZipDialogOpen","zipFolderPath","zipDownloadSelectedItems","isSelected","folder_name","selectedItems","saveSelectedItems","isSaveSharedDirDialogShow","itemsForSave","saveAllItems","toggleSaveSharedDirCancel","destRepoID","dstPath","saveSharedDir","isCopyMoveProgressDialogShow","asyncCopyMoveTaskId","task_id","asyncOperatedFilesLength","getAsyncCopyMoveProgress","onProgressDialogToggle","asyncOperationProgress","taskId","cancelCopyMoveOperation","closeZipDialog","prepareImageItem","isGIF","substr","toLowerCase","fileURL","siteRoot","thumbnailSizeForOriginal","encodePath","showImagePopup","imageItems","isImagePopupOpen","imageIndex","indexOf","closeImagePopup","moveToPrevImage","imageItemsLength","prevState","moveToNextImage","toggleAllSelected","isAllItemsSelected","toggleItemSelected","targetItem","some","onUploadFile","direntObject","newItem","joinPath","last_modified","format","folderItems","Array","from","splice","shareLinksUploadDone","getShareLinkRepoTags","usedRepoTags","repo_tags","usedRepoTag","RepoTag","fileCount","isRepoInfoBarShow","duration","listSharedDir","a","queryAsyncOperationProgress","successful","success","done","isDesktop","modeBaseClass","src","mediaUrl","logoPath","logoHeight","logoWidth","siteTitle","alt","currentPath","shareLinkToken","enableFileDownload","sharedToken","parentDir","sortByName","sortByTime","sortBySize","tbody","sortIcon","checked","onChange","Item","toggleOpMenu","isOpMenuOpen","handleMouseOver","isIconShown","handleMouseOut","folder_path","handleFileClick","toolTipID","tagTitle","file_tags","tag_name","join","onMouseOver","onMouseOut","onFocus","getFolderIconUrl","fromNow","Dropdown","DropdownToggle","tag","DropdownItem","thumbnailURL","getFileIconUrl","fileTag","zIndex","backgroundColor","tag_color","file_tag_id","placement","bytesToSize","GridItem","folderURL","ReactDom","document","getElementById","ImageDialog","imageTitle","mainSrc","nextSrc","prevSrc","onCloseRequest","onMovePrevRequest","onMoveNextRequest","imagePadding","imageLoadErrorMessage","prevLabel","nextLabel","closeLabel","zoomInLabel","zoomOutLabel","ListTaggedFilesDialog","onFileTagChanged","TaggedFile","parent_path","filename","direntPath","onDeleteTaggedFile","taggedFile","fileTagID","deleteFileTag","getTaggedFiles","updateUsedRepoTags","file_deleted","currentTag","getShareLinkTaggedFiles","listTaggedFiles","taggedFileList","tagged_files","maxWidth","onClose","onMouseEnter","active","onMouseLeave","deleteFile","rel","unix","Draft","created","created_at","createdStr","ownerNickname","owner_nickname","originRepoID","origin_repo_id","draftFilePath","draft_file_path","ListRepoDraftsDialog","onDeleteDraftItem","draft","editorUtilities","deleteDraft","drafts","listRepoDrafts","draftItem","DraftItem","getFileName","ReadmeDialog","readmeContent","getFileDownloadLink","filePath","getFileContent","markdownContent","showTOC","scriptSource","RepoInfoBar","onListTaggedFiles","isListTaggedFileShow","onCloseDialog","toggleDrafts","showRepoDrafts","toggleReadme","showReadmeDialog","readmeMarkdown","draftCounts","CopyMoveDirentProgressDialog","progressStyle","lineHeight","textAlign","minHeight"],"mappings":"4HAAA,uHAKA,SAASA,EAAQC,EAAQC,GAAkB,IAAIC,EAAOC,OAAOD,KAAKF,GAAS,GAAIG,OAAOC,sBAAuB,CAAE,IAAIC,EAAUF,OAAOC,sBAAsBJ,GAAaC,IAAgBI,EAAUA,EAAQC,QAAO,SAAUC,GAAO,OAAOJ,OAAOK,yBAAyBR,EAAQO,GAAKE,UAAY,KAAIP,EAAKQ,KAAKC,MAAMT,EAAMG,EAAU,CAAE,OAAOH,CAAM,CAQpV,IAAIU,EAAW,CAAC,eAEZC,EAAmC,SAAUC,GAG/C,SAASD,EAAoBE,GAC3B,IAAIC,EAOJ,OALAA,EAAQF,EAAWG,KAAKC,KAAMH,IAAUG,MAClCC,MAAQ,CACZC,OAAQL,EAAMM,cAAe,GAE/BL,EAAMM,OAASN,EAAMM,OAAOC,KAAKC,YAAuBR,IACjDA,CACT,CAXAS,YAAeZ,EAAqBC,GAapC,IAAIY,EAASb,EAAoBc,UAejC,OAbAD,EAAOJ,OAAS,WACdJ,KAAKU,SAAS,CACZR,QAASF,KAAKC,MAAMC,QAExB,EAEAM,EAAOG,OAAS,WACd,OAAoBC,IAAMC,cAAcC,IAASC,YAAS,CACxDb,OAAQF,KAAKC,MAAMC,OACnBE,OAAQJ,KAAKI,QACZY,YAAKhB,KAAKH,MAAOH,IACtB,EAEOC,CACT,CA9BuC,CA8BrCsB,aAGFtB,EAAoBuB,UAzCpB,SAAuBC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAUC,OAAQF,IAAK,CAAE,IAAIG,EAAyB,MAAhBF,UAAUD,GAAaC,UAAUD,GAAK,CAAC,EAAOA,EAAI,EAAKvC,EAAQI,OAAOsC,IAAS,GAAMC,SAAQ,SAAUC,GAAOC,YAAgBP,EAAQM,EAAKF,EAAOE,GAAO,IAAexC,OAAO0C,0BAA6B1C,OAAO2C,iBAAiBT,EAAQlC,OAAO0C,0BAA0BJ,IAAmB1C,EAAQI,OAAOsC,IAASC,SAAQ,SAAUC,GAAOxC,OAAO4C,eAAeV,EAAQM,EAAKxC,OAAOK,yBAAyBiC,EAAQE,GAAO,GAAM,CAAE,OAAON,CAAQ,CAyCrfW,CAAc,CAC5C3B,YAAa4B,IAAUC,MACtBlB,IAAQI,U,4GC/BPe,E,yGAEEC,EAAiB,kDACrB,WAAYrC,GAAQ,IAAD,EAMf,OANe,qBACjB,cAAMA,IAoCRsC,iBAAmB,WACjB,IAAMC,EAAW,EAAKnC,MAAMmC,SAC5BC,IAAWF,iBAAiBC,GAAUE,MAAK,SAACC,GAC1C,IAAMC,EAAOD,EAAIC,KACE,GAAfA,EAAKC,QACPC,cAAcT,GACd,EAAKvB,SAAS,CACZiC,WAAW,EACXC,SAAUJ,EAAKK,kBAGjB,EAAKnC,SAAS,CACZoC,YAA2B,GAAdN,EAAKO,MAAa,QAAUP,EAAKQ,OAAOR,EAAKO,MAAM,KAAKE,QAAQ,GAAK,MAEhFT,EAAY,OAAKA,EAAa,SAChCE,cAAcT,GACd,EAAKpC,MAAMqD,eACXC,SAASC,KAAI,UAAMC,KAAc,eAAOjB,IAG9C,IAAGkB,OAAM,SAACC,GACRb,cAAcT,GACd,IAAIW,EAAWY,IAAMC,YAAYF,GACjC,EAAK7C,SAAS,CACZiC,WAAW,EACXC,SAAUA,GAEd,GACF,EAAC,EAEDc,cAAgB,WACd,IAAMtB,EAAW,EAAKnC,MAAMmC,SAC5BC,IAAWqB,cAActB,GAAUE,MAAK,SAACC,GACzC,IACGe,OAAM,SAACC,GACV,GAEF,EAAC,EAEDL,aAAe,WACb,IAAMJ,EAAc,EAAK7C,MAAM6C,YAC3BA,GAA8B,QAAfA,IACjBJ,cAAcT,GACd,EAAKyB,iBAEP,EAAK7D,MAAMqD,cACb,EAjFE,EAAKjD,MAAQ,CACX0C,WAAW,EACXC,SAAU,GACVE,YAAa,MACb,CACJ,CAuFC,OAvFA,8CAED,WAAqB,IAAD,SACsB9C,KAAKH,MAArC8D,EAAK,EAALA,MAAOC,EAAI,EAAJA,KAAMC,EAAM,EAANA,OAAQ1C,EAAM,EAANA,QAEzBwC,EACWxC,EAAOG,OAClBe,IAAWyB,2BAA2BH,EAAOC,EAAMzC,GACnDkB,IAAW0B,oBAAoBJ,EAAOC,GAE3BvB,IAAW2B,YAAYH,EAAQD,EAAMzC,IAEzCmB,MAAK,SAACC,GACf,IAAMH,EAAWG,EAAIC,KAAgB,UACrC,EAAK9B,SAAS,CACZiC,WAAW,EACXC,SAAU,GACVR,SAAUA,IAEZ,EAAKD,mBACLF,EAAWgC,YAAY,EAAK9B,iBAAkB,IAChD,IAAGmB,OAAM,SAACC,GACR,IAAIX,EAAWY,IAAMC,YAAYF,GACjC,EAAK7C,SAAS,CACZiC,WAAW,EACXC,SAAUA,GAEd,GACF,GAAC,oBAkDD,WACE,OACE,eAAC,IAAK,CAAC1C,QAAQ,EAAME,OAAQJ,KAAKkD,aAAa,UAC7C,cAAC,IAAW,CAAC9C,OAAQJ,KAAKkD,aAAa,SAAEgB,aAAQ,cACjD,cAAC,IAAS,UACR,cAACC,EAAO,CAAC3B,KAAMxC,KAAKC,YAI5B,KAAC,EA/FoB,CAASW,IAAMK,WAkGhCkD,EAAO,kHAcV,OAdU,mCAEX,WAAU,IAAD,EACoCnE,KAAKH,MAAM2C,KAA/CG,EAAS,EAATA,UAAWC,EAAQ,EAARA,SAAUE,EAAW,EAAXA,YAE5B,OAAIH,EACK,cAAC,IAAO,IAGbC,EACK,mBAAGwB,UAAU,yBAAwB,SAAExB,IAGzC,mBAAGwB,UAAU,mBAAkB,mBAAKF,aAAQ,gBAAe,YAAIpB,IACxE,KAAC,EAdU,CAASlC,IAAMK,WAmBbiB,K,sUC/HTmC,EAAmB,YACnBC,EAAe,QACfC,EAAkB,WAClBC,EAAkB,WAoITC,EAlIK,kDAElB,WAAY5E,GAAQ,IAAD,EAIf,OAJe,qBACjB,cAAMA,IAyBR6E,eAAiB,SAACC,GAChBA,EAAEC,iBACF,EAAK/E,MAAM6E,eAAe,EAAK7E,MAAMgF,cACvC,EAAC,EAEDC,cAAgB,SAACH,GACfA,EAAEC,iBACF,EAAK/E,MAAMiF,cAAc,EAAKjF,MAAMgF,cACtC,EAAC,EAEDE,eAAiB,SAACC,GAChB,MAAoB,kBAATA,EACF,GAELA,GAAQ,KACFA,EAAI,KAAyB/B,QAAQ,GAAK,KAEhD+B,GAAQ,KACFA,EAAI,KAAkB/B,QAAQ,GAAK,KAEzC+B,GAAQ,KACFA,EAAO,KAAM/B,QAAQ,GAAK,KAE7B+B,EAAK/B,QAAQ,GAAK,IAC3B,EAhDE,EAAKhD,MAAQ,CACXgF,YAAaZ,GACb,CACJ,CAsHC,OAtHA,sDAED,SAA0Ba,GAAY,IAC9BL,EAAkBK,EAAlBL,cACFI,EAAcZ,EAEdQ,EAActB,MAChB0B,EAAcX,GAEsB,IAAhCO,EAAcM,eAAwBN,EAAcO,UACtDH,EAAcV,GAGZM,EAAcO,UAChBH,EAAcT,IAIlBxE,KAAKU,SAAS,CAACuE,YAAaA,GAC9B,GAAC,oBA4BD,WAAU,IACFJ,EAAkB7E,KAAKH,MAAvBgF,cACFQ,EAAWC,KAAKC,MAAiC,IAA3BV,EAAcQ,YACpC9B,EAAQsB,EAActB,MAEpBiC,EAAWX,EAAcY,YACzBT,EAAOhF,KAAK+E,eAAeF,EAAcG,MAE/C,OACE,qBAAIZ,UAAU,mBAAkB,UAC9B,oBAAIA,UAAU,cAAa,SACzB,qBAAKA,UAAU,WAAWsB,MAAOF,EAAS,SAAEA,MAE9C,oBAAIpB,UAAU,WAAU,SACtB,sBAAMA,UAAU,YAAYsB,MAAOV,EAAK,SAAEA,MAE5C,qBAAIZ,UAAU,2BAA0B,WACpCpE,KAAKC,MAAMgF,cAAgBZ,GAAoBrE,KAAKC,MAAMgF,cAAgBV,IAC1E,eAAC,WAAQ,WACNM,EAAcG,MAAS,KACtB,eAAC,WAAQ,WACNH,EAAcc,eACb,sBAAKvB,UAAU,qBAAoB,UACjC,qBAAKA,UAAU,WAAU,SACvB,qBAAKA,UAAU,eAAewB,KAAK,cAAcC,MAAO,CAACC,MAAM,GAAD,OAAKT,EAAQ,MAAM,gBAAeA,EAAU,gBAAc,IAAI,gBAAc,WAEzG,IAAjCR,EAAcM,eAAyB,qBAAKf,UAAU,gBAAe,SAAEF,aAAQ,4BAC/EW,EAAcM,cAAgB,GAAM,sBAAKf,UAAU,gBAAe,UAAEF,aAAQ,aAAc,IAAKV,IAAMuC,WAAWlB,EAAcM,kBAC9F,IAAhCN,EAAcM,eAAwB,qBAAKf,UAAU,gBAAe,SAAEF,aAAQ,qBAGlFW,EAAcc,eACd,qBAAKvB,UAAU,+CAA8C,SAC3D,qBAAKA,UAAU,WAAU,SACvB,qBAAKA,UAAU,eAAewB,KAAK,cAAcC,MAAO,CAACC,MAAM,GAAD,OAAKT,EAAQ,MAAM,gBAAeA,EAAU,gBAAc,IAAI,gBAAc,eAMlJR,EAAcG,KAAQ,KACtB,qBAAKZ,UAAU,+CAA8C,SAC3D,qBAAKA,UAAU,WAAU,SACvB,qBAAKA,UAAU,eAAewB,KAAK,cAAcC,MAAO,CAACC,MAAM,GAAD,OAAKT,EAAQ,MAAM,gBAAeA,EAAU,gBAAc,IAAI,gBAAc,eAMnJrF,KAAKC,MAAMgF,cAAgBX,GAC1B,qBAAKF,UAAU,2BAA2B4B,wBAAyB,CAACC,OAAQ1C,QAGhF,oBAAIa,UAAU,4BAA2B,SACvC,eAAC,WAAQ,WACNpE,KAAKC,MAAMgF,cAAgBZ,GAC1B,mBAAGjB,KAAK,IAAI8C,QAASlG,KAAK0E,eAAe,SAAER,aAAQ,YAEpDlE,KAAKC,MAAMgF,cAAgBX,GAC1B,mBAAGlB,KAAK,IAAI8C,QAASlG,KAAK8E,cAAc,SAAEZ,aAAQ,WAEnDlE,KAAKC,MAAMgF,cAAgBV,GAC1B,sBAAMH,UAAU,SAAQ,SAAEF,aAAQ,eAEnClE,KAAKC,MAAMgF,cAAgBT,GAC1B,sBAAMJ,UAAU,WAAU,SAAEF,aAAQ,qBAMhD,KAAC,EA7HiB,CAAStD,IAAMK,WCR7BkF,EAAoB,kHAcvB,OAduB,mCAExB,WAAU,IACFC,EAASpG,KAAKH,MAAduG,KACFC,EAAMnC,aAAQ,gDAAgDoC,QAAQ,gBAAiBC,MAC3F,OACE,qBAAInC,UAAU,mBAAkB,UAC9B,oBAAIA,UAAU,cAAa,SACzB,qBAAKA,UAAU,WAAWsB,MAAOU,EAAKI,KAAK,SAAEJ,EAAKI,SAGpD,oBAAIC,QAAS,EAAGrC,UAAU,QAAO,SAAEiC,MAGzC,KAAC,EAduB,CAASzF,IAAMK,WAmB1BkF,IC8FAO,EApGW,kDAExB,WAAY7G,GAAQ,IAAD,EAIf,OAJe,qBACjB,cAAMA,IAMR8G,qBAAuB,WACrB,EAAK9G,MAAM8G,sBACb,EAAC,EAEDC,iBAAmB,SAACjC,GAClBA,EAAEkC,YAAYC,2BACd,EAAKpG,SAAS,CAACqG,aAAc,EAAK9G,MAAM8G,aAC1C,EAAC,EAEDC,cAAgB,SAACrC,GACfA,EAAEkC,YAAYC,2BACd,EAAKjH,MAAMoH,qBACb,EAjBE,EAAKhH,MAAQ,CACX8G,aAAa,GACb,CACJ,CAwFC,OAxFA,mCAgBD,WAAU,IAAD,OAEHG,EAAgB1D,IAAM2D,cAAcnH,KAAKH,MAAMqH,eAC/CE,EAAkBlD,aAAQ,eAC1BmD,EAAmBnD,aAAQ,qBAAuB,IAAMlE,KAAKH,MAAMyH,cAAgB,MAAQJ,EAAgB,IAE3GK,EAAoB,sBAAMnD,UAAU,iBAAiB8B,QAASlG,KAAK4G,mBAEnEY,EACF,eAAC,WAAQ,WACP,sBAAMpD,UAAU,iBAAiB8B,QAASlG,KAAK4G,mBAC/C,sBAAMxC,UAAU,cAAc8B,QAASlG,KAAKgH,mBAE9C,EAEuDhH,KAAKH,MAAxDyH,EAAa,EAAbA,cAAeG,EAAgB,EAAhBA,iBAAkBC,EAAa,EAAbA,cAEvC,OACE,sBAAKtD,UAAU,4BAA4ByB,MAAO,CAAC8B,OAAQ3H,KAAKC,MAAM8G,YAAc,UAAY,SAAS,UACvG,sBAAK3C,UAAU,uBAAsB,UACnC,qBAAKA,UAAU,QAAO,SACD,MAAlBkD,EAAwBF,EAAkBC,IAE7C,qBAAKjD,UAAU,mBAAkB,SACZ,MAAlBkD,GAA0BG,EAAmBD,EAAkBD,OAGpE,sBAAKnD,UAAU,wBAAuB,UACpC,sBAAKA,UAAU,kBAAiB,UAC7BsD,EAAcpG,OAAS,EACtB,sBAAM8C,UAAU,iBAAiB8B,QAASlG,KAAKH,MAAM+H,iBAAiB,SAAE1D,aAAQ,eAEhF,sBAAME,UAAU,+BAA8B,SAAEF,aAAQ,eAExDuD,EAGA,sBAAMrD,UAAU,oCAAmC,SAAGF,aAAQ,gBAF9D,sBAAME,UAAU,sBAAsB8B,QAASlG,KAAK2G,qBAAqB,SAAEzC,aAAQ,mBAKvF,wBAAOE,UAAU,qBAAoB,UACnC,gCACE,+BACE,oBAAI0B,MAAM,MAAK,SAAE5B,aAAQ,UACzB,oBAAI4B,MAAM,MAAK,SAAE5B,aAAQ,UACzB,oBAAI4B,MAAM,MAAK,SAAE5B,aAAQ,cACzB,oBAAI4B,MAAM,MAAK,SAAE5B,aAAQ,gBAG7B,kCAEIlE,KAAKH,MAAMgI,qBAAqBC,KAAI,SAAC1B,EAAM2B,GACzC,OAAQ,cAAC,EAAoB,CAAa3B,KAAMA,GAAb2B,EACrC,IAGA/H,KAAKH,MAAMmI,eAAeF,KAAI,SAACjD,EAAekD,GAC5C,OACE,cAAC,EAAc,CAEblD,cAAeA,EACfH,eAAgB,EAAK7E,MAAM6E,eAC3BI,cAAe,EAAKjF,MAAMiF,eAHrBiD,EAMX,eAOd,KAAC,EA/FuB,CAASnH,IAAMK,WCYnCgH,G,OAAY,kDAEhB,WAAYpI,GAAQ,IAAD,EAsBe,OAtBf,qBACjB,cAAMA,IAuDRqI,qBAAuB,WACrBC,OAAOC,eAAiB,MACO,IAA3B,EAAKvI,MAAMwI,aACb,EAAKC,UAAUC,uBAEnB,EAAC,EAEDH,eAAiB,WACf,GAAID,OAAOK,UACPL,OAAOK,SAASC,4BACkB,MAAlCN,OAAOK,SAASlB,cAClB,MAAO,EAEX,EAAC,EAEDoB,oBAAsB,WAAO,IAAD,EACgC,EAAK7I,MAAzD8I,EAAwB,EAAxBA,yBAA0BC,EAAqB,EAArBA,sBAE5B,EAAKC,wBACP,EAAKP,UAAUQ,KAAKD,sBAAwB,EAAKA,uBAG/CF,IACF,EAAKL,UAAUQ,KAAKH,yBAA2B,EAAK9I,MAAM8I,0BAGxD,EAAKI,2BACP,EAAKT,UAAUQ,KAAKC,yBAA2B,EAAKA,0BAGlDH,IACF,EAAKN,UAAUQ,KAAKF,sBAAwB,EAAK/I,MAAM+I,sBAG3D,EAAC,EAEDI,iBAAmB,WACjB,EAAKV,UAAUW,GAAG,mBAAoB,EAAKC,mBAAmB7I,KAAK,iBACnE,EAAKiI,UAAUW,GAAG,YAAa,EAAKE,YAAY9I,KAAK,iBACrD,EAAKiI,UAAUW,GAAG,qBAAsB,EAAKG,mBAAmB/I,KAAK,iBACrE,EAAKiI,UAAUW,GAAG,eAAgB,EAAKI,eAAehJ,KAAK,iBAC3D,EAAKiI,UAAUW,GAAG,cAAe,EAAKK,oBAAoBjJ,KAAK,iBAC/D,EAAKiI,UAAUW,GAAG,WAAY,EAAKM,WAAWlJ,KAAK,iBACnD,EAAKiI,UAAUW,GAAG,WAAY,EAAKO,WAAWnJ,KAAK,iBACnD,EAAKiI,UAAUW,GAAG,QAAS,EAAKQ,QAAQpJ,KAAK,iBAC7C,EAAKiI,UAAUW,GAAG,YAAa,EAAKS,YAAYrJ,KAAK,iBACrD,EAAKiI,UAAUW,GAAG,YAAa,EAAKU,YAAYtJ,KAAK,iBACrD,EAAKiI,UAAUW,GAAG,QAAS,EAAKW,QAAQvJ,KAAK,iBAC7C,EAAKiI,UAAUW,GAAG,eAAgB,EAAKY,eAAexJ,KAAK,iBAC3D,EAAKiI,UAAUW,GAAG,SAAU,EAAKa,SAASzJ,KAAK,iBAC/C,EAAKiI,UAAUW,GAAG,YAAa,EAAKc,YAAY1J,KAAK,gBACvD,EAAC,EAEDwI,sBAAwB,SAACmB,EAAOC,GAC9B,IAAIC,EAAWC,KACXC,EAAUlG,aAAQ,0DACtBkG,EAAUA,EAAQ9D,QAAQ,aAAc4D,GACxCG,IAAQC,OAAOF,EACjB,EAAC,EAEDrB,yBAA2B,SAAC3C,GAAU,IAC9ByB,EAAyB,EAAK5H,MAA9B4H,qBACNA,EAAqBrI,KAAK4G,GAC1B,EAAK1F,SAAS,CAACmH,qBAAsBA,GACvC,EAAC,EAEDqB,mBAAqB,SAACrE,IAGK,IADF,EAAK5E,MAAMwH,kBAEhC,EAAK/G,SAAS,CAAC+G,kBAAkB,IAInC,IAAI7D,EAA2B,MAApB,EAAK/D,MAAM+D,KAAe,IAAM,EAAK/D,MAAM+D,KAAO,IACzD4B,EAAWX,EAAcW,SACzB+E,EAAe1F,EAAc0F,aAC7BC,EAAShF,IAAa+E,EAI1B,GADA1F,EAAc4F,SAAW,CAAC,EACtBD,EACF3F,EAAc4F,SAAY,CACxBC,WAAY9G,OAET,CACL,IAAI+G,EAAgBJ,EAAaK,MAAM,EAAGL,EAAaM,YAAY,KAAO,GAC1EhG,EAAc4F,SAAY,CACxBC,WAAY9G,EACZ+G,cAAeA,EAEnB,CACF,EAAC,EAEDxB,YAAc,SAACtE,EAAemF,GAG5B,GAFanF,EAAcW,WAAaX,EAAc0F,cAEvB,IAAjBP,EAAM1I,OAAc,CAiB9B,EAAKwJ,kBAAkB,EAAKxC,UAAU0B,OAAO,MACf,EAAKnK,MAA7B8D,EAAK,EAALA,MAAO4G,EAAY,EAAZA,aACblI,IAAW0I,2BAA2BpH,EAAO4G,GAAcjI,MAAK,SAAAC,GAC9D,EAAK+F,UAAUQ,KAAK3H,OAASoB,EAAIC,KAAKwI,YAAc,cACpD,EAAKC,gBAAgBpG,EACvB,IAAGvB,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,GAEJ,MAEE,GADA,EAAKJ,kBAAkB,EAAKxC,UAAU0B,QACjC,EAAKmB,mBAAoB,CAC5B,EAAKA,oBAAqB,EAAK,MACD,EAAKtL,MAA7B8D,EAAK,EAALA,MAAO4G,EAAY,EAAZA,aACblI,IAAW0I,2BAA2BpH,EAAO4G,GAAcjI,MAAK,SAAAC,GAC9D,EAAK+F,UAAUQ,KAAK3H,OAASoB,EAAIC,KAAKwI,YAAc,cACpD,EAAK1C,UAAU8C,QACjB,IAAG9H,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,GACF,CAEJ,EAAC,EAEDD,gBAAkB,SAACpG,GAAmB,IAAD,EACZ,EAAKhF,MAAtBgE,EAAM,EAANA,OAAQD,EAAI,EAAJA,KACdvB,IAAWgJ,qBAAqBxH,EAAQD,EAAMiB,EAAcW,UAAUlD,MAAK,SAAAC,GACzE,IAAI+I,EAAgB/I,EAAIC,KAAK8I,cACzBC,EAAqD,KAAzCC,SAASC,MAAuC,MAAQ,QACpEC,EAASpG,KAAKqG,MAAML,EAAgBC,GACxC1G,EAAc+G,oBAAoBF,GAClC,EAAKpD,UAAU8C,QACjB,IAAG9H,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,GACF,EAAC,EAED9B,mBAAqB,SAACd,EAAW0B,GACA,EAAK/J,MAA9B4H,qBACmBvG,OAAS,GAAsB,IAAjB0I,EAAM1I,QAC3C,EAAKZ,SAAS,CACZ+H,4BAA4B,EAC5BnB,cAAe,KAGrB,EAAC,EAEDwD,kBAAoB,WAClB,IAAI9C,EAAiB,EAAKM,UAAU0B,MACpC,EAAKtJ,SAAS,CACZsH,eAAgBA,EAChBS,4BAA4B,IAE9BjF,IAAMqI,uBAAuB,WAAY,8BAA8B,EACzE,EAAC,EAEDxC,eAAiB,SAACxE,GAChB,IAAIqC,EAAgB,EAAK4E,aACrB9D,EAAiB,EAAK/H,MAAM+H,eAAeF,KAAI,SAAAiE,GACjD,GAAIA,EAAKC,mBAAqBnH,EAAcmH,kBACtC9E,EAAe,CACjB,IAAI+E,EAAyD,GAA7CF,EAAK/G,KAAQ+G,EAAK/G,KAAO+G,EAAK1G,YAC1C6G,EAAO5G,KAAKqG,MAAMM,EAAW/E,GACjC6E,EAAK5G,cAAgB+G,CACvB,CAEF,OAAOH,CACT,IAEA,EAAKrL,SAAS,CACZwG,cAAeA,EACfc,eAAgBA,GAEpB,EAAC,EAED8D,WAAa,WACX,IAAIK,EAAS,EACTjF,EAAgB,EAChBkF,GAAM,IAAIC,MAAOC,UAMrB,GAJA,EAAKhE,UAAU0B,MAAMxI,SAAQ,SAAA4E,GAC3B+F,GAAU/F,EAAKf,WAAae,EAAKpB,IACnC,IAEI,EAAKuH,UAAW,CAClB,IAAIC,EAAYJ,EAAM,EAAKG,UAC3B,GAAIC,EAAW,EAAKC,gBAClB,OAAO,EAAKxM,MAAMiH,eAKhBiF,EAAS,EAAKA,QAA0B,IAAhB,EAAKA,UAC/B,EAAKA,OAASA,GAGhBjF,GAAiBiF,EAAS,EAAKA,SAAW,IAAOK,GAAY,CAC/D,CAKA,OAHA,EAAKD,UAAYH,EACjB,EAAKD,OAASA,EAEPjF,CACT,EAAC,EAEDqC,WAAa,WACX,IAAIlE,EAAWC,KAAKC,MAAkC,IAA5B,EAAK+C,UAAUjD,YACzC,EAAK3E,SAAS,CAAC4G,cAAejC,IAC9B7B,IAAMqI,uBAAuB,WAAY,gBAAiBxG,EAC5D,EAAC,EAEDiE,oBAAsB,SAACzE,EAAeuF,GACpC,IAAIK,EAAW5F,EAAc4F,SACzBiC,GAAc,IAAIL,MAAOC,UAAU,IACvClC,EAAUK,EAASnE,QAAU8D,EAAUuC,KAAKC,MAAMxC,GAAS,GACvDK,EAASE,cA2Db,IAAIkC,EAAS,CACXC,GAAI1C,EAAQ0C,GACZC,KAAM,OACNvG,KAAM4D,EAAQ5D,KACdxB,KAAMoF,EAAQpF,KACdgI,MAAON,GAET,EAAK7M,MAAMyJ,oBAAoBuD,GAE/B,IAAI7E,EAAiB,EAAK/H,MAAM+H,eAAeF,KAAI,SAAAiE,GAKjD,OAJIA,EAAKC,mBAAqBnH,EAAcmH,mBAC1CD,EAAKtG,YAAc2E,EAAQ5D,KAC3BuF,EAAK3G,SAAU,GAEV2G,CACT,IACA,EAAKrL,SAAS,CAACsH,eAAgBA,GACjC,EAAC,EAED2B,YAAc,SAAC9E,EAAeuF,GAC5B,IAAI7G,EAAQ,GACZ,GAAK6G,EAEE,CAEL,IAAI6C,EAAe7C,EAAQ9D,QAAQ,MAAO,IAC1C2G,EAAgBN,KAAKC,MAAMK,GAEb,4BADd1J,EAAQ0J,EAAa1J,SAEnBA,EAAQW,aAAQ,8BAEJ,oBAAVX,IACFA,EAAQW,aAAQ,yBAEpB,MAZEX,EAAQW,aAAQ,iBAclB,IAAI8D,EAAiB,EAAK/H,MAAM+H,eAAeF,KAAI,SAAAiE,GAKjD,OAJIA,EAAKC,mBAAqBnH,EAAcmH,mBAC1C,EAAK/L,MAAMyH,cAAclI,KAAKuM,GAC9BA,EAAKxI,MAAQA,GAERwI,CACT,IAEA,EAAKI,OAAS,EACd,EAAKzL,SAAS,CACZgH,cAAe,EAAKzH,MAAMyH,cAC1BM,eAAgBA,GAGpB,EAAC,EAEDwB,WAAa,WACX,EAAK0D,gBAAkB,GAEvB,EAAK/B,oBAAqB,EAC1B,EAAKzK,SAAS,CAAC+G,kBAAkB,GACnC,EAAC,EAEDgC,QAAU,WAEV,EAAC,EAEDG,QAAU,SAACQ,GAET,EAAKe,oBAAqB,EAE1B3H,IAAMqI,uBAAuB,WAAY,gBAAiB,IAC5D,EAAC,EAEDnC,YAAc,WACZ,EACD,EAEDG,eAAiB,WACf,EACD,EAEDC,SAAW,WAEX,EAAC,EAEDqD,WAAa,SAACtI,EAAeyD,GAC3B,IAAIoD,EAASpD,EAAUoD,OACnB0B,EAAY9E,EAAU+E,OAAO,aAC7BC,EAAkC,IAAvBzI,EAAcG,KAAa,EAAIH,EAAcG,KACxDuI,EAAuB,IAAX7B,EAAeA,EAAS0B,EAAY,EAChDI,EAAUlI,KAAKmI,IAAIH,GAAW5B,EAAS,GAAK0B,GAAa,EAY7D,OAVIE,EAAWhF,EAAUkF,QAAUJ,IAAc9E,EAAU+E,OAAO,oBAChEG,EAAUF,GAGE,CACZ,OAAU,iDACV,sBAAuB,yBAA2BI,UAAU7I,EAAcW,UAAY,IACtF,gBAAiB,SAAW+H,EAAY,IAAMC,EAAU,IAAMF,EAIlE,EAAC,EAEDK,SAAW,SAAC9I,GAEV,OADeA,EAAc4F,QAE/B,EAAC,EAEDmD,yBAA2B,SAACxH,GAC1B,IAAImE,EAAenE,EAAKyH,oBAAoBzH,EAAKmE,cAAcnE,EAAKZ,UAAUY,EAAKI,KACnF,OAAOsH,IAAIvD,EAAe,IAAI8B,MAAU9B,CAC1C,EAAC,EAEDrE,QAAU,SAACvB,GACTA,EAAEkC,YAAYC,2BACdnC,EAAEoJ,iBACJ,EAAC,EAEDC,aAAe,WACb,EAAKC,YAAYC,QAAQC,gBAAgB,mBAEzC,EAAKF,YAAYC,QAAQE,OAC3B,EAAC,EAEDC,eAAiB,WACf,EAAKJ,YAAYC,QAAQI,aAAa,kBAAmB,mBACzD,EAAKL,YAAYC,QAAQE,OAC3B,EAAC,EAEDrE,YAAc,WACZ,EAAKkE,YAAYC,QAAQI,aAAa,kBAAmB,kBAC3D,EAAC,EAEDrH,oBAAsB,WACpB,EAAKkF,OAAS,EACd,EAAK7D,UAAU0B,MAAQ,GAEvB,EAAKmB,oBAAqB,EAC1B,EAAKzK,SAAS,CAAC+H,4BAA4B,EAAOT,eAAgB,GAAIH,qBAAsB,KAC5FrE,IAAMqI,uBAAuB,WAAY,8BAA8B,EACzE,EAAC,EAEDnH,eAAiB,SAAC6J,GAEhB,IAAIvG,EAAiB,EAAK/H,MAAM+H,eAAe5I,QAAO,SAAA2M,GACpD,OAAIA,EAAKC,mBAAqBuC,EAAcvC,mBAC1CD,EAAKyC,UACE,EAGX,IAEK,EAAKlG,UAAU3C,gBAClB,EAAKjF,SAAS,CACZ4G,cAAe,MACfG,kBAAkB,IAEpB,EAAK0E,OAAS,GAGhB,EAAKzL,SAAS,CAACsH,eAAgBA,GACjC,EAAC,EAEDrB,qBAAuB,WACrB,IAAIqB,EAAiB,EAAK/H,MAAM+H,eAAe5I,QAAO,SAAA2M,GACpD,OAAIzG,KAAKC,MAA0B,IAApBwG,EAAK1G,cAClB0G,EAAKyC,UACE,EAGX,IAEA,EAAKrC,OAAS,EAEd,EAAKzL,SAAS,CACZ+G,kBAAkB,EAClBH,cAAe,MACfU,eAAgBA,IAGlB,EAAKmD,oBAAqB,CAC5B,EAAC,EAEDrG,cAAgB,SAACD,GAAmB,IAAD,EAEH,EAAKhF,MAA7B8D,EAAK,EAALA,MAAO4G,EAAY,EAAZA,aACblI,IAAW0I,2BAA2BpH,EAAO4G,GAAcjI,MAAK,SAAAC,GAC9D,EAAK+F,UAAUQ,KAAK3H,OAASoB,EAAIC,KAAKwI,YAAc,cAEpD,IAAItD,EAAgB,EAAKzH,MAAMyH,cAActI,QAAO,SAAA2M,GAClD,OAAOA,EAAKC,mBAAqBnH,EAAcmH,gBACjD,IACIhE,EAAiB,EAAK/H,MAAM+H,eAAeF,KAAI,SAAAiE,GAKjD,OAJIA,EAAKC,mBAAqBnH,EAAcmH,mBAC1CD,EAAKxI,MAAQ,KACb,EAAKkL,gBAAgB1C,IAEhBA,CACT,IAEA,EAAKrL,SAAS,CACZgH,cAAeA,EACfM,eAAgBA,GAEpB,IAAG1E,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,GACF,EAAC,EAEDtD,iBAAmB,WAAO,IAAD,EAEO,EAAK/H,MAA7B8D,EAAK,EAALA,MAAO4G,EAAY,EAAZA,aACblI,IAAW0I,2BAA2BpH,EAAO4G,GAAcjI,MAAK,SAAAC,GAC9D,EAAK+F,UAAUQ,KAAK3H,OAASoB,EAAIC,KAAKwI,YAAc,cACpD,EAAK/K,MAAMyH,cAAclG,SAAQ,SAAAuK,GAC/BA,EAAKxI,OAAQ,EACb,EAAKkL,gBAAgB1C,EACvB,IAEA,IAAI/D,EAAiB,EAAK/H,MAAM+H,eAAe4C,MAAM,GACrD,EAAKlK,SAAS,CACZgH,cAAe,GACfM,eAAgBA,GAGpB,IAAG1E,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,GACF,EAAC,EAEDuD,gBAAkB,SAAC5J,GAAmB,IAAD,EACZ,EAAKhF,MAAtBgE,EAAM,EAANA,OAAQD,EAAI,EAAJA,KACV4B,EAAWX,EAAcW,SAE7B,KADaX,EAAcW,WAAaX,EAAc0F,cACzC,CACX,IAAII,EAAgB9F,EAAc4F,SAASE,cAE3CnF,GADsB,MAAT5B,EAAgBA,EAAO+G,EAAkB/G,EAAO,IAAM+G,GAC/CnF,CACtB,CAEAX,EAAc6J,YACd,IAAIC,GAAa,EACjB9J,EAAc+J,aAAa3F,GAAG,oBAAoB,WAC5C0F,GACFtM,IAAWgJ,qBAAqBxH,EAAQD,EAAM4B,GAAUlD,MAAK,SAAAC,GAC3D,IAAI+I,EAAgB/I,EAAIC,KAAK8I,cACzBC,EAAqD,KAAzCC,SAASC,MAAuC,MAAQ,QACpEC,EAASpG,KAAKqG,MAAML,EAAgBC,GACxC1G,EAAc+G,oBAAoBF,GAElC7G,EAAc+J,aAAaxD,QAE7B,IAAG9H,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,IAEFyD,GAAa,CACf,GACF,EAAC,EAEDE,WAAa,WACX,IAAIhK,EAAgB,EAAKyD,UAAU0B,MAAM,EAAK1B,UAAU0B,MAAM1I,OAAS,GAAG,EAE5C,EAAKzB,MAA7B8D,EAAK,EAALA,MAAO4G,EAAY,EAAZA,aACblI,IAAW0I,2BAA2BpH,EAAO4G,GAAcjI,MAAK,SAAAC,GAC9D,EAAK+F,UAAUQ,KAAK3H,OAASoB,EAAIC,KAAKwI,YAAc,cACpD,EAAKtK,SAAS,CACZoO,0BAA0B,EAC1BrG,4BAA4B,EAC5BT,eAAe,GAAD,mBAAM,EAAK/H,MAAM+H,gBAAc,CAAEnD,MAC9C,WACD,EAAKyD,UAAU8C,QACjB,IACA5H,IAAMqI,uBAAuB,WAAY,8BAA8B,EAEzE,IAAGvI,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,GACF,EAAC,EAED6D,iBAAmB,WACjB,EAAKzG,UAAU0B,MAAMgF,MACrB,EAAKtO,SAAS,CAACoO,0BAA0B,GAC3C,EAvnBE,EAAK7O,MAAQ,CACXyH,cAAe,GACfM,eAAgB,GAChBH,qBAAsB,GACtBP,cAAe,EACfmB,4BAA4B,EAC5BqG,0BAA0B,EAC1BG,qBAAsB,KACtB/H,cAAe,EACfO,kBAAkB,GAGpB,EAAKwG,YAAcrN,IAAMsO,YAEzB,EAAKhC,gBAAkB,GAEvB,EAAKX,UAAY,KACjB,EAAKJ,OAAS,EACd,EAAKM,gBAAkB,IACvBtE,OAAOC,eAAiB,EAAKA,eAC7B,EAAK+C,oBAAqB,EAAM,CAClC,CA6nBC,OA7nBA,8CAED,WACEnL,KAAKsI,UAAY,IAAI6G,IAAY,CAC/BhO,OAAQ,GACRiO,MAAOpP,KAAK2N,UAAY,CAAC,EACzB0B,SAAUrP,KAAKH,MAAMyP,UACrBpF,SAAUC,WAAiCoF,EAC3CC,YAAiC,IAApBjJ,KAA2B,UAAQgJ,EAChDE,WAAYzP,KAAKH,MAAM4P,YAAc,OACrCC,WAAY1P,KAAKH,MAAM6P,aAAc,EACrCC,QAAS3P,KAAKmN,YAAc,CAAC,EAC7ByC,gBAAiB5P,KAAKH,MAAM+P,kBAAmB,EAC/CxC,UAAoD,KAAzC5B,SAASC,MAAuC,MAAQ,QACnEoE,oBAAqB7P,KAAKH,MAAMgQ,qBAAuB,EACvDC,kBAAmB9P,KAAKH,MAAMiQ,kBAC9BlC,yBAA0B5N,KAAK4N,yBAC/BmC,gBAAgB,EAChBC,gBAAiB,EACjBC,YAAa,IAGfjQ,KAAKsI,UAAU4H,aAAalQ,KAAKiO,YAAYC,SAAS,IAGvB,IAA3BlO,KAAKH,MAAMwI,aACbrI,KAAKsI,UAAU6H,uBAGjBnQ,KAAK0I,sBACL1I,KAAKgJ,kBACP,GAAC,oBAqkBD,WACE,OACE,eAAC,WAAQ,WACP,qBAAK5E,UAAU,0BAAyB,SACtC,qBAAKA,UAAU,gBAAe,SAC5B,uBAAOA,UAAU,eAAe2I,KAAK,OAAOqD,IAAKpQ,KAAKiO,YAAa/H,QAASlG,KAAKkG,cAGpFlG,KAAKC,MAAMwI,4BACV,cAAC,EAAoB,CACnBf,cAAe1H,KAAKC,MAAMyH,cAC1BM,eAAgBhI,KAAKC,MAAM+H,eAC3BH,qBAAsB7H,KAAKC,MAAM4H,qBACjCP,cAAetH,KAAKC,MAAMqH,cAC1BJ,cAAelH,KAAKC,MAAMiH,cAC1BO,iBAAkBzH,KAAKC,MAAMwH,iBAC7BR,oBAAqBjH,KAAKiH,oBAC1BN,qBAAsB3G,KAAK2G,qBAC3BjC,eAAgB1E,KAAK0E,eACrBI,cAAe9E,KAAK8E,cACpB8C,iBAAkB5H,KAAK4H,qBAKjC,KAAC,EAtpBe,CAAShH,IAAMK,YA2pBlBgH,I,oDC3mBAoI,EAjEU,kDAEvB,WAAYxQ,GAAQ,IAAD,EAMf,OANe,qBACjB,cAAMA,IAQRyQ,iBAAmB,WACjB,EAAKzQ,MAAM0Q,oBAAoB,EAAKtQ,MAAMuQ,KAAKC,QAAS,EAAKxQ,MAAMyQ,aACrE,EAAC,EAEDC,kBAAoB,SAACH,EAAME,EAAc7D,GACnB,QAAhBA,EAAOE,KACT,EAAKrM,SAAS,CACZ8P,KAAMA,EACNE,aAAcA,IAIhB,EAAKhQ,SAAS,CACZ8P,KAAM,KACNE,aAAc,IAGpB,EAAC,EAEDE,gBAAkB,SAACJ,GACjB,EAAK9P,SAAS,CACZ8P,KAAMA,EACNE,aAAc,KAElB,EA/BE,EAAKzQ,MAAQ,CACXuQ,KAAM,KACNE,aAAc,GACdxF,WAAY,IACZ,CACJ,CAmDC,OAnDA,mCA4BD,WACE,OACE,eAAC2F,EAAA,EAAK,CAAC3Q,QAAQ,EAAMkE,UAAU,eAAc,UAC3C,cAAC0M,EAAA,EAAW,CAAC1Q,OAAQJ,KAAKH,MAAMkR,aAAa,SAAE7M,aAAQ,cACvD,eAAC8M,EAAA,EAAS,WACR,cAAC,IAAW,CACVC,YAAY,EACZN,kBAAmB3Q,KAAK2Q,kBACxBC,gBAAiB5Q,KAAK4Q,gBACtBM,KAAK,mBAENlR,KAAKC,MAAMiL,YAAc,cAACiG,EAAA,EAAK,CAACC,MAAM,SAAQ,SAAEpR,KAAKC,MAAMiL,gBAE9D,eAACmG,EAAA,EAAW,WACV,cAACC,EAAA,EAAM,CAACF,MAAM,YAAYlL,QAASlG,KAAKH,MAAMkR,aAAa,SAAE7M,aAAQ,YACnElE,KAAKC,MAAMyQ,aACX,cAACY,EAAA,EAAM,CAACF,MAAM,UAAUlL,QAASlG,KAAKsQ,iBAAiB,SAAEpM,aAAQ,YAEjE,cAACoN,EAAA,EAAM,CAACF,MAAM,UAAUG,UAAQ,WAAErN,aAAQ,iBAKpD,KAAC,EA5DsB,CAAStD,IAAMK,W,6CCOxCuQ,IAAOC,OAAOtJ,OAAOuJ,IAAIC,OAAOC,MAEhC,IAAIC,GAAY1J,OAAOuJ,IAAII,YAAYtL,KAAK,GAOxC2B,OAAO4J,OAAOD,YALhBnO,GAAK,GAALA,MAAOqO,GAAO,GAAPA,QAASC,GAAO,GAAPA,QAASC,GAAQ,GAARA,SACzBrO,GAAM,GAANA,OAAQ0G,GAAY,GAAZA,aACR2G,GAAI,GAAJA,KAAMiB,GAAa,GAAbA,cAAenP,GAAM,GAANA,OACrBoP,GAAgB,GAAhBA,iBAAkBC,GAAW,GAAXA,YAClBC,GAAO,GAAPA,QAASC,GAAS,GAATA,UAAWC,GAAoB,GAApBA,qBAGhBC,IAAoBL,IAAoBC,GAExCK,GAAa,kDAEjB,WAAY7S,GAAQ,IAAD,EA8Bf,OA9Be,qBACjB,cAAMA,IA6DR8S,UAAY,SAACC,EAAQC,GACnB,EAAKnS,SAAS,CACZkS,OAAQA,EACRC,UAAWA,EACXC,MAAOtP,IAAMuP,uBAAuB,EAAK9S,MAAM6S,MAAOF,EAAQC,IAElE,EAAC,EAEDG,cAAgB,WACd,IAAIF,EAAQ,EAAK7S,MAAM6S,MAAM1T,QAAO,SAAC2M,GACnC,OAAQA,EAAKkH,SACVzP,IAAM0P,WAAWnH,EAAKoH,YACtBX,IAAwBhP,IAAM4P,WAAWrH,EAAKoH,cAC9CpH,EAAKsH,qBACV,IACA,GAAoB,GAAhBP,EAAMxR,OAAV,CAIA,IAAMgS,EAAMR,EAAMxR,OACZxB,EAAK,gBACQ,SAAfyT,EAAwBnS,GAC1B,IAAMoS,EAAUV,EAAM1R,GACtBiB,IAAWoR,sBAAsB9P,GAAO6P,EAAQE,UAAWvB,IAAe7P,MAAK,SAACC,GAC9EiR,EAAQH,sBAAwB9Q,EAAIC,KAAK6Q,qBAC3C,IAAG/P,OAAM,SAACC,GACR,IACCjB,MAAK,WACFlB,EAAIkS,EAAM,EACZC,IAAenS,GAGftB,EAAMY,SAAS,CACboS,MAAOhT,EAAMG,MAAM6S,OAGzB,GACF,CACAS,CAAa,EArBb,CAsBF,EAAC,EAEDI,WAAa,WACX,OACE,eAAC,IAAMC,SAAQ,WACZ5Q,GAAO8E,KAAI,SAACiE,EAAMhE,GACjB,GAAIA,GAAS/E,GAAO1B,OAAS,EAC3B,OACE,eAAC,IAAMsS,SAAQ,WACb,mBAAGxQ,KAAI,aAAQyQ,mBAAmB9H,EAAKnI,MAAK,iBAASsN,IAAQ9M,UAAU,gBAAgBsB,MAAOqG,EAAKvF,KAAK,SAAEuF,EAAKvF,OAC/G,yCAFmBuB,EAM3B,IAEA,sBAAM3D,UAAU,gBAAgBsB,MAAO1C,GAAOA,GAAO1B,OAAS,GAAGkF,KAAK,SAAExD,GAAOA,GAAO1B,OAAS,GAAGkF,SAGxG,EAAC,EAEDsN,kBAAoB,SAACC,GACdC,KAOH3R,IAAW0B,oBAAoBJ,GAAOoQ,GAAYzR,MAAK,SAACC,GACtD,IAAMH,EAAWG,EAAIC,KAAgB,UACrCW,SAASC,KAAI,UAAMC,KAAc,eAAOjB,EAC1C,IAAGkB,OAAM,SAACC,GACR,IAAIX,EAAWY,IAAMC,YAAYF,GACjC,EAAK7C,SAAS,CACZiC,WAAW,EACXC,SAAUA,GAEd,IAfA,EAAKlC,SAAS,CACZuT,iBAAiB,EACjBC,cAAeH,GAerB,EAAC,EAEDI,yBAA2B,WACzB,GAAKH,KAQA,CACH,IAAI7S,EAAS,EAAKlB,MAAM6S,MAAM1T,QAAO,SAAA2M,GAAI,OAAIA,EAAKqI,UAAU,IAAEtM,KAAI,SAAAiE,GAAI,OAAIA,EAAKoH,WAAapH,EAAKsI,WAAW,IAC5GhS,IAAWyB,2BAA2BH,GAAO4G,GAAcpJ,GAAQmB,MAAK,SAACC,GACvE,IAAMH,EAAWG,EAAIC,KAAgB,UACrCW,SAASC,KAAI,UAAMC,KAAc,eAAOjB,EAC1C,IAAGkB,OAAM,SAACC,GACR,IAAIX,EAAWY,IAAMC,YAAYF,GACjC,EAAK7C,SAAS,CACZiC,WAAW,EACXC,SAAUA,GAEd,GACF,MAnBE,EAAKlC,SAAS,CACZuT,iBAAiB,EACjBC,cAAe3J,GACf+J,cAAe,EAAKrU,MAAM6S,MAAM1T,QAAO,SAAA2M,GAAI,OAAIA,EAAKqI,UAAU,IAC3DtM,KAAI,SAAAiE,GAAI,OAAIA,EAAKoH,WAAapH,EAAKsI,WAAW,KAgBvD,EAAC,EAuCDE,kBAAoB,WAClB,EAAK7T,SAAS,CACZ8T,2BAA2B,EAC3BC,aAAc,EAAKxU,MAAM6S,MAAM1T,QAAO,SAAA2M,GAAI,OAAIA,EAAKqI,UAAU,IAC1DtM,KAAI,SAAAiE,GAAI,OAAIA,EAAKoH,WAAapH,EAAKsI,WAAW,KAErD,EAAC,EAEDK,aAAe,WACb,EAAKhU,SAAS,CACZ8T,2BAA2B,EAC3BC,aAAc,EAAKxU,MAAM6S,MACtBhL,KAAI,SAAAiE,GAAI,OAAIA,EAAKoH,WAAapH,EAAKsI,WAAW,KAErD,EAAC,EAEDM,0BAA4B,WAC1B,EAAKjU,SAAS,CACZ8T,2BAA2B,EAC3BC,aAAc,IAElB,EAAC,EAEDlE,oBAAsB,SAACqE,EAAYC,GAEjC,IAAMJ,EAAe,EAAKxU,MAAMwU,aAEhCpS,IAAWyS,cAAcF,EAAYC,EAASlR,GAAO4G,GAAckK,GAAcnS,MAAK,SAACC,GACrF,EAAK7B,SAAS,CACZ8T,2BAA2B,EAC3BC,aAAc,GACdM,8BAA8B,EAC9BC,oBAAqBzS,EAAIC,KAAKyS,QAC9BC,yBAA0BT,EAAanT,SACtC,WACD,EAAK6T,0BACP,GACF,IAAG7R,OAAM,SAACC,GACR,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC,EAAK7C,SAAS,CAACwK,WAAYA,GAC7B,GACF,EAAC,EAEDkK,uBAAyB,WAEvB,GAA+B,MADE,EAAKnV,MAAhCoV,uBAC8B,CAClC,IAAIC,EAAS,EAAKrV,MAAM+U,oBACxB3S,IAAWkT,wBAAwBD,EACrC,CAEA,EAAK5U,SAAS,CACZ2U,uBAAwB,EACxBN,8BAA8B,GAElC,EAAC,EAEDS,eAAiB,WACf,EAAK9U,SAAS,CACZuT,iBAAiB,EACjBC,cAAe,GACfI,cAAe,IAEnB,EAAC,EAGDmB,iBAAmB,SAAC1J,GAClB,IAAMvF,EAAOuF,EAAKoH,UAEZuC,EAAmB,OADTlP,EAAKmP,OAAOnP,EAAKqE,YAAY,KAAO,GAAG+K,cAIjDC,EAAO,UAAMC,KAAQ,aAAKnS,GAAK,qBAAakQ,mBAAmB9H,EAAK2H,YAO1E,MAAO,CACL,KAAQlN,EACR,IAAOqP,EACP,IATGH,EAGA,UAAMG,EAAO,UAFb,UAAMC,KAAQ,qBAAanS,GAAK,YAAIoS,MAAwB,OAAGvS,IAAMwS,WAAWjK,EAAK2H,YAU5F,EAAC,EAEDuC,eAAiB,SAACzC,GAChB,IAAMV,EAAQ,EAAK7S,MAAM6S,MAAM1T,QAAO,SAAC2M,GACrC,OAAQA,EAAKkH,QAAUzP,IAAM0P,WAAWnH,EAAKoH,UAC/C,IACM+C,EAAapD,EAAMhL,KAAI,SAACiE,GAC5B,OAAO,EAAK0J,iBAAiB1J,EAC/B,IAEA,EAAKrL,SAAS,CACZyV,kBAAkB,EAClBD,WAAYA,EACZE,WAAYtD,EAAMuD,QAAQ7C,IAE9B,EAAC,EAED8C,gBAAkB,WAChB,EAAK5V,SAAS,CACZyV,kBAAkB,GAEtB,EAAC,EAEDI,gBAAkB,WAChB,IAAMC,EAAmB,EAAKvW,MAAMiW,WAAW5U,OAC/C,EAAKZ,UAAS,SAAC+V,GAAS,MAAM,CAC5BL,YAAaK,EAAUL,WAAaI,EAAmB,GAAKA,EAC7D,GACH,EAAC,EAEDE,gBAAkB,WAChB,IAAMF,EAAmB,EAAKvW,MAAMiW,WAAW5U,OAC/C,EAAKZ,UAAS,SAAC+V,GAAS,MAAM,CAC5BL,YAAaK,EAAUL,WAAa,GAAKI,EAC1C,GACH,EAAC,EAEDG,kBAAoB,WAClB,EAAKjW,UAAS,SAAC+V,GAAS,MAAM,CAC5BG,oBAAqBH,EAAUG,mBAC/B9D,MAAO,EAAK7S,MAAM6S,MAAMhL,KAAI,SAACiE,GAE3B,OADAA,EAAKqI,YAAcqC,EAAUG,mBACtB7K,CACT,IACD,GACH,EAAC,EAED8K,mBAAqB,SAACC,EAAY1C,GAChC,EAAK1T,SAAS,CACZoS,MAAO,EAAK7S,MAAM6S,MAAMhL,KAAI,SAACiE,GAI3B,OAHIA,IAAS+K,IACX/K,EAAKqI,WAAaA,GAEbrI,CACT,MACC,WACD,EAAKrL,SAAS,CACZkW,oBAAqB,EAAK3W,MAAM6S,MAAMiE,MAAK,SAAAhL,GAAI,OAAKA,EAAKqI,UAAU,KAEvE,GACF,EAAC,EAED4C,aAAe,SAACrS,GACdA,EAAEkC,YAAYC,2BACd,EAAK0B,SAASwF,cAChB,EAAC,EAED1E,oBAAsB,SAAC2N,GAAkB,IAC/BzQ,EAAeyQ,EAAfzQ,KAAMxB,EAASiS,EAATjS,KACRkS,EAAU,CACd9C,YAAY,EACZjB,UAAW3M,EACXkN,UAAWlQ,IAAM2T,SAAS5M,GAAc/D,GACxCyM,QAAQ,EACRmE,cAAe5F,MAAS6F,SACxBrS,KAAMA,GAEFsS,EAAc,EAAKrX,MAAM6S,MAAM1T,QAAO,SAAA2M,GAAU,OAAOA,EAAKkH,MAAQ,IAEtEH,EAAQyE,MAAMC,KAAK,EAAKvX,MAAM6S,OAClCA,EAAM2E,OAAOH,EAAYhW,OAAQ,EAAG4V,GACpC,EAAKxW,SAAS,CAACoS,MAAOA,IACtBzQ,IAAWqV,qBAAqB/T,GAAOH,IAAM2T,SAASlF,GAASzL,GACjE,EAAC,EAEDmR,qBAAuB,WACrBtV,IAAWsV,qBAAqBhU,IAAOrB,MAAK,SAAAC,GAC1C,IAAIqV,EAAe,GACnBrV,EAAIC,KAAKqV,UAAUrW,SAAQ,SAAAuK,GACzB,IAAI+L,EAAc,IAAIC,KAAQhM,GAC1B+L,EAAYE,UAAY,GAC1BJ,EAAapY,KAAKsY,EAEtB,IACA,EAAKpX,SAAS,CAACkX,aAAcA,IACF,GAAvBA,EAAatW,QAA+B,KAAhBiJ,IAC9B,EAAK7J,SAAS,CAACuX,mBAAmB,GAEtC,IAAG3U,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,GACF,EAnYE,EAAKjL,MAAQ,CACX0C,WAAW,EACXC,SAAU,GACVkQ,MAAO,GAEP8D,oBAAoB,EACpBtC,cAAe,GAEf1B,OAAQ,OACRC,UAAW,MAEXoB,iBAAiB,EACjBC,cAAe,GAEf0D,aAAc,GACdK,mBAAmB,EAEnBzD,2BAA2B,EAC3BC,aAAc,GAEdO,oBAAqB,GACrBK,uBAAwB,EACxBH,yBAA0B,EAC1BH,8BAA8B,EAE9BoB,kBAAkB,EAClBD,WAAY,GACZE,WAAY,GACZ,CACJ,CA2eC,OA3eA,8CAED,WAAqB,IAAD,OACdhE,IACF/H,IAAQC,OAAOpG,aAAQ,0EAA2E,CAChGgU,SAAU,IAId7V,IAAW8V,cAAcxU,GAAO4G,GAAc4H,IAAe7P,MAAK,SAACC,GACjE,IAAMuQ,EAAQvQ,EAAIC,KAAkB,YAAEsF,KAAI,SAAAiE,GAExC,OADAA,EAAKqI,YAAa,EACXrI,CACT,IACA,EAAKrL,SAAS,CACZiC,WAAW,EACXC,SAAU,GACVkQ,MAAOtP,IAAMuP,uBAAuBD,EAAO,EAAK7S,MAAM2S,OAAQ,EAAK3S,MAAM4S,aAE3E,EAAKG,eACP,IAAG1P,OAAM,SAACC,GACR,IAAIX,EAAWY,IAAMC,YAAYF,GACjC,EAAK7C,SAAS,CACZiC,WAAW,EACXC,SAAUA,GAEd,IAEA5C,KAAK2X,sBACP,GAAC,6EA2GD,sCAAAS,EAAA,sDAC2B,OAAnBpD,EAAwBhV,KAAKC,MAA7B+U,oBAAmB,kBAEP3S,IAAWgW,4BAA4BrD,GAAqB,KAAD,EACvD,GADhBzS,EAAG,SACHC,EAAOD,EAAIC,MACNC,OAAO,CAAD,gBAMV,OALC2H,EAAUlG,aAAQ,4CACtBmG,IAAQC,OAAOF,GACfpK,KAAKU,SAAS,CACZ2U,uBAAwB,EACxBN,8BAA8B,IAC7B,+BAIDvS,EAAK8V,WAAW,CAAD,gBAMQ,OALzBtY,KAAKU,SAAS,CACZ2U,uBAAwB,EACxBN,8BAA8B,IAE5B3K,EAAUlG,aAAQ,iDACtBmG,IAAQkO,QAAQnO,GAAS,2BAIvBiL,EAA0B7S,EAAKO,MAAYyI,UAAUhJ,EAAKgW,KAAKhW,EAAKO,MAAQ,KAAKE,QAAQ,IAAlD,EAE3CjD,KAAKmV,2BACLnV,KAAKU,SAAS,CAAC2U,uBAAwBA,IAAyB,kDAEhErV,KAAKU,SAAS,CACZ2U,uBAAwB,EACxBN,8BAA8B,IAC7B,0DAEN,kDA9IA,IA8IA,oBA6LD,WAAU,IAAD,OACD0D,EAAYjV,IAAMiV,YAClBC,EAAgB,8CACtB,OACE,eAAC,IAAM9E,SAAQ,WACb,sBAAKxP,UAAU,2BAA0B,UACvC,sBAAKA,UAAU,4CAA2C,UACxD,mBAAGhB,KAAM0S,KAAS,SAChB,qBAAK6C,IAAKC,KAAWC,KAAUlR,OAAQmR,KAAYhT,MAAOiT,KAAWrT,MAAOsT,KAAWC,IAAI,WAE5FpH,IAAa,cAAC,IAAO,OAExB,qBAAKzN,UAAU,SAAQ,SACrB,sBAAKA,UAAU,uBAAsB,UACnC,oBAAIA,UAAU,KAAI,SAAE4N,KACpB,8BAAI9N,aAAQ,eAAgBgO,MAC5B,sBAAK9N,UAAU,2DAA0D,UACvE,oBAAGA,UAAU,8CAA6C,UAAC,sBAAMA,UAAU,YAAW,SAAEF,aAAQ,oBAA0BlE,KAAK2T,gBAC/H,sBAAKvP,UAAU,YAAW,UACvBqU,GACD,sBAAKrU,UAAU,sBAAqB,UAClC,mBAAGhB,KAAI,aAAQyQ,mBAAmBtJ,IAAa,cAAcnG,UAAS,UAAKsU,EAAa,+BAA+B,QAARxH,GAAiB,eAAiB,IAAMxL,MAAOxB,aAAQ,QAAS,aAAYA,aAAQ,UACnM,mBAAGd,KAAI,aAAQyQ,mBAAmBtJ,IAAa,cAAcnG,UAAS,UAAKsU,EAAa,+BAA+B,QAARxH,GAAiB,eAAiB,IAAMxL,MAAOxB,aAAQ,QAAS,aAAYA,aAAQ,aAGpMqO,IACC,cAACjB,EAAA,EAAM,CAACC,SAAUe,GAChB5M,MAAO4M,GAAUpO,aAAQ,mDAAqD,GAC9EgC,QAASlG,KAAKgX,aAAc5S,UAAU,+CAA8C,SAAEF,aAAQ,YAEjGuO,IACD,cAAC,WAAQ,UACNzS,KAAKC,MAAM6S,MAAMiE,MAAK,SAAAhL,GAAI,OAAIA,EAAKqI,UAAU,IAC5C,eAAC,WAAQ,WACP,cAAC9C,EAAA,EAAM,CAACF,MAAM,UAAUlL,QAASlG,KAAKmU,yBAA0B/P,UAAU,yBAAwB,SAAEF,aAAQ,wBAC1GmO,IAAeR,IAAcA,KAAcK,IAC7C,cAACZ,EAAA,EAAM,CAACF,MAAM,UAAUlL,QAASlG,KAAKuU,kBAAmBnQ,UAAU,yBAAwB,SAAEF,aAAQ,4BAIvG,eAAC,WAAQ,WACP,cAACoN,EAAA,EAAM,CAACF,MAAM,UAAUlL,QAASlG,KAAK8T,kBAAkBzT,KAAKL,KAAMuK,IAAenG,UAAU,yBAAwB,SAAEF,aAAQ,SAC5HmO,IAAeR,IAAcA,KAAcK,IAC7C,cAACZ,EAAA,EAAM,CAACF,MAAM,UAAUlL,QAASlG,KAAK0U,aAActQ,UAAU,yBAAwB,SAAEF,aAAQ,sBAQxGoO,IAAWC,IACX,cAAC,EAAY,CACXnC,IAAK,SAAA5H,GAAQ,OAAI,EAAKA,SAAWA,CAAQ,EACzCH,aAAa,EACb1E,MAAOA,GACPC,KAAkB,MAAZqO,GAAkBA,GAAUA,GAAQ3L,QAAQ,OAAQ,IAC1DiE,aAA+B,MAAjBA,GAAuBA,GAAeA,GAAajE,QAAQ,OAAQ,IACjFzC,OAAQA,GACRyF,oBAAqBtJ,KAAKsJ,sBAI7BtJ,KAAKC,MAAMgY,mBACV,cAAC,KAAW,CACVpU,OAAQA,GACRqV,YAAa,IACbtB,aAAc5X,KAAKC,MAAM2X,aACzBuB,eAAgBxV,GAChByV,mBAAoB3G,GACpBrO,UAAU,SAId,cAAC,GAAO,CACNqU,UAAWA,EACX9V,UAAW3C,KAAKC,MAAM0C,UACtBC,SAAU5C,KAAKC,MAAM2C,SACrBkQ,MAAO9S,KAAKC,MAAM6S,MAClBF,OAAQ5S,KAAKC,MAAM2S,OACnBC,UAAW7S,KAAKC,MAAM4S,UACtBF,UAAW3S,KAAK2S,UAChBiE,mBAAoB5W,KAAKC,MAAM2W,mBAC/BD,kBAAmB3W,KAAK2W,kBACxBE,mBAAoB7W,KAAK6W,mBACzB/C,kBAAmB9T,KAAK8T,kBACxBmC,eAAgBjW,KAAKiW,yBAK5BjW,KAAKC,MAAMgU,iBACZ,cAAC,IAAW,UACV,cAAC,IAAiB,CAChBtQ,MAAOA,GACPC,KAAM5D,KAAKC,MAAMiU,cACjB/S,OAAQnB,KAAKC,MAAMqU,cACnBpR,aAAclD,KAAKwV,mBAItBxV,KAAKC,MAAMuU,2BACV,cAAC,EAAmB,CAClB6E,YAAa1V,GACb2V,UAAW/O,GACXuI,MAAO9S,KAAKC,MAAMwU,aAClB1D,aAAc/Q,KAAK2U,0BACnBpE,oBAAqBvQ,KAAKuQ,sBAG7BvQ,KAAKC,MAAM8U,8BACV,cAAC,KAA4B,CAC3BhI,KAAK,OACLmI,yBAA0BlV,KAAKC,MAAMiV,yBACrCG,uBAAwBrV,KAAKC,MAAMoV,uBACnCnS,aAAclD,KAAKoV,yBAGtBpV,KAAKC,MAAMkW,kBACZ,cAAC,IAAW,UACV,cAAC,IAAW,CACVD,WAAYlW,KAAKC,MAAMiW,WACvBE,WAAYpW,KAAKC,MAAMmW,WACvBE,gBAAiBtW,KAAKsW,gBACtBC,gBAAiBvW,KAAKuW,gBACtBG,gBAAiB1W,KAAK0W,sBAMhC,KAAC,EA5gBgB,CAAS9V,IAAMK,WA+gB5BkD,GAAO,kDAEX,WAAYtE,GAAQ,IAAD,EAuBlB,OAvBkB,qBACjB,cAAMA,IAGR0Z,WAAa,SAAC5U,GACZA,EAAEC,iBACF,IACMiO,EAAoC,OAAxB,EAAKhT,MAAMgT,UAAqB,OAAS,MAC3D,EAAKhT,MAAM8S,UAFI,OAEcE,EAC/B,EAAC,EAED2G,WAAa,SAAC7U,GACZA,EAAEC,iBACF,IACMiO,EAAoC,OAAxB,EAAKhT,MAAMgT,UAAqB,OAAS,MAC3D,EAAKhT,MAAM8S,UAFI,OAEcE,EAC/B,EAAC,EAED4G,WAAa,SAAC9U,GACZA,EAAEC,iBACF,IACMiO,EAAoC,OAAxB,EAAKhT,MAAMgT,UAAqB,OAAS,MAC3D,EAAKhT,MAAM8S,UAFI,OAEcE,EAC/B,EAAC,CArBD,CAqGC,OArGA,mCAuBD,WAAU,IAAD,SAMH7S,KAAKH,MAJP4Y,EAAS,EAATA,UACA9V,EAAS,EAATA,UAAWC,EAAQ,EAARA,SAAUkQ,EAAK,EAALA,MACrBF,EAAM,EAANA,OAAQC,EAAS,EAATA,UACR+D,EAAkB,EAAlBA,mBAGF,GAAIjU,EACF,OAAO,cAAC,IAAO,IAGjB,GAAIC,EACF,OAAO,mBAAGwB,UAAU,yBAAwB,SAAExB,IAGhD,IAAM8W,EACJ,gCACG5G,EAAMhL,KAAI,SAACiE,EAAMhE,GAChB,OAAO,cAAC,GAAI,CAEV0Q,UAAWA,EACX1M,KAAMA,EACN+H,kBAAmB,EAAKjU,MAAMiU,kBAC9BmC,eAAgB,EAAKpW,MAAMoW,eAC3BY,mBAAoB,EAAKhX,MAAMgX,oBAL1B9O,EAOT,MAIJ,IAAK0Q,EACH,OACE,wBAAOrU,UAAU,iCAAgC,UAC/C,gCACE,+BACE,oBAAI0B,MAAM,QACV,oBAAIA,MAAM,QACV,oBAAIA,MAAM,YAGb4T,KAKP,IAAMC,EAAW,sBAAMvV,UAAS,cAAsB,OAAbyO,EAAqB,cAAgB,mBAC9E,MAAe,QAAR3B,GACL,wBAAO9M,UAAU,cAAa,UAC5B,gCACE,+BACGqO,IACD,oBAAI3M,MAAM,KAAK1B,UAAU,cAAa,SACpC,uBAAO2I,KAAK,WAAW6M,QAAShD,EAAoBiD,SAAU7Z,KAAKH,MAAM8W,sBAG3E,oBAAI7Q,MAAM,OACV,oBAAIA,MAAO2M,GAAmB,MAAQ,MAAM,SAAC,oBAAGrO,UAAU,wBAAwBhB,KAAK,IAAI8C,QAASlG,KAAKuZ,WAAW,UAAErV,aAAQ,QAAO,IAAa,QAAV0O,GAAoB+G,OAC5J,oBAAI7T,MAAM,OACV,oBAAIA,MAAM,MAAK,SAAC,oBAAG1B,UAAU,wBAAwBhB,KAAK,IAAI8C,QAASlG,KAAKyZ,WAAW,UAAEvV,aAAQ,QAAO,IAAa,QAAV0O,GAAoB+G,OAC/H,oBAAI7T,MAAM,MAAK,SAAC,oBAAG1B,UAAU,wBAAwBhB,KAAK,IAAI8C,QAASlG,KAAKwZ,WAAW,UAAEtV,aAAQ,eAAc,IAAa,QAAV0O,GAAoB+G,OACtI,oBAAI7T,MAAM,YAGb4T,KAGH,oBAAItV,UAAU,YAAW,SACtB0O,EAAMhL,KAAI,SAACiE,EAAMhE,GAChB,OAAO,cAAC,GAAQ,CAEdgE,KAAMA,EACN+H,kBAAmB,EAAKjU,MAAMiU,kBAC9BmC,eAAgB,EAAKpW,MAAMoW,gBAHtBlO,EAKT,KAGN,KAAC,EAzGU,CAASnH,IAAMK,WA4GtB6Y,GAAI,kDAER,WAAYja,GAAQ,IAAD,EAKf,OALe,qBACjB,cAAMA,IAORka,aAAe,WACb,EAAKrZ,SAAS,CAACsZ,cAAe,EAAK/Z,MAAM+Z,cAC3C,EAAC,EAEDC,gBAAkB,WAChB,EAAKvZ,SAAS,CAACwZ,aAAa,GAC9B,EAAC,EAEDC,eAAiB,WACf,EAAKzZ,SAAS,CAACwZ,aAAa,GAC9B,EAAC,EAEDpG,kBAAoB,SAACnP,GACnBA,EAAEC,iBACF,EAAK/E,MAAMiU,kBAAkBzT,KAAK,eAAM,EAAKR,MAAMkM,KAAKqO,YAAxD,EACF,EAAC,EAEDC,gBAAkB,SAAC1V,GACjB,IAAMoH,EAAO,EAAKlM,MAAMkM,KACnBvI,IAAM0P,WAAWnH,EAAKoH,aAI3BxO,EAAEC,iBACF,EAAK/E,MAAMoW,eAAelK,GAC5B,EAAC,EAED8K,mBAAqB,SAAClS,GACpB,EAAK9E,MAAMgX,mBAAmB,EAAKhX,MAAMkM,KAAMpH,EAAExD,OAAOyY,QAC1D,EAnCE,EAAK3Z,MAAQ,CACXia,aAAa,EACbF,cAAc,GACd,CACJ,CA+KC,OA/KA,mCAiCD,WAAU,IAAD,EACqBha,KAAKH,MAAzBkM,EAAI,EAAJA,KAAM0M,EAAS,EAATA,UACNyB,EAAgBla,KAAKC,MAArBia,YAEJI,EAAY,GACZC,EAAW,GAMf,GALIxO,EAAKyO,WAAazO,EAAKyO,UAAUlZ,OAAS,IAC5CgZ,EAAYxM,IAAI/B,EAAKoH,WAAWvI,MAAM,EAAG,GACzC2P,EAAWxO,EAAKyO,UAAU1S,KAAI,SAAAiE,GAAI,OAAIA,EAAK0O,QAAQ,IAAEC,KAAK,MAGxD3O,EAAKkH,OACP,OAAOwF,EACL,qBAAIkC,YAAa3a,KAAKia,gBAAiBW,WAAY5a,KAAKma,eAAgBU,QAAS7a,KAAKia,gBAAgB,UACnGxH,IACC,oBAAIrO,UAAU,cAAa,SACzB,uBAAO2I,KAAK,WAAW6M,QAAS7N,EAAKqI,WAAYyF,SAAU7Z,KAAK6W,uBAGpE,oBAAIzS,UAAU,cAAa,SAAC,qBAAKuU,IAAKnV,IAAMsX,mBAAoB7B,IAAI,GAAGnT,MAAM,SAC7E,6BACE,mBAAG1C,KAAI,aAAQyQ,mBAAmB9H,EAAKqO,YAAYzE,OAAO,EAAG5J,EAAKqO,YAAY9Y,OAAS,IAAG,iBAAS4P,IAAO,SAAEnF,EAAKsI,gBAEnH,uBACA,uBACA,oBAAI3O,MAAO8L,IAAOzF,EAAKqL,eAAeC,OAAO,QAAQ,SAAE7F,IAAOzF,EAAKqL,eAAe2D,YAClF,6BACGtI,IACD,mBAAG7M,KAAK,SAASxB,UAAS,uCAAkC8V,EAAc,GAAK,cAAgB9W,KAAK,IAAI8C,QAASlG,KAAK8T,kBAAmBpO,MAAOxB,aAAQ,YAAa,aAAYA,aAAQ,mBAM7L,+BACE,oBAAIE,UAAU,cAAa,SAAC,qBAAKuU,IAAKnV,IAAMsX,mBAAoB7B,IAAI,GAAGnT,MAAM,SAC7E,+BACE,mBAAG1C,KAAI,aAAQyQ,mBAAmB9H,EAAKqO,YAAYzE,OAAO,EAAG5J,EAAKqO,YAAY9Y,OAAS,IAAG,iBAAS4P,IAAO,SAAEnF,EAAKsI,cACjH,uBACA,sBAAMjQ,UAAU,iBAAgB,SAAEoN,IAAOzF,EAAKqL,eAAe2D,eAE/D,6BACGtI,IACD,eAACuI,EAAA,EAAQ,CAAC9a,OAAQF,KAAKC,MAAM+Z,aAAc5Z,OAAQJ,KAAK+Z,aAAa,UACnE,cAACkB,EAAA,EAAc,CACbC,IAAI,IACJ9W,UAAU,2CACVsB,MAAOxB,aAAQ,mBACf,cAAY,WACZ,gBAAelE,KAAKC,MAAM+Z,eAE5B,sBAAK5V,UAAWpE,KAAKC,MAAM+Z,aAAe,GAAK,SAAU9T,QAASlG,KAAK+Z,aAAa,UAClF,qBAAK3V,UAAU,mCACf,qBAAKA,UAAU,wBAAuB,SACpC,cAAC+W,EAAA,EAAY,CAAC/W,UAAU,mBAAmB8B,QAASlG,KAAK8T,kBAAkB,SAAE5P,aAAQ,2BASjG,IAAM2R,EAAO,UAAMC,KAAQ,aAAKnS,GAAK,qBAAakQ,mBAAmB9H,EAAK2H,YACpE0H,EAAerP,EAAKsH,sBAAqB,UAAMyC,MAAQ,OAAG/J,EAAKsH,uBAA0B,GAC/F,OAAOoF,EACL,qBAAIkC,YAAa3a,KAAKia,gBAAiBW,WAAY5a,KAAKma,eAAgBU,QAAS7a,KAAKia,gBAAgB,UACnGxH,IACC,oBAAIrO,UAAU,cAAa,SACzB,uBAAO2I,KAAK,WAAW6M,QAAS7N,EAAKqI,WAAYyF,SAAU7Z,KAAK6W,uBAGpE,oBAAIzS,UAAU,cAAa,SACxBgX,EACC,qBAAKhX,UAAU,YAAYuU,IAAKyC,EAAcnC,IAAI,KAClD,qBAAKN,IAAKnV,IAAM6X,eAAetP,EAAKoH,WAAY8F,IAAI,GAAGnT,MAAM,SAGjE,6BACE,mBAAG1C,KAAMyS,EAAS3P,QAASlG,KAAKqa,gBAAgB,SAAEtO,EAAKoH,cAEzD,oBAAI/O,UAAU,iBAAgB,SAC1B2H,EAAKyO,WAAazO,EAAKyO,UAAUlZ,OAAS,GAC1C,eAAC,WAAQ,WACP,qBAAKwL,GAAE,yBAAoBwN,GAAalW,UAAU,wCAAuC,SACtF2H,EAAKyO,UAAU1S,KAAI,SAACwT,EAASvT,GAC5B,IAAIzG,EAASyK,EAAKyO,UAAUlZ,OAC5B,OACE,sBAAM8C,UAAU,WAAqCyB,MAAO,CAAC0V,OAAOja,EAASyG,EAAOyT,gBAAgBF,EAAQG,YAA5EH,EAAQI,YAE5C,MAEF,cAAC/b,EAAA,EAAmB,CAACwB,OAAM,yBAAoBmZ,GAAaqB,UAAU,SAAQ,SAC3EpB,SAKT,6BAAK/W,IAAMoY,YAAY7P,EAAK/G,QAC5B,oBAAIU,MAAO8L,IAAOzF,EAAKqL,eAAeC,OAAO,QAAQ,SAAE7F,IAAOzF,EAAKqL,eAAe2D,YAClF,6BACGtI,IACD,mBAAGrO,UAAS,uCAAkC8V,EAAc,GAAK,cAAgB9W,KAAI,UAAKyS,EAAO,SAASnQ,MAAOxB,aAAQ,YAAa,aAAYA,aAAQ,mBAK9J,+BACE,oBAAIE,UAAU,cAAa,SACxBgX,EACC,qBAAKhX,UAAU,YAAYuU,IAAKyC,EAAcnC,IAAI,KAClD,qBAAKN,IAAKnV,IAAM6X,eAAetP,EAAKoH,WAAY8F,IAAI,GAAGnT,MAAM,SAGjE,+BACE,mBAAG1C,KAAMyS,EAAS3P,QAASlG,KAAKqa,gBAAgB,SAAEtO,EAAKoH,YACvD,uBACA,sBAAM/O,UAAU,iBAAgB,SAAEZ,IAAMoY,YAAY7P,EAAK/G,QACzD,sBAAMZ,UAAU,iBAAgB,SAAEoN,IAAOzF,EAAKqL,eAAe2D,eAE/D,6BACGtI,IACD,eAACuI,EAAA,EAAQ,CAAC9a,OAAQF,KAAKC,MAAM+Z,aAAc5Z,OAAQJ,KAAK+Z,aAAa,UACnE,cAACkB,EAAA,EAAc,CACbC,IAAI,IACJ9W,UAAU,2CACVsB,MAAOxB,aAAQ,mBACf,cAAY,WACZ,gBAAelE,KAAKC,MAAM+Z,eAE5B,sBAAK5V,UAAWpE,KAAKC,MAAM+Z,aAAe,GAAK,SAAU9T,QAASlG,KAAK+Z,aAAa,UAClF,qBAAK3V,UAAU,mCACf,qBAAKA,UAAU,wBAAuB,SACpC,cAAC+W,EAAA,EAAY,CAAC/W,UAAU,mBAAmB8W,IAAI,IAAI9X,KAAI,UAAKyS,EAAO,SAAQ,SAAE3R,aAAQ,0BASrG,KAAC,EAvLO,CAAStD,IAAMK,WA0LnB4a,GAAQ,kDAEZ,WAAYhc,GAAQ,IAAD,EAIf,OAJe,qBACjB,cAAMA,IAMRoa,gBAAkB,WAChB,EAAKvZ,SAAS,CAACwZ,aAAa,GAC9B,EAAC,EAEDC,eAAiB,WACf,EAAKzZ,SAAS,CAACwZ,aAAa,GAC9B,EAAC,EAEDpG,kBAAoB,SAACnP,GACnBA,EAAEC,iBACF,EAAK/E,MAAMiU,kBAAkBzT,KAAK,eAAM,EAAKR,MAAMkM,KAAKqO,YAAxD,EACF,EAAC,EAEDC,gBAAkB,SAAC1V,GACjB,IAAMoH,EAAO,EAAKlM,MAAMkM,KACnBvI,IAAM0P,WAAWnH,EAAKoH,aAI3BxO,EAAEC,iBACF,EAAK/E,MAAMoW,eAAelK,GAC5B,EA1BE,EAAK9L,MAAQ,CACXia,aAAa,GACb,CACJ,CA8DC,OA9DA,mCAyBD,WACE,IAAMnO,EAAO/L,KAAKH,MAAMkM,KAChBmO,EAAgBla,KAAKC,MAArBia,YAER,GAAInO,EAAKkH,OAAQ,CACf,IAAM6I,EAAS,aAASjI,mBAAmB9H,EAAKqO,YAAYzE,OAAO,EAAG5J,EAAKqO,YAAY9Y,OAAS,IAAG,iBAAS4P,IAC5G,OACE,qBAAI9M,UAAU,YAAYuW,YAAa3a,KAAKia,gBAAiBW,WAAY5a,KAAKma,eAAgBU,QAAS7a,KAAKia,gBAAgB,UAC1H,mBAAG7W,KAAM0Y,EAAW1X,UAAU,6BAA4B,SACxD,qBAAKuU,IAAKnV,IAAMsX,kBAAiB,EAAO,KAAM7B,IAAI,GAAGnT,MAAM,KAAK6B,OAAO,SAEzE,mBAAGvE,KAAM0Y,EAAW1X,UAAU,qCAAoC,SAAE2H,EAAKsI,cACxE5B,IACC,mBAAG7M,KAAK,SAASxB,UAAS,uCAAkC8V,EAAc,GAAK,cAAgB9W,KAAK,IAAI8C,QAASlG,KAAK8T,kBAAmBpO,MAAOxB,aAAQ,YAAa,aAAYA,aAAQ,gBAKjM,CACE,IAAM2R,EAAO,UAAMC,KAAQ,aAAKnS,GAAK,qBAAakQ,mBAAmB9H,EAAK2H,YACpE0H,EAAerP,EAAKsH,sBAAqB,UAAMyC,MAAQ,OAAG/J,EAAKsH,uBAA0B,GAC/F,OACE,qBAAIjP,UAAU,YAAYuW,YAAa3a,KAAKia,gBAAiBW,WAAY5a,KAAKma,eAAgBU,QAAS7a,KAAKia,gBAAgB,UAC1H,mBAAG7W,KAAMyS,EAASzR,UAAU,6BAA6B8B,QAASlG,KAAKqa,gBAAgB,SACpFe,EACC,qBAAKhX,UAAU,YAAYuU,IAAKyC,EAAcnC,IAAI,KAClD,qBAAKN,IAAKnV,IAAM6X,eAAetP,EAAKoH,UAAW,KAAM8F,IAAI,GAAGnT,MAAM,KAAK6B,OAAO,SAGlF,mBAAGvE,KAAMyS,EAASzR,UAAU,qCAAqC8B,QAASlG,KAAKqa,gBAAgB,SAAEtO,EAAKoH,YACrGV,IACC,mBAAGrO,UAAS,uCAAkC8V,EAAc,GAAK,cAAgB9W,KAAI,UAAKyS,EAAO,SAASnQ,MAAOxB,aAAQ,YAAa,aAAYA,aAAQ,gBAMpK,KAAC,EArEW,CAAStD,IAAMK,WAwE7B8a,IAASpb,OAAO,cAAC,GAAa,IAAKqb,SAASC,eAAe,W,mHCl5BrDC,EAAW,kDACf,WAAYrc,GAAQ,uCACZA,EACR,CA2BC,OA3BA,mCAED,WACE,IAAMqW,EAAalW,KAAKH,MAAMqW,WACxBE,EAAapW,KAAKH,MAAMuW,WACxBI,EAAmBN,EAAW5U,OAC9BkF,EAAO0P,EAAWE,GAAY5P,KAC9B2V,EAAU,UAAM3V,EAAI,aAAK4P,EAAa,EAAC,YAAII,EAAgB,KAEjE,OACE,cAAC,IAAQ,CACP2F,WAAYA,EACZC,QAASlG,EAAWE,GAAYuC,IAChC0D,QAASnG,GAAYE,EAAa,GAAKI,GAAkBmC,IACzD2D,QAASpG,GAAYE,EAAaI,EAAmB,GAAKA,GAAkBmC,IAC5E4D,eAAgBvc,KAAKH,MAAMyW,gBAC3BkG,kBAAmBxc,KAAKH,MAAM0W,gBAC9BkG,kBAAmBzc,KAAKH,MAAM6W,gBAC9BgG,aAAc,GACdC,sBAAuBzY,aAAQ,kCAC/B0Y,UAAW1Y,aAAQ,6BACnB2Y,UAAW3Y,aAAQ,0BACnB4Y,WAAY5Y,aAAQ,eACpB6Y,YAAa7Y,aAAQ,WACrB8Y,aAAc9Y,aAAQ,aAG5B,KAAC,EA9Bc,CAAStD,IAAMK,WAmCjBib,K,kLC9BTe,EAAqB,kDAEzB,WAAYpd,GAAQ,IAAD,EAIf,OAJe,qBACjB,cAAMA,IAMRqd,iBAAmB,SAACC,GAClB,IAAMvZ,EAAOuZ,EAAWC,YAClBvQ,EAAS,CAACrG,KAAM2W,EAAWE,UAC7BC,EAAsB,MAAT1Z,EAAeA,EAAOuZ,EAAWE,SAAWzZ,EAAO,IAAMuZ,EAAWE,SACrF,EAAKxd,MAAMqd,iBAAiBrQ,EAAQyQ,EACtC,EAAC,EAEDC,mBAAqB,SAACC,GACpB,IAAI3Z,EAAS,EAAKhE,MAAMgE,OACpB4Z,EAAYD,EAAW9B,YAC3BrZ,IAAWqb,cAAc7Z,EAAQ4Z,GAAWnb,MAAK,SAAAC,GAC/C,EAAKob,iBACL,EAAK9d,MAAM+d,qBACN,EAAK/d,MAAMqd,mBAAsBM,EAAWK,cAAc,EAAKX,iBAAiBM,EACvF,IAAGla,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,GACF,EAAC,EAMDyS,eAAiB,WAAO,IAAD,EACwB,EAAK9d,MAA5CgE,EAAM,EAANA,OAAQia,EAAU,EAAVA,WAAY3E,EAAc,EAAdA,gBACZA,EACZ9W,IAAW0b,wBAAwB5E,EAAgB2E,EAAWhR,IAC9DzK,IAAW2b,gBAAgBna,EAAQia,EAAWhR,KACxCxK,MAAK,SAAAC,GACX,IAAI0b,EAAiB,QACK1O,IAA1BhN,EAAIC,KAAK0b,cACT3b,EAAIC,KAAK0b,aAAa1c,SAAQ,SAAA4E,GAC5B,IAAIoX,EAAapX,EACjB6X,EAAeze,KAAKge,EACtB,IACA,EAAK9c,SAAS,CACZud,eAAgBA,GAEpB,IAAG3a,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,GACF,EAhDE,EAAKjL,MAAQ,CACXge,eAAgB,IAChB,CACJ,CAmFC,OAnFA,8CAsBD,WACEje,KAAK2d,gBACP,GAAC,oBAuBD,WAAU,IAAD,OACHM,EAAiBje,KAAKC,MAAMge,eAChC,OACE,eAAC,IAAK,CAAC/d,QAAQ,EAAM2F,MAAO,CAACsY,SAAU,SAAS,UAC9C,cAAC,IAAW,CAAC/d,OAAQJ,KAAKH,MAAMue,QAAQ,SAAEla,aAAQ,kBAClD,cAAC,IAAS,CAACE,UAAU,wBAAuB,SAC1C,kCACE,gCACE,+BACE,oBAAI0B,MAAM,MAAM1B,UAAU,WAAU,SAAEF,aAAQ,UAC9C,oBAAI4B,MAAM,MAAK,SAAE5B,aAAQ,UACzB,oBAAI4B,MAAM,MAAK,SAAE5B,aAAQ,iBACzB,oBAAI4B,MAAM,YAGd,gCACGmY,EAAenW,KAAI,SAAC0V,EAAYzV,GAC/B,OACE,cAACoV,EAAU,CAETtZ,OAAQ,EAAKhE,MAAMgE,OACnB2Z,WAAYA,EACZD,mBAAoB,EAAKA,mBACzBpE,eAAgB,EAAKtZ,MAAMsZ,eAC3BC,mBAAoB,EAAKvZ,MAAMuZ,oBAL1BrR,EAQX,WAIN,cAAC,IAAW,UACV,cAAC,IAAM,CAACqJ,MAAM,YAAYlL,QAASlG,KAAKH,MAAMkR,aAAa,SAAE7M,aAAQ,eAI7E,KAAC,EA1FwB,CAAStD,IAAMK,WA+F3Bgc,MAAsB,IAU/BE,EAAU,kDAEd,WAAYtd,GAAQ,IAAD,EAId,OAJc,qBACjB,cAAMA,IAMRwe,aAAe,WACb,EAAK3d,SAAS,CACZ4d,QAAQ,GAEZ,EAAC,EAEDC,aAAe,WACb,EAAK7d,SAAS,CACZ4d,QAAQ,GAEZ,EAAC,EAEDE,WAAa,SAAC7Z,GACZA,EAAEC,iBACF,EAAK/E,MAAM0d,mBAAmB,EAAK1d,MAAM2d,WAC3C,EApBE,EAAKvd,MAAS,CACZqe,QAAQ,GACP,CACL,CAoDC,OApDA,mCAmBD,WAAU,IAAD,EACoDte,KAAKH,MAAxD2d,EAAU,EAAVA,WAAYrE,EAAc,EAAdA,eAAgBC,EAAkB,EAAlBA,mBAEhCxV,EAAO4Z,EAAWJ,YAAc5Z,IAAM2T,SAASqG,EAAWJ,YAAaI,EAAWH,UAAY,GAC9Fja,EAAO+V,EACTrD,KAAW,KAAOqD,EAAiB,aAAe3V,IAAMwS,WAAWpS,GACnEkS,KAAW,OAAS9V,KAAKH,MAAMgE,OAAS,QAAUL,IAAMwS,WAAWpS,GAErE,OACE,qBAAIya,aAAcre,KAAKqe,aAAcE,aAAcve,KAAKue,aAAc1D,QAAS7a,KAAKqe,aAAa,UAC9Fb,EAAWK,aACV,cAAC,WAAQ,UACP,qBAAIpX,QAAQ,IAAIrC,UAAU,OAAM,UAAEoZ,EAAWH,SAAU,IACrD,sBAAMxX,MAAO,CAACuL,MAAM,OAAO,SAAElN,aAAQ,kBAIzC,eAAC,WAAQ,WACP,6BAAI,mBAAGd,KAAMA,EAAMjC,OAAO,SAASiD,UAAU,gCAAgCsB,MAAO8X,EAAWH,SAAUoB,IAAI,aAAY,SAAEjB,EAAWH,aACtI,6BAAK7Z,IAAMoY,YAAY4B,EAAWxY,QAClC,6BAAKwM,IAAOkN,KAAKlB,EAAWxQ,OAAO+N,eAGvC,gCACI5B,GACA,mBAAG/V,KAAK,IAAIwC,KAAK,SAAS,aAAY1B,aAAQ,UAAWwB,MAAOxB,aAAQ,UAAWE,UAAS,iCAA4BpE,KAAKC,MAAMqe,OAAS,GAAK,cAAgBpY,QAASlG,KAAKwe,aAE/KrF,GAAkBC,GAClB,mBAAGhV,UAAS,uCAAkCpE,KAAKC,MAAMqe,OAAS,GAAK,cAAgBlb,KAAI,UAAKA,EAAI,SAASsC,MAAOxB,aAAQ,YAAa,aAAYA,aAAQ,mBAKvK,KAAC,EA3Da,CAAStD,IAAMK,U,qMC/GhB0d,EAVb,WAAY5S,GAAO,oBACjB/L,KAAK4e,QAAU7S,EAAK8S,WACpB7e,KAAK8e,WAAatN,IAAQ,IAAInF,KAAKN,EAAK8S,YAAavS,WAAW+K,OAAO,oBACvErX,KAAK8M,GAAKf,EAAKe,GACf9M,KAAK+e,cAAgBhT,EAAKiT,eAC1Bhf,KAAKif,aAAelT,EAAKmT,eACzBlf,KAAKmf,cAAgBpT,EAAKqT,eAC5B,E,OCmFaC,EA9EW,kDAExB,WAAYxf,GAAQ,IAAD,EAIf,OAJe,qBACjB,cAAMA,IAkBRyf,kBAAoB,SAACC,GACnBC,IAAgBC,YAAYF,EAAMzS,IAAIxK,MAAK,WACzC,IAAIod,EAAS,EAAKzf,MAAMyf,OAAOtgB,QAAO,SAAA2M,GACpC,OAAOA,EAAKe,KAAOyS,EAAMzS,EAC3B,IACA,EAAKpM,SAAS,CAACgf,OAAQA,IACvB,IAAIrZ,EAAMnC,aAAQ,yCAClBmC,EAAMA,EAAIC,QAAQ,YAAaiZ,EAAMJ,eACrC9U,IAAQkO,QAAQlS,EAClB,IAAG/C,OAAM,WACP,IAAI+C,EAAMnC,aAAQ,qCAClBmC,EAAMA,EAAIC,QAAQ,YAAaiZ,EAAMJ,eACrC9U,IAAQC,OAAOjE,EACjB,GACF,EAAC,EAEDjG,OAAS,WACP,EAAKP,MAAMO,QACb,EAnCE,EAAKH,MAAQ,CACXyf,OAAQ,IACR,CACJ,CAkEC,OAlEA,8CAED,WAAqB,IAAD,OAClBrd,IAAWsd,eAAe3f,KAAKH,MAAMgE,QAAQvB,MAAK,SAAAC,GAChD,IAAImd,EAASnd,EAAIC,KAAKkd,OAAO5X,KAAI,SAAAiE,GAE/B,OADY,IAAI4S,EAAM5S,EAExB,IACA,EAAKrL,SAAS,CACZgf,OAAQA,GAEZ,GACF,GAAC,oBAsBD,WAAU,IAAD,OACP,OACE,eAAC7O,EAAA,EAAK,CAAC3Q,QAAQ,EAAK,UAClB,cAAC4Q,EAAA,EAAW,CAAC1Q,OAAQJ,KAAKI,OAAO,SAAE8D,aAAQ,YAC3C,cAAC8M,EAAA,EAAS,CAAC5M,UAAU,wBAAuB,SAC1C,kCACE,gCACE,+BACE,oBAAI0B,MAAM,MAAM1B,UAAU,WAAU,SAAEF,aAAQ,UAC9C,oBAAI4B,MAAM,MAAK,SAAE5B,aAAQ,WACzB,oBAAI4B,MAAM,MAAK,SAAE5B,aAAQ,iBACzB,oBAAI4B,MAAM,aAGd,gCACG9F,KAAKC,MAAMyf,OAAO5X,KAAI,SAACiE,EAAMhE,GAC5B,OACE,cAAC,EAAS,CAER6X,UAAW7T,EACXuT,kBAAmB,EAAKA,mBAFnBvX,EAKX,WAIN,cAACsJ,EAAA,EAAW,UACV,cAACC,EAAA,EAAM,CAACF,MAAM,YAAYlL,QAASlG,KAAKI,OAAO,SAAE8D,aAAQ,eAIjE,KAAC,EAzEuB,CAAStD,IAAMK,WAqFnC4e,EAAS,kDAEb,WAAYhgB,GAAQ,IAAD,EAId,OAJc,qBACjB,cAAMA,IAMRwe,aAAe,WACb,EAAK3d,SAAS,CACZ4d,QAAQ,GAEZ,EAAC,EAEDC,aAAe,WACb,EAAK7d,SAAS,CACZ4d,QAAQ,GAEZ,EAfE,EAAKre,MAAS,CACZqe,QAAQ,GACP,CACL,CA8BC,OA9BA,mCAcD,WACE,IAAMsB,EAAY5f,KAAKH,MAAM+f,UACzBxc,EAAO0S,KAAW,UAAY8J,EAAU9S,GAAK,IAC7C1I,EAAYpE,KAAKC,MAAMqe,OAAS,0BAA4B,6BAChE,OACE,qBAAID,aAAcre,KAAKqe,aAAcE,aAAcve,KAAKue,aAAa,UACnE,oBAAIna,UAAU,OAAM,SAClB,mBAAGhB,KAAMA,EAAMjC,OAAO,SAAQ,SAAEqC,IAAMsc,YAAYF,EAAUT,mBAE9D,6BAAKS,EAAUb,gBACf,6BAAKvN,IAAOoO,EAAUd,YAAY/D,YAClC,6BACE,mBAAG3W,UAAWA,EAAW8B,QAASlG,KAAKH,MAAMyf,kBAAkBjf,KAAKL,KAAM4f,SAIlF,KAAC,EArCY,CAAShf,IAAMK,W,gBCjCf8e,EAlDG,kDAEhB,WAAYlgB,GAAQ,IAAD,EAKf,OALe,qBACjB,cAAMA,IACDI,MAAQ,CACX+f,cAAe,KACfrd,WAAW,GACX,CACJ,CAqCC,OArCA,8CAED,WAAqB,IAAD,OAClBN,IAAW4d,oBAAoBjgB,KAAKH,MAAMgE,OAAQ7D,KAAKH,MAAMqgB,UAAU5d,MAAK,SAAAC,GAC1EF,IAAW8d,eAAe5d,EAAIC,MAAMF,MAAK,SAAAC,GACvC,EAAK7B,SAAS,CACZsf,cAAezd,EAAIC,KACnBG,WAAW,GAEf,GACF,IAAGW,OAAM,SAAAC,GACP,IAAI2H,EAAa1H,IAAMC,YAAYF,GACnC8G,IAAQC,OAAOY,EACjB,GACF,GAAC,oBAED,WACE,OACE,eAAC2F,EAAA,EAAK,CAAC3Q,QAAQ,EAAME,OAAQJ,KAAKH,MAAMkR,aAAc3M,UAAU,gBAAgBY,KAAK,KAAI,UACvF,eAAC8L,EAAA,EAAW,WAAE9Q,KAAKH,MAAM2F,SACvB,mBAAGpB,UAAU,qBAAqBhB,KAAMpD,KAAKH,MAAMuD,KAAMjC,OAAO,SAAQ,SAAC,mBAAGiD,UAAU,0BAExF,cAAC4M,EAAA,EAAS,UACPhR,KAAKC,MAAM0C,UACV,cAAC,IAAO,IACR,cAAC,IAAc,CACbyd,gBAAiBpgB,KAAKC,MAAM+f,cAC5BK,SAAS,EACTC,aAAc1H,KAAW,4BAI/B,cAACvH,EAAA,EAAW,UACV,cAACC,EAAA,EAAM,CAACF,MAAM,YAAYlL,QAASlG,KAAKH,MAAMkR,aAAa,SAAE7M,aAAQ,eAI7E,KAAC,EA7Ce,CAAStD,IAAMK,WCM3Bsf,G,OAAW,kDAEf,WAAY1gB,GAAQ,IAAD,EAOf,OAPe,qBACjB,cAAMA,IASR2gB,kBAAoB,SAAC1C,GACnB,EAAKpd,SAAS,CACZod,WAAYA,EACZ2C,sBAAuB,EAAKxgB,MAAMwgB,sBAEtC,EAAC,EAEDC,cAAgB,WACd,EAAKhgB,SAAS,CACZ+f,sBAAsB,GAE1B,EAAC,EAEDE,aAAe,WACb,EAAKjgB,SAAS,CACZkgB,gBAAiB,EAAK3gB,MAAM2gB,gBAEhC,EAAC,EAEDC,aAAe,WACb,EAAKngB,SAAS,CACZogB,kBAAmB,EAAK7gB,MAAM6gB,kBAElC,EA/BE,EAAK7gB,MAAQ,CACX6d,WAAY,KACZ2C,sBAAsB,EACtBG,gBAAgB,EAChBE,kBAAkB,GAClB,CACJ,CAqHC,OArHA,mCA2BD,WAAU,IAAD,SAC6E9gB,KAAKH,MAAnFgE,EAAM,EAANA,OAAQqV,EAAW,EAAXA,YAAatB,EAAY,EAAZA,aAAcmJ,EAAc,EAAdA,eAAgBC,EAAW,EAAXA,YAAa5c,EAAS,EAATA,eAG/CmL,IAAnBwR,IACFA,EAAiB,WAECxR,IAAhByR,IACFA,EAAc,GAGhB,IAAI5d,EAA0B,OAAnB2d,EAA0BjL,KAAW,OAASjS,EAAS,QAAUL,IAAM2T,SAAS+B,EAAa6H,EAAeva,MAAS,aAAe,GAC3I0Z,EAA8B,OAAnBa,EAA0B7H,EAAc6H,EAAeva,KAAO,GAC7E,OACE,sBAAKpC,UAAS,wBAAmBA,GAAwB,IAAK,UAC3DwT,EAAatW,OAAS,GACrB,oBAAI8C,UAAU,gBAAe,SAC1BwT,EAAa9P,KAAI,SAACgQ,GACjB,OACE,qBAAyB1T,UAAU,gBAAe,UAChD,sBAAMA,UAAU,WAAWyB,MAAO,CAAC2V,gBAAgB1D,EAAY1G,SAC/D,sBAAMhN,UAAU,gBAAgBsB,MAAOoS,EAAYtR,KAAK,SAAEsR,EAAYtR,OACtE,wBAAQuG,KAAK,SAAS3I,UAAU,yCAAyC8B,QAAS,EAAKsa,kBAAkBngB,KAAK,EAAMyX,GAAa,SAC9HA,EAAYE,UAAY,EAAIF,EAAYE,UAAY,SAAWF,EAAYE,UAAY,YAJnFF,EAAYhL,GAQzB,MAGJ,sBAAK1I,UAAYwT,EAAatW,OAAS,GAAKyf,EAAkB,sBAAwB,iBAAiB,UAChF,OAAnBA,GAA2BvV,SAASuV,EAAe/b,MAAQ,GAC3D,uBAAMZ,UAAU,YAAY8B,QAASlG,KAAK6gB,aAAa,UACrD,sBAAMzc,UAAU,8BAChB,sBAAMA,UAAU,gBAAe,SAAE2c,EAAeva,UAG/B,OAAnBua,GAA2BvV,SAASuV,EAAe/b,MAAQ,GAC3D,uBAAMZ,UAAU,YAAW,UACzB,sBAAMA,UAAU,8BAChB,mBAAGA,UAAU,gBAAgBhB,KAAMA,EAAMjC,OAAO,SAASsd,IAAI,aAAY,SAAEsC,EAAeva,UAG7Fwa,EAAc,GACb,uBAAM5c,UAAU,YAAW,UACzB,sBAAMA,UAAU,8BAChB,sBAAMA,UAAU,gBAAe,SAAEF,aAAQ,WACzC,wBAAQ6I,KAAK,SAAS3I,UAAU,yCAAyC8B,QAASlG,KAAK2gB,aAAa,SACjGK,EAAc,EAAIA,EAAc,SAAWA,EAAc,gBAKjEhhB,KAAKC,MAAMwgB,sBACV,cAAC,IAAW,UACV,cAAC,IAAqB,CACpB5c,OAAQA,EACRia,WAAY9d,KAAKC,MAAM6d,WACvBM,QAASpe,KAAK0gB,cACd3P,aAAc/Q,KAAKwgB,kBACnB5C,mBAAoB5d,KAAKH,MAAM+d,mBAC/BV,iBAAkBld,KAAKH,MAAMqd,iBAC7B/D,eAAgBnZ,KAAKH,MAAMsZ,eAC3BC,mBAAoBpZ,KAAKH,MAAMuZ,uBAKpCpZ,KAAKC,MAAM2gB,gBACV,cAAC,IAAW,UACV,cAAC,EAAoB,CACnBxgB,OAAQJ,KAAK2gB,aACb9c,OAAQ7D,KAAKH,MAAMgE,WAKxB7D,KAAKC,MAAM6gB,kBACV,cAAC,IAAW,UACV,cAAC,EAAY,CACX/P,aAAc/Q,KAAK6gB,aACnBhd,OAAQA,EACRqc,SAAUA,EACV9c,KAAMA,EACNoC,SAAUub,EAAeva,WAMrC,KAAC,EA/Hc,CAAS5F,IAAMK,YAoIjBsf,K,0HChJTU,EAA4B,kHA+B/B,OA/B+B,mCAEhC,WAAU,IAAD,EAE2DjhB,KAAKH,MAAjEkN,EAAI,EAAJA,KAAOsI,EAAsB,EAAtBA,uBAAwBH,EAAwB,EAAxBA,yBACjCxP,EAAiB,SAATqH,EAAkB7I,aAAQ,oBAAsBA,aAAQ,oBACpEwB,EAAQA,EAAMY,QAAQ,QAAS4O,GAC/B,IAAIgM,EAAgB,CAClBpb,MAAOuP,EAAyB,IAChC8L,WAAY,OACZC,UAAW,QAEb,OACE,eAAC,IAAK,CAAClhB,QAAQ,EAAK,UAClB,cAAC,IAAW,CAACE,OAAQJ,KAAKH,MAAMqD,aAAa,SAAEwC,IAC/C,cAAC,IAAS,CAACG,MAAO,CAACwb,UAAW,QAAQ,SACpC,qBAAKjd,UAAU,WAAWyB,MAAO,CAAC8B,OAAQ,QAAQ,SAChD,qBACEvD,UAAU,oBACVwB,KAAK,cACLC,MAAOqb,EACP,gBAAe7L,EACf,gBAAc,IACd,gBAAc,MAAK,SAElBA,EAAyB,YAMtC,KAAC,EA/B+B,CAASzU,IAAMK,WAoClCggB,K","file":"static/js/sharedDirView.chunk.js","sourcesContent":["import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Tooltip from './Tooltip';\nimport { omit } from './utils';\nvar omitKeys = ['defaultOpen'];\n\nvar UncontrolledTooltip = /*#__PURE__*/function (_Component) {\n _inheritsLoose(UncontrolledTooltip, _Component);\n\n function UncontrolledTooltip(props) {\n var _this;\n\n _this = _Component.call(this, props) || this;\n _this.state = {\n isOpen: props.defaultOpen || false\n };\n _this.toggle = _this.toggle.bind(_assertThisInitialized(_this));\n return _this;\n }\n\n var _proto = UncontrolledTooltip.prototype;\n\n _proto.toggle = function toggle() {\n this.setState({\n isOpen: !this.state.isOpen\n });\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/React.createElement(Tooltip, _extends({\n isOpen: this.state.isOpen,\n toggle: this.toggle\n }, omit(this.props, omitKeys)));\n };\n\n return UncontrolledTooltip;\n}(Component);\n\nexport { UncontrolledTooltip as default };\nUncontrolledTooltip.propTypes = _objectSpread({\n defaultOpen: PropTypes.bool\n}, Tooltip.propTypes);","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody } from 'reactstrap';\nimport { gettext, fileServerRoot } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport Loading from '../loading';\n\nconst propTypes = {\n token: PropTypes.string,\n path: PropTypes.string.isRequired,\n repoID: PropTypes.string,\n target: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.array\n ]),\n toggleDialog: PropTypes.func.isRequired\n};\n\nlet interval;\n\nclass ZipDownloadDialog extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n isLoading: true,\n errorMsg: '',\n zipProgress: null\n };\n }\n\n componentDidMount() {\n const { token, path, repoID, target } = this.props;\n let getZipTask;\n if (token) {\n getZipTask = target.length ?\n seafileAPI.getShareLinkDirentsZipTask(token, path, target) :\n seafileAPI.getShareLinkZipTask(token, path);\n } else {\n getZipTask = seafileAPI.zipDownload(repoID, path, target);\n }\n getZipTask.then((res) => {\n const zipToken = res.data['zip_token'];\n this.setState({\n isLoading: false,\n errorMsg: '',\n zipToken: zipToken\n });\n this.queryZipProgress();\n interval = setInterval(this.queryZipProgress, 1000);\n }).catch((error) => {\n let errorMsg = Utils.getErrorMsg(error);\n this.setState({\n isLoading: false,\n errorMsg: errorMsg\n });\n });\n }\n\n queryZipProgress = () => {\n const zipToken = this.state.zipToken;\n seafileAPI.queryZipProgress(zipToken).then((res) => {\n const data = res.data;\n if (data.failed == 1) {\n clearInterval(interval);\n this.setState({\n isLoading: false,\n errorMsg: data.failed_reason\n });\n } else {\n this.setState({\n zipProgress: data.total == 0 ? '100%' : (data.zipped/data.total*100).toFixed(2) + '%'\n });\n if (data['total'] == data['zipped']) {\n clearInterval(interval);\n this.props.toggleDialog();\n location.href = `${fileServerRoot}zip/${zipToken}`;\n }\n }\n }).catch((error) => {\n clearInterval(interval);\n let errorMsg = Utils.getErrorMsg(error);\n this.setState({\n isLoading: false,\n errorMsg: errorMsg\n });\n });\n }\n\n cancelZipTask = () => {\n const zipToken = this.state.zipToken;\n seafileAPI.cancelZipTask(zipToken).then((res) => {\n // do nothing\n }).catch((error) => {\n // do nothing\n });\n }\n\n toggleDialog = () => {\n const zipProgress = this.state.zipProgress;\n if (zipProgress && zipProgress != '100%') {\n clearInterval(interval);\n this.cancelZipTask();\n }\n this.props.toggleDialog();\n }\n\n render() {\n return (\n \n {gettext('Download')}\n \n \n \n \n );\n }\n}\n\nclass Content extends React.Component {\n\n render() {\n const {isLoading, errorMsg, zipProgress} = this.props.data;\n\n if (isLoading) {\n return ;\n }\n\n if (errorMsg) {\n return

{errorMsg}

;\n }\n\n return

{`${gettext('Packaging...')} ${zipProgress}`}

;\n }\n}\n\nZipDownloadDialog.propTypes = propTypes;\n\nexport default ZipDownloadDialog;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n resumableFile: PropTypes.object.isRequired,\n onUploadCancel: PropTypes.func.isRequired,\n onUploadRetry: PropTypes.func.isRequired,\n};\n\nconst UPLOAD_UPLOADING = 'uploading';\nconst UPLOAD_ERROR = 'error';\nconst UPLOAD_ISSAVING = 'isSaving';\nconst UPLOAD_UPLOADED = 'uploaded';\n\nclass UploadListItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n uploadState: UPLOAD_UPLOADING\n };\n }\n\n componentWillReceiveProps(nextProps) {\n let { resumableFile } = nextProps;\n let uploadState = UPLOAD_UPLOADING;\n\n if (resumableFile.error) {\n uploadState = UPLOAD_ERROR;\n } else {\n if (resumableFile.remainingTime === 0 && !resumableFile.isSaved) {\n uploadState = UPLOAD_ISSAVING;\n }\n\n if (resumableFile.isSaved) {\n uploadState = UPLOAD_UPLOADED;\n }\n }\n\n this.setState({uploadState: uploadState});\n }\n\n onUploadCancel = (e) => {\n e.preventDefault();\n this.props.onUploadCancel(this.props.resumableFile);\n }\n\n onUploadRetry = (e) => {\n e.preventDefault();\n this.props.onUploadRetry(this.props.resumableFile);\n }\n\n formatFileSize = (size) => {\n if (typeof size !== 'number') {\n return '';\n }\n if (size >= 1000 * 1000 * 1000) {\n return (size / (1000 * 1000 * 1000)).toFixed(1) + ' G';\n }\n if (size >= 1000 * 1000) {\n return (size / (1000 * 1000)).toFixed(1) + ' M';\n }\n if (size >= 1000) {\n return (size / 1000).toFixed(1) + ' K';\n }\n return size.toFixed(1) + ' B';\n }\n\n render() {\n let { resumableFile } = this.props;\n let progress = Math.round(resumableFile.progress() * 100);\n let error = resumableFile.error;\n\n const fileName = resumableFile.newFileName;\n const size = this.formatFileSize(resumableFile.size);\n\n return (\n \n \n
{fileName}
\n \n \n {size}\n \n \n {(this.state.uploadState === UPLOAD_UPLOADING || this.state.uploadState === UPLOAD_ISSAVING) &&\n \n {resumableFile.size >= (100 * 1000 * 1000) &&\n \n {resumableFile.isUploading() && (\n
\n
\n
\n
\n {(resumableFile.remainingTime === -1) &&
{gettext('Preparing to upload...')}
}\n {(resumableFile.remainingTime > 0) &&
{gettext('Remaining')}{' '}{Utils.formatTime(resumableFile.remainingTime)}
}\n {(resumableFile.remainingTime === 0) &&
{gettext('Indexing...')}
}\n
\n )}\n {!resumableFile.isUploading() && (\n
\n
\n
\n
\n
\n )}\n
\n }\n {(resumableFile.size < (100 * 1000 * 1000)) &&\n
\n
\n
\n
\n
\n }\n
\n }\n {this.state.uploadState === UPLOAD_ERROR && (\n
\n )}\n \n \n \n {this.state.uploadState === UPLOAD_UPLOADING && (\n {gettext('Cancel')}\n )}\n {this.state.uploadState === UPLOAD_ERROR && (\n {gettext('Retry')}\n )}\n {this.state.uploadState === UPLOAD_ISSAVING && (\n {gettext('Saving...')}\n )}\n {this.state.uploadState === UPLOAD_UPLOADED && (\n {gettext('Uploaded')}\n )}\n \n \n \n );\n }\n}\n\nUploadListItem.propTypes = propTypes;\n\nexport default UploadListItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext, maxUploadFileSize } from '../../utils/constants';\n\nconst propTypes = {\n file: PropTypes.object,\n};\n\nclass ForbidUploadListItem extends React.Component {\n\n render() {\n let { file } = this.props;\n let msg = gettext('Please upload files less than {placeholder}M').replace('{placeholder}', maxUploadFileSize);\n return (\n \n \n
{file.name}
\n \n\n {msg}\n \n );\n }\n}\n\nForbidUploadListItem.propTypes = propTypes;\n\nexport default ForbidUploadListItem;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport UploadListItem from './upload-list-item';\nimport ForbidUploadListItem from './forbid-upload-list-item';\n\nconst propTypes = {\n uploadBitrate: PropTypes.number.isRequired,\n totalProgress: PropTypes.number.isRequired,\n retryFileList: PropTypes.array.isRequired,\n uploadFileList: PropTypes.array.isRequired,\n forbidUploadFileList: PropTypes.array.isRequired,\n onCloseUploadDialog: PropTypes.func.isRequired,\n onCancelAllUploading: PropTypes.func.isRequired,\n onUploadCancel: PropTypes.func.isRequired,\n onUploadRetry: PropTypes.func.isRequired,\n onUploadRetryAll: PropTypes.func.isRequired,\n allFilesUploaded: PropTypes.bool.isRequired,\n};\n\nclass UploadProgressDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isMinimized: false\n };\n }\n\n onCancelAllUploading = () => {\n this.props.onCancelAllUploading();\n }\n\n onMinimizeUpload = (e) => {\n e.nativeEvent.stopImmediatePropagation();\n this.setState({isMinimized: !this.state.isMinimized});\n }\n\n onCloseUpload = (e) => {\n e.nativeEvent.stopImmediatePropagation();\n this.props.onCloseUploadDialog();\n }\n\n render() {\n\n let uploadBitrate = Utils.formatBitRate(this.props.uploadBitrate);\n let uploadedMessage = gettext('File Upload');\n let uploadingMessage = gettext('File Uploading...') + ' ' + this.props.totalProgress + '% (' + uploadBitrate + ')';\n\n let uploadingOptions = ();\n\n let uploadedOptions = (\n \n \n \n \n );\n\n let { totalProgress, allFilesUploaded, retryFileList } = this.props;\n\n return (\n
\n
\n
\n {totalProgress === 100 ? uploadedMessage : uploadingMessage}\n
\n
\n {totalProgress === 100 || allFilesUploaded ? uploadedOptions : uploadingOptions}\n
\n
\n
\n
\n {retryFileList.length > 0 ?\n {gettext('Retry All')}\n :\n {gettext('Retry All')}\n }\n {!allFilesUploaded ?\n {gettext('Cancel All')}\n :\n {gettext('Cancel All')}\n }\n
\n \n \n \n \n \n \n \n \n \n \n {\n this.props.forbidUploadFileList.map((file, index) => {\n return ();\n })\n }\n {\n this.props.uploadFileList.map((resumableFile, index) => {\n return (\n \n );\n })\n }\n \n
{gettext('name')}{gettext('size')}{gettext('progress')}{gettext('state')}
\n
\n
\n );\n }\n}\n\nUploadProgressDialog.propTypes = propTypes;\n\nexport default UploadProgressDialog;\n","// the parent folder of this file is copied from components/file-uploader\n// this file is modified according to the requirements of 'file upload' in 'shared dir link'\nimport React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport Resumablejs from '@seafile/resumablejs';\nimport MD5 from 'MD5';\nimport { resumableUploadFileBlockSize, maxUploadFileSize, maxNumberOfFilesForFileupload } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport { gettext } from '../../utils/constants';\nimport UploadProgressDialog from './upload-progress-dialog';\nimport toaster from '../toast';\nimport '../../css/file-uploader.css';\n\nconst propTypes = {\n token: PropTypes.string.isRequired,\n repoID: PropTypes.string.isRequired,\n //direntList: PropTypes.array.isRequired,\n filetypes: PropTypes.array,\n chunkSize: PropTypes.number,\n withCredentials: PropTypes.bool,\n testMethod: PropTypes.string,\n testChunks: PropTypes.number,\n simultaneousUploads: PropTypes.number,\n fileParameterName: PropTypes.string,\n minFileSizeErrorCallback: PropTypes.func,\n fileTypeErrorCallback: PropTypes.func,\n dragAndDrop: PropTypes.bool.isRequired,\n path: PropTypes.string.isRequired,\n relativePath: PropTypes.string.isRequired,\n onFileUploadSuccess: PropTypes.func.isRequired\n};\n\nclass FileUploader extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n retryFileList: [],\n uploadFileList: [],\n forbidUploadFileList: [],\n totalProgress: 0,\n isUploadProgressDialogShow: false,\n isUploadRemindDialogShow: false,\n currentResumableFile: null,\n uploadBitrate: 0,\n allFilesUploaded: false,\n };\n\n this.uploadInput = React.createRef();\n\n this.notifiedFolders = [];\n\n this.timestamp = null;\n this.loaded = 0;\n this.bitrateInterval = 500; // Interval in milliseconds to calculate the bitrate\n window.onbeforeunload = this.onbeforeunload;\n this.isUploadLinkLoaded = false;\n }\n\n componentDidMount() {\n this.resumable = new Resumablejs({\n target: '',\n query: this.setQuery || {},\n fileType: this.props.filetypes,\n maxFiles: maxNumberOfFilesForFileupload || undefined,\n maxFileSize: maxUploadFileSize * 1000 * 1000 || undefined,\n testMethod: this.props.testMethod || 'post',\n testChunks: this.props.testChunks || false,\n headers: this.setHeaders || {},\n withCredentials: this.props.withCredentials || false,\n chunkSize: parseInt(resumableUploadFileBlockSize) * 1024 * 1024 || 1 * 1024 * 1024,\n simultaneousUploads: this.props.simultaneousUploads || 1,\n fileParameterName: this.props.fileParameterName,\n generateUniqueIdentifier: this.generateUniqueIdentifier,\n forceChunkSize: true,\n maxChunkRetries: 3,\n minFileSize: 0,\n });\n\n this.resumable.assignBrowse(this.uploadInput.current, true);\n\n //Enable or Disable DragAnd Drop\n if (this.props.dragAndDrop === true) {\n this.resumable.enableDropOnDocument();\n }\n\n this.bindCallbackHandler();\n this.bindEventHandler();\n }\n\n componentWillUnmount = () => {\n window.onbeforeunload = null;\n if (this.props.dragAndDrop === true) {\n this.resumable.disableDropOnDocument();\n }\n }\n\n onbeforeunload = () => {\n if (window.uploader &&\n window.uploader.isUploadProgressDialogShow &&\n window.uploader.totalProgress !== 100) {\n return '';\n }\n }\n\n bindCallbackHandler = () => {\n let { minFileSizeErrorCallback, fileTypeErrorCallback } = this.props;\n\n if (this.maxFilesErrorCallback) {\n this.resumable.opts.maxFilesErrorCallback = this.maxFilesErrorCallback;\n }\n\n if (minFileSizeErrorCallback) {\n this.resumable.opts.minFileSizeErrorCallback = this.props.minFileSizeErrorCallback;\n }\n\n if (this.maxFileSizeErrorCallback) {\n this.resumable.opts.maxFileSizeErrorCallback = this.maxFileSizeErrorCallback;\n }\n\n if (fileTypeErrorCallback) {\n this.resumable.opts.fileTypeErrorCallback = this.props.fileTypeErrorCallback;\n }\n\n }\n\n bindEventHandler = () => {\n this.resumable.on('chunkingComplete', this.onChunkingComplete.bind(this));\n this.resumable.on('fileAdded', this.onFileAdded.bind(this));\n this.resumable.on('filesAddedComplete', this.filesAddedComplete.bind(this));\n this.resumable.on('fileProgress', this.onFileProgress.bind(this));\n this.resumable.on('fileSuccess', this.onFileUploadSuccess.bind(this));\n this.resumable.on('progress', this.onProgress.bind(this));\n this.resumable.on('complete', this.onComplete.bind(this));\n this.resumable.on('pause', this.onPause.bind(this));\n this.resumable.on('fileRetry', this.onFileRetry.bind(this));\n this.resumable.on('fileError', this.onFileError.bind(this));\n this.resumable.on('error', this.onError.bind(this));\n this.resumable.on('beforeCancel', this.onBeforeCancel.bind(this));\n this.resumable.on('cancel', this.onCancel.bind(this));\n this.resumable.on('dragstart', this.onDragStart.bind(this));\n }\n\n maxFilesErrorCallback = (files, errorCount) => {\n let maxFiles = maxNumberOfFilesForFileupload;\n let message = gettext('Please upload no more than {maxFiles} files at a time.');\n message = message.replace('{maxFiles}', maxFiles);\n toaster.danger(message);\n }\n\n maxFileSizeErrorCallback = (file) => {\n let { forbidUploadFileList } = this.state;\n forbidUploadFileList.push(file);\n this.setState({forbidUploadFileList: forbidUploadFileList});\n }\n\n onChunkingComplete = (resumableFile) => {\n\n let allFilesUploaded = this.state.allFilesUploaded;\n if (allFilesUploaded === true) {\n this.setState({allFilesUploaded: false});\n }\n\n //get parent_dir relative_path\n let path = this.props.path === '/' ? '/' : this.props.path + '/';\n let fileName = resumableFile.fileName;\n let relativePath = resumableFile.relativePath;\n let isFile = fileName === relativePath;\n\n //update formdata\n resumableFile.formData = {};\n if (isFile) { // upload file\n resumableFile.formData = {\n parent_dir: path,\n };\n } else { // upload folder\n let relative_path = relativePath.slice(0, relativePath.lastIndexOf('/') + 1);\n resumableFile.formData = {\n parent_dir: path,\n relative_path: relative_path\n };\n }\n }\n\n onFileAdded = (resumableFile, files) => {\n let isFile = resumableFile.fileName === resumableFile.relativePath;\n // uploading is file and only upload one file\n if (isFile && files.length === 1) {\n let hasRepetition = false;\n /*\n let direntList = this.props.direntList;\n for (let i = 0; i < direntList.length; i++) {\n if (direntList[i].type === 'file' && direntList[i].name === resumableFile.fileName) {\n hasRepetition = true;\n break;\n }\n }\n */\n if (hasRepetition) {\n this.setState({\n isUploadRemindDialogShow: true,\n currentResumableFile: resumableFile,\n });\n } else {\n this.setUploadFileList(this.resumable.files);\n let { token, relativePath } = this.props;\n seafileAPI.sharedLinkGetFileUploadUrl(token, relativePath).then(res => {\n this.resumable.opts.target = res.data.upload_link + '?ret-json=1';\n this.resumableUpload(resumableFile);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n } else {\n this.setUploadFileList(this.resumable.files);\n if (!this.isUploadLinkLoaded) {\n this.isUploadLinkLoaded = true;\n let { token, relativePath } = this.props;\n seafileAPI.sharedLinkGetFileUploadUrl(token, relativePath).then(res => {\n this.resumable.opts.target = res.data.upload_link + '?ret-json=1';\n this.resumable.upload();\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n }\n }\n\n resumableUpload = (resumableFile) => {\n let { repoID, path } = this.props;\n seafileAPI.getFileUploadedBytes(repoID, path, resumableFile.fileName).then(res => {\n let uploadedBytes = res.data.uploadedBytes;\n let blockSize = parseInt(resumableUploadFileBlockSize) * 1024 * 1024 || 1024 * 1024;\n let offset = Math.floor(uploadedBytes / blockSize);\n resumableFile.markChunksCompleted(offset);\n this.resumable.upload();\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n filesAddedComplete = (resumable, files) => {\n let { forbidUploadFileList } = this.state;\n if (forbidUploadFileList.length > 0 && files.length === 0) {\n this.setState({\n isUploadProgressDialogShow: true,\n totalProgress: 100\n });\n }\n }\n\n setUploadFileList = () => {\n let uploadFileList = this.resumable.files;\n this.setState({\n uploadFileList: uploadFileList,\n isUploadProgressDialogShow: true,\n });\n Utils.registerGlobalVariable('uploader', 'isUploadProgressDialogShow', true);\n }\n\n onFileProgress = (resumableFile) => {\n let uploadBitrate = this.getBitrate();\n let uploadFileList = this.state.uploadFileList.map(item => {\n if (item.uniqueIdentifier === resumableFile.uniqueIdentifier) {\n if (uploadBitrate) {\n let lastSize = (item.size - (item.size * item.progress())) * 8;\n let time = Math.floor(lastSize / uploadBitrate);\n item.remainingTime = time;\n }\n }\n return item;\n });\n\n this.setState({\n uploadBitrate: uploadBitrate,\n uploadFileList: uploadFileList\n });\n }\n\n getBitrate = () => {\n let loaded = 0;\n let uploadBitrate = 0;\n let now = new Date().getTime();\n\n this.resumable.files.forEach(file => {\n loaded += file.progress() * file.size;\n });\n\n if (this.timestamp) {\n let timeDiff = (now - this.timestamp);\n if (timeDiff < this.bitrateInterval) {\n return this.state.uploadBitrate;\n }\n\n // 1. Cancel will produce loaded greater than this.loaded\n // 2. reset can make this.loaded to be 0\n if (loaded < this.loaded || this.loaded === 0) {\n this.loaded = loaded; //\n }\n\n uploadBitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;\n }\n\n this.timestamp = now;\n this.loaded = loaded;\n\n return uploadBitrate;\n }\n\n onProgress = () => {\n let progress = Math.round(this.resumable.progress() * 100);\n this.setState({totalProgress: progress});\n Utils.registerGlobalVariable('uploader', 'totalProgress', progress);\n }\n\n onFileUploadSuccess = (resumableFile, message) => {\n let formData = resumableFile.formData;\n let currentTime = new Date().getTime()/1000;\n message = formData.replace ? message : JSON.parse(message)[0];\n if (formData.relative_path) { // upload folder\n // 'upload folder' is not supported\n /*\n let relative_path = formData.relative_path;\n let dir_name = relative_path.slice(0, relative_path.indexOf('/'));\n let dirent = {\n id: message.id,\n name: dir_name,\n type: 'dir',\n mtime: currentTime,\n };\n\n // update folders cache\n let isExist = this.notifiedFolders.some(item => {return item.name === dirent.name;});\n if (!isExist) {\n this.notifiedFolders.push(dirent);\n this.props.onFileUploadSuccess(dirent);\n }\n\n // update uploadFileList\n let uploadFileList = this.state.uploadFileList.map(item => {\n if (item.uniqueIdentifier === resumableFile.uniqueIdentifier) {\n item.newFileName = relative_path + message.name;\n item.isSaved = true;\n }\n return item;\n });\n this.setState({uploadFileList: uploadFileList});\n\n return;\n */\n }\n\n // replacing file is not allowed in shared link with 'can_upload' permission\n /*\n if (formData.replace) { // upload file -- replace exist file\n let fileName = resumableFile.fileName;\n let dirent = {\n id: message,\n name: fileName,\n type: 'file',\n mtime: currentTime\n };\n this.props.onFileUploadSuccess(dirent); // this contance: just one file\n\n let uploadFileList = this.state.uploadFileList.map(item => {\n if (item.uniqueIdentifier === resumableFile.uniqueIdentifier) {\n item.newFileName = fileName;\n item.isSaved = true;\n }\n return item;\n });\n this.setState({uploadFileList: uploadFileList});\n\n return;\n }\n */\n\n // upload file -- add files\n let dirent = {\n id: message.id,\n type: 'file',\n name: message.name,\n size: message.size,\n mtime: currentTime,\n };\n this.props.onFileUploadSuccess(dirent); // this contance: no repetition file\n\n let uploadFileList = this.state.uploadFileList.map(item => {\n if (item.uniqueIdentifier === resumableFile.uniqueIdentifier) {\n item.newFileName = message.name;\n item.isSaved = true;\n }\n return item;\n });\n this.setState({uploadFileList: uploadFileList});\n }\n\n onFileError = (resumableFile, message) => {\n let error = '';\n if (!message) {\n error = gettext('Network error');\n } else {\n // eg: '{\"error\": \"Internal error\" \\n }'\n let errorMessage = message.replace(/\\n/g, '');\n errorMessage = JSON.parse(errorMessage);\n error = errorMessage.error;\n if (error === 'File locked by others.') {\n error = gettext('File is locked by others.');\n }\n if (error === 'Internal error.') {\n error = gettext('Internal Server Error');\n }\n }\n\n let uploadFileList = this.state.uploadFileList.map(item => {\n if (item.uniqueIdentifier === resumableFile.uniqueIdentifier) {\n this.state.retryFileList.push(item);\n item.error = error;\n }\n return item;\n });\n\n this.loaded = 0; // reset loaded data;\n this.setState({\n retryFileList: this.state.retryFileList,\n uploadFileList: uploadFileList\n });\n\n }\n\n onComplete = () => {\n this.notifiedFolders = [];\n // reset upload link loaded\n this.isUploadLinkLoaded = false;\n this.setState({allFilesUploaded: true});\n }\n\n onPause = () => {\n\n }\n\n onError = (message) => {\n // reset upload link loaded\n this.isUploadLinkLoaded = false;\n // After the error, the user can switch windows\n Utils.registerGlobalVariable('uploader', 'totalProgress', 100);\n }\n\n onFileRetry = () => {\n // todo, cancel upload file, uploded again;\n }\n\n onBeforeCancel = () => {\n // todo, giving a pop message ?\n }\n\n onCancel = () => {\n\n }\n\n setHeaders = (resumableFile, resumable) => {\n let offset = resumable.offset;\n let chunkSize = resumable.getOpt('chunkSize');\n let fileSize = resumableFile.size === 0 ? 1 : resumableFile.size;\n let startByte = offset !== 0 ? offset * chunkSize : 0;\n let endByte = Math.min(fileSize, (offset + 1) * chunkSize) - 1;\n\n if (fileSize - resumable.endByte < chunkSize && !resumable.getOpt('forceChunkSize')) {\n endByte = fileSize;\n }\n\n let headers = {\n 'Accept': 'application/json; text/javascript, */*; q=0.01',\n 'Content-Disposition': 'attachment; filename=\"' + encodeURI(resumableFile.fileName) + '\"',\n 'Content-Range': 'bytes ' + startByte + '-' + endByte + '/' + fileSize,\n };\n\n return headers;\n }\n\n setQuery = (resumableFile) => {\n let formData = resumableFile.formData;\n return formData;\n }\n\n generateUniqueIdentifier = (file) => {\n let relativePath = file.webkitRelativePath||file.relativePath||file.fileName||file.name;\n return MD5(relativePath + new Date()) + relativePath;\n }\n\n onClick = (e) => {\n e.nativeEvent.stopImmediatePropagation();\n e.stopPropagation();\n }\n\n onFileUpload = () => {\n this.uploadInput.current.removeAttribute('webkitdirectory');\n\n this.uploadInput.current.click();\n }\n\n onFolderUpload = () => {\n this.uploadInput.current.setAttribute('webkitdirectory', 'webkitdirectory');\n this.uploadInput.current.click();\n }\n\n onDragStart = () => {\n this.uploadInput.current.setAttribute('webkitdirectory', 'webkitdirectory');\n }\n\n onCloseUploadDialog = () => {\n this.loaded = 0;\n this.resumable.files = [];\n // reset upload link loaded\n this.isUploadLinkLoaded = false;\n this.setState({isUploadProgressDialogShow: false, uploadFileList: [], forbidUploadFileList: []});\n Utils.registerGlobalVariable('uploader', 'isUploadProgressDialogShow', false);\n }\n\n onUploadCancel = (uploadingItem) => {\n\n let uploadFileList = this.state.uploadFileList.filter(item => {\n if (item.uniqueIdentifier === uploadingItem.uniqueIdentifier) {\n item.cancel(); // execute cancel function will delete the file at the same time\n return false;\n }\n return true;\n });\n\n if (!this.resumable.isUploading()) {\n this.setState({\n totalProgress: '100',\n allFilesUploaded: true,\n });\n this.loaded = 0;\n }\n\n this.setState({uploadFileList: uploadFileList});\n }\n\n onCancelAllUploading = () => {\n let uploadFileList = this.state.uploadFileList.filter(item => {\n if (Math.round(item.progress() !== 1)) {\n item.cancel();\n return false;\n }\n return true;\n });\n\n this.loaded = 0;\n\n this.setState({\n allFilesUploaded: true,\n totalProgress: '100',\n uploadFileList: uploadFileList\n });\n // reset upload link loaded\n this.isUploadLinkLoaded = false;\n }\n\n onUploadRetry = (resumableFile) => {\n\n let { token, relativePath } = this.props;\n seafileAPI.sharedLinkGetFileUploadUrl(token, relativePath).then(res => {\n this.resumable.opts.target = res.data.upload_link + '?ret-json=1';\n\n let retryFileList = this.state.retryFileList.filter(item => {\n return item.uniqueIdentifier !== resumableFile.uniqueIdentifier;\n });\n let uploadFileList = this.state.uploadFileList.map(item => {\n if (item.uniqueIdentifier === resumableFile.uniqueIdentifier) {\n item.error = null;\n this.retryUploadFile(item);\n }\n return item;\n });\n\n this.setState({\n retryFileList: retryFileList,\n uploadFileList: uploadFileList\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n onUploadRetryAll = () => {\n\n let { token, relativePath } = this.props;\n seafileAPI.sharedLinkGetFileUploadUrl(token, relativePath).then(res => {\n this.resumable.opts.target = res.data.upload_link + '?ret-json=1';\n this.state.retryFileList.forEach(item => {\n item.error = false;\n this.retryUploadFile(item);\n });\n\n let uploadFileList = this.state.uploadFileList.slice(0);\n this.setState({\n retryFileList: [],\n uploadFileList: uploadFileList\n });\n\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n retryUploadFile = (resumableFile) => {\n let { repoID, path } = this.props;\n let fileName = resumableFile.fileName;\n let isFile = resumableFile.fileName === resumableFile.relativePath;\n if (!isFile) {\n let relative_path = resumableFile.formData.relative_path;\n let prefix = path === '/' ? (path + relative_path) : (path + '/' + relative_path);\n fileName = prefix + fileName;\n }\n\n resumableFile.bootstrap();\n var firedRetry = false;\n resumableFile.resumableObj.on('chunkingComplete', () => {\n if(!firedRetry) {\n seafileAPI.getFileUploadedBytes(repoID, path, fileName).then(res => {\n let uploadedBytes = res.data.uploadedBytes;\n let blockSize = parseInt(resumableUploadFileBlockSize) * 1024 * 1024 || 1024 * 1024;\n let offset = Math.floor(uploadedBytes / blockSize);\n resumableFile.markChunksCompleted(offset);\n\n resumableFile.resumableObj.upload();\n\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n firedRetry = true;\n });\n }\n\n uploadFile = () => {\n let resumableFile = this.resumable.files[this.resumable.files.length - 1];\n\n let { token, relativePath } = this.props;\n seafileAPI.sharedLinkGetFileUploadUrl(token, relativePath).then(res => {\n this.resumable.opts.target = res.data.upload_link + '?ret-json=1';\n this.setState({\n isUploadRemindDialogShow: false,\n isUploadProgressDialogShow: true,\n uploadFileList: [...this.state.uploadFileList, resumableFile]\n }, () => {\n this.resumable.upload();\n });\n Utils.registerGlobalVariable('uploader', 'isUploadProgressDialogShow', true);\n\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n cancelFileUpload = () => {\n this.resumable.files.pop(); //delete latest fileļ¼›\n this.setState({isUploadRemindDialogShow: false});\n }\n\n render() {\n return (\n \n
\n
\n \n
\n
\n {this.state.isUploadProgressDialogShow &&\n \n }\n
\n );\n }\n}\n\nFileUploader.propTypes = propTypes;\n\nexport default FileUploader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Alert } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport FileChooser from '../file-chooser/file-chooser';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n sharedToken: PropTypes.string.isRequired,\n parentDir: PropTypes.string.isRequired,\n items: PropTypes.array.isRequired,\n toggleCancel: PropTypes.func.isRequired,\n handleSaveSharedDir: PropTypes.func.isRequired,\n};\n\nclass SaveSharedDirDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n repo: null,\n selectedPath: '',\n errMessage: '',\n };\n }\n\n onSaveSharedFile = () => {\n this.props.handleSaveSharedDir(this.state.repo.repo_id, this.state.selectedPath)\n }\n\n onDirentItemClick = (repo, selectedPath, dirent) => {\n if (dirent.type === 'dir') {\n this.setState({\n repo: repo,\n selectedPath: selectedPath,\n });\n }\n else {\n this.setState({\n repo: null,\n selectedPath: '',\n });\n }\n }\n\n onRepoItemClick = (repo) => {\n this.setState({\n repo: repo,\n selectedPath: '/',\n });\n }\n\n render() {\n return (\n \n {gettext('Save to:')}\n \n \n {this.state.errMessage && {this.state.errMessage}}\n \n \n \n { this.state.selectedPath ?\n \n :\n \n }\n \n \n );\n }\n}\n\nSaveSharedDirDialog.propTypes = propTypes;\n\nexport default SaveSharedDirDialog;\n","import React, { Fragment } from 'react';\nimport MD5 from 'MD5';\nimport ReactDom from 'react-dom';\nimport { Button, Dropdown, DropdownToggle, DropdownItem, UncontrolledTooltip } from 'reactstrap';\nimport moment from 'moment';\nimport Account from './components/common/account';\nimport { useGoFileserver, fileServerRoot, gettext, siteRoot, mediaUrl, logoPath, logoWidth, logoHeight, siteTitle, thumbnailSizeForOriginal } from './utils/constants';\nimport { Utils } from './utils/utils';\nimport { seafileAPI } from './utils/seafile-api';\nimport Loading from './components/loading';\nimport toaster from './components/toast';\nimport ModalPortal from './components/modal-portal';\nimport ZipDownloadDialog from './components/dialog/zip-download-dialog';\nimport ImageDialog from './components/dialog/image-dialog';\nimport FileUploader from './components/shared-link-file-uploader/file-uploader';\nimport SaveSharedDirDialog from './components/dialog/save-shared-dir-dialog';\nimport CopyMoveDirentProgressDialog from './components/dialog/copy-move-dirent-progress-dialog';\nimport RepoInfoBar from './components/repo-info-bar';\nimport RepoTag from './models/repo-tag';\n\nimport './css/shared-dir-view.css';\nimport './css/grid-view.css';\n\nmoment.locale(window.app.config.lang);\n\nlet loginUser = window.app.pageOptions.name;\nlet {\n token, dirName, dirPath, sharedBy,\n repoID, relativePath,\n mode, thumbnailSize, zipped,\n trafficOverLimit, canDownload,\n noQuota, canUpload, enableVideoThumbnail\n} = window.shared.pageOptions;\n\nconst showDownloadIcon = !trafficOverLimit && canDownload;\n\nclass SharedDirView extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isLoading: true,\n errorMsg: '',\n items: [],\n\n isAllItemsSelected: false,\n selectedItems: [],\n\n sortBy: 'name', // 'name' or 'time' or 'size'\n sortOrder: 'asc', // 'asc' or 'desc'\n\n isZipDialogOpen: false,\n zipFolderPath: '',\n\n usedRepoTags: [],\n isRepoInfoBarShow: false,\n\n isSaveSharedDirDialogShow: false,\n itemsForSave: [],\n\n asyncCopyMoveTaskId: '',\n asyncOperationProgress: 0,\n asyncOperatedFilesLength: 0,\n isCopyMoveProgressDialogShow: false,\n\n isImagePopupOpen: false,\n imageItems: [],\n imageIndex: 0\n };\n }\n\n componentDidMount() {\n if (trafficOverLimit) {\n toaster.danger(gettext('File download is disabled: the share link traffic of owner is used up.'), {\n duration: 3\n });\n }\n\n seafileAPI.listSharedDir(token, relativePath, thumbnailSize).then((res) => {\n const items = res.data['dirent_list'].map(item => {\n item.isSelected = false;\n return item;\n });\n this.setState({\n isLoading: false,\n errorMsg: '',\n items: Utils.sortDirentsInSharedDir(items, this.state.sortBy, this.state.sortOrder)\n });\n this.getThumbnails();\n }).catch((error) => {\n let errorMsg = Utils.getErrorMsg(error);\n this.setState({\n isLoading: false,\n errorMsg: errorMsg\n });\n });\n\n this.getShareLinkRepoTags();\n }\n\n sortItems = (sortBy, sortOrder) => {\n this.setState({\n sortBy: sortBy,\n sortOrder: sortOrder,\n items: Utils.sortDirentsInSharedDir(this.state.items, sortBy, sortOrder)\n });\n }\n\n getThumbnails = () => {\n let items = this.state.items.filter((item) => {\n return !item.is_dir &&\n (Utils.imageCheck(item.file_name) ||\n (enableVideoThumbnail && Utils.videoCheck(item.file_name))) &&\n !item.encoded_thumbnail_src;\n });\n if (items.length == 0) {\n return ;\n }\n\n const len = items.length;\n const _this = this;\n let getThumbnail = function(i) {\n const curItem = items[i];\n seafileAPI.getShareLinkThumbnail(token, curItem.file_path, thumbnailSize).then((res) => {\n curItem.encoded_thumbnail_src = res.data.encoded_thumbnail_src;\n }).catch((error) => {\n // do nothing\n }).then(() => {\n if (i < len - 1) {\n getThumbnail(++i);\n } else {\n // when done, `setState()`\n _this.setState({\n items: _this.state.items\n });\n }\n });\n };\n getThumbnail(0);\n }\n\n renderPath = () => {\n return (\n \n {zipped.map((item, index) => {\n if (index != zipped.length - 1) {\n return (\n \n {item.name}\n / \n \n );\n }\n })\n }\n {zipped[zipped.length - 1].name}\n \n );\n }\n\n zipDownloadFolder = (folderPath) => {\n if (!useGoFileserver) {\n this.setState({\n isZipDialogOpen: true,\n zipFolderPath: folderPath\n });\n }\n else {\n seafileAPI.getShareLinkZipTask(token, folderPath).then((res) => {\n const zipToken = res.data['zip_token'];\n location.href = `${fileServerRoot}zip/${zipToken}`;\n }).catch((error) => {\n let errorMsg = Utils.getErrorMsg(error);\n this.setState({\n isLoading: false,\n errorMsg: errorMsg\n });\n });\n }\n }\n\n zipDownloadSelectedItems = () => {\n if (!useGoFileserver) {\n this.setState({\n isZipDialogOpen: true,\n zipFolderPath: relativePath,\n selectedItems: this.state.items.filter(item => item.isSelected)\n .map(item => item.file_name || item.folder_name)\n });\n }\n else {\n let target = this.state.items.filter(item => item.isSelected).map(item => item.file_name || item.folder_name);\n seafileAPI.getShareLinkDirentsZipTask(token, relativePath, target).then((res) => {\n const zipToken = res.data['zip_token'];\n location.href = `${fileServerRoot}zip/${zipToken}`;\n }).catch((error) => {\n let errorMsg = Utils.getErrorMsg(error);\n this.setState({\n isLoading: false,\n errorMsg: errorMsg\n });\n });\n }\n }\n\n async getAsyncCopyMoveProgress() {\n let { asyncCopyMoveTaskId } = this.state;\n try {\n let res = await seafileAPI.queryAsyncOperationProgress(asyncCopyMoveTaskId);\n let data = res.data;\n if (data.failed) {\n let message = gettext('Failed to copy files to another library.');\n toaster.danger(message);\n this.setState({\n asyncOperationProgress: 0,\n isCopyMoveProgressDialogShow: false,\n });\n return;\n }\n\n if (data.successful) {\n this.setState({\n asyncOperationProgress: 0,\n isCopyMoveProgressDialogShow: false,\n });\n let message = gettext('Successfully copied files to another library.');\n toaster.success(message);\n return;\n }\n // init state: total is 0\n let asyncOperationProgress = !data.total ? 0 : parseInt((data.done/data.total * 100).toFixed(2));\n\n this.getAsyncCopyMoveProgress();\n this.setState({asyncOperationProgress: asyncOperationProgress});\n } catch (error) {\n this.setState({\n asyncOperationProgress: 0,\n isCopyMoveProgressDialogShow: false,\n });\n }\n }\n\n saveSelectedItems = () => {\n this.setState({\n isSaveSharedDirDialogShow: true,\n itemsForSave: this.state.items.filter(item => item.isSelected)\n .map(item => item.file_name || item.folder_name)\n });\n }\n\n saveAllItems = () => {\n this.setState({\n isSaveSharedDirDialogShow: true,\n itemsForSave: this.state.items\n .map(item => item.file_name || item.folder_name)\n });\n }\n\n toggleSaveSharedDirCancel = () => {\n this.setState({\n isSaveSharedDirDialogShow: false,\n itemsForSave: []\n });\n }\n\n handleSaveSharedDir = (destRepoID, dstPath) => {\n\n const itemsForSave = this.state.itemsForSave;\n\n seafileAPI.saveSharedDir(destRepoID, dstPath, token, relativePath, itemsForSave).then((res) => {\n this.setState({\n isSaveSharedDirDialogShow: false,\n itemsForSave: [],\n isCopyMoveProgressDialogShow: true,\n asyncCopyMoveTaskId: res.data.task_id,\n asyncOperatedFilesLength: itemsForSave.length,\n }, () => {\n this.getAsyncCopyMoveProgress();\n });\n }).catch((error) => {\n let errMessage = Utils.getErrorMsg(error);\n this.setState({errMessage: errMessage});\n });\n }\n\n onProgressDialogToggle = () => {\n let { asyncOperationProgress } = this.state;\n if (asyncOperationProgress !== 100) {\n let taskId = this.state.asyncCopyMoveTaskId;\n seafileAPI.cancelCopyMoveOperation(taskId);\n }\n\n this.setState({\n asyncOperationProgress: 0,\n isCopyMoveProgressDialogShow: false,\n });\n }\n\n closeZipDialog = () => {\n this.setState({\n isZipDialogOpen: false,\n zipFolderPath: '',\n selectedItems: []\n });\n }\n\n // for image popup\n prepareImageItem = (item) => {\n const name = item.file_name;\n const fileExt = name.substr(name.lastIndexOf('.') + 1).toLowerCase();\n const isGIF = fileExt == 'gif';\n\n let src;\n const fileURL = `${siteRoot}d/${token}/files/?p=${encodeURIComponent(item.file_path)}`;\n if (!isGIF) {\n src = `${siteRoot}thumbnail/${token}/${thumbnailSizeForOriginal}${Utils.encodePath(item.file_path)}`;\n } else {\n src = `${fileURL}&raw=1`;\n }\n\n return {\n 'name': name,\n 'url': fileURL,\n 'src': src\n };\n }\n\n showImagePopup = (curItem) => {\n const items = this.state.items.filter((item) => {\n return !item.is_dir && Utils.imageCheck(item.file_name);\n });\n const imageItems = items.map((item) => {\n return this.prepareImageItem(item);\n });\n\n this.setState({\n isImagePopupOpen: true,\n imageItems: imageItems,\n imageIndex: items.indexOf(curItem)\n });\n }\n\n closeImagePopup = () => {\n this.setState({\n isImagePopupOpen: false\n });\n }\n\n moveToPrevImage = () => {\n const imageItemsLength = this.state.imageItems.length;\n this.setState((prevState) => ({\n imageIndex: (prevState.imageIndex + imageItemsLength - 1) % imageItemsLength\n }));\n }\n\n moveToNextImage = () => {\n const imageItemsLength = this.state.imageItems.length;\n this.setState((prevState) => ({\n imageIndex: (prevState.imageIndex + 1) % imageItemsLength\n }));\n }\n\n toggleAllSelected = () => {\n this.setState((prevState) => ({\n isAllItemsSelected: !prevState.isAllItemsSelected,\n items: this.state.items.map((item) => {\n item.isSelected = !prevState.isAllItemsSelected;\n return item;\n })\n }));\n }\n\n toggleItemSelected = (targetItem, isSelected) => {\n this.setState({\n items: this.state.items.map((item) => {\n if (item === targetItem) {\n item.isSelected = isSelected;\n }\n return item;\n })\n }, () => {\n this.setState({\n isAllItemsSelected: !this.state.items.some(item => !item.isSelected)\n });\n });\n }\n\n onUploadFile = (e) => {\n e.nativeEvent.stopImmediatePropagation();\n this.uploader.onFileUpload();\n }\n\n onFileUploadSuccess = (direntObject) => {\n const { name, size } = direntObject;\n const newItem = {\n isSelected: false,\n file_name: name,\n file_path: Utils.joinPath(relativePath, name),\n is_dir: false,\n last_modified: moment().format(),\n size: size\n };\n const folderItems = this.state.items.filter(item => { return item.is_dir; });\n // put the new file as the first file\n let items = Array.from(this.state.items);\n items.splice(folderItems.length, 0, newItem);\n this.setState({items: items});\n seafileAPI.shareLinksUploadDone(token, Utils.joinPath(dirPath, name));\n }\n\n getShareLinkRepoTags = () => {\n seafileAPI.getShareLinkRepoTags(token).then(res => {\n let usedRepoTags = [];\n res.data.repo_tags.forEach(item => {\n let usedRepoTag = new RepoTag(item);\n if (usedRepoTag.fileCount > 0) {\n usedRepoTags.push(usedRepoTag);\n }\n });\n this.setState({usedRepoTags: usedRepoTags});\n if (usedRepoTags.length != 0 && relativePath == '/') {\n this.setState({isRepoInfoBarShow: true});\n }\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n render() {\n const isDesktop = Utils.isDesktop();\n const modeBaseClass = 'btn btn-secondary btn-icon sf-view-mode-btn';\n return (\n \n
\n
\n \n \"logo\"\n \n {loginUser && }\n
\n
\n
\n

{dirName}

\n

{gettext('Shared by: ')}{sharedBy}

\n
\n

{gettext('Current path: ')}{this.renderPath()}

\n
\n {isDesktop &&\n
\n \n \n
\n }\n {canUpload && (\n \n )}\n {showDownloadIcon &&\n \n {this.state.items.some(item => item.isSelected) ?\n \n \n {(canDownload && loginUser && (loginUser !== sharedBy)) &&\n \n }\n \n :\n \n \n {(canDownload && loginUser && (loginUser !== sharedBy)) &&\n \n }\n \n }\n \n }\n
\n
\n {!noQuota && canUpload && (\n this.uploader = uploader}\n dragAndDrop={false}\n token={token}\n path={dirPath === '/' ? dirPath : dirPath.replace(/\\/+$/, '')}\n relativePath={relativePath === '/' ? relativePath : relativePath.replace(/\\/+$/, '')}\n repoID={repoID}\n onFileUploadSuccess={this.onFileUploadSuccess}\n />\n )}\n\n {this.state.isRepoInfoBarShow && (\n \n )}\n\n \n
\n
\n
\n {this.state.isZipDialogOpen &&\n \n \n \n }\n {this.state.isSaveSharedDirDialogShow &&\n \n }\n {this.state.isCopyMoveProgressDialogShow && (\n \n )}\n {this.state.isImagePopupOpen &&\n \n \n \n }\n
\n );\n }\n}\n\nclass Content extends React.Component {\n\n constructor(props) {\n super(props);\n }\n\n sortByName = (e) => {\n e.preventDefault();\n const sortBy = 'name';\n const sortOrder = this.props.sortOrder == 'asc' ? 'desc' : 'asc';\n this.props.sortItems(sortBy, sortOrder);\n }\n\n sortByTime = (e) => {\n e.preventDefault();\n const sortBy = 'time';\n const sortOrder = this.props.sortOrder == 'asc' ? 'desc' : 'asc';\n this.props.sortItems(sortBy, sortOrder);\n }\n\n sortBySize = (e) => {\n e.preventDefault();\n const sortBy = 'size';\n const sortOrder = this.props.sortOrder == 'asc' ? 'desc' : 'asc';\n this.props.sortItems(sortBy, sortOrder);\n }\n\n render() {\n const {\n isDesktop,\n isLoading, errorMsg, items,\n sortBy, sortOrder,\n isAllItemsSelected\n } = this.props;\n\n if (isLoading) {\n return ;\n }\n\n if (errorMsg) {\n return

{errorMsg}

;\n }\n\n const tbody = (\n \n {items.map((item, index) => {\n return ;\n })}\n \n );\n\n if (!isDesktop) {\n return (\n \n \n \n \n \n \n \n \n {tbody}\n
\n );\n }\n\n const sortIcon = ;\n return mode == 'list' ? (\n \n \n \n {showDownloadIcon &&\n \n }\n \n \n \n \n \n \n \n \n {tbody}\n
\n \n {gettext('Name')} {sortBy == 'name' && sortIcon}{gettext('Size')} {sortBy == 'size' && sortIcon}{gettext('Last Update')} {sortBy == 'time' && sortIcon}
\n ) : (\n
    \n {items.map((item, index) => {\n return ;\n })}\n
\n );\n }\n}\n\nclass Item extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isIconShown: false,\n isOpMenuOpen: false\n };\n }\n\n toggleOpMenu = () => {\n this.setState({isOpMenuOpen: !this.state.isOpMenuOpen});\n }\n\n handleMouseOver = () => {\n this.setState({isIconShown: true});\n }\n\n handleMouseOut = () => {\n this.setState({isIconShown: false});\n }\n\n zipDownloadFolder = (e) => {\n e.preventDefault();\n this.props.zipDownloadFolder.bind(this, this.props.item.folder_path)();\n }\n\n handleFileClick = (e) => {\n const item = this.props.item;\n if (!Utils.imageCheck(item.file_name)) {\n return;\n }\n\n e.preventDefault();\n this.props.showImagePopup(item);\n }\n\n toggleItemSelected = (e) => {\n this.props.toggleItemSelected(this.props.item, e.target.checked);\n }\n\n render() {\n const { item, isDesktop } = this.props;\n const { isIconShown } = this.state;\n\n let toolTipID = '';\n let tagTitle = '';\n if (item.file_tags && item.file_tags.length > 0) {\n toolTipID = MD5(item.file_name).slice(0, 7);\n tagTitle = item.file_tags.map(item => item.tag_name).join(' ');\n }\n\n if (item.is_dir) {\n return isDesktop ? (\n \n {showDownloadIcon &&\n \n \n \n }\n \"\"\n \n {item.folder_name}\n \n \n \n {moment(item.last_modified).fromNow()}\n \n {showDownloadIcon &&\n \n \n }\n \n \n ) : (\n \n \"\"\n \n {item.folder_name}\n
\n {moment(item.last_modified).fromNow()}\n \n \n {showDownloadIcon &&\n \n \n
\n
\n
\n {gettext('Download')}\n
\n
\n
\n }\n \n \n );\n } else {\n const fileURL = `${siteRoot}d/${token}/files/?p=${encodeURIComponent(item.file_path)}`;\n const thumbnailURL = item.encoded_thumbnail_src ? `${siteRoot}${item.encoded_thumbnail_src}` : '';\n return isDesktop ? (\n \n {showDownloadIcon &&\n \n \n \n }\n \n {thumbnailURL ?\n \"\" :\n \"\"\n }\n \n \n {item.file_name}\n \n \n {(item.file_tags && item.file_tags.length > 0) && (\n \n
\n {item.file_tags.map((fileTag, index) => {\n let length = item.file_tags.length;\n return (\n \n );\n })}\n
\n \n {tagTitle}\n \n
\n )}\n \n {Utils.bytesToSize(item.size)}\n {moment(item.last_modified).fromNow()}\n \n {showDownloadIcon &&\n \n }\n \n \n ) : (\n \n \n {thumbnailURL ?\n \"\" :\n \"\"\n }\n \n \n {item.file_name}\n
\n {Utils.bytesToSize(item.size)}\n {moment(item.last_modified).fromNow()}\n \n \n {showDownloadIcon &&\n \n \n
\n
\n
\n {gettext('Download')}\n
\n
\n
\n }\n \n \n );\n }\n }\n}\n\nclass GridItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n isIconShown: false\n };\n }\n\n handleMouseOver = () => {\n this.setState({isIconShown: true});\n }\n\n handleMouseOut = () => {\n this.setState({isIconShown: false});\n }\n\n zipDownloadFolder = (e) => {\n e.preventDefault();\n this.props.zipDownloadFolder.bind(this, this.props.item.folder_path)();\n }\n\n handleFileClick = (e) => {\n const item = this.props.item;\n if (!Utils.imageCheck(item.file_name)) {\n return;\n }\n\n e.preventDefault();\n this.props.showImagePopup(item);\n }\n\n render() {\n const item = this.props.item;\n const { isIconShown } = this.state;\n\n if (item.is_dir) {\n const folderURL = `?p=${encodeURIComponent(item.folder_path.substr(0, item.folder_path.length - 1))}&mode=${mode}`;\n return (\n
  • \n \n \"\"\n \n {item.folder_name}\n {showDownloadIcon &&\n \n \n }\n
  • \n );\n } else {\n const fileURL = `${siteRoot}d/${token}/files/?p=${encodeURIComponent(item.file_path)}`;\n const thumbnailURL = item.encoded_thumbnail_src ? `${siteRoot}${item.encoded_thumbnail_src}` : '';\n return (\n
  • \n \n {thumbnailURL ?\n \"\" :\n \"\"\n }\n \n {item.file_name}\n {showDownloadIcon &&\n \n \n }\n
  • \n );\n }\n }\n}\n\nReactDom.render(, document.getElementById('wrapper'));\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\n\nimport Lightbox from '@seafile/react-image-lightbox';\nimport '@seafile/react-image-lightbox/style.css';\n\nconst propTypes = {\n imageItems: PropTypes.array.isRequired,\n imageIndex: PropTypes.number.isRequired,\n closeImagePopup: PropTypes.func.isRequired,\n moveToPrevImage: PropTypes.func.isRequired,\n moveToNextImage: PropTypes.func.isRequired\n};\n\nclass ImageDialog extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const imageItems = this.props.imageItems;\n const imageIndex = this.props.imageIndex;\n const imageItemsLength = imageItems.length;\n const name = imageItems[imageIndex].name;\n const imageTitle = `${name} (${imageIndex + 1}/${imageItemsLength})`;\n\n return (\n \n );\n }\n}\n\nImageDialog.propTypes = propTypes;\n\nexport default ImageDialog;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport moment from 'moment';\nimport { gettext, siteRoot } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../toast';\n\nconst propTypes = {\n repoID: PropTypes.string.isRequired,\n currentTag: PropTypes.object.isRequired,\n toggleCancel: PropTypes.func.isRequired,\n onClose: PropTypes.func.isRequired,\n updateUsedRepoTags: PropTypes.func,\n onFileTagChanged: PropTypes.func,\n shareLinkToken: PropTypes.string,\n enableFileDownload: PropTypes.bool\n};\n\nclass ListTaggedFilesDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n taggedFileList: [],\n };\n }\n\n onFileTagChanged = (TaggedFile) => {\n const path = TaggedFile.parent_path;\n const dirent = {name: TaggedFile.filename};\n let direntPath = path === '/' ? path + TaggedFile.filename : path + '/' + TaggedFile.filename;\n this.props.onFileTagChanged(dirent, direntPath);\n }\n\n onDeleteTaggedFile = (taggedFile) => {\n let repoID = this.props.repoID;\n let fileTagID = taggedFile.file_tag_id;\n seafileAPI.deleteFileTag(repoID, fileTagID).then(res => {\n this.getTaggedFiles();\n this.props.updateUsedRepoTags();\n if ((this.props.onFileTagChanged) && !taggedFile.file_deleted) this.onFileTagChanged(taggedFile);\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n componentDidMount() {\n this.getTaggedFiles();\n }\n\n getTaggedFiles = () => {\n let { repoID, currentTag, shareLinkToken } = this.props;\n let request = shareLinkToken ?\n seafileAPI.getShareLinkTaggedFiles(shareLinkToken, currentTag.id) :\n seafileAPI.listTaggedFiles(repoID, currentTag.id);\n request.then(res => {\n let taggedFileList = [];\n res.data.tagged_files !== undefined &&\n res.data.tagged_files.forEach(file => {\n let taggedFile = file;\n taggedFileList.push(taggedFile);\n });\n this.setState({\n taggedFileList: taggedFileList,\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n render() {\n let taggedFileList = this.state.taggedFileList;\n return (\n \n {gettext('Tagged Files')}\n \n \n \n \n \n \n \n \n \n \n \n {taggedFileList.map((taggedFile, index) => {\n return (\n \n );\n })}\n \n
    {gettext('Name')}{gettext('Size')}{gettext('Last Update')}
    \n
    \n \n \n \n
    \n );\n }\n}\n\nListTaggedFilesDialog.propTypes = propTypes;\n\nexport default ListTaggedFilesDialog;\n\nconst TaggedFilePropTypes = {\n repoID: PropTypes.string.isRequired,\n taggedFile: PropTypes.object,\n onDeleteTaggedFile: PropTypes.func.isRequired,\n shareLinkToken: PropTypes.string,\n enableFileDownload: PropTypes.bool\n};\n\nclass TaggedFile extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = ({\n active: false,\n });\n }\n\n onMouseEnter = () => {\n this.setState({\n active: true\n });\n }\n\n onMouseLeave = () => {\n this.setState({\n active: false\n });\n }\n\n deleteFile = (e) => {\n e.preventDefault();\n this.props.onDeleteTaggedFile(this.props.taggedFile);\n }\n\n render() {\n const { taggedFile, shareLinkToken, enableFileDownload } = this.props;\n\n let path = taggedFile.parent_path ? Utils.joinPath(taggedFile.parent_path, taggedFile.filename) : '';\n let href = shareLinkToken ?\n siteRoot + 'd/' + shareLinkToken + '/files/?p=' + Utils.encodePath(path) :\n siteRoot + 'lib/' + this.props.repoID + '/file' + Utils.encodePath(path);\n\n return (\n \n {taggedFile.file_deleted ?\n \n {taggedFile.filename}{' '}\n {gettext('deleted')}\n \n \n :\n \n {taggedFile.filename}\n {Utils.bytesToSize(taggedFile.size)}\n {moment.unix(taggedFile.mtime).fromNow()}\n \n }\n \n {!shareLinkToken &&\n \n }\n {(shareLinkToken && enableFileDownload) &&\n \n }\n \n \n );\n }\n}\n\nTaggedFile.propTypes = TaggedFilePropTypes;\n","import moment from 'moment';\n\nclass Draft {\n\n constructor(item) {\n this.created = item.created_at;\n this.createdStr = moment((new Date(item.created_at)).getTime()).format('YYYY-MM-DD HH:mm');\n this.id = item.id;\n this.ownerNickname = item.owner_nickname;\n this.originRepoID = item.origin_repo_id;\n this.draftFilePath = item.draft_file_path;\n }\n}\n\nexport default Draft;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext, siteRoot } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport moment from 'moment';\nimport editorUtilities from '../../utils/editor-utilities';\nimport toaster from '../../components/toast';\nimport { Utils } from '../../utils/utils';\nimport Draft from '../../models/draft';\n\nconst propTypes = {\n repoID: PropTypes.string.isRequired,\n toggle: PropTypes.func.isRequired,\n};\n\nclass ListRepoDraftsDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n drafts: [],\n };\n }\n\n componentDidMount() {\n seafileAPI.listRepoDrafts(this.props.repoID).then(res => {\n let drafts = res.data.drafts.map(item => {\n let draft = new Draft(item);\n return draft;\n });\n this.setState({\n drafts: drafts\n });\n });\n }\n\n onDeleteDraftItem = (draft) => {\n editorUtilities.deleteDraft(draft.id).then(() => {\n let drafts = this.state.drafts.filter(item => {\n return item.id !== draft.id;\n });\n this.setState({drafts: drafts});\n let msg = gettext('Successfully deleted draft %(draft)s.');\n msg = msg.replace('%(draft)s', draft.draftFilePath);\n toaster.success(msg);\n }).catch(() => {\n let msg = gettext('Failed to delete draft %(draft)s.');\n msg = msg.replace('%(draft)s', draft.draftFilePath);\n toaster.danger(msg);\n });\n }\n\n toggle = () => {\n this.props.toggle();\n }\n\n render() {\n return (\n \n {gettext('Drafts')}\n \n \n \n \n \n \n \n \n \n \n \n {this.state.drafts.map((item, index) => {\n return (\n \n );\n })}\n \n
    {gettext('Name')}{gettext('Owner')}{gettext('Last Update')}
    \n
    \n \n \n \n
    \n );\n }\n}\n\nListRepoDraftsDialog.propTypes = propTypes;\n\nexport default ListRepoDraftsDialog;\n\nconst DraftItemPropTypes = {\n draftItem: PropTypes.object,\n onDeleteDraftItem: PropTypes.func.isRequired,\n};\n\nclass DraftItem extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = ({\n active: false,\n });\n }\n\n onMouseEnter = () => {\n this.setState({\n active: true\n });\n }\n\n onMouseLeave = () => {\n this.setState({\n active: false\n });\n }\n\n render() {\n const draftItem = this.props.draftItem;\n let href = siteRoot + 'drafts/' + draftItem.id + '/';\n let className = this.state.active ? 'action-icon sf2-icon-x3' : 'action-icon vh sf2-icon-x3';\n return (\n \n \n {Utils.getFileName(draftItem.draftFilePath)}\n \n {draftItem.ownerNickname}\n {moment(draftItem.createdStr).fromNow()}\n \n \n \n \n );\n }\n}\n\nDraftItem.propTypes = DraftItemPropTypes;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { MarkdownViewer } from '@seafile/seafile-editor';\nimport Loading from '../../components/loading';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext, mediaUrl } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../toast';\n\nconst propTypes = {\n repoID: PropTypes.string.isRequired,\n filePath: PropTypes.string.isRequired,\n fileName: PropTypes.string.isRequired,\n href: PropTypes.string,\n toggleCancel: PropTypes.func.isRequired,\n};\n\nclass ReadmeDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n readmeContent: null,\n isLoading: true,\n };\n }\n\n componentDidMount() {\n seafileAPI.getFileDownloadLink(this.props.repoID, this.props.filePath).then(res => {\n seafileAPI.getFileContent(res.data).then(res => {\n this.setState({\n readmeContent: res.data,\n isLoading: false,\n });\n });\n }).catch(error => {\n let errMessage = Utils.getErrorMsg(error);\n toaster.danger(errMessage);\n });\n }\n\n render() {\n return (\n \n {this.props.fileName}\n \n \n \n {this.state.isLoading ?\n :\n \n }\n \n \n \n \n \n );\n }\n}\n\nReadmeDialog.propTypes = propTypes;\n\nexport default ReadmeDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ModalPortal from './modal-portal';\nimport ListTaggedFilesDialog from './dialog/list-taggedfiles-dialog';\nimport ListRepoDraftsDialog from './dialog/list-repo-drafts-dialog';\nimport ReadmeDialog from './dialog/readme-dialog';\nimport { siteRoot, gettext } from '../utils/constants';\nimport { Utils } from '../utils/utils';\n\nimport '../css/repo-info-bar.css';\n\nconst propTypes = {\n repoID: PropTypes.string.isRequired,\n currentPath: PropTypes.string.isRequired,\n usedRepoTags: PropTypes.array.isRequired,\n readmeMarkdown: PropTypes.object,\n draftCounts: PropTypes.number,\n updateUsedRepoTags: PropTypes.func,\n onFileTagChanged: PropTypes.func,\n className: PropTypes.string,\n shareLinkToken: PropTypes.string,\n enableFileDownload: PropTypes.bool\n};\n\nclass RepoInfoBar extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n currentTag: null,\n isListTaggedFileShow: false,\n showRepoDrafts: false,\n showReadmeDialog: false,\n };\n }\n\n onListTaggedFiles = (currentTag) => {\n this.setState({\n currentTag: currentTag,\n isListTaggedFileShow: !this.state.isListTaggedFileShow,\n });\n }\n\n onCloseDialog = () => {\n this.setState({\n isListTaggedFileShow: false\n });\n }\n\n toggleDrafts = () => {\n this.setState({\n showRepoDrafts: !this.state.showRepoDrafts\n });\n }\n\n toggleReadme = () => {\n this.setState({\n showReadmeDialog: !this.state.showReadmeDialog\n });\n }\n\n render() {\n let { repoID, currentPath, usedRepoTags, readmeMarkdown, draftCounts, className } = this.props;\n\n // to be compatible with the existing code\n if (readmeMarkdown === undefined) {\n readmeMarkdown = null;\n }\n if (draftCounts === undefined) {\n draftCounts = 0;\n }\n\n let href = readmeMarkdown !== null ? siteRoot + 'lib/' + repoID + '/file' + Utils.joinPath(currentPath, readmeMarkdown.name) + '?mode=edit' : '';\n let filePath = readmeMarkdown !== null ? currentPath + readmeMarkdown.name : '';\n return (\n
    \n {usedRepoTags.length > 0 && (\n
      \n {usedRepoTags.map((usedRepoTag) => {\n return (\n
    • \n \n {usedRepoTag.name}\n \n
    • \n );\n })}\n
    \n )}\n
    0 && readmeMarkdown) ? 'file-info-list mt-1' : 'file-info-list'}>\n {(readmeMarkdown !== null && parseInt(readmeMarkdown.size) > 1) &&\n \n \n {readmeMarkdown.name}\n \n }\n {(readmeMarkdown !== null && parseInt(readmeMarkdown.size) < 2) &&\n \n \n {readmeMarkdown.name}\n \n }\n {draftCounts > 0 &&\n \n \n {gettext('draft')}\n \n \n }\n
    \n {this.state.isListTaggedFileShow && (\n \n \n \n )}\n\n {this.state.showRepoDrafts && (\n \n \n \n )}\n\n {this.state.showReadmeDialog && (\n \n \n \n )}\n
    \n );\n }\n}\n\nRepoInfoBar.propTypes = propTypes;\n\nexport default RepoInfoBar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\n\nconst propTypes = {\n type: PropTypes.oneOf(['move', 'copy']).isRequired,\n asyncOperatedFilesLength: PropTypes.number.isRequired,\n asyncOperationProgress: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n toggleDialog: PropTypes.func.isRequired,\n};\n\nclass CopyMoveDirentProgressDialog extends React.Component {\n\n render() {\n\n let { type , asyncOperationProgress, asyncOperatedFilesLength } = this.props;\n let title = type === 'move' ? gettext('Move {num} items') : gettext('Copy {num} items');\n title = title.replace('{num}', asyncOperatedFilesLength);\n let progressStyle = {\n width: asyncOperationProgress + '%',\n lineHeight: '40px',\n textAlign: 'left',\n };\n return (\n \n {title}\n \n
    \n \n {asyncOperationProgress + '%'}\n
    \n \n
    \n
    \n );\n }\n}\n\nCopyMoveDirentProgressDialog.propTypes = propTypes;\n\nexport default CopyMoveDirentProgressDialog;\n"],"sourceRoot":""}