@abtnode/webapp 1.8.1 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blocklet.js +47 -47
- package/blocklet.yml +1 -1
- package/build/asset-manifest.json +14 -14
- package/build/index.html +1 -1
- package/build/static/js/1.8d7ea3b8.chunk.js +2 -0
- package/build/static/js/1.8d7ea3b8.chunk.js.map +1 -0
- package/build/static/js/{12.8407470b.chunk.js → 12.4ef12167.chunk.js} +2 -2
- package/build/static/js/12.4ef12167.chunk.js.map +1 -0
- package/build/static/js/{7.d2303d92.chunk.js → 7.b74ed141.chunk.js} +3 -3
- package/build/static/js/{7.d2303d92.chunk.js.LICENSE.txt → 7.b74ed141.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/7.b74ed141.chunk.js.map +1 -0
- package/build/static/js/{main.8642a90b.chunk.js → main.1cca8f63.chunk.js} +2 -2
- package/build/static/js/main.1cca8f63.chunk.js.map +1 -0
- package/build/static/js/{runtime-main.098b6004.js → runtime-main.74afb89c.js} +2 -2
- package/build/static/js/{runtime-main.098b6004.js.map → runtime-main.74afb89c.js.map} +1 -1
- package/package.json +1 -1
- package/build/static/js/1.218df276.chunk.js +0 -2
- package/build/static/js/1.218df276.chunk.js.map +0 -1
- package/build/static/js/12.8407470b.chunk.js.map +0 -1
- package/build/static/js/7.d2303d92.chunk.js.map +0 -1
- package/build/static/js/main.8642a90b.chunk.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["hooks/mobile-width.js","components/confirm.js","components/blocklet/util.js","components/tag.js","hooks/url-evaluation.js","components/blocklet/status.js","components/did-address.js","components/dot.js","../../../blocklet/meta/lib/did.js","components/blocklet/avatar.js","../../../node_modules/@arcblock/ux/lib/SplitButton/index.js","../../../node_modules/lodash/_arrayIncludes.js","../../../node_modules/lodash/_arrayIncludesWith.js","components/blocklet/icons.js","contexts/deleting-blocklets.js","../../../node_modules/lodash/_baseUniq.js","../../../node_modules/@mui/icons-material/Replay.js","components/blocklet/version.js","components/blocklet/install-from-url.js","../../../node_modules/lodash/xorWith.js","../../../node_modules/lodash/_baseXor.js","../../../node_modules/lodash/_baseDifference.js","../../../node_modules/lodash/_createSet.js","../../../node_modules/lodash/noop.js","../../../node_modules/lodash/isArrayLikeObject.js","components/blocklet/actions.js","../../../node_modules/@mui/icons-material/PlayArrow.js","../../../node_modules/@mui/icons-material/Stop.js","../../../node_modules/@mui/icons-material/Autorenew.js","../../../node_modules/@mui/icons-material/Settings.js","../../../node_modules/@mui/icons-material/Receipt.js","../../../node_modules/@mui/icons-material/Group.js","../../../node_modules/@mui/icons-material/ArrowUpward.js","components/blocklet/mode.js","components/blocklet/interface.js","components/blocklet/create-blocklet.js","components/blocklet/add.js","pages/blocklets/index.js"],"names":["useMobileWidth","theme","useTheme","minWidth","useMediaQuery","breakpoints","down","values","sm","ConfirmDialog","title","description","showCancel","cancel","confirm","color","initialParams","params","onCancel","onConfirm","useState","setParams","open","setOpen","loading","setLoading","error","setError","changeLocale","useLocaleContext","t","onCallback","cb","formatError","console","d","isBreakpointsDownSm","StyledDialog","onClick","e","stopPropagation","fullScreen","style","DialogTitle","DialogContent","DialogContentText","component","Alert","severity","width","marginTop","DialogActions","className","padding","size","disabled","__disableConfirm","variant","autoFocus","defaultProps","styled","Dialog","getLogo","did","base64","bufStr","window","atob","bytes","Uint8Array","length","i","charCodeAt","base64ToArrayBuffer","toDataURL","replace","getNameByTitle","toLowerCase","genExportedMeta","name","blocklet","meta","pickBy","cloneDeep","x","toBlockletDid","logo","interfaces","forEach","services","children","child","dynamic","bundleSource","push","source","mountPoint","environments","configs","map","key","required","secure","default","value","capabilities","license","holder","Gitignore","GithubAction","downloadExportedSource","folderName","split","pop","readme","zip","JSZip","folder","file","yaml","dump","Promise","resolve","reject","generateAsync","type","then","content","saveAs","catch","err","getLaunchURL","info","encodeURI","adminPath","routing","serverUrl","encodeURIComponent","joinURL","location","origin","metaUrl","blockletRegistry","getLaunchAgreementUrl","url","URL","searchParams","set","href","Wrapped","rest","CACHE","useUrlEvaluation","urls","disableCache","initialCachedRef","useRef","filter","allCached","current","urlsState","setUrlsState","recommendedUrlState","useMemo","useEffect","evaluate","evaluateURLs","checkAccessible","results","item","sort","a","b","score","recommendedUrl","useBlockletUrlEvaluation","siteMap","useRoutingContext","locale","useContext","LocaleContext","getBlockletUrls","getBlockletUrlParams","useDomainsAccessibility","domains","getAccessUrl","WELLKNOWN_PING_PREFIX","urlDomainMapping","reduce","acc","cur","domainsAccessibility","recommendedDomain","domain","colors","BlockletStatus","status","colorMap","added","waiting","downloading","downloaded","installing","installed","starting","running","stopping","stopped","upgrading","restarting","corrupted","deleting","inProgress","isInProgress","statusTxt","marginRight","WrappedDidAddress","external","avatarProps","Content","target","underline","to","prepend","display","mr","success","defaultSize","Dot","div","props","types","require","toHex","fromPublicKey","module","exports","pk","Buffer","from","trim","role","RoleType","ROLE_ANY","BlockletAvatar","ancestors","node","useNodeContext","logoUrl","prefix","deployedFrom","getDeployedFrom","formatRegistryLogoPath","bundleDid","env","apiPrefix","join","imgEle","src","onError","ev","alt","responsive","Object","assign","backgroundColor","height","borderRadius","defineProperty","SplitButton","_react","_propTypes","_interopRequireDefault","_styledComponents","_ExpandMore","_Popper","_Paper","_ClickAwayListener","_MenuList","_MenuItem","_ButtonGroup","_Button","_jsxRuntime","_excluded","obj","__esModule","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","enumerable","apply","_objectSpread","arguments","_defineProperty","getOwnPropertyDescriptors","defineProperties","configurable","writable","_objectWithoutProperties","excluded","sourceKeys","indexOf","_objectWithoutPropertiesLoose","sourceSymbolKeys","prototype","propertyIsEnumerable","call","_ref","menu","menuButtonProps","anchorRef","jsxs","Fragment","StyledButtonGroup","ref","jsx","prevOpen","StyledPopper","anchorEl","placement","disablePortal","onClickAway","contains","classList","propTypes","oneOf","oneOfType","array","any","func","Item","withConfig","displayName","componentId","baseIndexOf","comparator","index","Start","Stop","Restart","Reload","Remove","Config","Log","Group","DeletingBlockletContext","createContext","DeletingBlockletProvider","deletingBlocklets","setDeletingBlocklets","deletingBlockletsDid","removeDeletingDid","includes","reDeleteings","Provider","addDeletingDid","matchDeletingDid","existDids","inDeleting","find","xorWith","useDeletingBlockletContext","SetCache","arrayIncludes","arrayIncludesWith","cacheHas","createSet","setToArray","iteratee","isCommon","result","seen","outer","computed","seenIndex","_createSvgIcon","_default","BlockletVersion","checkUpgrade","hasPermission","api","newVersionBlocklet","setNewVersionBlocklet","confirmSetting","setConfirmSetting","enqueueSnackbar","useSnackbar","mode","BLOCKLET_MODES","DEVELOPMENT","getLatestBlockletVersion","input","version","data","registryUrl","semver","gt","sleep","upgradeBlocklet","autoHideDuration","setting","getDisplayName","marginLeft","fontSize","message","onClose","withPermission","InstallFromUrl","defaultUrl","onSuccess","handleText","setUrl","activeStep","setActiveStep","dist","setMeta","existingMeta","setExistingMeta","isComponentMode","alwayShowSteps","onGetMeta","decoded","decodeURIComponent","Error","getBlockletMetaFromUrl","newer","inStore","getBlocklet","attachRuntimeInfo","existedBlocklet","gte","inputUrl","errMsg","onInstall","installBlocklet","rows","formatPerson","author","tarball","steps","label","body","autoComplete","fullWidth","marginBottom","margin","helperText","onChange","onKeyPress","preventDefault","alignItems","justifyContent","flexDirection","paddingLeft","row","valueComponent","nameWidth","nameFormatter","s","step","maxWidth","showCloseButton","disableEscapeKeyDown","actions","alternativeLabel","arrayFilter","baseRest","baseXor","isArrayLikeObject","last","arrays","undefined","baseDifference","baseFlatten","baseUniq","Array","othIndex","arrayMap","baseUnary","valuesLength","valuesIndex","Set","noop","isArrayLike","isObjectLike","BlockletActions","onStart","onComplete","history","useHistory","setAnchorEl","currentAction","setCurrentAction","useLocalStorage","skipSetup","recommendedUrlLoading","createHandler","action","fn","requireUserConfirm","isRemoved","keepData","removeType","settings","initialized","Toast","removeSetting","fromBlockletSource","BlockletSource","custom","gutterBottom","control","confirmSettings","stop","restart","remove","cancelDownload","Boolean","onOpen","currentTarget","onAction","handler","removeAction","isDeletableBlocklet","icon","Icons","deleteBlocklet","cancelDownloadAction","cancelDownloadBlocklet","missingRequiredConfigs","getAppMissingConfigs","startBlocklet","hasRunnableComponent","isDownloading","stopBlocklet","restartBlocklet","reloadBlocklet","separator","onlyInMenu","Div","permission","id","keepMounted","PaperProps","dense","primary","BlockletMode","BlockletInterface","skipAccessibilityCheck","Container","Flex","CreateBlocklet","setTitle","setDescription","Typography","TextField","BlockletAdd","onCreate","setSuccess","installSetting","setInstallSetting","createSetting","setCreateSetting","closeInstallFromUrl","duration","BlockletListWrap","BlockletList","blocklets","useBlockletContext","searchText","setSearchText","onActionStart","onActionComplete","refresh","silent","isBreakpointsUpMd","up","useLocation","pathname","search","query","URLSearchParams","get","items","textDecoration","dateFields","getSortScore","Date","getTime","runtimeInfo","startAt","startedAt","f","date","aScore","toLocaleLowerCase","tableDurableData","getDurableData","datatableColumns","options","customBodyRenderLite","rawIndex","tab","align","installedAt","createdAt","tableComponents","TableBody","relative","pageIndex","page","rowsPerPage","slice","Box","MobileList","columns","durable","download","print","searchPlaceholder","searchAlwaysOpen","sortOrder","direction","onSearchChange","components","Main","main"],"mappings":"sVAUeA,I,EAAAA,EAPf,WACE,IAAMC,EAAQC,cAGd,MAAO,CAAEC,SAFmBC,YAAcH,EAAMI,YAAYC,KAAK,OAC1B,IAAML,EAAMI,YAAYE,OAAOC,K,OCczD,SAASC,EAAT,GAUX,IATFC,EASC,EATDA,MACAC,EAQC,EARDA,YACAC,EAOC,EAPDA,WACAC,EAMC,EANDA,OACAC,EAKC,EALDA,QACAC,EAIC,EAJDA,MACQC,EAGP,EAHDC,OACAC,EAEC,EAFDA,SACAC,EACC,EADDA,UAEA,EAA4BC,mBAASJ,GAArC,mBAAOC,EAAP,KAAeI,EAAf,KACA,EAAwBD,oBAAS,GAAjC,mBAAOE,EAAP,KAAaC,EAAb,KACA,EAA8BH,oBAAS,GAAvC,mBAAOI,EAAP,KAAgBC,EAAhB,KACA,EAA0BL,mBAAS,IAAnC,mBAAOM,EAAP,KAAcC,EAAd,KACWC,EAAiBC,6BAApBC,EACF7B,EAAQC,cAER6B,EAAU,iDAAG,WAAMC,GAAN,8EACC,oBAAPA,EADM,wBAEfP,GAAW,GAFI,kBAIPO,EAAGf,GAJI,OAKbM,GAAQ,GALK,gDAObI,EAASM,YAAY,EAAD,KACpBC,QAAQR,MAAR,MARa,yBAUbD,GAAW,GAVE,6CAafF,GAAQ,GAbO,+DAAH,sDAiBVO,EAAqB,oBAAVpB,EAAuBA,IAAUA,EAC5CyB,EAA2B,oBAAhBxB,EAA6BA,EAAYM,EAAQI,EAAWM,GAAYhB,EAEnFyB,EAAsBhC,YAAcH,EAAMI,YAAYC,KAAK,OAKzDH,EAAaH,IAAbG,SAER,OACE,eAACkC,EAAD,CAAcC,QANI,SAAAC,GAClBA,EAAEC,mBAKkCC,WAAYL,EAAqBd,KAAMA,EAAMoB,MAAO,CAAEvC,YAA1F,UACE,cAACwC,EAAA,EAAD,UAAcb,IACd,eAACc,EAAA,EAAD,CAAeF,MAAO,CAAEvC,YAAxB,UACE,cAAC0C,EAAA,EAAD,CAAmBC,UAAU,MAA7B,SAAoCX,MACjCT,GACD,cAACqB,EAAA,EAAD,CAAOC,SAAS,QAAQN,MAAO,CAAEO,MAAO,OAAQC,UAAW,GAA3D,SACGxB,OAIP,eAACyB,EAAA,EAAD,CAAeC,UAAU,iBAAiBV,MAAO,CAAEW,QAAS,iBAA5D,UACGzC,GACC,cAAC,IAAD,CACE0B,QAAS,SAAAC,GACPA,EAAEC,kBACFT,EAAWb,IAEbH,MAAM,UACN,UAAQ,wBACRuC,KAAK,QAPP,SAQGzC,GAAUe,EAAa,mBAG5B,eAAC,IAAD,CACEU,QAAS,SAAAC,GACPA,EAAEC,kBACFT,EAAWZ,IAEbJ,MAAOA,EACPuC,KAAK,QAELC,SAAUtC,EAAOuC,kBAAoBhC,EACrCiC,QAAQ,YACR,UAAQ,wBACRC,WAAS,EAXX,UAYGlC,GAAW,cAAC,IAAD,CAAS8B,KAAM,CAAC,GAAI,MAC/BxC,WAmBXL,EAAckD,aAAe,CAC3BzC,SAAU,aACVN,YAAY,EACZC,OAAQ,GACRC,QAAS,UACTC,MAAO,QACPE,OAAQ,IAGV,IAAMoB,EAAeuB,kBAAOC,IAAPD,CAAH,+L,oWC9GZE,EAAU,SAAAC,GAGd,OAZ0B,SAAAC,GAG1B,IAFA,IAAMC,EAASC,OAAOC,KAAKH,GACrBI,EAAQ,IAAIC,WAAWJ,EAAOK,QAC3BC,EAAI,EAAGA,EAAIN,EAAOK,OAAQC,IACjCH,EAAMG,GAAKN,EAAOO,WAAWD,GAE/B,OAAOH,EAMAK,CAFKC,oBAAUX,EAAK,CAAET,KAAM,MAChBqB,QAAQ,UAAW,MAIjC,SAASC,EAAelE,GAC7B,OAAOA,EACJiE,QAAQ,WAAY,KACpBA,QAAQ,kBAAmB,IAC3BA,QAAQ,uBAAwB,IAChCE,cAGE,SAASC,EAAgBC,EAAMC,GACpC,IAAMC,EAAOC,IAAOC,IAAUH,EAASC,OAAO,SAAAG,GAAC,OAAU,OAANA,KAkCnD,OAhCAH,EAAKF,KAAOA,EACZE,EAAKlB,IAAMsB,IAAcN,GACzBE,EAAKK,KAAO,WAEZL,EAAKM,WAAWC,SAAQ,SAAAJ,GAEjBA,EAAEK,iBACEL,EAAEK,YAIbT,EAASU,SAASF,SAAQ,SAAAG,GACpBA,EAAMC,SAAWD,EAAME,cACzBZ,EAAKS,SAASI,KAAK,CACjBf,KAAMY,EAAMV,KAAKF,KACjBgB,OAAQJ,EAAME,aACdnF,MAAOiF,EAAMV,KAAKvE,MAClBsF,WAAYL,EAAMK,gBAKxBf,EAAKgB,cAAgBjB,EAASkB,SAAW,IAAIC,KAAI,SAAAf,GAAC,MAAK,CACrDL,KAAMK,EAAEgB,IACRzF,YAAa,yCACb0F,WAAYjB,EAAEiB,SACdC,SAAUlB,EAAEkB,OACZC,QAASnB,EAAEkB,OAAS,GAAKlB,EAAEoB,OAAS,OAGtCvB,EAAKwB,aAAa3D,WAAY,EAEvBmC,EAGT,IAAMyB,EAAU,SAAAC,GAAM,oCAAwBA,GAAU,GAAlC,+hCAQhBC,EAAS,uBAGTC,EAAY,kcAuBX,SAAeC,EAAtB,kC,sDAAO,WAAsC7B,GAAtC,+IAAyD,GAAX0B,EAA9C,EAA8CA,OAC7CI,EADD,UACiB9B,EAAKF,KAAKiC,MAAM,KAAKC,OACrCC,EAFD,YAEejC,EAAKvE,MAFpB,kCAEmDuE,EAAKtE,aAEvDwG,EAAM,IAAIC,KACVC,EAASF,EAAIE,OAAON,IACnBO,KAAK,eAAgBC,IAAKC,KAAKvC,IACtCoC,EAAOC,KAAK,cAAeJ,GAC3BG,EAAOC,KAAK,YAAaJ,GACzBG,EAAOC,KAAK,WAAYxD,EAAQmB,EAAKlB,MACrCsD,EAAOC,KAAK,UAAWZ,EAAQC,IAC/BU,EAAOC,KAAK,aAAcV,GAC1BS,EAAOA,OAAO,eAAeC,KAAK,WAAY,IAC9CD,EAAOA,OAAO,WAAWA,OAAO,aAAaC,KAAK,WAAYT,GAbzD,UAcC,IAAIY,SAAQ,SAACC,EAASC,GAC1BR,EACGS,cAAc,CAAEC,KAAM,SACtBC,MAAK,SAAAC,GACJC,IAAOD,EAAD,UAAahB,EAAb,SACNW,OAEDO,OAAM,SAAAC,GACLP,EAAOO,SAtBR,4C,wBA0BA,IAAMC,EAAe,SAAClD,EAAMmD,GAA6B,IAAvBC,EAAsB,wDACvDC,EAAoDF,EAAKG,QAAQD,UACjEE,EAAYH,EACdI,mBAAmBC,IAAQxE,OAAOyE,SAASC,OAAQN,IACnDI,IAAQxE,OAAOyE,SAASC,OAAQN,GAC9BO,EAAUH,IAAO,OAACN,QAAD,IAACA,OAAD,EAACA,EAAMU,iBAAP,yBAA2C7D,EAAKlB,IAAhD,mBACvB,MAAO,CAAEyE,YAAWK,YAETE,EAAwB,SAAC9D,EAAMmD,GAC1C,MAA+BD,EAAalD,EAAMmD,GAA1CS,EAAR,EAAQA,QAASL,EAAjB,EAAiBA,UAEXQ,EAAM,IAAIC,IAAIP,IAAQF,EAAW,+BAGvC,OAFAQ,EAAIE,aAAaC,IAAI,oBAAqBN,GAC1CG,EAAIE,aAAaC,IAAI,OAAQjF,OAAOyE,SAASS,MACtCJ,EAAII,O,yIC/IE,SAASC,EAAT,GAAgD,IAA7B3D,EAA4B,EAA5BA,SAAUhD,EAAkB,EAAlBA,MAAU4G,EAAQ,iBAC5D,OACE,cAAC,IAAD,yBAAK5G,MAAOA,GAAW4G,GAAvB,aACG5D,KAUP2D,EAAQ1F,aAAe,CACrBjB,MAAO,K,gPCNH6G,EAAQ,GAEP,SAASC,EAAiBC,GAA6B,IAAvBC,EAAsB,wDAGrDC,EAAmBC,iBAAOH,EAAKI,QAAO,SAAAb,GAAG,OAAIO,EAAMP,MAAM7C,KAAI,SAAA6C,GAAG,OAAIO,EAAMP,OAC1Ec,EAAYH,EAAiBI,QAAQzF,SAAWmF,EAAKnF,OAC3D,EAAkClD,mBAAS0I,EAAYH,EAAiBI,QAAU,IAAlF,mBAAOC,EAAP,KAAkBC,EAAlB,KACA,EAA8B7I,oBAAU0I,GAAxC,mBAAOtI,EAAP,KAAgBC,EAAhB,KACMyI,EAAsBC,mBAAQ,WAClC,OAAK3I,GAAWwI,EAAU1F,OACjB0F,EAAU,GAEZ,OACN,CAACA,EAAWxI,IA6Bf,OA3BA4I,qBAAU,WACR,IAAQ,OAAJX,QAAI,IAAJA,OAAA,EAAAA,EAAMnF,QAAS,IAAMwF,EAAW,CAClC,IAAMO,EAAQ,iDAAG,iGAEf5I,GAAW,IACPiI,EAHW,gCAIGY,uBAAab,EAAM,CAAEc,sBAJxB,QAIbC,EAJa,QAKLhF,SAAQ,SAAAiF,GACdlB,EAAMkB,EAAKzB,KAAOyB,KANP,wCASQH,uBACnBb,EAAKI,QAAO,SAAAb,GAAG,OAAKO,EAAMP,MAC1B,CAAEuB,sBAXS,eAaN/E,SAAQ,SAAAiF,GACblB,EAAMkB,EAAKzB,KAAOyB,KAEpBD,EAAUf,EAAKtD,KAAI,SAAA6C,GAAG,OAAIO,EAAMP,MAAM0B,MAAK,SAACC,EAAGC,GAAJ,OAAUA,EAAEC,MAAQF,EAAEE,SAhBpD,QAkBfZ,EAAaO,GACb/I,GAAW,GAnBI,4CAAH,qDAqBd4I,OAED,CAACZ,EAAMC,EAAcI,IAEjB,CACLE,YACAxI,UACA0I,sBACAY,eAAc,OAAEZ,QAAF,IAAEA,OAAF,EAAEA,EAAqBlB,KAQlC,SAAS+B,EAAyB/F,GACvC,IAAQgG,EAAYC,cAAZD,QACAE,EAAWC,qBAAWC,iBAAtBF,OACFzB,EAAOU,mBAAQ,WACnB,OAAKnF,EAGEqG,YAAgB,CAAEtH,IAAKiB,EAASC,KAAKlB,IAAKiH,UAAS/J,OAAQqK,YAAqBtG,EAAUkG,KAFxF,KAGR,CAAClG,EAAUkG,EAAQF,IACtB,EAAyDxB,EAAiBC,GAC1E,MAAO,CAAEA,OAAMjI,QADf,EAAQA,QACgB0I,oBADxB,EAAiBA,oBAC4BY,eAD7C,EAAsCA,gBAQjC,SAASS,EAAwBC,GAEtC,IAAM/B,EAAOU,mBACX,kBAAMqB,EAAQrF,KAAI,SAAAsE,GAAI,OAAI/B,IAAQ,IAAIO,IAAIwC,YAAahB,IAAO7B,OAAQ8C,8BACtE,CAACF,IAGGG,EAAmBxB,mBACvB,kBAAMqB,EAAQI,QAAO,SAACC,EAAKC,EAAKvH,GAAX,mBAAC,eAAsBsH,GAAvB,kBAA6BpC,EAAKlF,GAAKuH,MAAQ,MACpE,CAACN,EAAS/B,IAEZ,EAA+CD,EAAiBC,GAAxDO,EAAR,EAAQA,UAAWxI,EAAnB,EAAmBA,QAASsJ,EAA5B,EAA4BA,eAmB5B,OAjBeX,mBAAQ,WACrB,OAAI3I,EACK,CACLuK,qBAAsBP,EAAQI,QAAO,SAACC,EAAKC,GAAN,mBAAC,eAAmBD,GAApB,kBAA0BC,EAAM,CAAEtK,SAAS,OAAW,IAC3FwK,kBAAmB,MAQhB,CACLD,qBAN2B/B,EAAU4B,QAAO,SAACC,EAAKC,GAClD,IAAMG,EAASN,EAAiBG,EAAI9C,KAEpC,OADA6C,EAAII,GAAJ,2BAAmBH,GAAnB,IAAwBG,WACjBJ,IACN,IAGDG,kBAAmBL,EAAiBb,MAErC,CAACU,EAASG,EAAkB3B,EAAWxI,EAASsJ,M,sMCpG/CoB,EACI,UADJA,EAEE,UAGO,SAASC,EAAT,GAA+D,IAArCC,EAAoC,EAApCA,OAAQ3I,EAA4B,EAA5BA,QAASsC,EAAmB,EAAnBA,OAAWuD,EAAQ,iBACnExH,EAAMqJ,qBAAWC,iBAAjBtJ,EAoBFuK,EAAW,CACfC,MAAOJ,EACPK,QAASL,EACTM,YAAaN,EACbO,WAAYP,EACZQ,WAAYR,EACZS,UAAWT,EACXU,SAAUV,EACVW,QAAS,UACTC,SAAUZ,EACVa,QAASb,EACTxK,MAAO,QACPsL,UAAWd,EACXe,WAAYf,EACZgB,UAAW,QACXC,SAAUjB,GAGNkB,EAAaC,YAAajB,GAE1BkB,EAAYxL,EAAE,mBAAD,OAA+B,WAAXiE,GAAkC,cAAXqG,EAAyB,UAAYA,IAEnG,MAAgB,QAAZ3I,EAEA,cAAC,IAAD,CAAS/C,MAAOoB,EAAE,qBAAsB,CAAEsK,OAAQkB,IAAlD,SACE,cAAC,IAAD,aAAKvM,MAAOsL,EAASD,IAAa9C,MAMtC,eAAC,IAAD,yBAAKzB,KAjDK,CACVyE,MAAO,UACPC,QAAS,UACTC,YAAa,UACbC,WAAY,UACZC,WAAY,UACZC,UAAW,UACXC,SAAU,UACVC,QAAS,UACTC,SAAU,UACVC,QAAS,UACTrL,MAAO,QACPsL,UAAW,UACXC,WAAY,UACZC,UAAW,QACXC,SAAU,WAkCKf,IAAa9C,GAA5B,cACG8D,GAAc,cAAC,IAAD,CAAS9J,KAAM,CAAC,GAAI,GAAIvC,MAAM,UAAU2B,MAAO,CAAE6K,YAAa,KAC5ED,MAWPnB,EAAexI,aAAe,CAC5BF,QAAS,MACTsC,OAAQ,K,sKC7EV,SAASyH,EAAT,GAA2E,IAA9CzJ,EAA6C,EAA7CA,IAAKqF,EAAwC,EAAxCA,KAAMqE,EAAkC,EAAlCA,SAAUC,EAAwB,EAAxBA,YAAgBpE,EAAQ,iBAExE,SAASqE,IACP,OAAIvE,EACEqE,EAEA,cAAC,IAAD,CAAcG,OAAO,SAASxE,KAAMA,EAAMyE,UAAU,QAApD,SACG9J,IAKA,cAAC,OAAD,CAAM+J,GAAI1E,EAAV,SAAiBrF,IAGnBA,EAGT,OACE,cAAC,IAAD,yBACEgK,QACE,cAAC,IAAD,CAAKjL,UAAU,OAAOkL,QAAQ,OAAOC,GAAI,EAAzC,SACE,cAAC,IAAD,aAAWlK,IAAKA,EAAKT,KAAM,IAAQoK,OAGnCpE,GANN,aAOE,cAACqE,EAAD,OAaNH,EAAkB7J,aAAe,CAC/BmK,GAAI,GACJ1E,KAAM,GACNsE,YAAa,GACbD,UAAU,GAGGD,O,wDCnDTzM,EAAQ,CACZmN,QAAS,UACTxM,MAAO,WAGHyM,EAAc,OAEdC,EAAMxK,UAAOyK,IAAV,iIAEE,SAAAC,GAAK,OAAIA,EAAMhL,MAAQ6K,KACtB,SAAAG,GAAK,OAAIA,EAAMhL,MAAQ6K,KACnB,SAAAG,GAAK,OAAIvN,EAAMuN,EAAMvN,QAAUuN,EAAMvN,OAASA,EAAMmN,WAIrDE,O,sBCjBf,gBAAQG,EAAUC,EAAQ,MAAlBD,MACAE,EAAUD,EAAQ,MAAlBC,MACAC,EAAkBF,EAAQ,MAA1BE,cAORC,EAAOC,QALe,SAAC7J,GACrB,IAAM8J,EAAKJ,EAAMK,EAAOC,KAAqB,kBAAThK,EAAoBA,EAAKiK,OAASjK,IACtE,OAAO2J,EAAcG,EAAI,CAAEI,KAAMV,EAAMW,SAASC,c,ycCWnC,SAASC,EAAT,GAAwE,IAA9CpK,EAA6C,EAA7CA,SAAUtC,EAAmC,EAAnCA,MAAOY,EAA4B,EAA5BA,KAAM+L,EAAsB,EAAtBA,UAAc/F,EAAQ,iBAC9EgG,EAAOC,cACTC,EAAU9G,IAAQ4G,EAAKG,OAAQ,gBAC3BhM,EAAY6F,EAAZ7F,QAEFiM,EAbgB,SAAC1K,EAAUsK,GACjC,IAAMI,GAAiB1K,GAAY,IAA7B0K,aAIN,OAHKA,GAAoC,aAApB1K,EAASe,SAC5B2J,EAAeJ,EAAKlH,KAAKU,kBAEpB4G,EAQcC,CAAgB3K,EAAUsK,GAE/C,GAAwB,aAApBtK,EAASe,QAAyBf,EAASC,KAAKK,KAClDkK,EAAU9G,IAAQgH,EAAcE,YAAuB5K,EAASC,KAAK4K,UAAW7K,EAASC,KAAKK,WACzF,CACL,IAAMmK,EAASvL,OAAO4L,IAAIC,WAAa,IACvCP,EAAU9G,IAAQ+G,EAAD,wBAA0BJ,EAAUlJ,KAAI,SAAAf,GAAC,iBAAQA,EAAEH,KAAKlB,QAAOiM,KAAK,IAApE,YAA2EhL,EAASC,KAAKlB,MAG5G,IAIIkM,EAAS,qBAAKC,IAAKV,EAASW,QAJT,SAAAC,GACrBA,EAAGxC,OAAOsC,IAAV,UAAmBZ,EAAKG,OAAxB,kBAGuDY,IAAKrL,EAASC,KAAKF,KAAMrC,MAAO,CAAEO,MAAOK,KAMlG,OAJK0B,EAASC,KAAKK,OACjB2K,EAAS,cAAC,IAAD,CAAWlM,IAAKiB,EAASC,KAAKlB,KAAO,GAAIuM,YAAU,KAI5D,cAAC,IAAD,yBACE7M,QAASA,GAAW,SACpBf,MAAO6N,OAAOC,OAAO,CAAEC,gBAAiB,cAAexN,MAAOK,EAAMoN,OAAQpN,EAAMqN,aAAc,IAAMjO,IAClG4G,GAHN,aAIG2G,KAYPb,EAAezL,aAAe,CAC5BjB,MAAO,GACPY,KAAM,GACN+L,UAAW,K,sDC3DbkB,OAAOK,eAAehC,EAAS,aAAc,CAC3CpI,OAAO,IAEToI,EAAQrI,QAAUsK,EAElB,IAAIC,EAAStC,EAAQ,GAEjBuC,EAAaC,EAAuBxC,EAAQ,IAE5CyC,EAAoBD,EAAuBxC,EAAQ,KAEnD0C,EAAcF,EAAuBxC,EAAQ,MAE7C2C,EAAUH,EAAuBxC,EAAQ,MAEzC4C,EAASJ,EAAuBxC,EAAQ,KAExC6C,EAAqBL,EAAuBxC,EAAQ,MAEpD8C,EAAYN,EAAuBxC,EAAQ,MAE3C+C,EAAYP,EAAuBxC,EAAQ,MAE3CgD,EAAeR,EAAuBxC,EAAQ,MAE9CiD,EAAUT,EAAuBxC,EAAQ,MAEzCkD,EAAclD,EAAQ,GAEpBmD,EAAY,CAAC,OAAQ,QAAS,OAAQ,WAAY,UAAW,UAAW,mBAE9E,SAASX,EAAuBY,GAAO,OAAOA,GAAOA,EAAIC,WAAaD,EAAM,CAAErL,QAASqL,GAEvF,SAASE,EAAQC,EAAQC,GAAkB,IAAIC,EAAO1B,OAAO0B,KAAKF,GAAS,GAAIxB,OAAO2B,sBAAuB,CAAE,IAAIC,EAAU5B,OAAO2B,sBAAsBH,GAASC,IAAmBG,EAAUA,EAAQtI,QAAO,SAAUuI,GAAO,OAAO7B,OAAO8B,yBAAyBN,EAAQK,GAAKE,eAAiBL,EAAKnM,KAAKyM,MAAMN,EAAME,GAAY,OAAOF,EAE9U,SAASO,EAAc5E,GAAU,IAAK,IAAIrJ,EAAI,EAAGA,EAAIkO,UAAUnO,OAAQC,IAAK,CAAE,IAAIwB,EAAS,MAAQ0M,UAAUlO,GAAKkO,UAAUlO,GAAK,GAAIA,EAAI,EAAIuN,EAAQvB,OAAOxK,IAAS,GAAIP,SAAQ,SAAUY,GAAOsM,EAAgB9E,EAAQxH,EAAKL,EAAOK,OAAYmK,OAAOoC,0BAA4BpC,OAAOqC,iBAAiBhF,EAAQ2C,OAAOoC,0BAA0B5M,IAAW+L,EAAQvB,OAAOxK,IAASP,SAAQ,SAAUY,GAAOmK,OAAOK,eAAehD,EAAQxH,EAAKmK,OAAO8B,yBAAyBtM,EAAQK,OAAa,OAAOwH,EAEjf,SAAS8E,EAAgBd,EAAKxL,EAAKI,GAAiK,OAApJJ,KAAOwL,EAAOrB,OAAOK,eAAegB,EAAKxL,EAAK,CAAEI,MAAOA,EAAO8L,YAAY,EAAMO,cAAc,EAAMC,UAAU,IAAkBlB,EAAIxL,GAAOI,EAAgBoL,EAE3M,SAASmB,EAAyBhN,EAAQiN,GAAY,GAAc,MAAVjN,EAAgB,MAAO,GAAI,IAAkEK,EAAK7B,EAAnEqJ,EAEzF,SAAuC7H,EAAQiN,GAAY,GAAc,MAAVjN,EAAgB,MAAO,GAAI,IAA2DK,EAAK7B,EAA5DqJ,EAAS,GAAQqF,EAAa1C,OAAO0B,KAAKlM,GAAqB,IAAKxB,EAAI,EAAGA,EAAI0O,EAAW3O,OAAQC,IAAO6B,EAAM6M,EAAW1O,GAAQyO,EAASE,QAAQ9M,IAAQ,IAAawH,EAAOxH,GAAOL,EAAOK,IAAQ,OAAOwH,EAFxMuF,CAA8BpN,EAAQiN,GAAuB,GAAIzC,OAAO2B,sBAAuB,CAAE,IAAIkB,EAAmB7C,OAAO2B,sBAAsBnM,GAAS,IAAKxB,EAAI,EAAGA,EAAI6O,EAAiB9O,OAAQC,IAAO6B,EAAMgN,EAAiB7O,GAAQyO,EAASE,QAAQ9M,IAAQ,GAAkBmK,OAAO8C,UAAUC,qBAAqBC,KAAKxN,EAAQK,KAAgBwH,EAAOxH,GAAOL,EAAOK,IAAU,OAAOwH,EAIne,SAASiD,EAAY2C,GACnB,IACElQ,EAOEkQ,EAPFlQ,KACAvC,EAMEyS,EANFzS,MACA0S,EAKED,EALFC,KACA/N,EAIE8N,EAJF9N,SACAjC,EAGE+P,EAHF/P,QACAnB,EAEEkR,EAFFlR,QACAoR,EACEF,EADFE,gBAEEpK,EAAOyJ,EAAyBS,EAAM7B,GAE1C,GAAwB,EAAIb,EAAO1P,WAAU,GAA7C,SAAOE,EAAP,KAAaC,EAAb,KACMoS,GAAY,EAAI7C,EAAOlH,QAAQ,MAqBrC,OAAoB,EAAI8H,EAAYkC,MAAMlC,EAAYmC,SAAU,CAC9DnO,SAAU,EAAc,EAAIgM,EAAYkC,MAAME,EAAmBtB,EAAcA,EAAc,CAC3F/O,QAASA,EACTH,KAAMA,EACNvC,MAAOA,EACPgT,IAAKJ,GACJrK,GAAO,GAAI,CACZ5D,SAAU,CAAqB,oBAAbA,EAA0BA,KAA0B,EAAIgM,EAAYsC,KAAKvC,EAAQlL,QAAS,CAC1GjE,QAASA,EACTvB,MAAOA,EACP2E,SAAUA,KACK,EAAIgM,EAAYsC,KAAKvC,EAAQlL,QAASiM,EAAcA,EAAc,CACjFlQ,QA/BW,WACff,GAAQ,SAAA0S,GAAQ,OAAKA,MA+BjBlT,MAAOA,GACN2S,GAAkB,GAAI,CACvB,aAAc,iBACdhO,UAAuB,EAAIgM,EAAYsC,KAAK9C,EAAY3K,QAAS,YAEnD,EAAImL,EAAYsC,KAAKE,EAAc,CACnD5S,KAAMA,EACN6S,SAAUR,EAAU5J,QACpBqK,UAAW,aACXC,eAAe,EACf3O,UAAuB,EAAIgM,EAAYsC,KAAK5C,EAAO7K,QAAS,CAC1Db,UAAuB,EAAIgM,EAAYsC,KAAK3C,EAAmB9K,QAAS,CACtE+N,YAxCY,SAAA/R,GACdoR,EAAU5J,SAAW4J,EAAU5J,QAAQwK,SAAShS,EAAEqL,SAItDrM,GAAQ,IAoCFmE,UAAuB,EAAIgM,EAAYsC,KAAK1C,EAAU/K,QAAS,CAC7DjE,QAjCc,SAAAC,GAClBA,EAAEqL,OAAO4G,UAAUD,SAAS,qBAC9BhT,GAAQ,IAgCFmE,SAAU+N,aAQtB5C,EAAY4D,UAAY,CACtBnR,KAAMyN,EAAWxK,QAAQmO,MAAM,CAAC,QAAS,SAAU,UACnD3T,MAAOgQ,EAAWxK,QAAQmO,MAAM,CAAC,UAAW,YAAa,YACzDjB,KAAM1C,EAAWxK,QAAQoO,UAAU,CAAC5D,EAAWxK,QAAQ+I,KAAMyB,EAAWxK,QAAQqO,QAEhFlP,SAAUqL,EAAWxK,QAAQsO,IAC7BpR,QAASsN,EAAWxK,QAAQmO,MAAM,CAAC,WAAY,cAC/CpS,QAASyO,EAAWxK,QAAQuO,KAC5BpB,gBAAiB3C,EAAWxK,QAAQwL,QAEtClB,EAAYlN,aAAe,CACzBL,KAAM,SACNvC,MAAO,UACP0S,KAAM,GACN/N,SAAU,KACVjC,QAAS,YACTnB,QAAS,aACToR,gBAAiB,IAEnB7C,EAAYkE,KAAOxD,EAAUhL,QAC7B,IAAMuN,GAAoB,EAAI7C,EAAkB1K,SAASiL,EAAajL,SAASyO,WAAW,CACxFC,YAAa,iCACbC,YAAa,gBAFW,CAGvB,CAAC,oFACEhB,GAAe,EAAIjD,EAAkB1K,SAAS4K,EAAQ5K,SAASyO,WAAW,CAC9EC,YAAa,4BACbC,YAAa,gBAFM,CAGlB,CAAC,yF,qBC9IJ,IAAIC,EAAc3G,EAAQ,KAgB1BG,EAAOC,QALP,SAAuBgG,EAAOpO,GAE5B,SADsB,MAAToO,EAAgB,EAAIA,EAAMtQ,SACpB6Q,EAAYP,EAAOpO,EAAO,IAAM,I,mBCQrDmI,EAAOC,QAZP,SAA2BgG,EAAOpO,EAAO4O,GAIvC,IAHA,IAAIC,GAAS,EACT/Q,EAAkB,MAATsQ,EAAgB,EAAIA,EAAMtQ,SAE9B+Q,EAAQ/Q,GACf,GAAI8Q,EAAW5O,EAAOoO,EAAMS,IAC1B,OAAO,EAGX,OAAO,I,kCClBT,4JASe,KACbC,UACAC,SACAC,YACAC,WACAC,WACAC,WACAC,QACAC,Y,2JCbIC,EAA0BC,wBAAc,IAE9C,SAASC,EAAT,GAAuD,IAAnBtQ,EAAkB,EAAlBA,SAAUmC,EAAQ,EAARA,KAC5C,EAAkDzG,mBAAS,IAA3D,mBAAO6U,EAAP,KAA0BC,EAA1B,KACMC,EAAuBvM,iBAAO,IAkB9BwM,EAAoB,SAAArS,GACxB,GAAIoS,EAAqBpM,QAAQsM,SAAStS,GAAM,CAC9C,IAAMuS,EAAeH,EAAqBpM,QAAQF,QAAO,SAAA1H,GACvD,OAAOA,IAAM4B,KAEfmS,EAAqBI,GACrBH,EAAqBpM,QAAUuM,IAcnC,OACE,cAACR,EAAwBS,SAAzB,CAEE/P,MAAO,CACLqB,OACAoO,oBACAO,eAtCiB,SAAAzS,GACrB,IAAKoS,EAAqBpM,QAAQsM,SAAStS,GAAM,CAC/C,IAAMuS,EAAY,sBAAOH,EAAqBpM,SAA5B,CAAqChG,IACvDmS,EAAqBI,GACrBH,EAAqBpM,QAAUuM,IAmC7BF,oBACAK,iBAdmB,SAAAC,GACvB,IAAMC,EAAaV,EAAkBpM,QAAO,SAAA9F,GAAG,OAAI2S,EAAUE,MAAK,SAAArU,GAAC,OAAIA,IAAMwB,QACjD8S,IAAQF,EAAYV,GAC5BzQ,SAAQ,SAAAzB,GAAG,OAAIqS,EAAkBrS,QAIrD,SASG2B,IAcP,SAASoR,IACP,OAAO3L,qBAAW2K,GALpBE,EAAyBrS,aAAe,CACtCkE,KAAM,c,qBCnER,IAAIkP,EAAWvI,EAAQ,KACnBwI,EAAgBxI,EAAQ,MACxByI,EAAoBzI,EAAQ,MAC5B0I,EAAW1I,EAAQ,KACnB2I,EAAY3I,EAAQ,MACpB4I,EAAa5I,EAAQ,KAkEzBG,EAAOC,QApDP,SAAkBgG,EAAOyC,EAAUjC,GACjC,IAAIC,GAAS,EACTgB,EAAWW,EACX1S,EAASsQ,EAAMtQ,OACfgT,GAAW,EACXC,EAAS,GACTC,EAAOD,EAEX,GAAInC,EACFkC,GAAW,EACXjB,EAAWY,OAER,GAAI3S,GAvBY,IAuBgB,CACnC,IAAI6E,EAAMkO,EAAW,KAAOF,EAAUvC,GACtC,GAAIzL,EACF,OAAOiO,EAAWjO,GAEpBmO,GAAW,EACXjB,EAAWa,EACXM,EAAO,IAAIT,OAGXS,EAAOH,EAAW,GAAKE,EAEzBE,EACA,OAASpC,EAAQ/Q,GAAQ,CACvB,IAAIkC,EAAQoO,EAAMS,GACdqC,EAAWL,EAAWA,EAAS7Q,GAASA,EAG5C,GADAA,EAAS4O,GAAwB,IAAV5O,EAAeA,EAAQ,EAC1C8Q,GAAYI,IAAaA,EAAU,CAErC,IADA,IAAIC,EAAYH,EAAKlT,OACdqT,KACL,GAAIH,EAAKG,KAAeD,EACtB,SAASD,EAGTJ,GACFG,EAAK1R,KAAK4R,GAEZH,EAAOzR,KAAKU,QAEJ6P,EAASmB,EAAME,EAAUtC,KAC7BoC,IAASD,GACXC,EAAK1R,KAAK4R,GAEZH,EAAOzR,KAAKU,IAGhB,OAAO+Q,I,kCClET,IAAIvG,EAAyBxC,EAAQ,IAErC+B,OAAOK,eAAehC,EAAS,aAAc,CAC3CpI,OAAO,IAEToI,EAAQrI,aAAU,EAElB,IAAIqR,EAAiB5G,EAAuBxC,EAAQ,KAEhDkD,EAAclD,EAAQ,GAEtBqJ,GAAW,EAAID,EAAerR,UAAuB,EAAImL,EAAYsC,KAAK,OAAQ,CACpF7R,EAAG,0GACD,UAEJyM,EAAQrI,QAAUsR,G,uTCIlB,SAASC,EAAT,GAA8E,IAAnD9S,EAAkD,EAAlDA,SAAU+S,EAAwC,EAAxCA,aAAcC,EAA0B,EAA1BA,cAAkB1O,EAAQ,iBAC3E,EAAsBiG,cAAdnH,EAAR,EAAQA,KAAM6P,EAAd,EAAcA,IACNnW,EAAMqJ,qBAAWC,iBAAjBtJ,EACR,EAA8BV,oBAAS,GAAvC,mBAAOI,EAAP,KAAgBC,EAAhB,KACA,EAA0BL,mBAAS,IAAnC,mBAAOM,EAAP,KAAcC,EAAd,KACA,EAAoDP,mBAAS,MAA7D,mBAAO8W,EAAP,KAA2BC,EAA3B,KACA,EAA4C/W,mBAAS,MAArD,mBAAOgX,EAAP,KAAuBC,EAAvB,KACQC,EAAoBC,wBAApBD,gBAERlO,qBAAU,WACR+N,EAAsB,MAClBJ,GAAgB/S,EAASwT,OAASC,iBAAeC,aACnDT,EACGU,yBAAyB,CAAEC,MAAO,CAAE7U,IAAKiB,EAASC,KAAKlB,IAAK8U,QAAS7T,EAASC,KAAK4T,WACnF/Q,MAAK,YAAe,IAAZgR,EAAW,EAAXA,KACP,GAAIA,EAAM,CACR,IAAQD,EAAyBC,EAAzBD,QAASE,EAAgBD,EAAhBC,YACbF,GAAWG,IAAOC,GAAGJ,EAAS7T,EAASC,KAAK4T,UAC9CV,EAAsB,CAAEU,UAASE,oBAKtC9Q,OAAM,SAAAC,GAAG,OAAIhG,QAAQR,MAAR,0CAAiDsD,EAASC,KAAKF,KAA/D,oBAA+E9C,YAAYiG,UAE5G,CAAClD,EAAUoD,EAAKU,iBAAkBiP,IAErC,IAKM5W,EAAS,iDAAG,qGAChBM,GAAW,GADK,SAIRmX,EAAQ,CACZ7U,IAAKiB,EAASC,KAAKlB,IACnB8U,QAASX,EAAmBW,QAC5BE,YAAab,EAAmBa,aAAe,IAPnC,SASRG,YAAM,KATE,uBAURjB,EAAIkB,gBAAgB,CAAEP,UAVd,uDAYdN,EAAgB,4BAAD,OAA6BrW,YAAY,EAAD,KAAS,CAAEmX,iBAAkB,IAAM3V,QAAS,UAZrF,yBAcdhC,GAAW,GACX4W,EAAkB,MAfJ,4EAAH,qDAmBTgB,EAAU,CACd3Y,MAAM,GAAD,OAAKoB,EAAE,kBAAP,YAA4BA,EAAE,mBAA9B,YAAoDwX,yBAAetU,IACxErE,YAAamB,EAAE,sCACfhB,QAASgB,EAAE,kCACXjB,OAAQiB,EAAE,iBACVX,YACAD,SA9Be,WACfO,GAAW,GACX4W,EAAkB,QA+BpB,OAAIL,GAAiBE,IAAuB7K,YAAarI,EAASoH,QAE9D,qCACE,cAAC,IAAD,2BAAS9C,GAAT,aAAgBtE,EAASC,KAAK4T,WAC9B,cAAC,IAAD,CAASnY,MAAOoB,EAAE,yBAA0B,CAAE+W,QAASX,EAAmBW,UAA1E,SACE,cAAC,IAAD,CAAQvV,KAAK,QAAQZ,MAAO,CAAE6W,WAAY,GAAKhW,SAAU/B,EAASc,QAAS,kBAAM+V,EAAkBgB,IAAnG,SACG7X,EAAU,cAAC,IAAD,CAAS8B,KAAM,CAAC,GAAI,MAAU,cAAC,IAAD,CAAaZ,MAAO,CAAE8W,SAAU,GAAIzY,MAAO,eAGrFW,GAAS,cAAC,IAAD,CAAO+B,QAAQ,QAAQgW,QAAS/X,EAAOgY,QAAS,kBAAM/X,EAAS,OAC1EyW,GACC,cAAC,IAAD,CACE1X,MAAO0X,EAAe1X,MACtBC,YAAayX,EAAezX,YAC5BG,QAASsX,EAAetX,QACxBD,OAAQuX,EAAevX,OACvBI,OAAQmX,EAAenX,OACvBE,UAAWiX,EAAejX,UAC1BD,SAAUkX,EAAelX,cAO5B,cAAC,IAAD,2BAASoI,GAAT,aAAgBtE,EAASC,KAAK4T,WASvCf,EAAgBnU,aAAe,CAC7BoU,cAAc,EACdC,eAAe,GAGF2B,gBAAe7B,EAAiB,oB,wVC/FhC,SAAS8B,EAAT,GAAyF,IAA/DC,EAA8D,EAA9DA,WAAY3Y,EAAkD,EAAlDA,SAAU4Y,EAAwC,EAAxCA,UAAW3J,EAA6B,EAA7BA,QAASqI,EAAoB,EAApBA,KAAMuB,EAAc,EAAdA,WAC/E9B,EAAQ1I,cAAR0I,IACR,EAA8B7W,oBAAS,GAAvC,mBAAOI,EAAP,KAAgBC,EAAhB,KACA,EAA0BL,mBAAS,IAAnC,mBAAOM,EAAP,KAAcC,EAAd,KACQG,EAAMD,6BAANC,EAER,EAAsBV,mBAASyY,GAA/B,mBAAO7Q,EAAP,KAAYgR,EAAZ,KACA,EAAoC5Y,mBAASyY,EAAa,EAAI,GAA9D,mBAAOI,EAAP,KAAmBC,EAAnB,KAEA,EAAwB9Y,mBAAS,CAAE+Y,KAAM,KAAzC,mBAAOlV,EAAP,KAAamV,EAAb,KACA,EAAwChZ,mBAAS,MAAjD,oBAAOiZ,GAAP,MAAqBC,GAArB,MAEA,GAA4BlZ,mBAAS,IAArC,qBAAOH,GAAP,MAAeI,GAAf,MAEMkZ,GAA2B,cAAT/B,EAElBgC,KAAiBD,KAA0BV,EAE3CY,GAAS,iDAAG,4GAChB9Y,EAAS,MACTF,GAAW,GAFK,SAKRiZ,EAAUC,mBAAmB3R,EAAIgG,QALzB,SAQZ,IAAI/F,IAAIyR,GARI,sDAUN,IAAIE,MAAM,eAVJ,yBAcsC3C,EAAI4C,uBAAuB,CAAEjC,MAAO,CAAE5P,IAAK0R,KAdjF,oBAcAI,EAdA,EAcN7V,KAAa8V,EAdP,EAcOA,QAAShC,EAdhB,EAcgBA,aAG1BwB,GAjBU,iBAkBZH,EAAQU,GAlBI,yCAoBgC7C,EAAI+C,YAAY,CAC1DpC,MAAO,CAAE7U,IAAK+W,EAAM/W,IAAKkX,mBAAmB,KArBlC,kBAoBMC,EApBN,EAoBJlW,WAIegU,IAAOmC,IAAID,EAAgBjW,KAAK4T,QAASiC,EAAMjC,UACpEyB,GAAgBY,EAAgBjW,MAChCmV,EAAQU,IAERV,EAAQU,GA5BE,QAgCdzZ,GAAU,CACR0Z,UACAhC,cACAqC,SAAUpS,EAAIgG,SAnCF,kDAsCd9M,QAAQR,MAAR,MACM2Z,EAvCQ,mCAuC6BpZ,YAAY,EAAD,KACtDN,EAAS0Z,GACTlL,EAAQ,EAAD,IAzCO,yBA2Cd1O,GAAW,GA3CG,mFAAH,qDA+CTN,GAAS,iDAAG,4FACZoZ,GADY,gBAEdT,EAAU,aACR7U,QACGhE,KAJS,sCAORqa,KAPQ,OAShBpa,IATgB,2CAAH,qDAYToa,GAAS,iDAAG,qGAChB7Z,GAAW,GADK,kBAGRwW,EAAIsD,gBAAgB,CAAE3C,MAAO,CAAE5P,IAAK2R,mBAAmB3R,EAAIgG,WAHnD,OAId8K,EAAU,aACR7U,QACGhE,KANS,gDASRoa,EATQ,mCAS6BpZ,YAAY,EAAD,KACtDN,EAAS0Z,GAVK,yBAYd5Z,GAAW,GAZG,4EAAH,qDAgBf2I,qBAAU,WACJyP,GACFY,OAED,CAACZ,IAEJ,IAAM2B,GAAO,CACX,CAAEzW,KAAMjD,EAAE,eAAgB0E,MAAO8S,yBAAe,CAAErU,SAAQ,IAC1D,CAAEF,KAAMjD,EAAE,kBAAmB0E,MAAOvB,EAAK4T,SACzC,CAAE9T,KAAMjD,EAAE,cAAe0E,MAAO,cAAC,IAAD,CAAYzC,IAAKkB,EAAKlB,OACtD,CAAEgB,KAAMjD,EAAE,iBAAkB0E,MAAOiV,YAAaxW,EAAKyW,SACrD,CAAE3W,KAAMjD,EAAE,8BAA+B0E,MAAOvB,EAAKkV,KAAKwB,UAwDtDC,GAAQ,CACZ,CACEC,MAAO/Z,EAAE,0BACTga,KACE,cAAC,IAAD,CAAYhZ,UAAU,MAAtB,SACE,cAAC,IAAD,CACE+Y,MAAO/Z,EAAE,0BACTia,aAAa,MACbtY,QAAQ,WACRsB,KAAK,MACL,UAAQ,qBACRiX,WAAS,EACTtY,WAAS,EACThB,MAAO,CAAEuZ,aAAc,IACvBC,OAAO,QACPC,WAAYra,EAAE,gCACd0E,MAAOwC,EACPoT,SAAU,SAAA7Z,GACRZ,EAAS,MACTqY,EAAOzX,EAAEqL,OAAOpH,QAElBjD,SAAU/B,EACV6a,WAAY,SAAA9Z,GACI,UAAVA,EAAE6D,MACJ7D,EAAE+Z,iBACF7B,WAMV5Z,OAAQiB,EAAE,iBACVhB,QAASgB,EAAE,eACXZ,WACAC,UAAW,WACTsZ,KACAP,EAAc,KAGlB,CACE2B,MAAO/Z,EAAE,0BACTga,KA7FEta,EAEA,qBACEkB,MAAO,CACLgO,OAAQ,IACRzN,MAAO,OACP+K,QAAS,OACTuO,WAAY,SACZC,eAAgB,SAChBC,cAAe,UAPnB,SASE,cAAC,IAAD,MAIFxX,EAAKlB,IAEL,sBAAKrB,MAAO,CAAEga,YAAa,OAA3B,UACGlB,GAAKrV,KAAI,SAAAwW,GACR,OAAIA,EAAI5X,OAASjD,EAAE,cAEf,cAAC,IAAD,CACE8a,eAAe,MAEfC,UAAW,IACX9X,KAAM4X,EAAI5X,KACV+X,cAAe,kBAAMhb,EAAE,eALzB,SAMG6a,EAAInW,OAJAmW,EAAI5X,MASb,cAAC,IAAD,CAAS6X,eAAe,MAAqBC,UAAW,IAAK9X,KAAM4X,EAAI5X,KAAvE,SACG4X,EAAInW,OAD4BmW,EAAI5X,SAK1CsV,IACC,cAAC,IAAD,CAAOxS,KAAK,QAAQpE,QAAQ,OAAOf,MAAO,CAAEwZ,OAAQ,kBAApD,SACE,gCACGpa,EAAE,mCACH,cAAC,IAAD,CAAKiG,QAASsS,GAAaxB,QAASnW,MAAO,CAAEwZ,OAAQ,WACpDpa,EAAE,2CAOR,KA6CLjB,OAAyBiB,EAAjB0Y,GAAmB,aAAkB,iBAC7C1Z,SAAmB,OAAViZ,QAAU,IAAVA,OAAA,EAAAA,EAAYjZ,UAA2BgB,EAAfuY,GAAiB,iBAAsB,4BACxEnZ,SAAU,WACJsZ,GACFN,GAAc,SAAA6C,GAAC,OAAIA,EAAI,KAEvB7b,KAGJC,UAAW,WACLkZ,GACFnZ,IAEAC,QAKF6b,GAAOpB,GAAM3B,GAEnB,OACE,eAAC,IAAD,CACEvZ,OAAiB,OAAVqZ,QAAU,IAAVA,OAAA,EAAAA,EAAYrZ,QAASoB,EAAE,0BAC9Bka,WAAS,EACTiB,SAAS,KACTvD,QAAS,kBAAMsD,GAAK9b,YACpBgc,gBAAgC,IAAfjD,EACjBkD,sBAAoB,EACpB7b,MAAI,EACJ8b,QACE,qCACGJ,GAAKnc,QACJ,cAAC,IAAD,CACEyB,QAAS,SAAAC,GACPA,EAAEC,kBACFwa,GAAK9b,YAEPH,MAAM,UACNuC,KAAK,QANP,SAOG0Z,GAAKnc,QAAUiB,EAAE,mBAGtB,eAAC,IAAD,CACEQ,QAAS,SAAAC,GACPA,EAAEC,kBACFwa,GAAK7b,aAEPJ,MAAM,UACNuC,KAAK,QACL,UAAQ,6BACRC,SAAU/B,IAAYwH,GAAOtH,EAC7B+B,QAAQ,YACRC,WAAS,EACThB,MAAO,CAAE6W,WAAY,GAXvB,UAYG/X,GAA0B,IAAfyY,GAAoB,cAAC,IAAD,CAAS3W,KAAM,CAAC,GAAI,MACnD0Z,GAAKlc,cAlCd,UAsCG0Z,IACC,cAAC,IAAD,CAAS6C,kBAAgB,EAACpD,WAAYA,EAAtC,SACG2B,GAAMzV,KAAI,gBAAG0V,EAAH,EAAGA,MAAH,OACT,cAAC,IAAD,UACE,cAAC,IAAD,UAAYA,KADHA,QAMjB,cAAC,IAAD,CACE/Y,UAAU,MACVJ,MAAO,CACLQ,UAAW,IAHf,SAKG8Z,GAAKlB,SAELpa,GACD,cAAC,IAAD,CAAOmG,KAAK,QAAQnF,MAAO,CAAEO,MAAO,OAAQC,UAAW,GAAvD,SACGxB,OAgBXkY,EAAejW,aAAe,CAC5BwM,QAAS,aACT0J,WAAY,GACZrB,KAAM,UACNuB,WAAY,K,qBCpUd,IAAIuD,EAAc9O,EAAQ,KACtB+O,EAAW/O,EAAQ,KACnBgP,EAAUhP,EAAQ,MAClBiP,EAAoBjP,EAAQ,MAC5BkP,EAAOlP,EAAQ,KAuBfqI,EAAU0G,GAAS,SAASI,GAC9B,IAAIvI,EAAasI,EAAKC,GAEtB,OADAvI,EAAkC,mBAAdA,EAA2BA,OAAawI,EACrDJ,EAAQF,EAAYK,EAAQF,QAAoBG,EAAWxI,MAGpEzG,EAAOC,QAAUiI,G,qBCjCjB,IAAIgH,EAAiBrP,EAAQ,MACzBsP,EAActP,EAAQ,KACtBuP,EAAWvP,EAAQ,MAiCvBG,EAAOC,QArBP,SAAiB+O,EAAQtG,EAAUjC,GACjC,IAAI9Q,EAASqZ,EAAOrZ,OACpB,GAAIA,EAAS,EACX,OAAOA,EAASyZ,EAASJ,EAAO,IAAM,GAKxC,IAHA,IAAItI,GAAS,EACTkC,EAASyG,MAAM1Z,KAEV+Q,EAAQ/Q,GAIf,IAHA,IAAIsQ,EAAQ+I,EAAOtI,GACf4I,GAAY,IAEPA,EAAW3Z,GACd2Z,GAAY5I,IACdkC,EAAOlC,GAASwI,EAAetG,EAAOlC,IAAUT,EAAO+I,EAAOM,GAAW5G,EAAUjC,IAIzF,OAAO2I,EAASD,EAAYvG,EAAQ,GAAIF,EAAUjC,K,qBChCpD,IAAI2B,EAAWvI,EAAQ,KACnBwI,EAAgBxI,EAAQ,MACxByI,EAAoBzI,EAAQ,MAC5B0P,EAAW1P,EAAQ,KACnB2P,EAAY3P,EAAQ,KACpB0I,EAAW1I,EAAQ,KA6DvBG,EAAOC,QA7CP,SAAwBgG,EAAOrU,EAAQ8W,EAAUjC,GAC/C,IAAIC,GAAS,EACTgB,EAAWW,EACXM,GAAW,EACXhT,EAASsQ,EAAMtQ,OACfiT,EAAS,GACT6G,EAAe7d,EAAO+D,OAE1B,IAAKA,EACH,OAAOiT,EAELF,IACF9W,EAAS2d,EAAS3d,EAAQ4d,EAAU9G,KAElCjC,GACFiB,EAAWY,EACXK,GAAW,GAEJ/W,EAAO+D,QA/BK,MAgCnB+R,EAAWa,EACXI,GAAW,EACX/W,EAAS,IAAIwW,EAASxW,IAExBkX,EACA,OAASpC,EAAQ/Q,GAAQ,CACvB,IAAIkC,EAAQoO,EAAMS,GACdqC,EAAuB,MAAZL,EAAmB7Q,EAAQ6Q,EAAS7Q,GAGnD,GADAA,EAAS4O,GAAwB,IAAV5O,EAAeA,EAAQ,EAC1C8Q,GAAYI,IAAaA,EAAU,CAErC,IADA,IAAI2G,EAAcD,EACXC,KACL,GAAI9d,EAAO8d,KAAiB3G,EAC1B,SAASD,EAGbF,EAAOzR,KAAKU,QAEJ6P,EAAS9V,EAAQmX,EAAUtC,IACnCmC,EAAOzR,KAAKU,GAGhB,OAAO+Q,I,qBC/DT,IAAI+G,EAAM9P,EAAQ,KACd+P,EAAO/P,EAAQ,MACf4I,EAAa5I,EAAQ,KAYrB2I,EAAcmH,GAAQ,EAAIlH,EAAW,IAAIkH,EAAI,CAAC,EAAE,KAAK,IAT1C,IASoE,SAAS/d,GAC1F,OAAO,IAAI+d,EAAI/d,IAD2Dge,EAI5E5P,EAAOC,QAAUuI,G,mBCFjBxI,EAAOC,QAJP,c,qBCZA,IAAI4P,EAAchQ,EAAQ,KACtBiQ,EAAejQ,EAAQ,KA+B3BG,EAAOC,QAJP,SAA2BpI,GACzB,OAAOiY,EAAajY,IAAUgY,EAAYhY,K,mfCc7B,SAASkY,EAAT,GAA+E,IAApD1Z,EAAmD,EAAnDA,SAAU2Z,EAAyC,EAAzCA,QAASC,EAAgC,EAAhCA,WAAYnb,EAAoB,EAApBA,QAAY6F,EAAQ,iBACrFuV,EAAUC,cACVxP,EAAOC,cACb,EAAgCnO,mBAAS,MAAzC,mBAAO+S,EAAP,KAAiB4K,EAAjB,KACA,EAA0C3d,mBAAS,MAAnD,mBAAO4d,EAAP,KAAsBC,EAAtB,KACA,GAA8B7d,oBAAS,GAAvC,qBAAOI,GAAP,MAAgBC,GAAhB,MACA,GAA4CL,mBAAS,MAArD,qBAAOgX,GAAP,MAAuBC,GAAvB,MACQvW,GAAMqJ,qBAAWC,iBAAjBtJ,EACR,GAAoBod,IAAgB,uBAAuB,GAApDC,GAAP,qBACA,GAA2DpU,YAAyB/F,GAAnEoa,GAAjB,GAAQ5d,QAAgCsJ,GAAxC,GAAwCA,eAElCuU,GACJ,SAACC,EAAQC,GAAT,IAAaC,EAAb,+FACA,yGACQre,EADR,iDACoB,WAAMF,GAAN,gGAChB0d,EAAQ,CAAEW,SAAQta,aAClBvD,IAAW,GACXwd,EAAiBK,GACjBjH,GAAkB,MACdoH,GAAY,EALA,SAOR7G,EAAQ,CAAE7U,IAAKiB,EAASC,KAAKlB,KACpB,WAAXub,IACF1G,EAAM8G,SAAiC,aAAtBze,EAAO0e,YAEX,UAAXL,GAAuBH,IAAa,UAACna,EAAS4a,gBAAV,OAAC,EAAmBC,YAX9C,0BAaU1X,YAAanD,EAAUsK,EAAKlH,MAA1CI,EAbI,EAaJA,WACFQ,EAAM,IAAIC,IAAI6B,KAChB5B,aAAaC,IAAI,YAAaX,GAClCtE,OAAO5C,KAAK0H,EAAII,MAChBwV,EAAW,CAAEU,SAAQta,aAjBT,4CAoBRua,EAAG,CAAE3G,UApBG,WAqBC,WAAX0G,EArBU,iBAsBZG,GAAY,EAtBA,yCAwBNvG,YAAM,KAxBA,QA2BC,WAAXoG,GACFQ,IAAM5R,QAAQpM,GAAE,2BAGlB8c,EAAW,CAAEU,SAAQta,aA/BP,kDAiCRqW,EAjCQ,mBAiCaiE,EAjCb,oBAiC+Brd,YAAY,EAAD,KACxD2c,EAAW,CAAEU,SAAQta,WAAUtD,MAAO,IAAIkZ,MAAMS,KAlClC,yBAoCToE,GACHhe,IAAW,GArCC,6EADpB,sDA2CQP,EAAW,WACfO,IAAW,GACX4W,GAAkB,OAGdtT,EAAOuU,yBAAetU,GAAU,GAEhC+a,EACJ/a,EAASe,SAAWia,6BAAmBC,iBAAeC,QAClD,CACEvf,YAAa,kBACX,cAAC,IAAD,CAAYmC,UAAU,MAAtB,SACE,cAAC,IAAD,CAAYqd,cAAY,EAAxB,SACE,4BAAIre,GAAE,iDAIZb,OAAQ,CAAE0e,WAAY,aAExB,CACEhf,YAAa,SAACM,EAAQI,GAAT,OACX,eAAC,IAAD,CAAYyB,UAAU,MAAtB,UACE,cAAC,IAAD,CAAYqd,cAAY,EAAxB,SAA0Bre,GAAE,uCAC5B,eAAC,IAAD,CACEiD,KAAK,aACLyB,MAAOvF,EAAO0e,WACdvD,SAAU,SAAA7Z,GAAC,OAAIlB,EAAU,2BAAKJ,GAAN,IAAc0e,WAAYpd,EAAEqL,OAAOpH,UAH7D,UAIE,cAAC,IAAD,CACEA,MAAM,WACN4Z,QAAS,cAAC,IAAD,IACTvE,MAAO/Z,GAAE,oCAEX,cAAC,IAAD,CACE0E,MAAM,WACN4Z,QAAS,cAAC,IAAD,IACTvE,MAAO/Z,GAAE,2CAKjBb,OAAQ,CAAE0e,WAAY,aAGxBU,EAAkB,CACtBC,KAAM,CACJ5f,MAAM,GAAD,OAAKoB,GAAE,eAAP,YAAyBiD,GAC9BpE,YAAamB,GAAE,mCACfhB,QAASgB,GAAE,+BACXjB,OAAQiB,GAAE,iBACVX,YACAD,YAEFqf,QAAS,CACP7f,MAAM,GAAD,OAAKoB,GAAE,kBAAP,YAA4BiD,GACjCpE,YAAamB,GAAE,sCACfhB,QAASgB,GAAE,kCACXjB,OAAQiB,GAAE,iBACVX,YACAD,YAEFsf,OAAO,aACL9f,MAAM,GAAD,OAAKoB,GAAE,iBAAP,YAA2BiD,GAChCjE,QAASgB,GAAE,iCACXjB,OAAQiB,GAAE,iBACVX,YACAD,YACG6e,GAELU,eAAgB,CACd/f,MAAM,GAAD,OAAKoB,GAAE,kBACZnB,YAAamB,GAAE,4CAA6C,CAAEiD,SAC9DjE,QAASgB,GAAE,kBACXjB,OAAQiB,GAAE,iBACVX,YACAD,cAIAse,EAzHN,gBA0HInH,GAAkBgI,EAAgBf,IA1HtC,wCA4HUne,IA5HV,6CAgIIG,GAAOof,QAAQvM,GAEfwM,GAAS,SAAApe,GACb,IACEA,EAAEC,kBACFD,EAAE+Z,iBAEF,UACFyC,EAAYxc,EAAEqe,gBAYVC,GAAQ,iDAAG,WAAOvB,EAAQ/c,GAAf,2EACf,IACEA,EAAEC,kBACFD,EAAE+Z,iBAEF,UALa,GAMfyC,EAAY,MACkB,oBAAnBO,EAAOwB,QAPH,iCASXrf,IAAW,GACXwd,EAAiBK,EAAOA,QAVb,SAWLA,EAAOwB,UAXF,yDAcX5e,QAAQR,MAAR,mBAA0B4d,EAAOva,KAAjC,mBAdW,yBAgBXtD,IAAW,GAhBA,6EAAH,wDAqBRsf,GAAeC,8BAAoBhc,GACrC,CACEsa,OAAQ,SACR2B,KAAMC,IAAMxL,OACZ3Q,KAAMjD,GAAE,iBACRgf,QAASzB,GAAc,SAAU/P,EAAK2I,IAAIkJ,gBAAgB,GAC1D5d,SAA8B,YAApByB,EAASoH,QAErB,KAEEgV,GAAuB,CAC3B9B,OAAQ,SACR2B,KAAMC,IAAMxL,OACZ3Q,KAAMjD,GAAE,iBACRgf,QAASzB,GAAc,iBAAkB/P,EAAK2I,IAAIoJ,wBAAwB,IAGtEC,GAAyBC,+BAAqBvc,GAE9CoY,GAAU,CACd,CACEkC,OAAQ,QACR2B,KAAMC,IAAM5L,MACZvQ,KAAMjD,GAAE,gBACRgf,QAASzB,GAAc,QAAS/P,EAAK2I,IAAIuJ,eACzCje,UACGke,+BAAqBzc,IACF,YAApBA,EAASoH,QACW,cAApBpH,EAASoH,QACTkV,GAAuBhd,OAAS,GAChCod,YAAc1c,EAASoH,SACvBpH,EAASwT,OAASC,iBAAeC,aACjC0G,IAEJ,CACEE,OAAQ,OACR2B,KAAMC,IAAM3L,KACZxQ,KAAMjD,GAAE,eACRgf,QAASzB,GAAc,OAAQ/P,EAAK2I,IAAI0J,cAAc,GACtDpe,SAA8B,YAApByB,EAASoH,QAAwBpH,EAASwT,OAASC,iBAAeC,aAE9E,CACE4G,OAAQ,UACR2B,KAAMC,IAAM1L,QACZzQ,KAAMjD,GAAE,kBACRgf,QAASzB,GAAc,UAAW/P,EAAK2I,IAAI2J,iBAAiB,GAC5Dre,SAA8B,YAApByB,EAASoH,QAAwBpH,EAASwT,OAASC,iBAAeC,aAE9E,CACE4G,OAAQ,SACR2B,KAAMC,IAAMzL,OACZ1Q,KAAMjD,GAAE,iBACRgf,QAASzB,GAAc,SAAU/P,EAAK2I,IAAI4J,gBAC1Cte,SAA8B,YAApByB,EAASoH,QAAwBpH,EAASwT,OAASC,iBAAeC,aAG9EgJ,YAAc1c,EAASoH,QAAUgV,GAAuBL,GAExD,CACEe,WAAW,GAEb,CACEC,YAAY,EACZzC,OAAQ,SACR2B,KAAMC,IAAMvL,OACZ5Q,KAAMjD,GAAE,iBACRgf,QAAS,WACPjC,EAAQ/Y,KAAR,qBAA2Bd,EAASC,KAAKlB,IAAzC,oBAEFR,SAAUme,YAAc1c,EAASoH,SAEnC,CACE2V,YAAY,EACZzC,OAAQ,OACR2B,KAAMC,IAAMrL,MACZ9Q,KAAMjD,GAAE,qBACRgf,QAAS,WACPjC,EAAQ/Y,KAAR,qBAA2Bd,EAASC,KAAKlB,IAAzC,cAEFR,SAAUme,YAAc1c,EAASoH,SAEnC,CACE2V,YAAY,EACZzC,OAAQ,MACR2B,KAAMC,IAAMtL,IACZ7Q,KAAMjD,GAAE,cACRgf,QAAS,WACPjC,EAAQ/Y,KAAR,yBAA+Bd,EAASC,KAAKlB,OAE/CR,SAAUme,YAAc1c,EAASoH,UAEnCvC,OAAO6W,SAEHtT,GAAa5L,IAAW6L,YAAarI,EAASoH,QAEpD,MAAgB,SAAZ3I,EAEA,eAACue,EAAD,CAAK,UAAQ,mBAAb,UACE,cAAC,IAAD,CAAYC,WAAW,kBAAvB,SACG,SAAAjK,GAAa,OACZ,cAAC,IAAD,CACE,aAAW,OACX,gBAAc,eACd,gBAAc,OACd,UAAQ,2BACR,uBAAsBhT,EAASC,KAAKlB,IACpCzB,QAASqe,GACTrd,KAAK,QACLC,UAAWyU,IAAmB0J,YAAc1c,EAASoH,SAAWsU,QAAQtT,IAR1E,SASE,cAAC,IAAD,SAKN,eAAC,IAAD,CAAM8U,GAAG,eAAe/N,SAAUA,EAAUgO,aAAW,EAAC7gB,KAAMA,GAAMoY,QAhJ1D,SAAAnX,GACd,IACEA,EAAEC,kBACFD,EAAE+Z,iBAEF,UACFyC,EAAY,OA0I8EqD,WAAY,GAAlG,UACGd,GAAuBhd,OAAS,GAC/B,eAAC,IAAD,CAAO5B,MAAO,CAAEua,SAAU,SAAWja,SAAS,QAA9C,UACGlB,GAAE,wCACH,uBACA,cAAC,OAAD,CAAMgM,GAAE,qBAAgB9I,EAASC,KAAKlB,IAA9B,kBAAR,SAA4DjC,GAAE,qCAGjEsb,GAAQjX,KAAI,SAACmZ,EAAQ/a,GACpB,OAAI+a,EAAOwC,UAEF,cAAC,IAAD,uBAA2Bvd,IAGlC,eAAC,IAAD,CACE8d,OAAK,EAEL/f,QAAS,SAAAC,GAAC,OAAIse,GAASvB,EAAQ/c,IAC/BgB,SAAU+b,EAAO/b,SACjB,oBAAY+b,EAAOA,OAAnB,aALF,UAME,cAAC,IAAD,CAAc5c,MAAO,CAAEvC,SAAU,IAAjC,SACE,cAACmf,EAAO2B,KAAR,CAAazH,SAAS,YAExB,cAAC,IAAD,CAAc8I,QAAShD,EAAOva,SAPzBua,EAAOva,YAYnBqT,IACC,cAAC,IAAD,CACE1X,MAAO0X,GAAe1X,MACtBC,YAAayX,GAAezX,YAC5BG,QAASsX,GAAetX,QACxBD,OAAQuX,GAAevX,OACvBI,OAAQmX,GAAenX,OACvBE,UAAWiX,GAAejX,UAC1BD,SAAUkX,GAAelX,cAQjC,eAAC8gB,EAAD,yBAAK,UAAQ,oBAAuB1Y,GAApC,cACE,cAAC,IAAD,UACG8T,GACEvT,QAAO,SAAAzE,GAAC,OAAKA,EAAE0c,YAAc1c,EAAE2c,cAC/B5b,KAAI,SAAAmZ,GAAM,OACT,eAAC,IAAD,CACE5e,MAAO4e,EAAOva,KAEd,oBAAYua,EAAOA,OAAnB,aACAhd,QAAS,kBAAMue,GAASvB,IACxB/b,SAAUmd,QAAQpB,EAAO/b,WAAamd,QAAQtT,IALhD,UAMG4R,IAAkBM,EAAOA,QAAUoB,QAAQtT,IAAc,cAAC,IAAD,CAAS9J,KAAM,CAAC,GAAI,MAAU,cAACgc,EAAO2B,KAAR,IACxF,sBAAM7d,UAAU,uBAAhB,SAAwCkc,EAAOva,SAL1Cua,EAAOva,WASnBqT,IACC,cAAC,IAAD,CACE1X,MAAO0X,GAAe1X,MACtBC,YAAayX,GAAezX,YAC5BG,QAASsX,GAAetX,QACxBD,OAAQuX,GAAevX,OACvBI,OAAQmX,GAAenX,OACvBE,UAAWiX,GAAejX,UAC1BD,SAAUkX,GAAelX,eAcnCwd,EAAgB/a,aAAe,CAC7BF,QAAS,QAGX,IAAMue,EAAMpe,UAAOyK,IAAV,uLAIc,SAAAC,GAAK,OAAIA,EAAMrO,MAAMI,YAAYE,OAAOC,O,kCC3a/D,IAAIwQ,EAAyBxC,EAAQ,IAErC+B,OAAOK,eAAehC,EAAS,aAAc,CAC3CpI,OAAO,IAEToI,EAAQrI,aAAU,EAElB,IAAIqR,EAAiB5G,EAAuBxC,EAAQ,KAEhDkD,EAAclD,EAAQ,GAEtBqJ,GAAW,EAAID,EAAerR,UAAuB,EAAImL,EAAYsC,KAAK,OAAQ,CACpF7R,EAAG,kBACD,aAEJyM,EAAQrI,QAAUsR,G,kCCflB,IAAI7G,EAAyBxC,EAAQ,IAErC+B,OAAOK,eAAehC,EAAS,aAAc,CAC3CpI,OAAO,IAEToI,EAAQrI,aAAU,EAElB,IAAIqR,EAAiB5G,EAAuBxC,EAAQ,KAEhDkD,EAAclD,EAAQ,GAEtBqJ,GAAW,EAAID,EAAerR,UAAuB,EAAImL,EAAYsC,KAAK,OAAQ,CACpF7R,EAAG,kBACD,QAEJyM,EAAQrI,QAAUsR,G,kCCflB,IAAI7G,EAAyBxC,EAAQ,IAErC+B,OAAOK,eAAehC,EAAS,aAAc,CAC3CpI,OAAO,IAEToI,EAAQrI,aAAU,EAElB,IAAIqR,EAAiB5G,EAAuBxC,EAAQ,KAEhDkD,EAAclD,EAAQ,GAEtBqJ,GAAW,EAAID,EAAerR,UAAuB,EAAImL,EAAYsC,KAAK,OAAQ,CACpF7R,EAAG,2OACD,aAEJyM,EAAQrI,QAAUsR,G,kCCflB,IAAI7G,EAAyBxC,EAAQ,IAErC+B,OAAOK,eAAehC,EAAS,aAAc,CAC3CpI,OAAO,IAEToI,EAAQrI,aAAU,EAElB,IAAIqR,EAAiB5G,EAAuBxC,EAAQ,KAEhDkD,EAAclD,EAAQ,GAEtBqJ,GAAW,EAAID,EAAerR,UAAuB,EAAImL,EAAYsC,KAAK,OAAQ,CACpF7R,EAAG,gsBACD,YAEJyM,EAAQrI,QAAUsR,G,kCCflB,IAAI7G,EAAyBxC,EAAQ,IAErC+B,OAAOK,eAAehC,EAAS,aAAc,CAC3CpI,OAAO,IAEToI,EAAQrI,aAAU,EAElB,IAAIqR,EAAiB5G,EAAuBxC,EAAQ,KAEhDkD,EAAclD,EAAQ,GAEtBqJ,GAAW,EAAID,EAAerR,UAAuB,EAAImL,EAAYsC,KAAK,OAAQ,CACpF7R,EAAG,+NACD,WAEJyM,EAAQrI,QAAUsR,G,kCCflB,IAAI7G,EAAyBxC,EAAQ,IAErC+B,OAAOK,eAAehC,EAAS,aAAc,CAC3CpI,OAAO,IAEToI,EAAQrI,aAAU,EAElB,IAAIqR,EAAiB5G,EAAuBxC,EAAQ,KAEhDkD,EAAclD,EAAQ,GAEtBqJ,GAAW,EAAID,EAAerR,UAAuB,EAAImL,EAAYsC,KAAK,OAAQ,CACpF7R,EAAG,sSACD,SAEJyM,EAAQrI,QAAUsR,G,kCCflB,IAAI7G,EAAyBxC,EAAQ,IAErC+B,OAAOK,eAAehC,EAAS,aAAc,CAC3CpI,OAAO,IAEToI,EAAQrI,aAAU,EAElB,IAAIqR,EAAiB5G,EAAuBxC,EAAQ,KAEhDkD,EAAclD,EAAQ,GAEtBqJ,GAAW,EAAID,EAAerR,UAAuB,EAAImL,EAAYsC,KAAK,OAAQ,CACpF7R,EAAG,gEACD,eAEJyM,EAAQrI,QAAUsR,G,qHCbH,SAAS0K,EAAT,GAA0C,IAAlB/J,EAAiB,EAAjBA,KAASlP,EAAQ,iBACtD,MAAa,gBAATkP,EAEA,cAAC,IAAD,yBAAK3Q,KAAK,QAAWyB,GAArB,sBAMG,O,sjBCLM,SAASkZ,EAAT,GAA6F,IAAhExd,EAA+D,EAA/DA,SAA+D,KAArDgG,QAAqD,EAA5CyX,+BAA4C,SAATnU,EAAS,iBACjGxM,EAAMqJ,qBAAWC,iBAAjBtJ,EACR,EAA0CiJ,YAAyB/F,GAA3DyE,EAAR,EAAQA,KAAMjI,EAAd,EAAcA,QAASsJ,EAAvB,EAAuBA,eAEvB,GAAItJ,IAAYihB,EACd,OAAO,cAAC,IAAD,aAASnf,KAAM,IAAQgL,IAGhC,IAAMtF,EAAMyZ,EAAyBhZ,EAAK,GAAKqB,EAE/C,OAAK9B,EAKH,cAAC0Z,EAAD,2BAAepU,GAAf,aACE,cAACqU,EAAD,UACE,cAAC,IAAD,CAAcvZ,KAAMJ,EAAK4E,OAAO,SAASxK,UAAU,qBAAqByK,UAAU,QAAlF,SACG/L,EAAE,sBAPFA,EAAE,mCAcb,IAAM6gB,EAAO/e,UAAOyK,IAAV,gEAKJqU,EAAY9e,UAAOyK,IAAV,kNAmBfmU,EAAkB7e,aAAe,CAC/B8e,wBAAwB,G,wHC1CX,SAASG,GAAT,GAAkD,IAAxB1hB,EAAuB,EAAvBA,SAAU4Y,EAAa,EAAbA,UACzC7B,EAAQ1I,cAAR0I,IACR,EAA8B7W,oBAAS,GAAvC,mBAAOI,EAAP,KAAgBC,EAAhB,KACA,EAA0BL,mBAAS,IAAnC,mBAAOM,EAAP,KAAcC,EAAd,KACQG,EAAMD,6BAANC,EAER,EAA0BV,qBAA1B,mBAAOV,EAAP,KAAcmiB,EAAd,KACA,EAAsCzhB,qBAAtC,mBAAOT,EAAP,KAAoBmiB,EAApB,KAEMxH,EAAS,iDAAG,uGAChB7Z,GAAW,GADK,kBAGKwW,EAAIsD,gBAAgB,CAAE3C,MAAO,CAAElY,QAAOC,iBAH3C,OAGRmY,EAHQ,OAIdgB,EAAUhB,EAAK9T,UAJD,gDAMRqW,EANQ,mCAM6BpZ,YAAY,EAAD,KACtDN,EAAS0Z,GAPK,yBASd5Z,GAAW,GATG,4EAAH,qDAaf,OACE,eAAC,KAAD,CACEf,MAAOoB,EAAE,8BACTka,WAAS,EACTiB,SAAS,KACTvD,QAAS,kBAAMxY,KACfgc,iBAAe,EACf5b,MAAI,EACJ8b,QACE,qCACE,cAAC,IAAD,CACE9a,QAAS,SAAAC,GACPA,EAAEC,kBACFtB,KAEFH,MAAM,UACNuC,KAAK,QANP,SAOGxB,EAAE,mBAEL,eAAC,IAAD,CACEQ,QAAS,SAAAC,GACPA,EAAEC,kBACF8Y,KAEFva,MAAM,UACNuC,KAAK,QACL,UAAQ,6BACRG,QAAQ,YACRF,SAAU/B,GAAWE,IAAUhB,IAAUC,EACzC+B,MAAO,CAAE6W,WAAY,GAVvB,UAWG/X,GAAW,cAAC,IAAD,CAAS8B,KAAM,CAAC,GAAI,MAC/BxB,EAAE,uBA9BX,UAkCE,cAACe,GAAA,EAAD,CAAmBC,UAAU,MAA7B,SACE,eAACigB,EAAA,EAAD,CAAYjgB,UAAU,MAAtB,UACE,cAACkgB,GAAA,EAAD,CACEtgB,MAAO,CAAEuZ,aAAc,IACvBJ,MAAK,mBAAc/Z,EAAE,iBACrBia,aAAa,MACbtY,QAAQ,WACRuY,WAAS,EACTtY,WAAS,EACT8C,MAAO9F,EACP0b,SAAU,SAAA7Z,GACRZ,EAAS,MACTkhB,EAAStgB,EAAEqL,OAAOpH,QAEpBjD,SAAU/B,IAEZ,cAACwhB,GAAA,EAAD,CACEnH,MAAK,mBAAc/Z,EAAE,uBACrBia,aAAa,MACbtY,QAAQ,WACRuY,WAAS,EACTxV,MAAO7F,EACPyb,SAAU,SAAA7Z,GACRZ,EAAS,MACTmhB,EAAevgB,EAAEqL,OAAOpH,QAE1BjD,SAAU/B,WAIbE,GACD,cAAC,IAAD,CAAOmG,KAAK,QAAQnF,MAAO,CAAEO,MAAO,OAAQC,UAAW,GAAvD,SACGxB,OC3FI,SAASuhB,GAAT,GAAoC,IAAbC,EAAY,EAAZA,SAC9BrE,EAAUC,cACRhd,EAAMD,6BAANC,EAER,EAA0BV,mBAAS,IAAnC,mBAAOM,EAAP,KAAcC,EAAd,KACA,EAA8BP,mBAAS,IAAvC,mBAAO8M,EAAP,KAAgBiV,EAAhB,KACA,EAA4C/hB,mBAAS,MAArD,mBAAOgiB,EAAP,KAAuBC,EAAvB,KACA,EAA0CjiB,mBAAS,MAAnD,mBAAOkiB,EAAP,KAAsBC,EAAtB,KAEMC,EAAsB,WAC1BH,EAAkB,OA2BpB,OACE,qCACE,eAAC,KAAD,CACE/gB,QAAS,kBAAMuc,EAAQ/Y,KAAK,WAC5B4N,gBAAiB,CAAE,UAAW,qBAC9BD,KAAM,CACJ,cAAC,KAAYsB,KAAb,CAA0B,UAAQ,oBAAoBzS,QAAS,WA7BrE+gB,EAAkB,CAChBniB,SAAU,WACRsiB,IACAH,EAAkB,OAEpBvJ,UAAW,WACT0J,QAuBE,SACG1hB,EAAE,4BADiB,KAGtB,cAAC,KAAYiT,KAAb,CAA0B,UAAQ,mBAAmBzS,QAAS,WApBpEihB,EAAiB,CACfriB,SAAU,WACRqiB,EAAiB,OAEnBzJ,UAAW,WACTyJ,EAAiB,MACjBL,EAAQ,WAAR,iBAcE,SACGphB,EAAE,+BADiB,MAP1B,UAWE,cAAC,IAAD,IACCA,EAAE,mCAEFJ,GAAS,cAAC,KAAD,CAAO+B,QAAQ,QAAQgW,QAAS/X,EAAOgY,QAAS,kBAAM/X,EAAS,SACxEuM,GAAW,cAAC,KAAD,CAAOzK,QAAQ,UAAUggB,SAAU,IAAMhK,QAASvL,EAASwL,QAAS,kBAAMyJ,EAAW,OAClGC,GAAkB,cAAC,KAAD,CAAgBliB,SAAUkiB,EAAeliB,SAAU4Y,UAAWsJ,EAAetJ,YAC/FwJ,GAAiB,cAACV,GAAD,CAAgB1hB,SAAUoiB,EAAcpiB,SAAU4Y,UAAWwJ,EAAcxJ,eD+CnG8I,GAAejf,aAAe,GCtC9Bsf,GAAYtf,aAAe,CACzBuf,SAAU,c,+BCxCG,SAASQ,KACtB,OACE,cAAC,IAAD,UACE,cAACC,GAAD,MAKC,SAASA,KACd,IAAMrU,EAAOC,cACPqU,EAAYC,cACV7Y,EAAYC,cAAZD,QACR,EAAmF8L,cAA3Eb,EAAR,EAAQA,kBAAmBO,EAA3B,EAA2BA,eAAgBJ,EAA3C,EAA2CA,kBAAmBK,EAA9D,EAA8DA,iBAC9D,EAAsBtL,qBAAWC,iBAAzBtJ,EAAR,EAAQA,EAAGoJ,EAAX,EAAWA,OACX,EAA4C9J,mBAAS,MAArD,mBAAOgiB,EAAP,KAAuBC,EAAvB,KACA,EAAoCjiB,mBAAS,IAA7C,mBAAO0iB,EAAP,KAAmBC,EAAnB,KAEAtN,EAAiBmN,EAAU9K,KAAK3S,KAAI,SAAA5D,GAAC,OAAIA,EAAE0C,KAAKlB,QAEhD,IAAMigB,EAAgB,SAAC,GAA0B,IAAxB1E,EAAuB,EAAvBA,OAAQta,EAAe,EAAfA,SAChB,WAAXsa,GACF9I,EAAexR,EAASC,KAAKlB,MAI3BkgB,EAAgB,iDAAG,WAAMnL,GAAN,+EACnBA,EAAKpX,MADc,uBAErBoe,IAAMpe,MAAMoX,EAAKpX,MAAM+X,SAEH,WAAhBX,EAAKwG,QACPlJ,EAAkB0C,EAAK9T,SAASC,KAAKlB,KALlB,0BASH,WAAhB+U,EAAKwG,QACPhQ,EAAK4U,QAAQ,CAAEC,QAAQ,IAVF,2CAAH,sDAahBC,EAAoBhkB,aAAc,SAAAH,GAAK,OAAIA,EAAMI,YAAYgkB,GAAG,SAGhExF,GAAUC,cAChB,GAA6BwF,cAArBC,GAAR,GAAQA,SAAUC,GAAlB,GAAkBA,OAClBpa,qBAAU,WACR,IAAMqa,EAAQ,IAAIC,gBAAgBF,IAC5BlF,EAASmF,EAAME,IAAI,UACnB9b,EAAU4b,EAAME,IAAI,OAExBtB,EADa,YAAX/D,GAAwBzW,EACR,CAChBgR,WAAYhR,EACZ3H,SAAU,kBAAM2d,GAAQ/Y,KAAKye,KAC7BzK,UAAW,kBAAM+E,GAAQ/Y,KAAKye,MAGd,QAEnB,CAACC,GAAQnB,EAAmBxE,GAAS0F,KAExC,IAAIxc,GAAU,KACR6c,GAAQhB,EAAU9K,MAAQ,GAEhC,GAAI8K,EAAUliB,MACZqG,GACE,cAAC,IAAD,CAAOF,KAAK,QAAQpE,QAAQ,OAA5B,SACE,gCAEGxB,YAAY2hB,EAAUliB,OAEvB,cAAC,IAAD,CAAQY,QAAS,kBAAMshB,EAAUM,QAAQ,CAAEC,QAAQ,KAAnD,SACE,sBAAMzhB,MAAO,CAAE3B,MAAO,UAAW8jB,eAAgB,aAAjD,SAAiE/iB,EAAE,8BAKtE,GAAI8iB,GAAMtgB,OAAS,GAAKsf,EAAUpiB,QAAS,CAChD,IAAMsjB,GAAa,CAAC,cAAe,YAAa,YAAa,aAEvDC,GAAe,SAAAta,GACnB,GAAoB,aAAhBA,EAAK2B,OAEP,OAAO,IAAI4Y,KAAK,QAAQC,UAE1B,GAAoB,YAAhBxa,EAAK2B,OAAsB,CAE7B,GAAI3B,EAAKya,YACP,OAAOza,EAAKya,YAAYC,QAE1B,GAAI1a,EAAK2a,UACP,OAAO3a,EAAK2a,UAAUH,UAI1B,OAAO,GAELzJ,GAAOoJ,GACRze,KAAI,SAAAf,GAQH,OAPA0f,GAAWtf,SAAQ,SAAA6f,GACjB,GAAIjgB,EAAEigB,GAAI,CACR,IAAMC,EAAO,IAAIN,KAAK5f,EAAEigB,IACxBjgB,EAAEigB,GAAKC,MAIJlgB,KAERsF,MAAK,SAACC,EAAGC,GAER,IAAM2a,EAASR,GAAapa,GAG5B,OAFeoa,GAAana,GAEZ2a,KAGhBzB,IACFtI,GAAOA,GAAK3R,QAAO,SAAA1H,GAEjB,OADamX,yBAAenX,GAAG,IAAS,IAC5BqjB,oBAAoBnP,SAASyN,EAAW0B,yBAIxD,IAAMC,GAAmBC,yBAAe,kBAEpCD,GAAiB3B,aAAeA,GAClCC,EAAc0B,GAAiB3B,YAGjC,IAAM6B,GAAmB,CACvB,CACE9J,MAAO/Z,EAAE,eACTiD,KAAM,aACN6gB,QAAS,CACPC,qBADO,SACcC,GACnB,IAAM3jB,EAAIqZ,GAAKsK,GAETC,EAAMxE,+BAAqBpf,GAAGmC,OAAS,EAAI,aAAe,WAChE,OACE,eAAC,OAAD,CAAMwJ,GAAE,qBAAgB3L,EAAE8C,KAAKlB,IAAvB,YAA8BgiB,GAAO3iB,UAAU,wBAAvD,UACE,eAAC2f,EAAA,EAAD,CAAYjgB,UAAU,SAASW,QAAQ,QAAQL,UAAU,gBAAzD,UACE,cAAC,IAAD,CAAgB4B,SAAU7C,EAAGO,MAAO,CAAE6K,YAAa,KAClD+L,yBAAenX,MAElB,cAAC,KAAD,CAAcqW,KAAMrW,EAAEqW,KAAM9V,MAAO,CAAE6W,WAAY,WAM3D,CACEsC,MAAO/Z,EAAE,gBACTiD,KAAM,kBACNihB,MAAO,OACPJ,QAAS,CACPlb,MAAM,EACNmb,qBAFO,SAEcC,GACnB,IAAM3jB,EAAIqZ,GAAKsK,GACf,OAAO,cAACtD,EAAD,CAAmBxd,SAAU7C,EAAG6I,QAASA,OAItD,CACE6Q,MAAO/Z,EAAE,kBACTiD,KAAM,eACN6gB,QAAS,CACPC,qBADO,SACcC,GACnB,IAAM3jB,EAAIqZ,GAAKsK,GACf,OAAO,cAAC,IAAD,CAAiB9gB,SAAU7C,OAIxC,CACE0Z,MAAO/Z,EAAE,sBACTiD,KAAM,cACN6gB,QAAS,CACPC,qBADO,SACcC,GACnB,IAAM3jB,EAAIqZ,GAAKsK,GACf,OAAI3jB,EAAE8jB,YACG,cAAC,IAAD,CAAczf,MAAOrE,EAAE8jB,YAAYhB,UAAW/Z,OAAQA,IAG3D/I,EAAE+jB,UACG,cAAC,IAAD,CAAc1f,MAAOrE,EAAE+jB,UAAUjB,UAAW/Z,OAAQA,IAGtD,MAIb,CACE2Q,MAAO/Z,EAAE,iBACTiD,KAAM,qBACN6gB,QAAS,CACPC,qBADO,SACcC,GACnB,IAAM3jB,EAAIqZ,GAAKsK,GAGf,MAAiB,YAAb3jB,EAAEiK,QAAwBjK,EAAE+iB,YACvB,cAAC,IAAD,CAAc1e,MAAOrE,EAAE+iB,YAAYC,QAASja,OAAQA,IAGtD,MAIb,CACE2Q,MAAO/Z,EAAE,iBACTiD,KAAM,SACN9B,MAAO,IACP+iB,MAAO,SACPJ,QAAS,CACPC,qBADO,SACcC,GACnB,IAAM3jB,EAAIqZ,GAAKsK,GACf,OACE,cAAC,IAAD,CACE,UAAQ,kBACR,sBAAqB3jB,EAAE8C,KAAKlB,IAE5BqI,OAAQ6J,EAAkBI,SAASlU,EAAE8C,KAAKlB,KAAO,WAAa5B,EAAEiK,OAChErG,OAAQ5D,EAAE4D,QAFL5D,EAAE8C,KAAKlB,QAQtB,CACE8X,MAAO/Z,EAAE,kBACTiD,KAAM,GACN9B,MAAO,GACP2iB,QAAS,CACPlb,MAAM,EACNmb,qBAFO,SAEcC,GACnB,IAAM3jB,EAAIqZ,GAAKsK,GAEf,OACE,cAAC,IAAD,CAEE9gB,SAAU7C,EACVsB,QAAQ,OACRkb,QAASqF,EACTpF,WAAYqF,GAJP9hB,EAAE8C,KAAKlB,SAYlBoiB,GAAkB,GAEnB/B,IACH+B,GAAgBC,UAAY,SAAmB7jB,GAC7C,GAAIqhB,EAAUpiB,QACZ,OACE,cAAC,IAAD,CAAQ6kB,SAAS,SAAjB,SACE,cAAC,IAAD,MAIN,IAAcC,EAA2B/jB,EAAjCgkB,KAAiBC,EAAgBjkB,EAAhBikB,YAEnB1N,EAAO0C,GAAKiL,MAAMH,EAAYE,EAAaF,EAAY,EAAIE,GAEjE,OAAK1N,EAAKxU,OAKR,8BACGwU,EAAK3S,KAAI,SAAAhE,GACR,IAAM4jB,EAAMxE,+BAAqBpf,GAAGmC,OAAS,EAAI,aAAe,WAChE,OACE,eAACoiB,EAAA,EAAD,CACEtjB,UAAU,wBACV4K,QAAQ,OACRwO,eAAe,gBACfD,WAAW,SAJb,UAKE,cAAC,IAAD,CAAgBnZ,UAAU,mBAAmB4B,SAAU7C,EAAGmB,KAAM8gB,EAAoB,GAAK,KACzF,eAAC,OAAD,CAAMhhB,UAAU,oBAAoB0K,GAAE,qBAAgB3L,EAAE8C,KAAKlB,IAAvB,YAA8BgiB,GAApE,UACE,eAACW,EAAA,EAAD,CAAK1Y,QAAQ,OAAOwO,eAAe,gBAAgBD,WAAW,aAA9D,UACE,cAACwG,EAAA,EAAD,CAAYjgB,UAAU,SAASW,QAAQ,QAAQL,UAAU,iBAAzD,SACGkW,yBAAenX,GAAG,KAErB,cAAC,IAAD,CAEE6C,SAAU7C,EACVsB,QAAQ,OACRkb,QAASqF,EACTpF,WAAYqF,GAJP9hB,EAAE8C,KAAKlB,QAOhB,eAACgf,EAAA,EAAD,CAAYjgB,UAAU,QAAQM,UAAU,mBAAxC,UACE,eAACsjB,EAAA,EAAD,CAAK1Y,QAAQ,OAAOuO,WAAW,SAA/B,UACE,cAAC,IAAD,CAAiBvX,SAAU7C,IAC3B,cAACqgB,EAAD,CAAmBxd,SAAU7C,EAAG6I,QAASA,EAAStI,MAAO,CAAE6W,WAAY,GAAIC,SAAU,SAEvF,cAAC,IAAD,CACE,sBAAqBrX,EAAE8C,KAAKlB,IAE5BqI,OAAQjK,EAAEiK,OACVrG,OAAQ5D,EAAE4D,QAFL5D,EAAE8C,KAAKlB,mBAlCnB,cAAC,IAAD,UAAQjC,EAAE,oBAiDvBiG,GACE,cAAC4e,GAAD,UACE,cAAC,IAAD,CACEnlB,QAASoiB,EAAUpiB,QACnB4B,UAAU,gBACV1C,MAAOoB,EAAE,6BACToJ,OAAQA,EACR4N,KAAM0C,GACNoL,QAASjB,GACTkB,QAAQ,iBACRjB,QAAO,aACLkB,UAAU,EACVjd,QAAQ,EACRkd,OAAO,EACPC,kBAAmBllB,EAAE,iBACrBmlB,kBAAkB,EAClBC,UAAW,CACTniB,KAAM,SACNoiB,UAAW,QAEbC,eAAgB,SAAA7kB,GAAC,OAAIwhB,EAAcxhB,KAChCkjB,IAEL4B,WAAYlB,YAIQ,IAAjBvB,GAAMtgB,SACfyD,GACE,cAAC,IAAD,CAAOF,KAAK,UAAUpE,QAAQ,OAA9B,SACG3B,EAAE,gCAKT,OACE,qCACE,eAACwlB,GAAD,WACE,eAACvE,EAAA,EAAD,CAAYjgB,UAAU,KAAKW,QAAQ,KAAKL,UAAU,cAAcrC,MAAM,cAAtE,UACGe,EAAE,oBACH,cAAC,KAAD,CAAYmgB,WAAW,kBAAvB,SACE,cAACgB,GAAD,CACEC,SAAU,SAAAle,GACR6Z,GAAQ/Y,KAAR,qBAA2Bd,EAASC,KAAKlB,IAAzC,wBAKPgE,MAGFqb,GACC,cAAC,KAAD,CACEvJ,WAAYuJ,EAAevJ,WAC3B3Y,SAAUkiB,EAAeliB,SACzB4Y,UAAWsJ,EAAetJ,eAOpC,IAAM6M,GAAa/iB,UAAOyK,IAAV,qFAMViZ,GAAO1jB,UAAO2jB,KAAV","file":"static/js/12.4ef12167.chunk.js","sourcesContent":["import { useTheme } from '@mui/styles';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\nfunction useMobileWidth() {\n const theme = useTheme();\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('md'));\n const minWidth = isBreakpointsDownSm ? 300 : theme.breakpoints.values.sm;\n return { minWidth };\n}\n\nexport default useMobileWidth;\n","import { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport Dialog from '@mui/material/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogContentText from '@mui/material/DialogContentText';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport Alert from '@mui/lab/Alert';\nimport useTheme from '@mui/material/styles/useTheme';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\n\nimport { formatError } from '../libs/util';\nimport useMobileWidth from '../hooks/mobile-width';\n\nexport default function ConfirmDialog({\n title,\n description,\n showCancel,\n cancel,\n confirm,\n color,\n params: initialParams,\n onCancel,\n onConfirm,\n}) {\n const [params, setParams] = useState(initialParams);\n const [open, setOpen] = useState(true);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t: changeLocale } = useLocaleContext();\n const theme = useTheme();\n\n const onCallback = async cb => {\n if (typeof cb === 'function') {\n setLoading(true);\n try {\n await cb(params);\n setOpen(false);\n } catch (err) {\n setError(formatError(err));\n console.error(err);\n } finally {\n setLoading(false);\n }\n } else {\n setOpen(false);\n }\n };\n\n const t = typeof title === 'function' ? title() : title;\n const d = typeof description === 'function' ? description(params, setParams, setError) : description;\n\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('md'));\n\n const handleClick = e => {\n e.stopPropagation();\n };\n const { minWidth } = useMobileWidth();\n\n return (\n <StyledDialog onClick={handleClick} fullScreen={isBreakpointsDownSm} open={open} style={{ minWidth }}>\n <DialogTitle>{t}</DialogTitle>\n <DialogContent style={{ minWidth }}>\n <DialogContentText component=\"div\">{d}</DialogContentText>\n {!!error && (\n <Alert severity=\"error\" style={{ width: '100%', marginTop: 8 }}>\n {error}\n </Alert>\n )}\n </DialogContent>\n <DialogActions className=\"delete-actions\" style={{ padding: '8px 24px 24px' }}>\n {showCancel && (\n <Button\n onClick={e => {\n e.stopPropagation();\n onCallback(onCancel);\n }}\n color=\"inherit\"\n data-cy=\"cancel-confirm-dialog\"\n size=\"small\">\n {cancel || changeLocale('common.cancel')}\n </Button>\n )}\n <Button\n onClick={e => {\n e.stopPropagation();\n onCallback(onConfirm);\n }}\n color={color}\n size=\"small\"\n // eslint-disable-next-line no-underscore-dangle\n disabled={params.__disableConfirm || loading}\n variant=\"contained\"\n data-cy=\"submit-confirm-dialog\"\n autoFocus>\n {loading && <Spinner size={[16, 10]} />}\n {confirm}\n </Button>\n </DialogActions>\n </StyledDialog>\n );\n}\n\nConfirmDialog.propTypes = {\n title: PropTypes.any.isRequired,\n description: PropTypes.any.isRequired, // can be a function that renders different content based on params\n showCancel: PropTypes.bool,\n cancel: PropTypes.string,\n color: PropTypes.string,\n confirm: PropTypes.string,\n params: PropTypes.object, // This object holds states managed in the dialog\n onCancel: PropTypes.func,\n onConfirm: PropTypes.func.isRequired,\n};\n\nConfirmDialog.defaultProps = {\n onCancel: () => {},\n showCancel: true,\n cancel: '',\n confirm: 'Confirm',\n color: 'error',\n params: {},\n};\n\nconst StyledDialog = styled(Dialog)`\n .delete-actions .Mui-disabled {\n color: rgba(0, 0, 0, 0.26) !important;\n box-shadow: none;\n background-color: rgba(0, 0, 0, 0.12) !important;\n }\n`;\n","import cloneDeep from 'lodash/cloneDeep';\nimport pickBy from 'lodash/pickBy';\nimport JSZip from 'jszip';\nimport yaml from 'js-yaml';\nimport saveAs from 'file-saver';\nimport joinURL from 'url-join';\n\nimport toBlockletDid from '@blocklet/meta/lib/did';\n\nimport { toDataURL } from '@arcblock/did-motif';\n\nconst base64ToArrayBuffer = base64 => {\n const bufStr = window.atob(base64);\n const bytes = new Uint8Array(bufStr.length);\n for (let i = 0; i < bufStr.length; i++) {\n bytes[i] = bufStr.charCodeAt(i);\n }\n return bytes;\n};\n\nconst getLogo = did => {\n const url = toDataURL(did, { size: 200 });\n const base64 = url.replace(/^[^,]*,/, '');\n return base64ToArrayBuffer(base64);\n};\n\nexport function getNameByTitle(title) {\n return title\n .replace(/[\\s/@_]/g, '-')\n .replace(/[^a-zA-Z0-9_-]/g, '')\n .replace(/(^[-\\s]+)|([-\\s]+$)/g, '')\n .toLowerCase();\n}\n\nexport function genExportedMeta(name, blocklet) {\n const meta = pickBy(cloneDeep(blocklet.meta), x => x !== null);\n\n meta.name = name;\n meta.did = toBlockletDid(name);\n meta.logo = 'logo.png';\n\n meta.interfaces.forEach(x => {\n // filter null or undefined\n if (!x.services) {\n delete x.services;\n }\n });\n\n blocklet.children.forEach(child => {\n if (child.dynamic && child.bundleSource) {\n meta.children.push({\n name: child.meta.name,\n source: child.bundleSource,\n title: child.meta.title,\n mountPoint: child.mountPoint,\n });\n }\n });\n\n meta.environments = (blocklet.configs || []).map(x => ({\n name: x.key,\n description: 'Automatically generated when exporting',\n required: !!x.required,\n secure: !!x.secure,\n default: x.secure ? '' : x.value || '',\n }));\n\n meta.capabilities.component = false;\n\n return meta;\n}\n\nconst license = holder => `Copyright © 2022 ${holder || ''}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.`;\n\nconst Gitignore = `.DS_Store\n.blocklet`;\n\nconst GithubAction = `name: Deploy\n\non:\n push:\n branches:\n - main\n\njobs:\n Deploy:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout repo\n uses: actions/checkout@v2\n\n - name: Blocklet workflow\n uses: blocklet/action-workflow@v1\n with:\n skip-upload: true\n skip-deploy: true\n bundle-command: blocklet bundle --create-release\n github-token: \\${{ secrets.GITHUB_TOKEN }}`;\n\nexport async function downloadExportedSource(meta, { holder } = {}) {\n const folderName = `${meta.name.split('/').pop()}`;\n const readme = `# ${meta.title}\\n\\n## Introduction\\n\\n${meta.description}`;\n\n const zip = new JSZip();\n const folder = zip.folder(folderName);\n folder.file('blocklet.yml', yaml.dump(meta));\n folder.file('blocklet.md', readme);\n folder.file('README.md', readme);\n folder.file('logo.png', getLogo(meta.did));\n folder.file('LICENSE', license(holder));\n folder.file('.gitignore', Gitignore);\n folder.folder('screenshots').file('.gitkeep', '');\n folder.folder('.github').folder('workflows').file('main.yml', GithubAction);\n await new Promise((resolve, reject) => {\n zip\n .generateAsync({ type: 'blob' })\n .then(content => {\n saveAs(content, `${folderName}.zip`);\n resolve();\n })\n .catch(err => {\n reject(err);\n });\n });\n}\nexport const getLaunchURL = (meta, info, encodeURI = false) => {\n const adminPath = process.env.NODE_ENV === 'production' ? info.routing.adminPath : '';\n const serverUrl = encodeURI\n ? encodeURIComponent(joinURL(window.location.origin, adminPath))\n : joinURL(window.location.origin, adminPath);\n const metaUrl = joinURL(info?.blockletRegistry, `/api/blocklets/${meta.did}/blocklet.json`);\n return { serverUrl, metaUrl };\n};\nexport const getLaunchAgreementUrl = (meta, info) => {\n const { metaUrl, serverUrl } = getLaunchURL(meta, info);\n\n const url = new URL(joinURL(serverUrl, '/launch-blocklet/agreement'));\n url.searchParams.set('blocklet_meta_url', metaUrl);\n url.searchParams.set('from', window.location.href);\n return url.href;\n};\n","import PropTypes from 'prop-types';\nimport Tag from '@arcblock/ux/lib/Tag';\n\nexport default function Wrapped({ children, style, ...rest }) {\n return (\n <Tag style={style} {...rest}>\n {children}\n </Tag>\n );\n}\n\nWrapped.propTypes = {\n children: PropTypes.any.isRequired,\n style: PropTypes.object,\n};\n\nWrapped.defaultProps = {\n style: {},\n};\n","import { useState, useEffect, useMemo, useContext, useRef } from 'react';\n// import useAsync from 'react-use/lib/useAsync';\nimport joinURL from 'url-join';\nimport { WELLKNOWN_PING_PREFIX } from '@abtnode/constant';\nimport { getAccessUrl } from '@abtnode/ux/src/util';\nimport { evaluateURLs } from '@abtnode/util/lib/url-evaluation';\nimport checkAccessible from '@abtnode/util/lib/url-evaluation/check-accessible-browser';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useRoutingContext, getBlockletUrls } from '../contexts/routing';\nimport { getBlockletUrlParams } from '../libs/util';\n\nconst CACHE = {};\n\nexport function useUrlEvaluation(urls, disableCache = false) {\n // 基于 CACHE 初始化该 hook 的状态\n // FIXME: 最好解决源头的 material-table 渲染 BlockletInterface 时的 re-mount 问题 (#4897)\n const initialCachedRef = useRef(urls.filter(url => CACHE[url]).map(url => CACHE[url]));\n const allCached = initialCachedRef.current.length === urls.length;\n const [urlsState, setUrlsState] = useState(allCached ? initialCachedRef.current : []);\n const [loading, setLoading] = useState(!allCached);\n const recommendedUrlState = useMemo(() => {\n if (!loading && urlsState.length) {\n return urlsState[0];\n }\n return null;\n }, [urlsState, loading]);\n\n useEffect(() => {\n if (urls?.length > 0 && !allCached) {\n const evaluate = async () => {\n let results;\n setLoading(true);\n if (disableCache) {\n results = await evaluateURLs(urls, { checkAccessible });\n results.forEach(item => {\n CACHE[item.url] = item;\n });\n } else {\n const misses = await evaluateURLs(\n urls.filter(url => !CACHE[url]),\n { checkAccessible }\n );\n misses.forEach(item => {\n CACHE[item.url] = item;\n });\n results = urls.map(url => CACHE[url]).sort((a, b) => b.score - a.score);\n }\n setUrlsState(results);\n setLoading(false);\n };\n evaluate();\n }\n }, [urls, disableCache, allCached]);\n\n return {\n urlsState,\n loading,\n recommendedUrlState,\n recommendedUrl: recommendedUrlState?.url,\n };\n}\n\n/**\n * 主要对 blocklet 访问 urls 进行评估\n * @param {object} blocklet\n */\nexport function useBlockletUrlEvaluation(blocklet) {\n const { siteMap } = useRoutingContext();\n const { locale } = useContext(LocaleContext);\n const urls = useMemo(() => {\n if (!blocklet) {\n return [];\n }\n return getBlockletUrls({ did: blocklet.meta.did, siteMap, params: getBlockletUrlParams(blocklet, locale) });\n }, [blocklet, locale, siteMap]);\n const { loading, recommendedUrlState, recommendedUrl } = useUrlEvaluation(urls);\n return { urls, loading, recommendedUrlState, recommendedUrl };\n}\n\n/**\n * 主要对 blocklet domains 对应的 urls 进行评估, 配合 DomainStatusProvider 使用\n * @param {string[]} domains\n */\nexport function useDomainsAccessibility(domains) {\n // domain 对应的访问 url\n const urls = useMemo(\n () => domains.map(item => joinURL(new URL(getAccessUrl(item)).origin, WELLKNOWN_PING_PREFIX)),\n [domains]\n );\n // url -> domain mapping\n const urlDomainMapping = useMemo(\n () => domains.reduce((acc, cur, i) => ({ ...acc, [urls[i]]: cur }), {}),\n [domains, urls]\n );\n const { urlsState, loading, recommendedUrl } = useUrlEvaluation(urls);\n // domain <=> url state\n const result = useMemo(() => {\n if (loading) {\n return {\n domainsAccessibility: domains.reduce((acc, cur) => ({ ...acc, [cur]: { loading: true } }), {}),\n recommendedDomain: null,\n };\n }\n const domainsAccessibility = urlsState.reduce((acc, cur) => {\n const domain = urlDomainMapping[cur.url];\n acc[domain] = { ...cur, domain };\n return acc;\n }, {});\n return {\n domainsAccessibility,\n recommendedDomain: urlDomainMapping[recommendedUrl],\n };\n }, [domains, urlDomainMapping, urlsState, loading, recommendedUrl]);\n return result;\n}\n","import { useContext } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Tooltip from '@mui/material/Tooltip';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport Dot from '../dot';\nimport Tag from '../tag';\nimport { isInProgress } from '../../libs/util';\n\nconst colors = {\n yellow: '#FFCF71',\n grey: '#888888',\n};\n\nexport default function BlockletStatus({ status, variant, source, ...rest }) {\n const { t } = useContext(LocaleContext);\n\n const map = {\n added: 'primary',\n waiting: 'warning',\n downloading: 'warning',\n downloaded: 'primary',\n installing: 'warning',\n installed: 'primary',\n starting: 'warning',\n running: 'success',\n stopping: 'warning',\n stopped: 'reverse',\n error: 'error',\n upgrading: 'warning',\n restarting: 'warning',\n corrupted: 'error',\n deleting: 'warning',\n };\n\n const colorMap = {\n added: colors.grey,\n waiting: colors.yellow,\n downloading: colors.yellow,\n downloaded: colors.grey,\n installing: colors.yellow,\n installed: colors.grey,\n starting: colors.yellow,\n running: 'success',\n stopping: colors.yellow,\n stopped: colors.grey,\n error: 'error',\n upgrading: colors.yellow,\n restarting: colors.yellow,\n corrupted: 'error',\n deleting: colors.yellow,\n };\n\n const inProgress = isInProgress(status);\n\n const statusTxt = t(`blocklet.status.${source === 'custom' && status === 'installed' ? 'created' : status}`);\n\n if (variant === 'dot') {\n return (\n <Tooltip title={t('blocklet.statusTip', { status: statusTxt })}>\n <Dot color={colorMap[status]} {...rest} />\n </Tooltip>\n );\n }\n\n return (\n <Tag type={map[status]} {...rest}>\n {inProgress && <Spinner size={[12, 6]} color=\"inherit\" style={{ marginRight: 5 }} />}\n {statusTxt}\n </Tag>\n );\n}\n\nBlockletStatus.propTypes = {\n status: PropTypes.string.isRequired,\n variant: PropTypes.oneOf(['dot', 'tag']),\n source: PropTypes.string,\n};\n\nBlockletStatus.defaultProps = {\n variant: 'tag',\n source: '',\n};\n","import PropTypes from 'prop-types';\nimport Box from '@mui/material/Box';\nimport { Link } from 'react-router-dom';\nimport ExternalLink from '@mui/material/Link';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport DidAvatar from '@arcblock/did-connect/lib/Avatar';\n\nfunction WrappedDidAddress({ did, href, external, avatarProps, ...rest }) {\n // eslint-disable-next-line react/no-unstable-nested-components\n function Content() {\n if (href) {\n if (external) {\n return (\n <ExternalLink target=\"_blank\" href={href} underline=\"hover\">\n {did}\n </ExternalLink>\n );\n }\n\n return <Link to={href}>{did}</Link>;\n }\n\n return did;\n }\n\n return (\n <DidAddress\n prepend={\n <Box component=\"span\" display=\"flex\" mr={1}>\n <DidAvatar did={did} size={18} {...avatarProps} />\n </Box>\n }\n {...rest}>\n <Content />\n </DidAddress>\n );\n}\n\nWrappedDidAddress.propTypes = {\n did: PropTypes.string.isRequired,\n to: PropTypes.string,\n href: PropTypes.string,\n avatarProps: PropTypes.object,\n external: PropTypes.bool,\n};\n\nWrappedDidAddress.defaultProps = {\n to: '',\n href: '',\n avatarProps: {},\n external: false,\n};\n\nexport default WrappedDidAddress;\n","import styled from 'styled-components';\n\nconst color = {\n success: '#3ab39d',\n error: '#D0021B',\n};\n\nconst defaultSize = '10px';\n\nconst Dot = styled.div`\n display: inline-block;\n width: ${props => props.size || defaultSize};\n height: ${props => props.size || defaultSize};\n background: ${props => color[props.color] || props.color || color.success};\n border-radius: 100%;\n`;\n\nexport default Dot;\n","const { types } = require('@ocap/mcrypto');\nconst { toHex } = require('@ocap/util');\nconst { fromPublicKey } = require('@arcblock/did');\n\nconst toBlockletDid = (name) => {\n const pk = toHex(Buffer.from(typeof name === 'string' ? name.trim() : name));\n return fromPublicKey(pk, { role: types.RoleType.ROLE_ANY });\n};\n\nmodule.exports = toBlockletDid;\n","import PropTypes from 'prop-types';\nimport joinURL from 'url-join';\n\nimport Avatar from '@mui/material/Avatar';\nimport DiDAvatar from '@arcblock/did-connect/lib/Avatar';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { formatRegistryLogoPath } from '../../libs/util';\n\nconst getDeployedFrom = (blocklet, node) => {\n let { deployedFrom } = blocklet || {};\n if (!deployedFrom && blocklet.source === 'registry') {\n deployedFrom = node.info.blockletRegistry;\n }\n return deployedFrom;\n};\n\nexport default function BlockletAvatar({ blocklet, style, size, ancestors, ...rest }) {\n const node = useNodeContext();\n let logoUrl = joinURL(node.prefix, 'blocklet.png');\n const { variant } = rest;\n\n const deployedFrom = getDeployedFrom(blocklet, node);\n\n if (blocklet.source === 'registry' && blocklet.meta.logo) {\n logoUrl = joinURL(deployedFrom, formatRegistryLogoPath(blocklet.meta.bundleDid, blocklet.meta.logo));\n } else {\n const prefix = window.env.apiPrefix || '/';\n logoUrl = joinURL(prefix, `/blocklet/logo${ancestors.map(x => `/${x.meta.did}`).join('')}/${blocklet.meta.did}`);\n }\n\n const setFallBackUrl = ev => {\n ev.target.src = `${node.prefix}/blocklet.png`;\n };\n\n let imgEle = <img src={logoUrl} onError={setFallBackUrl} alt={blocklet.meta.name} style={{ width: size }} />;\n\n if (!blocklet.meta.logo) {\n imgEle = <DiDAvatar did={blocklet.meta.did || ''} responsive />;\n }\n\n return (\n <Avatar\n variant={variant || 'square'}\n style={Object.assign({ backgroundColor: 'transparent', width: size, height: size, borderRadius: 10 }, style)}\n {...rest}>\n {imgEle}\n </Avatar>\n );\n}\n\nBlockletAvatar.propTypes = {\n blocklet: PropTypes.object.isRequired,\n style: PropTypes.object,\n size: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n ancestors: PropTypes.array,\n};\n\nBlockletAvatar.defaultProps = {\n style: {},\n size: 40,\n ancestors: [],\n};\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = SplitButton;\n\nvar _react = require(\"react\");\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _styledComponents = _interopRequireDefault(require(\"styled-components\"));\n\nvar _ExpandMore = _interopRequireDefault(require(\"@mui/icons-material/ExpandMore\"));\n\nvar _Popper = _interopRequireDefault(require(\"@mui/material/Popper\"));\n\nvar _Paper = _interopRequireDefault(require(\"@mui/material/Paper\"));\n\nvar _ClickAwayListener = _interopRequireDefault(require(\"@mui/material/ClickAwayListener\"));\n\nvar _MenuList = _interopRequireDefault(require(\"@mui/material/MenuList\"));\n\nvar _MenuItem = _interopRequireDefault(require(\"@mui/material/MenuItem\"));\n\nvar _ButtonGroup = _interopRequireDefault(require(\"@mui/material/ButtonGroup\"));\n\nvar _Button = _interopRequireDefault(require(\"../Button\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nconst _excluded = [\"size\", \"color\", \"menu\", \"children\", \"variant\", \"onClick\", \"menuButtonProps\"];\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); 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 = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction SplitButton(_ref) {\n let {\n size,\n color,\n menu,\n children,\n variant,\n onClick,\n menuButtonProps\n } = _ref,\n rest = _objectWithoutProperties(_ref, _excluded);\n\n const [open, setOpen] = (0, _react.useState)(false);\n const anchorRef = (0, _react.useRef)(null);\n\n const onToggle = () => {\n setOpen(prevOpen => !prevOpen);\n };\n\n const handleClose = e => {\n if (anchorRef.current && anchorRef.current.contains(e.target)) {\n return;\n }\n\n setOpen(false);\n }; // 点击 item 后收起下拉菜单, 如果想要点击 action 后不收起下拉菜单, 可以在 item#onClick 时调用 e.stopPropagation()\n\n\n const handleItemClick = e => {\n if (e.target.classList.contains('MuiMenuItem-root')) {\n setOpen(false);\n }\n };\n\n return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {\n children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(StyledButtonGroup, _objectSpread(_objectSpread({\n variant: variant,\n size: size,\n color: color,\n ref: anchorRef\n }, rest), {}, {\n children: [typeof children === 'function' ? children() : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {\n onClick: onClick,\n color: color,\n children: children\n }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, _objectSpread(_objectSpread({\n onClick: onToggle,\n color: color\n }, menuButtonProps), {}, {\n \"aria-label\": \"more functions\",\n children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ExpandMore.default, {})\n }))]\n })), /*#__PURE__*/(0, _jsxRuntime.jsx)(StyledPopper, {\n open: open,\n anchorEl: anchorRef.current,\n placement: \"bottom-end\",\n disablePortal: false,\n children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Paper.default, {\n children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ClickAwayListener.default, {\n onClickAway: handleClose,\n children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuList.default, {\n onClick: handleItemClick,\n children: menu\n })\n })\n })\n })]\n });\n}\n\nSplitButton.propTypes = {\n size: _propTypes.default.oneOf(['small', 'medium', 'large']),\n color: _propTypes.default.oneOf(['primary', 'secondary', 'inherit']),\n menu: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.array]),\n // 也可以是用于渲染主按钮的 function\n children: _propTypes.default.any,\n variant: _propTypes.default.oneOf(['outlined', 'contained']),\n onClick: _propTypes.default.func,\n menuButtonProps: _propTypes.default.object\n};\nSplitButton.defaultProps = {\n size: 'medium',\n color: 'primary',\n menu: [],\n children: null,\n variant: 'contained',\n onClick: () => {},\n menuButtonProps: {}\n};\nSplitButton.Item = _MenuItem.default;\nconst StyledButtonGroup = (0, _styledComponents.default)(_ButtonGroup.default).withConfig({\n displayName: \"SplitButton__StyledButtonGroup\",\n componentId: \"sc-1meco5z-0\"\n})([\"> .MuiButtonBase-root:last-child{min-width:2em;padding-left:0;padding-right:0;}\"]);\nconst StyledPopper = (0, _styledComponents.default)(_Popper.default).withConfig({\n displayName: \"SplitButton__StyledPopper\",\n componentId: \"sc-1meco5z-1\"\n})([\".MuiList-root{padding:4px 0;}.MuiListItem-root{padding-top:4px;padding-bottom:4px;}\"]);","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","import Remove from '@mui/icons-material/Delete';\nimport Start from '@mui/icons-material/PlayArrow';\nimport Stop from '@mui/icons-material/Stop';\nimport Restart from '@mui/icons-material/Replay';\nimport Reload from '@mui/icons-material/Autorenew';\nimport Config from '@mui/icons-material/Settings';\nimport Log from '@mui/icons-material/Receipt';\nimport Group from '@mui/icons-material/Group';\n\nexport default {\n Start,\n Stop,\n Restart,\n Reload,\n Remove,\n Config,\n Log,\n Group,\n};\n","import { createContext, useState, useContext, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport xorWith from 'lodash/xorWith';\n\nconst DeletingBlockletContext = createContext({});\n\nfunction DeletingBlockletProvider({ children, type }) {\n const [deletingBlocklets, setDeletingBlocklets] = useState([]);\n const deletingBlockletsDid = useRef([]); // use in onActionComplete\n\n /**\n * 添加删除中的 blocklet did\n * @param {String} did 删除中的did\n */\n const addDeletingDid = did => {\n if (!deletingBlockletsDid.current.includes(did)) {\n const reDeleteings = [...deletingBlockletsDid.current, did];\n setDeletingBlocklets(reDeleteings);\n deletingBlockletsDid.current = reDeleteings;\n }\n };\n\n /**\n * 去除删除中的 blocklet did\n * @param {String} did 删除中的did\n */\n const removeDeletingDid = did => {\n if (deletingBlockletsDid.current.includes(did)) {\n const reDeleteings = deletingBlockletsDid.current.filter(d => {\n return d !== did;\n });\n setDeletingBlocklets(reDeleteings);\n deletingBlockletsDid.current = reDeleteings;\n }\n };\n\n /**\n * 将不在的 blocklet id 移出 deleting 数组\n * @param {Array} existDids 已存在的 blocklet did 数组集\n */\n const matchDeletingDid = existDids => {\n const inDeleting = deletingBlocklets.filter(did => existDids.find(e => e === did));\n const needMoveoutDeleting = xorWith(inDeleting, deletingBlocklets);\n needMoveoutDeleting.forEach(did => removeDeletingDid(did));\n };\n\n return (\n <DeletingBlockletContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n type,\n deletingBlocklets,\n addDeletingDid,\n removeDeletingDid,\n matchDeletingDid,\n }}>\n {children}\n </DeletingBlockletContext.Provider>\n );\n}\n\nDeletingBlockletProvider.propTypes = {\n type: PropTypes.string,\n children: PropTypes.node.isRequired,\n};\n\nDeletingBlockletProvider.defaultProps = {\n type: 'blocklets',\n};\n\nfunction useDeletingBlockletContext() {\n return useContext(DeletingBlockletContext);\n}\n\nexport { DeletingBlockletProvider, useDeletingBlockletContext };\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\"\n}), 'Replay');\n\nexports.default = _default;","import { useContext, useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport semver from 'semver';\nimport { useSnackbar } from 'notistack';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Button from '@mui/material/IconButton';\nimport UpgradeIcon from '@mui/icons-material/ArrowUpward';\nimport Tooltip from '@mui/material/Tooltip';\nimport Toast from '@arcblock/ux/lib/Toast';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { BLOCKLET_MODES } from '@blocklet/meta/lib/constants';\n\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport Confirm from '../confirm';\nimport Tag from '../tag';\nimport { withPermission } from '../permission';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { sleep, formatError, isInProgress } from '../../libs/util';\n\nfunction BlockletVersion({ blocklet, checkUpgrade, hasPermission, ...rest }) {\n const { info, api } = useNodeContext();\n const { t } = useContext(LocaleContext);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [newVersionBlocklet, setNewVersionBlocklet] = useState(null);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { enqueueSnackbar } = useSnackbar();\n\n useEffect(() => {\n setNewVersionBlocklet(null);\n if (checkUpgrade && blocklet.mode !== BLOCKLET_MODES.DEVELOPMENT) {\n api\n .getLatestBlockletVersion({ input: { did: blocklet.meta.did, version: blocklet.meta.version } })\n .then(({ data }) => {\n if (data) {\n const { version, registryUrl } = data;\n if (version && semver.gt(version, blocklet.meta.version)) {\n setNewVersionBlocklet({ version, registryUrl });\n }\n }\n })\n // eslint-disable-next-line max-len\n .catch(err => console.error(`Failed to fetch latest version: ${blocklet.meta.name}, error: ${formatError(err)}`)); // prettier-ignore\n }\n }, [blocklet, info.blockletRegistry, checkUpgrade]); // eslint-disable-line\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const onConfirm = async () => {\n setLoading(true);\n\n try {\n const input = {\n did: blocklet.meta.did,\n version: newVersionBlocklet.version,\n registryUrl: newVersionBlocklet.registryUrl || '',\n };\n await sleep(2000);\n await api.upgradeBlocklet({ input });\n } catch (err) {\n enqueueSnackbar(`Blocklet upgrade failed: ${formatError(err)}`, { autoHideDuration: 5000, variant: 'error' });\n } finally {\n setLoading(false);\n setConfirmSetting(null);\n }\n };\n\n const setting = {\n title: `${t('common.upgrade')} ${t('common.blocklet')} ${getDisplayName(blocklet)}`,\n description: t('blocklet.action.upgradeDescription'),\n confirm: t('blocklet.action.confirmUpgrade'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n };\n\n if (hasPermission && newVersionBlocklet && !isInProgress(blocklet.status)) {\n return (\n <>\n <Tag {...rest}>{blocklet.meta.version}</Tag>\n <Tooltip title={t('common.updateAvailable', { version: newVersionBlocklet.version })}>\n <Button size=\"small\" style={{ marginLeft: 8 }} disabled={loading} onClick={() => setConfirmSetting(setting)}>\n {loading ? <Spinner size={[16, 10]} /> : <UpgradeIcon style={{ fontSize: 16, color: 'red' }} />}\n </Button>\n </Tooltip>\n {!!error && <Toast variant=\"error\" message={error} onClose={() => setError('')} />}\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </>\n );\n }\n\n return <Tag {...rest}>{blocklet.meta.version}</Tag>;\n}\n\nBlockletVersion.propTypes = {\n blocklet: PropTypes.object.isRequired,\n checkUpgrade: PropTypes.bool,\n hasPermission: PropTypes.bool,\n};\n\nBlockletVersion.defaultProps = {\n checkUpgrade: true,\n hasPermission: false,\n};\n\nexport default withPermission(BlockletVersion, 'mutate_blocklet');\n","import { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport semver from 'semver';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogContentText from '@mui/material/DialogContentText';\nimport Typography from '@mui/material/Typography';\nimport TextField from '@mui/material/TextField';\nimport Stepper from '@mui/material/Stepper';\nimport Step from '@mui/material/Step';\nimport StepLabel from '@mui/material/StepLabel';\n\nimport InfoRow from '@arcblock/ux/lib/InfoRow';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport Tag from '@arcblock/ux/lib/Tag';\n\nimport { getDisplayName } from '@blocklet/meta/lib/util';\n\nimport DidAddress from '../did-address';\nimport { useNodeContext } from '../../contexts/node';\nimport { formatError, formatPerson } from '../../libs/util';\n\nexport default function InstallFromUrl({ defaultUrl, onCancel, onSuccess, onError, mode, handleText }) {\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t } = useLocaleContext();\n\n const [url, setUrl] = useState(defaultUrl);\n const [activeStep, setActiveStep] = useState(defaultUrl ? 1 : 0);\n\n const [meta, setMeta] = useState({ dist: {} });\n const [existingMeta, setExistingMeta] = useState(null);\n\n const [params, setParams] = useState({});\n\n const isComponentMode = mode === 'component';\n // if mode is component , we need to always show the step, that means the user can return to the previous step\n const alwayShowSteps = isComponentMode ? true : !defaultUrl;\n\n const onGetMeta = async () => {\n setError(null);\n setLoading(true);\n\n try {\n const decoded = decodeURIComponent(url.trim());\n // validate\n try {\n new URL(decoded); // eslint-disable-line no-new\n } catch {\n throw new Error('Invalid URL');\n }\n\n // request\n const { meta: newer, inStore, registryUrl } = await api.getBlockletMetaFromUrl({ input: { url: decoded } });\n\n // if mode is component, never check existing blocklet\n if (isComponentMode) {\n setMeta(newer);\n } else {\n const { blocklet: existedBlocklet } = await api.getBlocklet({\n input: { did: newer.did, attachRuntimeInfo: false },\n });\n\n if (existedBlocklet && semver.gte(existedBlocklet.meta.version, newer.version)) {\n setExistingMeta(existedBlocklet.meta);\n setMeta(newer);\n } else {\n setMeta(newer);\n }\n }\n\n setParams({\n inStore,\n registryUrl,\n inputUrl: url.trim(),\n });\n } catch (err) {\n console.error(err);\n const errMsg = `Blocklet Install failed: ${formatError(err)}`;\n setError(errMsg);\n onError(err);\n } finally {\n setLoading(false);\n }\n };\n\n const onConfirm = async () => {\n if (isComponentMode) {\n onSuccess({\n meta,\n ...params,\n });\n } else {\n await onInstall();\n }\n onCancel();\n };\n\n const onInstall = async () => {\n setLoading(true);\n try {\n await api.installBlocklet({ input: { url: decodeURIComponent(url.trim()) } });\n onSuccess({\n meta,\n ...params,\n });\n } catch (err) {\n const errMsg = `Blocklet Install failed: ${formatError(err)}`;\n setError(errMsg);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n if (defaultUrl) {\n onGetMeta();\n }\n }, [defaultUrl]); // eslint-disable-line\n\n const rows = [\n { name: t('common.name'), value: getDisplayName({ meta }, true) },\n { name: t('common.version'), value: meta.version },\n { name: t('common.did'), value: <DidAddress did={meta.did} /> },\n { name: t('common.author'), value: formatPerson(meta.author) },\n { name: t('blocklet.dist.downloadLink'), value: meta.dist.tarball },\n ];\n\n const getStep1Body = () => {\n if (loading) {\n return (\n <div\n style={{\n height: 200,\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n }}>\n <Spinner />\n </div>\n );\n }\n if (meta.did) {\n return (\n <div style={{ paddingLeft: '10%' }}>\n {rows.map(row => {\n if (row.name === t('common.did')) {\n return (\n <InfoRow\n valueComponent=\"div\"\n key={row.name}\n nameWidth={120}\n name={row.name}\n nameFormatter={() => t('common.did')}>\n {row.value}\n </InfoRow>\n );\n }\n return (\n <InfoRow valueComponent=\"div\" key={row.name} nameWidth={120} name={row.name}>\n {row.value}\n </InfoRow>\n );\n })}\n {existingMeta && (\n <Alert type=\"error\" variant=\"icon\" style={{ margin: '15px 0 0 -16px' }}>\n <div>\n {t('blocklet.fromUrl.existTipPrefix')}\n <Tag content={existingMeta.version} style={{ margin: '0 5px' }} />\n {t('blocklet.fromUrl.existTipSuffix')}\n </div>\n </Alert>\n )}\n </div>\n );\n }\n return null;\n };\n\n const steps = [\n {\n label: t('blocklet.fromUrl.step0'),\n body: (\n <Typography component=\"div\">\n <TextField\n label={t('blocklet.fromUrl.label')}\n autoComplete=\"off\"\n variant=\"outlined\"\n name=\"url\"\n data-cy=\"blocklet-url-input\"\n fullWidth\n autoFocus\n style={{ marginBottom: 32 }}\n margin=\"dense\"\n helperText={t('blocklet.fromUrl.description')}\n value={url}\n onChange={e => {\n setError(null);\n setUrl(e.target.value);\n }}\n disabled={loading}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n onGetMeta();\n }\n }}\n />\n </Typography>\n ),\n cancel: t('common.cancel'),\n confirm: t('common.next'),\n onCancel,\n onConfirm: () => {\n onGetMeta();\n setActiveStep(1);\n },\n },\n {\n label: t('blocklet.fromUrl.step1'),\n body: getStep1Body(),\n cancel: alwayShowSteps ? t('common.pre') : t('common.cancel'),\n confirm: handleText?.confirm || (existingMeta ? t('common.confirm') : t('blocklet.fromUrl.confirm')),\n onCancel: () => {\n if (alwayShowSteps) {\n setActiveStep(s => s - 1);\n } else {\n onCancel();\n }\n },\n onConfirm: () => {\n if (existingMeta) {\n onCancel();\n } else {\n onConfirm();\n }\n },\n },\n ];\n const step = steps[activeStep];\n\n return (\n <Dialog\n title={handleText?.title || t('blocklet.fromUrl.title')}\n fullWidth\n maxWidth=\"md\"\n onClose={() => step.onCancel()}\n showCloseButton={activeStep === 0}\n disableEscapeKeyDown\n open\n actions={\n <>\n {step.cancel && (\n <Button\n onClick={e => {\n e.stopPropagation();\n step.onCancel();\n }}\n color=\"inherit\"\n size=\"small\">\n {step.cancel || t('common.cancel')}\n </Button>\n )}\n <Button\n onClick={e => {\n e.stopPropagation();\n step.onConfirm();\n }}\n color=\"primary\"\n size=\"small\"\n data-cy=\"install-blocklet-next-step\"\n disabled={loading || !url || error}\n variant=\"contained\"\n autoFocus\n style={{ marginLeft: 8 }}>\n {loading && activeStep === 0 && <Spinner size={[16, 10]} />}\n {step.confirm}\n </Button>\n </>\n }>\n {alwayShowSteps && (\n <Stepper alternativeLabel activeStep={activeStep}>\n {steps.map(({ label }) => (\n <Step key={label}>\n <StepLabel>{label}</StepLabel>\n </Step>\n ))}\n </Stepper>\n )}\n <DialogContentText\n component=\"div\"\n style={{\n marginTop: 24,\n }}>\n {step.body}\n </DialogContentText>\n {!!error && (\n <Alert type=\"error\" style={{ width: '100%', marginTop: 8 }}>\n {error}\n </Alert>\n )}\n </Dialog>\n );\n}\n\nInstallFromUrl.propTypes = {\n defaultUrl: PropTypes.string,\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n onError: PropTypes.func,\n mode: PropTypes.oneOf(['install', 'component']),\n handleText: PropTypes.object,\n};\n\nInstallFromUrl.defaultProps = {\n onError: () => {},\n defaultUrl: '',\n mode: 'install',\n handleText: {},\n};\n","var arrayFilter = require('./_arrayFilter'),\n baseRest = require('./_baseRest'),\n baseXor = require('./_baseXor'),\n isArrayLikeObject = require('./isArrayLikeObject'),\n last = require('./last');\n\n/**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\nvar xorWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n});\n\nmodule.exports = xorWith;\n","var baseDifference = require('./_baseDifference'),\n baseFlatten = require('./_baseFlatten'),\n baseUniq = require('./_baseUniq');\n\n/**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\nfunction baseXor(arrays, iteratee, comparator) {\n var length = arrays.length;\n if (length < 2) {\n return length ? baseUniq(arrays[0]) : [];\n }\n var index = -1,\n result = Array(length);\n\n while (++index < length) {\n var array = arrays[index],\n othIndex = -1;\n\n while (++othIndex < length) {\n if (othIndex != index) {\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n }\n }\n }\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n}\n\nmodule.exports = baseXor;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n arrayMap = require('./_arrayMap'),\n baseUnary = require('./_baseUnary'),\n cacheHas = require('./_cacheHas');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseDifference;\n","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","var isArrayLike = require('./isArrayLike'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n","/* eslint-disable react/no-unstable-nested-components */\n/* eslint-disable operator-linebreak */\nimport { useState, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { useHistory, Link } from 'react-router-dom';\nimport useLocalStorage from 'react-use/lib/useLocalStorage';\n\nimport IconButton from '@mui/material/IconButton';\nimport Menu from '@mui/material/Menu';\nimport Divider from '@mui/material/Divider';\nimport ButtonGroup from '@mui/material/ButtonGroup';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport MenuItem from '@mui/material/MenuItem';\nimport MoreVertIcon from '@mui/icons-material/MoreVert';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Typography from '@mui/material/Typography';\nimport Radio from '@mui/material/Radio';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Alert from '@mui/lab/Alert';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport {\n getAppMissingConfigs,\n isDeletableBlocklet,\n hasRunnableComponent,\n getDisplayName,\n} from '@blocklet/meta/lib/util';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Toast from '@abtnode/ux/lib/toast';\n\nimport { BLOCKLET_MODES, BlockletSource, fromBlockletSource } from '@blocklet/meta/lib/constants';\n\nimport { sleep, formatError, isInProgress, isDownloading } from '../../libs/util';\nimport { getLaunchURL } from './util';\nimport { useNodeContext } from '../../contexts/node';\nimport Confirm from '../confirm';\nimport Icons from './icons';\nimport Permission from '../permission';\nimport { useBlockletUrlEvaluation } from '../../hooks/url-evaluation';\n\nexport default function BlockletActions({ blocklet, onStart, onComplete, variant, ...rest }) {\n const history = useHistory();\n const node = useNodeContext();\n const [anchorEl, setAnchorEl] = useState(null);\n const [currentAction, setCurrentAction] = useState(null);\n const [loading, setLoading] = useState(false);\n const [confirmSetting, setConfirmSetting] = useState(null);\n const { t } = useContext(LocaleContext);\n const [skipSetup] = useLocalStorage('skip-blocklet-setup', false);\n const { loading: recommendedUrlLoading, recommendedUrl } = useBlockletUrlEvaluation(blocklet);\n\n const createHandler =\n (action, fn, requireUserConfirm = false) =>\n async () => {\n const onConfirm = async params => {\n onStart({ action, blocklet });\n setLoading(true);\n setCurrentAction(action);\n setConfirmSetting(null);\n let isRemoved = false;\n try {\n const input = { did: blocklet.meta.did };\n if (action === 'remove') {\n input.keepData = params.removeType === 'keepData';\n }\n if (action === 'start' && !skipSetup && !blocklet.settings?.initialized) {\n // 启动 blocklet 并跳转到 setup 流程界面时携带 serverUrl 查询参数\n const { serverUrl } = getLaunchURL(blocklet, node.info);\n const url = new URL(recommendedUrl);\n url.searchParams.set('serverUrl', serverUrl);\n window.open(url.href);\n onComplete({ action, blocklet });\n return;\n }\n await fn({ input });\n if (action === 'remove') {\n isRemoved = true; // Deleted send request and succeeded\n } else {\n await sleep(1000); // just avoid user feeling so fast\n }\n\n if (action === 'reload') {\n Toast.success(t('blocklet.reloadSuccess'));\n }\n\n onComplete({ action, blocklet });\n } catch (err) {\n const errMsg = `Blocklet ${action} failed: ${formatError(err)}`;\n onComplete({ action, blocklet, error: new Error(errMsg) });\n } finally {\n if (!isRemoved) {\n setLoading(false);\n }\n }\n };\n\n const onCancel = () => {\n setLoading(false);\n setConfirmSetting(null);\n };\n\n const name = getDisplayName(blocklet, true);\n\n const removeSetting =\n blocklet.source === fromBlockletSource(BlockletSource.custom)\n ? {\n description: () => (\n <Typography component=\"div\">\n <Typography gutterBottom>\n <b>{t('blocklet.action.forceRemoveDescription')}</b>\n </Typography>\n </Typography>\n ),\n params: { removeType: 'complete' },\n }\n : {\n description: (params, setParams) => (\n <Typography component=\"div\">\n <Typography gutterBottom>{t('blocklet.action.removeDescription')}</Typography>\n <RadioGroup\n name=\"removeType\"\n value={params.removeType}\n onChange={e => setParams({ ...params, removeType: e.target.value })}>\n <FormControlLabel\n value=\"keepData\"\n control={<Radio />}\n label={t('blocklet.action.removeKeepData')}\n />\n <FormControlLabel\n value=\"complete\"\n control={<Radio />}\n label={t('blocklet.action.removeComplete')}\n />\n </RadioGroup>\n </Typography>\n ),\n params: { removeType: 'keepData' },\n };\n\n const confirmSettings = {\n stop: {\n title: `${t('common.stop')} ${name}`,\n description: t('blocklet.action.stopDescription'),\n confirm: t('blocklet.action.confirmStop'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n },\n restart: {\n title: `${t('common.restart')} ${name}`,\n description: t('blocklet.action.restartDescription'),\n confirm: t('blocklet.action.confirmRestart'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n },\n remove: {\n title: `${t('common.remove')} ${name}`,\n confirm: t('blocklet.action.confirmRemove'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n ...removeSetting,\n },\n cancelDownload: {\n title: `${t('common.cancel')}`,\n description: t('blocklet.action.cancelDownloadDescription', { name }),\n confirm: t('common.confirm'),\n cancel: t('common.cancel'),\n onConfirm,\n onCancel,\n },\n };\n\n if (requireUserConfirm) {\n setConfirmSetting(confirmSettings[action]);\n } else {\n await onConfirm();\n }\n };\n\n const open = Boolean(anchorEl);\n\n const onOpen = e => {\n try {\n e.stopPropagation();\n e.preventDefault();\n // eslint-disable-next-line no-empty\n } catch {}\n setAnchorEl(e.currentTarget);\n };\n\n const onClose = e => {\n try {\n e.stopPropagation();\n e.preventDefault();\n // eslint-disable-next-line no-empty\n } catch {}\n setAnchorEl(null);\n };\n\n const onAction = async (action, e) => {\n try {\n e.stopPropagation();\n e.preventDefault();\n // eslint-disable-next-line no-empty\n } catch {}\n setAnchorEl(null);\n if (typeof action.handler === 'function') {\n try {\n setLoading(true);\n setCurrentAction(action.action);\n await action.handler();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`Blocklet ${action.name} failed: `, err);\n } finally {\n setLoading(false);\n }\n }\n };\n\n const removeAction = isDeletableBlocklet(blocklet)\n ? {\n action: 'remove',\n icon: Icons.Remove,\n name: t('common.remove'),\n handler: createHandler('remove', node.api.deleteBlocklet, true),\n disabled: blocklet.status === 'running',\n }\n : null;\n\n const cancelDownloadAction = {\n action: 'remove',\n icon: Icons.Remove,\n name: t('common.cancel'),\n handler: createHandler('cancelDownload', node.api.cancelDownloadBlocklet, true),\n };\n\n const missingRequiredConfigs = getAppMissingConfigs(blocklet);\n\n const actions = [\n {\n action: 'start',\n icon: Icons.Start,\n name: t('common.start'),\n handler: createHandler('start', node.api.startBlocklet),\n disabled:\n !hasRunnableComponent(blocklet) ||\n blocklet.status === 'running' ||\n blocklet.status === 'corrupted' ||\n missingRequiredConfigs.length > 0 ||\n isDownloading(blocklet.status) ||\n blocklet.mode === BLOCKLET_MODES.DEVELOPMENT ||\n recommendedUrlLoading,\n },\n {\n action: 'stop',\n icon: Icons.Stop,\n name: t('common.stop'),\n handler: createHandler('stop', node.api.stopBlocklet, true),\n disabled: blocklet.status !== 'running' || blocklet.mode === BLOCKLET_MODES.DEVELOPMENT,\n },\n {\n action: 'restart',\n icon: Icons.Restart,\n name: t('common.restart'),\n handler: createHandler('restart', node.api.restartBlocklet, true),\n disabled: blocklet.status !== 'running' || blocklet.mode === BLOCKLET_MODES.DEVELOPMENT,\n },\n {\n action: 'reload',\n icon: Icons.Reload,\n name: t('common.reload'),\n handler: createHandler('reload', node.api.reloadBlocklet),\n disabled: blocklet.status !== 'running' || blocklet.mode === BLOCKLET_MODES.DEVELOPMENT,\n },\n\n isDownloading(blocklet.status) ? cancelDownloadAction : removeAction,\n\n {\n separator: true,\n },\n {\n onlyInMenu: true,\n action: 'config',\n icon: Icons.Config,\n name: t('common.config'),\n handler: () => {\n history.push(`/blocklets/${blocklet.meta.did}/configuration`);\n },\n disabled: isDownloading(blocklet.status),\n },\n {\n onlyInMenu: true,\n action: 'team',\n icon: Icons.Group,\n name: t('common.manageTeam'),\n handler: () => {\n history.push(`/blocklets/${blocklet.meta.did}/members`);\n },\n disabled: isDownloading(blocklet.status),\n },\n {\n onlyInMenu: true,\n action: 'log',\n icon: Icons.Log,\n name: t('common.log'),\n handler: () => {\n history.push(`/logs/blocklet-${blocklet.meta.did}`);\n },\n disabled: isDownloading(blocklet.status),\n },\n ].filter(Boolean);\n\n const inProgress = loading || isInProgress(blocklet.status);\n\n if (variant === 'menu') {\n return (\n <Div data-cy=\"blocklet-actions\">\n <Permission permission=\"mutate_blocklet\">\n {hasPermission => (\n <IconButton\n aria-label=\"more\"\n aria-controls=\"actions-menu\"\n aria-haspopup=\"true\"\n data-cy=\"trigger-blocklet-actions\"\n actions-blocklet-did={blocklet.meta.did}\n onClick={onOpen}\n size=\"small\"\n disabled={!hasPermission || (!isDownloading(blocklet.status) && Boolean(inProgress))}>\n <MoreVertIcon />\n </IconButton>\n )}\n </Permission>\n\n <Menu id=\"actions-menu\" anchorEl={anchorEl} keepMounted open={open} onClose={onClose} PaperProps={{}}>\n {missingRequiredConfigs.length > 0 && (\n <Alert style={{ maxWidth: '400px' }} severity=\"error\">\n {t('blocklet.config.user.missingRequired')}\n <br />\n <Link to={`/blocklets/${blocklet.meta.did}/configuration`}>{t('blocklet.config.user.gotoFix')}</Link>\n </Alert>\n )}\n {actions.map((action, i) => {\n if (action.separator) {\n // eslint-disable-next-line react/no-array-index-key\n return <Divider key={`separator-${i}`} />;\n }\n return (\n <MenuItem\n dense\n key={action.name}\n onClick={e => onAction(action, e)}\n disabled={action.disabled}\n data-cy={`${action.action}-blocklet`}>\n <ListItemIcon style={{ minWidth: 24 }}>\n <action.icon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={action.name} />\n </MenuItem>\n );\n })}\n </Menu>\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </Div>\n );\n }\n\n return (\n <Div data-cy=\"blocklet-actions\" {...rest}>\n <ButtonGroup>\n {actions\n .filter(x => !x.separator && !x.onlyInMenu)\n .map(action => (\n <Button\n title={action.name}\n key={action.name}\n data-cy={`${action.action}-blocklet`}\n onClick={() => onAction(action)}\n disabled={Boolean(action.disabled) || Boolean(inProgress)}>\n {currentAction === action.action && Boolean(inProgress) ? <Spinner size={[16, 10]} /> : <action.icon />}\n <span className=\"blocklet-action-text\">{action.name}</span>\n </Button>\n ))}\n </ButtonGroup>\n {confirmSetting && (\n <Confirm\n title={confirmSetting.title}\n description={confirmSetting.description}\n confirm={confirmSetting.confirm}\n cancel={confirmSetting.cancel}\n params={confirmSetting.params}\n onConfirm={confirmSetting.onConfirm}\n onCancel={confirmSetting.onCancel}\n />\n )}\n </Div>\n );\n}\n\nBlockletActions.propTypes = {\n blocklet: PropTypes.object.isRequired,\n onStart: PropTypes.func.isRequired,\n onComplete: PropTypes.func.isRequired,\n variant: PropTypes.oneOf(['menu', 'group']),\n};\n\nBlockletActions.defaultProps = {\n variant: 'menu',\n};\n\nconst Div = styled.div`\n display: flex;\n align-items: center;\n\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n .MuiButton-root {\n padding: 4px;\n font-size: 10px;\n }\n }\n`;\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"M8 5v14l11-7z\"\n}), 'PlayArrow');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"M6 6h12v12H6z\"\n}), 'Stop');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z\"\n}), 'Autorenew');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z\"\n}), 'Settings');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"M18 17H6v-2h12v2zm0-4H6v-2h12v2zm0-4H6V7h12v2zM3 22l1.5-1.5L6 22l1.5-1.5L9 22l1.5-1.5L12 22l1.5-1.5L15 22l1.5-1.5L18 22l1.5-1.5L21 22V2l-1.5 1.5L18 2l-1.5 1.5L15 2l-1.5 1.5L12 2l-1.5 1.5L9 2 7.5 3.5 6 2 4.5 3.5 3 2v20z\"\n}), 'Receipt');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z\"\n}), 'Group');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"m4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\"\n}), 'ArrowUpward');\n\nexports.default = _default;","import PropTypes from 'prop-types';\n\nimport Tag from '../tag';\n\nexport default function BlockletMode({ mode, ...rest }) {\n if (mode === 'development') {\n return (\n <Tag type=\"info\" {...rest}>\n DEV\n </Tag>\n );\n }\n\n return null;\n}\n\nBlockletMode.propTypes = {\n mode: PropTypes.string.isRequired,\n};\n","import { useContext } from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport ExternalLink from '@mui/material/Link';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { useBlockletUrlEvaluation } from '../../hooks/url-evaluation';\n\nexport default function BlockletInterface({ blocklet, siteMap, skipAccessibilityCheck = false, ...props }) {\n const { t } = useContext(LocaleContext);\n const { urls, loading, recommendedUrl } = useBlockletUrlEvaluation(blocklet);\n\n if (loading && !skipAccessibilityCheck) {\n return <Spinner size={12} {...props} />;\n }\n\n const url = skipAccessibilityCheck ? urls[0] : recommendedUrl;\n\n if (!url) {\n return t('blocklet.router.noAccessibleUrl');\n }\n\n return (\n <Container {...props}>\n <Flex>\n <ExternalLink href={url} target=\"_blank\" className=\"blocklet-interface\" underline=\"hover\">\n {t('common.open')}\n </ExternalLink>\n </Flex>\n </Container>\n );\n}\n\nconst Flex = styled.div`\n display: flex;\n margin: 4px 0;\n`;\n\nconst Container = styled.div`\n .blocklet-interface {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n white-space: nowrap;\n\n img {\n margin-right: 4px;\n }\n }\n`;\n\nBlockletInterface.propTypes = {\n blocklet: PropTypes.object.isRequired,\n siteMap: PropTypes.object.isRequired,\n skipAccessibilityCheck: PropTypes.bool,\n};\n\nBlockletInterface.defaultProps = {\n skipAccessibilityCheck: false,\n};\n","import { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport Dialog from '@arcblock/ux/lib/Dialog';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport DialogContentText from '@mui/material/DialogContentText';\nimport Typography from '@mui/material/Typography';\nimport TextField from '@mui/material/TextField';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { formatError } from '../../libs/util';\n\nexport default function CreateBlocklet({ onCancel, onSuccess }) {\n const { api } = useNodeContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const { t } = useLocaleContext();\n\n const [title, setTitle] = useState();\n const [description, setDescription] = useState();\n\n const onInstall = async () => {\n setLoading(true);\n try {\n const data = await api.installBlocklet({ input: { title, description } });\n onSuccess(data.blocklet);\n } catch (err) {\n const errMsg = `Blocklet Install failed: ${formatError(err)}`;\n setError(errMsg);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Dialog\n title={t('blocklet.installFromCreate')}\n fullWidth\n maxWidth=\"sm\"\n onClose={() => onCancel()}\n showCloseButton\n open\n actions={\n <>\n <Button\n onClick={e => {\n e.stopPropagation();\n onCancel();\n }}\n color=\"inherit\"\n size=\"small\">\n {t('common.cancel')}\n </Button>\n <Button\n onClick={e => {\n e.stopPropagation();\n onInstall();\n }}\n color=\"primary\"\n size=\"small\"\n data-cy=\"install-blocklet-next-step\"\n variant=\"contained\"\n disabled={loading || error || !title || !description}\n style={{ marginLeft: 8 }}>\n {loading && <Spinner size={[16, 10]} />}\n {t('common.create')}\n </Button>\n </>\n }>\n <DialogContentText component=\"div\">\n <Typography component=\"div\">\n <TextField\n style={{ marginBottom: 24 }}\n label={`Blocklet ${t('common.title')}`}\n autoComplete=\"off\"\n variant=\"outlined\"\n fullWidth\n autoFocus\n value={title}\n onChange={e => {\n setError(null);\n setTitle(e.target.value);\n }}\n disabled={loading}\n />\n <TextField\n label={`Blocklet ${t('common.description')}`}\n autoComplete=\"off\"\n variant=\"outlined\"\n fullWidth\n value={description}\n onChange={e => {\n setError(null);\n setDescription(e.target.value);\n }}\n disabled={loading}\n />\n </Typography>\n </DialogContentText>\n {!!error && (\n <Alert type=\"error\" style={{ width: '100%', marginTop: 8 }}>\n {error}\n </Alert>\n )}\n </Dialog>\n );\n}\n\nCreateBlocklet.propTypes = {\n onCancel: PropTypes.func.isRequired,\n onSuccess: PropTypes.func.isRequired,\n};\n\nCreateBlocklet.defaultProps = {};\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport { useState } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport PropTypes from 'prop-types';\n\nimport AddIcon from '@mui/icons-material/Add';\n\nimport Toast from '@arcblock/ux/lib/Toast';\nimport SplitButton from '@arcblock/ux/lib/SplitButton';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport InstallFromUrl from './install-from-url';\nimport CreateBlocklet from './create-blocklet';\n\nexport default function BlockletAdd({ onCreate }) {\n const history = useHistory();\n const { t } = useLocaleContext();\n\n const [error, setError] = useState('');\n const [success, setSuccess] = useState('');\n const [installSetting, setInstallSetting] = useState(null);\n const [createSetting, setCreateSetting] = useState(null);\n\n const closeInstallFromUrl = () => {\n setInstallSetting(null);\n };\n\n const openInstallFromUrl = () => {\n setInstallSetting({\n onCancel: () => {\n closeInstallFromUrl();\n setInstallSetting(null);\n },\n onSuccess: () => {\n closeInstallFromUrl();\n },\n });\n };\n\n const openCreateBlocklet = () => {\n setCreateSetting({\n onCancel: () => {\n setCreateSetting(null);\n },\n onSuccess: (...args) => {\n setCreateSetting(null);\n onCreate(...args);\n },\n });\n };\n\n return (\n <>\n <SplitButton\n onClick={() => history.push('/store')}\n menuButtonProps={{ 'data-cy': 'open-install-menu' }}\n menu={[\n <SplitButton.Item key=\"1\" data-cy=\"open-install-form\" onClick={() => openInstallFromUrl()}>\n {t('blocklet.installFromUrl')}\n </SplitButton.Item>,\n <SplitButton.Item key=\"2\" data-cy=\"open-create-form\" onClick={() => openCreateBlocklet()}>\n {t('blocklet.installFromCreate')}\n </SplitButton.Item>,\n ]}>\n <AddIcon />\n {t('blocklet.installFromMarket')}\n </SplitButton>\n {!!error && <Toast variant=\"error\" message={error} onClose={() => setError('')} />}\n {!!success && <Toast variant=\"success\" duration={3000} message={success} onClose={() => setSuccess('')} />}\n {installSetting && <InstallFromUrl onCancel={installSetting.onCancel} onSuccess={installSetting.onSuccess} />}\n {createSetting && <CreateBlocklet onCancel={createSetting.onCancel} onSuccess={createSetting.onSuccess} />}\n </>\n );\n}\n\nBlockletAdd.propTypes = {\n onCreate: PropTypes.func,\n};\n\nBlockletAdd.defaultProps = {\n onCreate: () => {},\n};\n","/* eslint-disable react/no-unstable-nested-components */\n/* eslint-disable implicit-arrow-linebreak */\n/* eslint-disable object-curly-newline */\n/* eslint-disable react/jsx-one-expression-per-line */\nimport { useState, useContext, useEffect } from 'react';\nimport styled from 'styled-components';\nimport { Link, useLocation, useHistory } from 'react-router-dom';\n\nimport Datatable, { getDurableData } from '@arcblock/ux/lib/Datatable';\nimport RelativeTime from '@arcblock/ux/lib/RelativeTime';\nimport Typography from '@mui/material/Typography';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Box from '@mui/material/Box';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport Center from '@arcblock/ux/lib/Center';\nimport Empty from '@arcblock/ux/lib/Empty';\n\nimport Alert from '@arcblock/ux/lib/Alert';\nimport Button from '@arcblock/ux/lib/Button';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Toast from '@abtnode/ux/lib/toast';\nimport { getAppMissingConfigs, getDisplayName } from '@blocklet/meta/lib/util';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { useBlockletContext } from '../../contexts/blocklets';\nimport { useRoutingContext } from '../../contexts/routing';\nimport { useDeletingBlockletContext, DeletingBlockletProvider } from '../../contexts/deleting-blocklets';\nimport { formatError } from '../../libs/util';\n\nimport BlockletActions from '../../components/blocklet/actions';\nimport BlockletStatus from '../../components/blocklet/status';\nimport BlockletVersion from '../../components/blocklet/version';\nimport BlockletAvatar from '../../components/blocklet/avatar';\nimport BlockletInterface from '../../components/blocklet/interface';\nimport BlockletAdd from '../../components/blocklet/add';\nimport BlockletMode from '../../components/blocklet/mode';\n\nimport InstallFromUrl from '../../components/blocklet/install-from-url';\nimport Permission from '../../components/permission';\n\nexport default function BlockletListWrap() {\n return (\n <DeletingBlockletProvider>\n <BlockletList />\n </DeletingBlockletProvider>\n );\n}\n\nexport function BlockletList() {\n const node = useNodeContext();\n const blocklets = useBlockletContext();\n const { siteMap } = useRoutingContext();\n const { deletingBlocklets, addDeletingDid, removeDeletingDid, matchDeletingDid } = useDeletingBlockletContext();\n const { t, locale } = useContext(LocaleContext);\n const [installSetting, setInstallSetting] = useState(null);\n const [searchText, setSearchText] = useState('');\n\n matchDeletingDid(blocklets.data.map(e => e.meta.did));\n\n const onActionStart = ({ action, blocklet }) => {\n if (action === 'remove') {\n addDeletingDid(blocklet.meta.did);\n }\n };\n\n const onActionComplete = async data => {\n if (data.error) {\n Toast.error(data.error.message);\n\n if (data.action === 'remove') {\n removeDeletingDid(data.blocklet.meta.did);\n }\n return;\n }\n if (data.action === 'remove') {\n node.refresh({ silent: true });\n }\n };\n const isBreakpointsUpMd = useMediaQuery(theme => theme.breakpoints.up('md'));\n\n // auto open installFromUrl\n const history = useHistory();\n const { pathname, search } = useLocation();\n useEffect(() => {\n const query = new URLSearchParams(search);\n const action = query.get('action');\n const metaUrl = query.get('url');\n if (action === 'install' && metaUrl) {\n setInstallSetting({\n defaultUrl: metaUrl,\n onCancel: () => history.push(pathname),\n onSuccess: () => history.push(pathname),\n });\n } else {\n setInstallSetting(null);\n }\n }, [search, setInstallSetting, history, pathname]);\n\n let content = null;\n const items = blocklets.data || [];\n\n if (blocklets.error) {\n content = (\n <Alert type=\"error\" variant=\"icon\">\n <div>\n {/* message */}\n {formatError(blocklets.error)}\n {/* retry */}\n <Button onClick={() => blocklets.refresh({ silent: false })}>\n <span style={{ color: '#44cdc6', textDecoration: 'underline' }}>{t('common.retry')}</span>\n </Button>\n </div>\n </Alert>\n );\n } else if (items.length > 0 || blocklets.loading) {\n const dateFields = ['installedAt', 'startedAt', 'stoppedAt', 'createdAt'];\n\n const getSortScore = item => {\n if (item.status === 'starting') {\n // starting状态最靠前\n return new Date('2199').getTime();\n }\n if (item.status === 'running') {\n // BUG: 有时在 running 状态下没有 runtimeInfo,这种数据是不对的\n if (item.runtimeInfo) {\n return item.runtimeInfo.startAt;\n }\n if (item.startedAt) {\n return item.startedAt.getTime();\n }\n }\n\n return 0;\n };\n let rows = items\n .map(x => {\n dateFields.forEach(f => {\n if (x[f]) {\n const date = new Date(x[f]);\n x[f] = date;\n }\n });\n\n return x;\n })\n .sort((a, b) => {\n // 默认顺序 starting => running(upTime升序) => default\n const aScore = getSortScore(a);\n const bScore = getSortScore(b);\n\n return bScore - aScore;\n });\n\n if (searchText) {\n rows = rows.filter(d => {\n const name = getDisplayName(d, true) || '';\n return name.toLocaleLowerCase().includes(searchText.toLocaleLowerCase());\n });\n }\n\n const tableDurableData = getDurableData('blocklets-list');\n\n if (tableDurableData.searchText && !searchText) {\n setSearchText(tableDurableData.searchText);\n }\n\n const datatableColumns = [\n {\n label: t('common.name'),\n name: 'meta.title',\n options: {\n customBodyRenderLite(rawIndex) {\n const d = rows[rawIndex];\n\n const tab = getAppMissingConfigs(d).length > 0 ? 'components' : 'overview';\n return (\n <Link to={`/blocklets/${d.meta.did}/${tab}`} className=\"blocklet-name-wrapper\">\n <Typography component=\"strong\" variant=\"body1\" className=\"blocklet-name\">\n <BlockletAvatar blocklet={d} style={{ marginRight: 8 }} />\n {getDisplayName(d)}\n </Typography>\n <BlockletMode mode={d.mode} style={{ marginLeft: 8 }} />\n </Link>\n );\n },\n },\n },\n {\n label: t('common.visit'),\n name: 'runtimeInfo.pid',\n align: 'left',\n options: {\n sort: false,\n customBodyRenderLite(rawIndex) {\n const d = rows[rawIndex];\n return <BlockletInterface blocklet={d} siteMap={siteMap} />;\n },\n },\n },\n {\n label: t('common.version'),\n name: 'meta.version',\n options: {\n customBodyRenderLite(rawIndex) {\n const d = rows[rawIndex];\n return <BlockletVersion blocklet={d} />;\n },\n },\n },\n {\n label: t('common.installedAt'),\n name: 'installedAt',\n options: {\n customBodyRenderLite(rawIndex) {\n const d = rows[rawIndex];\n if (d.installedAt) {\n return <RelativeTime value={d.installedAt.getTime()} locale={locale} />;\n }\n\n if (d.createdAt) {\n return <RelativeTime value={d.createdAt.getTime()} locale={locale} />;\n }\n\n return '';\n },\n },\n },\n {\n label: t('common.uptime'),\n name: 'runtimeInfo.uptime',\n options: {\n customBodyRenderLite(rawIndex) {\n const d = rows[rawIndex];\n\n // 只在 running 状态展示 uptime\n if (d.status === 'running' && d.runtimeInfo) {\n return <RelativeTime value={d.runtimeInfo.startAt} locale={locale} />;\n }\n\n return '';\n },\n },\n },\n {\n label: t('common.status'),\n name: 'status',\n width: 120,\n align: 'center',\n options: {\n customBodyRenderLite(rawIndex) {\n const d = rows[rawIndex];\n return (\n <BlockletStatus\n data-cy=\"blocklet-status\"\n status-blocklet-did={d.meta.did}\n key={d.meta.did}\n status={deletingBlocklets.includes(d.meta.did) ? 'deleting' : d.status}\n source={d.source}\n />\n );\n },\n },\n },\n {\n label: t('common.actions'),\n name: '',\n width: 90,\n options: {\n sort: false,\n customBodyRenderLite(rawIndex) {\n const d = rows[rawIndex];\n\n return (\n <BlockletActions\n key={d.meta.did}\n blocklet={d}\n variant=\"menu\"\n onStart={onActionStart}\n onComplete={onActionComplete}\n />\n );\n },\n },\n },\n ];\n\n const tableComponents = {};\n\n if (!isBreakpointsUpMd) {\n tableComponents.TableBody = function TableBody(e) {\n if (blocklets.loading) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n const { page: pageIndex, rowsPerPage } = e;\n\n const data = rows.slice(pageIndex * rowsPerPage, pageIndex + 1 * rowsPerPage);\n\n if (!data.length) {\n return <Empty>{t('common.empty')}</Empty>;\n }\n\n return (\n <div>\n {data.map(d => {\n const tab = getAppMissingConfigs(d).length > 0 ? 'components' : 'overview';\n return (\n <Box\n className=\"blocklet-item--mobile\"\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\">\n <BlockletAvatar className=\"blocklet__avatar\" blocklet={d} size={isBreakpointsUpMd ? 40 : 60} />\n <Link className=\"blocklet__content\" to={`/blocklets/${d.meta.did}/${tab}`}>\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"flex-start\">\n <Typography component=\"strong\" variant=\"body1\" className=\"blocklet__name\">\n {getDisplayName(d, true)}\n </Typography>\n <BlockletActions\n key={d.meta.did}\n blocklet={d}\n variant=\"menu\"\n onStart={onActionStart}\n onComplete={onActionComplete}\n />\n </Box>\n <Typography component=\"small\" className=\"blocklet__addons\">\n <Box display=\"flex\" alignItems=\"center\">\n <BlockletVersion blocklet={d} />\n <BlockletInterface blocklet={d} siteMap={siteMap} style={{ marginLeft: 16, fontSize: 14 }} />\n </Box>\n <BlockletStatus\n status-blocklet-did={d.meta.did}\n key={d.meta.did}\n status={d.status}\n source={d.source}\n />\n </Typography>\n </Link>\n </Box>\n );\n })}\n </div>\n );\n };\n }\n\n /* eslint-enable indent */\n content = (\n <MobileList>\n <Datatable\n loading={blocklets.loading}\n className=\"blocklet-list\"\n title={t('blocklet.index.tableTitle')}\n locale={locale}\n data={rows}\n columns={datatableColumns}\n durable=\"blocklets-list\"\n options={{\n download: false,\n filter: false,\n print: false,\n searchPlaceholder: t('common.search'),\n searchAlwaysOpen: true,\n sortOrder: {\n name: 'uptime',\n direction: 'desc',\n },\n onSearchChange: e => setSearchText(e),\n ...tableDurableData,\n }}\n components={tableComponents}\n />\n </MobileList>\n );\n } else if (items.length === 0) {\n content = (\n <Alert type=\"warning\" variant=\"icon\">\n {t('blocklet.index.noBlocklet')}\n </Alert>\n );\n }\n\n return (\n <>\n <Main>\n <Typography component=\"h2\" variant=\"h4\" className=\"page-header\" color=\"textPrimary\">\n {t('common.blocklets')}\n <Permission permission=\"mutate_blocklet\">\n <BlockletAdd\n onCreate={blocklet => {\n history.push(`/blocklets/${blocklet.meta.did}/components`);\n }}\n />\n </Permission>\n </Typography>\n {content}\n </Main>\n\n {installSetting && (\n <InstallFromUrl\n defaultUrl={installSetting.defaultUrl}\n onCancel={installSetting.onCancel}\n onSuccess={installSetting.onSuccess}\n />\n )}\n </>\n );\n}\n\nconst MobileList = styled.div`\n .blocklet-item--mobile {\n padding: 16px 0;\n }\n`;\n\nconst Main = styled.main`\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .blocklet-list {\n .blocklet-item--mobile {\n .blocklet__avatar {\n margin-right: -60px;\n }\n .blocklet__content {\n padding-left: 68px;\n flex: 1;\n display: flex;\n flex-direction: column;\n z-index: 1;\n }\n .blocklet__name {\n font-weight: bold;\n text-decoration: none;\n white-space: normal;\n word-break: break-all;\n }\n .blocklet__addons {\n display: flex;\n justify-content: space-between;\n margin-top: 5px;\n margin-bottom: -10px;\n }\n }\n .blocklet-name-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n }\n .blocklet-name {\n font-weight: bold;\n text-decoration: underline;\n display: flex;\n align-items: center;\n white-space: normal;\n word-break: break-all;\n }\n\n .blocklet-interface {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n\n img {\n margin-right: 4px;\n }\n }\n\n .MuiToolbar-root {\n display: flex;\n }\n }\n`;\n"],"sourceRoot":""}
|