@topvisor/ui 1.5.6-topSelectorReactive.2 → 1.5.6

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.
Files changed (41) hide show
  1. package/.chunks/{api-DZQlrC2R.amd.js → api-DupNAJPm.amd.js} +2 -2
  2. package/.chunks/{api-DZQlrC2R.amd.js.map → api-DupNAJPm.amd.js.map} +1 -1
  3. package/.chunks/{api-DZQlrC2R.esm.js → api-DupNAJPm.esm.js} +2 -2
  4. package/.chunks/{api-DZQlrC2R.esm.js.map → api-DupNAJPm.esm.js.map} +1 -1
  5. package/.chunks/formsExt-DzXSTWaT.amd.js +2 -0
  6. package/.chunks/formsExt-DzXSTWaT.amd.js.map +1 -0
  7. package/.chunks/{formsExt-C9r4Gz9y.esm.js → formsExt-DzXSTWaT.esm.js} +126 -122
  8. package/.chunks/formsExt-DzXSTWaT.esm.js.map +1 -0
  9. package/.chunks/{mocker-Bl1SzAJY.amd.js → mocker-C9Dl3SwM.amd.js} +2 -2
  10. package/.chunks/mocker-C9Dl3SwM.amd.js.map +1 -0
  11. package/.chunks/{mocker-Bl1SzAJY.esm.js → mocker-C9Dl3SwM.esm.js} +2 -2
  12. package/.chunks/mocker-C9Dl3SwM.esm.js.map +1 -0
  13. package/api/index.amd.js +1 -1
  14. package/api/index.amd.js.map +1 -1
  15. package/api/index.js +1 -1
  16. package/assets/project.css +1 -1
  17. package/autoload-css-manifest.amd.json +1 -1
  18. package/autoload-css-manifest.json +1 -1
  19. package/formsExt/formsExt.amd.js +1 -1
  20. package/formsExt/formsExt.amd.js.map +1 -1
  21. package/formsExt/formsExt.js +1 -1
  22. package/package.json +6 -6
  23. package/project/project.amd.js +1 -1
  24. package/project/project.amd.js.map +1 -1
  25. package/project/project.js +432 -416
  26. package/project/project.js.map +1 -1
  27. package/src/api/api/types/mocker.d.ts +3 -2
  28. package/src/components/formsExt/selector2/types.d.ts +1 -1
  29. package/src/components/project/projectSelector/cache.d.ts +1 -1
  30. package/src/components/project/projectSelector/stories/mocks/index.d.ts +2 -2
  31. package/src/components/project/regionSelector/utils/consts.d.ts +1 -0
  32. package/src/core/utils/searchers.d.ts +1 -0
  33. package/utils/searchers.amd.js +1 -1
  34. package/utils/searchers.amd.js.map +1 -1
  35. package/utils/searchers.js +2 -0
  36. package/utils/searchers.js.map +1 -1
  37. package/.chunks/formsExt-C9r4Gz9y.amd.js +0 -2
  38. package/.chunks/formsExt-C9r4Gz9y.amd.js.map +0 -1
  39. package/.chunks/formsExt-C9r4Gz9y.esm.js.map +0 -1
  40. package/.chunks/mocker-Bl1SzAJY.amd.js.map +0 -1
  41. package/.chunks/mocker-Bl1SzAJY.esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["project/project.js","../../src/components/project/competitorSelector/competitorSelector.vue","../../src/components/project/competitorSelector/composables.ts","../../src/components/project/regionSelector/utils/consts.ts","../../src/components/project/regionSelector/utils/utils.ts","../../src/components/project/regionSelector/composables/selectSearcher.ts","../../src/components/project/regionSelector/composables/selectRegion.ts","../../src/components/project/regionSelector/composables/compare.ts","../../src/components/project/regionSelector/composables/selectorRegion.ts","../../src/components/project/regionSelector/regionSelector.vue","../../src/components/project/groupSelector/folders/utils.ts","../../src/core/utils/composables/useWatch.ts","../../src/components/project/groupSelector/folders/folders.vue","../../src/components/project/groupSelector/groups/utils.ts","../../src/components/project/groupSelector/groups/groups.vue","../../src/components/project/groupSelector/groupSelector.vue","../../src/components/project/projectSelector/utils.ts","../../src/components/project/projectSelector/submenu/submenu.vue","../../src/components/project/projectSelector/cache.ts","../../src/components/project/projectSelector/projectSelector.vue","../../src/components/project/tagSelector/utils/utils.ts","../../src/components/project/tagSelector/utils/el.ts","../../src/components/project/tagSelector/tagsDefaults.ts","../../src/components/project/tagSelector/tagIcon/tagIcon.vue","../../src/components/project/tagSelector/popupListItem/tagPopupListItem.vue","../../src/components/project/tagSelector/popupOpener/popupOpener.vue","../../src/components/project/tagSelector/tagSelector.vue"],"names":["k2","k","desc","m","o","v","\"default\"","ownKeys","ar","mod","result","i","vue","exports","_e","ve","ye","vue_1","n","a","forms_CY5MOh7a_esm_js_1","popup_3cwJ8Hev_esm_js_1","formsExt_C9r4Gz9y_esm_js_1","be","xe","Se","Ce","U","we","Te","Ee","De","Oe","ke","je","Ae","r","Me","Ne","utils_Be_ScFyj_esm_js_1","require","resolve_1","reject_1","Pe","e","t","searchers_js_1","Fe","Ie","Le","Re","s","c","l","u","d","f","p","$i18n","W","ze","Be","Ve","He","Ue","We","G","K","q","Ge","Ke","qe","Je","Ye","Xe","Ze","Qe","$e","et","tt","nt","field_DEusYVqS_esm_js_1","h","g","y","b","rt","it","at","ot","st","ct","mt","lt","ut","dt","ft","pt","ht","keyboard_js_1","gt","_t","vt","yt","$core","bt","J","Y","xt","St","Ct","wt","Tt","Et","Dt","Ot","kt","_","ee","check_js_1","string_js_1","At","X","Z","jt","worker_Bv_yPPMv_esm_js_1","dom_js_1","Q","Mt","Nt","Pt","Ft","It","Lt","Rt","zt","Bt","Vt","x","S","te","O","j"],"mappings":"AAAA,IAAI,gBAAmB,MAAQ,KAAK,kBAAqB,OAAO,QAAU,SAAS,EAAG,EAAG,EAAG,EAAI,CACxFA,IAAO,SAAW,EAAKC,GAC3B,IAAIC,EAAO,OAAO,yBAAyBC,EAAGF,CAAC,GAC3C,CAACC,IAAS,QAASA,EAAO,CAACC,EAAE,WAAaD,EAAK,UAAYA,EAAK,iBAClE,EAAO,CAAE,WAAY,GAAM,IAAK,UAAW,CAAE,OAAOC,EAAEF,EAAI,CAAE,GAE9D,OAAO,eAAeG,EAAGJ,EAAIE,CAAI,CACrC,IAAM,SAAS,EAAG,EAAG,EAAG,EAAI,CACpBF,IAAO,SAAW,EAAKC,GAC3B,EAAED,GAAMG,EAAEF,EACd,IACI,mBAAsB,MAAQ,KAAK,qBAAwB,OAAO,QAAU,SAAS,EAAG,EAAG,CAC3F,OAAO,eAAeG,EAAG,UAAW,CAAE,WAAY,GAAM,MAAOC,CAAE,CAAC,CACtE,GAAK,SAAS,EAAG,EAAG,CAChB,EAAEC,QAAaD,CACnB,GACI,aAAgB,MAAQ,KAAK,eAAkB,UAAY,CAC3D,IAAIE,EAAU,SAAS,EAAG,CAMtB,MALA,GAAU,OAAO,qBAAuB,SAAU,EAAG,CACjD,IAAIC,EAAK,CAAC,EACV,IAAK,IAAIP,KAAKG,EAAO,OAAO,UAAU,eAAe,KAAKA,EAAGH,CAAC,IAAG,EAAGO,EAAG,QAAUP,GACjF,OAAOO,CACX,EACOD,EAAQH,CAAC,CACpB,EACA,OAAO,SAAU,EAAK,CAClB,GAAIK,GAAOA,EAAI,WAAY,OAAOA,EAClC,IAAIC,EAAS,CAAC,EACd,GAAID,GAAO,KAAM,IAAK,IAAIR,EAAIM,EAAQE,CAAG,EAAGE,EAAI,EAAGA,EAAIV,EAAE,OAAQ,IAASA,EAAEU,KAAO,WAAW,gBAAgBD,EAAQD,EAAKR,EAAEU,EAAE,EAE/H,OADA,mBAAmBD,EAAQD,CAAG,EACvBC,CCpBf,CDsBA,EAAC,CCfA,EDgBD,OCdG,CAAA,UAAY,UAAA,gCAAA,gCAAA,mBAAA,iCAAA,gCAAA,qBAAA,sBAAA,yBAAA,wBAAA,gCAAA,mCAAA,MAAA,8BAAA,8BAAA,0CAAA,EAAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CACZ,aAAA,GAAAE,IAAA,OAAA,IAAAA,EAAA,OAAA,IACA,OAAO,eAAAC,EAAA,aAAA,CAAA,MAAA,EAAA,CAAA,EACP,EAAA,wBAAS,EAAA,6BAAA,EAAA,kCAAA,EAAA,iBAAA,EAAA,+BAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,sBAAA,IAAA,GAKX,IAAAC,EAAA,CAAA,MAAA,wBAAA,EAAAC,EAAA,CAAA,MAAA,eAAA,EAAAC,GAAA,EAAAC,EAAA,gBAAA,CAAA,CDYO,OAAQ,qBCNF,OAQD,EAAAA,EAAA,YAAA,CAAA,CANF,WAAA,CAAA,EACA,MAAA,CAAA,EACD,kBAAA,CACC,KAAA,QDOK,QAAS,CAAC,CACd,EACA,kBAAmB,CAAE,QAAS,GAAI,CACtC,EAAG,CCJG,WAEc,CAAA,EACjB,eAAA,CAAwB,CAG7B,CAAA,EACA,MAAY,CAAA,mBAAA,EACZ,MAAA,EAAA,CDEM,IAAIN,EAAIO,EAAGC,GAAK,EAAGF,EAAM,SAAQ,CAAEC,EAAG,YAAY,EAAGd,GAAK,EAAGa,EAAM,SAAQ,KAAQ,CAC/E,GAAIN,ECDf,kBDEe,MAAO,CACH,KAAMA,EAAE,kBACR,OAAQ,EAAGS,EAAwB,EAAC,CAAE,CAAC,CAAC,OAAO,WAC/C,MAAO,MACP,QAAS,EACb,CACR,CAAC,EACD,OAAQ,EAAG,MAAQ,EAAGH,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,mBAAkB,CAAE,MAAOH,EAAI,EAAE,EAAGG,EAAM,MAAK,CAAEG,EAAwB,CAAC,CAAC,CAAC,MAAM,WAAa,EAAGH,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEI,EAAwB,EAAG,CAAE,IAAK,CAAE,EAAG,CCMhP,QAAA,EAAAJ,EAAA,QAAA,KAAA,EAAA,EAAAA,EAAA,YAAA,CAAAG,EAAA,EAAA,CDJwB,MAAO,gCCFvB,MAAA,QDIgB,KAAM,ICHvB,MAAA,GACK,EAAA,CACL,SAAA,EAAAH,EAAA,QAAA,KAAA,EAAA,EAAAA,EAAA,gBAAA,EAAA,EAAAA,EAAA,gBAAA,CAAAC,EAAA,MAAA,KAAA,GAAA,EAAA,QAAAC,EAAA,QAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,CAAA,CAAA,EACa,EAAA,CACL,CAAA,CAAA,CAAA,EDKC,aAAc,EAAGF,EAAM,QAAO,KAAQ,GAAG,EAAGA,EAAM,UAAS,CAAE,CAAC,CAAC,GAAI,EAAGA,EAAM,mBAAkB,CAAEA,EAAM,SAAU,MAAO,EAAGA,EAAM,WAAU,CAAEC,EAAE,MAAQ,KAAQ,EAAGD,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEI,EAAwB,EAAG,CAC/N,OAAQ,EAAGJ,EAAM,eAAc,CAAE,CAAE,aAAcE,EAAE,OAAO,SAAS,EAAE,KAAK,CAAE,CAAC,EAC7E,gBAAiB,EAAE,KACnB,MAAO,EAAE,MACT,YAAe,EAAE,MAAQ,CAAC,EAAE,KAAK,CACrC,EAAG,CExEC,SAAqB,EAAOF,EAAc,QAAW,KAAsB,EAAA,EAAAA,EAE7D,mBAChC,CAAA,OAAAF,GAAA,EAAAE,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,CAAA,CAAA,EACY,EAAA,CACsB,EAAG,KAAA,CACE,QACzB,gBCOM,QAC1B,SACA,CAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EACA,EAAA,CACA,CAAA,KAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAAK,EAAA,EAAA,CACA,IAAA,EACA,WAAAH,EAAA,MACA,sBAAA,EAAA,KAAA,GAAA,EAAA,MAAA,EACC,MAAAD,EAAA,MACA,WAAA,CAAA,EAGkC,QAAA,MACtC,mBAAA,CAAA,EACM,cAAAd,EAAA,KACN,EAAA,KAAA,EAAA,CAGiD,aACjD,QACM,eACmB,CAAA,EAAA,CAAA,EACzB,CAGK,CAAA,EAAqBmB,GAAA,EAAA,KAAA,EAAAN,EAAA,SAAA,MAAA,EAAAA,EAAA,QAAA,CAAA,CAAA,CAAA,CAAA,OAAA,GAAA,EAAA,IAAA,GAAA,EAAA,KAAA,CAAA,CAAA,CAAA,IAAA,IAAA,CAC1B,MAAA,EAAA,GACM,MAAA,EAAA,IAAA,KAAA,EAAA,GAAA,GACN,KAAA,EAAA,MAAA,EAAAA,EAAA,QAAA,CAAA,CAAA,EAAA,IAAA,GAGqC,QAAA,EAAA,IACrC,EAAA,CAAA,EAAAO,EAAA,CACM,EAAA,SACN,EAAU,SACV,EAAA,UAG4B,EAAA,OAC5B,EAAA,SACO,EAAA,WACP,EAAQ,cACR,GAAA,aACA,GAAA,eACA,EAAMC,EAAA,CACA,IAAA,GAGM,KAAA,KC7CR,MAAA,EAWJ,EAAAC,EATI,CAoBC,IAEL,GAIM,KAAA,KAGN,QAAU,CAAAD,CAAS,EACb,cAC0B,IAAQ,IAAA,CAAA,CAAA,GAAYA,CAAS,CAAA,CAAA,CAE5D,EAAME,EAAY,CACR,IAAA,GAIJ,KAAuB,aAErB,MAAY,EAClB,EAAUC,EAAA,CAIP,IAAU,GAmBG,KAAA,aACA,QAAkB,CAAAD,CAAA,EAE9B,cAA6B,IAAA,IAAA,CAAA,CAAA,GAAAA,CAAA,CAAA,CAAA,CAClC,EAAAE,EAAK,CACL,YAAqB,KACrB,MAAU,EACV,OAAA,EACD,IAAA,GAEkB,MAAe,GAG3B,KAAA,KASF,KAAiD,gBACtD,EAAMC,QAAyD,EAAK,MAAM,EAAAV,EAAA,EAAA,CAAA,CAAA,CAAA,OAA2C,WAAAO,GAAAI,QAAAD,GAAA,EAAA,EAAA,MAAA,EAAAV,EAAA,EAAA,CAAA,CAAA,CAAA,OAAA,WAAA,QAAA,IAAAQ,CAAA,EAAAA,GAAAI,QAAA,EAAA,MAAA,EAAAZ,EAAA,EAAA,CAAA,CAAA,CAAA,SAAA,eAAAS,GAAAI,GAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA,CAAA,IAAA,CAGlG,IAAK,EACjB,MAA8B,GAAK,EAAAC,GAAA,EAAA,CAAA,EAAAC,EAAA,CAAA,EAAA,GAAA,EAAA,IAAA,GAAAJ,GAAA,CAAA,EAAA,EAAA,MAAA,EAAA,IAAA,GAAAL,CAAA,EAAA,CACzC,EAAAS,GAA+B,EAAA,EAAA,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA,KAAgB,CAChD,IAAA,EAAA,IAAA,IAYA,OAViB,EAAA,QAAA,GAAY,CAGb,GAAA,CAAA,EAAA,SAAe,GAAA,OAAA,EAAA,KAAA,UAAA,EAAA,IAAA,EAET,OACX,IAAA,EAAc,CAAI,GAAO,CAAA,EAI7B,EAAA,cAAA,IAAA,IAAA,EAAA,SAAA,EAAA,QAAA,QAAA,GAAA,CAUoE,GAAyB,GAAA,CAAM,EAAA,QAC1C,OAKlD,IAAS,EAAA,CAAa,GAAA,CAAA,EAClB,EAAA,cAAiB,IAAA,EAAa,MAAa,CAAA,CAKvD,CAEA,EAAA,CAAa,EAAA,cAAQ,MAA0B,EAAA,QAAc,CAAA,EAC7D,SAAa,EAAU,cAA0B,MAAS,EAAO,SAEjE,EAAC,IAAA,EACA,IAAa,CAAA,CAUf,CAAA,EAAc,EAAA,QAAO,GAAA,CAGnB,GAAA,EAAA,IAAA,CAAA,EASA,OCnKc,IAAA,EAAA,CA0Cd,IAAA,EArCa,KAAiBX,EAAM,GAuC1C,QAlC2B,CAAA,EACrB,cAAuB,IAAA,GAChB,EACW,EAAA,IAAA,EAAA,IAAA,CAAA,CACtB,CAAA,EAAO,CL2IP,EK1IAU,IAAO,EAAS,IAAA,CACjB,IAAAE,EAAAD,EAAA,EAAA,CAAA,EAAAf,EAAA,EAAA,MAAA,mCAAAF,CAAA,EAEU,GAAAkB,EAAA,IAAA,CAAA,EAAA,CAMD,IAAA,EAAAA,EAAA,IAAmB,CAAA,EACA,IAAA,EAAA,cAAA,IAAA,IAC3B,CACA,OAAOlB,IAAA,UAAAA,IAAA,kBAAAE,EAAA,EAAA,MAAA,kCAAAgB,EAAA,QAAA,GAAA,CACP,GAAU,CAAA,EAAA,cACX,OACoB,IAAA,EAAkB,CAAA,GAAAJ,GAAA,CAAA,EAER,EAAA,cAAA,IAAA,EAAA,MAAA,CAAA,CAC7B,CAAA,EAAAI,CLoIA,EKnIAC,GAAO,EAAK,EAAA,EAAO,CAAA,IAAA,CACpB,IAAA,EAAAJ,EAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EACI,OAAkB,EAAA,QAAoB,GAAA,CAC3C,GAAA,EAAA,EAAA,eAAA,IAAA,IAAA,EAAA,cAAA,EAAA,MAAA,EAAA,UAAA,EAAA,QAAA,QAAA,GAAA,CAEO,GAAA,CAAA,GAAA,EAAA,EAAA,MAAA,IAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,QAAA,IAAA,IAAA,EAAA,OAAA,EAAA,QAAA,EAAA,CAAA,IAAA,EAAA,OAAA,IAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,SAAA,IAAA,IAAA,EAAA,QAAA,EAAA,SAKP,MAAA,GAAA,aAAA,EAAA,IAAA,EAAA,EAAA,CAAA,CACD,CAAA,EAAA,GCjD6C,MAAwD,CAAA,CAC/F,CAAO,EAAQ,CAOX,EAAAK,GAAA,EAAWC,EACR,EAAQ,KAAM,IAAA,SAGX,EAAA,IACL,CAAAC,EAEG,CAAA,sDAA0E,EAAAC,EAElEC,CAAsB,CAAO,CAAA,CAAA,CAAA,KAAA,YAAqB,CAAA,EAAKC,IAAE,EAAA,IAAA,CAOzE,IAAsBP,GAAe,EAAAhB,EAAA,EAAA,CAAA,EACpC,MAAA,CAEgB,aAAM,EAAAH,EAAe,IAAA,CAAAC,EAAS,MAAW,KAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,EAAA,EAC5C,qBAAO,EAAAD,EAAA,SAAA,KAAA,CAIf,IAAS2B,EAAA,IAAA,IACK,GAAA1B,EAAA,MAAA,QAAA,GAAA,CACR,IAAAkB,EAAA,CACP,MAAAlB,EAAA,IACR,MAAAA,EAAA,IAC8B,EAE9B2B,EAAA,kBAAA,EAAA,MAAA,EAAAC,EAAA,iBAAA,CAAA5B,EAAA,GAAA,GAAA0B,EAAA,IAAA1B,EAAA,IAAAkB,CAAA,CACD,CAAA,EAAAS,EAAA,YAAA,CAAAD,EAAA,IAAA,EAAA,EAAA,CAGC,IAAeC,EAAO,CAGoC,MAAU,GAC/B,MAAA,uBAEf,SAAA,CAAA,CACR,EACPD,EAAA,IAAAC,EAAA,MAAAA,CAAA,EACM,IAAwB3B,EAAO,CAC7C,MAAA,GAEgC,MAAAkB,EAAA,OAAA,OAG1B,EACPQ,EAAA,IAAA1B,EAAA,MAAAA,CAAA,CAK2B,CACjB,OAAA0B,CAI+B,CAAA,CACzB,CACf,EAAYG,IAAQ,EAAA,IAAA,CAEpB,IAAAX,GAAA,EAAAhB,EAAA,EAAA,CAAA,EAAA,GAAA,EAAAH,EAAA,IAAA,CAAA,EAAA,EACD4B,EAAA,WAAA,SAAA,IAAA,EAAA,MAAAA,EAAA,WAAA,IAAA,EAAA,QAAA,KAAAA,EAAA,QAAA,EAAA,MAAA3B,EAAA,OAAA,cAAA,OAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,KAAA,GAAA,EAAA,MAAAA,EAAA,OAAA,cAAA,KAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,IAEM,IAAc,GAA4B,EAAYD,EAAK,SAAc,KAC3E,CACQ,IAAO2B,EAA0C,IAAA,IAC7C,OAAkB1B,EAAA,MAAA,eAAA,QAAA,GAAA,CAEtB,IAAU,EAAA,EAAA,KAKK,GAAA2B,EAAA,QAAA,CACR,IAAAA,EAAA,CAEjB,MAAA,EAAA,IACD,MAAA,CAEgC,EAKSD,EAAA,IAAA,EACxC,GAAoB,GAAWA,EAAA,IAAQ,EAAA,IAAAC,CAAA,EAyBzC,MAEoB,CAGd,EAAA,SAAA,GAAA,KAAAT,EAAA,OAAA,UAAA,EAAA,QAAA,KACN,IAAA,GAAA,EAAAU,EAAA,aAAA,CAAA5B,EAAA,MAAA,KAAA,EAAA,EAAA,MAAA,EAAA,EACA,IAAA,GAAA,MAAA,GACD,IAAA,EAAA,CCtImF,MAAgD,EAAA,MAW7H,MAAoB,EACf,KAA8B,EAAA,QAAO,EAAA4B,EAAA,eAAA,CAAA,EAAA,MAAA,EAAA,IAAA,EACvB,EAEvBF,EAAA,IAAA,EAAA,MAAA,CAAA,CACD,CAAA,EAAAA,CAEI,CAAA,EAEM,OAAA,EAAW3B,EAAA,MAAS,CAC7B,GAAuB,EAAG,IAAM,CAE5B,GAAA4B,EAAA,cAAA,EAAA,QAAA,IAAA,IAAAD,EAAA,IAAA,EAAA,KAAA,EAEwB,OAK5B,IAAA,EAAAA,EAAA,KAAA,CAAA,CAAA,KAAA,CAAA,CAAA,MAIuB,GACvB,EAAA,QAA0C,IAAQ,IACxB,GAAM,CAeR,EAAA,MAAA,EACA,MAK1B,CAEM,IAAA,EAAsB1B,GAAA,IAAA,EAAA,KAAA,CAAA,EAAA,OAAA,GAAA,EAAA,GACf,IAAA,GAAA,CAAA2B,EAAA3B,KAAA0B,EAAA,QAAA,EAAA,CAGH,IAAAA,EAOG1B,EAGN,MCtE2C,GAAA,OAAA0B,GAAA,UAAA,OAAAC,GAAA,SAEzB,MAalB,GAAAD,IAAiB,EAAA,CAEH,EAAAC,EACI,KACX,CAIX,IAAA,EAAA,OAAA,QAAAT,EAAA,OAAA,SAAA,GAAAA,EAAA,OAAA,SAAA,KAAA,EAAA,EAAA,EAAA,EAAA,EAGKQ,EAAA,QAAA,CAAA,IAAA,KAAA,EAAA,EAAA,QAAA,cAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAAA,EAAA,QAAA,CAAA,IAAA,KAAA,EAAA,EAAA,QAAA,QAAA,EAAA,EAAA,KAAAA,EAAA,QAAA,CAAA,IAAA,KAAA,EAAA,EAAA,QAAA,QAAA,EAAA,EAAA,EAAA,EAAA,QAAA,cAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAAA,EAAA,QAAA,CAAA,IAAA,KAAA,GAAA,IAAA,EAAA,EAAA,EAAAC,GAGiC,CAKd,EAAA,MAAA,CAEhB,CAAA,EAAA,CAUyB,YAAa,EAE5B,oBAAsB,CAErC,CACH,EAAAG,IAAgC,EAAA,EAAA,IAAY,CAC5C,IAAA,GAAA,EAAA/B,EAAA,IAAA,CAAA,CAAA,CAAA,EAAA,MAAA,CACD,GAAA,EAAA,cAAA,EAAA,MAAA,CAGc,EAAA,MAAY,MAChB,KAAA,EAAA,MAAA,KAAe,CAAI,EAOxB,MAEmB,CAIQ,IAAc,EAAM,CAAA,EAE9B,GAAc,EAClC,WAAuC,OAEtB,EAEnB,EAAA,CAAA,GAAA,EAAA,UAAA,OAmBG,GAAgB,CAEQ,EAAA,KAAA,MAAA,aAAA,QAAA,4BAAA,EAAA,UAAA,iBAAA,CAAA,GAAA,CAAA,CACT,MAKS,CAAA,CAClB,EAAA,SAEN,EAAa,EAAA,OAAY,GAAA,EAAA,MAAsB,IAAA,CAAA,CAAA,GAAA,EAAA,SAAA,EAAA,MAAA,KAAA,EAAA,KAAA,GAAA,EAAA,MAAA,CAAA,GAAA,CAAA,CAE/C,EAAmC,MAAa,CAG1C,EAAA,MAAS,OAAA,aAAA,QAAA,6BAAA,EAAA,UAAA,kBAAA,KAAA,UAAA,EAAA,KAAA,CAAA,EAAA,aAAA,WAAA,6BAAA,EAAA,UAAA,iBAAA,CACZ,EACS,OAAiB,EAAAA,EAAS,MAAA,CAAA,MAAA,CAAE,EAAA,CAAgC,CAAK,EAAA,EAAA,YAAA,EAAA,EAAA,CAAA,eAAA,CAAA,CAAU,EAAagC,GAAM,GAEvG,CACP,IAAA,GAAA,EAAAhC,EAAA,SAAA,KAAAgB,EAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,GAAA,EAAAhB,EAAA,SAAA,KAAA,EAAA,MAAA,IAAA,EAAA,YAAA,KAAA,GAAAS,CAAA,EAAA,GAAA,EAAAT,EAAA,SAAA,KAAA,CAEO,IAAA,EAAA,IAAA,IAMF,OAAoB,EAAA,MAAA,QAAA,GAAA,CACU,EAAA,cAAA,QAAA,GAAA,CAGnC,EAAA,QAAqB,IAAM,EAAe,QAAA,IAAA,EAAA,IAAA,EAAA,KAAA,CAC3C,CAAA,CAYO,CAAA,EAAA,CACN,CAAA,EAAA,EAAA0B,GAAA,EAAA,CAAA,EAAA,EAAAI,GAAA,EAAA,CAAA,EAAA,EAAAC,GAAA,EAAA,EAAA,CAAA,GACA,EAAA/B,EAAA,MAAA,CAAA,MAAA,CACA,GAAA,EAAA,aAAA,EAAA,eAAA,MAAA,MAAA,KAAA,EAAA,MAAA,KAAA,CAAA,EAAA,EAAA,eAAA,MAAA,EAAA,eAAA,MAAA,OAAA,GAAA,EAAA,MAAA,IAAA,CAAA,CAAA,EAAA,EAAA,YAAA,QAAA,GAEA,OACA,IAAA,EAAA,EAAA,MAAA,KAAA,CAAA,CAAA,KAAA,CAAA,CAAA,MAEA,EAAA,MAAA,QAAA,GAAA,CACA,GAhBuB,EAAA,cAAA,EAAA,MAAA,EAAA,YAAA,MAAA,CACY,EAAA,EAAA,YAAA,MACf,MAGrB,CAYA,GAAA,EAAA,YAAA,OAAA,EAAA,eAAA,IAAA,EAAA,YAAA,KAAA,IAAA,EAAA,EAAA,KAAA,CAAA,EAAA,aAAA,CACD,IAAA,ERiJoB,IAAM,IAAK,KAAM,EAAI,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,eACrC,IAAI,EAAI,EAAE,MAAM,IAAI,EAAE,GAAG,CAAC,EAAE,cAC5B,GAAG,IAAI,EAAE,GAAK,CAAC,GAAG,IAAI,EAAE,IAAM,EAAI,EAAE,IACxC,CACJ,CAAC,EAAG,IAAM,IAAK,KAAM,EAAE,YAAY,MAAQ,GAAI,EAAE,YAAY,QAAU,IAAK,IAAK,EAAE,EAAE,OAAO,cAAa,EAAG,IAAI,EAAE,YAAY,KAAK,IAAM,EAAE,YAAY,MAAQ,EAAE,OAAO,SAAS,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MACnM,EAAG,CAAE,UAAW,CAAC,CAAE,CAAC,EACpB,IAAI,MAAU,CACV,GAAI,EAAE,EAAE,YAAY,QAAU,IAAM,EAAE,YAAY,QAAU,IACxD,OAAO,EAAE,YAAY,KAC7B,EAAG,MAAU,CACT,GAAI,EAAE,cAAgB,EAAE,YAAY,QAAU,GAC1C,OACJ,IAAI,EAAI,EAAE,YAAY,MACtB,GAAI,EAAE,QAAS,CACX,IAAI,EAAI,EAAE,YAAY,MACtB,EAAIoB,EAAG,EAAE,QAAS,CACd,aAAc,EAAE,EAChB,IAAK,CACT,EAAG,EAAE,SAAS,CAAC,EAAE,KACrB,CACA,OAAO,CACX,EAAG,MAAU,CACT,IAAI,EAAI,EAAE,EACV,GAAI,IAAM,IAAK,GACX,OAAO,EAAE,MAAM,IAAI,CAAC,CAC5B,EACA,MAAO,CACH,eAAgB,EAChB,aAAc,EACd,QAAS,ES3UP,cAQgC,EAgBlB,kBAAA,EAEP,YAAS,EACd,cAEG,CACJ,IAEJ,EAAA,EAAW,EACnB,GAAA,IAAA,IAAA,GAGwB,OAAW,EAAA,CAAA,EAAA,eAAA,IAAA,CAAA,CACpC,CACA,CACA,EAAAa,IAAA,EAA2BjC,EAA6B,gBAAQ,CAAe,CAC/E,OAAA,iBACF,OAAA,EAAAA,EAAA,YAAA,CAAA,CAEM,UAAA,CAAA,EAAc,UAAA,CAAA,YAAA,CAAA,CAAA,EAA4B,WAAA,CAAA,EAAqB,iBAAA,CAAA,EAAuB,WAAA,CAAA,KAAA,OAAA,EACxE,QAAY,CAAA,EAC1B,WAAe,CAAM,KAAK,OAAM,EAI9B,aAAoB,CAAA,KAAA,OAAoB,EAEpC,WAAA,CAaA,KAAgB,QAKZ,QACT,CAAA,CACW,EAGZ,gBAGA,CACW,KACf,QAMQ,QAAM,CAAA,CAIT,EAGA,cAAoC,CAYxC,KAAA,QACD,QAAA,CAAA,CAGO,CAGA,EAAA,CAEN,WAAA,CAAA,SAAA,CAAA,CAAA,EACD,eAAA,CAAA,EACM,iBAAA,CAAA,EACS,0BAEI,CAAA,CACf,CAAA,ET2PE,MS5Oc,CAAA,oBAAc,yBAAA,EACjC,MAAU,EAAkB,CAAA,OAAA,GAAA,CAElB,IAAA,EACT,EAAAE,GAAA,EAAAF,EAAA,SAAU,CAAI,EACd,YAAoB,EAAAb,GAAS,EAAaa,EAAA,SAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,eAAAkC,EAAA,aAAAC,EAAA,QAAAC,EAAA,cAAAC,EAAA,kBAAAC,EAAA,YAAAC,EAAA,UAAAC,GAAAR,GAAA,CAAA,EAAA9C,MAAA,CAChC,IAAA,EAAc,CAAA,EACXmD,EAAA,MAAA,QACA,GAAA,CAGX,EAAA,SAAA,EAAA,QAAA,QAAA,GAAA,CAMqB,EACvB,SACI,EAAA,KAAiB,CAAA,CAKF,CAAA,CAMZ,CAAA,EAAAhB,EAAU,KAAM,UAAW,CACrB,QAAA,EAEd,eAAAe,EAAA,eAAA,MACD,yBAAA,GAAA,EAAA,eAAA,MAAA,CACD,CAAA,CAIO,EAsBI,OAAM,EAAApC,EAAW,MAAG,CAAA,CACdmC,EAAA,YAEfD,EAAA,YACDE,EAAA,cAEe,MAAY,CAE3B,GAAAF,EAAA,YAAA,QAAA,IAAAE,EAAA,eAAA,MAAA,OAAA,CACM,GAAA,KAAA,UAAAlC,EAAA,KAAA,IAAA,KAAA,UAAAkC,EAAA,eAAA,KAAA,EACW,OAOD,EAAA,MAAW,CAAA,GAAoBA,EAAA,eAAY,KAAA,CAC7C,MAGU,EAAc,cAAgB,EAAA,MAAA,CAAAF,EAAA,YAAA,KAAA,EAAAA,EAAA,YAAA,QAAA,IAAA,CAAA,EAAA,aAAA,EAAA,MAAA,OAAA,KAAA,EAAA,MAAA,CAAAC,EAAA,YAAA,KAAA,EAAAA,EAAA,YAAA,QAAA,IAAA,CAAA,EAAA,aAAA,EAAA,MAAA,OAAA,IACzC,CAAA,EAAA,cAAmB,CAAcG,EAAA,MAAO,OACjB,EAAA,YAAiB,MAAa,GAE9C,CAAS,EAAAnD,EAAA,QAAA,EAAAa,EAAA,MAAA,CAAAb,MAAA,CAEzBA,EAAA,QAAA,EAAA,MAAA,CAAAA,EAAA,KAAA,EACD,EAAA,CAAA,UAAA,CAAA,CAAA,CAAA,GAAA,EAAAa,EAAA,MAAA,CAAAE,MAAA,CAGqB,GAAAA,EAAA,MACrB,KAAA,EAAA,MAAAA,EAAA,MAAA,IAAA,EAAA,aAAA,CAEF,GAAA,CAAAA,EAAA,MAAA,QAAAA,EAAA,MAAA,SAAA,GAAA,CAAAmC,EAAA,MAAA,IAAAnC,EAAA,MAAA,EAAA,GAAAA,EAAA,MAAA,SAAA,GAAAA,EAAA,MAAA,KAAA,IAAA,CAAA,EAAA,WAAA,CAGgB,IAAA,EAAAmC,EAAA,MAAY,KAAQ,CAAA,CAAA,KAAA,CAAA,CAAA,MAGrB,IAAY,IAAA,CAC3B,EAAQ,aAAe,EAAA,IAAS,GAAG,EAAM,MAAK,IAAA,IAAA,IAAA,GAAA,EAAA,MAAA,OAAA,EAAA,EAAA,MAAA,CAAA,CAAA,EAEhD,MACe,CAGf,GAAAnC,EAAA,MAAA,OAAA,GAAA,KAAA,UAAAA,EAAA,KAAA,IAAA,KAAA,UAAAkC,EAAA,eAAA,KAAA,EAAA,CACA,EAAA,MAAA,CAAA,GAAAA,EAAA,eAAA,KAAA,EAoCM,MTkIa,CACJ,KACK,CSxJjB,IAAA,EAAA,CAAA,GAAA,IAAA,IAAAlC,EAAA,KAAA,CAAA,EAAA,EAAAmC,EAAA,MAAA,OAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,eAAA,KAAA,CAAA,CAAA,KAAA,CAAA,CAAA,MAJwB,GAAA,EAAA,UAAoB,EAAAA,EAAA,MAAA,OAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,eAAA,OAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,KAAA,IAAA,IAAA,CAAA,EAAA,aAAA,EAAA,IAAA,GAAA,EAAA,MAAA,IAAA,CAAA,EAAA,OACrB,IAAA,IAAY,IAAA,EAAA,KAAA,CAAA,OT+Jd,GAAI,EAAE,SAAW,ES/J9B,CACJ,IAAA,EAAAC,EAAA,MACQ,EAAA,UAAA,EAAA,IAAA,IAAAD,EAAA,MAAA,QAAA,GAAA,CTgKY,EAAE,cAAc,QAAS,GAAM,CAC3B,EAAE,QAAU,IAAM,EAAE,QAAU,IAAM,EAAE,IAAI,EAAE,GAAG,CACnD,CAAC,CACL,CAAC,GAAI,EAAE,IAAI,EAAE,EAAE,IAAM,EAAI,CAAC,EAAG,IAAM,IAAK,IAAK,EAAE,KAAK,CAAC,EACzD,KAEI,GAAI,EAAE,OAAQ,GAAMC,EAAE,MAAM,IAAI,CAAC,CAAC,EAAG,CAAC,EAAE,QAAU,IAAM,IAAK,IAAK,EAAE,KAAK,CAAC,ESjKzF,GAAA,KAAA,UAAApC,EAAA,KAAA,IAAA,KAAA,UAAA,CAAA,EAAA,CACiB,EAAA,MAAA,EACD,MTmKL,CSlKV,CACM,GAAA,EAAAA,EAAA,MAAA,SAAA,GAAAA,EAAA,MAAA,MAAA,EAAA,aAAAgC,EAAA,YAAA,MAAAC,EAAA,YAAA,QACZ,GAAe,EAAA,aAAa,CToKR,GAAIjC,EAAE,MAAM,SAAW,EAAG,CACtB,EAAE,YAAY,MAAQA,EAAE,MAAM,GAC9B,MACJ,CACA,EAAE,YAAY,MAAQ,GACtB,MACJ,KStKI,CTwKA,GAAI,CAACA,EAAE,MAAM,OSvK7B,OACG,GAAAA,EAAA,MAAA,SAAA,GAAAgC,EAAA,YAAA,QAAA,GAAA,CACP,EAAA,YAAoC,MAAQhC,EAAA,MAAA,GTyKpB,IAAI,ESvK1BuC,IAAAA,IAAM,KAAOJ,EAAA,MAAA,OAAgB,EAAA,CTyKH,IAAK,IAAI,KAAK,EAAE,cAAc,OAAO,EACjC,IAAK,EAAE,QAAU,EAAE,IAAM,EAAE,SAAWF,EAAE,YAAY,MAAO,CACvD,EAAI,EAAE,IACN,KUrcH,CAChC,GAAA,IAAA,IAAA,GACE,KACA,CACP,IAAA,IAAA,KAAA,EAAA,YAAA,MAAA,EAkByD,KAMzD,GAAA,YAAA,MAAA,GAAA,EAAA,eAAA,MAAA,CAAA,GAAAjC,EAAA,KAAA,CAUC,CAesB,EAErB,CAAa,UAAW,CAAA,CAAA,CAAK,EAAO,EAAE,CAIf,YAAeqC,EACX,UAAiBC,CAmBjC,CAAA,GAA4D,EAAA,MAC1D,EAAIxC,EAAQ,UAAQ,CAAA,GAAY,EAAAA,EAAA,mBAAA,CAAA,MAAA,CAAA,OAAA,EAAAA,EAAA,eAAA,CAAA,CAAC,qBAAA,CAAA,EAAM,kCAAA,EAAA,YAAa,CAAA,CAAA,EAAA,EAAQ,EAAAA,EAAA,YAAA,CAAAG,EAAA,EAAA,CAAsB,SAAA,EAAAH,EAAA,MAAA,CAAAkC,CAAA,CAAA,CAAA,oBAAA,MAAqB,YAAA,EAAAlC,EAAA,MAAA,CAAAkC,CAAA,CAAA,CAAA,YAAA,MAAiB,sBAAA,EAAA,KAAA,GAAA,CAAA,EAAAlC,EAAA,MAAA,CAAAkC,CAAA,CAAA,CAAA,YAAA,MAAA,EAAK,KAAA,eV2YxH,WAAY,EAAE,UAClB,EAAG,KAAM,EAAG,CWxb3B,UAEoB,aACK,YAGP,CAAA,EAEO,CAAA,EAAA,eAAM,EAAAlC,EAAA,MAAA,CAAAkC,CAAA,CAAA,CAAA,YAAA,SAAA,EAAAlC,EAAA,MAAA,CAAA,EAAA,IAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAAG,EAAA,EAAA,CACd,IAAiB,EAChB,MAAA,oBAEF,SAAA,EAAAH,EAAA,MAAA,CAAAmC,CAAA,CAAA,CAAA,oBAAA,MACG,YAAA,EAAAnC,EAAA,MAAA,CAAAmC,CAAA,CAAA,CAAA,YAAA,MACV,sBAAA,EAAA,KAAA,GAAA,CAAA,EAAAnC,EAAA,MAAA,CAAAmC,CAAA,CAAA,CAAA,YAAA,MAAA,EACN,KAAA,EAAA,QAAA,aAAA,eACD,WAAA,EAAA,WAGuB,gBAA8B,EAAA,cAAA,IAAA,IAAA,EAC7C,EAAA,KAAA,EAAA,CACX,UXmboB,aACA,OACA,aACA,eACJ,CAAC,IAAM,EAAGnC,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,EAC1C,EAAE,YAAc,CAAC,EAAE,eAAiB,EAAGA,EAAM,MAAK,CAAEkC,CAAC,CAAC,CAAC,YAAY,SAAW,EAAGlC,EAAM,MAAK,CAAE,EAAE,IAAM,EAAGA,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEG,EAAwB,EAAG,CAC3K,IAAK,EACL,KAAM,UACN,QAASjB,EACT,sCAAuC,EAAGc,EAAM,MAAK,CAAEoC,CAAC,CAAC,CAAC,eAAe,MAAM,MACnF,EAAG,CACC,SAAU,EAAGpC,EAAM,QAAO,KAAQ,EAAE,EAAGA,EAAM,gBAAe,EAAG,EAAGA,EAAM,gBAAe,CAAE,EAAE,MAAM,OAAO,gBAAgB,EAAG,CAAC,CAAC,CAAC,EAC9H,EAAG,CACP,EAAG,EAAG,CAAC,oCAAoC,CAAC,IAAM,EAAGA,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,CACzF,EAAG,CAAC,EACR,CACJ,CAAC,EAAG0C,EAAI,CACJ,GAAI,EACJ,KAAM,IACN,KAAM,GACV,EACA,EAAQ,sBAAwB3C,EAChC,EAAQ,wBAA0BO,EAClC,EAAQ,iBAAmBU,EAC3B,EAAQ,WAAaI,EYhgBzB,EAAc,qBAKRC,EAON,EAAkB,kBAAiBY,GAClC,SAAQU,EAAA,EAAa,CASjB,OAAAf,GAAW,EAAMzB,EAAA,EAAA,CAAA,CAAA,EAAA,OAAA,YAAA,OAAA,EAAAA,EAAA,EAAA,CAAA,CAAA,EAAA,SAAA,YAAA,GAKtB,CAcG,IAASyC,GAAA,EAAA,EAAA,EAAA,IAAA,IAAA,EAAA,CAAA,GAAA,MAAA,EAAA,EAAA,KAAA,EAAA,UAAA,CAAA,EAAA,EAAA,KAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,EAAA,KAAA,EAAA,EAAA,GAAA,CAAA,QAAA,GAAA,CACT,EAAwB,CAAI,GAAA,CAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,EAAA,EAAA,KAAA,IAAA,EAAA,KAAAD,EAAA,CAAA,GAIvB,IAAA,EAAA,EAAA,EAAA,IAAA,OAAA,EAAA,CAAA,EAAA,IAAA,GZ2dA,GY/cC,CAAA,EAAA,KAAA,WAAA,CAAA,IAAA,EAAA,KAAA,EAAA,EAAA,MAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAAC,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA,EAAA,EAAA,UAAA,EAAA,UAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,oBACR,CAAA,EAAA,GAAAC,IAAA,EAAA,IAAA,EAAA,IAAA,QAAA,EAAA,WAAA,CACA,KACE,YACE,OAKA,MACH,CAAA,CAAc,CAAA,aAAoB,CAElC,OAAA,CAAA,UAAA,EACD,MAAA,GAEA,CAAA,EA0BC,SAAMC,EAAA,EAAA,EAAA,EAAA,CZmbA,IAAI,EYlbD,OAAA,KAAA,CAAA,EZmbH,OAAQ,EAAG9C,EAAM,MAAK,CAAE,EAAE,IAAK,GYnbjB,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,CACZ,IAAA,EAAA,CAAA,EACR,EAAA,SAAY,EAAA,IAAA,CACL,GAAA,CAAO,OAAS,GAAA,EAAA,EAAA,EAAA,EAAA,CACP,IAAA,EAAA,EAAY,GAC3B,EAAA,GAAwB,CACxB,IAAA,EAAA,GACA,IAAA,CACD,CZobc,CYjbwC,CAAA,EADnC,OAAA,KAAI,CACtB,CAAA,CAAqD,QAAhD,EAAA,EAAA,CAAA,CZmbA,EAAG,CAAC,CACR,CAGA,IAAI+C,GAAK,CAAC,WAAW,EAAGC,IAAsB,EAAGhD,EAAM,gBAAe,CAAE,CACpE,OAAQ,UACR,OAAsB,EAAGA,EAAM,YAAW,CAAE,CACxC,SAAU,CAAC,EACX,OAAQ,CAAC,EACT,QAAS,CAAC,EaziBU,UAAA,CAAA,EAC3B,aAAA,CAAA,KAAA,OAAA,EACE,WAAA,CAAA,KAAA,OAAA,EACK,QAAc,CACE,KAAA,QAMG,QAAA,CAAA,CAC9B,EACM,OAAA,CAAA,EACK,QAAc,CAAA,CACzB,EAAA,CAMY,SACH,CAAO,SAAW,CAAO,CAAA,EA4CY,kBAAA,CAAA,EAAM,OAAA,CAAA,QAAA0C,CAAA,EAAQ,gBAAA,CAAA,CAAa,CAAA,EAAgB,MAAA,CAAa,kBAAA,eAAA,EAAE,MAAA,EAAA,CAA8B,IAAA,EAAA,EAAA,GAAA,EAAA1C,EAAA,SAAA,CAAA,EAAA,UAAA,EAAA,GAAA,EAAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,CAAA,EAAA,QAAA6C,GAAA,EAAA,OAAA,EAAA,OAAA,EAAA,IAAA,GAAA,GAAA,EAAA7C,EAAA,IAAA,CAAA,IAAA,GAM/D,EAAAA,EACzD,MAAI,KAAgB,EAAA,cAMH,Cb+ehB,GAAG,aAAa,CAAE,WAAY,EAAE,SAAU,CAAC,EAAG,GAAG,WAAW,CAAE,iBAAkB,2BAA6B,EAAE,SAAU,CAAC,EAAG,EAAE,OAAO,WAAW,CACrJ,EAAG,CAAE,UAAW,CAAC,CAAE,CAAC,EACpB,IAAI,GAAK,EAAGA,EAAM,SAAQ,KAAQ4C,EAAG,EAAE,SAAW,CAAE,KAAM,CAACF,CAAC,CAAE,EAAG,EAAE,YAAY,CAAC,EAAG,EAAK,IAAO,EAAE,cAAgB,EAAE,EAAE,EAAE,KAAO,IAAM,EAAE,GAAK,CACvI,GAAG,EAAE,GACL,KAAMC,EAAG,CAAC,CAAC,CACf,GAAI,GACJ,OAAOG,EAAG,CACN,YAAa,EACb,cAAe,CACnB,EAAG,KAAO,IAAM,CACZ,GAAI,EAAE,QAAU,EAAE,MAAM,GACpB,OACJ,GAAI,EAAE,aAAe,CAAC,EAAE,cAAe,CACnC,EAAE,MAAQ,EAAE,MAAM,GAClB,MACJ,CACA,IAAI,EAAI,EAAE,MAAM,IAAI,EAAE,QAAQ,EAC9B,IAAMJ,EAAG,EAAE,MAAQ,EAAG,EAAE,MAAQ,EAAE,EACtC,EAAG,CAAE,UAAW,CAAC,CAAE,CAAC,GAAI,EAAG,MAAQ,EAAG1C,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEK,EAA2B,EAAG,CAC3G,MAAO,2BACP,WAAY,EAAE,MACd,sBAAuB,EAAE,KAAQ,GAAM,EAAE,MAAQ,EACjD,MAAO,EAAE,QAAU,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,EAAI,IAAK,GAChD,cAAe,SACf,KAAM,EAAE,QAAU,IAAM,IAAK,GAC7B,IAAK,EAAE,QAAU,IAAK,IAAK,EAAGL,EAAM,MAAK,CAAE,CAAC,EAC5C,oBAAqB,GAAG,KAAO,EAAGA,EAAM,MAAK,CAAEK,EAA2B,CAAC,CAAC,CAAC,GAAG,EAAG,MAAM,EACzF,yBAA0B,EAC1B,WAAY,EAAE,WACd,SAAU,EACd,EAAG,CACC,MAAO,EAAGL,EAAM,QAAO,EAAG,CAAE,KAAM,KAAQ,EAAE,EAAGA,EAAM,mBAAkB,CAAE,MAAO,CAAE,UAAW,EAAE,KAAK,WAAW,KAAM,IAAI,CAAE,EAAG,KAAM,EAAG+C,EAAE,CAAC,CAAC,EAC3I,EAAG,CACP,EAAG,EAAG,CACF,aACA,QACA,OACA,MACA,qBACA,YACJ,CAAC,Ec1lBP,CAwBD,CAAA,EAAAE,EAAM,CAKL,GAAgC,GAE9B,KAAA,KACP,UAAkBP,EAAA,GAClB,YAAiBA,EAAA,IACjB,EAAAQ,EAAA,CAKS,GAAA,EAaJ,KAAY,aACN,UACER,EAAA,GAQR,YAAgDA,EAAA,IACrD,EAAYS,OAAO,EAAA,MAAwB,EAAAhD,EAAA,EAAA,CAAA,CAAA,EAAA,OAAA,WAAA+C,GAAAE,OAAA,EAAA,MAAA,EAAAjD,EAAA,EAAA,CAAA,CAAA,EAAA,SAAA,aAAA+C,GAAAG,IAAA,EAAA,EAAA,KAAA,EAAA,CAAA,GAAA,CAAA,EAAA,IAAA,IAAA,KAAA,EAAA,EAAA,OAAA,GAAA,EAAA,IAAA,OAAA,CAAA,CAAA,GAAA,GAAA,EAAA,IAAA,EAAA,YAAA,EAAA,EAAA,OAAA,GAAA,EAAA,YAAA,EAAA,IAAA,EAAA,UAAA,SAAA,EAAA,SAAA,CAAA,GAAA,GAAAC,GAAA,EAAA,IAAA,EAAA,IAAA,QAAA,EAAA,UAAA,CAC5C,KAGS,OACR,YACA,aACA,CAAA,CAAA,CAAA,aAAA,CACG,gBAAY,CAAA,EAEX,MAAQ,GA4BX,CAAA,EAAIC,IAAA,EAAA,IAAA,EAAA,IAAA,QAAA,EAAA,SAAA,EAAAC,IAAA,EAAA,IAAA,EAAA,IAAA,QAAA,EAAA,SAAA,EAAAC,IAAA,EAAA,IAAA,EAAA,IAAA,SAAA,EAAA,gBAAA,EAAAC,GAAA,CAAA,MAAA,2CAAA,EAAAC,GAAA,CAEM,IAAA,EAaX,MAAA,aACD,EAAKC,GAAA,CAAA,WAAiB,EAWtBC,GAAS,CAAA,WAAA,EAAAC,GAAA,CAAA,WAAA,EAAAC,IAAA,EAAA/D,EAAA,gBAAA,CAAA,CACR,OAAA,SACA,OAAA,EAAAA,EAAA,YAAA,CAAA,CACS,QAAY,CAAA,EACJ,MAAU,CAAA,EAKf,UAAA,CAAc,EACZ,OAAmB,CAAA,EAEhC,OAAA,CAAA,EACD,GAAA,CAEU,KAAU,QAOV,QAAQ,IAAA,EACb,EAEC,OAAuB,CAAA,KAAA,CAAA,OAAc,OAA4B,CAElE,EAEG,cAAA,CAAA,KAAA,OAAA,EACA,aAA4C,CAAA,KAAA,CAAA,QAAA,MAAA,CAAA,EAChC,WAEjB,CAAmB,QAED,OAAA,EAEpB,WAAA,CACD,KAAA,QAKU,QAAiB,CAAA,CACpB,EACL,SAAkB,CAAA,KAAA,OAAA,EACd,QAAa,CACR,KAET,QACA,QAAA,CAAA,CAKI,EAIC,OAAY,CAAA,EAGb,QAAY,CAAA,QAAW,YAAY,CAEnC,EAAI,CAKV,QAAA,CAAA,SAAA,CAAA,CAAA,EA/BA,iBAAA,CAAA,EAzBA,MAAA,CAAA,SAAA,CAAA,CAAA,EAyDI,eAAiB,CAAA,CAEhB,CAAA,EAED,OAGC,EAAQA,EAAA,YAAA,CAAA,CASS,WAIrB,YACQ,UACR,EAAO,CAAA,iBAAkC,cAAA,CAAA,EACzC,MAAS,EAAA,CAAA,OAAA,EAAA,KAAA,GAAA,CACF,IAAA,EAAA,EAAAN,EAAA,EAAAQ,GAAA,EAAAF,EAAA,SAAA,CAAA,EAAA,SAAA,EAAA,GAAA,EAAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,EAAA,EAAA,QAAA,CAAA,EAAA,OAAAsD,EAAA,EAAA,OAAA,EAAA,OAAA,EAAA,IAAA,GAAA,EAAA,EAAA,OAAAC,GAAA,EAAA,OAAA,EAAA,OAAA,EAAA,IAAA,GAAA,EAAA,EAAA,OAAAC,GAAA,EAAA,OAAA,EAAA,OAAA,EAAA,IAAA,GAAA,EAAA,EAAA,OAAAC,GAAA,EAAA,OAAA,EAAA,OAAA,EAAA,IAAA,GAAAlB,GAAA,EAAAvC,EAAA,IAAA,CAAA,IAAA,EAAAwC,GAAA,EAAAxC,EAAA,SAAA,KAAA,CAEA,GAAQ,EAAA,SAAA,IAAA,GACG,OAAOqD,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,MAAA,CAInB,CAAA,EAAAnE,GAAA,EAAY8E,EAAK,EAAA,CAAA,YAAA,SAAA,CAAA,EAAA,QAAA,IAAA,CAAA,CAAA,EAGd,GAAa,aAAA,CAGJ,WAAe,EAAA,UAGR,gBAAyC,CAAA,EAYjD,QAAc,CAAA9E,CAAA,CAC/B,CAAA,EAAY,EAAM,KAAA,IAAA,IAAA,GAAA,OAAA,SAAA,MAAA,EAAA8E,EAAA,EAAA,CAAA,KAAA,SAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,CAAA,EACR,IAAAC,EAAA,GAAA,CACJ,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EACC,EAEAC,GAAA,EAAA,CAiBJ,IAAW,CAGJ3B,EAAA,OAAA,WAAA,CAAA,CACJ,EAGKO,EAAA,CAKe,cAAwB,EAAA,UAYjC,aAAoB,EAAA,QAAA,GACzB,iBAAM,EAAA,YACR,EAAA,GAAA,CAGH,GAAA,EAAA,YAGa,GAAA,aAAgC,CAAA,WAAA,EAAe,SAEpE,CAAM,EAAA,GAAA,WAAqB,CAE3B,iBAAmB,0BAA4B,EAAA,SAAA,CAAA,GAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,QAAA,IAAA,CAAA,GAAAoB,EAAA,GAAA,EAAA,UAAA,MAAA,IAAA,IAAA,EAAA,cAAA,MAAA,IAAA,KAAAhE,EAAA,QAAA,KAAA,CAChD,IAAA,EAGC,EAAA,aACA,UAAA,EAIAsC,EA0EY,QAAA,GAAA,EAAA,eAAA,GAAA,EAAAxC,EAAA,SAAA,CAAAmD,EAAA,CAAA,KAAA,EAAA,aAAA,eAAA,CAAA,KAAA,EAAAC,EAAA,GAAAa,EAAA,CAAA,CAzEP,CAAA,EAAA,CAAA,UAAA,CAAA,CAAA,CAAA,EAAAnB,EAAA,CACE,WAAA,EACG,aAAA5C,CdiXC,EAAG,KAAO,IAAM,CchXlB,GAAAA,EAA0B,QAAA,EAAA,MAAA,GAAA,CACvB,GAAA,EAAA,YAAA,CAAA,EAAA,aAAA,CACG,EAAA,MAAS,EAAA,MAAA,GACR,MACd,CACA,GAAA,EAAoB,EAAI,QAAAA,EAAA,QAAA,MAAA,CACZ,GAAA,EAAA,OAA0B,CACtC,IAAA,EAAAsC,EAAA,OAAA,KAAA,GAAA,EAAA,KAAAtC,EAAA,KAAA,EACD,GAAA,CAAA,GAAA,EAAA,eAAA,EAAAiD,EAAA,GAAA,EACac,EAAA,CAAA,MdkXkB,CczVxB,IAAA,EAtBNzB,EAsBM,QAAA,GAhBC,GAAA,CALNtC,EAAA,MAIIuC,EAAAA,CAAAA,EAAMwB,EAAAhB,CAAA,CAOF,CAFD,CACO,GAAA,EAAA,QAAA,CAAA,EAAA,SAAA/C,EAAA,OAAAA,EAAA,QAAA,GAAA,CAAA,EAAA,cAAA,Cd0WU,IAAI,EAAIoD,EAAG,EAAE,OAAQ,EAAE,OAAO,CAAC,CAAC,aAAa,CcnW1C,WAGnB,EAAA,UdkWoB,GAAIpD,EAAE,McpW3B,QAAA,CAAAhB,CAAA,CACO,CAAA,EdsWU,GAAG,WAAW,CAAE,iBAAkB,6BAA+B,EAAE,SAAU,CAAC,EAC9E,IAAI,EAAI,MAAM,EAAE,KAAK,EACrB,GAAI,CAAC,EAAE,QAAQ,QAAU,CAAC,EAAE,OcjW9B,OADtB,CAAA,EAAA,QAAA,EAAA,OAAA,GAAA+E,EAAA,EAAA,OAAA,EAAA,EAAAA,EAAAhB,CAAA,CAAW,CAMGR,CACZ,CACA,EAAA,CAAY,UAAA,CAAA,CAAA,CAAA,EACZ,IAASrD,EAAA,KAAiC,IAAA,CdiWhC,GAAI,EAAE,SAAW,OAAS,CAAC,Ec9VR,OAGZ,IAAA,EAAY,EAAA,MAAA,EAAA,MAAA,EAAA,aAAA,Cd8Vf,WAAY,EAAE,UACd,MAAO,CAAC,EAAE,IAAI,EACd,MAAO,EAAE,QAAQ,IAAMsD,EAAE,GACzB,QAAS,gBACb,CAAC,CAAC,CAAC,KAAK,EcpVL,GAAA,EAAA,OAAA,CATd,IAAA,EAAA,EAAA,OAAA,GACaD,EAAAA,CAAAA,EAAM/C,EAAA,WAAO,CAAA,CACnB,MAGuBuE,EAAA,CAAA,Ed+VnB1B,EAAE,Oc5VmH,WAA1H,CAAA,CAAA,Cd6VC,EAAG4B,EAAI,MAAO,EAAG,IAAM,CACnB,KAAO,MAAM,EAAE,aAAa,CACxB,WAAY,EAAE,UACd,GAAI,EAAE,GACN,KAAM,CACV,CAAC,CAAC,CAAC,KAAK,EAAC,CAAE,SAAW,EAAE,MAAM,KAAO,EAAE,KAAO,EAAE,MAAM,KAAO,GAAIzE,EAAE,YAAa,CAC5E,GAAI,EAAE,GACN,KAAM,CACV,CAAC,EAAG6C,EAAE,OAAO,oBAAoB,EAAE,GAAI,CAAE,KAAM,CAAE,CAAC,GACtD,EAAG6B,EAAI,KAAO,IAAM,CAChB,KAAO,MAAM,EAAE,aAAa,CACxB,WAAY,EAAE,UACd,GAAI,EAAE,EACV,CAAC,CAAC,CAAC,KAAK,EAAC,CAAE,SAAW,EAAE,MAAM,KAAO,EAAE,IAAMH,EAAE,EAAE,aAAed,EAAE,EAAIF,CAAC,EAAGvD,EAAE,WAAY,EAAE,EAAE,EAAG6C,EAAE,OAAO,oBAAoB,EAAE,EAAE,GACpI,EACA,OAAO,EAAE,CAAE,iBAAkB2B,CAAE,CAAC,GAAI,EAAG,MAAQ,EAAGlE,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEK,EAA2B,EAAG,CACvH,QAAS,cACT,IAAKkC,EACL,MAAO,0BACP,WAAY,EAAE,MACd,sBAAuB,EAAE,KAAQ,GAAM,EAAE,MAAQ,EACjD,MAAOC,EAAE,OAAS,EAAE,OACpB,WAAY,SACZ,KAAM,EAAE,QAAU,IAAM,IAAK,GAC7B,IAAK,EAAE,OAAS,IAAK,IAAK,EAAGxC,EAAM,MAAK,CAAE,CAAC,EAC3C,oBAAqB,GAAG,KAAO,EAAGA,EAAM,MAAK,CAAEK,EAA2B,CAAC,CAAC,CAAC,GAAG,EAAG,MAAM,EACzF,qBAAsB,CAAC,CAAC,EAAE,OAC1B,WAAY,EAAE,cAAgB,EAAGL,EAAM,MAAK,CAAEmD,CAAC,CAAC,CAAC,CAAC,CAAC,KAAO,CAAC,EAC3D,WAAY,EAAE,WACd,SAAU,GACV,aAAc/D,CAClB,GAAI,EAAGY,EAAM,YAAW,CAAE,CACtB,MAAO,EAAGA,EAAM,QAAO,EAAG,CAAE,KAAM,KAAQ,EAAE,EAAGA,EAAM,mBAAkB,CAAE,MAAO0D,GAAI,CAC5E,EAAE,MAAQ,EAAG1D,EAAM,MAAK,CAAE,IAAI,IAAM,EAAGA,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,mBAAkB,CAAE,MAAO2D,IAAK,EAAG3D,EAAM,gBAAe,CAAE,EAAE,MAAM,OAAO,GAAG,EAAI,KAAM,CAAC,IAAM,EAAGA,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,GACpM,EAAGA,EAAM,mBAAkB,CAAE,OAAQ,CAClC,MAAO,gDACP,UAAW,EAAE,IACjB,EAAG,KAAM,EAAG4D,EAAE,EACd,EAAE,aAAe,EAAE,WAAa,EAAG5D,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,mBAAkB,CAAE,OAAQ,CACzF,IAAK,EACL,MAAO,sDACP,UAAW,EAAE,WACjB,EAAG,KAAM,EAAG6D,EAAE,IAAM,EAAG7D,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,CAC3D,CAAC,CAAC,CAAC,EACP,EAAG,CACP,EAAG,CAAC,EAAE,eAAiB,EAAE,OAAS,CAC1B,KAAM,UACN,IAAK,EAAGA,EAAM,QAAO,EAAG,CAAE,KAAM,KAAQ,CAAC,EAAE,KAAO,EAAGA,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,mBAAkB,CAAEA,EAAM,SAAU,CAAE,IAAK,CAAE,EAAG,EAAE,EAAGA,EAAM,YAAW,CAAEI,EAAwB,EAAG,CAC1K,WAAY,EAAE,MAAM,OAAO,KAC3B,aAAc,EAAE,KAChB,WAAY,CAAE,WAAY,CAAC,CAAE,EAC7B,SAAW,GAAM+D,EAAE,EAAG,CAAC,CAC3B,EAAG,CACC,QAAS,EAAGnE,EAAM,QAAO,KAAQ,CAAC,GAAG,EAAE,KAAO,EAAE,EAAGA,EAAM,mBAAkB,CAAE,MAAO,CAAE,gBAAiB,GAAI,EAAG,KAAM,EAAE,CAAC,CAAC,CAAC,EACzH,SAAU,EAAGA,EAAM,QAAO,KAAQ,CAAC,GAAG,EAAE,KAAO,CAAC,CAAC,CAAC,EAClD,EAAG,CACP,EAAG,EAAG,CACF,aACA,eACA,UACJ,CAAC,GAAI,EAAGA,EAAM,YAAW,CAAEI,EAAwB,EAAG,CAClD,UAAW,GACX,WAAY,EAAE,MAAM,OAAO,OAC3B,SAAW,GAAMgE,EAAE,CAAC,CACxB,EAAG,CACC,QAAS,EAAGpE,EAAM,QAAO,KAAQ,CAAC,GAAG,EAAE,KAAO,EAAE,EAAGA,EAAM,mBAAkB,CAAE,MAAO,CAAE,gBAAiB,GAAI,EAAG,KAAM,EAAE,CAAC,CAAC,CAAC,EACzH,SAAU,EAAGA,EAAM,QAAO,KAAQ,EAAE,EAAGA,EAAM,mBAAkB,CAAE,OAAQ,CAAE,UAAW,EAAE,UAAY,aAAe,EAAE,MAAM,SAAS,qBAAuB,EAAE,MAAM,aAAa,CAAC,oBAAqB,EAAG,KAAM,EAAG8D,EAAE,CAAC,CAAC,EACtN,EAAG,CACP,EAAG,EAAG,CAAC,aAAc,UAAU,CAAC,CAAC,EAAG,EAAE,IAAM,EAAG9D,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,CAAC,CAAC,EACzF,IAAK,GACT,EAAI,IAAK,EAAC,CAAC,EAAG,KAAM,CezyB9B,aAiBsB,QAQH,OACA,MAWL,qBAEf,uBAEgB,aAO0D,YAEnE,CAAA,EACL,CAEL,CAAA,EAAAqE,GAAA,CAAA,MAAA,mBAAA,EAAAC,IAAA,EAAAtE,EAAA,gBAAA,CAAA,CACD,OAAA,gBAEM,OAAiC,EAAUA,EAAM,YAA0B,CAAA,CAC/D,SAAA,CAAA,EAEE,OAAA,CAAA,EAAK,QAAA,CAAA,EAAgB,MAAA,CAAA,EAEpB,UAAO,CAAK,EAE5B,QAAA,CAAiB,EAGH,OAAgC,CAAA,EAExC,GAAA,CACL,KAAe,QAEpB,QAAA,IAAA,EACD,EAEe,mBAAqB,CAE/B,KAAiB,QACvB,QAAA,CAAA,CAEa,EAOe,YAAA,CAAA,KAA8B,CAAA,OAAA,OAAA,CAAA,EAEzD,mBAwCM,CApCN,KAEQ,OAAA,Ef0uBG,WAAY,CAAE,QAAS,OAAQ,EezuBhC,WAAU,Cf2uBL,KAAM,Qe1uBH,QAAA,CAAA,Cf4uBP,Ee3uBR,YAAA,CACA,KAAA,QACA,QAAc,CAAA,CACd,EACA,WAAA,CACA,KAAA,QACe,QAAA,CAAA,Cf6uBP,EACA,gBAAiB,CAAE,KAAM,OAAQ,EACjC,QAAS,CACL,KAAM,QACN,QAAS,CAAC,CACd,EACA,OAAQ,CAAC,EACT,QAAS,CAAE,QAAS,YAAa,CACrC,EAAG,CACC,SAAU,CAAE,SAAU,CAAC,CAAE,EACzB,kBenvBH,CAAA,EfovBG,OAAQ,CAAC,EenvBd,gBAAA,CAAA,EAAA,QAAA,CAAA,SAAA,CAAA,CAAA,EACa,iBAAA,CAAA,EfsvBR,MAAO,CAAE,QAASiD,CAAE,EervBd,eAAA,CAAA,CfuvBV,CAAC,EetvBL,OAAA,EAAAjD,EAAA,YAAA,CAAA,CAAA,eAAA,EAAA,CACQ,kBACR,gBACA,iBACQ,cACR,CAAA,EACA,MAAA,EAAc,CAAA,OAAA,EAAA,KAAA,GAAA,CACd,IAAA,EAAA,EAAA,GAAA,EAAAA,EAAA,IAAA,CAAA,IAAA,EAAA,GAAA,EAAAA,EAAA,SAAA,CAAA,EAAA,UAAA,EAAA,GAAA,EAAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,GAAA,EAAAA,EAAA,SAAA,CAAA,EAAA,SAAA,EAAA,GAAA,EAAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,EAAA,EACA,EAAA,MAAA4C,EAAA,EAAA,SAAA,CAAA,KAAA,CAAAF,CAAA,CAAA,EAAA,EAAA,kBAAA,CAAA,CAAA,IAAA,EAAA,KAAA,EACA,IAAU,EAAA,EAAA,QAAA,KAAmB,GAAA,EAAA,KAAA,EAAA,KAAA,EAC7B,EAAA,QAAA,EAAA,EAAA,SAAA,IAAA,EAAA,oBAAA,CAAA,IAAA,EAAAS,EAAA,IAAA,EAAA,aAAA,eAAA,CAAA,KAAA,EAAAC,EAAA,GAAA,IAAAH,EAAA,EAAA,MAAA,EACA,IAAA,EAAA,GAAA,CACe,IAAA,EACL,EAAA,QAAA,IAAA,EAAA,CAAA,GAAA,EAAA,OAAA,CAAA,GAAA,EAAA,gBAAA,CAAA,CACC,EAAA,EAAA,GAAA,CACD,GAAA,CAAA,EAAA,OAAA,CfwvBM,EAAE,eAAe,EACjB,MACJ,CACA,IAAI,EAAI,EAAE,OAAO,KAAM,GAAM,EAAE,KAAO,EAAE,EAAE,EAC1C,GAAI,CAAC,EACD,OACJ,IAAI,EAAI,CACJ,GAAG,EACH,GAAG,CACP,EAAG,EAAI,EAAE,OAAO,IAAK,GAAM,EAAE,KAAO,EAAE,GAAK,EAAI,CAAC,EAChD,EAAE,gBAAiB,CAAC,CACxB,EAAG,EAAK,GAAM,CACV,GAAI,CAAC,EAAE,OAAQ,CACX,EAAE,eAAe,EACjB,MACJ,CACA,IAAI,EAAI,EAAE,OAAO,OAAQ,GAAM,EAAE,KAAO,CAAC,EACzC,EAAE,gBAAiB,CAAC,CgBj5BC,EAE/B,OAAA,EAAA,CAAA,kBAAA,EAAA,CAAA,IAAA,CACJ,EAAA,OAAA,iBAAA,CAAA,CACe,CAAA,CAAA,GAAA,EAAA,MAAA,EAAAjD,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,MAAAqE,GAAA,CAAA,EAAA,cAAA,EAAArE,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAAgD,GAAA,CACR,IAAA,EACC,SAAA,EAAA,MACR,oBAAA,EAAA,KAAA,GAAA,EAAA,MAAA,EAUwB,OAAA,EAAA,MACR,kBAAA,EAAA,KAAA,GAAA,EAAA,MAAA,EACH,UAAA,EAAA,UACC,QAAA,EAAA,QAWiF,aAAA,EAAA,mBAGxE,WAAA,EAAA,WACN,QAAsC,EAAA,QACb,OAAU,EAAA,OACT,QAAU,EAAA,OAGZ,EAAA,KAAA,EAAA,CACxB,WACH,SACC,YACZ,UAGE,eAkBC,aAMmD,UACvD,SAC0C,SAC9B,CAAA,IAAA,EAAAhD,EAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,EAAA,EAAA,aAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAA+D,GAAA,CACP,IAAA,EAES,QAChB,qBACD,IAAA,EAYA,QAEiB,EAAS,MAaN,mBAAS,EAAA,KAAA,GAAA,EAAA,MAAA,EAET,MAAA,EAAA,MAGR,iBAAQ,EAAA,KAAA,GAA8B,EAClD,MAAY,EAiB2C,UAAA,EAAA,UACnB,OAAS,EAAA,MAQY,OAAA,EAAA,OAExC,GAAA,EAAA,GAIE,OAAoB,EAAS,YAE3C,cAAA,EAAA,mBAAW,aAAA,EAAA,mBAAY,WAAA,EAAA,WAAW,WAAA,EAAA,WAAS,SAAA,EAAA,iBAAA,EAAA,YAAU,QAAA,EAAA,QAA+B,OAAqB,EAAA,OAEnG,QAAoB,EAAA,QAGxB,WAAA,EAOH,YAAgB,EAWL,WAAqB,CAExB,EAAA,KAAQ,EAAM,CAgBiE,UAClE,QAGC,YAGH,SAIM,SAa+C,KACrD,SAA8B,gBAAM,eAAW,aAAQ,aAAO,WAAM,UAAQ,SAE/F,SAEa,CAAA,IAAM,EAAA/D,EAAA,mBACtB,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,EACA,CACC,CAAc,EAAAuE,EAAA,IAAW,CACX,GAAM,KACN,KAAA,EACA,cAAY,CAC3B,KAAA,QAGG,MAAQ,0BAQL,CASF,GAAAC,EAAS,CAKP,gBAAA,CAAA,EAMK,aACM,CAAA,EhBiuBX,cAAe,CAAC,CACpB,EAAGC,IAAM,EAAG,IAAM,CACd,IAAItD,EAAI,CAAC,EAAG,EAAI,CiBr+BV,gBAGWoD,GAEnB,EAAApE,EAAsD,EAAA,CAAA,CAAA,CAAA,SAAA,gBAAA,EACtC,aAAAoE,GAAA,EAAApE,EAAA,EAAA,CAAA,CAAA,CAAA,SAAA,aAAA,EACpB,cAAAoE,GAAA,EAAApE,EAAA,EAAA,CAAA,CAAA,CAAA,SAAA,cAAA,CACC,EAAM,EAAAF,EAAA,CACC,gBAAY,CAAA,EACb,aAAA,CAAA,EACC,cAAA,CAAA,CACR,EAAAuE,EACA,IAAA,IAAA7C,KAAAC,EACO,CAAA,EAAA,iBAAgBD,EAAA,OAAA,WAAmC,GAAA,GAAAA,EAAA,GAAA,IAAAR,EAAA,KAAA,EAAA,eAAA,EAAA,EAAA,gBAAA,CAAA,GAAA,CAAA,EAAA,cAAAQ,EAAA,OAAA,WAAA,GAAA,GAAAA,EAAA,KAAA,IAAAR,EAAA,KAAA,EAAA,YAAA,EAAA,EAAA,aAAA,CAAA,GAAA,CAAA,EAAA,eAAAQ,EAAA,OAAA,WAAA,GAAA,GAAAA,EAAA,IAAA,IAAAR,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,cAAA,CAAA,GAAAA,EAAA,KAAAQ,CAAA,EACzD,OAAYR,CjBk+BX,EiBj+BDuD,EAAM,IAAA,CACN,GAAA,EACD,aAAAC,GAAA,EAAA,KAAA,EAAA,EACA,cAAA,CACO,MAAA,2BACC,MAAK,CAAO,MAAA,EAAA,IAAA,CACnB,CjBk+BC,GiBj+BDC,IAAO,EAAA,EAAA,IAAA,CAAA,GAAA,EAAA,SAAA,EAAA,CAAA,GAAA,GAAA,OAAA,KAAAJ,CAAA,CAAA,CAAA,QAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAAC,GAAA,EAAA,IAAAC,CAAA,EAAA,CAAA,GAAAG,GAAA,GAAA,CACR,EAAA,EAAA,QAAA,MAAA,EAAA,EACA,IAAA,EAAA,SAAA,KACC,MAAM,GAAA,EAAA,QAAgB,2BAAsC,EAAA,EAAA,EAAA,EAAA,QAAA,8BAAA,EAAA,EAAA,EAAA,EAAA,QAAA,kCAAA,EAAA,EAAA,EAAA,EAAA,QAAA,iCAAA,EAAA,EAAA,EAAA,EAAA,QAAA,2BAAA,EAAA,EAAA,EAAA,EAAA,QAAA,kCAAA,EAAA,EAAA,EAAA,EAAA,QAAA,wBAAA,EAAA,EAAA,EAAA,EAAA,QAAA,uBAAA,EAAA,EAAA,EAAA,EAAA,QAAA,2BAAA,EAAA,EAAA,yCAAA,KAAA,CAAA,IAAA,EAAA,EAAA,QAAA,gCAAA,IAAA,GAAA,EAAA,CjBk+B3D,EiBj+BDC,GAAO,GAAK,CACZ,SAAM,KAAAC,EAAA,CAAA,CjBk+BL,EiBj+BDA,EAAO,GAAA,CACR,IAAA,EAAAC,EAAA,EAAA,EAAA,SAAA,SAAA,MAAA,GAAA,EAAA,EAAA,oBAAA,EAAA,GACA,EAAA,IAAA,YAAA,EAAA,EAAA,GAAA,IAAA,EAAA,GAAA,KAAA,EAAA,IAAA,aAAA,EAAA,SAAA,MAAA,CACO,UACC,WACD,UACC,QACR,SACA,SACC,CAAA,CAAA,SAAM,EAAA,EAAW,IAAK,EAAA,EAAA,GAAA,KACtB,IAAO,EAAK,WAAO,EAAA,IAAA,EAAA,EAAA,IAAA,EACnB,MAAM,GAAAH,GAAA,CAAA,EAAA,CjBk+BL,EiBj+BDG,MAAO,OAAA,MAAA,UAAA,OAAA,SAAA,KAAA,QAAA,OAAA,MAAA,UAAA,IAAA,EAAA,EAAA,OAAA,SAAA,KAAAL,GAAA,GAAA,CACR,IAAA,EAAA,EAAA,WAAA,MAAA,EAAA,EAAA,WAAA,EACA,MAAA,GAAA,EAAA,QAAA,KAAA,KAAA,EAAA,CjBk+BE,EiBj+BDM,IAAM,EAAA,IAAW,CACjB,IAAO,EAAK,EAAA,OAAO,SAAA,CAAA,EACnB,EAAM,EAAA,OAAA,GAAA,EAAA,OAAA,qBAAA,EACN,IAAO,GAAA,EAAAC,EAAA,qBAAA,CAAA,CAAA,EAAAxF,EAAA,EAAA,QAAA,kBAAA,MAAA,EAAAQ,EAAA,EAAA,QAAA,kBAAA,MAAA,EACR,GAAA,EAAA,MAAA,EAAA8D,EAAA,EAAA,CAAA,sBAAA,SAAA,CAAA,IAAAtE,EAAA,GAAAQ,EAAA,EAAA,CAAA,CAAA,EAAA,EAAA,aAAA,CAAA,QAAA,CAAA,CAAA,CACA,EAAAiF,GAAA,GAAA,CACC,IAAMlF,EAAA,EAAA,IAAW,4BAAqC,CAC/C,KACD,UACC,OACR,MACA,KACO,OACN,CAAA,EACA,OAAMA,EAAA,aAAA,CACC,QAAA,EAAA,EAAA+D,EAAA,EAAA,CAAA,KAAA,sBAAA,CAAA,CAAA,CAAA,CAAA,EACR,OAAA,EACA,EAAAA,EAAA,EAAA,CAAA,UAAA,OAAA,CAAA7D,EAAA,EAAA,MAAA,MAAA,CAAA,GACO,EAAA6D,EAA6C,EAAA,CAAG,KAAA,MAAA,GAC1C,EAAMA,EAAA,EAAA,CAAA,WAAA,MAAA,GACZ,EAAAA,EAAA,EAAA,CAAA,KAAA,MAAA,CACC,CACR,CAAA,EAAA,EAAA,QAAA,mBAAA,CAAA,EAAA,EAAA,QAAA,aAAA,EAAA,EAAA,IAAA,CACA,IAAA,EAAA,EAAA,KAAA,QAAA,SAAA,GAAA,EAAA,KAAA,SAAA,GAAA,EAAA,KAAA,QAAA,IAAA,EAAA,EAAA,KAAA,QAAA,KAAA,EAAA,KAAA,QAAA,OAAA,GAAA,IAAA,GACO,EAAA,OAAWY,GAAK,EAAA,OAAA,EAAA,CAAA,EAA6B,IAAG,EAAA,CAAA,CACtD,EAAA3E,CjBk+BC,EiBj+BDmF,GAAM,GAAA,EAAA,IAAA,2BAAA,EAAAC,GAAA,CAAA,MAAA,eAAA,EAAAC,IAAA,EAAAtF,EAAA,gBAAA,CAAA,CACN,OAAO,UACR,MAAA,CAAA,GAAA,CAAA,CAAA,EACA,MAAA,EAAA,CACO,IAAAmB,EAAAlB,EAAWP,GAAK,EAAAS,EAAmC,EAAA,CAAA,EAAAD,EAAA8E,EAAA,EAAA7F,EAAA,GAAA,CAC7C,IAAAc,EAAO,CACb,CACC,KAAA,WAAAC,EAAA,oBAAA,EAAA,GAAA,GACR,MAAAR,EAAA,OAAA,aAEQ,KAAO,IAKO,MAAY,GAOpC,EjBu9BoB,CiBl9BP,KAAA,WAAAQ,EAAA,oBAAA,EAAA,GAAA,GACL,MAAAR,EAAA,OAAA,cACE,KAAA,IACJ,MAAA,GjBo9Bc,EiB37BN,CAnBG,KAAA,WAAAQ,EAAA,qBAAA,EAAA,GAAA,GACC,MAAAR,EAAA,OAAA,eACQ,KAAA,IACH,MAAA,GjBi9BH,EACA,CACI,KAAM,WAAWQ,EAAE,uBAAuB,EAAE,GAAG,GAC/C,MAAOR,EAAE,OAAO,iBAChB,KAAM,IACN,MAAO,GACX,EACA,CiBz8BG,KAAA,WAAAQ,EAAA,sBAAA,EAAA,GAAA,GATM,MAAAR,EAAA,OAAA,eACX,KAAY,IACnB,MAAA,IACN,EACO,CjBq9BY,KAAM,WAAWQ,EAAE,qBAAqB,EAAE,GAAG,GiBj9BzD,MAAAR,EAFP,OACI6F,ejBo9Be,KAAM,IACN,MAAO,GACX,EACA,CACI,KAAM,WAAWrF,EAAE,kBAAkB,EAAE,GAAG,GkB9kCjC,MAOFR,EAA8E,OAUhG,YAIX,KAAA,IACiB,MAAA,GAA+B,EACjD,CAGkC,KAAA,WAAAQ,EAAA,iBAAA,EAAA,GAAA,WACT,MAAQR,EAAA,MAAA,YACvB,KAAA,IAEF,MAAe,GACN,EACH,CAEb,KAAA,WAAAQ,EAAA,iBAAA,EAAA,GAAA,SACD,MAAAR,EAAA,OAAA,WAEO,KAAA,IAMwB,MAAA,GAEjB,EAKf,ClB8iCwB,KAAM,WAAWQ,EAAE,iBAAiB,EAAE,GAAG,YACzC,MAAOR,EAAE,MAAM,SmBvlCN,KAAA,InBylCT,MAAO,GACX,EACA,CACI,KAAM,WAAWQ,EAAE,iBAAiB,EAAE,GAAG,WACzC,MAAOR,EAAE,MAAM,QACf,KAAM,IACN,MAAO,GACX,EACA,CACI,KAAM,WAAWQ,EAAE,oBAAoB,EAAE,GAAG,GAC5C,MAAOR,EAAE,OAAO,cAChB,KAAM,IACN,MAAO,GACX,CACJ,CAAC,CAAC,OAAQ,GAAM,CAAC,OAAO,QAAQS,EAAwB,EAAE,MAAM,WAAW,CAAC,CAAC,MAAM,CAAC,EAAG,KAAO,GAAK,EAAE,KAAK,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC,EAC7H,OAAO,EAAE,MAAM,SAAS,GAAG,EAAIF,EAAE,OAAQ,GAAM,EAAE,MAAM,EAAE,SAAW,GAAG,EAAIA,CAC/E,EACA,OAAQ,EAAG,MAAQ,EAAGD,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,EAAG,EAAGA,EAAM,MAAK,CAAEI,EAAwB,CAAC,EAAG,CAC1G,GAAIe,EAAE,GmBzmChB,MAEA,6BAkCc,MAAuB,CAAA,EAKvB,IAAA,GAEF,EAAQ,CAGb,aAAsB,EAAAnB,EAAA,QAAA,EAAA,CAAA,KAAA,KAAA,CAAA,IAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAAA,EAAA,SAAA,CAAA,IAAA,CAAA,EAAA,GAAA,EAAAA,EAAA,UAAA,CAAA,CAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAAA,EAAA,SAAA,MAAA,EAAAA,EAAA,WAAA,CAAAb,EAAA,EAAA,WAAA,EAAA,KAAA,EAAAa,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,EAAA,EAAAA,EAAA,MAAA,CAAAI,EAAA,CAAA,EAAA,CAG3B,KAAA,EAAA,KAMyC,MAAA,EAAA,MACvB,gBAAa,EAAA,KAC3B,aAAA,EAAA,KACC,EAAA,CACJ,SAAA,EAAAJ,EAAA,QAAA,KAAA,EAAA,EAAAA,EAAA,gBAAA,EAAA,EAAAA,EAAA,gBAAA,CAAA,EAAA,MAAA,MAAA,SAAA,EAAA,MAAA,EAAA,EAAA,CAAA,CAAA,CAAA,EAGR,EAAA,CAAsC,EAAA,KAAU,CACb,OACzB,QACY,gBACT,YACD,CAAA,EAAA,EAAA,GAAA,IAAA,EAAAA,EAAA,YAAA,EAAA,EAAAA,EAAA,MAAA,CAAAI,EAAA,CAAA,EAAA,CACN,KAAA,EAAA,YAAA,aACG,MAAA,EAAA,YAAA,aAGkD,MAAW,eAC/C,gBAAA,IACwC,OAAA,QAC7D,EAAA,CAC0D,SAAA,EAAAJ,EAAA,QAAA,KAAA,EAAA,EAAAA,EAAA,mBAAA,CAAA,OAAAqF,IAAA,EAAArF,EAAA,gBAAA,CAAA,EAAA,MAAA,MAAA,SAAA,EAAA,YAAA,aAAA,EAAA,EAAA,CAAA,CAAA,CAAA,EAI5C,EAAS,CAGzB,EAAA,KAAA,CAAA,OAAA,OAAA,CAAA,CAAA,EAAA,EAAA,IAAA,EAAAA,EAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,EAGyB,EAAA,CAHzB,EAAA,EAAA,CAAA,IAAA,CAAA,EAaK,CACL,CAAA,EAAIwF,GAAc,KAAoB,GAAA,IAAUC,GAAA,EAAOzF,EAAA,IAAA,CAAA,IAAA,EAAA0F,GAAA,EAAA1F,EAAA,WAAA,CAAA,EAAA2F,EAAA,GAAA,CAEjD,aAAwB,QAAA,6BAAAxF,EAAA,EAAA,MAAA,OAAA,KAAA,UAAA,CACtB,cAEc,EAUF,UAAY,KAAA,IAAA,EAAAqF,EAC5B,CAAc,CAAA,CAElB,EAAMI,OAAY,CACV,IAAA,EAER,aAA0B,QAAS,6BACVzF,EAAwD,EAAI,MAAA,MAEnE,EACnB,GAAA,CAAA,EAEU,OACT,GAAmB,CAAA,cAAAF,EAAA,UAAAkB,GAAA,KAAA,MAAA,CAAA,EACnB,GAAA,KAAA,IAAA,EAAAA,EAAA,CnBqhCW,aAAa,WAAW,6BAA+BhB,EAAwB,EAAE,MAAM,MAAM,EAC7F,MACJ,CmBlhCN,OAAIF,CACJ,EAAA4F,OAAM,CACL,EAAA,MAAY,KAAA,EAAA,MAAA,IAAA,GAAA,aAAA,WAAA,6BAAA1F,EAAA,EAAA,MAAA,MAAA,GAAA,EAAAE,EAAA,EAAA,CAAA,2BAAA,CACZ,EAAAyF,GAAA,CAAA,MAAA,8BAAoB,EAAAC,GAA4B,CAAkB,MAAS,aAApC,EAAAC,GAAA,CACvC,IAAO,EACP,MAAA,aACA,EAAAC,GAAOxD,CAAAA,MAAM,EAAAyD,GAAA,IAASC,IAAA,EAAAnG,EAAA,gBAAA,CAAA,CACtB,OAAA,kBACA,OAAc,EAAAA,EAAA,YAAA,CAAA,CAAA,WAAA,CAAA,EAAA,OAAA,CAAA,EAAA,SAAA,CAAA,KAAA,OAAA,EAAA,iBAAA,CAAA,EACd,eAAA,CAAA,EACD,YAAA,CAAA,EACM,YAAU,CAAA,EACf,YAAoB,CAAA,CACrB,EAAA,CACA,WAAA,CAAA,aAAA,CACA,GAAA,KACC,KAAA,EACD,EAAA,EACC,eAAA,CAAA,CACA,CAAA,EACA,MAAA,CAAA,mBAAY,EACN,MAAA,EAAA,CnBwhCG,IAAImB,GAAK,EAAGhB,EAAwB,EAAC,CAAE,EAAGT,EAAIO,EAAGC,GAAK,EAAGF,EAAM,SAAQ,CAAEC,EAAG,YAAY,EAAGd,EAAIgG,GAAGzF,EAAE,MAAM,EAAGwC,EAAIkD,GAAG1F,EAAE,MAAM,EAAGyC,GAAK,EAAGnC,EAAM,IAAG,CAAE4F,GAAG,CAAC,EAAGxD,GAAK,EAAGpC,EAAM,IAAG,CAAE,IAAI,EAAGuC,GAAK,EAAGvC,EAAM,MAAK,CAAE,EAAGwC,GAAK,EAAGxC,EAAM,SAAQ,KAAQN,EAAE,aAAeyB,EAAE,SAAS,cAAc,EAAGjC,GAAK,EAAGc,EAAM,SAAQ,KAAQ,CAAC0F,EAAE,OAAS,CAAChG,EAAE,iBAAmBgG,EAAE,MAAQA,EAAE,MAAM,OAAQ,GAAM,EAAE,KAAOhG,EAAE,gBAAgB,CAAC,EAAGuE,GAAK,EAAGjE,EAAM,SAAQ,KAAQ,CmBthC1a,GAAA,EAAA,CAAAmC,EAAA,OAmBZA,EAAA,QAjBgB,GAqBd,OAGFA,EAAA,MAAA+D,GAAA,SAAA,KnB+/BG,CAAC,EAAGE,EAAI,SAAY,CmBjgCrB,EAAA,QAAAjH,EAAA,KAAA,EACC,IAAyB,EAAE,MAAAsG,EAAA,MnBmgCvB,MAAO,GAAE,MAAQ,KAAM,CmB//B3BF,EAAMnG,EAAM,KAAA,IAAA,CnBigCR,IAAIa,EAAI,MAAMiC,EAAE,aAAa,CmBhgC5B,IAAA,EAAA,KACZ,KAAc,EAAA,IACR,CAAA,CAAA,CAAA,KAAA,EACC,GAAA,CAAAjC,EAAA,OAAA,CACD,GAAAyF,EAAA,OAANzB,EAAW,QAAA,SAAA,CnBkgCQ,IAAI9C,EAAIuD,EAAG,CmBn/Bd,GAAAzE,EAAA,OAVX,QAAAE,EAAA,EAAA,MAAA,OACC,KAAA,EAAA,KACE,IAAA,EAAA,KACc,GAAI,EnBggCH,MAAO,sBmB9/B9B,CAAA,EAIa,EAAAuF,EAAA,MAAA,UAAA,GAAA,EAAA,KAAA,CAAA,EAHN,EAAA,MAAA,CACQ,GAAAA,EAAA,MAAA,MAAA,EAAA,CAAA,EACRvE,EnBggCgB,GAAGuE,EAAE,MAAM,MAAM,CAAC,CACtB,EAAGvD,EAAE,QAAU,EAAE,OAAS,EAAGwD,EAAGxD,EAAE,KAAK,EAC3C,CACA8B,EAAE,QAAU,OAAS7B,EAAE,OAAO,WAAW,CAAC,CAAC,CAC/C,CACJ,EAAGiE,EAAK,SAAY,CAChB,GAAIX,EAAE,OAASzB,EAAE,QAAU,MACvB,OACJ,IAAI,EAAI,MAAMmC,EAAE,EAChB,EAAE,SAAW,EAAE,MAAQ,EAAE,OAC7B,EAAGjC,EAAI,SAAY,CACf,GAAIhC,EAAE,MACF,OACJ,IAAI,EAAI,MAAMiE,EAAE,EAChB,EAAE,SAAW,EAAE,MAAQ,EAAE,OAAS,IAAK,GAAGnC,EAAE,QAAU,UAAY,CAACyB,EAAE,QAAU,EAAE,MAAQ,EAAE,QAASvD,EAAE,OAASwD,EAAGxD,EAAE,KAAK,EAC7H,EACA,OAAQ,EAAGnC,EAAM,UAAS,CAAE,SAAY,CmBzgCzC,MAAImE,EAAG,CnB2gCN,CAAC,GAAI,EAAG,IAAM,CACV,IAAI,GAAK,EAAGnE,EAAM,iBAAgB,CAAE,WAAW,EoB5uCvD,OAAM,EAMDA,EAAiB,UACnB,CAAA,GAAO,EAAYA,EAAM,mBAQvB,CAAcA,EAAiC,SAAyC,KAAA,EAAA,EAAAA,EAAA,YAAA,CAAAK,EAAA,EAAA,CACzE,QAAA,cAEE,IAAI+B,EAG1B,MAAA,sBCRU,WAAAlC,EAAA,MAIN,sBACQ,EACnB,KAAW,GAAUD,EACrB,UAAqB,EAAAD,EAAA,MAAA,CAAA8E,EAAA,CAAA,CAAAnD,EAAA,EAAA,EAAA,EAAA,MAAAA,EAEK,MAAiBzC,EAAA,MAE1B,eAAA+E,EAAiB,QACxB,WAAiB,EAAAjE,EAAU,MAAI,CAAA0F,CAAA,IAAA,IAAA,GAStC,MAAA/D,EAAA,MAAA,SAEC,gBAE+B,YAEA1B,EAAA,YACjC,aAAA,CACY,KACI,OACD,KACA,EAChB,YAAAuC,EAAA,MAEY,aAEZ,GAI2B,IAELyB,EAAA,QAA4B,OAAA,EAAAjE,EAAA,MAAA,CAAAb,CAAA,EAAA,IAAA,GAKzC,mBAAA8E,EAAA,QAAA,OAAA,GAAA,KAAA,EAAAjE,EAAA,MAAA,CAAAiF,EAAA,CAAA,CAAA,GAAA,CAAA,EAAA,IAAA,GAIT,SAAY,GAGQ,qBAAA,GAEQ,2BAAsB,GAChB,0BAEe,EAAAjF,EAAA,MAAA,CAAAsG,EAAA,QAAA,EAM3C,oBAAA,GAQkG,YAAArG,EAAA,YAC7F,eAAoCA,EAAA,eAM8C,aAAAb,EACxD,OAAAiH,CAEzB,EAAA,CAIW,MAAkB,EAAArG,EAAA,QAAA,EAAA,CAAA,KAAA,KAAA,EAAA,EAAAA,EAAA,mBAAA,CAAA,MAAA8F,GAAA,CAAA,EAAA,KAAA,EAAA9F,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAAA,EAAA,SAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAAA,EAAA,gBAAA,EAAA,EAAAA,EAAA,gBAAA,EAAA,EAAAA,EAAA,MAAA,CAAAuG,EAAA,QAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,CAAA,GAAA,EAAAvG,EAAA,mBAAA,CAAA,OAAA+F,GAAA,QAAA,EAAA/F,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAAA,EAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAAA,EAAA,eAAA,MAAA,EAAAA,EAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,IAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,MAAAgG,IAAA,EAAAhG,EAAA,gBAAA,CAAA2B,EAAA,MAAA,SAAA,WAAA,EAAA,KAAA,CAAA,IAAA,EAAA3B,EAAA,gBAAA,CAAA,KAAA,EAAAA,EAAA,gBAAA,CAAA,EAAA,IAAA,EAAA,CAAA,CAAA,EAAA,EAAA,EAAA,CAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAAA,EAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAEzCC,EAAA,WAAA,EAAAD,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,IAAA,CACD,IAAA,EAIuB,MAAM,+BACG,MAAA,EAAAA,EAAA,MAAA,CAAA+E,CAAA,CAAA,CAAA,EAAA,EAAA,CAC1B,EAAA,KAAA,EAAAkB,EAAA,IAAA,EAAAjG,EAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,EACK2B,EAAA,MAAA,MAAA,UAAA,EAAA3B,EAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,IAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAA,EAAA,CAC2B,IAAA,EAC7B,KAAA,EAAA,aACP,gBAAA,IAEkB,MAAA,QACpB,OAAA,SAEyB,QAAA,EAAA,MAAA,EAAAA,EAAA,cAAA,KAAA,CAAA,EAAA,CAAA,MAAA,CAAA,CACO,EAAA,KAAA,EAAA,CAAA,MAAA,CAAA,IACP,EAAAA,EAAA,YAAA,CAAAI,EAAA,EAAA,CACiB,IAAY,EAAAJ,EAAA,MAAA,CAAAuC,CAAA,EACP,IAAA,IACQ,MAAA,CAAA,EACrD,KAAA,CAAA,YAAA,CAAA,CAEkB,EAAA,CACnB,SAAA,EAAAvC,EAAA,QAAA,KAAA,EAAA,EAAAA,EAAA,YAAA,CAAA,EAAA,CAQ4C,MAAA,qBACN,gBAAA,IAEtB,MAAyB,OChJ5B,CAAA,CAAA,CAAA,EACd,EAAA,CACK,EAAA,EAAA,CAAA,KAAA,MAAA,CAAA,CACE,EAAA,EAAA,IAAA,EAAAA,EAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,EACI,EAAA,CACX,EAAA,EAAA,CACA,aACK,QACE,iBACI,QACX,cACA,cACK,MACE,qBACI,2BACX,cACA,gBACK,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAAsF,GAAA,CAAA,IAAA,EAAAtF,EAAA,MAAA,CAAAuC,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,IAAA,CAAA,CAAA,EAAA,EAAA,CACE,CACN,CACD,CAAA,EAAAiE,EAAA,GAAA,IAAA,EAAAC,EAAA,GAAA,EAAA,KAAA,IAAA,EAAA,UAAA,CAAA,EAAA,EAAAC,GAAA,EAAA,IAAA,CACA,EAAAD,EAAA,CAAA,EACK,IAAA,EAAA,EAAA,KAAA,GAAA,EAAA,KAAA,CAAA,EACE,GAAA,EACI,OAAA,CACX,EAAAE,IAAA,EAAA,EAAA,IAAA,CACA,IAAA,CAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAAA,EAAA,GAAA,EAAA,MAAA,IAAA,EAAA,QAAA,CAAA,EAAA,EAAA,QAAA,QACK,IAAA,EAAAC,EAAA,EAAA,iBAAA,MAAA,CAAA,EACE,OAAA,EAAA,UAAA,IAAA,iBAAA,EAAA,EAAA,cAAA,EAAA,UAAA,IAAA,+BAAA,aAAA,kBAAA,iBAAA,EAAA,EAAA,cAAA,EAAA,UAAA,IAAA,wBAAA,EAAA,EAAA,OAAA,UAAA,EAAA,UAAA,IAAA,wBAAA,EAAA,EAAA,OAAA,UAAA,CAAA,EAAA,SAAA,EAAA,UAAA,IAAA,+BAAA,EAAA,EAAA,OAAA,UAAA,EAAA,SAAA,EAAA,UAAA,IAAA,gCAAA,EAAA,EAAA,QAAA,GAAA,CACI,EAAA,eAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,KACX,IAAA,GAAA,EAAA5G,EAAA,IAAA,CAAA,EAAA,UAAA,EAAAE,EAAA,CACA,MAAA,EACK,KAAA,EAAA,KACE,SAAA,EAAA,SACI,QAAA,EAAA,QACX,QAAA,EAAA,OACA,GACK,EAAA2G,EAAA,QAAA,CAAA,EAAA,uBAAA3G,CAAA,EAAA,OAAA,EAAA,QAAA,kBAAA,EAAAF,EAAA,MAAA,CAAA,EAAA,UAAA,IAAA,EAAAA,EAAA,MAAA,CAAA,MAAA,CACE,EAAA,WAAA,EAAA,MAAA8G,EAAA,EAAA,EAAA,CAAA,CACI,CAAA,EAAA,EAAA,MAAA,CACX,GAAA,EAAA9G,EAAA,MAAA,CAAA,EAAA,UAAA,GAAA,EAAAA,EAAA,MAAA,CAAA,EAAA,eAAA8G,EAAA,EAAA,EAAA,CAAA,CAAA,GAAA,EAAAD,EAAA,QAAA,CAAA,EAAA,uBAAA,GAAA,CACA,EAAA,WAAA,EACK,IAAA,GAAA,EAAAA,EAAA,QAAA,CAAA,EAAA,sBAAA,EACE,IAAA,EAAA,MAAA,MAAA,GAAAC,EAAA,EAAA,EAAA,CAAA,CACN,CAAA,EAAUA,EAAA,EAAA,EAAA,CAAA,EAAA,CACX,EAAAC,IAAA,EAAA,IAAA,EACA,EAAAF,EAAA,QAAA,CAAA,EAAA,sBAAA,CAAA,GAAA,CAAA,CACC,EAAIC,GAAA,EAAA,EAAA,IAAA,CACE,IAAA,GAAA,EAAA9G,EAAA,MAAA,CAAAC,EAAA,UAAA,EACN,GAAU2B,EAAA,UAAA,OAAA,8BAAA,CAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAAA,EAAA,UAAA,OAAA,4BAAA,EAAA,OAAA,CAAA,EAAA3B,EAAA,OAAA,UAAAA,EAAA,QAAA,CACX,EAAA,UAAA,QAAAkB,EAAA,QACD,MtBwyCQ,CACA,GAAI,EAAE,UAAY,GAAI,CAAC,EAAE,QAAUlB,EAAE,OAAS,SAAU,CACpD,IAAIA,EAAI+G,GAAG,CACP,GAAI,MACJ,QAAS,GACT,MAAO,EAAG7G,EAAwB,EAAC,CAAE,CAAC,CAAC,QAAQ,UAAY,GAC3D,MAAO,EACX,CAAC,EACDyB,EAAE,OAAO3B,CAAC,CACd,CACA,EAAE,QAAS,GAAM,CACb,IAAI,EAAI+G,GAAG,CACP,GAAIP,EAAE9E,CAAC,EuBj2Cf,QAAA+E,EAAA/E,EAAA1B,EAAA,IAAA,CAAA,EAAA,UAAA,GvBm2CQ,KAAMyG,EAAE/E,EAAG1B,EAAE,IAAI,CAAC,EAAE,MAAQ,GAC5B,MAAOwG,EAAE9E,CAAC,IuBp2CqDA,EAAA,WAAA,UvBq2CnE,CAAC,EACDC,EAAE,OAAO,CAAC,CuBj2CnB,CAAA,CACA,EAAAoF,GAAA,GAAA,CACA,IAAO,EAAA,SAAA,cAAA,KAAA,EvBm2CF,OAAO,EAAE,UAAU,IAAI,yBAAyB,EAAG,EAAE,UAAU,OAAO,yBAA0B,CAAC,CAAC,EAAE,KAAK,EAAG,EAAE,UAAU,OAAO,2BAA4B,EAAE,QAAU,UAAU,EAAG,EAAE,QAAQ,OAAS,EAAE,GAAI,EAAE,QAAQ,aAAe,EAAE,QAAS,EAAE,MAAQ,EAAE,KAAM,CACvQ,EAAGC,GAAK,CACJ,CACI,GAAI,IACJ,KAAM,cACN,SAAU,GACd,EACA,CACI,GAAI,IACJ,KAAM,MACN,SAAU,GACd,EACA,CACI,GAAI,IACJ,KAAM,SACN,SAAU,GACd,EACA,CACI,GAAI,IACJ,KAAM,SACN,SAAU,GACd,EACA,CwBl4CM,GACR,IAeH,KAAA,OACA,SAAiC,GAU9B,EAME,CAUF,GAAmB,IACX,KAAO,SACT,SAAkB,GAElB,EAUN,CACM,GAAO,IAQG,KAAkB,QAE5B,SAGD,GAEN,EAEM,CAaX,GAAA,IxB2zCY,KAAM,UwBtzCV,SAAA,GxBwzCA,EACA,CACI,GAAI,IACJ,KAAM,YACN,SAAU,GACd,EACA,CwBtzCA,GAAO,KxBwzCH,KAAM,YACN,SwBlzCR,IAAA,CxBozCA,EwBxzCAC,GAAA,CACA,cACA,oBACA,OxByzCA,EAAGC,GAAsB,EAAGnH,EAAM,gBAAe,CAAE,CAC/C,OAAQ,UACR,MAAO,CACH,GAAI,CAAC,EACL,QAAS,CAAC,EACV,KAAM,CAAC,EwBlzCV,MAAA,CAAA,CxBozCD,EwB5zCL,MAAI,EAAA,CACE,OAAA,EAAA,MAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,MAAA,CACL,OAAiB,EAAAA,EAAM,eAAA,CAAA,CAEvB,0BAA8B,CAAA,EAMhB,yBAEP,CAAA,CAAA,EAAA,MxBszCS,2BAA4B,EAAE,QAAU,UwB9yCxD,CAAA,EACM,cAAA,EAAA,GACO,oBAAU,EAAA,QAXxB,MAKQ,EAAA,IxBuzCC,EAAG,KAAM,GAAIkH,EAAE,EwB1zCvB,CxB4zCA,CwB3zCA,EAAAE,GAAM,CAAA,kBAAA,WAAA,EAAAC,IAAA,EAAArH,EAAA,gBAAA,CAAA,CACL,OAAO,mBxB4zCJ,OAAsB,EAAGA,EAAM,YAAW,CAAE,CACxC,SAAU,CAAE,KAAM,OAAQ,EAC1B,SAAU,CAAE,KAAM,OAAQ,EAC1B,WAAY,CAAE,KAAM,OAAQ,EAC5B,GAAI,CAAC,EACL,QAAS,CAAC,EACV,KAAM,CAAC,EACP,MAAO,CAAC,CACZ,EAAG,CACC,KAAM,CAAE,SAAU,CAAC,CAAE,EACrB,cAAe,CAAC,CACpB,CAAC,EACD,OAAsB,EAAGA,EAAM,YAAW,CAAE,CACxC,cACA,WACA,UACA,QACJ,EAAG,CAAC,aAAa,CAAC,EAClB,MAAM,EAAG,CAAE,KAAM,GAAK,CAClB,IAAI,EAAI,EAAG,EAAI,EAAG,GAAK,EAAGA,EAAM,SAAQ,CAAE,EAAG,MAAM,EAAG,GAAK,EAAGA,EAAM,IAAG,CAAE,IAAI,EAAG,GAAK,EAAGA,EAAM,SAAQ,KAAQ,UAAU,UAAU,QAAQ,SAAS,GAAK,GAAK,CAAC,EAAI,CAC9J,gBAAiB,EAAE,MACnB,QAAU,GAAM,EAAE,eAAe,CACrC,CAAC,EAAG,GAAK,EAAGA,EAAM,IAAG,CAAE,CAAC,CAAC,EAAG,EAAI,SAAY,CACxC,EAAE,MAAQ,CAAC,EAAG,MAAO,EAAGA,EAAM,SAAQ,CAAE,EAAG,EAAE,OAAO,MAAM,CyB18C5D,EAER,MAAwC,CAQ7C,IAAA,EAAA,EAAA,OAAA,UACY,GAAA,CAAA,EACI,OAAA,EAAA,EACD,EAAA,QAAA,EAAA,MAAA,UAAA,GAAA,EAAA,MAAA,CAAA,EAAA,EAAA,cAAA,CAAA,CACN,EAAM,EAAA,SAAA,CAChB,EAAA,QAAA,EAAA,MAAA,UAAA,EAAA,MAAA,EAAA,MAAA,CAAA,CzBm8CY,EAAG,EAAK,GAAM,CACV,GAAI,EAAE,OAAS,EAAE,SyBp5Cf,OzBs5CF,IAAI,EyBv5CN,WAxCL,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,OAAA,IAAA,EAAA,IAAA,IAAA,IAAA,EAAA,UAAA,EAAA,IAAA,YAAA,EAAA,QAAA,EAAA,IAAA,YAAA,EAAA,SAAA,CzBi8CG,EACA,OAAQ,EAAG,MAAQ,EAAGA,EyBl8CkD,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAAI,EAAA,EAAA,CzBm8CpE,OAAQ,EAAGJ,EyBn8CsG,eAAM,CAAA,CzBo8CnH,8ByBp8C8J,CAAA,EzBq8C9J,qCyBr8CoN,EAAA,MzBs8CpN,uCyBt8CkR,EAAA,SzBu8ClR,yCyBv8C6V,EAAiB,WzBw8C9W,yByBx8Cia,CAAA,CAAA,EAAA,MzBy8Cja,2ByBz8Cse,EAAA,QAAM,UzB08Chf,CAAC,EyB/7CR,SAAA,EAAAA,EAAA,cAAA,CAAA,EAAA,CAAA,MAAA,CAAA,CACL,EAAA,CAEO,SAAA,EAAAA,EAAA,QAAA,KAAA,EASL,EALMA,EAAA,YAAgB,CAAAmH,EAAA,CzB67CJ,GAAI,EAAE,GyB57CtB,KAAA,EAAA,MACK,QAAA,EAAA,QACK,MAAO,EAAA,KACd,EAAA,KAAA,EAAA,CzB87Ca,KyBl7CK,OACI,UACH,OACE,CAAA,GzBo7CX,EAAGnH,EAAM,mBAAkB,CAAE,QAAS,EAAGA,EAAM,WAAU,CAAE,CACxD,QAAS,SACT,IAAK,EACL,MAAO,kCACP,gBAAiB,EAAE,MAAQ,iBAAmB,CAAC,CACnD,EAAG,EAAE,MAAO,CAAE,UAAW,EAAE,EAAGA,EAAM,SAAQ,EAAG,EAAGA,EAAM,cAAa,CAAE,EAAG,CAAC,MAAM,CAAC,EAAG,CAAC,OAAO,CAAC,GAAI,EAAGA,EAAM,SAAQ,EAAG,EAAGA,EAAM,cAAa,CAAE,EAAG,CAAC,MAAM,CAAC,EAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAI,EAAGA,EAAM,gBAAe,CAAE,EAAE,KAAK,EAAG,GAAIoH,EAAE,EACrN,EAAE,WAAa,EAAGpH,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,mBAAkB,CAAEA,EAAM,SAAU,CAAE,IAAK,CAAE,EAAG,CAAC,EAAE,QAAU,EAAGA,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,mBAAkB,CAAE,OAAQ,CAClK,IAAK,EACL,gBAAiB,IyBp9CT,MAAA,uBAAtB,SAAA,EAAAA,EAAA,cAAA,CAAA,EAAA,CAAA,MAAA,CAAA,CAAoB,CAAA,KAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,OAAA,CzBw9CN,IAAK,EACL,gBAAiB,IACjB,MAAO,uBACP,QAAS,CACb,CAAC,EAAE,EAAG,EAAE,IAAM,EAAGA,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,CACzD,CAAC,EACD,EAAG,CACP,EAAG,EAAG,CAAC,OAAO,CAAC,EACnB,CACJ,CAAC,EAAGsH,GAAK,CAAE,IAAK,CAAE,EAAGC,GAAsB,EAAGvH,EAAM,gBAAe,CAAE,CACjE,aAAc,CAAC,EACf,OAAQ,cACR,OAAsB,EAAGA,EAAM,YAAW,CAAE,CACxC,WAAY,CAAC,EACb,GAAI,CAAC,EACL,KAAM,CAAC,EACP,KAAM,CAAC,EACP,SAAU,CAAC,EACX,QAAS,CAAC,EACV,aAAc,CAAE,KAAM,OAAQ,EAC9B,QAAS,CAAC,EACV,QAAS,CAAC,CACd,EAAG,CACC,WAAY,CAAE,SAAU,CAAC,CAAE,EAC3B,eAAgB,CAAC,CACrB,CAAC,EACD,MAAO,CAAC,mBAAmB,EAC3B,MAAM,EAAG,CACL,IAAI,EAAI,EAAG,GAAK,EAAGA,EAAM,SAAQ,CAAE,EAAG,YAAY,EAAG,EAAI,EAAE,aAAeG,EAAwB,EAAI,MAAO,EAAI,EAAE,aAAe,OAAS,UAAW,EAAI,CACtJ,MAAO,EACP,KAAM,EAAE,KACR,SAAU,EAAE,SACZ,QAAS,EAAE,QACX,QAAS,EAAE,OACf,EACA,OAAQ,EAAG,IAAM,C0B5gDvB,IAAQ,GAYR,EAAwCH,EAAA,iBAOjC,CAAkB,UAE9B,EAKY,OAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAAI,EAAA,EAAA,CAAA,GAAA,EAAA,EAAA,EAAA,CACK,SAAA,EAAAJ,EAAA,QAAA,KAAA,EAAA,EAAAA,EAAA,eAAA,GAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,EAAA,EAAAA,EAAA,wBAAA,EAAA,EAAAA,EAAA,MAAA,CAAA,CAAA,CAAA,GAAA,EAAAA,EAAA,WAAA,CAAA,CAGmB,MAAA,CAId,kBAEjB,CAAA,EAMoC,+BAEnC,EAAA,aACS,yBAAA,CAAA,EAAA,aAAS,kBAAA,EAAA,aAAgC,yBAAA,EAAA,OAAA,SACrC,gCAAA,EAAA,OAAA,UAAA,CAAA,EAAA,QAAS,iCAAA,EAAA,OAAA,UAAA,EAAA,QAAwC,8BAAA,CAAA,EAAA,MAAA,QAAA,EAAA,MAAA,SAAA,EAClD,4BAAA,EAAA,MAAA,OAAA,CAAS,EAA6B,MAAS,QAE1D,QAAA,EAAA,OAQqC,EAAA,EAAA,MAAA,EAAA,GAC5C,EAAAA,EAAA,MAAA,CAAA,CAAA,IAAA,EAAAA,EAAA,QAAA,KAAA,CAAA,CAAA,EAAA,MAAA,QAAA,EAAA,OAAA,WAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAAmH,EAAA,CACM,IAAA,EACI,GAAA,MACD,QAAA,GACA,KAAA,EAAA,MAAA,OAAA,UAAA,GACT,MAAA,EAEkB,EAAA,KAAA,EAAA,CAAA,MAAA,CAAA,IAAA,EAAAnH,EAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,EAAA,EAAA,OAAA,UAAA,EAAA,UAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAA,MAAAsH,GAAA,EAAA,EAAAtH,EAAA,WAAA,CAAA,EAAA,OAAA,SAAA,CAAA,CAAA,KAAA,EAAAA,EAAA,UAAA,CAAA,CAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAAA,EAAA,SAAA,CAAA,IAAA,CAAA,GAAA,EAAAA,EAAA,WAAA,CAAA,EAAA,MAAA,KAAA,EAAAA,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,YAAA,CAAAmH,EAAA,CACkB,IAAA,EAAAnH,EAAA,MAAA,CAAAyG,CAAA,CAAA,CAAA,CAAA,EACpC,SAAA,EAAAzG,EAAA,MAAA,CAAA0G,CAAA,CAAA,CAAA,EAAA,EAAA,IAAA,CAAA,EAAA,UAAA,GAK+B,MAAA,EAAA1G,EAAA,MAAA,CAAA0G,CAAA,CAAA,CAAA,EAAA,EAAA,IAAA,CAAA,EAAA,MAAA,GAG1B,OAAM,EAAA1G,EAAA,MAGP,CAAAyG,CAAO,CAAA,CAAA,CAAA,IAAM,EAAA,WAEH,UAGoE,EAAA,KAAA,EAAA,CAC7D,KACS,UAEA,OAC9B,OAG+B,CAAA,EAAM,EAAA,GAAM,EAAA,CAAA,EAK+C,EAAA,CAGrE,EAAA,KAAM,CAAA,QAAY,SAAO,CAAA,GAAc,CAAA,CAGxD,EAyCO,EACc,sBACD,CAAA,CAAA,CAAA,CAAA,EACtB,EAAA,CAIiB,EAAe,EAAA,CAAA,IAAA,CAAA,CACxB,CAKV,CACA,CAAA,EAKKe,IAAe,EAAAxH,EAAA,gBAAA,CAAA,CACd,OAAU,cACX,OAAkC,EAAAA,EAAA,YAAA,CAAA,CAEzB,WAAW,CAAA,EAEd,KAAK,CAAA,EACX,aAAY,CAAA,KAAA,OAAA,EACV,QAAA,CAAA,QAAA,EAAA,EACN,GAAU,CAAA,EAGN,WAAe,CAAK,KAAK,OAAA,EAGf,kBAA2B,CAEnC,KAA2B,QAIjB,QAAA,CAAA,CAMR,EAER,iBAAA,CAAA,EACD,UAAA,CAAA,QAAA,GAAA,EAEgB,aAAa,CAEpB,KAAA,QAKC,QAAA,CAAA,CAER,EACM,QAAU,CAAI,CACnB,EAAK,CAEC,WAAmB,CAAA,SAAS,CAAK,CAAA,EAGjC,eAAwB,CAAA,EACxB,KAAK,CAAO,SAAA,EAAAA,EAAA,SAAA,CAAAiH,EAAA,CAAA,EAEX,cAAsB,CAAA,CACjB,CAAA,EACX,OAEwB,EACdjH,EAAW,YAAU,CAAa,CAO9C,WACA,SAIc,aACH,EAAG,CAAA,oBAEC,aAAc,CAAA,EAGhC,MAAA,EAAA,CAAA,KAAAb,GAAA,C1B62CY,IAAIgD,GAAK,EAAGhC,E0Bl2CrB,EAAA,CAAA,EAAAiC,EAAAlC,EAAAmC,GAAA,EAAArC,EAAA,SAAA,CAAAE,EAAA,YAAA,EAAAoC,GAAA,EAAAtC,EAAA,SAAA,CAAAE,EAAA,MAAA,EAAAqC,EAAApD,EAAAqD,GAAA,EAAArC,EAAA,EAAA,EAAA,EAAA,IAAA,CANQoC,EAAA,EAAA,CAAA,C1B02CC,EAAGH,EAAE,SAAS,E0Bz2CvBA,EAAA,YAAA,CAAAC,EAAA,MAAA,SAAA,EAAA,MAAA,CAAAC,EAAA,MAAA,EAAA,CAAA,EAAA,GACA,IAAApD,EAAAkD,EAAA,IAAA,gBAAA,KAAA,OAAA,EAAA6B,GAAA,EAAAjE,EAAA,IAAA,CAAA,KAAA,EAAAkE,MAAA,CACA,IAAA,EAAA,IAAA/B,EAAA,OAAA,MAAA,YAAA,EAAA,EAAA,IAAA,IACI,OAAA,EAAA,IAAA,MAAA,CACJ,MAAA,M1B22CiB,MAAOA,EAAE,OAAO,IAAM,CAC1B,CAAC,EAAG,EAAE,IAAI,UAAW,CACjB,MAAO,UACP,MAAOA,EAAE,OAAO,QAAU,CAC9B,CAAC,EAAG,EAAE,IAAI,SAAU,CAChB,MAAO,S0BzyCf,MAAAA,EAAA,OAAA,OAAA,CAnET,CAAA,EAAA,CACO,EAAAiE,GAAW,EAAApG,EAAA,WAAA,CAAA,CACd,MAAAqC,EACC,KAAA,SACL,SAAqB,IAAA,G1B+2CR,QAAS,IAAK,G0Bl1CN,QAQnB,IAAA,EANY,CAAA,G1Bm1CJ,EAAGrC,EAAM,MAAK,CAAEqC,MAAS,C0Bl1C/BG,EAAA,WAAAH,EAAA,KAAA,CACH,CAAA,EACOI,IAAAA,GAAM,EAAAzC,EAAO,SAAQ,KAAA,CACpB,GAAOoG,EAAA,MAAM,OAAM,UAAMhE,EAAA,kBAAA,CAAAgE,EAAA,MAAA,QAC1B,OAAAA,EAAA,MAAE,MAAO,MAAM,QAAKhE,EAAA,gB1Bo1CnB,CAAC,EAAGgC,EAAK,GAAM,C0Bn0CtB,GAAA,IAba,MAAA,CACJ,GAAAgC,EAAA,MAAA,MAAA,MAAA,SAAA,CAAA,EACD,MAAA,WACK,GAAAA,EAAA,MAAA,MAAA,MAAA,SAAAI,EAAA,CAAA,CAAA,EACH,MAAA,UACmB,CAC7B,OAAY,IAAO,OAAI,CAAAJ,EAAA,MAAkB,MAAA,MAAA,OAAA,WAAA,EACzC,EAAUqB,GAAA,EAAA,IAAA,CACA,IAAA,EAAAjB,EAAY,CAAA,EAAsB,EAAEJ,EAAA,MAAA,MAAA,MAAA,OAAA,GAAA,IAAA,GAAA,IAAA,CAAA,EAC9C,IAAQ,UAA0B,EAAA,KAAA,CAAA,EAAA,IAAA,WAAA,EAAA,KAAA,CAAA,EAAAA,EAAA,MAAA,OAAA,UAAAA,EAAA,MAAA,WAAA,IAAA,IAAAhE,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,GAAA,EAAA,EAAA,SAAA,GAAAgE,EAAA,MAAA,MAAA,MAAA,SAAA,GAAAA,EAAA,MAAA,MAAA,MAAA,KAAA,MAAA,EAAA,EAAA,OAAA,GAAA,IAAA,GAAA,IAAAhE,EAAA,YAAA,CAAAgE,EAAA,MAAA,UAAA,EAAA,SAAA,EAAAA,EAAA,MAAA,MAAA,OAAA,EAAA,OAAA,IAAA,EAAA,CAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAAhE,EAAA,KAAAA,EAAA,KAAA,UAAA,GAAA,EAAA,KAAA,CAAA,EAAAA,EAAA,KAAA,UAAA,GAAA,EAAA,KAAA,CAAA,EAAA,CAAA,EAAA,EAAA,MAAA,MAAA,MAAA,EAAAgE,EAAA,MAAA,OAAA,UAAAA,EAAA,MAAA,WAAA,IAAA,IAAA5D,EAAA,SAAA,CAC5B,QAAwB,EACvB,SAAwB4D,EAAE,MAAA,SACjC,QAAWA,EAAA,MAAA,OAAa,CAAA,CAAkD,EAAAsB,GAAA,EAAA1H,EAAA,SAAA,KAAA,C1Bo1C/D,IAAI,EAAI,wBACR,OAAOoG,EAAE,MAAM,OAAS,WAAa,GAAK,iCAAkCA,EAAE,MAAM,OAAS,WAAa,GAAK,iCAAkC,CACrJ,CAAC,EAAGuB,MAAW,CACX,IAAI,EAAI,OAAO,GAAI,SAAS,EAC5B,GAAI,CAAC,GAAK,IAAM,UACZ,OACJ,IAAI,EAAIrF,EAAE,MAAM,OAAS,EACzBA,EAAE,MAAM,KAAK,CACT,GAAI,OAAO,CAAC,EACZ,KAAM,EACN,SAAU,QAAQ,EAAI,GAAK,GAAK,CAAC,CACrC,CAAC,EAAGC,EAAE,cAAeD,EAAE,KAAK,CAChC,EAAGsF,EAAK,GAAM,C0B51ChB,GAAA,EAAgB,OAAK,EAAAf,EAAS,QAAA,CAAW,EAAA,cAAW,sBAKxC,EAAA,CAAAT,EAAA,M1By1CF,MAAM,MAAM,gEAAgE,E0B71C5F,GAAAA,EAAc,MAAA,UAAA,EAAA,MAAA,MAAA,EAAA,MAAA,MAAA,MAAA,CAAA,GAAA,CAAAjG,EAAA,EAAA,GAAA,GAAA,SAAA,CACK,QAAA,KAAA,wEAAA,E1B+1CH,MACJ,CACA,CAACA,EAAwB,EAAE,MAAM,UAAY,CAACA,EAAwB,EAAE,MAAM,YAAcmC,EAAE,OAAS,EAAE,EAAE,OAAO,CAAC,CAAC,SAAS,CACzH,MAAO,iDACP,OAAQ,+DACR,SAAU,G0B35CG,KAAI,SAAiB,EAAA,EAAA,CAAzC,GAAA,CAAAA,EAAA,MAIR,OAFQ,IAAA,EAAA,EAAA,EAAA,IAAA,CAAA,CAAA,OAAA,CAAA,CAAA,KAAA,eAAA,EAAA,EAAA,CAAA,E1B85CW,EAAE,MAAM,EAAG,IAAM,C0B75CJ,GAAA,CAAAA,EAAA,M1B+5CL,OACJ,IAAI,EAAI,EAAE,CAAC,CAAC,CAAC,KAAK,aAAa,E0B55C1B,EAAA,KAAI,CAAA,CAAxB,CAAA,EAAAA,EAAA,MAAA,MAAA,EAAA,IAAA,EAAA,UAAA,GAAA,IAAA,EAAA,EAAA,EAAA,EAAA,UAAA,GAAA,IAAA,EAAA,EAAA,CAAA,EAAAE,EAAA,cAAAF,EAAA,KAAA,CAGE,C1B65CC,CAAC,CACL,EAAGuF,EAAK,GAAM,C0B35CrB1H,EAAO,EAAA,GAAY,GAAA,UAAA,EAAA,EAAA,OAAA,CAAA,CAAA,KAAA,aAAA,GAAA,EAAA,EAAA,OAAA,CAAA,CAAA,SAAA,SAAA,C1B65CZ,EACA,O0B95CwF,EAAO,MAAA,EAAAH,EAAA,UAAA,CAAA,GAAA,EAAAA,EAAA,mBAAA,CAAAA,EAAA,SAAA,KAAA,EAAA,EAAAA,EAAA,YAAA,CAAAuH,EAAA,CAAc,WAAAlF,EAAA,MAA6B,sBAAO,EAAA,KAAA,GAAA,EAAA,MAAA,E1Bi6CzI,IAAK,EAAGrC,EAAM,MAAK,CAAEd,CAAC,EACtB,K0B35CboD,EAAA,M1B45Ca,QAASpC,EAAE,QACX,KAAM,SACN,aAAcA,EAAE,YACpB,EAAG,KAAM,EAAG,CACR,aACA,KACA,OACA,UACA,cACJ,CAAC,GAAI,EAAGF,EAAM,YAAW,CAAEI,EAAwB,EAAG,CAClD,IAAK,EAAGJ,EAAM,MAAK,CAAEd,CAAC,EACtB,OAAQ,EAAGc,EAAM,eAAc,CAAE0H,EAAE,KAAK,EACxC,OAAQ,EAAE,KAAQ,GAAME,EAAE,CAAC,EAC3B,QAAS,EAAE,KAAQ,GAAMC,EAAE,CAAC,EAC5B,sBAAuB,EAC3B,GAAI,EAAG7H,EAAM,YAAW,CAAE,CACtB,aAAc,EAAGA,EAAM,QAAO,KAAQ,CAClCoG,EAAE,MAAM,OAAS,UAAY,CAAClG,EAAE,aAAe,EAAGF,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEqH,GAAI,CAC7F,IAAK,EACL,GAAI,MACJ,QAAS,GACT,KAAM1F,EAAE,MAAM,OAAO,UAAY,GACjC,MAAOyE,EAAE,MAAM,MAAM,MAAM,OAAS,GAAK,WACzC,SAAU,EAAE,KAAQ,GAAM,EAAE,MAAM,MAAM,MAAQ,CAAC,CACrD,EAAG,KAAM,EAAG,CAAC,OAAQ,OAAO,CAAC,IAAM,EAAGpG,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,IACpE,EAAGA,EAAM,UAAS,CAAE,CAAC,CAAC,GAAI,EAAGA,EAAM,mBAAkB,CAAEA,EAAM,SAAU,MAAO,EAAGA,EAAM,WAAU,CAAEsC,EAAE,MAAQ,KAAQ,EAAGtC,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEqH,GAAI,CACrK,IAAK1F,EAAE,GACP,GAAIA,EAAE,GACN,QAASA,EAAE,SACX,KAAMA,EAAE,KACR,MAAOyC,EAAEzC,EAAE,EAAE,EACb,WAAYyE,EAAE,MAAM,OAAS,UAAY,CAAClG,EAAE,WAC5C,SAAUA,EAAE,aACZ,SAAUmG,EAAG,OAASjC,EAAEzC,EAAE,EAAE,IAAM,GAClC,WAAa,GAAM8F,EAAE9F,EAAE,GAAI,UAAU,EACrC,SAAW,GAAM8F,EAAE9F,EAAE,GAAI,QAAQ,EACjC,UAAY,GAAM8F,EAAE9F,EAAE,GAAI,SAAS,EACnC,gBAAkB,GAAM,CACpB,EAAE,KAAOC,GAAI,EAAG5B,EAAM,MAAK,CAAEwC,CAAC,CAAC,CAAC,cAAeF,EAAE,KAAK,CAC1D,CACJ,EAAG,KAAM,EAAG,CACR,KACA,UACA,OACA,QACA,aACA,WACA,WACA,aACA,WACA,YACA,eACJ,CAAC,EAAE,EAAG,GAAG,GACTpC,EAAE,cAAgBoC,EAAE,MAAM,OAASpC,EAAE,SAAWoC,EAAE,MAAM,OAAS,KAAO,EAAGtC,EAAM,UAAS,CAAE,GAAI,EAAGA,EAAM,YAAW,CAAEI,EAAwB,EAAG,CAC7I,IAAK,EACL,gBAAiB,IACjB,SAAU,EAAGJ,EAAM,cAAa,CAAE2H,EAAI,CAAC,MAAM,CAAC,CAClD,EAAG,CACC,SAAU,EAAG3H,EAAM,QAAO,KAAQ,EAAE,EAAGA,EAAM,gBAAe,EAAG,EAAGA,EAAM,gBAAe,CAAE2B,EAAE,MAAM,OAAO,GAAG,EAAG,CAAC,CAAC,CAAC,EACjH,EAAG,CACP,CAAC,IAAM,EAAG3B,EAAM,mBAAkB,CAAE,GAAI,CAAC,CAAC,CAC9C,CAAC,EACD,EAAG,CACP,EAAG,CAACoG,EAAE,MAAM,OAAS,UAAYA,EAAE,MAAM,QAAU,CAC3C,KAAM,SACN,IAAK,EAAGpG,EAAM,QAAO,KAAQ,EAAE,EAAGA,EAAM,YAAW,CAAEG,EAAwB,EAAG,CACxE,WAAY8D,EAAE,MACd,sBAAuB,EAAE,KAAQ,GAAM,EAAE,MAAQ,EACjD,QAASC,EAAE,CACf,EAAG,KAAM,EAAG,CAAC,aAAc,SAAS,CAAC,CAAC,CAAC,EAC3C,IAAK,GACT,EAAI,IAAK,GAAGkC,EAAE,MAAM,OAAS,UAAYA,EAAE,MAAM,QAAU,CACvD,KAAM,SACN,IAAK,EAAGpG,EAAM,QAAO,KAAQ,EAAE,EAAGA,EAAM,YAAW,CAAEG,EAAwB,EAAG,CAAE,MAAO,OAAQ,EAAG,CAC5F,SAAU,EAAGH,EAAM,QAAO,KAAQ,EAAE,EAAGA,EAAM,gBAAe,EAAG,EAAGA,EAAM,gBAAe,CAAE2B,EAAE,MAAM,OAAO,MAAM,EAAG,CAAC,CAAC,CAAC,EACpH,EAAG,CACP,CAAC,GAAI,EAAG3B,EAAM,YAAW,CAAEG,EAAwB,EAAG,CAAE,QAAS,EAAE,KAAQ,IAAO,EAAGH,EAAM,MAAK,CAAEwC,CAAC,CAAC,CAAC,SAAU,CACvG,QAAS4D,EAAE,MAAM,MAAM,MACvB,QAASA,EAAE,MAAM,QACjB,cAAenC,EAAE,MACjB,QAASmC,EAAE,MAAM,OACrB,CAAC,CAAE,EAAG,CACN,SAAU,EAAGpG,EAAM,QAAO,KAAQ,EAAE,EAAGA,EAAM,gBAAe,EAAG,EAAGA,EAAM,gBAAe,CAAEiE,EAAE,QAAU,MAAQtC,EAAE,MAAM,OAAO,IAAM,EAAE,EAAI,KAAO,EAAG3B,EAAM,gBAAe,CAAEiE,EAAE,QAAU,UAAYtC,EAAE,MAAM,OAAO,QAAU,EAAE,EAAI,KAAO,EAAG3B,EAAM,gBAAe,CAAEiE,EAAE,QAAU,SAAWtC,EAAE,MAAM,OAAO,OAAS,EAAE,EAAG,CAAC,CAAC,CAAC,EACxT,EAAG,CACP,CAAC,CAAC,CAAC,EACP,IAAK,GACT,EAAI,IAAK,EAAC,CAAC,EAAG,KAAM,CAAC,KAAM,OAAO,CAAC,CAAC,EAAG,EAAE,EACrD,CACJ,CAAC,EACD,EAAQ,iBAAmB2C,GAC3B,EAAQ,6BAA+BuB,GACvC,EAAQ,mBAAqBM,GAC7B,EAAQ,+BAAiCQ,GACzC,EAAQ,kCAAoCI,GAC5C,EAAQ,sBAAwBI,EAChC,EAAQ,0BAA4BI,EACpC,EAAQ,eAAiBC,EAC7B,CAAC","sourcesContent":["var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\ndefine([\"require\", \"exports\", \"../.chunks/forms-CY5MOh7a.esm.js\", \"../.chunks/field-DEusYVqS.esm.js\", \"../utils/dom.js\", \"../.chunks/worker-Bv_yPPMv.esm.js\", \"../.chunks/utils-Be-ScFyj.esm.js\", \"../utils/check.js\", \"../utils/string.js\", \"../utils/searchers.js\", \"../utils/keyboard.js\", \"../.chunks/popup-3cwJ8Hev.esm.js\", \"../.chunks/formsExt-C9r4Gz9y.esm.js\", \"vue\", \"../.chunks/api-DZQlrC2R.esm.js\", \"../.chunks/app-DinkodXi.esm.js\"], function (require, exports, forms_CY5MOh7a_esm_js_1, field_DEusYVqS_esm_js_1, dom_js_1, worker_Bv_yPPMv_esm_js_1, utils_Be_ScFyj_esm_js_1, check_js_1, string_js_1, searchers_js_1, keyboard_js_1, popup_3cwJ8Hev_esm_js_1, formsExt_C9r4Gz9y_esm_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.useItemsFromCompetitors = exports.topProjectSelectorClearCache = exports.renderElTopTagSelectorPopupOpener = exports.genSearcherByKey = exports.genElTopTagSelectorPopupOpener = exports.findRegion = exports.dialogRegionSelector = exports.TopTagSelectorTagIcon = exports.TopTagSelectorPopupOpener = exports.TopTagSelector = exports.TopRegionSelector = exports.TopProjectSelector = exports.TopGroupSelector = exports.TopCompetitorSelector = void 0;\n //#region src/components/project/competitorSelector/competitorSelector.vue?vue&type=script&setup=true&lang.ts\n var _e = { class: \"top-competitorSelector\" }, ve = { class: \"top-ellipsis1\" }, ye = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"competitorSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n items: {},\n showSelectAllItem: {\n type: Boolean,\n default: !0\n },\n selectAllItemIcon: { default: \"\" }\n }, {\n modelValue: {},\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let i = n, a = (0, vue_1.useModel)(n, \"modelValue\"), o = (0, vue_1.computed)(() => {\n if (i.showSelectAllItem)\n return {\n icon: i.selectAllItemIcon,\n title: (0, forms_CY5MOh7a_esm_js_1.E)().Common.Select_all,\n value: \"all\",\n content: \"\"\n };\n });\n return (e, i) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", _e, [(0, vue_1.unref)(forms_CY5MOh7a_esm_js_1.O).state.isMobile ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_3cwJ8Hev_esm_js_1.s, { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CY5MOh7a_esm_js_1.h, {\n class: \"top-competitorSelector_opener\",\n color: \"theme\",\n icon: \"\",\n icon2: \"\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(n.items.find((e) => e.value === a.value?.[0])?.content), 1)]),\n _: 1\n })]),\n contentList: (0, vue_1.withCtx)(() => [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(n.items, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_3cwJ8Hev_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({ \"top-active\": a.value?.includes(e.value) }),\n \"data-top-icon\": e.icon,\n title: e.title,\n onClick: () => a.value = [e.value]\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", ve, (0, vue_1.toDisplayString)(e.content), 1)]),\n _: 2\n }, 1032, [\n \"class\",\n \"data-top-icon\",\n \"title\",\n \"onClick\"\n ]))), 256))]),\n _: 1\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_C9r4Gz9y_esm_js_1.f, {\n key: 1,\n modelValue: a.value,\n \"onUpdate:modelValue\": i[0] ||= (e) => a.value = e,\n items: n.items,\n isMultiple: !0,\n styling: \"bar\",\n canBeEmptyMultiple: !1,\n selectAllItem: o.value\n }, null, 8, [\n \"modelValue\",\n \"items\",\n \"selectAllItem\"\n ]))]));\n }\n }), be = (e, t) => (0, vue_1.computed)(() => (0, vue_1.toValue)(e).filter((e) => e.on >= 0 || e.id === t).map((e) => ({\n value: e.id,\n title: e.url + ` [${e.id}]`,\n icon: e.id === (0, vue_1.toValue)(t) ? \"\" : \"\",\n content: e.name\n }))), xe = {\n 0: \"Yandex\",\n 1: \"Google\",\n 4: \"YouTube\",\n 5: \"Bing\",\n 7: \"Seznam\",\n 8: \"AppStore\",\n 9: \"GoogleStore\",\n 20: \"Yandex.com\",\n 21: \"Yandex.com.tr\"\n }, Se = {\n key: -2,\n name: \"--\",\n index: -2\n }, Ce = {\n key: -2,\n name: \"--\",\n regions: [Se],\n regionByIndex: /* @__PURE__ */ new Map([[-2, Se]])\n }, U = {\n key: -2,\n name: \"Autoselect\",\n index: -2\n }, we = {\n key: -2,\n name: \"Autoselect\",\n regions: [U],\n regionByIndex: /* @__PURE__ */ new Map([[-2, U]])\n }, Te = {\n countryCode: \"00\",\n depth: 1,\n device: 0,\n key: -1,\n index: -1,\n lang: \"ru\",\n name: \"Without region\"\n }, Ee = () => (U.name = (0, forms_CY5MOh7a_esm_js_1.E)().Common.Autoselect, U), De = () => (Ee(), we.name = (0, forms_CY5MOh7a_esm_js_1.E)().Common.Autoselect, console.log(we), we), Oe = () => (Te.name = (0, forms_CY5MOh7a_esm_js_1.E)().Keywords.Without_region, Te), ke = (e = \"\", t = !1, n = []) => {\n let r;\n return r = e ? je(n, e) : Ae(n), t && r.set(-2, De()), r.size || r.set(-2, Ce), r;\n }, Ae = (e, t = !0, n = [], r = \"\") => {\n let i = /* @__PURE__ */ new Map();\n return e.forEach((e) => {\n if (!e.enabled || r && typeof e.key == \"number\" && e.key > 1)\n return;\n let a = { ...e };\n a.regionByIndex = /* @__PURE__ */ new Map(), e.regions && e.regions.forEach((e) => {\n if (t && !e.enabled)\n return;\n let n = { ...e };\n a.regionByIndex.set(n.index, n);\n }), !a.regionByIndex.size && n.length, (!e.regions || a.regionByIndex.size || n.length) && i.set(a.key, a);\n }), n.forEach((e) => {\n if (i.has(e))\n return;\n let t = {\n key: e,\n name: xe[e],\n regions: [],\n regionByIndex: /* @__PURE__ */ new Map()\n };\n i.set(t.key, t);\n }), i;\n }, je = (e, n) => {\n let r = Ae(e, !1, forms_CY5MOh7a_esm_js_1.O.state.forceSearchersKeysForKeywordsStats, n);\n if (r.has(2)) {\n let e = r.get(2);\n e && (e.regionByIndex = /* @__PURE__ */ new Map());\n }\n return (n === \"volume\" || n === \"cost_forecast\") && forms_CY5MOh7a_esm_js_1.O.state.showGlobalRegionForKeywordsStats && r.forEach((e) => {\n if (!e.regionByIndex)\n return;\n let t = { ...Oe() };\n e.regionByIndex.set(t.index, t);\n }), r;\n }, Me = (e, t, n = []) => {\n let r = ke(e, !1, n), i;\n return r.forEach((n) => {\n if (!(t.searcher_key !== void 0 && t.searcher_key != n.key) && n.regions && (n.regions.forEach((r) => {\n if (!i && !(t.key !== void 0 && t.key != r.key) && !(t.index !== void 0 && t.index != r.index) && !(!e && (t.lang !== void 0 && t.lang != r.lang || t.device !== void 0 && t.device != r.device)))\n return r.searcher_key = n.key, i = r, !1;\n }), i))\n return !1;\n }), i;\n }, Ne = (0, utils_Be_ScFyj_esm_js_1.t)(() => new Promise((resolve_1, reject_1) => { require([\"../.chunks/dialog_regionSelectorRegions-0M1fMu1a.esm.js\"], resolve_1, reject_1); }).then(__importStar)), Pe = (t, n) => {\n let r = (0, forms_CY5MOh7a_esm_js_1.E)();\n return {\n searcherKey: (0, vue_1.ref)(n.value.keys().next().value ?? -2),\n optionBySearcherKey: (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n if (n.value.forEach((n) => {\n let r = {\n value: n.key,\n title: n.name\n };\n t.addSearcherIcon && (r.icon = (0, searchers_js_1.getSearcherGIcon)(n.key)), e.set(n.key, r);\n }), t.addCompare && !e.has(-2)) {\n let t = {\n value: \"\",\n title: \"--------------------\",\n disabled: !0\n };\n e.set(t.value, t);\n let n = {\n value: -1,\n title: r.Common.Compare\n };\n e.set(n.value, n);\n }\n return e;\n })\n };\n }, Fe = (t, n) => {\n let r = (0, forms_CY5MOh7a_esm_js_1.E)(), i = (0, vue_1.ref)(-2);\n t.modelValue.length === 1 && (i.value = t.modelValue[0]), i.value === -2 && (t.forMode ? i.value = n.value?.regionByIndex.values().next().value?.key ?? -2 : i.value = n.value?.regionByIndex.keys().next().value ?? -2);\n let a = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n return n.value.regionByIndex?.forEach((i) => {\n let a = i.name;\n if (t.forMode) {\n let t = {\n value: i.key,\n title: a\n };\n e.has(i.key) || e.set(i.key, t);\n return;\n }\n i.device && (a += \" (\" + r.Common[\"Device_\" + i.device] + \")\");\n let o = (0, searchers_js_1.getLangLabel)(n.value.key || 0, i.lang ?? \"\");\n o && (a += \" / \" + o);\n let s = {\n value: i.index,\n title: a,\n icon: i.device ? (0, searchers_js_1.getDeviceGIcon)(i.device) : void 0\n };\n e.set(i.index, s);\n }), e;\n });\n return (0, vue_1.watch)(a, (e, n) => {\n if (t.onlySearcher || i.value !== void 0 && e.get(i.value))\n return;\n let a = e.keys().next().value;\n if (i.value === -2 || a === -2) {\n i.value = a;\n return;\n }\n let o = n?.get(i.value)?.title || \"\", s = -1;\n for (let [t, n] of e.entries()) {\n let e = n.title;\n if (typeof e != \"string\" || typeof t == \"string\")\n break;\n if (e === o) {\n a = t;\n break;\n }\n let i = RegExp(` \\\\((${r.Common.Device_1}|${r.Common.Device_2})\\\\)`), c = o, l = 3;\n e.indexOf(c) === -1 && (c = o.replace(/^[^a-zа-я]/i, \"\").replace(i, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), c = c.replace(/^[^a-zа-я]/i, \"\").replace(i, \"\"), l--), e.indexOf(c) !== -1 && (l <= s || (s = l, a = t));\n }\n i.value = a;\n }), {\n regionIndex: i,\n optionByRegionIndex: a\n };\n }, Ie = (e, t, n) => {\n let r = (0, vue_1.ref)([]), i = () => {\n if (e.onlySearcher && t.value) {\n r.value = Array.from(t.value.keys());\n return;\n }\n let i = [];\n if (e.modelValue.length > 1)\n i = [...e.modelValue];\n else\n try {\n i = JSON.parse(localStorage.getItem(\"ui:project:regionSelector\" + e.projectId + \":regionsIndexes\")) ?? [];\n }\n catch { }\n i.length && (i = i.filter((e) => n.value.has(e))), i.length || (i = Array.from(n.value)), r.value = [...i];\n }, a = () => {\n r.value.length ? localStorage.setItem(\"ui:project:regionSelector:\" + e.projectId + \":regionsIndexes\", JSON.stringify(r.value)) : localStorage.removeItem(\"ui:project:regionSelector:\" + e.projectId + \":regionsIndexes\");\n };\n return (0, vue_1.watch)(r, () => {\n a();\n }), e.addCompare && i(), { regionsIndexes: r };\n }, Le = (e) => {\n let t = (0, vue_1.computed)(() => ke(e.forMode, e.autoRegion, e.searchers)), n = (0, vue_1.computed)(() => t.value.get(i.searcherKey.value) || Ce), r = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Set();\n return t.value.forEach((t) => {\n t.regionByIndex.forEach((t) => {\n t.index !== -1 && t.index !== -2 && e.add(t.index);\n });\n }), e;\n }), i = Pe(e, t), a = Fe(e, n), o = Ie(e, t, r);\n (0, vue_1.watch)(t, () => {\n if (e.onlySearcher ? o.regionsIndexes.value = Array.from(t.value.keys()) : o.regionsIndexes.value = o.regionsIndexes.value.filter((e) => r.value.has(e)), i.searcherKey.value === -1)\n return;\n let s = t.value.keys().next().value;\n t.value.forEach((n) => {\n if (e.onlySearcher && n.key === i.searcherKey.value) {\n s = i.searcherKey.value;\n return;\n }\n if (a.regionIndex.value && n.regionByIndex?.has(a.regionIndex.value) && (s = n.key), !e.onlySearcher) {\n let e;\n s !== void 0 && (e = t.value.get(s)?.regionByIndex);\n let r = t.value.get(n.key)?.regionByIndex;\n e?.has(-2) && !r?.has(-2) && (s = n.key);\n }\n }), s !== void 0 && (i.searcherKey.value = s), a.regionIndex.value !== void 0 && !(n.value?.regionByIndex)?.has(a.regionIndex.value) && (a.regionIndex.value = n.value?.regions?.keys().next().value);\n }, { immediate: !0 });\n let s = () => {\n if (!(i.searcherKey.value === -1 || i.searcherKey.value === -2))\n return i.searcherKey.value;\n }, c = () => {\n if (e.onlySearcher || a.regionIndex.value === -2)\n return;\n let t = a.regionIndex.value;\n if (e.forMode) {\n let n = a.regionIndex.value;\n t = Me(e.forMode, {\n searcher_key: s(),\n key: n\n }, e.searchers)?.index;\n }\n return t;\n }, l = () => {\n let e = s();\n if (e !== void 0)\n return t.value.get(e);\n };\n return {\n selectSearcher: i,\n selectRegion: a,\n compare: o,\n searcherByKey: t,\n allRegionsIndexes: r,\n getSearcher: l,\n getRegion: () => {\n let e = c();\n if (e !== void 0)\n return l()?.regionByIndex?.get(e);\n }\n };\n }, Re = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"regionSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n projectId: {},\n searchers: { default: () => [] },\n modelValue: {},\n modelValueSingle: {},\n addCompare: { type: Boolean },\n forMode: {},\n autoRegion: { type: Boolean },\n onlySearcher: { type: Boolean },\n addChanger: {\n type: Boolean,\n default: !0\n },\n addSearcherIcon: {\n type: Boolean,\n default: !0\n },\n addRegionIcon: {\n type: Boolean,\n default: !0\n }\n }, {\n modelValue: { required: !0 },\n modelModifiers: {},\n modelValueSingle: {},\n modelValueSingleModifiers: {}\n }),\n emits: [\"update:modelValue\", \"update:modelValueSingle\"],\n setup(e, { expose: t }) {\n let n = e, a = (0, vue_1.useModel)(e, \"modelValue\"), o = (0, vue_1.useModel)(e, \"modelValueSingle\"), { selectSearcher: s, selectRegion: c, compare: l, searcherByKey: u, allRegionsIndexes: d, getSearcher: f, getRegion: p } = Le(n), m = () => {\n let e = [];\n u.value.forEach((t) => {\n t.enabled && t.regions.forEach((t) => {\n t.enabled && e.push(t);\n });\n }), Ne.open(\"regions\", {\n regions: e,\n regionsIndexes: l.regionsIndexes.value,\n \"@update:regionsIndexes\": (e) => l.regionsIndexes.value = e\n });\n };\n return (0, vue_1.watch)([\n c.regionIndex,\n s.searcherKey,\n l.regionsIndexes\n ], () => {\n if (s.searcherKey.value === -1 && l.regionsIndexes.value.length) {\n if (JSON.stringify(a.value) === JSON.stringify(l.regionsIndexes.value))\n return;\n a.value = [...l.regionsIndexes.value];\n }\n else\n n.onlySearcher ? (a.value = [s.searcherKey.value], s.searcherKey.value === -2 && !n.autoRegion && (a.value.length = 0)) : (a.value = [c.regionIndex.value], c.regionIndex.value === -2 && !n.autoRegion && (a.value.length = 0));\n !n.onlySearcher && !d.value.size && (s.searcherKey.value = -2);\n }), o.value && (0, vue_1.watch)(o, () => {\n o.value && (a.value = [o.value]);\n }, { immediate: !0 }), (0, vue_1.watch)(a, () => {\n if (a.value[0] && (o.value = a.value[0]), n.onlySearcher) {\n if (!a.value.length || a.value.length === 1 && !u.value.has(a.value[0]) || a.value.length === 1 && a.value[0] === -2 && !n.autoRegion) {\n let e = u.value.keys().next().value;\n e === -2 && !n.autoRegion && (e = void 0, o.value = -2), e === void 0 ? a.value.length = 0 : a.value = [e];\n return;\n }\n if (a.value.length > 1 && JSON.stringify(a.value) !== JSON.stringify(l.regionsIndexes.value)) {\n a.value = [...l.regionsIndexes.value];\n return;\n }\n }\n else {\n let e = [...new Set(a.value)], t = u.value.values().next().value?.regionByIndex?.keys().next().value;\n if (n.forMode && (t = u.value.values().next().value?.regionByIndex?.values().next().value?.key), t === -2 && !n.autoRegion && (t = void 0, o.value = -2), !e.length)\n t !== void 0 && e.push(t);\n else if (e.length === 1) {\n let r = d.value;\n n.forMode && (r = /* @__PURE__ */ new Set(), u.value.forEach((e) => {\n e.regionByIndex.forEach((e) => {\n e.index !== -1 && e.index !== -2 && r.add(e.key);\n });\n })), r.has(e[0]) || (e = [], t !== void 0 && e.push(t));\n }\n else\n e = e.filter((e) => d.value.has(e)), !e.length && t !== void 0 && e.push(t);\n if (JSON.stringify(a.value) !== JSON.stringify(e)) {\n a.value = e;\n return;\n }\n }\n if (!(a.value.length === 1 && a.value[0] === (n.onlySearcher ? s.searcherKey.value : c.regionIndex.value)))\n if (n.onlySearcher) {\n if (a.value.length === 1) {\n s.searcherKey.value = a.value[0];\n return;\n }\n s.searcherKey.value = -1;\n return;\n }\n else {\n if (!a.value.length)\n return;\n if (a.value.length === 1 && s.searcherKey.value !== -1) {\n c.regionIndex.value = a.value[0];\n let e;\n for (let t of u.value.values()) {\n for (let r of t.regionByIndex.values())\n if ((n.forMode ? r.key : r.index) === c.regionIndex.value) {\n e = t.key;\n break;\n }\n if (e !== void 0)\n break;\n }\n e !== void 0 && (s.searcherKey.value = e);\n }\n else\n s.searcherKey.value = -1, l.regionsIndexes.value = [...a.value];\n }\n }, { immediate: !0 }), t({\n getSearcher: f,\n getRegion: p\n }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-regionSelector\": !0,\n \"top-regionSelector-onlySearcher\": e.onlySearcher\n }) }, [\n (0, vue_1.createVNode)(forms_CY5MOh7a_esm_js_1.n, {\n options: (0, vue_1.unref)(s).optionBySearcherKey.value,\n modelValue: (0, vue_1.unref)(s).searcherKey.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => (0, vue_1.unref)(s).searcherKey.value = e,\n name: \"searcher_key\",\n addChanger: e.addChanger\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"addChanger\"\n ]),\n !e.onlySearcher && (0, vue_1.unref)(s).searcherKey.value !== (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CY5MOh7a_esm_js_1.n, {\n key: 0,\n class: \"top-select-region\",\n options: (0, vue_1.unref)(c).optionByRegionIndex.value,\n modelValue: (0, vue_1.unref)(c).regionIndex.value,\n \"onUpdate:modelValue\": n[1] ||= (e) => (0, vue_1.unref)(c).regionIndex.value = e,\n name: e.forMode ? \"region_key\" : \"region_index\",\n addChanger: e.addChanger,\n \"data-top-icon\": e.addRegionIcon ? \"\" : void 0\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"name\",\n \"addChanger\",\n \"data-top-icon\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.addCompare && !e.onlySearcher && (0, vue_1.unref)(s).searcherKey.value === (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CY5MOh7a_esm_js_1.h, {\n key: 1,\n name: \"compare\",\n onClick: m,\n \"data-count-compare-regions-indexes\": (0, vue_1.unref)(l).regionsIndexes.value.length\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(t.$i18n.Common.Selected_regions), 1)]),\n _: 1\n }, 8, [\"data-count-compare-regions-indexes\"])) : (0, vue_1.createCommentVNode)(\"\", !0)\n ], 2));\n }\n }), W = {\n id: 0,\n name: \"/\",\n path: \"/\"\n };\n exports.TopCompetitorSelector = ye;\n exports.useItemsFromCompetitors = be;\n exports.genSearcherByKey = ke;\n exports.findRegion = Me;\n exports.dialogRegionSelector = Ne;\n exports.TopRegionSelector = Re;\n function ze(t) {\n return t ? (0, forms_CY5MOh7a_esm_js_1.E)()?.Common.All_folders : \"/ (\" + (0, forms_CY5MOh7a_esm_js_1.E)()?.Keywords.Root_folder + \")\";\n }\n var Be = (e, t, n = /* @__PURE__ */ new Map(), r = { id: \"root\" }, i = 0) => (r.childsIds = [], r.id && (r.countAllGroupsActive = r.count_groups_active), e[r.id] && e[r.id].forEach((a) => {\n a = { ...a }, r.childsIds.push(a.id), a.id === 0 && (a.name = ze(t));\n let o = i > 1 ? \"-\".repeat(i - 1) + \" \" : \"\";\n o && !a.name.startsWith(o) && (a.name = o + a.name), n.set(a.id, a), Be(e, t, n, a, i + 1), r.childsIds = r.childsIds.concat(a.childsIds), r.id && a.count_groups_active && (r.countAllGroupsActive += a.count_groups_active);\n }), n), Ve = (e, t) => e.gen(`/get/${t}/folders/`, [\n \"id\",\n \"parent_id\",\n \"name\",\n \"path\"\n ]).changeParams({\n orders: [\"ord_path\"],\n limit: 100\n });\n //#endregion\n //#region src/core/utils/composables/useWatch.ts\n function He(e, t, n) {\n let r = Object.keys(e);\n return (0, vue_1.watch)(r.map((t) => e[t]), (e, n, i) => {\n let a = {};\n e.forEach((e, t) => {\n if (!Object.is(e, n[t])) {\n let i = r[t];\n a[i] = {\n old: n[t],\n new: e\n };\n }\n }), Object.keys(a).length && t(a, i);\n }, n);\n }\n //#endregion\n //#region src/components/project/groupSelector/folders/folders.vue?vue&type=script&setup=true&lang.ts\n var Ue = [\"innerHTML\"], We = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"folders\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n folderId: {},\n folder: {},\n folders: {},\n projectId: {},\n canSelectAll: { type: Boolean },\n addChanger: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: {}\n }, {\n folderId: { required: !0 },\n folderIdModifiers: {},\n folder: { default: W },\n folderModifiers: {}\n }),\n emits: [\"update:folderId\", \"update:folder\"],\n setup(e) {\n let t = e, n = (0, vue_1.useModel)(e, \"folderId\"), r = (0, vue_1.useModel)(e, \"folder\"), i = t.client && !t.folders ? Ve(t.client, t.service) : void 0, a = (0, vue_1.ref)(null);\n (0, vue_1.watch)(() => t.projectId, () => {\n i?.changeParams({ project_id: t.projectId }), i?.setOptions({ checkFingerprint: \"TopGroupSelectorFolders:\" + t.projectId }), a.value?.resetCache();\n }, { immediate: !0 });\n let o = (0, vue_1.computed)(() => Be(t.folders ?? { root: [W] }, t.canSelectAll)), s = (e) => (t.canSelectAll && e[0]?.id === 0 && (e[0] = {\n ...e[0],\n name: ze(!0)\n }), e);\n return He({\n modelFolder: r,\n modelFolderId: n\n }, async (e) => {\n if (n.value === r.value.id)\n return;\n if (e.modelFolder && !e.modelFolderId) {\n n.value = r.value.id;\n return;\n }\n let i = o.value.get(t.folderId);\n i ||= W, r.value = i, n.value = i.id;\n }, { immediate: !0 }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_C9r4Gz9y_esm_js_1.s, {\n class: \"top-groupSelector_folder\",\n modelValue: r.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => r.value = e,\n items: e.folders ? [...o.value.values()] : void 0,\n \"search-type\": \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.folders ? void 0 : (0, vue_1.unref)(i),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_C9r4Gz9y_esm_js_1.u)(...e, \"name\"),\n prepareItemsBeforeRender: s,\n addChanger: e.addChanger,\n useCache: \"\"\n }, {\n item: (0, vue_1.withCtx)(({ item: e }) => [(0, vue_1.createElementVNode)(\"div\", { innerHTML: e.name.replaceAll(/</g, \"< \") }, null, 8, Ue)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"addChanger\"\n ]));\n }\n }), G = {\n id: -1,\n name: \"--\",\n folder_id: W.id,\n folder_path: W.path\n }, K = {\n id: 0,\n name: \"All groups\",\n folder_id: W.id,\n folder_path: W.path\n }, q = () => (K.name = (0, forms_CY5MOh7a_esm_js_1.E)()?.Common.All_groups, K), Ge = () => (K.name = (0, forms_CY5MOh7a_esm_js_1.E)()?.Keywords.Choose_group, K), Ke = (e, t, n) => (e = [...e], t !== void 0 && (e = e.filter((e) => e.on == Number(t))), n && n.id && n.childsIds && (e = e.filter((e) => e.folder_id === n.id || n.childsIds.includes(e.folder_id))), e), qe = (e, t) => e.gen(`/get/${t}/groups/`, [\n \"id\",\n \"name\",\n \"folder_id\",\n \"folder_path\"\n ]).changeParams({\n folder_id_depth: !0,\n limit: 100\n }), Je = (e, t) => e.gen(`/add/${t}/groups/`), Ye = (e, t) => e.gen(`/del/${t}/groups/`), Xe = (e, t) => e.gen(`/edit/${t}/groups/rename/`), Ze = { class: \"top-groupSelector_groupItem top-ellipsis1\" }, Qe = {\n key: 0,\n class: \"top-comment\"\n }, $e = [\"innerHTML\"], et = [\"innerHTML\"], tt = [\"innerHTML\"], nt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"groups\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n groupId: {},\n group: {},\n projectId: {},\n folder: {},\n groups: {},\n on: {\n type: Boolean,\n default: void 0\n },\n canAdd: { type: [String, Boolean] },\n canEditAndDel: { type: Boolean },\n canSelectAll: { type: [Boolean, String] },\n autoselect: { default: \"first\" },\n addChanger: {\n type: Boolean,\n default: !0\n },\n showPath: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: { default: \"keywords_2\" }\n }, {\n groupId: { required: !0 },\n groupIdModifiers: {},\n group: { required: !0 },\n groupModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"addGroup\",\n \"editGroup\",\n \"delGroup\"\n ], [\"update:groupId\", \"update:group\"]),\n setup(e, { expose: t, emit: n }) {\n let r = e, i = n, a = (0, vue_1.useModel)(e, \"groupId\"), s = (0, vue_1.useModel)(e, \"group\"), c = r.client && !r.groups ? qe(r.client, r.service) : void 0, l = r.client ? Je(r.client, r.service) : void 0, u = r.client ? Ye(r.client, r.service) : void 0, d = r.client ? Xe(r.client, r.service) : void 0, f = (0, vue_1.ref)(null), p = (0, vue_1.computed)(() => {\n if (r.groups !== void 0)\n return Ke(r.groups, r.on, r.folder);\n }), m = (0, field_DEusYVqS_esm_js_1.t)(\"folder_id\", \"EQUALS\", [r.folder?.id ?? 0]);\n c?.changeParams({\n project_id: r.projectId,\n folder_id_depth: !0,\n filters: [m]\n }), r.on !== void 0 && c?.params.filters?.push((0, field_DEusYVqS_esm_js_1.t)(\"on\", \"EQUALS\", [Number(r.on)]));\n let h = (e) => {\n s.value = e, a.value = e.id;\n }, g = (e = !1) => {\n f.value?.resetCache(e);\n };\n He({\n projectId: () => r.projectId,\n folderId: () => r.folder?.id,\n canSelectAll: () => r.canSelectAll\n }, (e) => {\n if (e.projectId && (c?.changeParams({ project_id: r.projectId }), c?.setOptions({ checkFingerprint: \"TopGroupSelectorGroups:\" + r.projectId })), e.folderId && (m.values = [r.folder?.id ?? 0]), g(), (e.folderId?.old !== void 0 || e.canSelectAll?.old !== void 0) && a.value !== null) {\n let e;\n r.autoselect === \"first\" && (e = p.value?.[0], r.canSelectAll && (e = (0, vue_1.reactive)(q()))), (r.autoselect === \"placeholder\" || !e) && (e = Ge()), h(e);\n }\n }, { immediate: !0 }), He({\n modelGroup: s,\n modelGroupId: a\n }, async (e) => {\n if (a.value !== s.value.id) {\n if (e.modelGroup && !e.modelGroupId) {\n a.value = s.value.id;\n return;\n }\n if (!(r.canAdd && a.value === null)) {\n if (r.groups) {\n let e = p.value?.find((e) => e.id === a.value);\n if (!e && r.canSelectAll && (e = q()), e)\n h(e);\n else {\n let e = p.value?.[0];\n e && !a.value ? h(e) : h(G);\n }\n }\n if (r.client && !r.groups && (a.value || a.value === 0 && !r.canSelectAll)) {\n let e = qe(r.client, r.service).changeParams({\n project_id: r.projectId,\n id: a.value,\n filters: [m]\n });\n e?.setOptions({ checkFingerprint: \"TopGroupSelectorFindGroup:\" + r.projectId });\n let t = await e.call();\n if (!t.errors?.length && !t.result)\n return;\n !t.errors && t.result[0] ? h(t.result[0]) : h(G);\n }\n }\n }\n }, { immediate: !0 });\n let v = async (e) => {\n if (r.canAdd !== \"api\" || !l)\n return;\n let t = s.value, n = await l.changeParams({\n project_id: r.projectId,\n names: [e.name],\n to_id: r.folder?.id ?? W.id,\n to_type: \"in_folder_last\"\n }).call();\n if (n.result) {\n let e = n.result[0];\n h(e), i(\"addGroup\", e);\n }\n else\n h(t);\n f.value?.resetCache(!0);\n }, y = async (e, t) => {\n d && ((await d.changeParams({\n project_id: r.projectId,\n id: e.id,\n name: t\n }).call()).errors || (s.value.id === e.id && (s.value.name = t), i(\"editGroup\", {\n id: e.id,\n name: t\n }), f.value?.updateCacheItemById(e.id, { name: t })));\n }, b = async (e) => {\n u && ((await u.changeParams({\n project_id: r.projectId,\n id: e.id\n }).call()).errors || (s.value.id === e.id && h(r.canSelectAll ? q() : G), i(\"delGroup\", e.id), f.value?.deleteCacheItemById(e.id)));\n };\n return t({ resetCacheGroups: g }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_C9r4Gz9y_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: f,\n class: \"top-groupSelector_group\",\n modelValue: s.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => s.value = e,\n items: p.value ?? e.groups,\n searchType: \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.groups ? void 0 : (0, vue_1.unref)(c),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_C9r4Gz9y_esm_js_1.u)(...e, \"name\"),\n appendSearchToResult: !!e.canAdd,\n useAllItem: e.canSelectAll ? (0, vue_1.unref)(q)().name : !1,\n addChanger: e.addChanger,\n useCache: \"\",\n onAppendItem: v\n }, (0, vue_1.createSlots)({\n item: (0, vue_1.withCtx)(({ item: n }) => [(0, vue_1.createElementVNode)(\"div\", Ze, [\n n.id === (0, vue_1.unref)(null) ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Qe, (0, vue_1.toDisplayString)(t.$i18n.Common.Add) + \": \", 1)) : (0, vue_1.createCommentVNode)(\"\", !0),\n (0, vue_1.createElementVNode)(\"span\", {\n class: \"top-groupSelector_groupItemName top-ellipsis1\",\n innerHTML: n.name\n }, null, 8, $e),\n n.folder_path && e.showPath ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 1,\n class: \"top-groupSelector_groupItemFolderPath top-ellipsis1\",\n innerHTML: n.folder_path\n }, null, 8, et)) : (0, vue_1.createCommentVNode)(\"\", !0)\n ])]),\n _: 2\n }, [e.canEditAndDel && e.client ? {\n name: \"actions\",\n fn: (0, vue_1.withCtx)(({ item: r }) => [r.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [(0, vue_1.createVNode)(popup_3cwJ8Hev_esm_js_1.n, {\n submitText: t.$i18n.Common.Save,\n defaultValue: r.name,\n inputProps: { addCleaner: !1 },\n onSubmit: (e) => y(r, e)\n }, {\n opener: (0, vue_1.withCtx)(() => [...n[1] ||= [(0, vue_1.createElementVNode)(\"div\", { \"data-top-icon\": \"\" }, null, -1)]]),\n default: (0, vue_1.withCtx)(() => [...n[2] ||= []]),\n _: 1\n }, 8, [\n \"submitText\",\n \"defaultValue\",\n \"onSubmit\"\n ]), (0, vue_1.createVNode)(popup_3cwJ8Hev_esm_js_1.r, {\n isWarning: \"\",\n submitText: t.$i18n.Common.Delete,\n onSubmit: (e) => b(r)\n }, {\n opener: (0, vue_1.withCtx)(() => [...n[3] ||= [(0, vue_1.createElementVNode)(\"div\", { \"data-top-icon\": \"\" }, null, -1)]]),\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", { innerHTML: e.service === \"keywords_2\" ? t.$i18n.Keywords.Delete_group_warning : t.$i18n[\"Ai.Tracker\"].Delete_group_warning }, null, 8, tt)]),\n _: 1\n }, 8, [\"submitText\", \"onSubmit\"])], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n key: \"0\"\n } : void 0]), 1032, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResult\",\n \"useAllItem\",\n \"addChanger\"\n ]));\n }\n }), rt = { class: \"top-groupSelector\" }, it = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"groupSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n folderId: {},\n folder: {},\n groupId: {},\n group: {},\n projectId: {},\n folders: {},\n groups: {},\n on: {\n type: Boolean,\n default: void 0\n },\n canSelectAllGroups: {\n type: Boolean,\n default: !1\n },\n canAddGroup: { type: [String, Boolean] },\n canEditAndDelGroup: { type: Boolean },\n autoselect: { default: \"first\" },\n addChanger: {\n type: Boolean,\n default: !0\n },\n showFolders: {\n type: Boolean,\n default: !0\n },\n showGroups: {\n type: Boolean,\n default: !0\n },\n showGroupsPaths: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: { default: \"keywords_2\" }\n }, {\n folderId: { required: !0 },\n folderIdModifiers: {},\n folder: {},\n folderModifiers: {},\n groupId: { required: !0 },\n groupIdModifiers: {},\n group: { default: G },\n groupModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\"update:groups\"], [\n \"update:folderId\",\n \"update:folder\",\n \"update:groupId\",\n \"update:group\"\n ]),\n setup(e, { expose: t, emit: n }) {\n let r = e, i = (0, vue_1.ref)(null), a = (0, vue_1.useModel)(e, \"folderId\"), o = (0, vue_1.useModel)(e, \"folder\"), s = (0, vue_1.useModel)(e, \"groupId\"), c = (0, vue_1.useModel)(e, \"group\"), l = n;\n o.value = Be(r.folders ?? { root: [W] }, r.canSelectAllGroups).get(a.value);\n let u = r.groups?.find((e) => e.id === s.value);\n s.value || (u = r.groups?.[0]), r.canSelectAllGroups && !u && (u = q()), (r.autoselect === \"placeholder\" || !u) && (u = Ge()), u ??= G, c.value = u;\n let d = (e) => {\n let t;\n r.groups && e && (t = [...r.groups, e]), l(\"update:groups\", t);\n }, f = (e) => {\n if (!r.groups) {\n l(\"update:groups\");\n return;\n }\n let t = r.groups.find((t) => t.id === e.id);\n if (!t)\n return;\n let n = {\n ...t,\n ...e\n }, i = r.groups.map((e) => e.id === n.id ? n : e);\n l(\"update:groups\", i);\n }, p = (e) => {\n if (!r.groups) {\n l(\"update:groups\");\n return;\n }\n let t = r.groups.filter((t) => t.id !== e);\n l(\"update:groups\", t);\n };\n return t({ resetCacheGroups: (e = !1) => {\n i.value?.resetCacheGroups(e);\n } }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", rt, [e.showFolders ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(We, {\n key: 0,\n folderId: a.value,\n \"onUpdate:folderId\": n[0] ||= (e) => a.value = e,\n folder: o.value,\n \"onUpdate:folder\": n[1] ||= (e) => o.value = e,\n projectId: e.projectId,\n folders: e.folders,\n canSelectAll: e.canSelectAllGroups,\n addChanger: e.addChanger,\n addIcon: e.addIcon,\n client: e.client,\n service: r.service\n }, null, 8, [\n \"folderId\",\n \"folder\",\n \"projectId\",\n \"folders\",\n \"canSelectAll\",\n \"addChanger\",\n \"addIcon\",\n \"client\",\n \"service\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0), e.showGroups ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(nt, {\n key: 1,\n ref_key: \"componentGroupsRef\",\n ref: i,\n groupId: s.value,\n \"onUpdate:groupId\": n[2] ||= (e) => s.value = e,\n group: c.value,\n \"onUpdate:group\": n[3] ||= (e) => c.value = e,\n projectId: e.projectId,\n folder: o.value,\n groups: e.groups,\n on: e.on,\n canAdd: e.canAddGroup,\n canEditAndDel: e.canEditAndDelGroup,\n canSelectAll: e.canSelectAllGroups,\n autoselect: e.autoselect,\n addChanger: e.addChanger,\n showPath: e.showGroupsPaths || e.showFolders,\n addIcon: e.addIcon,\n client: e.client,\n service: r.service,\n onAddGroup: d,\n onEditGroup: f,\n onDelGroup: p\n }, null, 8, [\n \"groupId\",\n \"group\",\n \"projectId\",\n \"folder\",\n \"groups\",\n \"on\",\n \"canAdd\",\n \"canEditAndDel\",\n \"canSelectAll\",\n \"autoselect\",\n \"addChanger\",\n \"showPath\",\n \"addIcon\",\n \"client\",\n \"service\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0)]));\n }\n }), at = (e) => ({\n id: null,\n name: e,\n listItemProps: {\n type: \"title\",\n class: \"top-projectSelector_item\"\n }\n }), ot = {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n }, st = (t, n) => {\n let r = [], i = {\n scheduledUpdate: at((0, forms_CY5MOh7a_esm_js_1.E)().Projects.Scheduled_update),\n manualUpdate: at((0, forms_CY5MOh7a_esm_js_1.E)().Projects.Manual_update),\n guestProjects: at((0, forms_CY5MOh7a_esm_js_1.E)().Projects.Guest_projects)\n }, a = n ? {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n } : ot;\n for (let e of t)\n !a.scheduledUpdate && e.right?.startsWith(\"1\") && e.on > 0 && (r.push(i.scheduledUpdate), a.scheduledUpdate = !0), !a.manualUpdate && e.right?.startsWith(\"1\") && e.on === 0 && (r.push(i.manualUpdate), a.manualUpdate = !0), !a.guestProjects && e.right?.startsWith(\"0\") && e.on >= 0 && (r.push(i.guestProjects), a.guestProjects = !0), r.push(e);\n return r;\n }, ct = (e) => ({\n ...e,\n externalLink: mt(e.url ?? \"\"),\n listItemProps: {\n class: \"top-projectSelector_item\",\n attrs: { title: e.name }\n }\n }), lt = (e, t, n) => !e || e.length === 0 ? [] : (t && Object.keys(ot).forEach((e) => ot[e] = !1), st(e.map(ct), n)), ut = (e) => {\n e = e.replace(/#.*/, \"\");\n let t = location.hash;\n return t = t.replace(/%22historyView%22:[^,]*,/, \"\"), t = t.replace(/%22modelsKeys%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22competitorsIds%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22searchersKeys%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22regionIndex%22:[^,]*,/, \"\"), t = t.replace(/%22regionsIndexes%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22folderId%22:[^,]*,/, \"\"), t = t.replace(/%22groupId%22:[^,]*,/, \"\"), t = t.replace(/%22tagsIds%22:\\[[^\\]]*],/, \"\"), /%22dataSort%22:\\{[^}]*0000-00-00[^}]*}/.test(t) || (t = t.replace(/,?%22dataSort%22:\\{[^}]*}(,?)/, \"$1\")), e + t;\n }, dt = (e) => {\n location.href = ft(e);\n }, ft = (e) => {\n let t = pt(), n = location.pathname.split(\"/\"), r = \"project/dynamics/\", i = \"\";\n n[1] == \"project\" && (r = n[1] + \"/\" + n[2] + \"/\"), n[2] == \"settings\" && (i = location.hash), [\n \"watcher\",\n \"indexing\",\n \"sitemap\",\n \"audit\",\n \"direct\",\n \"adwords\"\n ].includes(n[4]) && (i = n[4] + \"/\");\n let a = \"https://\" + t + \"/\" + r + e + \"/\" + i;\n return a = ut(a), a;\n }, pt = () => window.page?.subdomain ? window.location.host.replace(window.page?.subdomain + \".\", \"\") : window.location.host, mt = (e) => {\n let t = e.startsWith(\"http\") ? e : \"https://\" + e;\n return t = t.replace(/\"/g, \"%22\"), t;\n }, ht = (e, t) => {\n let n = e.params.filters ?? [];\n n = n.filter((e) => e.name !== \"GEN_SEARCH_STRING()\");\n let r = (0, keyboard_js_1.invertKeyboardLayout)(t), i = t.replace(/([[^$.|?*+()])/g, \"\\\\$1\"), a = r.replace(/([[^$.|?*+()])/g, \"\\\\$1\");\n t && n.push((0, field_DEusYVqS_esm_js_1.t)(\"GEN_SEARCH_STRING()\", \"REGEXP\", [`(${i}|${a})`])), e.changeParams({ filters: n });\n }, gt = (e) => {\n let n = e.gen(\"/get/projects_2/projects/\", [\n \"id\",\n \"user_id\",\n \"name\",\n \"url\",\n \"on\",\n \"right\"\n ]);\n return n.changeParams({\n filters: [(0, field_DEusYVqS_esm_js_1.t)(\"on\", \"GREATER_THAN_EQUALS\", [0])],\n orders: [\n (0, field_DEusYVqS_esm_js_1.n)(\"user_id\", \"DESC\", [forms_CY5MOh7a_esm_js_1.O.state.userId]),\n (0, field_DEusYVqS_esm_js_1.n)(\"on\", \"DESC\"),\n (0, field_DEusYVqS_esm_js_1.n)(\"favorite\", \"DESC\"),\n (0, field_DEusYVqS_esm_js_1.n)(\"id\", \"DESC\")\n ]\n }), n.options.loadingShowSpinner = !1, n.options.onApiLoaded = (e, t, n) => {\n let r = t.data.filters.length === 1 && t.data.offset === 0 || t.data.limit === 1e3, i = t.data.limit === 100 && t.data.filters.length > 1 || void 0;\n e.result = lt(e.result, r, i), n?.(e, t);\n }, n;\n }, _t = (e) => e.gen(\"/add/projects_2/projects/\"), vt = { class: \"top-ellipsis1\" }, yt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"submenu\",\n props: { id: {} },\n setup(n) {\n let r = n, i = (0, forms_CY5MOh7a_esm_js_1.E)(), a = pt(), o = (e) => {\n let n = [\n {\n href: `https://${a}/project/keywords/${e.id}/`,\n title: i.Common.Menu_phrases,\n icon: \"\",\n right: \"2\"\n },\n {\n href: `https://${a}/project/dynamics/${e.id}/`,\n title: i.Common.Menu_dynamics,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/snapshots/${e.id}/`,\n title: i.Common.Menu_snapshots,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/competitors/${e.id}/`,\n title: i.Common.Menu_competitors,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/ai-tracker/${e.id}/`,\n title: i.Common.Menu_aiTracker,\n icon: \"\",\n right: \"13\"\n },\n {\n href: `https://${a}/project/analytics/${e.id}/`,\n title: i.Common.Menu_analytics,\n icon: \"\",\n right: \"5\"\n },\n {\n href: `https://${a}/project/broker/${e.id}/`,\n title: i.Common.Menu_broker,\n icon: \"\",\n right: \"6\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/sitemap/`,\n title: i.Audit.Sitemap_gen,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/audit/`,\n title: i.Common.Menu_audit,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/indexing/`,\n title: i.Audit.Indexing,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/watcher/`,\n title: i.Audit.Watcher,\n icon: \"\",\n right: \"9\"\n },\n {\n href: `https://${a}/project/settings/${e.id}/`,\n title: i.Common.Menu_settings,\n icon: \"\",\n right: \"2\"\n }\n ].filter((e) => !Object.entries(forms_CY5MOh7a_esm_js_1.O.state.closedByMod).some(([t, n]) => n && e.href.includes(`/${t}/`)));\n return e.right.includes(\"0\") ? n.filter((t) => e.right[t.right] === \"1\") : n;\n };\n return (e, t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_3cwJ8Hev_esm_js_1.s), {\n id: r.id,\n class: \"top-projectSelectorSubmenu\",\n notch: !1,\n pos: \"2\"\n }, {\n contentList: (0, vue_1.withCtx)(({ data: t }) => [t ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(o(t.projectItem), (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_3cwJ8Hev_esm_js_1.o), {\n href: t.href,\n title: t.title,\n \"data-top-icon\": t.icon,\n \"data-right\": t.right\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$core.state.isMobile ? t.title : \"\"), 1)]),\n _: 2\n }, 1032, [\n \"href\",\n \"title\",\n \"data-top-icon\",\n \"data-right\"\n ]))), 256)), (0, vue_1.createVNode)((0, vue_1.unref)(popup_3cwJ8Hev_esm_js_1.o), {\n href: t.projectItem.externalLink,\n title: t.projectItem.externalLink,\n class: \"top-ellipsis\",\n \"data-top-icon\": \"\",\n target: \"_blank\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", vt, (0, vue_1.toDisplayString)(e.$core.state.isMobile ? t.projectItem.externalLink : \"\"), 1)]),\n _: 2\n }, 1032, [\"href\", \"title\"])], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 1\n }, 8, [\"id\"]));\n }\n }), bt = 1440 * 60 * 1e3, J = (0, vue_1.ref)(null), Y = (0, vue_1.shallowRef)(), xt = (e) => {\n localStorage.setItem(\"ui_project_selector_total:\" + forms_CY5MOh7a_esm_js_1.O.state.userId, JSON.stringify({\n projectsTotal: e,\n expiresAt: Date.now() + bt\n }));\n }, St = () => {\n let e = localStorage.getItem(\"ui_project_selector_total:\" + forms_CY5MOh7a_esm_js_1.O.state.userId);\n if (!e)\n return;\n let { projectsTotal: n, expiresAt: r } = JSON.parse(e);\n if (Date.now() > r) {\n localStorage.removeItem(\"ui_project_selector_total:\" + forms_CY5MOh7a_esm_js_1.O.state.userId);\n return;\n }\n return n;\n }, Ct = () => {\n J.value = null, Y.value = void 0, localStorage.removeItem(\"ui_project_selector_total:\" + forms_CY5MOh7a_esm_js_1.O.state.userId), (0, formsExt_C9r4Gz9y_esm_js_1.d)(\"/get/projects_2/projects/\");\n }, wt = { class: \"top-projectSelector_itemText\" }, Tt = { class: \"top-comment\" }, Et = {\n key: 0,\n class: \"top-comment\"\n }, Dt = [\"href\"], Ot = 1e3, kt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"projectSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n client: {},\n menuMode: { type: Boolean },\n excludeProjectId: {},\n openerShortcut: {},\n modificator: {},\n placeholder: {},\n buttonProps: {}\n }, {\n modelValue: { default: () => ({\n id: null,\n name: \"\"\n }) },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let r = (0, forms_CY5MOh7a_esm_js_1.E)(), i = n, a = (0, vue_1.useModel)(n, \"modelValue\"), o = gt(i.client), s = _t(i.client), c = (0, vue_1.ref)(St()), l = (0, vue_1.ref)(null), f = (0, vue_1.useId)(), p = (0, vue_1.computed)(() => i.placeholder ?? r.Projects.Select_project), m = (0, vue_1.computed)(() => !Y.value || !i.excludeProjectId ? Y.value : Y.value.filter((e) => e.id !== i.excludeProjectId)), h = (0, vue_1.computed)(() => {\n if (!(!c.value && c.value !== 0))\n return c.value < Ot ? \"static\" : \"api\";\n }), _ = async () => {\n J.value ||= o.call();\n let e = await J.value;\n return J.value = null, e;\n }, v = async (e) => {\n let n = await s.changeParams({\n url: e.name,\n name: e.name\n }).call();\n if (!n.errors) {\n if (Y.value && h.value === \"static\") {\n let r = ct({\n id: n.result,\n user_id: forms_CY5MOh7a_esm_js_1.O.state.userId,\n name: e.name,\n url: e.name,\n on: 0,\n right: \"11111111111111111111\"\n }), i = Y.value.findIndex((e) => e.on === 0);\n Y.value = [\n ...Y.value.slice(0, i),\n r,\n ...Y.value.slice(i)\n ], c.value && (c.value += 1, xt(c.value));\n }\n h.value === \"api\" && l.value?.resetCache(!0);\n }\n }, ee = async () => {\n if (Y.value || h.value === \"api\")\n return;\n let e = await _();\n e.errors || (Y.value = e.result);\n }, y = async () => {\n if (c.value)\n return;\n let e = await _();\n e.errors || (c.value = e.total ?? void 0, h.value === \"static\" && !Y.value && (Y.value = e.result), c.value && xt(c.value));\n };\n return (0, vue_1.onMounted)(async () => {\n await y();\n }), (e, t) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [(0, vue_1.createVNode)(formsExt_C9r4Gz9y_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: l,\n class: \"top-projectSelector\",\n modelValue: a.value,\n \"onUpdate:modelValue\": t[1] ||= (e) => n.menuMode ? (0, vue_1.unref)(dt)(e.id) : a.value = e,\n items: m.value,\n itemsIsLoading: h.value === \"static\" && (0, vue_1.unref)(Y) === void 0,\n title: e.$i18n.Projects.Search_projects,\n modificator: n.modificator,\n searchFields: [\n \"id\",\n \"name\",\n \"url\"\n ],\n placeholder: p.value,\n hasCloserBtn: \"\",\n api: h.value === \"api\" ? (0, vue_1.unref)(o) : void 0,\n apiSetSearchParams: h.value === \"api\" ? (...e) => (0, vue_1.unref)(ht)(...e) : void 0,\n useCache: \"\",\n appendSearchToResult: \"\",\n appendSearchAllowDuplicate: \"\",\n appendSearchToResultCond: (0, vue_1.unref)(check_js_1.validUrl),\n appendWithoutSelect: \"\",\n buttonProps: n.buttonProps,\n openerShortcut: n.openerShortcut,\n onAppendItem: v,\n onOpen: ee\n }, {\n item: (0, vue_1.withCtx)(({ item: i }) => [(0, vue_1.createElementVNode)(\"div\", wt, [i.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)((0, vue_1.unref)(string_js_1.ellipsis)(i.name, 20)) + \" \", 1), (0, vue_1.createElementVNode)(\"span\", Tt, \" id \" + (0, vue_1.toDisplayString)(i.id), 1)], 64)) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 1 }, [i.listItemProps?.type ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Et, (0, vue_1.toDisplayString)(e.$i18n.Projects.Add_project) + \": \", 1)), (0, vue_1.createTextVNode)(\" \" + (0, vue_1.toDisplayString)(i.name), 1)], 64))]), i.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [\n n.menuMode ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"a\", {\n key: 0,\n class: \"top-projectSelector_itemLink\",\n href: (0, vue_1.unref)(ft)(i.id)\n }, null, 8, Dt)) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.$core.state.isMobile ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(r, {\n key: 1,\n href: i.externalLink,\n \"data-top-icon\": \"\",\n color: \"theme\",\n target: \"_blank\",\n onClick: t[0] ||= (0, vue_1.withModifiers)(() => { }, [\"stop\"])\n }, null, 8, [\"href\"])),\n (0, vue_1.createVNode)(popup_3cwJ8Hev_esm_js_1.c, {\n id: (0, vue_1.unref)(f),\n pos: \"2\",\n notch: !1,\n data: { projectItem: i }\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(r, {\n class: \"top-popup_listMore\",\n \"data-top-icon\": \"\",\n color: \"theme\"\n })]),\n _: 1\n }, 8, [\"id\", \"data\"])\n ], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"itemsIsLoading\",\n \"title\",\n \"modificator\",\n \"placeholder\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResultCond\",\n \"buttonProps\",\n \"openerShortcut\"\n ]), (0, vue_1.createVNode)(yt, { id: (0, vue_1.unref)(f) }, null, 8, [\"id\"])], 64);\n };\n }\n }), At = (e) => \"-\" + e, X = (e) => e[0] === \"-\" ? e.substring(1) : e, Z = (e, t) => {\n e = X(e);\n let n = t.find((t) => t.id === e);\n if (n)\n return n;\n }, jt = (e, t, n) => {\n t ||= { id: e.id }, t.id = e.id, t.pos ??= \"3\", t.notch ??= !0, t.posBy ??= \"fixed\";\n let r = worker_Bv_yPPMv_esm_js_1.t.genElPopupOpener(\"div\", t);\n return r.classList.add(\"top-tagSelector\"), e.useTopButton && r.classList.add(\"top-tagSelector-useTopButton\", \"top-button\", \"top-color_theme\", \"top-as-selector\"), e.useTopButton || r.classList.add(\"top-tagSelector-custom\"), e.mode === \"filter\" && r.classList.add(\"top-tagSelector-filter\"), e.mode === \"setter\" && !e.filters && r.classList.add(\"top-tagSelector-setter_single\"), e.mode === \"setter\" && e.filters && r.classList.add(\"top-tagSelector-setter_several\"), r.onclick = (t) => {\n t.preventDefault(), t.stopPropagation(), r.onclick = null;\n let i = (0, vue_1.ref)(e.modelValue), a = {\n model: i,\n mode: e.mode,\n targetId: e.targetId,\n filters: e.filters,\n payload: e.payload\n };\n (0, dom_js_1.storage)(r, \"topTagSelectorTarget\", a), delete r.dataset.topPopupDisabled, (0, vue_1.isRef)(e.modelValue) || (0, vue_1.watch)(i, () => {\n e.modelValue = i.value, Q(r, e, n);\n }), r.click();\n }, (0, vue_1.isRef)(e.modelValue) ? (0, vue_1.watch)(e.modelValue, () => Q(r, e, n)) : (0, dom_js_1.storage)(r, \"topTagSelectorRender\", (t) => {\n e.modelValue = t;\n let i = (0, dom_js_1.storage)(r, \"topTagSelectorTarget\");\n i && (i.model.value = t), Q(r, e, n);\n }), Q(r, e, n), r;\n }, Mt = (e, t) => {\n (0, dom_js_1.storage)(e, \"topTagSelectorRender\")?.(t);\n }, Q = (t, n, r) => {\n let i = (0, vue_1.unref)(n.modelValue);\n if (t.classList.toggle(\"top-tagSelector-selectedOne\", !i.length || i.length === 1), t.classList.toggle(\"top-tagSelector-toTwoLine\", i.length > 5), n.mode === \"setter\" && n.filters) {\n t.innerHTML = `<div>${r}</div>`;\n return;\n }\n if (t.innerHTML = \"\", !i.length && n.mode === \"filter\") {\n let n = Nt({\n id: \"all\",\n colorId: \"\",\n name: (0, forms_CY5MOh7a_esm_js_1.E)().Common?.All_tags ?? \"\",\n state: \"\"\n });\n t.append(n);\n }\n i.forEach((e) => {\n let r = Nt({\n id: X(e),\n colorId: Z(e, n.tags)?.color_id ?? \"\",\n name: Z(e, n.tags)?.name ?? \"\",\n state: X(e) === e ? \"selected\" : \"excluded\"\n });\n t.append(r);\n });\n }, Nt = (e) => {\n let t = document.createElement(\"div\");\n return t.classList.add(\"top-tagSelector_tagIcon\"), t.classList.toggle(\"top-tagSelector-active\", !!e.state), t.classList.toggle(\"top-tagSelector-excluded\", e.state === \"excluded\"), t.dataset.tag_id = e.id, t.dataset.tag_color_id = e.colorId, t.title = e.name, t;\n }, Pt = [\n {\n id: \"1\",\n name: \"Without Tag\",\n color_id: \"1\"\n },\n {\n id: \"2\",\n name: \"Red\",\n color_id: \"2\"\n },\n {\n id: \"3\",\n name: \"Orange\",\n color_id: \"3\"\n },\n {\n id: \"4\",\n name: \"Yellow\",\n color_id: \"4\"\n },\n {\n id: \"5\",\n name: \"Blue\",\n color_id: \"5\"\n },\n {\n id: \"6\",\n name: \"Purple\",\n color_id: \"6\"\n },\n {\n id: \"7\",\n name: \"Green\",\n color_id: \"7\"\n },\n {\n id: \"8\",\n name: \"Magenta\",\n color_id: \"8\"\n },\n {\n id: \"9\",\n name: \"Dark blue\",\n color_id: \"9\"\n },\n {\n id: \"10\",\n name: \"Turquoise\",\n color_id: \"10\"\n }\n ], Ft = [\n \"data-tag_id\",\n \"data-tag_color_id\",\n \"title\"\n ], It = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagIcon\",\n props: {\n id: {},\n colorId: {},\n name: {},\n state: {}\n },\n setup(e) {\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagIcon\": !0,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n \"data-tag_id\": e.id,\n \"data-tag_color_id\": e.colorId,\n title: e.name\n }, null, 10, Ft));\n }\n }), Lt = [\"contenteditable\", \"onKeydown\"], Rt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagPopupListItem\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n editable: { type: Boolean },\n disabled: { type: Boolean },\n canExclude: { type: Boolean },\n id: {},\n colorId: {},\n name: {},\n state: {}\n }, {\n name: { required: !0 },\n nameModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"update:name\",\n \"unselect\",\n \"exclude\",\n \"select\"\n ], [\"update:name\"]),\n setup(e, { emit: t }) {\n let n = e, r = t, i = (0, vue_1.useModel)(e, \"name\"), a = (0, vue_1.ref)(null), o = (0, vue_1.computed)(() => navigator.userAgent.indexOf(\"Firefox\") == -1 ? {} : {\n contenteditable: s.value,\n onpaste: (e) => e.preventDefault()\n }), s = (0, vue_1.ref)(!1), c = async () => {\n s.value = !0, await (0, vue_1.nextTick)(), a.value?.focus();\n }, l = () => {\n let e = a.value?.innerText;\n if (!e)\n return u();\n a.value && (a.value.innerText = e), s.value = !1, r(\"update:name\", e);\n }, u = async () => {\n a.value && (a.value.innerText = n.name), s.value = !1;\n }, d = (e) => {\n if (s.value || n.disabled)\n return;\n let t = \"selected\";\n n.canExclude && (e.ctrlKey || e.metaKey) && (t = \"excluded\"), n.state == t && (t = \"\"), t === \"\" && r(\"unselect\"), t === \"selected\" && r(\"select\"), t === \"excluded\" && r(\"exclude\");\n };\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_3cwJ8Hev_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagListItem\": !0,\n \"top-tagSelector_tagListItem-inEdit\": s.value,\n \"top-tagSelector_tagListItem-disabled\": e.disabled,\n \"top-tagSelector_tagListItem-canExclude\": e.canExclude,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n onClick: (0, vue_1.withModifiers)(d, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [\n (0, vue_1.createVNode)(It, {\n id: e.id,\n name: i.value,\n colorId: e.colorId,\n state: e.state\n }, null, 8, [\n \"id\",\n \"name\",\n \"colorId\",\n \"state\"\n ]),\n (0, vue_1.createElementVNode)(\"span\", (0, vue_1.mergeProps)({\n ref_key: \"elName\",\n ref: a,\n class: \"top-tagSelector_tagListItemName\",\n contenteditable: s.value ? \"plaintext-only\" : !1\n }, o.value, { onKeydown: [(0, vue_1.withKeys)((0, vue_1.withModifiers)(l, [\"stop\"]), [\"enter\"]), (0, vue_1.withKeys)((0, vue_1.withModifiers)(u, [\"stop\"]), [\"esc\"])] }), (0, vue_1.toDisplayString)(i.value), 17, Lt),\n e.editable ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [s.value ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 1,\n \"data-top-icon\": \"\",\n class: \"top-tagSelector_edit\",\n onClick: (0, vue_1.withModifiers)(l, [\"stop\"])\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 0,\n \"data-top-icon\": \"\",\n class: \"top-tagSelector_edit\",\n onClick: c\n }))], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)\n ]),\n _: 1\n }, 8, [\"class\"]));\n }\n }), zt = { key: 1 }, Bt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n inheritAttrs: !1,\n __name: \"popupOpener\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n id: {},\n tags: {},\n mode: {},\n targetId: {},\n filters: {},\n useTopButton: { type: Boolean },\n payload: {},\n styling: {}\n }, {\n modelValue: { required: !0 },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(e) {\n let t = e, n = (0, vue_1.useModel)(e, \"modelValue\"), i = t.useTopButton ? forms_CY5MOh7a_esm_js_1.h : \"div\", a = t.useTopButton ? \"html\" : \"default\", o = {\n model: n,\n mode: t.mode,\n targetId: t.targetId,\n filters: t.filters,\n payload: t.payload\n };\n return (r, s) => {\n let c = (0, vue_1.resolveDirective)(\"top-data\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_3cwJ8Hev_esm_js_1.c, { id: e.id }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.withDirectives)(((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)((0, vue_1.unref)(i)), (0, vue_1.mergeProps)({\n class: {\n \"top-tagSelector\": !0,\n \"top-tagSelector-useTopButton\": t.useTopButton,\n \"top-tagSelector-custom\": !t.useTopButton,\n \"top-as-selector\": t.useTopButton,\n \"top-tagSelector-filter\": t.mode === \"filter\",\n \"top-tagSelector-setter_single\": t.mode === \"setter\" && !e.filters,\n \"top-tagSelector-setter_several\": t.mode === \"setter\" && e.filters,\n \"top-tagSelector-selectedOne\": !n.value.length || n.value.length === 1,\n \"top-tagSelector-toTwoLine\": n.value.length > 5\n },\n color: \"theme\",\n styling: e.styling\n }, r.$attrs), {\n [(0, vue_1.unref)(a)]: (0, vue_1.withCtx)(() => [!n.value.length && e.mode === \"filter\" ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(It, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: r.$i18n.Common.All_tags ?? \"\",\n state: \"\"\n }, null, 8, [\"name\"])) : (0, vue_1.createCommentVNode)(\"\", !0), e.mode === \"setter\" && e.filters ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", zt, [(0, vue_1.renderSlot)(r.$slots, \"default\")])) : ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 2 }, (0, vue_1.renderList)(n.value, (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(It, {\n id: (0, vue_1.unref)(X)(t),\n colorId: (0, vue_1.unref)(Z)(t, e.tags)?.color_id ?? \"\",\n name: (0, vue_1.unref)(Z)(t, e.tags)?.name ?? \"\",\n state: (0, vue_1.unref)(X)(t) === t ? \"selected\" : \"excluded\"\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\"\n ]))), 256))]),\n _: 2\n }, 1040, [\"class\", \"styling\"])), [[\n c,\n o,\n \"topTagSelectorTarget\"\n ]])]),\n _: 3\n }, 8, [\"id\"]);\n };\n }\n }), Vt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n tags: {},\n tagsEditable: { type: Boolean },\n tagsMax: { default: 10 },\n id: {},\n singleMode: { type: Boolean },\n requiredForSetter: {\n type: Boolean,\n default: !0\n },\n maxTagsForSetter: {},\n emitDelay: { default: 500 },\n useTopButton: {\n type: Boolean,\n default: !0\n },\n styling: {}\n }, {\n modelValue: { required: !0 },\n modelModifiers: {},\n tags: { default: (0, vue_1.reactive)(Pt) },\n tagsModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"selector\",\n \"setter\",\n \"tagsChanged\"\n ], [\"update:modelValue\", \"update:tags\"]),\n setup(a, { emit: o }) {\n let c = (0, forms_CY5MOh7a_esm_js_1.E)(), l = a, u = (0, vue_1.useModel)(a, \"modelValue\"), d = (0, vue_1.useModel)(a, \"tags\"), f = o, p = (0, forms_CY5MOh7a_esm_js_1.P)((e, t) => {\n f(e, t);\n }, l.emitDelay);\n l.singleMode && !u.value.length && (u.value = [d.value[0].id]);\n let m = l.id ?? \"top-popup-id-\" + Math.random(), h = (0, vue_1.ref)(\"add\"), g = () => {\n let e = \" \" + c.Common.Tags?.toLowerCase(), t = /* @__PURE__ */ new Map();\n return t.set(\"add\", {\n value: \"add\",\n title: c.Common.Add + e\n }), t.set(\"replace\", {\n value: \"replace\",\n title: c.Common.Replace + e\n }), t.set(\"delete\", {\n value: \"delete\",\n title: c.Common.Delete + e\n }), t;\n }, _ = (0, vue_1.shallowRef)({\n model: u,\n mode: \"filter\",\n targetId: void 0,\n filters: void 0,\n payload: void 0\n });\n (0, vue_1.watch)(u, () => {\n p(\"selector\", u.value);\n });\n let ee = (0, vue_1.computed)(() => {\n if (_.value.mode === \"setter\" && l.maxTagsForSetter && !_.value.filters)\n return _.value.model.value.length >= l.maxTagsForSetter;\n }), b = (e) => {\n if (e !== \"all\") {\n if (_.value.model.value.includes(e))\n return \"selected\";\n if (_.value.model.value.includes(At(e)))\n return \"excluded\";\n }\n return e === \"all\" && !_.value.model.value.length ? \"selected\" : \"\";\n }, x = (e, t) => {\n let n = At(e), r = _.value.model.value.filter((t) => t !== e && t !== n);\n t === \"select\" && r.push(e), t === \"exclude\" && r.push(n), _.value.mode === \"setter\" && _.value.targetId !== void 0 && l.requiredForSetter && (r.length || r.push(\"1\"), r.length === 2 && _.value.model.value.length === 1 && _.value.model.value[0] === \"1\" && (r = r.filter((e) => e !== \"1\"))), l.singleMode && !_.value.filters && (r.length || (r = _.value.model.value), r.length > 1 && (r = [r[r.length - 1]])), r.sort((e, t) => l.tags ? l.tags.findIndex((t) => t.id === e) - l.tags.findIndex((e) => e.id === t) : 0), _.value.model.value = r, _.value.mode === \"setter\" && _.value.targetId !== void 0 && p(\"setter\", {\n tagsIds: r,\n targetId: _.value.targetId,\n payload: _.value.payload\n });\n }, S = (0, vue_1.computed)(() => {\n let e = \"top-tagSelector_popup\";\n return _.value.mode === \"filter\" && (e += \" top-tagSelector_popup-filter\"), _.value.mode === \"setter\" && (e += \" top-tagSelector_popup-setter\"), e;\n }), te = () => {\n let e = prompt(\"\", \"New tag\");\n if (!e || e === \"New tag\")\n return;\n let t = d.value.length + 1;\n d.value.push({\n id: String(t),\n name: e,\n color_id: String((t - 1) % 10 + 1)\n }), f(\"tagsChanged\", d.value);\n }, O = (e) => {\n if (_.value = (0, dom_js_1.storage)(e.elPopupOpener, \"topTagSelectorTarget\"), !_.value)\n throw Error(\"Open popup TopTagSelector required v-data:topTagSelectorTarget\");\n if (_.value.filters && (h.value = \"add\", _.value.model.value = []), !forms_CY5MOh7a_esm_js_1.O.$?.ui.sortable) {\n console.info(\"Для работы сортировки требуется глобальная загрузка jQuery UI Sortable\");\n return;\n }\n !forms_CY5MOh7a_esm_js_1.O.state.isMobile && !forms_CY5MOh7a_esm_js_1.O.state.isMobileUA && d.value && $(e.elPopup).sortable({\n items: \"li:has([data-tag_id]:not([data-tag_id=\\\"all\\\"]))\",\n cancel: \"[contenteditable=\\\"plaintext-only\\\"], [contenteditable=\\\"true\\\"]\",\n distance: 10,\n stop: function (e, t) {\n if (!d.value)\n return;\n let n = $(t.item).parent().find(\"[data-tag_id]\"), r = [];\n n.each((e, t) => {\n if (!d.value)\n return;\n let n = $(t).attr(\"data-tag_id\");\n r.push(n);\n }), d.value.sort((e, t) => r.findIndex((t) => t === e.id) - r.findIndex((e) => e === t.id)), p(\"tagsChanged\", d.value);\n }\n });\n }, j = (e) => {\n forms_CY5MOh7a_esm_js_1.O.$?.ui.sortable && $(e.elPopup).data(\"ui-sortable\") && $(e.elPopup).sortable(\"destroy\");\n };\n return (e, t) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [(0, vue_1.createVNode)(Bt, {\n modelValue: u.value,\n \"onUpdate:modelValue\": t[0] ||= (e) => u.value = e,\n id: (0, vue_1.unref)(m),\n tags: d.value,\n styling: a.styling,\n mode: \"filter\",\n useTopButton: a.useTopButton\n }, null, 8, [\n \"modelValue\",\n \"id\",\n \"tags\",\n \"styling\",\n \"useTopButton\"\n ]), (0, vue_1.createVNode)(popup_3cwJ8Hev_esm_js_1.s, {\n id: (0, vue_1.unref)(m),\n class: (0, vue_1.normalizeClass)(S.value),\n onOpen: t[4] ||= (e) => O(e),\n onClose: t[5] ||= (e) => j(e),\n \"transition-duration\": 50\n }, (0, vue_1.createSlots)({\n contentList: (0, vue_1.withCtx)(() => [\n _.value.mode === \"filter\" && !a.singleMode ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Rt, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: e.$i18n.Common.All_tags ?? \"\",\n state: _.value.model.value.length ? \"\" : \"selected\",\n onSelect: t[3] ||= (e) => _.value.model.value = []\n }, null, 8, [\"name\", \"state\"])) : (0, vue_1.createCommentVNode)(\"\", !0),\n ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(d.value, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Rt, {\n key: e.id,\n id: e.id,\n colorId: e.color_id,\n name: e.name,\n state: b(e.id),\n canExclude: _.value.mode === \"filter\" && !a.singleMode,\n editable: a.tagsEditable,\n disabled: ee.value && b(e.id) === \"\",\n onUnselect: (t) => x(e.id, \"unselect\"),\n onSelect: (t) => x(e.id, \"select\"),\n onExclude: (t) => x(e.id, \"exclude\"),\n \"onUpdate:name\": (t) => {\n e.name = t, (0, vue_1.unref)(p)(\"tagsChanged\", d.value);\n }\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\",\n \"canExclude\",\n \"editable\",\n \"disabled\",\n \"onUnselect\",\n \"onSelect\",\n \"onExclude\",\n \"onUpdate:name\"\n ]))), 128)),\n a.tagsEditable && d.value.length < a.tagsMax && d.value.length < 20 ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_3cwJ8Hev_esm_js_1.o, {\n key: 1,\n \"data-top-icon\": \"\",\n onClick: (0, vue_1.withModifiers)(te, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Add), 1)]),\n _: 1\n })) : (0, vue_1.createCommentVNode)(\"\", !0)\n ]),\n _: 2\n }, [_.value.mode === \"setter\" && _.value.filters ? {\n name: \"header\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CY5MOh7a_esm_js_1.n, {\n modelValue: h.value,\n \"onUpdate:modelValue\": t[1] ||= (e) => h.value = e,\n options: g()\n }, null, 8, [\"modelValue\", \"options\"])]),\n key: \"0\"\n } : void 0, _.value.mode === \"setter\" && _.value.filters ? {\n name: \"footer\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CY5MOh7a_esm_js_1.h, { color: \"theme\" }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Cancel), 1)]),\n _: 1\n }), (0, vue_1.createVNode)(forms_CY5MOh7a_esm_js_1.h, { onClick: t[2] ||= (e) => (0, vue_1.unref)(p)(\"setter\", {\n tagsIds: _.value.model.value,\n filters: _.value.filters,\n filtersAction: h.value,\n payload: _.value.payload\n }) }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(h.value === \"add\" ? e.$i18n.Common.Add : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"replace\" ? e.$i18n.Common.Replace : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"delete\" ? e.$i18n.Common.Delete : \"\"), 1)]),\n _: 1\n })]),\n key: \"1\"\n } : void 0]), 1032, [\"id\", \"class\"])], 64));\n }\n });\n exports.TopGroupSelector = it;\n exports.topProjectSelectorClearCache = Ct;\n exports.TopProjectSelector = kt;\n exports.genElTopTagSelectorPopupOpener = jt;\n exports.renderElTopTagSelectorPopupOpener = Mt;\n exports.TopTagSelectorTagIcon = It;\n exports.TopTagSelectorPopupOpener = Bt;\n exports.TopTagSelector = Vt;\n});\n//# sourceMappingURL=project.js.map\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props } from './types';\nimport Core from '@/core/core/core';\nimport Button from '@/components/forms/button/button.vue';\nimport Popup from '@/components/popup/popup/popup.vue';\nimport ListItem from '@/components/popup/popup/listItem.vue';\nimport Menu from '@/components/formsExt/menu/menu.vue';\nimport { useI18n } from '@/core/plugins/i18n';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowSelectAllItem: true,\n\tselectAllItemIcon: '',\n});\nconst model = defineModel<Props['modelValue']>();\n\nconst selectAllItem = computed(() => {\n\tif (props.showSelectAllItem) {\n\t\treturn {\n\t\t\ticon: props.selectAllItemIcon,\n\t\t\ttitle: useI18n().Common.Select_all,\n\t\t\tvalue: 'all',\n\t\t\tcontent: '',\n\t\t};\n\t}\n\t\n\treturn undefined;\n});\n</script>\n\n<template>\n\t<div class=\"top-competitorSelector\">\n\t\t<Popup v-if=\"Core.state.isMobile\">\n\t\t\t<template #opener>\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-competitorSelector_opener\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t\ticon2=\"\"\n\t\t\t\t>\n\t\t\t\t\t{{ items.find((item) => item.value === model?.[0])?.content }}\n\t\t\t\t</Button>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<ListItem\n\t\t\t\t\tv-for=\"(item) in items\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t'top-active': model?.includes(item.value)\n\t\t\t\t\t}\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t@click=\"() => model = [item.value]\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"top-ellipsis1\">\n\t\t\t\t\t\t{{ item.content }}\n\t\t\t\t\t</span>\n\t\t\t\t</ListItem>\n\t\t\t</template>\n\t\t</Popup>\n\n\t\t<Menu\n\t\t\tv-else\n\t\t\tv-model=\"model\"\n\t\t\t:items=\"items\"\n\t\t\t:isMultiple=\"true\"\n\t\t\tstyling=\"bar\"\n\t\t\t:canBeEmptyMultiple=\"false\"\n\t\t\t:selectAllItem=\"selectAllItem\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-competitorSelector_opener.top-button {\n\twidth: 100%;\n}\n</style>\n","import type { MaybeRefOrGetter } from 'vue';\nimport { computed, toValue } from 'vue';\nimport type { Competitor, Item } from '@/components/project/competitorSelector/types';\n\nexport const useItemsFromCompetitors = (competitors: MaybeRefOrGetter<Competitor[]>, projectId: MaybeRefOrGetter<number>) => {\n\treturn computed(() => {\n\t\tconst activeCompetitors = toValue(competitors).filter(competitor => competitor.on >= 0 || competitor.id === projectId);\n\n\t\tconst items: Item[] = activeCompetitors.map(competitor => {\n\t\t\treturn {\n\t\t\t\tvalue: competitor.id,\n\t\t\t\ttitle: competitor.url + ` [${competitor.id}]`,\n\t\t\t\ticon: competitor.id === toValue(projectId) ? '' : '',\n\t\t\t\tcontent: competitor.name,\n\t\t\t};\n\t\t});\n\n\t\treturn items;\n\t});\n};\n","import type { Region, SearcherIndexed } from '../types';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Ключ ПС - для выбора нескольких ПС или регионов\n */\nexport const searhcerCompareKey = -1;\n\n/**\n * Ключ ПС или индекса Региона, используется для ПС или Региона, не настроенных в проекте\n *\n * Также, используется для API с возможностью не указывать регион, см. `props.autoRegion`\n */\nexport const dummyIndex = -2;\n\n/**\n * Регион - без региона\n */\nexport const globalRegionIndex = -1;\n\nexport const searchersNames = {\n\t0: 'Yandex',\n\t1: 'Google',\n\t4: 'YouTube',\n\t5: 'Bing',\n\t7: 'Seznam',\n\t8: 'AppStore',\n\t9: 'GoogleStore',\n\t20: 'Yandex.com',\n\t21: 'Yandex.com.tr',\n};\n\nexport const regionUndefined: Region = {\n\tkey: dummyIndex,\n\tname: '--',\n\tindex: dummyIndex,\n};\n\nexport const searcherUndefined: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: '--',\n\tregions: [regionUndefined],\n\tregionByIndex: new Map([[dummyIndex, regionUndefined]]),\n};\n\nconst regionAuto: Region = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tindex: dummyIndex,\n};\n\nconst searcherAuto: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tregions: [regionAuto],\n\tregionByIndex: new Map([[dummyIndex, regionAuto]]),\n};\n\nconst regionGlobal: Region = {\n\tcountryCode: '00',\n\tdepth: 1,\n\tdevice: 0,\n\tkey: globalRegionIndex,\n\tindex: globalRegionIndex,\n\tlang: 'ru',\n\tname: 'Without region',\n};\n\nexport const getRegionAuto = () => {\n\tregionAuto.name = useI18n().Common.Autoselect!;\n\n\treturn regionAuto;\n};\n\nexport const getSearcherAuto = () => {\n\tgetRegionAuto();\n\n\tsearcherAuto.name = useI18n().Common.Autoselect!;\n\tconsole.log(searcherAuto);\n\n\treturn searcherAuto;\n};\n\nexport const getRegionGlobal = () => {\n\tregionGlobal.name = useI18n().Keywords.Without_region!;\n\n\treturn regionGlobal;\n};\n","import Core from '@/core/core/core';\nimport type { ForMode, Region, Searcher, SearcherByKey, SearcherIndexed } from '../types';\nimport { dummyIndex, getRegionGlobal, getSearcherAuto, searchersNames, searcherUndefined } from './consts';\nimport { useAsyncTopDialog } from '@/components/dialog/dialog/composables/utils';\n\n/**\n * Генерация Map ПС с Map регионов из массива searchers\n * - ключ для ПС - searcherKey\n * - ключ для региона - regionIndex\n *\n * Если поисковиков в списке нет, в список будет добавлен searcherUndefined\n *\n * Если регионов в списке нет, в список будет добавлен regionUndefined\n *\n * @param forMode - Режим выбора регионов\n * @param autoRegion - добавить элемент с ключем -2, который в API заменяется на нужный ключ в зависимости от контекста\n * @param searchers - поисковики с регионами проекта, см.: get/projects_2/projects, show_searchers_and_regions = 1\n */\nexport const genSearcherByKey = (\n\tforMode: ForMode = '',\n\tautoRegion: boolean = false,\n\tsearchers: Searcher[] = [],\n) => {\n\tlet searcherByKey: SearcherByKey;\n\n\tif (forMode) {\n\t\tsearcherByKey = genSearchersMapForMode(searchers, forMode);\n\t} else {\n\t\tsearcherByKey = genSearchersMapCommon(searchers);\n\t}\n\n\tif (autoRegion) searcherByKey.set(dummyIndex, getSearcherAuto());\n\tif (!searcherByKey.size) searcherByKey.set(dummyIndex, searcherUndefined);\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами\n *\n * @param searchers\n * @param onlyEnabledRegions\n * @param forceSearchersKeys - ключи ПС, которые нееобходимо вывести в любом случае\n * @param forMode - Режим выбора регионов (при непустом значении остаются только Яндекс, Google и Mail)\n */\nconst genSearchersMapCommon = (\n\tsearchers: Searcher[],\n\tonlyEnabledRegions: boolean = true,\n\tforceSearchersKeys: Searcher['key'][] = [],\n\tforMode: ForMode = '',\n) => {\n\tconst searcherByKey: Map<Searcher['key'], SearcherIndexed> = new Map();\n\n\t// настроенные ПС\n\tsearchers.forEach((searcher) => {\n\t\tif (!searcher.enabled) return;\n\t\tif (forMode && typeof searcher.key === 'number' && searcher.key > 1) return;\n\n\t\tconst searcherI = { ...searcher } as SearcherIndexed;\n\t\tsearcherI.regionByIndex = new Map();\n\n\t\tif (searcher.regions) {\n\t\t\tsearcher.regions.forEach((region: Region) => {\n\t\t\t\tif (onlyEnabledRegions && !region.enabled) return;\n\n\t\t\t\tconst regionI = { ...region };\n\t\t\t\tsearcherI.regionByIndex.set(regionI.index, regionI);\n\t\t\t});\n\t\t}\n\n\t\tif (!searcherI.regionByIndex.size && !forceSearchersKeys.length) {\n\t\t\t// searcherI.regionByIndex.set(regionUndefined.index, regionUndefined);\n\t\t}\n\n\t\tif (\n\t\t\t// режим вывода ПС без регионов\n\t\t\t!searcher.regions ||\n\n\t\t\t// есть включенные регионы\n\t\t\tsearcherI.regionByIndex.size ||\n\n\t\t\t// запрошен вывод конкретных ПС\n\t\t\tforceSearchersKeys.length\n\t\t) {\n\t\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t\t}\n\t});\n\n\t// дополнительные ПС\n\tforceSearchersKeys.forEach((searcherKey) => {\n\t\tif (searcherByKey.has(searcherKey)) return;\n\n\t\tconst searcherI: SearcherIndexed = {\n\t\t\tkey: searcherKey,\n\t\t\tname: searchersNames[searcherKey],\n\t\t\tregions: [],\n\t\t\tregionByIndex: new Map(),\n\t\t};\n\n\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t});\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами для проверки частоты (Яндекс, Google, Mail если добавлен в проект)\n *\n * @param searchers\n * @param forMode - Режим выбора регионов\n */\nconst genSearchersMapForMode = (searchers: Searcher[], forMode: ForMode) => {\n\tconst serarcherByKey = genSearchersMapCommon(searchers, false, Core.state.forceSearchersKeysForKeywordsStats, forMode);\n\n\t// в Mail нет регионов\n\tif (serarcherByKey.has(2)) {\n\t\tconst searcherMail = serarcherByKey.get(2);\n\t\tif (searcherMail) searcherMail.regionByIndex = new Map();\n\t}\n\n\tif ((forMode === 'volume' || forMode === 'cost_forecast') && Core.state.showGlobalRegionForKeywordsStats) {\n\t\t// добавление глобального региона\n\t\tserarcherByKey.forEach((searcher) => {\n\t\t\tif (!searcher.regionByIndex) return;\n\n\t\t\tconst region = { ...getRegionGlobal() };\n\t\t\tsearcher.regionByIndex.set(region.index, region);\n\t\t});\n\t}\n\n\treturn serarcherByKey;\n};\n\n/**\n * Поиск региона по заданному критерию из списка поисковиков проекта\n *\n * @param forMode - Режим выбора регионов\n * @param searchRegion - объект с параметрами региона, который следует найти\n * @param searchers\n */\nexport const findRegion = (forMode: ForMode, searchRegion: Partial<Region>, searchers: Searcher[] = []) => {\n\tconst searcherByKey = genSearcherByKey(forMode, false, searchers);\n\n\tlet findedRegion: Region | undefined;\n\n\t// поиск ПС\n\tsearcherByKey.forEach((searcher) => {\n\t\tif (searchRegion.searcher_key !== undefined && searchRegion.searcher_key != searcher.key) return;\n\t\tif (!searcher.regions) return;\n\n\t\t// поиск региона\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (findedRegion) return;\n\n\t\t\tif (searchRegion.key !== undefined && searchRegion.key != region.key) return;\n\t\t\tif (searchRegion.index !== undefined && searchRegion.index != region.index) return;\n\n\t\t\tif (!forMode) {\n\t\t\t\tif (searchRegion.lang !== undefined && searchRegion.lang != region.lang) return;\n\t\t\t\tif (searchRegion.device !== undefined && searchRegion.device != region.device) return;\n\t\t\t}\n\n\t\t\tregion.searcher_key = searcher.key;\n\t\t\tfindedRegion = region;\n\n\t\t\treturn false;\n\t\t});\n\n\t\tif (findedRegion) return false;\n\t});\n\n\treturn findedRegion;\n};\n\n/**\n * Открыть диалоговое окно с выбором нескольких регионов\n *\n * @see import('../dialog_regionSelectorRegions/types').Props\n */\nexport const dialogRegionSelector = useAsyncTopDialog(() => {\n\treturn import('@/components/project/regionSelector/dialog_regionSelectorRegions/dialog_regionSelectorRegions.vue');\n});\n","import { computed, type ComputedRef, ref } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Props, SearcherByKey } from '../types';\nimport type { Option, Options } from '@/components/forms/select/types';\nimport { dummyIndex, searhcerCompareKey } from '../utils/consts';\nimport { getSearcherGIcon } from '@/core/utils/searchers';\n\n/**\n * Создание и управление реактивными переменными для выбора ПС\n *\n * @param props - входные props компонента\n * @param mapSearchers - Map ПС (реактивная)\n */\nexport const useSelectSearcher = (\n\tprops: Props,\n\tmapSearchers: ComputedRef<SearcherByKey>,\n) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Ключ выбранной поисковой системы\n\t */\n\tconst searcherKey = ref(mapSearchers.value.keys().next().value ?? dummyIndex);\n\n\t/**\n\t * Коллекция опций для выбора ПС\n\t */\n\tconst optionBySearcherKey = computed(() => {\n\t\tconst res: Options = new Map();\n\t\tmapSearchers.value.forEach((searcher) => {\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: searcher.key,\n\t\t\t\ttitle: searcher.name,\n\t\t\t};\n\n\t\t\tif (props.addSearcherIcon) option.icon = getSearcherGIcon(searcher.key);\n\n\t\t\tres.set(searcher.key, option);\n\t\t});\n\n\t\t// добавить режим сравнения, если есть хотя бы одна ПС с одним регионом\n\t\tif (props.addCompare && !res.has(dummyIndex)) {\n\t\t\tconst dummyOption: Option = {\n\t\t\t\tvalue: '',\n\t\t\t\ttitle: '--------------------',\n\t\t\t\tdisabled: true,\n\t\t\t};\n\t\t\tres.set(dummyOption.value, dummyOption);\n\n\t\t\tconst compareOption: Option = {\n\t\t\t\tvalue: searhcerCompareKey,\n\t\t\t\ttitle: i18n.Common.Compare!,\n\t\t\t};\n\t\t\tres.set(compareOption.value, compareOption);\n\t\t}\n\n\t\treturn res;\n\t});\n\n\treturn {\n\t\tsearcherKey,\n\t\toptionBySearcherKey,\n\t};\n};\n","import { computed, type ComputedRef, ref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getDeviceGIcon, getLangLabel } from '@/core/utils/searchers';\nimport type { Option } from '@/components/forms/select/types';\nimport { dummyIndex } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\n\n/**\n * Создание и управление реактивными переменными для выбора региона\n *\n * @param props - входные props компонента\n * @param activeSearcherIndexed - объект активной поисковой системы (реактивная)\n */\nexport const useSelectRegion = (props: Props, activeSearcherIndexed: ComputedRef<SearcherIndexed>) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Индекс выбранного региона\n\t */\n\tconst regionIndex = ref(dummyIndex);\n\n\tif (props.modelValue.length === 1) {\n\t\tregionIndex.value = props.modelValue[0];\n\t}\n\n\tif (regionIndex.value === dummyIndex) {\n\t\tif (props.forMode) {\n\t\t\t// в качестве ключа используется region.key, а не region.index\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.values().next().value?.key ?? dummyIndex;\n\t\t} else {\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.keys().next().value ?? dummyIndex;\n\t\t}\n\t}\n\n\t/**\n\t * Коллекция опций для выбора региона\n\t */\n\tconst optionByRegionIndex = computed(() => {\n\t\tconst options = new Map<number, Option>();\n\n\t\tactiveSearcherIndexed.value.regionByIndex?.forEach((region) => {\n\t\t\tlet regionLabel = region.name;\n\n\t\t\t// на частоту в текущей версии устройство и язык не влияют\n\t\t\t// обратите внимание, в качестве ключа используется region.key, а не region.index\n\t\t\tif (props.forMode) {\n\t\t\t\tconst option: Option = {\n\t\t\t\t\tvalue: region.key,\n\t\t\t\t\ttitle: regionLabel,\n\t\t\t\t};\n\t\t\t\tif (!options.has(region.key)) options.set(region.key, option);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (region.device) {\n\t\t\t\tregionLabel += ' (' + i18n.Common['Device_' + region.device] + ')';\n\t\t\t}\n\n\t\t\tconst langLabel = getLangLabel(activeSearcherIndexed.value.key || 0, region.lang ?? '');\n\t\t\tif (langLabel) regionLabel += ' / ' + langLabel;\n\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: region.index,\n\t\t\t\ttitle: regionLabel,\n\t\t\t\ticon: region.device ? getDeviceGIcon(region.device) : undefined,\n\t\t\t};\n\n\t\t\toptions.set(region.index, option);\n\t\t});\n\n\t\treturn options;\n\t});\n\n\t/**\n\t * Выбор максимально похожего региона в новой коллекции регионов\n\t */\n\twatch(optionByRegionIndex, (optionByRegionIndex, oldOptionByRegionIndex) => {\n\t\tif (props.onlySearcher || regionIndex.value !== undefined && optionByRegionIndex.get(regionIndex.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newRegionIndex = optionByRegionIndex.keys().next().value as Region['index'];\n\t\tif (regionIndex.value === dummyIndex || newRegionIndex === dummyIndex) {\n\t\t\tregionIndex.value = newRegionIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst regionName = (oldOptionByRegionIndex?.get(regionIndex.value) as Option)?.title || '';\n\t\tlet regionMatchLevel = -1;\n\t\tfor (const [index, option] of optionByRegionIndex.entries()) {\n\t\t\tconst title = (option as Option).title;\n\n\t\t\tif (typeof title !== 'string' || typeof index === 'string') {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// полное совпадение\n\t\t\tif (title === regionName) {\n\t\t\t\tnewRegionIndex = index;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst regexpDevice = new RegExp(` \\\\((${i18n.Common['Device_1']}|${i18n.Common['Device_2']})\\\\)`);\n\t\t\tlet regionNameCompare = regionName;\n\t\t\tlet regionMatchLevelI = 3;\n\n\t\t\t// без устройства\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без устройства и без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\t\t\t\tregionNameCompare = regionNameCompare.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\tif (title.indexOf(regionNameCompare) === -1) continue;\n\t\t\tif (regionMatchLevelI <= regionMatchLevel) continue;\n\n\t\t\tregionMatchLevel = regionMatchLevelI;\n\t\t\tnewRegionIndex = index;\n\t\t}\n\n\t\tregionIndex.value = newRegionIndex;\n\t});\n\n\treturn {\n\t\tregionIndex,\n\t\toptionByRegionIndex,\n\t};\n};\n","import { type ComputedRef, ref, watch } from 'vue';\nimport type { Props, SearcherByKey } from '../types';\n\n/**\n * Создание и управление реактивными переменными для сравнения\n *\n * @param props - входные props компонента\n * @param searcherByKey - Map ПС (реактивная)\n * @param allRegionsIndexes - Все доступные индексы регионов (реактивная)\n */\nexport const useCompare = (props: Props, searcherByKey: ComputedRef<SearcherByKey>, allRegionsIndexes: ComputedRef<Set<number>>) => {\n\t/**\n\t * Индексы регионов/ПС в сравнение\n\t */\n\tconst regionsIndexes = ref<number[]>([]);\n\n\t/**\n\t * Загрузка индексов регионов для сравнения\n\t *\n\t * Если в modelValue передано несколько регионов, они будут установлены как выбранные для сравнения\n\t */\n\tconst compareLoad = () => {\n\t\tif (props.onlySearcher && searcherByKey.value) {\n\t\t\tregionsIndexes.value = Array.from(searcherByKey.value.keys());\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet regionsIndexesSaved: Props['modelValue'] = [];\n\n\t\tif (props.modelValue.length > 1) {\n\t\t\tregionsIndexesSaved = [...props.modelValue];\n\t\t} else {\n\t\t\ttry {\n\t\t\t\t// загрузить индексы регионов, если они были сохранены\n\t\t\t\tregionsIndexesSaved = JSON.parse(\n\t\t\t\t\tlocalStorage.getItem('ui:project:regionSelector' + props.projectId + ':regionsIndexes') as string,\n\t\t\t\t) ?? [];\n\t\t\t} catch (e) {\n\n\t\t\t}\n\t\t}\n\n\t\t// убрать из сравнения регионы, которых нет в props.searchers\n\t\tif (regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = regionsIndexesSaved.filter((regionIndex) => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\t// если не сохранено ни одного региона, выбрать все регионы проекта\n\t\tif (!regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = Array.from(allRegionsIndexes.value);\n\t\t}\n\n\t\tregionsIndexes.value = [...regionsIndexesSaved];\n\t};\n\n\t/**\n\t * Сохранение выбранных регионов\n\t */\n\tconst compareSave = () => {\n\t\tif (regionsIndexes.value.length) {\n\t\t\tlocalStorage.setItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes', JSON.stringify(regionsIndexes.value));\n\t\t} else {\n\t\t\tlocalStorage.removeItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes');\n\t\t}\n\t};\n\n\twatch(regionsIndexes, () => {\n\t\tcompareSave();\n\t});\n\n\tif (props.addCompare) {\n\t\t// if (props.compareRegionsIndexes?.length) {\n\t\t// \tcompareRegionsIndexes.value = [...props.compareRegionsIndexes];\n\t\t// } else {\n\t\t// \tcompareLoad();\n\t\t// }\n\n\t\tcompareLoad();\n\t}\n\n\treturn {\n\t\tregionsIndexes,\n\t};\n};\n","import { computed, watch } from 'vue';\nimport { findRegion, genSearcherByKey } from '../utils/utils';\nimport { dummyIndex, globalRegionIndex, searcherUndefined, searhcerCompareKey } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\nimport { useSelectSearcher } from './selectSearcher';\nimport { useSelectRegion } from './selectRegion';\nimport { useCompare } from './compare';\n\n/**\n * Создание и управления рективными переменными компонента\n *\n * @param props - входные props компонента\n */\nexport const useSelectorRegion = (props: Props) => {\n\tconst searcherByKey = computed(() => {\n\t\treturn genSearcherByKey(props.forMode, props.autoRegion, props.searchers);\n\t});\n\n\tconst activeSearcherIndexed = computed(() => {\n\t\treturn searcherByKey.value.get(selectSearcher.searcherKey.value) || searcherUndefined;\n\t});\n\n\t/**\n\t * Все индексы регионов из searcherByKey\n\t *\n\t * Активность регионов определяется в searcherByKey\n\t */\n\tconst allRegionsIndexes = computed(() => {\n\t\tconst regionsIndexes = new Set<number>();\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\tregionsIndexes.add(region.index);\n\t\t\t});\n\t\t});\n\n\t\treturn regionsIndexes;\n\t});\n\n\tconst selectSearcher = useSelectSearcher(props, searcherByKey);\n\tconst selectRegion = useSelectRegion(props, activeSearcherIndexed);\n\tconst compare = useCompare(props, searcherByKey, allRegionsIndexes);\n\n\t// контроль за внешним изменением списка ПС\n\twatch(searcherByKey, () => {\n\t\t// возможные значения для сравнения регионов/пс\n\t\tif (props.onlySearcher) {\n\t\t\tcompare.regionsIndexes.value = Array.from(searcherByKey.value.keys());\n\t\t} else {\n\t\t\tcompare.regionsIndexes.value = compare.regionsIndexes.value.filter(regionIndex => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey) return;\n\n\t\tlet newSearcherKey = searcherByKey.value.keys().next().value;\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t// определить выбранную ПС\n\t\t\tif (props.onlySearcher && searcher.key === selectSearcher.searcherKey.value) {\n\t\t\t\tnewSearcherKey = selectSearcher.searcherKey.value;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tselectRegion.regionIndex.value &&\n\t\t\t\tsearcher.regionByIndex?.has(selectRegion.regionIndex.value)\n\t\t\t) {\n\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t}\n\n\t\t\t// выбрать первую ПС с выбранным регионом\n\t\t\tif (!props.onlySearcher) {\n\t\t\t\tlet regionsNewSearcher: SearcherIndexed['regionByIndex'] | undefined;\n\n\t\t\t\tif (newSearcherKey !== undefined) {\n\t\t\t\t\tregionsNewSearcher = searcherByKey.value.get(newSearcherKey)?.regionByIndex;\n\t\t\t\t}\n\n\t\t\t\tconst regionsCurrentSearcher = searcherByKey.value.get(searcher.key)?.regionByIndex;\n\t\t\t\tif (\n\t\t\t\t\tregionsNewSearcher?.has(dummyIndex) &&\n\t\t\t\t\t!regionsCurrentSearcher?.has(dummyIndex)\n\t\t\t\t) {\n\t\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// if (props.addCompare && !selectSearcher.optionBySearcherKey.value.has(dummyIndex)) {\n\t\t// \tif (!selectRegion.regionIndex.value && compare.regionsIndexes.value?.length) newSearcherKey = searhcerCompareKey;\n\t\t// }\n\n\t\t// if (props.onlySearcher && selectRegion.regionIndex.value !== dummyIndex) newSearcherKey = selectRegion.regionIndex.value;\n\n\t\tif (newSearcherKey !== undefined) {\n\t\t\tselectSearcher.searcherKey.value = newSearcherKey;\n\t\t}\n\n\t\tif (\n\t\t\tselectRegion.regionIndex.value !== undefined &&\n\t\t\t!(activeSearcherIndexed.value?.regionByIndex)?.has(selectRegion.regionIndex.value)\n\t\t) {\n\t\t\tselectRegion.regionIndex.value = activeSearcherIndexed.value?.regions?.keys().next().value as number;\n\t\t}\n\t}, { immediate: true });\n\n\tconst getSearcherKey = () => {\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey || selectSearcher.searcherKey.value === dummyIndex) return;\n\n\t\treturn selectSearcher.searcherKey.value;\n\t};\n\n\tconst getRegionIndex = () => {\n\t\tif (props.onlySearcher) return;\n\n\t\tif (selectRegion.regionIndex.value === dummyIndex) return;\n\n\t\tlet res: Region['index'] | undefined = selectRegion.regionIndex.value;\n\n\t\t// в качестве ключа используется region.key\n\t\tif (props.forMode) {\n\t\t\tconst regionKey = selectRegion.regionIndex.value;\n\t\t\tconst region = findRegion(props.forMode, { searcher_key: getSearcherKey(), key: regionKey } as Region, props.searchers);\n\n\t\t\tres = region?.index;\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Получить выбранную ПС\n\t */\n\tconst getSearcher = () => {\n\t\tconst searcherKey = getSearcherKey();\n\t\tif (searcherKey === undefined) return;\n\n\t\treturn searcherByKey.value.get(searcherKey);\n\t};\n\n\t/**\n\t * Получить выбранный регион\n\t */\n\tconst getRegion = () => {\n\t\tconst regionIndex = getRegionIndex();\n\t\tif (regionIndex === undefined) return;\n\n\t\treturn getSearcher()?.regionByIndex?.get(regionIndex);\n\t};\n\n\treturn {\n\t\tselectSearcher,\n\t\tselectRegion,\n\t\tcompare,\n\n\t\tsearcherByKey,\n\t\tallRegionsIndexes,\n\n\t\tgetSearcher,\n\t\tgetRegion,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { watch } from 'vue';\nimport type { Props, Region } from './types';\nimport Select from '@/components/forms/select/select.vue';\nimport Button from '@/components/forms/button/button.vue';\nimport { useSelectorRegion } from './composables/selectorRegion';\nimport { dummyIndex, globalRegionIndex, searhcerCompareKey } from './utils/consts';\nimport { dialogRegionSelector } from '@/components/project/regionSelector/utils/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsearchers: () => [],\n\t// compareRegionsIndexes: () => [],\n\taddSearcherIcon: true,\n\taddRegionIcon: true,\n\taddChanger: true,\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\nconst modelSingle = defineModel<Props['modelValueSingle']>('modelValueSingle');\n\nconst {\n\tselectSearcher,\n\tselectRegion,\n\tcompare,\n\n\tsearcherByKey,\n\tallRegionsIndexes,\n\n\tgetSearcher,\n\tgetRegion,\n} = useSelectorRegion(props);\n\nconst onClickCompare = () => {\n\tconst regions: Region[] = [];\n\n\tsearcherByKey.value.forEach((searcher) => {\n\t\tif (!searcher.enabled) return;\n\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (!region.enabled) return;\n\n\t\t\tregions.push(region);\n\t\t});\n\t});\n\n\tdialogRegionSelector.open('regions', {\n\t\tregions,\n\t\tregionsIndexes: compare.regionsIndexes.value,\n\t\t'@update:regionsIndexes': (regionsIndexes: number[]) => compare.regionsIndexes.value = regionsIndexes,\n\t});\n};\n\nwatch([selectRegion.regionIndex, selectSearcher.searcherKey, compare.regionsIndexes], () => {\n\tif (selectSearcher.searcherKey.value === searhcerCompareKey && compare.regionsIndexes.value.length) {\n\t\tif (JSON.stringify(model.value) === JSON.stringify(compare.regionsIndexes.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tmodel.value = [...compare.regionsIndexes.value];\n\t} else {\n\t\tif (props.onlySearcher) {\n\t\t\tmodel.value = [selectSearcher.searcherKey.value];\n\n\t\t\tif (selectSearcher.searcherKey.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t} else {\n\t\t\tmodel.value = [selectRegion.regionIndex.value];\n\n\t\t\t// не добавлять несуществующий регион в результаты\n\t\t\tif (selectRegion.regionIndex.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t}\n\t}\n\n\t// регионов нет\n\tif (!props.onlySearcher && !allRegionsIndexes.value.size) {\n\t\tselectSearcher.searcherKey.value = dummyIndex;\n\t}\n});\n\nif (modelSingle.value) {\n\twatch(modelSingle, () => {\n\t\tif (modelSingle.value) {\n\t\t\tmodel.value = [modelSingle.value];\n\t\t}\n\t}, { immediate: true });\n}\n\nwatch(model, () => {\n\tif (model.value[0]) {\n\t\tmodelSingle.value = model.value[0];\n\t}\n\n\t// проверка входных данных v-model на корректность\n\tif (props.onlySearcher) {\n\t\tif (\n\t\t\t!model.value.length ||\n\t\t\tmodel.value.length === 1 && !searcherByKey.value.has(model.value[0]) ||\n\t\t\tmodel.value.length === 1 && model.value[0] === dummyIndex && !props.autoRegion\n\t\t) {\n\t\t\tlet defaultKey: number | undefined = searcherByKey.value.keys().next().value;\n\n\t\t\t// запретить устанавливать несуществующий регион\n\t\t\tif (defaultKey === dummyIndex && !props.autoRegion) {\n\t\t\t\tdefaultKey = undefined;\n\n\t\t\t\tmodelSingle.value = dummyIndex;\n\t\t\t}\n\n\t\t\tif (defaultKey !== undefined) {\n\t\t\t\tmodel.value = [defaultKey];\n\t\t\t}else{\n\t\t\t\tmodel.value.length = 0;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tmodel.value.length > 1 &&\n\t\t\tJSON.stringify(model.value) !== JSON.stringify(compare.regionsIndexes.value)\n\t\t) {\n\t\t\tmodel.value = [...compare.regionsIndexes.value];\n\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tlet newModel = [...new Set(model.value)];\n\n\t\tlet defaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.keys().next().value;\n\t\tif (props.forMode) {\n\t\t\tdefaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.values().next().value?.key;\n\t\t}\n\n\t\t// запретить устанавливать несуществующий регион\n\t\tif (defaultIndex === dummyIndex && !props.autoRegion) {\n\t\t\tdefaultIndex = undefined;\n\n\t\t\tmodelSingle.value = dummyIndex;\n\t\t}\n\n\t\tif (!newModel.length) {\n\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t} else if (newModel.length === 1) {\n\t\t\tlet all = allRegionsIndexes.value;\n\n\t\t\tif (props.forMode) {\n\t\t\t\tall = new Set();\n\t\t\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\t\t\tall.add(region.key);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// убрано, так как dummyIndex запрещено выбирать в model\n\t\t\t// if (!all.has(newModel[0]) && newModel[0] !== dummyIndex) {\n\t\t\tif (!all.has(newModel[0])) {\n\t\t\t\tnewModel = [];\n\t\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tnewModel = newModel.filter(index => allRegionsIndexes.value.has(index));\n\t\t\tif (!newModel.length && defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (JSON.stringify(model.value) !== JSON.stringify(newModel)) {\n\t\t\tmodel.value = newModel;\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// входные данные v-model совпадают с внутренними значениями\n\tif (\n\t\tmodel.value.length === 1 &&\n\t\tmodel.value[0] === (props.onlySearcher ? selectSearcher.searcherKey.value : selectRegion.regionIndex.value)\n\t) {\n\t\treturn;\n\t}\n\n\t// if (\n\t// \tmodel.value.length > 1 &&\n\t// \tselectorSearcher.searcherKey.value === searhcerCompareKey &&\n\t// \tJSON.stringify(model.value) === JSON.stringify(selectorCompare.regionsIndexes.value)\n\t// ) {\n\t// \treturn;\n\t// }\n\n\t// обновление regionIndex, searcherKey, selectorCompare.regionsIndexes\n\tif (props.onlySearcher) {\n\t\t// if (!model.value.length) {\n\t\t// \tselectorSearcher.searcherKey.value = dummyIndex;\n\t\t//\n\t\t// \treturn;\n\t\t// }\n\n\t\tif (model.value.length === 1) {\n\t\t\tselectSearcher.searcherKey.value = model.value[0];\n\n\t\t\treturn;\n\t\t}\n\n\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\n\t\treturn;\n\t} else {\n\t\tif (!model.value.length) {\n\t\t\t// selectSearcher.searcherKey.value = dummyIndex;\n\t\t\t// selectRegion.regionIndex.value = dummyIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (model.value.length === 1 && selectSearcher.searcherKey.value !== searhcerCompareKey) {\n\t\t\tselectRegion.regionIndex.value = model.value[0];\n\n\t\t\tlet newSearherKey: number | undefined;\n\t\t\tfor (const searcher of searcherByKey.value.values()) {\n\t\t\t\tfor (const region of searcher.regionByIndex.values()) {\n\t\t\t\t\tconst currentRegionIndex = props.forMode ? region.key : region.index;\n\t\t\t\t\tif (currentRegionIndex === selectRegion.regionIndex.value) {\n\t\t\t\t\t\tnewSearherKey = searcher.key;\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\tselectSearcher.searcherKey.value = newSearherKey;\n\t\t\t}\n\t\t} else {\n\t\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\t\t\tcompare.regionsIndexes.value = [...model.value];\n\t\t}\n\t}\n}, { immediate: true });\n\ndefineExpose({\n\tgetSearcher,\n\tgetRegion,\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-regionSelector': true,\n\t\t\t'top-regionSelector-onlySearcher': onlySearcher,\n\t\t}\"\n\t>\n\t\t<Select\n\t\t\t:options=\"selectSearcher.optionBySearcherKey.value\"\n\t\t\tv-model=\"selectSearcher.searcherKey.value\"\n\t\t\tname=\"searcher_key\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t/>\n\n\t\t<Select\n\t\t\tv-if=\"!onlySearcher && selectSearcher.searcherKey.value !== searhcerCompareKey\"\n\t\t\tclass=\"top-select-region\"\n\t\t\t:options=\"selectRegion.optionByRegionIndex.value\"\n\t\t\tv-model=\"selectRegion.regionIndex.value\"\n\t\t\t:name=\"forMode ? 'region_key' : 'region_index'\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t\t:data-top-icon=\"addRegionIcon ? '' : undefined\"\n\t\t/>\n\n\t\t<Button\n\t\t\tv-if=\"addCompare && !onlySearcher && selectSearcher.searcherKey.value === searhcerCompareKey\"\n\t\t\tname=\"compare\"\n\t\t\t@click=\"onClickCompare\"\n\t\t\t:data-count-compare-regions-indexes=\"compare.regionsIndexes.value.length\"\n\t\t>\n\t\t\t{{ $i18n.Common.Selected_regions }}\n\t\t</Button>\n\t</div>\n</template>\n\n<style>\n@import \"./styles/searcherColors.css\";\n\n.top-regionSelector {\n\twidth: 340px;\n\tdisplay: inline-flex;\n\tvertical-align: middle;\n}\n\n.top-regionSelector > .top-select {\n\tflex-grow: 1;\n}\n\n.top-regionSelector > .top-select:focus-within {\n\tz-index: 4;\n}\n\n.top-regionSelector > .top-select > .top-select_select:hover,\n.top-regionSelector > .top-select > .top-select_select.top-error {\n\tz-index: 1;\n}\n\n.top-regionSelector > .top-select-searcher_key {\n\twidth: 140px;\n\tmax-width: 160px;\n\tmargin-right: -1px;\n}\n\n.top-regionSelector > .top-select-region > select {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n\n.top-regionSelector > .top-select-region {\n\t--top-icon-size: 20px;\n\t--top-icon-color: var(--color-text-primary);\n\n\t--top-icon2-size: 20px;\n\t--top-icon2-color: var(--color-text-primary);\n}\n\n.top-regionSelector > .top-select-region[data-top-icon][data-top-icon2] {\n\t--top-icon2-size: 16px;\n}\n\n.top-regionSelector > .top-select-region[data-top-icon][data-top-icon2]:after {\n\ttext-indent: -4px;\n}\n\n.top-regionSelector > [name=\"compare\"] {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\tflex-grow: 1;\n}\n\n.top-regionSelector > [name=\"compare\"]:after {\n\tcontent: \"(\" attr(data-count-compare-regions-indexes) \")\";\n\tmargin: 0 0 0 6px;\n}\n\n.top-regionSelector:not(.top-regionSelector-onlySearcher) > .top-select-searcher_key > select {\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n\tmargin-right: 0;\n}\n\n.top-regionSelector:not(.top-regionSelector-onlySearcher) > .top-select-searcher_key[data-value=\"-1\"] > select {\n\tborder-right: none;\n}\n\n.top-regionSelector-onlySearcher {\n\twidth: 140px;\n}\n</style>\n","// Генерация плоского массива объектов папок с заполнением childsIds и счетчиков\nimport type { Folder, FolderTree } from './types';\nimport type { Props } from '../types';\nimport { useI18n } from '@/core/app';\n\nexport const folderDefault: Folder = {\n\tid: 0,\n\tname: '/',\n\tpath: '/',\n};\n\n/**\n * Сгенерировать объект корневой папки для компонента\n *\n * Содержит измененное имя\n *\n * Необходимо предустанавливать для минимизации `rerender`\n */\nexport const genRootFolder = (folders: FolderTree | undefined, useSelectAll: boolean) => {\n\tlet rootFolder = folders?.['root'][0] ?? folderDefault;\n\trootFolder = { ...rootFolder };\n\n\trootFolder.name = genRootFolderName(useSelectAll);\n\n\treturn rootFolder;\n};\n\nexport function genRootFolderName(useSelectAll: boolean) {\n\tif (useSelectAll) {\n\t\treturn useI18n()?.Common.All_folders;\n\t} else {\n\t\treturn '/ (' + useI18n()?.Keywords.Root_folder + ')';\n\t}\n}\n\n/**\n * Сгенерировать плоский список папок\n *\n * В `folders` должен передаваться список всех папок, дозагрузка не предусмотрена\n */\nexport const genFlat = (\n\tfolderById: NonNullable<Props['folders']>,\n\tuseSelectAll: boolean,\n\tresultFolders = new Map<Folder['id'], Folder>(),\n\tparentFolder: Folder = { id: 'root' } as unknown as Folder,\n\tdepth = 0,\n) => {\n\tparentFolder.childsIds = [];\n\n\tif (parentFolder.id) {\n\t\tparentFolder.countAllGroupsActive = parentFolder.count_groups_active;\n\t}\n\n\tif (!folderById[parentFolder.id]) {\n\t\treturn resultFolders;\n\t}\n\n\tfolderById[parentFolder.id].forEach((folder) => {\n\t\tfolder = { ...folder };\n\n\t\tparentFolder.childsIds!.push(folder.id);\n\n\t\tif (folder.id === 0) folder.name = genRootFolderName(useSelectAll);\n\n\t\tconst prefix = depth > 1 ? '-'.repeat(depth - 1) + ' ' : '';\n\t\tif (prefix && !folder.name.startsWith(prefix)) folder.name = prefix + folder.name;\n\n\t\tresultFolders.set(folder.id, folder);\n\n\t\tgenFlat(folderById, useSelectAll, resultFolders, folder, depth + 1);\n\n\t\tparentFolder.childsIds = parentFolder.childsIds!.concat(folder.childsIds!);\n\n\t\tif (parentFolder.id && folder.count_groups_active) {\n\t\t\tparentFolder.countAllGroupsActive! += folder.count_groups_active;\n\t\t}\n\t});\n\n\treturn resultFolders;\n};\n\n/**\n * Создать API запрос на получение групп\n */\nexport const genApiGetFolders = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/get/${service}/folders/`, ['id', 'parent_id', 'name', 'path']).changeParams({ orders: ['ord_path'] as any, limit: 100 });\n};\n","import { watch, type WatchOptions, type WatchSource, type WatchStopHandle } from 'vue';\n\ntype UnwrapSource<T> = T extends WatchSource<infer V>\n\t? V\n\t: T extends object ? T : never;\n\ntype Changes<T> = Partial<{\n\t[K in keyof T]: {\n\t\told: UnwrapSource<T[K]> | undefined;\n\t\tnew: UnwrapSource<T[K]>\n\t}\n}>;\n\n/**\n * useWatch — расширенный `watch` с измененным callback\n * - принимает объект с реактивными свойствами, точно такими же, как при указании в массиве в стандартном `watch`\n * - callback возвращает изменившиеся свойства в объекте `changes` с `{old, new}`\n *\n * Если у вас есть несколько `watch`, которые меняют одно состояние, то могут возникнуть проблемы:\n * - рост длины цепочек `watch`, когда один `watch` приводит к срабатыванию другого\n * - лишние вызовы при согласованных состояниях, когда разные `watch` устанавливают одно и то же значение\n * - гонка при несогласованных состояниях, когда разные `watch` в разные тики при этом одновременно могут устанавливать разные состояния\n *\n * Если у вас такой случай и его нельзя упростить, то используйте `useWatch`, в остальных случаях используйте только стандартный `watch`\n *\n * @example\n *\n * ```js\n *\n * useWatch({ a: ref(5), b: ref('word') }, (changes) => {\n * \tconsole.log(changes.a?.new, changes.a?.old);\n * \tconsole.log(changes.b?.new, changes.b?.old);\n * });\n * ```\n */\nexport function useWatch<T extends Record<string, WatchSource>>(\n\tsourcesObj: T,\n\tcb: (\n\t\tchanges: Changes<T>,\n\t\tonCleanup: (fn: () => void) => void,\n\t) => void | Promise<void>,\n\toptions?: WatchOptions,\n): WatchStopHandle {\n\tconst keys = Object.keys(sourcesObj) as (keyof T)[];\n\tconst sources = keys.map(k => sourcesObj[k]);\n\n\treturn watch(sources, (newValues, oldValues, onCleanup) => {\n\t\tconst changed = {} as Changes<T>;\n\n\t\tnewValues.forEach((val, i) => {\n\t\t\tif (!Object.is(val, oldValues[i])) {\n\t\t\t\tconst k = keys[i];\n\n\t\t\t\tchanged[k] = {\n\t\t\t\t\told: oldValues[i],\n\t\t\t\t\tnew: val,\n\t\t\t\t} as any;\n\t\t\t}\n\t\t});\n\n\t\tif (Object.keys(changed).length) cb(changed, onCleanup);\n\t}, options);\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport type { Item } from '@/components/formsExt/selector2/types';\nimport type { Props } from './types';\nimport { folderDefault, genApiGetFolders, genFlat, genRootFolderName } from './utils';\nimport { apiSetSearchParamsFilter } from '@/components/formsExt/formsExt';\nimport { useWatch } from '@/core/utils/composables/useWatch';\n\nconst props = withDefaults(defineProps<Props>(), {\n\taddIcon: true,\n});\n\nconst modelFolderId = defineModel<Props['folderId']>('folderId', { required: true });\nconst modelFolder = defineModel<NonNullable<Props['folder']>>('folder', { default: folderDefault });\n\nconst apiGet = props.client && !props.folders ? genApiGetFolders(props.client, props.service) : undefined;\n\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\n// Настройка API\nwatch(() => props.projectId, () => {\n\tapiGet?.changeParams({\n\t\tproject_id: props.projectId,\n\t});\n\n\tapiGet?.setOptions({\n\t\tcheckFingerprint: 'TopGroupSelectorFolders:' + props.projectId,\n\t});\n\n\trefSelector.value?.resetCache();\n}, { immediate: true });\n\n/**\n * Плоский список папок\n */\nconst foldersFlat = computed(() => {\n\treturn genFlat(props.folders ?? { root: [folderDefault] }, props.canSelectAll);\n});\n\n/**\n * Нормализовать корневую папку\n *\n * Нужно только для замены \"Корневая папка\" на \"Все папки\"\n *\n * @note Другие решения с подменой `name` не сработают, так как API сохраняет items в cache, который менять нельзя\n */\nconst prepareItemsBeforeRender = (items: Item[]) => {\n\tif (props.canSelectAll && items[0]?.id === 0) {\n\t\titems[0] = {\n\t\t\t...items[0],\n\t\t\tname: genRootFolderName(true),\n\t\t};\n\t}\n\n\treturn items;\n};\n\n/**\n * Проверка входного значения `modelFolderId` и изменение `modelFolder`\n *\n * Определяем существует ли папка:\n * - Если существует: меняем папку на указанную\n * - Если не существует: устанавливаем Корневую папку\n *\n * При загрузке групп по API проверка выполняется в асинхронном режиме\n */\nuseWatch({\n\tmodelFolder,\n\tmodelFolderId,\n}, async (changes) => {\n\tif (modelFolderId.value === modelFolder.value.id) {\n\t\treturn;\n\t}\n\n\t// изменение только `modelFolder`\n\tif (changes.modelFolder && !changes.modelFolderId) {\n\t\tmodelFolderId.value = modelFolder.value.id;\n\n\t\treturn;\n\t}\n\n\tlet folderSelected = foldersFlat.value.get(props.folderId);\n\tif (!folderSelected) folderSelected = folderDefault;\n\n\tmodelFolder.value = folderSelected;\n\tmodelFolderId.value = folderSelected.id;\n\n\t// /**\n\t// * Для не api\n\t// */\n\t// if (props.folders) {\n\t// \tmodelFolder.value = folderSelected;\n\t// \tmodelFolderId.value = folderSelected.id;\n\t// }\n\t//\n\t// /**\n\t// * Для api проверка не делается\n\t// */\n\t// if (!props.folders) {\n\t// \tmodelFolder.value = folderSelected;\n\t// \tmodelFolderId.value = folderSelected.id;\n\t// }\n}, { immediate: true });\n</script>\n\n<template>\n\t<Selector2\n\t\tclass=\"top-groupSelector_folder\"\n\t\tv-model=\"modelFolder\"\n\t\t:items=\"folders ? [...foldersFlat.values()] : undefined\"\n\t\tsearch-type=\"inline\"\n\t\t:icon=\"addIcon ? '' : undefined\"\n\t\t:api=\"folders ? undefined : apiGet\"\n\t\t:apiSetSearchParams=\"(...args) => apiSetSearchParamsFilter(...args, 'name')\"\n\t\t:prepareItemsBeforeRender\n\t\t:addChanger\n\t\tuseCache\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div v-html=\"item.name.replaceAll(/</g, '< ')\"></div>\n\t\t</template>\n\t</Selector2>\n</template>\n","import type { Folder } from '../folders/types';\nimport type { Group, Props } from './types';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { folderDefault } from '../folders/utils';\nimport { ITEM_ID_ALL } from '@/components/formsExt/selector2/utils';\n\n/**\n * Элемент - группа ненайдена\n *\n * Указывается несуществующий id\n */\nexport const groupNone: Group = {\n\tid: -1,\n\tname: '--',\n\tfolder_id: folderDefault.id,\n\tfolder_path: folderDefault.path,\n};\n\n/**\n * Элемент для выбора всех групп\n */\nexport const groupAll: Group = {\n\tid: ITEM_ID_ALL,\n\tname: 'All groups',\n\tfolder_id: folderDefault.id,\n\tfolder_path: folderDefault.path,\n};\n\n/**\n * Элемент - `Все группы`\n */\nexport const genGroupAll = () => {\n\tgroupAll.name = useI18n()?.Common.All_groups;\n\n\treturn groupAll;\n};\n\n/**\n * Элемент - `Выберите группу`\n */\nexport const genGroupPlaceholder = () => {\n\tgroupAll.name = useI18n()?.Keywords.Choose_group;\n\n\treturn groupAll;\n};\n\n/**\n * Сгенерировать список групп для TopSelector\n */\nexport const genItems = (groups: Group[], on?: boolean, folderForFilter?: Folder) => {\n\tgroups = [...groups];\n\n\t// фильтр по активности\n\tif (on !== undefined) {\n\t\tgroups = groups.filter((group) => {\n\t\t\treturn group.on == Number(on);\n\t\t});\n\t}\n\n\t// фильтр по папке\n\tif (folderForFilter && folderForFilter.id && folderForFilter.childsIds) {\n\t\tgroups = groups.filter((group) => {\n\t\t\treturn (\n\t\t\t\tgroup.folder_id === folderForFilter.id ||\n\t\t\t\tfolderForFilter.childsIds!.includes(group.folder_id)\n\t\t\t);\n\t\t});\n\t}\n\n\treturn groups;\n};\n\n/**\n * Создать API запрос на получение групп\n */\nexport const genApiGetGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/get/${service}/groups/`, ['id', 'name', 'folder_id', 'folder_path']).changeParams({ folder_id_depth: true, limit: 100 });\n};\n\n/**\n * Создать API запрос на добавление групп\n */\nexport const genApiAddGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/add/${service}/groups/`);\n};\n\n/**\n * Создать API запрос на удаление группы\n */\nexport const genApiDelGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/del/${service}/groups/`);\n}\n\n/**\n * Создать API запрос на переименование группы\n */\nexport const genApiEditGroupsRename = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/edit/${service}/groups/rename/`);\n}\n","<script setup lang=\"ts\">\nimport { computed, reactive, ref } from 'vue';\nimport { useWatch } from '@/core/utils/composables/useWatch';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport PopupConfirm from '@/components/popup/popupConfirm/popupConfirm.vue';\nimport PopupPrompt from '@/components/popup/popupPrompt/popupPrompt.vue';\nimport type { Item as SelectorItem } from '@/components/formsExt/selector2/types';\nimport { apiSetSearchParamsFilter, ITEM_ID_ALL, ITEM_ID_NEW } from '@/components/formsExt/formsExt';\nimport type { Emits, Group, Props } from './types';\nimport {\n\tgenApiAddGroups,\n\tgenApiDelGroups,\n\tgenApiEditGroupsRename,\n\tgenApiGetGroups,\n\tgenGroupAll,\n\tgenGroupPlaceholder,\n\tgenItems,\n\tgroupNone,\n} from './utils';\nimport { genFieldFilter } from '@/api/api/index';\nimport { folderDefault } from '../folders/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tautoselect: 'first',\n\taddChanger: true,\n\taddIcon: true,\n\tservice: 'keywords_2',\n});\n\nconst emits = defineEmits<Emits>();\n\nconst modelGroupId = defineModel<Props['groupId']>('groupId', { required: true });\nconst modelGroup = defineModel<Props['group']>('group', { required: true });\n\nconst apiGet = props.client && !props.groups ? genApiGetGroups(props.client, props.service) : undefined;\nconst apiAdd = props.client ? genApiAddGroups(props.client, props.service) : undefined;\nconst apiDel = props.client ? genApiDelGroups(props.client, props.service) : undefined;\nconst apiEditRename = props.client ? genApiEditGroupsRename(props.client, props.service) : undefined;\n\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\n/**\n * Группы выбранной папки\n */\nconst groupsBySelectedFolder = computed(() => {\n\tif (props.groups === undefined) return undefined;\n\n\treturn genItems(props.groups, props.on, props.folder);\n});\n\nconst filterByFolder = genFieldFilter('folder_id', 'EQUALS', [props.folder?.id ?? 0]);\n\napiGet?.changeParams({\n\tproject_id: props.projectId,\n\tfolder_id_depth: true,\n\tfilters: [\n\t\tfilterByFolder,\n\t],\n});\n\nif (props.on !== undefined) {\n\tapiGet?.params.filters?.push(genFieldFilter('on', 'EQUALS', [Number(props.on)]));\n}\n\n/**\n * Синхронная установка группы и id группы\n *\n * Id рекомендуется вместе с группой\n * - для согласованной смены состояния\n * - для уменьшения цепочки `watch` синхронизации состояний `modelGroupId` и `modelGroup`\n *\n * Пример несогласованности: если передать `modelGroup` и значение `modelGroupId`, которое ему не соответствует, то попытка установить ту же самую группу в `modelGroup` не приведет к смене `modelGroupId`\n */\nconst setGroup = (group: Props['group']) => {\n\tmodelGroup.value = group;\n\tmodelGroupId.value = group.id;\n};\n\n/**\n * Сбросить кэш\n *\n * @param resetAPICache - Сбросить API кэш\n */\nconst resetCacheSelector = (resetAPICache = false) => {\n\trefSelector.value?.resetCache(resetAPICache);\n};\n\n// Настройка API, обработка смены папки и выбор всех групп\nuseWatch({\n\tprojectId: () => props.projectId,\n\tfolderId: () => props.folder?.id,\n\tcanSelectAll: () => props.canSelectAll,\n}, (changes) => {\n\t// Настройка API\n\tif (changes.projectId) {\n\t\tapiGet?.changeParams({\n\t\t\tproject_id: props.projectId,\n\t\t});\n\n\t\tapiGet?.setOptions({\n\t\t\tcheckFingerprint: 'TopGroupSelectorGroups:' + props.projectId,\n\t\t});\n\t}\n\n\t// Обработка смены папки\n\tif (changes.folderId) {\n\t\tfilterByFolder.values = [\n\t\t\tprops.folder?.id ?? 0,\n\t\t];\n\t}\n\n\tresetCacheSelector();\n\n\t/**\n\t * При смене папки автоматически выбирать нужную группу с учетом `props.autoselect`\n\t *\n\t * Новая группа, при смене папки не меняется\n\t */\n\tif (\n\t\t(changes.folderId?.old !== undefined || changes.canSelectAll?.old !== undefined) &&\n\t\tmodelGroupId.value !== ITEM_ID_NEW\n\t) {\n\t\tlet group: Props['group'] | undefined;\n\n\t\tif (props.autoselect === 'first') {\n\t\t\tgroup = groupsBySelectedFolder.value?.[0];\n\n\t\t\tif (props.canSelectAll) {\n\t\t\t\tgroup = reactive(genGroupAll());\n\t\t\t}\n\t\t}\n\n\t\tif (props.autoselect === 'placeholder' || !group) {\n\t\t\tgroup = genGroupPlaceholder();\n\t\t}\n\n\t\tsetGroup(group);\n\t}\n}, { immediate: true });\n\n/**\n * Проверка входного значения `modelGroupId` и изменение `modelGroup`\n *\n * Определяем существует ли группа:\n * - Если существует: меняем группу на указанную\n * - Если не существует: устанавливаем \"Нет группы\"\n *\n * При загрузке групп по API проверка выполняется в асинхронном режиме\n */\nuseWatch({\n\tmodelGroup,\n\tmodelGroupId,\n}, async (changes) => {\n\tif (modelGroupId.value === modelGroup.value.id) {\n\t\treturn;\n\t}\n\n\t// изменение только `modelGroup`\n\tif (changes.modelGroup && !changes.modelGroupId) {\n\t\tmodelGroupId.value = modelGroup.value.id;\n\n\t\treturn;\n\t}\n\n\tif (props.canAdd && modelGroupId.value === ITEM_ID_NEW) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Для не api\n\t */\n\tif (props.groups) {\n\t\tlet groupSelected = groupsBySelectedFolder.value?.find((group) => group.id === modelGroupId.value);\n\n\t\tif (!groupSelected && props.canSelectAll) groupSelected = genGroupAll();\n\n\t\tif (groupSelected) {\n\t\t\tsetGroup(groupSelected);\n\t\t} else {\n\t\t\tconst firstGroup = groupsBySelectedFolder.value?.[0];\n\t\t\tif (firstGroup && !modelGroupId.value) {\n\t\t\t\t// группа не была указана, инициализация компонента\n\t\t\t\tsetGroup(firstGroup);\n\t\t\t} else {\n\t\t\t\tsetGroup(groupNone);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Для api\n\t */\n\tif (props.client && !props.groups && (modelGroupId.value || modelGroupId.value === ITEM_ID_ALL && !props.canSelectAll)) {\n\t\tconst api = genApiGetGroups(props.client, props.service).changeParams({\n\t\t\tproject_id: props.projectId,\n\t\t\tid: modelGroupId.value,\n\t\t\tfilters: [\n\t\t\t\tfilterByFolder,\n\t\t\t],\n\t\t});\n\n\t\t/**\n\t\t * @remarks При выборе группы \"Все группы\" или при добавлении группы отмена запроса не происходит\n\t\t */\n\t\tapi?.setOptions({\n\t\t\tcheckFingerprint: 'TopGroupSelectorFindGroup:' + props.projectId,\n\t\t});\n\n\t\tconst res = await api.call();\n\n\t\t// при отмене запроса, смену группы не выполняем\n\t\tif (!res.errors?.length && !res.result) return;\n\n\t\tif (!res.errors && res.result[0]) {\n\t\t\tsetGroup(res.result[0] as Group);\n\t\t} else {\n\t\t\tsetGroup(groupNone);\n\t\t}\n\t}\n}, { immediate: true });\n\nconst addGroups = async (group: SelectorItem) => {\n\t// просто выбор произвольной группы, без реального добавления\n\tif (props.canAdd !== 'api') return;\n\n\t// при добавлении группы `props.client` обязателен\n\tif (!apiAdd) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiAdd.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\tconst modelGroupOld = modelGroup.value;\n\n\t// Для api\n\tconst res = await apiAdd.changeParams({\n\t\tproject_id: props.projectId,\n\t\tnames: [group.name],\n\t\tto_id: props.folder?.id ?? folderDefault.id,\n\t\tto_type: 'in_folder_last',\n\t}).call();\n\n\tif (res.result) {\n\t\tconst group = res.result[0] as Group;\n\n\t\tsetGroup(group);\n\n\t\temits('addGroup', group);\n\t} else {\n\t\t// вернуть предыдущий выбор в случае ошибки добавления группы\n\t\tsetGroup(modelGroupOld);\n\t}\n\n\trefSelector.value?.resetCache(true);\n};\n\nconst renameGroup = async (group: SelectorItem, newName: string) => {\n\t// при переименовании группы `props.client` обязателен\n\tif (!apiEditRename) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiEditRename.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\t// Для api\n\tconst res = await apiEditRename.changeParams({\n\t\tproject_id: props.projectId,\n\t\tid: group.id,\n\t\tname: newName,\n\t}).call();\n\n\tif (res.errors) return;\n\n\t/**\n\t * Свойства Model напрямую менять нельзя\n\t *\n\t * Данный код вообще не нужен, потому что:\n\t * - локальный список групп управляется состоянием компонента через `props.group` и `@update:group`\n\t * - список, обновляемый через API, обновляется через систему кеширования\n\t */\n\t// if (modelGroup.value.id === group.id) {\n\t// \tmodelGroup.value = {\n\t// \t\t...modelGroup.value,\n\t// \t\tname: newName,\n\t// \t};\n\t// }\n\n\t// Модификация группы без переприсвоения, чтобы не вызывать лишних запросов\n\tif (modelGroup.value.id === group.id) modelGroup.value.name = newName;\n\n\temits('editGroup', {\n\t\tid: group.id!,\n\t\tname: newName,\n\t});\n\n\trefSelector.value?.updateCacheItemById(group.id, {\n\t\tname: newName,\n\t});\n};\n\nconst deleteGroups = async (group: SelectorItem) => {\n\t// при удалении группы `props.client` обязателен\n\tif (!apiDel) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiDel.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\t// Для api\n\tconst res = await apiDel.changeParams({\n\t\tproject_id: props.projectId,\n\t\tid: group.id,\n\t}).call();\n\n\tif (res.errors) return;\n\n\t// при удалении выбранной группа убрать выбор группы\n\tif (modelGroup.value.id === group.id) setGroup(props.canSelectAll ? genGroupAll() : groupNone);\n\n\temits('delGroup', group.id!);\n\n\trefSelector.value?.deleteCacheItemById(group.id);\n};\n\ndefineExpose({\n\tresetCacheGroups: resetCacheSelector,\n});\n</script>\n\n<template>\n\t<Selector2\n\t\tref=\"refSelector\"\n\t\tclass=\"top-groupSelector_group\"\n\t\tv-model=\"modelGroup\"\n\t\t:items=\"groupsBySelectedFolder ?? groups\"\n\t\tsearchType=\"inline\"\n\t\t:icon=\"addIcon ? '' : undefined\"\n\t\t:api=\"groups ? undefined : apiGet\"\n\t\t:apiSetSearchParams=\"(...args) => apiSetSearchParamsFilter(...args, 'name')\"\n\t\t:appendSearchToResult=\"!!canAdd\"\n\t\t:useAllItem=\"canSelectAll ? genGroupAll().name : false\"\n\t\t:addChanger\n\t\tuseCache\n\t\t@appendItem=\"addGroups\"\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div class=\"top-groupSelector_groupItem top-ellipsis1\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\tv-if=\"item.id === ITEM_ID_NEW\"\n\t\t\t\t>\n\t\t\t\t\t{{ $i18n.Common.Add }}:\n\t\t\t\t</div>\n\n\t\t\t\t<!--<span>{{ item.name }}</span>-->\n\t\t\t\t<span\n\t\t\t\t\tclass=\"top-groupSelector_groupItemName top-ellipsis1\"\n\t\t\t\t\tv-html=\"item.name\"\n\t\t\t\t></span>\n\n\t\t\t\t<!--<span v-if=\"item.folder_path && showPath\" class=\"top-groupSelector_groupItemFolderPath\">-->\n\t\t\t\t<!--\t{{ item.folder_path }}-->\n\t\t\t\t<!--</span>-->\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"item.folder_path && showPath\"\n\t\t\t\t\tclass=\"top-groupSelector_groupItemFolderPath top-ellipsis1\"\n\t\t\t\t\tv-html=\"item.folder_path\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template\n\t\t\t#actions=\"{ item }\"\n\t\t\tv-if=\"canEditAndDel && client\"\n\t\t>\n\t\t\t<template v-if=\"item.id\">\n\t\t\t\t<!-- переименование группы -->\n\t\t\t\t<PopupPrompt\n\t\t\t\t\t:submitText=\"$i18n.Common.Save\"\n\t\t\t\t\t:defaultValue=\"item.name\"\n\t\t\t\t\t:inputProps=\"{ addCleaner: false }\"\n\t\t\t\t\t@submit=\"(value) => renameGroup(item, value)\"\n\t\t\t\t>\n\t\t\t\t\t<template #opener>\n\t\t\t\t\t\t<div data-top-icon=\"\"></div>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<template #default></template>\n\t\t\t\t</PopupPrompt>\n\n\t\t\t\t<!-- удаление группы -->\n\t\t\t\t<PopupConfirm\n\t\t\t\t\tisWarning\n\t\t\t\t\t:submitText=\"$i18n.Common.Delete\"\n\t\t\t\t\t@submit=\"deleteGroups(item)\"\n\t\t\t\t>\n\t\t\t\t\t<template #opener>\n\t\t\t\t\t\t<div data-top-icon=\"\"></div>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<span v-html=\"service === 'keywords_2' ? $i18n.Keywords.Delete_group_warning : $i18n['Ai.Tracker'].Delete_group_warning\"></span>\n\t\t\t\t</PopupConfirm>\n\t\t\t</template>\n\t\t</template>\n\t</Selector2>\n</template>\n\n<style>\n.top-groupSelector_groupItem {\n\tmin-height: 20px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-padding-1);\n}\n\n.top-groupSelector_groupItemFolderPath {\n\twidth: 100%;\n\tcolor: var(--color-text-4);\n\tfont-size: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { type ModelRef, ref } from 'vue';\nimport type { Emits, Props } from './types';\nimport type { Group } from './groups/types';\nimport Folders from './folders/folders.vue';\nimport Groups from './groups/groups.vue';\nimport { folderDefault, genFlat } from './folders/utils';\nimport { genGroupAll, genGroupPlaceholder, groupNone } from './groups/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tcanSelectAllGroups: false,\n\tautoselect: 'first',\n\taddChanger: true,\n\tshowFolders: true,\n\tshowGroups: true,\n\taddIcon: true,\n\tservice: 'keywords_2',\n});\n\nconst componentGroupsRef = ref<InstanceType<typeof Groups> | null>(null);\n\nconst modelFolderId = defineModel<Props['folderId']>('folderId', { required: true });\nconst modelFolder = defineModel<Props['folder']>('folder');\n\nconst modelGroupId = defineModel<Props['groupId']>('groupId', { required: true });\nconst modelGroup = defineModel<Props['group']>('group', { default: groupNone }) as ModelRef<NonNullable<Props['group']>>;\n\nconst emit = defineEmits<Emits>();\n\n/**\n * Выбранная папка\n *\n * Спекулятивное предсказание выбранной папки\n *\n * Если папка не определена, она ставится в `undefined`, чтобы при последующем определении не фиксировались события смены папки, см. `groups.vue`\n */\nconst foldersFlat = genFlat(props.folders ?? { root: [folderDefault] }, props.canSelectAllGroups);\nmodelFolder.value = foldersFlat.get(modelFolderId.value);\n\n/**\n * Спекулятивное предсказание выбранной группы, чтобы не было лишней перерисовки\n *\n * Точная проверка происходит в `groups.vue`\n */\nlet groupInitial = props.groups?.find((group) => group.id === modelGroupId.value);\nif (!modelGroupId.value) groupInitial = props.groups?.[0];\nif (props.canSelectAllGroups && !groupInitial) {\n\tgroupInitial = genGroupAll();\n}\nif (props.autoselect === 'placeholder' || !groupInitial) {\n\tgroupInitial = genGroupPlaceholder();\n}\ngroupInitial ??= groupNone;\n\nmodelGroup.value = groupInitial;\n\nconst onAddGroup = (group: Group) => {\n\t// если загрузка групп производится по api, то добавлять новые группы в `props.groups` не нужно\n\tlet groups: Group[] | undefined;\n\n\tif (props.groups && group) {\n\t\tgroups = [...props.groups, group];\n\t}\n\n\temit('update:groups', groups);\n};\n\nconst onEditGroup = (groupEditedPatch: Partial<Group> & { id: Group['id']}) => {\n\t// если загрузка групп производится по api, то обновлять группы в `props.groups` не нужно\n\tif (!props.groups) {\n\t\temit('update:groups');\n\n\t\treturn;\n\t}\n\n\tconst groupFinded = props.groups.find((group) => group.id === groupEditedPatch.id);\n\tif (!groupFinded) return;\n\n\tconst groupEdited = { ...groupFinded, ...groupEditedPatch };\n\n\tconst groups = props.groups.map((group) => group.id === groupEdited.id ? groupEdited : group);\n\n\temit('update:groups', groups);\n};\n\nconst onDelGroup = (groupDeletedId: Group['id']) => {\n\t// если загрузка групп производится по api, то удалять группы из `props.groups` не нужно\n\tif (!props.groups) {\n\t\temit('update:groups');\n\n\t\treturn;\n\t}\n\n\tconst groups = props.groups.filter((group) => group.id !== groupDeletedId);\n\n\temit('update:groups', groups);\n};\n\ndefineExpose({\n\t/**\n\t * Сбросить кэш\n\t *\n\t * @param resetAPICache - Сбросить API кэш\n\t */\n\tresetCacheGroups: (resetAPICache = false) => {\n\t\tcomponentGroupsRef.value?.resetCacheGroups(resetAPICache);\n\t},\n});\n</script>\n\n<template>\n\t<div class=\"top-groupSelector\">\n\t\t<Folders\n\t\t\tv-if=\"showFolders\"\n\t\t\tv-model:folderId=\"modelFolderId\"\n\t\t\tv-model:folder=\"modelFolder\"\n\t\t\t:projectId\n\t\t\t:folders\n\t\t\t:canSelectAll=\"canSelectAllGroups\"\n\t\t\t:addChanger\n\t\t\t:addIcon\n\t\t\t:client\n\t\t\t:service=\"props.service\"\n\t\t/>\n\n\t\t<Groups\n\t\t\tv-if=\"showGroups\"\n\t\t\tref=\"componentGroupsRef\"\n\t\t\tv-model:groupId=\"modelGroupId\"\n\t\t\tv-model:group=\"modelGroup\"\n\t\t\t:projectId\n\t\t\t:folder=\"modelFolder\"\n\t\t\t:groups\n\t\t\t:on\n\t\t\t:canAdd=\"canAddGroup\"\n\t\t\t:canEditAndDel=\"canEditAndDelGroup\"\n\t\t\t:canSelectAll=\"canSelectAllGroups\"\n\t\t\t:autoselect\n\t\t\t:addChanger\n\t\t\t:showPath=\"showGroupsPaths || showFolders\"\n\t\t\t:addIcon\n\t\t\t:client\n\t\t\t:service=\"props.service\"\n\t\t\t@addGroup=\"onAddGroup\"\n\t\t\t@editGroup=\"onEditGroup\"\n\t\t\t@delGroup=\"onDelGroup\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-groupSelector {\n\tdisplay: inline-flex;\n\tgap: var(--top-padding-1);\n}\n</style>\n","import { useI18n } from '@/core/plugins/i18n';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { genFieldFilter, genFieldOrder } from '@/api/api';\nimport Core from '@/core/core/core';\nimport type { Props } from '@/components/formsExt/selector2/types';\nimport type { Item, Project } from './types';\n\n/**\n * Создать объект заголовка для категории проектов\n */\nconst createProjectCategoryTitles = (name: string): Item => {\n\treturn {\n\t\tid: null,\n\t\tname,\n\t\tlistItemProps: {\n\t\t\ttype: 'title',\n\t\t\tclass: 'top-projectSelector_item',\n\t\t},\n\t};\n};\n\n/**\n * Состояние вставки заголовков категорий\n *\n * Используется для отслеживания, какие заголовки уже были добавлены в список,\n * чтобы не дублировать их при постраничной загрузке данных\n */\nconst globalTitlesState = {\n\tscheduledUpdate: false,\n\tmanualUpdate: false,\n\tguestProjects: false,\n};\n\n/**\n * Сгенерировать результат с заголовками категорий перед соответствующими группами проектов\n *\n * Использует `globalTitlesState`, оно сохраняется между вызовами, так как проекты подгружаются частями\n *\n * При `useLocalTitlesState` = `true` создаётся временное состояние заголовков для этого вызова функции, не влияющее на глобальное состояние.\n * Используется при поиске проектов, чтобы сохранить исходное состояние заголовков\n */\nconst genResultWithCategoryTitles = (projects: Item[], useLocalTitlesState?: boolean): Item[] => {\n\tconst result: Item[] = [];\n\n\tconst categoriesTitle = {\n\t\tscheduledUpdate: createProjectCategoryTitles(useI18n().Projects.Scheduled_update),\n\t\tmanualUpdate: createProjectCategoryTitles(useI18n().Projects.Manual_update),\n\t\tguestProjects: createProjectCategoryTitles(useI18n().Projects.Guest_projects),\n\t};\n\n\tconst titlesState = useLocalTitlesState ? {\n\t\tscheduledUpdate: false,\n\t\tmanualUpdate: false,\n\t\tguestProjects: false,\n\t} : globalTitlesState;\n\n\tfor (const project of projects) {\n\t\tif (!titlesState.scheduledUpdate && project.right?.startsWith('1') && project.on > 0) {\n\t\t\tresult.push(categoriesTitle.scheduledUpdate);\n\t\t\ttitlesState.scheduledUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.manualUpdate && project.right?.startsWith('1') && project.on === 0) {\n\t\t\tresult.push(categoriesTitle.manualUpdate);\n\t\t\ttitlesState.manualUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.guestProjects && project.right?.startsWith('0') && project.on >= 0) {\n\t\t\tresult.push(categoriesTitle.guestProjects);\n\t\t\ttitlesState.guestProjects = true;\n\t\t}\n\n\t\tresult.push(project);\n\t}\n\n\treturn result;\n};\n\n/**\n * Сгенерировать элемент для TopSelector\n */\nexport const genProjectItem = (project: Project): Item => ({\n\t...project,\n\texternalLink: genProjectExternalLink(project.url ?? ''),\n\tlistItemProps: {\n\t\tclass: 'top-projectSelector_item',\n\t\tattrs: {\n\t\t\ttitle: project.name!,\n\t\t},\n\t},\n});\n\n/**\n * Подготовить данные проектов для отображения:\n * - сбросить состояние вставки заголовков категорий, если требуется\n * - добавить `listItemProps` для шаблона TopSelector\n * - добавить заголовки к категориям\n */\nconst prepareProjects = (\n\tprojects: Project[] | undefined,\n\tresetTitlesState?: boolean,\n\tuseLocalTitlesState?: boolean,\n): Item[] | undefined => {\n\tif (!projects || projects.length === 0) return [];\n\n\tif (resetTitlesState) Object.keys(globalTitlesState).forEach((key) => globalTitlesState[key] = false);\n\n\tconst projectsWithListItem = projects.map(genProjectItem);\n\n\treturn genResultWithCategoryTitles(projectsWithListItem, useLocalTitlesState);\n};\n\n/**\n * Добавить к ссылке релевантные hash-параметров текущего проекта\n */\nconst prepareProjectLink = (link: string) => {\n\tlink = link.replace(/#.*/, '');\n\n\tlet hash = location.hash;\n\n\t// Игнорируемые параметры при переходе между проектами (формат плагина piniaTPA)\n\thash = hash.replace(/%22historyView%22:[^,]*,/, '');\n\thash = hash.replace(/%22modelsKeys%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22competitorsIds%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22searchersKeys%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22regionIndex%22:[^,]*,/, '');\n\thash = hash.replace(/%22regionsIndexes%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22folderId%22:[^,]*,/, '');\n\thash = hash.replace(/%22groupId%22:[^,]*,/, '');\n\thash = hash.replace(/%22tagsIds%22:\\[[^\\]]*],/, '');\n\n\t// Сохранить сортировку по дате последней проверки\n\tif (!/%22dataSort%22:\\{[^}]*0000-00-00[^}]*}/.test(hash)) {\n\t\thash = hash.replace(/,?%22dataSort%22:\\{[^}]*}(,?)/, '$1');\n\t}\n\n\treturn link + hash;\n};\n\nexport const navigateToProject = (projectId: number) => {\n\tlocation.href = genLinkToProjectMod(projectId);\n};\n\n/**\n * Сгенерировать ссылку на страницу проекта с инструментом\n *\n * @note Ссылка сейчас пересчитывается только в момент открытия меню\n */\nexport const genLinkToProjectMod = (projectId: number) => {\n\tconst host = getBaseHost();\n\tconst pathname = location.pathname.split('/');\n\n\tlet prefix = 'project/dynamics/';\n\tlet suffix = '';\n\tif (pathname[1] == 'project') prefix = pathname[1] + '/' + pathname[2] + '/';\n\tif (pathname[2] == 'settings') suffix = location.hash;\n\tif (['watcher', 'indexing', 'sitemap', 'audit', 'direct', 'adwords'].includes(pathname[4])) suffix = pathname[4] + '/';\n\n\tlet link = 'https://' + host + '/' + prefix + projectId + '/' + suffix;\n\tlink = prepareProjectLink(link);\n\n\treturn link;\n};\n\n/**\n * Вернуть базовый хост без поддомена\n */\nexport const getBaseHost = () => {\n\tif (window['page']?.subdomain) {\n\t\treturn window.location.host.replace(window['page']?.subdomain + '.', '');\n\t}\n\n\treturn window.location.host;\n};\n\n/**\n * Сгенерировать ссылку на сайт проекта\n */\nexport const genProjectExternalLink = (url: string) => {\n\tlet link = url.startsWith('http') ? url : 'https://' + url;\n\n\tlink = link.replace(/\"/g, '%22');\n\n\treturn link;\n};\n\n/**\n * Расширяет функционал аналогичной функции в Selector2\n *\n * Добавить фильтр поиска по полям `id`, `name`, `url` в параметры API.\n * Поиск выполняется по строке `search` и по строке с инвертированной раскладкой клавиатуры.\n *\n * @param api - api, которое используется в `TopProjectSelector`\n * @param search - введенная строка поиска\n *\n * @todo Объединить с apiSetSearchParamsFilter() из @/components/formsExt/selector2/utils.ts\n */\nexport const apiSetSearchParamsFilter = (api: NonNullable<Props['api']>, search: string) => {\n\tlet filters = api.params.filters ?? [];\n\n\t// удаление других фильтров по этому полю\n\tfilters = filters.filter((filter: { name: string; }) => { return filter.name !== 'GEN_SEARCH_STRING()'; });\n\n\tconst searchInvert = invertKeyboardLayout(search);\n\tconst searchPrepared = search.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\tconst searchInvertPrepared = searchInvert.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\n\tif (search) {\n\t\tfilters.push(genFieldFilter('GEN_SEARCH_STRING()', 'REGEXP', [`(${searchPrepared}|${searchInvertPrepared})`]));\n\t}\n\n\tapi.changeParams({ filters });\n};\n\n/**\n * Создать API запрос на получение списка проектов\n *\n * Данные после загрузки преобразуются с помощью `prepareProjects()`\n *\n * @see prepareProjects\n */\nexport const genApiGetProjects = (client: Api.Client<Api.TV.Paths, true>) => {\n\tconst api = client.gen('/get/projects_2/projects/', ['id', 'user_id', 'name', 'url', 'on', 'right']);\n\n\tapi.changeParams({\n\t\tfilters: [\n\t\t\tgenFieldFilter('on', 'GREATER_THAN_EQUALS', [0]),\n\t\t],\n\t\torders: [\n\t\t\tgenFieldOrder('user_id', 'DESC', [Core.state.userId]),\n\t\t\tgenFieldOrder('on', 'DESC'),\n\t\t\tgenFieldOrder('favorite', 'DESC'),\n\t\t\tgenFieldOrder('id', 'DESC'),\n\t\t],\n\t});\n\n\tapi.options.loadingShowSpinner = false;\n\n\tapi.options.onApiLoaded = (res, ctx, clientOnApiLoaded) => {\n\t\t/**\n\t\t * Флаг для сброса глобального состояния заголовков.\n\t\t *\n\t\t * Срабатывает при добавлении проекта или полной перезагрузке списка\n\t\t */\n\t\tconst needResetTitle = ctx.data.filters.length === 1 && ctx.data.offset === 0 || ctx.data.limit === 1000;\n\n\t\t/**\n\t\t * Флаг для использования локального состояния заголовков.\n\t\t *\n\t\t * Срабатывает при поиске проектов (когда фильтров больше одного), чтобы не сбрасывать уже вставленные заголовки.\n\t\t */\n\t\tconst useLocalTitlesState = ctx.data.limit === 100 && ctx.data.filters.length > 1 ? true : undefined;\n\n\t\tres.result = prepareProjects(res.result as Project[], needResetTitle, useLocalTitlesState);\n\n\t\tclientOnApiLoaded?.(res, ctx);\n\t};\n\n\treturn api;\n};\n\n/**\n * Создать API запрос для добавления проекта\n */\nexport const genApiAddProject = (client: Api.Client<Api.TV.Paths, true>) => {\n\treturn client.gen('/add/projects_2/projects/');\n};\n","<script setup lang=\"ts\">\nimport type { PopupData, Props } from './types';\nimport { TopPopup, TopPopupListItem } from '@/components/popup/popup';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getBaseHost } from '@/components/project/projectSelector/utils';\nimport { Core } from '@/core/app';\n\nconst props = defineProps<Props>();\n\nconst i18n = useI18n();\nconst host = getBaseHost();\n\nconst genItems = (projectItem: PopupData['projectItem']) => {\n\tconst submenuItems = [\n\t\t{\n\t\t\thref: `https://${host}/project/keywords/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_phrases,\n\t\t\ticon: '',\n\t\t\tright: '2',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/dynamics/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_dynamics,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/snapshots/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_snapshots,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/competitors/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_competitors,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/ai-tracker/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_aiTracker,\n\t\t\ticon: '',\n\t\t\tright: '13',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/analytics/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_analytics,\n\t\t\ticon: '',\n\t\t\tright: '5',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/broker/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_broker,\n\t\t\ticon: '',\n\t\t\tright: '6',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/sitemap/`,\n\t\t\ttitle: i18n.Audit.Sitemap_gen,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/audit/`,\n\t\t\ttitle: i18n.Common.Menu_audit,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/indexing/`,\n\t\t\ttitle: i18n.Audit.Indexing,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/watcher/`,\n\t\t\ttitle: i18n.Audit.Watcher,\n\t\t\ticon: '',\n\t\t\tright: '9',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/settings/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_settings,\n\t\t\ticon: '',\n\t\t\tright: '2',\n\t\t},\n\t].filter(item => {\n\t\treturn !Object.entries(Core.state.closedByMod).some(([mod, closed]) => {\n\t\t\treturn closed && item.href.includes(`/${mod}/`);\n\t\t});\n\t});\n\n\tif (!projectItem.right.includes('0')) {\n\t\treturn submenuItems;\n\t}\n\n\treturn submenuItems.filter((item) => {\n\t\treturn projectItem.right[item.right] === '1';\n\t});\n};\n</script>\n\n<template>\n\t<TopPopup\n\t\t:id=\"props.id\"\n\t\tclass=\"top-projectSelectorSubmenu\"\n\t\t:notch=\"false\"\n\t\tpos=\"2\"\n\t>\n\t\t<template #contentList=\"{ data }: { data: PopupData }\">\n\t\t\t<template v-if=\"data\">\n\t\t\t\t<TopPopupListItem\n\t\t\t\t\tv-for=\"item in genItems(data.projectItem)\"\n\t\t\t\t\t:href=\"item.href\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:data-right=\"item.right\"\n\t\t\t\t>\n\t\t\t\t\t{{ $core.state.isMobile ? item.title : '' }}\n\t\t\t\t</TopPopupListItem>\n\n\t\t\t\t<TopPopupListItem\n\t\t\t\t\t:href=\"data.projectItem.externalLink\"\n\t\t\t\t\t:title=\"data.projectItem.externalLink\"\n\t\t\t\t\tclass=\"top-ellipsis\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"top-ellipsis1\">\n\t\t\t\t\t\t{{ $core.state.isMobile ? data.projectItem.externalLink : '' }}\n\t\t\t\t\t</span>\n\t\t\t\t</TopPopupListItem>\n\t\t\t</template>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n@media (width >= 900px) {\n\t.top-projectSelectorSubmenu .top-popup {\n\t\tmin-width: unset;\n\t}\n\n\t.top-projectSelectorSubmenu ul {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(3, 1fr);\n\t}\n\n\t.top-projectSelectorSubmenu ul.top-popup_content li > a[data-top-icon]:before {\n\t\t--top-icon-size: 24px;\n\t\t--top-icon-width: 32px;\n\n\t\theight: var(--top-icon-width);\n\t\tmargin: 0;\n\t}\n}\n</style>\n","import type { Item } from '@/components/formsExt/selector2/types';\nimport { clearCache as SelectorClearCache } from '@/components/formsExt/selector2/cache';\n\nimport { ref, shallowRef } from 'vue';\nimport Core from '@/core/core/core';\n\nconst CACHE_KEY = 'ui_project_selector_total';\n\n/**\n * Время жизни кеша - 1 сутки\n */\nconst CACHE_TTL = 24 * 60 * 60 * 1000;\n\n/**\n * Promise текущего выполняющегося запроса на получение проектов.\n *\n * Используется для дедупликации запросов: если запрос уже запущен, повторные вызовы будут ждать один и тот же Promise.\n */\nexport const projectsRequest = ref<Promise<Api.ResponseSuccess<any, 'get'> | Api.ResponseError<any>> | null>(null);\n\n/**\n * Кеш списка проектов\n *\n * Используется только при `dataSource` = `static`\n * Данные синхронизируются между всеми экземплярами ProjectSelector\n *\n * @todo Добавить поддержку моков\n */\nexport const projectsCache = shallowRef<Item[]>();\n\nexport const setCacheTotal = (projectsTotal: number) => {\n\tlocalStorage.setItem(\n\t\tCACHE_KEY + ':' + Core.state.userId,\n\t\tJSON.stringify({ projectsTotal, expiresAt: Date.now() + CACHE_TTL }),\n\t);\n};\n\nexport const getCacheTotal = () => {\n\tconst raw = localStorage.getItem(CACHE_KEY + ':' + Core.state.userId);\n\tif (!raw) return;\n\n\tconst { projectsTotal, expiresAt } = JSON.parse(raw) as Record<string, number>;\n\tif (Date.now() > expiresAt) {\n\t\tlocalStorage.removeItem(CACHE_KEY + ':' + Core.state.userId);\n\n\t\treturn;\n\t}\n\n\treturn projectsTotal;\n};\n\n/**\n * Сбросить локальный кеш и кеш API `/get/projects_2/projects/`\n */\nexport const clearCache = () => {\n\tprojectsRequest.value = null;\n\tprojectsCache.value = undefined;\n\n\tlocalStorage.removeItem(CACHE_KEY + ':' + Core.state.userId);\n\n\tSelectorClearCache('/get/projects_2/projects/');\n};\n","<script setup lang=\"ts\">\nimport type { Item as SelectorItem } from '@/components/formsExt/selector2/types';\nimport type { ComponentExposed } from 'vue-component-type-helpers';\nimport type { Props, Item } from './types';\nimport type { PopupData } from './submenu/types';\nimport { computed, onMounted, ref, useId, watch } from 'vue';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport { validUrl } from '@/core/utils/check';\nimport { ellipsis } from '@/core/utils/string';\nimport { useI18n } from '@/core/plugins/i18n';\nimport Core from '@/core/core/core';\nimport TopPopupOpener from '@/components/popup/popup/opener/opener.vue';\nimport Submenu from './submenu/submenu.vue';\nimport { apiSetSearchParamsFilter, genApiAddProject, genApiGetProjects, genProjectItem, genLinkToProjectMod, navigateToProject } from './utils';\nimport { getCacheTotal, projectsCache, projectsRequest, setCacheTotal } from './cache';\n\nconst i18n = useI18n();\n\n/**\n * Количество проектов, при котором включается динамическая загрузка через API\n */\nconst PROJECTS_TOTAL_THRESHOLD = 1000;\n\nconst props = defineProps<Props>();\n\nconst model = defineModel<NonNullable<Props['modelValue']>>({\n\tdefault: () => {\n\t\treturn {\n\t\t\tid: null,\n\t\t\tname: '',\n\t\t};\n\t},\n});\n\nconst apiGet = genApiGetProjects(props.client);\nconst apiAdd = genApiAddProject(props.client);\n\nconst projectsTotal = ref<number | undefined>(getCacheTotal());\nconst refSelector = ref<ComponentExposed<typeof Selector2<Item>> | null>(null);\nconst uid = useId();\n\nconst placeholder = computed(() => {\n\treturn props.placeholder ?? i18n.Projects.Select_project;\n});\n\nconst itemsForSelector = computed(() => {\n\tif (!projectsCache.value || !props.excludeProjectId) return projectsCache.value;\n\n\treturn projectsCache.value.filter((project) => project.id !== props.excludeProjectId);\n});\n\n/**\n * Источник данных для списка проектов:\n * - `static` — список проектов передан через props\n * - `api` — список загружается через HTTP (API)\n *\n * Выбор режима: `static`, если `projectsTotal` < `PROJECTS_TOTAL_THRESHOLD`, иначе `api`\n */\nconst dataSource = computed(() => {\n\tif (!projectsTotal.value && projectsTotal.value !== 0) return;\n\n\treturn projectsTotal.value < PROJECTS_TOTAL_THRESHOLD ? 'static' : 'api';\n});\n\nconst getProjects = async () => {\n\tif (!projectsRequest.value) {\n\t\tprojectsRequest.value = apiGet.call();\n\t}\n\n\tconst res = await projectsRequest.value;\n\tprojectsRequest.value = null;\n\n\treturn res;\n};\n\n/**\n * Создать новый проект, если введен валидный url\n */\nconst addProject = async (item: SelectorItem) => {\n\tconst res = await apiAdd.changeParams({\n\t\turl: item.name,\n\t\tname: item.name,\n\t}).call();\n\tif (res.errors) return;\n\n\tif (projectsCache.value && dataSource.value === 'static') {\n\t\tconst newProject = genProjectItem({\n\t\t\tid: res.result,\n\t\t\tuser_id: Core.state.userId,\n\t\t\tname: item.name,\n\t\t\turl: item.name,\n\t\t\ton: 0,\n\t\t\tright: '11111111111111111111',\n\t\t});\n\n\t\tconst firstManualUpdateProjectIndex = projectsCache.value.findIndex((project) => project.on === 0);\n\t\tprojectsCache.value = [\n\t\t\t...projectsCache.value.slice(0, firstManualUpdateProjectIndex),\n\t\t\tnewProject,\n\t\t\t...projectsCache.value.slice(firstManualUpdateProjectIndex),\n\t\t];\n\n\t\tif (projectsTotal.value) {\n\t\t\tprojectsTotal.value += 1;\n\t\t\tsetCacheTotal(projectsTotal.value);\n\t\t}\n\t}\n\n\t// Сбросить кеш popup и его API, `projectsCache` сбрасывать не нужно\n\tif (dataSource.value === 'api') refSelector.value?.resetCache(true);\n};\n\n/**\n * Загрузить данные проектов при открытии списка\n *\n * Только при `dataSource` = `static`\n *\n * При `dataSource` = `api` данные будут загружаться внутри `Selector2`\n */\nconst onOpen = async () => {\n\tif (projectsCache.value || dataSource.value === 'api') return;\n\n\tconst res = await getProjects();\n\tif (res.errors) return;\n\n\tprojectsCache.value = res.result;\n};\n\n/**\n * Инициализировать данные проектов при первом открытии списка\n * - сохранить список проектов и их общее количество в кеше (на сутки или до сброса)\n * - при `dataSource` = `static` сразу записать полученные проекты в список\n *\n * Если `projectsTotal` уже получен из кеша, загрузка списка проектов произойдет при открытии списка\n */\nconst initProjects = async () => {\n\tif (projectsTotal.value) return;\n\n\tconst res = await getProjects();\n\tif (res.errors) return;\n\n\tprojectsTotal.value = res.total ?? undefined;\n\tif (dataSource.value === 'static' && !projectsCache.value) projectsCache.value = res.result;\n\n\tif (projectsTotal.value) setCacheTotal(projectsTotal.value);\n};\n\nonMounted(async () => {\n\tawait initProjects();\n});\n</script>\n\n<template>\n\t<Selector2\n\t\tref=\"refSelector\"\n\t\tclass=\"top-projectSelector\"\n\t\t:modelValue=\"model\"\n\t\t@update:modelValue=\"!menuMode ? model = $event : navigateToProject($event.id)\"\n\t\t:items=\"itemsForSelector\"\n\t\t:itemsIsLoading=\"dataSource === 'static' && projectsCache === undefined\"\n\t\t:title=\"$i18n.Projects.Search_projects\"\n\t\t:modificator\n\t\t:searchFields=\"['id', 'name', 'url']\"\n\t\t:placeholder\n\t\thasCloserBtn\n\t\t:api=\"dataSource === 'api' ? apiGet : undefined\"\n\t\t:apiSetSearchParams=\"dataSource === 'api' ? (...args: any) => apiSetSearchParamsFilter(...args) : undefined\"\n\t\tuseCache\n\t\tappendSearchToResult\n\t\tappendSearchAllowDuplicate\n\t\t:appendSearchToResultCond=\"validUrl\"\n\t\tappendWithoutSelect\n\t\t:buttonProps\n\t\t:openerShortcut\n\t\t@appendItem=\"addProject\"\n\t\t@open=\"onOpen\"\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div class=\"top-projectSelector_itemText\">\n\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t{{ ellipsis(item.name, 20) }}\n\t\t\t\t\t<span class=\"top-comment\">\n\t\t\t\t\t\t\tid {{ item.id }}\n\t\t\t\t\t\t</span>\n\t\t\t\t</template>\n\n\t\t\t\t<template v-else>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"!item.listItemProps?.type\"\n\t\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $i18n.Projects.Add_project }}:\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"item.id\">\n\t\t\t\t<a\n\t\t\t\t\tv-if=\"menuMode\"\n\t\t\t\t\tclass=\"top-projectSelector_itemLink\"\n\t\t\t\t\t:href=\"genLinkToProjectMod(item.id)\"\n\t\t\t\t></a>\n\n\t\t\t\t<TopButton\n\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t:href=\"item.externalLink\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t@click.stop\n\t\t\t\t></TopButton>\n\n\t\t\t\t<!-- @vue-generic {PopupData} -->\n\t\t\t\t<TopPopupOpener\n\t\t\t\t\t:id=\"uid\"\n\t\t\t\t\t:pos=\"'2'\"\n\t\t\t\t\t:notch=\"false\"\n\t\t\t\t\t:data=\"{ projectItem: item } satisfies PopupData\"\n\t\t\t\t>\n\t\t\t\t\t<TopButton\n\t\t\t\t\t\tclass=\"top-popup_listMore\"\n\t\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\t></TopButton>\n\t\t\t\t</TopPopupOpener>\n\t\t\t</template>\n\t\t</template>\n\t</Selector2>\n\n\t<Submenu :id=\"uid\"/>\n</template>\n\n<style>\n.top-projectSelector .top-popup {\n\twidth: 278px;\n}\n\n.top-projectSelector_itemLink {\n\tposition: absolute;\n\tinset: 0;\n}\n\n.top-projectSelector_itemText {\n\tflex-grow: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-1);\n}\n\n.top-projectSelector_item > .top-button {\n\topacity: 0;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.top-projectSelector_item:hover > .top-button,\n.top-projectSelector_item.top-active > .top-button {\n\topacity: 1;\n}\n\n@media screen and (min-width: 900px) {\n\t/* Ограничиваем стандартную высоту popup */\n\t.top-projectSelector.p3 div.top-popup {\n\t\tmax-height: min(calc(var(--top-popup-bottom) - 16px), 800px);\n\t}\n}\n\n@media screen and (max-width: 900px) {\n\t.top-projectSelector_item > .top-button {\n\t\topacity: 1;\n\t}\n}\n</style>\n","import type { Props as TagSelectorOpenerProps } from '../popupOpener/types';\nimport type { Tag, TagIdExclude } from '../types';\n\n/**\n * Полуичить значение исключения тега tagId\n */\nexport const genTagIdExcluded = (tagId: Tag['id']): TagIdExclude => {\n\treturn '-' + tagId as TagIdExclude;\n};\n\n/**\n * Вернуть чистый tagId без exclude флага\n */\nexport const genTagIdClear = (tagId: Tag['id'] | TagIdExclude) => {\n\tif (tagId[0] === '-') return tagId.substring(1) as Tag['id'];\n\n\treturn tagId as Tag['id'];\n};\n\n/**\n * Получить инфомрацию о теге по его id\n */\nexport const getTagById = (tagId: Tag['id'] | TagIdExclude, tags: TagSelectorOpenerProps['tags']) => {\n\ttagId = genTagIdClear(tagId);\n\n\tconst tag = tags.find(tag => tag.id === tagId);\n\tif (!tag) return;\n\n\treturn tag;\n};\n","import { isRef, type Ref, ref, unref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { storage } from '@/core/utils/dom';\nimport TopPopupWorker from '@/components/popup/lib/worker';\nimport type { OpenerProps as PopupOpenerProps } from '@/components/popup/popup/opener/types';\nimport type { Props as TagSelectorOpenerProps, TagSelectorTarget } from '../popupOpener/types';\nimport type { Props as TagIconProps } from '../tagIcon/types';\nimport { genTagIdClear, getTagById } from './utils';\n\n/**\n * Сгенерировать элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelectorPopupOpener для работы вне vue\n *\n * Требует монтирования компонента TopTagSelector\n */\nexport const genElPopupOpener = (\n\tprops: TagSelectorOpenerProps & { modelValue: TagSelectorOpenerProps['modelValue'] | Ref<TagSelectorOpenerProps['modelValue']> },\n\tpropsPopup?: Partial<PopupOpenerProps>,\n\thtmlSetterSeveral?: string,\n): HTMLElement => {\n\tif (!propsPopup) propsPopup = { id: props.id };\n\n\t// Значения по умолчанию см. в: `@/components/popup/popup/opener/opener.vue`\n\tpropsPopup.id = props.id;\n\tpropsPopup.pos ??= '3';\n\tpropsPopup.notch ??= true;\n\tpropsPopup.posBy ??= 'fixed';\n\n\tconst el = TopPopupWorker.genElPopupOpener('div', propsPopup as PopupOpenerProps);\n\n\tel.classList.add('top-tagSelector');\n\tif (props.useTopButton) el.classList.add('top-tagSelector-useTopButton', 'top-button', 'top-color_theme', 'top-as-selector');\n\tif (!props.useTopButton) el.classList.add('top-tagSelector-custom');\n\tif (props.mode === 'filter') el.classList.add('top-tagSelector-filter');\n\tif (props.mode === 'setter' && !props.filters) el.classList.add('top-tagSelector-setter_single');\n\tif (props.mode === 'setter' && props.filters) el.classList.add('top-tagSelector-setter_several');\n\n\t// прокcи клик: lazy connect\n\tel.onclick = (e) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tel.onclick = null;\n\n\t\tconst model = ref(props.modelValue);\n\n\t\tconst target: TagSelectorTarget = {\n\t\t\tmodel,\n\t\t\tmode: props.mode,\n\t\t\ttargetId: props.targetId,\n\t\t\tfilters: props.filters,\n\t\t\tpayload: props.payload,\n\t\t};\n\n\t\tstorage(el, 'topTagSelectorTarget', target);\n\n\t\tdelete el.dataset.topPopupDisabled;\n\n\t\tif (!isRef(props.modelValue)) {\n\t\t\twatch(model, () => {\n\t\t\t\tprops.modelValue = model.value;\n\n\t\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t\t});\n\t\t}\n\n\t\t// выполнение клика\n\t\tel.click();\n\t};\n\n\tif (isRef(props.modelValue)) {\n\t\twatch(props.modelValue, () => elPopupOpenerRender(el, props, htmlSetterSeveral));\n\t} else {\n\t\tstorage(el, 'topTagSelectorRender', (modelValue: TagSelectorOpenerProps['modelValue']) => {\n\t\t\tprops.modelValue = modelValue;\n\n\t\t\tconst target = storage(el, 'topTagSelectorTarget');\n\t\t\tif (target) target.model.value = modelValue;\n\n\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t});\n\t}\n\n\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\n\treturn el;\n};\n\n/**\n * Вызвать перерисовку элемента, который был создан через genElPopupOpener()\n *\n * Работет только для элементов не с реактивным modelValue\n */\nexport const renderElPopupOpener = (el: HTMLElement, modelValue: TagSelectorOpenerProps['modelValue']) => {\n\tstorage(el, 'topTagSelectorRender')?.(modelValue);\n};\n\n/**\n * Отрисовать TopTagSelecorPopupOpener\n */\nconst elPopupOpenerRender = (el, props: TagSelectorOpenerProps, htmlSetterSeveral?: string) => {\n\tconst tagsIds = unref(props.modelValue);\n\n\tel.classList.toggle('top-tagSelector-selectedOne', !tagsIds.length || tagsIds.length === 1);\n\tel.classList.toggle('top-tagSelector-toTwoLine', tagsIds.length > 5);\n\n\tif (props.mode === 'setter' && props.filters) {\n\t\tel.innerHTML = `<div>${htmlSetterSeveral}</div>`;\n\n\t\treturn;\n\t}\n\n\tel.innerHTML = '';\n\n\tif (!tagsIds.length && props.mode === 'filter') {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: 'all',\n\t\t\tcolorId: '',\n\t\t\tname: useI18n().Common?.All_tags ?? '',\n\t\t\tstate: '',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t}\n\n\ttagsIds.forEach(tagId => {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: genTagIdClear(tagId),\n\t\t\tcolorId: getTagById(tagId, props.tags)?.color_id ?? '',\n\t\t\tname: getTagById(tagId, props.tags)?.name ?? '',\n\t\t\tstate: genTagIdClear(tagId) === tagId ? 'selected' : 'excluded',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t});\n};\n\n/**\n * Сгенерировтаь элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelecorTagIcon для работы вне vue\n */\nconst genElTagIcon = (props: TagIconProps) => {\n\tconst el = document.createElement('div');\n\n\tel.classList.add('top-tagSelector_tagIcon');\n\tel.classList.toggle('top-tagSelector-active', !!props.state);\n\tel.classList.toggle('top-tagSelector-excluded', props.state === 'excluded');\n\n\tel.dataset.tag_id = props.id;\n\tel.dataset.tag_color_id = props.colorId;\n\tel.title = props.name;\n\n\treturn el;\n};\n","import type { Tag } from './types';\n\nexport default [\n\t{\n\t\tid: '1',\n\t\tname: 'Without Tag',\n\t\tcolor_id: '1',\n\t},\n\t{\n\t\tid: '2',\n\t\tname: 'Red',\n\t\tcolor_id: '2',\n\t},\n\t{\n\t\tid: '3',\n\t\tname: 'Orange',\n\t\tcolor_id: '3',\n\t},\n\t{\n\t\tid: '4',\n\t\tname: 'Yellow',\n\t\tcolor_id: '4',\n\t},\n\t{\n\t\tid: '5',\n\t\tname: 'Blue',\n\t\tcolor_id: '5',\n\t},\n\t{\n\t\tid: '6',\n\t\tname: 'Purple',\n\t\tcolor_id: '6',\n\t},\n\t{\n\t\tid: '7',\n\t\tname: 'Green',\n\t\tcolor_id: '7',\n\t},\n\t{\n\t\tid: '8',\n\t\tname: 'Magenta',\n\t\tcolor_id: '8',\n\t},\n\t{\n\t\tid: '9',\n\t\tname: 'Dark blue',\n\t\tcolor_id: '9',\n\t},\n\t{\n\t\tid: '10',\n\t\tname: 'Turquoise',\n\t\tcolor_id: '10',\n\t},\n] as Tag[];\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\ndefineProps<Props>();\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagIcon': true,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded',\n\t\t}\"\n\t\t:data-tag_id=\"id\"\n\t\t:data-tag_color_id=\"colorId\"\n\t\t:title=\"name\"\n\t></div>\n</template>\n\n<style>\n[data-tag_id] { display: inline-flex; gap: var(--top-gap-2); align-items: center; }\n\n[data-tag_id=\"\"] { border-color: #bdc3c7 !important; color: #55555F !important; }\n[data-tag_color_id=\"1\"] { border-color: var(--color-tag-1) !important; color: #55555F !important; }\n[data-tag_color_id=\"2\"] { border-color: var(--color-tag-2) !important; color: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"] { border-color: var(--color-tag-3) !important; color: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"] { border-color: var(--color-tag-4) !important; color: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"] { border-color: var(--color-tag-5) !important; color: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"] { border-color: var(--color-tag-6) !important; color: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"] { border-color: var(--color-tag-7) !important; color: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"] { border-color: var(--color-tag-8) !important; color: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"] { border-color: var(--color-tag-9) !important; color: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"] { border-color: var(--color-tag-10) !important; color: var(--color-tag-10) !important; }\n\n[data-tag_id=\"\"].top-tagSelector-active { background: #bdc3c7 !important; }\n[data-tag_color_id=\"1\"].top-tagSelector-active { background: var(--color-tag-1) !important; }\n[data-tag_color_id=\"2\"].top-tagSelector-active { background: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"].top-tagSelector-active { background: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"].top-tagSelector-active { background: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"].top-tagSelector-active { background: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"].top-tagSelector-active { background: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"].top-tagSelector-active { background: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"].top-tagSelector-active { background: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"].top-tagSelector-active { background: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"].top-tagSelector-active { background: var(--color-tag-10) !important; }\n\n[data-tag_id=\"all\"] {\n\tborder-color: transparent !important; background: none !important;\n}\n\n[data-tag_id=\"all\"]:before {\n\tcontent: \"\";\n\tcolor: var(--color-tag-all) !important;\n\tfont-size: 26px;\n\tmin-width: calc(100% + 4px);\n\theight: calc(100% + 4px);\n\tmargin-top: -18px;\n\tmargin-left: -8px;\n}\n\n/* в кнопке выбора тэгов и в popup */\n.top-tagSelector-useTopButton [data-tag_id],\n.top-tagSelector_popup [data-tag_id] {\n\t--top-tag-selector-size: 10px;\n\n\tbox-sizing: content-box;\n\tborder-radius: 100%; border: 2px solid var(--color-layout-front-1); background: var(--color-layout-front-1);\n\twidth: var(--top-tag-selector-size);\n\theight: var(--top-tag-selector-size);\n\tfont-size: calc(var(--top-tag-selector-size) + 4px);\n\t/*font-family: inherit !important;*/\n}\n\n/* исключение тегов */\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id],\n[data-tag_id].top-tagSelector-excluded { position: relative; }\n\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:before,\n[data-tag_id].top-tagSelector-excluded:before {\n\tcontent: \"\";\n\twidth: calc(var(--top-tag-selector-size) * 2); height: 1px; background: inherit;\n\ttransform: rotate(-45deg); filter: brightness(80%);\n\tdisplay: block;\n\tposition: absolute; top: calc(var(--top-tag-selector-size) / 2); left: calc(0px - var(--top-tag-selector-size) / 2);\n}\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:not([data-tag_id=\"all\"]):not(.top-tagSelector-active):before { background: #AAA; }\n[data-tag_id].top-tagSelector-excluded:after,\n[data-tag_id].top-tagSelector-excluded ~ .top-tagSelector_tagListItemName { text-decoration: line-through; }\n\n/* popup */\n.top-popup_listItem.top-tagSelector-active { background: var(--top-popup-background-color-active) !important; }\n\n.top-popup_listItem:hover [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-hover); }\n.top-popup_listItem.top-tagSelector-active [data-tag_id=\"all\"]:before,\n.top-popup_listItem.top-active [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-active); }\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\nimport TopPopupListItem from '@/components/popup/popup/listItem.vue';\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst name = defineModel<Props['name']>('name', {\n\trequired: true,\n});\n\nconst elName = ref<HTMLElement | null>(null);\n\n/**\n * @todo Удалить через пол года после выхода версии firefox с поддержкой contenteditable plaintext-only, включая бета версии\n */\nconst firefoxProps = computed(() => {\n\tif (navigator.userAgent.indexOf('Firefox') != -1) {\n\n\t\treturn {\n\t\t\tcontenteditable: inEdit.value,\n\t\t\tonpaste: (event: Event) => event.preventDefault(),\n\t\t};\n\t}\n\n\treturn {};\n});\n\n/**\n * Включен режим редактирвоания\n */\nconst inEdit = ref(false);\n\n/**\n * Включить режим редактирование\n */\nconst turnToEdit = async () => {\n\tinEdit.value = true;\n\n\tawait nextTick();\n\n\telName.value?.focus();\n};\n\n/**\n * Применить редактирование\n */\nconst editCommit = () => {\n\tconst name = elName.value?.innerText;\n\tif (!name) return editCancel();\n\n\tif (elName.value) elName.value.innerText = name;\n\n\tinEdit.value = false;\n\n\temit('update:name', name);\n};\n\n/**\n * Отменить редактирование\n */\nconst editCancel = async () => {\n\tif (elName.value) elName.value.innerText = props.name;\n\n\tinEdit.value = false;\n};\n\n/**\n * Применить выбор\n */\nconst changeSelect = (e: MouseEvent) => {\n\t// в режиме редактирования выбор не применяется\n\tif (inEdit.value) return;\n\n\t// тег запрещено выбирать\n\tif (props.disabled) return;\n\n\tlet toState: Props['state'] = 'selected';\n\n\tif (props.canExclude) {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\ttoState = 'excluded';\n\t\t}\n\t}\n\n\tif (props.state == toState) {\n\t\ttoState = '';\n\t}\n\n\tif (toState === '') emit('unselect');\n\tif (toState === 'selected') emit('select');\n\tif (toState === 'excluded') emit('exclude');\n};\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagListItem': true,\n\t\t\t'top-tagSelector_tagListItem-inEdit': inEdit,\n\t\t\t'top-tagSelector_tagListItem-disabled': disabled,\n\t\t\t'top-tagSelector_tagListItem-canExclude': canExclude,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded'\n\t\t}\"\n\t\t@click.stop=\"changeSelect\"\n\t>\n\t\t<TopTagIcon\n\t\t\t:id\n\t\t\t:name\n\t\t\t:colorId\n\t\t\t:state\n\t\t/>\n\n\t\t<span\n\t\t\tref=\"elName\"\n\t\t\tclass=\"top-tagSelector_tagListItemName\"\n\t\t\t:contenteditable=\"inEdit ? 'plaintext-only' : false\"\n\t\t\t:=\"firefoxProps\"\n\t\t\t@keydown.enter.stop=\"editCommit\"\n\t\t\t@keydown.esc.stop=\"editCancel\"\n\t\t>\n\t\t\t{{ name }}\n\t\t</span>\n\n\t\t<template v-if=\"editable\">\n\t\t\t<span\n\t\t\t\tv-if=\"!inEdit\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click=\"turnToEdit\"\n\t\t\t></span>\n\n\t\t\t<span\n\t\t\t\tv-else\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click.stop=\"editCommit\"\n\t\t\t></span>\n\t\t</template>\n\t</TopPopupListItem>\n</template>\n\n<style>\n.top-tagSelector_tagListItem.top-popup_listItem {\n\tpadding-top: var(--top-padding-2) !important;\n\tpadding-bottom: var(--top-padding-2) !important;\n\tgap: 10px;\n}\n\n.top-tagSelector_tagListItemName {\n\tborder-radius: var(--top-radius-1);\n\twidth: 120px;\n\tpadding: 4px 2px;\n\tmargin: -4px -2px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tflex-grow: 1;\n}\n\n/* редактирование */\n.top-tagSelector_edit {\n\t--top-icon-size: 18px;\n\t--top-icon-color: var(--color-text-3);\n\n\twidth: 20px;\n\tflex-grow: 0;\n}\n\n.top-tagSelector_edit:before {\n\tline-height: 0;\n}\n\n.top-tagSelector_edit { opacity: 0; }\n.top-tagSelector_edit:hover {\n\t--top-icon-color: var(--color-text-primary);\n}\n\n.top-tagSelector_tagListItem:hover .top-tagSelector_edit,\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_edit {\n\tcursor: pointer;\n\topacity: 1;\n}\n\n.top-tagSelector_tagListItem-inEdit {\n\tbackground: var(--color-layout-front-3) !important;\n\toutline: 1px dashed var(--color-line-2);\n\toutline-offset: -1px;\n}\n\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_tagListItemName {\n\tcursor: text;\n\tbackground: var(--color-layout-front-1);\n}\n\n/* disabled */\n.top-tagSelector_tagListItem-disabled {\n\tcursor: not-allowed !important;\n\topacity: 0.85;\n}\n.top-tagSelector_tagListItem-disabled:hover {\n\tbackground: inherit;\n}\n.top-tagSelector_tagListItem-disabled [data-tag_id] {\n\topacity: 0.6;\n}\n</style>\n","top-forms-focusable top-size_s top-button-withoutText top-tagSelector-useTopButton\n\n<script setup lang=\"ts\">\nimport type { Props, TagSelectorTarget } from './types';\nimport TopPopupOpener from '@/components/popup/popup/opener/opener.vue';\nimport TopButton from '@/components/forms/button/button.vue';\nimport { genTagIdClear, getTagById } from '../utils/utils';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = defineProps<Props>();\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst component = props.useTopButton ? TopButton : 'div';\nconst componentSlotName = props.useTopButton ? 'html' : 'default';\n\nconst topTagSelectorTarget: TagSelectorTarget = {\n\tmodel,\n\tmode: props.mode,\n\ttargetId: props.targetId,\n\tfilters: props.filters,\n\tpayload: props.payload,\n};\n</script>\n\n<template>\n\t<TopPopupOpener :id>\n\t\t<component\n\t\t\t:is=\"component\"\n\t\t\t:class=\"{\n\t\t\t\t'top-tagSelector': true,\n\t\t\t\t'top-tagSelector-useTopButton': props.useTopButton,\n\t\t\t\t'top-tagSelector-custom': !props.useTopButton,\n\t\t\t\t'top-as-selector': props.useTopButton,\n\t\t\t\t'top-tagSelector-filter': props.mode === 'filter',\n\t\t\t\t'top-tagSelector-setter_single': props.mode === 'setter' && !filters,\n\t\t\t\t'top-tagSelector-setter_several': props.mode === 'setter' && filters,\n\t\t\t\t'top-tagSelector-selectedOne': !model.length || model.length === 1,\n\t\t\t\t'top-tagSelector-toTwoLine': model.length > 5,\n\t\t\t}\"\n\t\t\tcolor=\"theme\"\n\t\t\t:styling\n\t\t\tv-top-data:topTagSelectorTarget=\"topTagSelectorTarget\"\n\t\t\t:=$attrs\n\t\t>\n\t\t\t<template #[componentSlotName]>\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-if=\"!model.length && mode === 'filter'\"\n\t\t\t\t\tid=\"all\"\n\t\t\t\t\tcolorId=\"\"\n\t\t\t\t\t:name=\"$i18n.Common.All_tags ?? ''\"\n\t\t\t\t\tstate=\"\"\n\t\t\t\t/>\n\n\t\t\t\t<!-- Массовое редактирование -->\n\t\t\t\t<div v-if=\"mode === 'setter' && filters\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Список тегов -->\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-else\n\t\t\t\t\tv-for=\"tagId in model\"\n\t\t\t\t\t:id=\"genTagIdClear(tagId)\"\n\t\t\t\t\t:colorId=\"getTagById(tagId, tags)?.color_id ?? ''\"\n\t\t\t\t\t:name=\"getTagById(tagId, tags)?.name ?? ''\"\n\t\t\t\t\t:state=\"genTagIdClear(tagId) === tagId ? 'selected' : 'excluded'\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</component>\n\t</TopPopupOpener>\n</template>\n\n<style>\n.top-tagSelector {\n\tcursor: pointer;\n\tmin-width: 0;\n\twhite-space: nowrap;\n\tjustify-content: left;\n}\n\n.top-tagSelector-useTopButton {\n\twidth: 118px;\n\tgap: var(--top-gap-1);\n\tvertical-align: middle;\n}\n\n.top-tagSelector.top-button.top-as-selector {\n\twidth: calc(118px + 8px);\n}\n\n/* все теги в фильтре */\n.top-tagSelector-useTopButton [data-tag_id=\"all\"]:before {\n\tmargin-right: 6px;\n}\n\n/* фильтр по одному тегу */\n.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id]:after {\n\tcontent: attr(title);\n\tmargin-left: 20px;\n\tmin-width: 74px;\n\ttext-align: left;\n\tline-height: 1.2;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n\n.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id=\"all\"]:after {\n\tmargin-left: 0;\n}\n\n/* фильтр по многим тегам */\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine {\n\tflex-wrap: wrap;\n\talign-content: center;\n}\n\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id] {\n\t--top-tag-selector-size: 8px;\n}\n\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id]:nth-child(5) {\n\tmargin-right: 4px;\n}\n\n/* установка тегов */\n.top-tagSelector-useTopButton.top-tagSelector-setter_several,\n.top-tagSelector-useTopButton.top-tagSelector-setter_several.top-as-selector{\n\twidth: auto;\n}\n\n.top-tagSelector-custom {\n\tposition: relative;\n\tdisplay: flex !important; flex-direction: column; flex-wrap: wrap; align-items: stretch !important;\n}\n\n.top-tagSelector-custom [data-tag_id] {\n\twidth: auto; min-height: 20%; min-width: 50%;\n\tflex: 1 1 auto;\n}\n</style>\n","<script setup lang=\"ts\">\n/* global $ */\n\nimport { computed, reactive, ref, shallowRef, watch } from 'vue';\n\nimport Core from '@/core/core/core';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { storage } from '@/core/utils/dom';\nimport { debounce } from '@/core/utils/lodash';\n\nimport type { Option } from '@/components/forms/select/types';\nimport TopSelect from '@/components/forms/select/select.vue';\n\nimport TopButton from '@/components/forms/button/button.vue';\n\nimport type { PopupEvent } from '@/components/popup/popup/types';\nimport TopPopup from '../../popup/popup/popup.vue';\nimport TopPopupListItem from '../../popup/popup/listItem.vue';\n\nimport type { Emits, FiltersAction, Props, Tag } from './types';\nimport tagsDefaults from './tagsDefaults';\nimport { genTagIdExcluded } from './utils/utils';\n\nimport type { Props as TagListItemProps } from './popupListItem/types';\nimport TopTagListItem from './popupListItem/tagPopupListItem.vue';\n\nimport type { TagSelectorTarget } from './popupOpener/types';\nimport TopTagSelectorPopupOpener from './popupOpener/popupOpener.vue';\n\nconst i18n = useI18n();\n\nconst props = withDefaults(defineProps<Props>(), {\n\ttagsMax: 10,\n\trequiredForSetter: true,\n\temitDelay: 500,\n\tuseTopButton: true,\n});\n\n/**\n * Выбранные теги кнопки в этом компоненте\n *\n * Редактирвоание ведется только через `editTarget.model`\n */\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n/**\n * Список тегов\n */\nconst tags = defineModel<Tag[]>('tags', {\n\tdefault: reactive(tagsDefaults),\n});\n\nconst emit = defineEmits<Emits>();\n\nconst emitDebounce: typeof emit = debounce((name, e) => {\n\temit(name, e);\n}, props.emitDelay);\n\n// требуется сразу указать один тег\nif (props.singleMode && !model.value.length) {\n\tmodel.value = [tags.value[0].id];\n}\n\nconst id = props.id ?? 'top-popup-id-' + Math.random() + '';\n\nconst filtersAction = ref<FiltersAction>('add');\n\n/**\n * Сгенерировать опции для выбора дейсвтия массого редактирования\n */\nconst genFiltersActionOptions = () => {\n\tconst tagsText = ' ' + i18n.Common.Tags?.toLowerCase();\n\n\tconst res = new Map<FiltersAction, Option>();\n\tres.set('add', { value: 'add', title: i18n.Common.Add + tagsText });\n\tres.set('replace', { value: 'replace', title: i18n.Common.Replace + tagsText });\n\tres.set('delete', { value: 'delete', title: i18n.Common.Delete + tagsText });\n\n\treturn res;\n};\n\n/**\n * Целевой объект редактирования тегов\n *\n * Определяется кнопкой, которая открыла popup выбора тегов\n */\nconst target = shallowRef<TagSelectorTarget>({\n\tmodel,\n\tmode: 'filter',\n\ttargetId: undefined,\n\tfilters: undefined,\n\tpayload: undefined,\n});\n\nwatch(model, () => {\n\temitDebounce('selector', model.value);\n});\n\n/**\n * Можно ли выбрать еще теги\n */\nconst disabled = computed(() => {\n\tif (target.value.mode !== 'setter') return;\n\n\tif (!props.maxTagsForSetter) return;\n\n\t// массовая смена тегов, количество тегов в результате узнать невозможно\n\tif (target.value.filters) return;\n\n\treturn target.value.model.value.length >= props.maxTagsForSetter;\n});\n\nconst genTargetTagState = (tagId: Tag['id'] | 'all'): TagListItemProps['state'] => {\n\tif (tagId !== 'all') {\n\t\tif (target.value.model.value.includes(tagId)) return 'selected';\n\n\t\tif (target.value.model.value.includes(genTagIdExcluded(tagId))) return 'excluded';\n\t}\n\n\t// Все теги, ни один из тегов не выбран\n\tif (tagId === 'all' && !target.value.model.value.length) return 'selected';\n\n\treturn '';\n};\n\nconst updateTargetModel = (tagId: Tag['id'], action: 'unselect' | 'select' | 'exclude') => {\n\tconst tagIdExcluded = genTagIdExcluded(tagId);\n\n\tlet tagsIds = target.value.model.value.filter(modelTagId => modelTagId !== tagId && modelTagId !== tagIdExcluded);\n\n\tif (action === 'select') tagsIds.push(tagId);\n\tif (action === 'exclude') tagsIds.push(tagIdExcluded);\n\n\t// режим редактирвоания тегов одного объекта с требованием указать хотя бы один тег\n\tif (target.value.mode === 'setter' && target.value.targetId !== undefined && props.requiredForSetter) {\n\t\t// нельзя снимать выделение со всех тегов\n\t\tif (!tagsIds.length) {\n\t\t\ttagsIds.push('1');\n\t\t}\n\n\t\t// при первом выборе сразу снять тег \"Без тега\"\n\t\tif (tagsIds.length === 2 && target.value.model.value.length === 1 && target.value.model.value[0] === '1') {\n\t\t\ttagsIds = tagsIds.filter((tagId) => tagId !== '1');\n\t\t}\n\t}\n\n\t// режим выбора одного тега\n\tif (props.singleMode && !target.value.filters) {\n\t\t// нужно указать хотя бы один тег\n\t\tif (!tagsIds.length) {\n\t\t\ttagsIds = target.value.model.value;\n\t\t}\n\n\t\tif (tagsIds.length > 1) {\n\t\t\ttagsIds = [tagsIds[tagsIds.length - 1]];\n\t\t}\n\t}\n\n\t// всегда выводить теги в порядке, указанном в настройках tags\n\ttagsIds.sort((a, b) => {\n\t\tif (!props.tags) return 0;\n\n\t\tconst aIndex = props.tags.findIndex((tag) => tag.id === a);\n\t\tconst bIndex = props.tags.findIndex((tag) => tag.id === b);\n\n\t\treturn aIndex - bIndex;\n\t});\n\n\ttarget.value.model.value = tagsIds;\n\n\tif (target.value.mode === 'setter' && target.value.targetId !== undefined) {\n\t\temitDebounce('setter', {\n\t\t\ttagsIds: tagsIds as Tag['id'][],\n\t\t\ttargetId: target.value.targetId,\n\t\t\tpayload: target.value.payload,\n\t\t});\n\t}\n};\n\nconst classString = computed(() => {\n\tlet res = 'top-tagSelector_popup';\n\n\tif (target.value.mode === 'filter') res += ' top-tagSelector_popup-filter';\n\tif (target.value.mode === 'setter') res += ' top-tagSelector_popup-setter';\n\n\treturn res;\n});\n\n/**\n * Добавить тег\n */\nconst addTag = () => {\n\tconst tagName = prompt('', 'New tag');\n\tif (!tagName || tagName === 'New tag') return;\n\n\tconst tagId = tags.value.length + 1;\n\n\ttags.value.push({\n\t\tid: String(tagId) as Tag['id'],\n\t\tname: tagName,\n\t\tcolor_id: String((tagId - 1) % 10 + 1) as Tag['color_id'],\n\t});\n\n\temit('tagsChanged', tags.value);\n};\n\nconst onOpen = (popupEvent: PopupEvent) => {\n\t// popup открыт другой кнопкой c другим modelValue, для редактирвоания объектов\n\ttarget.value = storage(popupEvent.elPopupOpener, 'topTagSelectorTarget');\n\tif (!target.value) throw new Error('Open popup TopTagSelector required v-data:topTagSelectorTarget');\n\n\t// при начале массовой установки тегов сбросить состояние формы\n\tif (target.value.filters) {\n\t\tfiltersAction.value = 'add';\n\t\ttarget.value.model.value = [];\n\t}\n\n\tif (!Core.$?.ui['sortable']) {\n\t\tconsole.info('Для работы сортировки требуется глобальная загрузка jQuery UI Sortable');\n\n\t\treturn;\n\t}\n\n\tif (!Core.state.isMobile && !Core.state.isMobileUA && tags.value) {\n\t\t$(popupEvent.elPopup).sortable({\n\t\t\titems: 'li:has([data-tag_id]:not([data-tag_id=\"all\"]))',\n\n\t\t\t/**\n\t\t\t * @todo Удалить `[contenteditable=\"true\"]` через пол года после выхода версии firefox с поддержкой contenteditable plaintext-only, включая бета версии\n\t\t\t */\n\t\t\tcancel: '[contenteditable=\"plaintext-only\"], [contenteditable=\"true\"]',\n\n\t\t\tdistance: 10,\n\t\t\tstop: function (_e, ui) {\n\t\t\t\tif (!tags.value) return;\n\n\t\t\t\tconst $tags = $(ui.item).parent().find('[data-tag_id]');\n\n\t\t\t\tconst tagsSorted: Tag['id'][] = [];\n\t\t\t\t$tags.each((_index, elTag) => {\n\t\t\t\t\tif (!tags.value) return;\n\n\t\t\t\t\tconst tagId = $(elTag).attr('data-tag_id') as Tag['id'];\n\t\t\t\t\ttagsSorted.push(tagId);\n\t\t\t\t});\n\n\t\t\t\ttags.value.sort((tagIdA, tagIdB) => {\n\t\t\t\t\tconst a = tagsSorted.findIndex(tagSorted => tagSorted === tagIdA.id);\n\t\t\t\t\tconst b = tagsSorted.findIndex(tagSorted => tagSorted === tagIdB.id);\n\n\t\t\t\t\treturn a - b;\n\t\t\t\t});\n\n\t\t\t\temitDebounce('tagsChanged', tags.value);\n\t\t\t},\n\t\t});\n\t}\n};\n\nconst onClose = (popupEvent: PopupEvent) => {\n\tif (!Core.$?.ui['sortable']) return;\n\n\tif ($(popupEvent.elPopup).data('ui-sortable')) {\n\t\t$(popupEvent.elPopup).sortable('destroy');\n\t}\n};\n</script>\n\n<template>\n\t<TopTagSelectorPopupOpener\n\t\tv-model=\"model\"\n\t\t:id\n\t\t:tags\n\t\t:styling\n\t\tmode=\"filter\"\n\t\t:useTopButton\n\t/>\n\n\t<TopPopup\n\t\t:id\n\t\t:class=\"classString\"\n\t\t@open=\"onOpen($event)\"\n\t\t@close=\"onClose($event)\"\n\t\t:transition-duration=\"50\"\n\t>\n\t\t<!-- Массовое редактирование-->\n\t\t<template #header v-if=\"target.mode === 'setter' && target.filters\">\n\t\t\t<TopSelect\n\t\t\t\tv-model=\"filtersAction\"\n\t\t\t\t:options=\"genFiltersActionOptions()\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #footer v-if=\"target.mode === 'setter' && target.filters\">\n\t\t\t<TopButton color=\"theme\">\n\t\t\t\t{{ $i18n.Common.Cancel }}\n\t\t\t</TopButton>\n\n\t\t\t<TopButton\n\t\t\t\t@click=\"emitDebounce('setter', {\n\t\t\t\t\ttagsIds: target.model.value as Tag['id'][],\n\t\t\t\t\tfilters: target.filters,\n\t\t\t\t\tfiltersAction,\n\t\t\t\t\tpayload: target.payload,\n\t\t\t\t})\"\n\t\t\t>\n\t\t\t\t{{ filtersAction === 'add' ? $i18n.Common['Add'] : '' }}\n\t\t\t\t{{ filtersAction === 'replace' ? $i18n.Common['Replace'] : '' }}\n\t\t\t\t{{ filtersAction === 'delete' ? $i18n.Common['Delete'] : '' }}\n\t\t\t</TopButton>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopTagListItem\n\t\t\t\tv-if=\"target.mode === 'filter' && !singleMode\"\n\t\t\t\tid=\"all\"\n\t\t\t\tcolorId=\"\"\n\t\t\t\t:name=\"$i18n.Common.All_tags ?? ''\"\n\t\t\t\t:state=\"target.model.value.length ? '' : 'selected'\"\n\t\t\t\t@select=\"target.model.value = []\"\n\t\t\t/>\n\n\t\t\t<TopTagListItem\n\t\t\t\tv-for=\"tag in tags\"\n\t\t\t\t:key=\"tag.id\"\n\t\t\t\t:id=\"tag.id\"\n\t\t\t\t:colorId=\"tag.color_id\"\n\t\t\t\t:name=\"tag.name\"\n\t\t\t\t:state=\"genTargetTagState(tag.id)\"\n\t\t\t\t:canExclude=\"target.mode === 'filter' && !singleMode\"\n\t\t\t\t:editable=\"tagsEditable\"\n\t\t\t\t:disabled=\"disabled && genTargetTagState(tag.id) === ''\"\n\t\t\t\t@unselect=\"updateTargetModel(tag.id, 'unselect')\"\n\t\t\t\t@select=\"updateTargetModel(tag.id, 'select')\"\n\t\t\t\t@exclude=\"updateTargetModel(tag.id, 'exclude')\"\n\t\t\t\t@update:name=\"tag.name = $event as string, emitDebounce('tagsChanged', tags);\"\n\t\t\t/>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"tagsEditable && tags.length < tagsMax && tags.length < 20\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t@click.stop=\"addTag\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.Add }}\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-tagSelector_popup .top-popup {\n\tuser-select: none;\n\tmin-width: 220px !important;\n\ttext-align: left;\n}\n\n.top-tagSelector_popup .top-popup_header .top-select{\n\tflex-grow: 1;\n}\n</style>\n"]}
1
+ {"version":3,"sources":["project/project.js","../../src/components/project/competitorSelector/competitorSelector.vue","../../src/components/project/competitorSelector/composables.ts","../../src/components/project/regionSelector/utils/consts.ts","../../src/components/project/regionSelector/utils/utils.ts","../../src/components/project/regionSelector/composables/selectSearcher.ts","../../src/components/project/regionSelector/composables/selectRegion.ts","../../src/components/project/regionSelector/composables/compare.ts","../../src/components/project/regionSelector/composables/selectorRegion.ts","../../src/components/project/regionSelector/regionSelector.vue","../../src/components/project/groupSelector/folders/utils.ts","../../src/core/utils/composables/useWatch.ts","../../src/components/project/groupSelector/folders/folders.vue","../../src/components/project/groupSelector/groups/utils.ts","../../src/components/project/groupSelector/groups/groups.vue","../../src/components/project/groupSelector/groupSelector.vue","../../src/components/project/projectSelector/utils.ts","../../src/components/project/projectSelector/submenu/submenu.vue","../../src/components/project/projectSelector/cache.ts","../../src/components/project/projectSelector/projectSelector.vue","../../src/components/project/tagSelector/utils/utils.ts","../../src/components/project/tagSelector/utils/el.ts","../../src/components/project/tagSelector/tagsDefaults.ts","../../src/components/project/tagSelector/tagIcon/tagIcon.vue","../../src/components/project/tagSelector/popupListItem/tagPopupListItem.vue","../../src/components/project/tagSelector/popupOpener/popupOpener.vue","../../src/components/project/tagSelector/tagSelector.vue"],"names":["k2","k","desc","m","o","v","\"default\"","ownKeys","ar","mod","result","i","vue","exports","ge","_e","ve","vue_1","n","a","forms_CY5MOh7a_esm_js_1","popup_3cwJ8Hev_esm_js_1","formsExt_DzXSTWaT_esm_js_1","ye","be","xe","Se","W","Ce","we","Te","Ee","De","Oe","Ae","ke","r","je","Me","utils_Be_ScFyj_esm_js_1","require","resolve_1","reject_1","Ne","e","t","searchers_js_1","Pe","Fe","Ie","Le","s","c","l","u","d","f","p","$i18n","G","Re","ze","Be","Ve","He","Ue","K","q","J","We","Ge","Ke","qe","Je","Ye","Xe","Ze","Qe","$e","et","tt","field_DEusYVqS_esm_js_1","h","g","b","x","nt","rt","it","at","ot","st","pt","ct","lt","ut","dt","ft","mt","keyboard_js_1","ht","gt","_t","vt","$core","yt","Y","X","bt","xt","St","Ct","wt","Tt","Et","Dt","Ot","_","y","check_js_1","string_js_1","kt","Z","Q","At","worker_Bv_yPPMv_esm_js_1","dom_js_1","Mt","jt","Nt","Pt","Ft","It","Lt","Rt","$attrs","zt","Bt","Vt","S","C","ee","M"],"mappings":"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","sourcesContent":["var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\ndefine([\"require\", \"exports\", \"../.chunks/forms-CY5MOh7a.esm.js\", \"../.chunks/field-DEusYVqS.esm.js\", \"../utils/dom.js\", \"../.chunks/worker-Bv_yPPMv.esm.js\", \"../.chunks/utils-Be-ScFyj.esm.js\", \"../utils/check.js\", \"../utils/string.js\", \"../utils/searchers.js\", \"../utils/keyboard.js\", \"../.chunks/popup-3cwJ8Hev.esm.js\", \"../.chunks/formsExt-DzXSTWaT.esm.js\", \"vue\", \"../.chunks/api-DupNAJPm.esm.js\", \"../.chunks/app-DinkodXi.esm.js\"], function (require, exports, forms_CY5MOh7a_esm_js_1, field_DEusYVqS_esm_js_1, dom_js_1, worker_Bv_yPPMv_esm_js_1, utils_Be_ScFyj_esm_js_1, check_js_1, string_js_1, searchers_js_1, keyboard_js_1, popup_3cwJ8Hev_esm_js_1, formsExt_DzXSTWaT_esm_js_1, vue_1) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.useItemsFromCompetitors = exports.topProjectSelectorClearCache = exports.renderElTopTagSelectorPopupOpener = exports.genSearcherByKey = exports.genElTopTagSelectorPopupOpener = exports.findRegion = exports.dialogRegionSelector = exports.TopTagSelectorTagIcon = exports.TopTagSelectorPopupOpener = exports.TopTagSelector = exports.TopRegionSelector = exports.TopProjectSelector = exports.TopGroupSelector = exports.TopCompetitorSelector = void 0;\n //#region src/components/project/competitorSelector/competitorSelector.vue?vue&type=script&setup=true&lang.ts\n var ge = { class: \"top-competitorSelector\" }, _e = { class: \"top-ellipsis1\" }, ve = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"competitorSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n items: {},\n showSelectAllItem: {\n type: Boolean,\n default: !0\n },\n selectAllItemIcon: { default: \"\" }\n }, {\n modelValue: {},\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let i = n, a = (0, vue_1.useModel)(n, \"modelValue\"), o = (0, vue_1.computed)(() => {\n if (i.showSelectAllItem)\n return {\n icon: i.selectAllItemIcon,\n title: (0, forms_CY5MOh7a_esm_js_1.E)().Common.Select_all,\n value: \"all\",\n content: \"\"\n };\n });\n return (e, i) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", ge, [(0, vue_1.unref)(forms_CY5MOh7a_esm_js_1.O).state.isMobile ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_3cwJ8Hev_esm_js_1.s, { key: 0 }, {\n opener: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CY5MOh7a_esm_js_1.h, {\n class: \"top-competitorSelector_opener\",\n color: \"theme\",\n icon: \"\",\n icon2: \"\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(n.items.find((e) => e.value === a.value?.[0])?.content), 1)]),\n _: 1\n })]),\n contentList: (0, vue_1.withCtx)(() => [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(n.items, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_3cwJ8Hev_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({ \"top-active\": a.value?.includes(e.value) }),\n \"data-top-icon\": e.icon,\n title: e.title,\n onClick: () => a.value = [e.value]\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", _e, (0, vue_1.toDisplayString)(e.content), 1)]),\n _: 2\n }, 1032, [\n \"class\",\n \"data-top-icon\",\n \"title\",\n \"onClick\"\n ]))), 256))]),\n _: 1\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_DzXSTWaT_esm_js_1.f, {\n key: 1,\n modelValue: a.value,\n \"onUpdate:modelValue\": i[0] ||= (e) => a.value = e,\n items: n.items,\n isMultiple: !0,\n styling: \"bar\",\n canBeEmptyMultiple: !1,\n selectAllItem: o.value\n }, null, 8, [\n \"modelValue\",\n \"items\",\n \"selectAllItem\"\n ]))]));\n }\n }), ye = (e, t) => (0, vue_1.computed)(() => (0, vue_1.toValue)(e).filter((e) => e.on >= 0 || e.id === t).map((e) => ({\n value: e.id,\n title: e.url + ` [${e.id}]`,\n icon: e.id === (0, vue_1.toValue)(t) ? \"\" : \"\",\n content: e.name\n }))), be = {\n 0: \"Yandex\",\n 1: \"Google\",\n 4: \"YouTube\",\n 5: \"Bing\",\n 7: \"Seznam\",\n 8: \"AppStore\",\n 9: \"GoogleStore\",\n 20: \"Yandex.com\",\n 21: \"Yandex.com.tr\",\n 22: \"YandexLive\"\n }, xe = {\n key: -2,\n name: \"--\",\n index: -2\n }, Se = {\n key: -2,\n name: \"--\",\n regions: [xe],\n regionByIndex: /* @__PURE__ */ new Map([[-2, xe]])\n }, W = {\n key: -2,\n name: \"Autoselect\",\n index: -2\n }, Ce = {\n key: -2,\n name: \"Autoselect\",\n regions: [W],\n regionByIndex: /* @__PURE__ */ new Map([[-2, W]])\n }, we = {\n countryCode: \"00\",\n depth: 1,\n device: 0,\n key: -1,\n index: -1,\n lang: \"ru\",\n name: \"Without region\"\n }, Te = () => (W.name = (0, forms_CY5MOh7a_esm_js_1.E)().Common.Autoselect, W), Ee = () => (Te(), Ce.name = (0, forms_CY5MOh7a_esm_js_1.E)().Common.Autoselect, console.log(Ce), Ce), De = () => (we.name = (0, forms_CY5MOh7a_esm_js_1.E)().Keywords.Without_region, we), Oe = (e = \"\", t = !1, n = []) => {\n let r;\n return r = e ? Ae(n, e) : ke(n), t && r.set(-2, Ee()), r.size || r.set(-2, Se), r;\n }, ke = (e, t = !0, n = [], r = \"\") => {\n let i = /* @__PURE__ */ new Map();\n return e.forEach((e) => {\n if (r !== \"project_relevant_url\" && !e.enabled || r && typeof e.key == \"number\" && e.key > 1)\n return;\n let a = { ...e };\n a.regionByIndex = /* @__PURE__ */ new Map(), e.regions && e.regions.forEach((e) => {\n if (t && !e.enabled)\n return;\n let n = { ...e };\n a.regionByIndex.set(n.index, n);\n }), !a.regionByIndex.size && n.length, (!e.regions || a.regionByIndex.size || n.length) && i.set(a.key, a);\n }), n.forEach((e) => {\n if (i.has(e))\n return;\n let t = {\n key: e,\n name: be[e],\n regions: [],\n regionByIndex: /* @__PURE__ */ new Map()\n };\n i.set(t.key, t);\n }), i;\n }, Ae = (e, n) => {\n let r = ke(e, !1, forms_CY5MOh7a_esm_js_1.O.state.forceSearchersKeysForKeywordsStats, n);\n if (r.has(2)) {\n let e = r.get(2);\n e && (e.regionByIndex = /* @__PURE__ */ new Map());\n }\n return (n === \"volume\" || n === \"cost_forecast\") && forms_CY5MOh7a_esm_js_1.O.state.showGlobalRegionForKeywordsStats && r.forEach((e) => {\n if (!e.regionByIndex)\n return;\n let t = { ...De() };\n e.regionByIndex.set(t.index, t);\n }), r;\n }, je = (e, t, n = []) => {\n let r = Oe(e, !1, n), i;\n return r.forEach((n) => {\n if (!(t.searcher_key !== void 0 && t.searcher_key != n.key) && n.regions && (n.regions.forEach((r) => {\n if (!i && !(t.key !== void 0 && t.key != r.key) && !(t.index !== void 0 && t.index != r.index) && !(!e && (t.lang !== void 0 && t.lang != r.lang || t.device !== void 0 && t.device != r.device)))\n return r.searcher_key = n.key, i = r, !1;\n }), i))\n return !1;\n }), i;\n }, Me = (0, utils_Be_ScFyj_esm_js_1.t)(() => new Promise((resolve_1, reject_1) => { require([\"../.chunks/dialog_regionSelectorRegions-0M1fMu1a.esm.js\"], resolve_1, reject_1); }).then(__importStar)), Ne = (t, n) => {\n let r = (0, forms_CY5MOh7a_esm_js_1.E)();\n return {\n searcherKey: (0, vue_1.ref)(n.value.keys().next().value ?? -2),\n optionBySearcherKey: (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n if (n.value.forEach((n) => {\n let r = {\n value: n.key,\n title: n.name\n };\n t.addSearcherIcon && (r.icon = (0, searchers_js_1.getSearcherGIcon)(n.key)), e.set(n.key, r);\n }), t.addCompare && !e.has(-2)) {\n let t = {\n value: \"\",\n title: \"--------------------\",\n disabled: !0\n };\n e.set(t.value, t);\n let n = {\n value: -1,\n title: r.Common.Compare\n };\n e.set(n.value, n);\n }\n return e;\n })\n };\n }, Pe = (t, n) => {\n let r = (0, forms_CY5MOh7a_esm_js_1.E)(), i = (0, vue_1.computed)(() => t.forMode === \"volume\" || t.forMode === \"cost_forecast\"), a = (0, vue_1.ref)(-2);\n t.modelValue.length === 1 && (a.value = t.modelValue[0]), a.value === -2 && (i.value ? a.value = n.value?.regionByIndex.values().next().value?.key ?? -2 : a.value = n.value?.regionByIndex.keys().next().value ?? -2);\n let o = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Map();\n return n.value.regionByIndex?.forEach((t) => {\n let a = t.name;\n if (i.value) {\n let n = {\n value: t.key,\n title: a\n };\n e.has(t.key) || e.set(t.key, n);\n return;\n }\n t.device && (a += \" (\" + r.Common[\"Device_\" + t.device] + \")\");\n let o = (0, searchers_js_1.getLangLabel)(n.value.key || 0, t.lang ?? \"\");\n o && (a += \" / \" + o);\n let s = {\n value: t.index,\n title: a,\n icon: t.device ? (0, searchers_js_1.getDeviceGIcon)(t.device) : void 0\n };\n e.set(t.index, s);\n }), e;\n });\n return (0, vue_1.watch)(o, (e, n) => {\n if (t.onlySearcher || a.value !== void 0 && e.get(a.value))\n return;\n let i = e.keys().next().value;\n if (a.value === -2 || i === -2) {\n a.value = i;\n return;\n }\n let o = n?.get(a.value)?.title || \"\", s = -1;\n for (let [t, n] of e.entries()) {\n let e = n.title;\n if (typeof e != \"string\" || typeof t == \"string\")\n break;\n if (e === o) {\n i = t;\n break;\n }\n let a = RegExp(` \\\\((${r.Common.Device_1}|${r.Common.Device_2})\\\\)`), c = o, l = 3;\n e.indexOf(c) === -1 && (c = o.replace(/^[^a-zа-я]/i, \"\").replace(a, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), l--), e.indexOf(c) === -1 && (c = o.replace(/ \\/.*/, \"\"), c = c.replace(/^[^a-zа-я]/i, \"\").replace(a, \"\"), l--), e.indexOf(c) !== -1 && (l <= s || (s = l, i = t));\n }\n a.value = i;\n }), {\n regionIndex: a,\n optionByRegionIndex: o\n };\n }, Fe = (e, t, n) => {\n let r = (0, vue_1.ref)([]), i = () => {\n if (e.onlySearcher && t.value) {\n r.value = Array.from(t.value.keys());\n return;\n }\n let i = [];\n if (e.modelValue.length > 1)\n i = [...e.modelValue];\n else\n try {\n i = JSON.parse(localStorage.getItem(\"ui:project:regionSelector\" + e.projectId + \":regionsIndexes\")) ?? [];\n }\n catch { }\n i.length && (i = i.filter((e) => n.value.has(e))), i.length || (i = Array.from(n.value)), r.value = [...i];\n }, a = () => {\n r.value.length ? localStorage.setItem(\"ui:project:regionSelector:\" + e.projectId + \":regionsIndexes\", JSON.stringify(r.value)) : localStorage.removeItem(\"ui:project:regionSelector:\" + e.projectId + \":regionsIndexes\");\n };\n return (0, vue_1.watch)(r, () => {\n a();\n }), e.addCompare && i(), { regionsIndexes: r };\n }, Ie = (e) => {\n let t = (0, vue_1.computed)(() => e.forMode === \"volume\" || e.forMode === \"cost_forecast\"), n = (0, vue_1.computed)(() => Oe(e.forMode, e.autoRegion, e.searchers)), r = (0, vue_1.computed)(() => n.value.get(a.searcherKey.value) || Se), i = (0, vue_1.computed)(() => {\n let e = /* @__PURE__ */ new Set();\n return n.value.forEach((t) => {\n t.regionByIndex.forEach((t) => {\n t.index !== -1 && t.index !== -2 && e.add(t.index);\n });\n }), e;\n }), a = Ne(e, n), o = Pe(e, r), s = Fe(e, n, i);\n (0, vue_1.watch)(n, () => {\n if (e.onlySearcher ? s.regionsIndexes.value = Array.from(n.value.keys()) : s.regionsIndexes.value = s.regionsIndexes.value.filter((e) => i.value.has(e)), a.searcherKey.value === -1)\n return;\n let t = n.value.keys().next().value;\n n.value.forEach((r) => {\n if (e.onlySearcher && r.key === a.searcherKey.value) {\n t = a.searcherKey.value;\n return;\n }\n if (o.regionIndex.value && r.regionByIndex?.has(o.regionIndex.value) && (t = r.key), !e.onlySearcher) {\n let e;\n t !== void 0 && (e = n.value.get(t)?.regionByIndex);\n let i = n.value.get(r.key)?.regionByIndex;\n e?.has(-2) && !i?.has(-2) && (t = r.key);\n }\n }), t !== void 0 && (a.searcherKey.value = t), o.regionIndex.value !== void 0 && !(r.value?.regionByIndex)?.has(o.regionIndex.value) && (o.regionIndex.value = r.value?.regions?.keys().next().value);\n }, { immediate: !0 });\n let c = () => {\n if (!(a.searcherKey.value === -1 || a.searcherKey.value === -2))\n return a.searcherKey.value;\n }, l = () => {\n if (e.onlySearcher || o.regionIndex.value === -2)\n return;\n let n = o.regionIndex.value;\n if (t.value && e.forMode) {\n let t = o.regionIndex.value;\n n = je(e.forMode, {\n searcher_key: c(),\n key: t\n }, e.searchers)?.index;\n }\n return n;\n }, u = () => {\n let e = c();\n if (e !== void 0)\n return n.value.get(e);\n };\n return {\n selectSearcher: a,\n selectRegion: o,\n compare: s,\n searcherByKey: n,\n allRegionsIndexes: i,\n getSearcher: u,\n getRegion: () => {\n let e = l();\n if (e !== void 0)\n return u()?.regionByIndex?.get(e);\n }\n };\n }, Le = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"regionSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n projectId: {},\n searchers: { default: () => [] },\n modelValue: {},\n modelValueSingle: {},\n addCompare: { type: Boolean },\n forMode: {},\n autoRegion: { type: Boolean },\n onlySearcher: { type: Boolean },\n addChanger: {\n type: Boolean,\n default: !0\n },\n addSearcherIcon: {\n type: Boolean,\n default: !0\n },\n addRegionIcon: {\n type: Boolean,\n default: !0\n }\n }, {\n modelValue: { required: !0 },\n modelModifiers: {},\n modelValueSingle: {},\n modelValueSingleModifiers: {}\n }),\n emits: [\"update:modelValue\", \"update:modelValueSingle\"],\n setup(e, { expose: t }) {\n let n = e, a = (0, vue_1.computed)(() => n.forMode === \"volume\" || n.forMode === \"cost_forecast\"), o = (0, vue_1.useModel)(e, \"modelValue\"), s = (0, vue_1.useModel)(e, \"modelValueSingle\"), { selectSearcher: c, selectRegion: l, compare: u, searcherByKey: d, allRegionsIndexes: f, getSearcher: p, getRegion: m } = Ie(n), h = () => {\n let e = [];\n d.value.forEach((t) => {\n n.forMode !== \"project_relevant_url\" && !t.enabled || t.regions.forEach((t) => {\n n.forMode !== \"project_relevant_url\" && !t.enabled || t.index !== -1 && e.push(t);\n });\n }), Me.open(\"regions\", {\n regions: e,\n regionsIndexes: u.regionsIndexes.value,\n \"@update:regionsIndexes\": (e) => u.regionsIndexes.value = e\n });\n };\n return (0, vue_1.watch)([\n l.regionIndex,\n c.searcherKey,\n u.regionsIndexes\n ], () => {\n if (c.searcherKey.value === -1 && u.regionsIndexes.value.length) {\n if (JSON.stringify(o.value) === JSON.stringify(u.regionsIndexes.value))\n return;\n o.value = [...u.regionsIndexes.value];\n }\n else\n n.onlySearcher ? (o.value = [c.searcherKey.value], c.searcherKey.value === -2 && !n.autoRegion && (o.value.length = 0)) : (o.value = [l.regionIndex.value], l.regionIndex.value === -2 && !n.autoRegion && (o.value.length = 0));\n !n.onlySearcher && !f.value.size && (c.searcherKey.value = -2);\n }), s.value && (0, vue_1.watch)(s, () => {\n s.value && (o.value = [s.value]);\n }, { immediate: !0 }), (0, vue_1.watch)(o, () => {\n if (o.value[0] && (s.value = o.value[0]), n.onlySearcher) {\n if (!o.value.length || o.value.length === 1 && !d.value.has(o.value[0]) || o.value.length === 1 && o.value[0] === -2 && !n.autoRegion) {\n let e = d.value.keys().next().value;\n e === -2 && !n.autoRegion && (e = void 0, s.value = -2), e === void 0 ? o.value.length = 0 : o.value = [e];\n return;\n }\n if (o.value.length > 1 && JSON.stringify(o.value) !== JSON.stringify(u.regionsIndexes.value)) {\n o.value = [...u.regionsIndexes.value];\n return;\n }\n }\n else {\n let e = [...new Set(o.value)], t = d.value.values().next().value?.regionByIndex?.keys().next().value;\n if (a.value && (t = d.value.values().next().value?.regionByIndex?.values().next().value?.key), t === -2 && !n.autoRegion && (t = void 0, s.value = -2), !e.length)\n t !== void 0 && e.push(t);\n else if (e.length === 1) {\n let n = f.value;\n a.value && (n = /* @__PURE__ */ new Set(), d.value.forEach((e) => {\n e.regionByIndex.forEach((e) => {\n e.index !== -1 && e.index !== -2 && n.add(e.key);\n });\n })), n.has(e[0]) || (e = [], t !== void 0 && e.push(t));\n }\n else\n e = e.filter((e) => f.value.has(e)), !e.length && t !== void 0 && e.push(t);\n if (JSON.stringify(o.value) !== JSON.stringify(e)) {\n o.value = e;\n return;\n }\n }\n if (!(o.value.length === 1 && o.value[0] === (n.onlySearcher ? c.searcherKey.value : l.regionIndex.value)))\n if (n.onlySearcher) {\n if (o.value.length === 1) {\n c.searcherKey.value = o.value[0];\n return;\n }\n c.searcherKey.value = -1;\n return;\n }\n else {\n if (!o.value.length)\n return;\n if (o.value.length === 1 && c.searcherKey.value !== -1) {\n l.regionIndex.value = o.value[0];\n let e;\n for (let t of d.value.values()) {\n for (let n of t.regionByIndex.values())\n if ((a.value ? n.key : n.index) === l.regionIndex.value) {\n e = t.key;\n break;\n }\n if (e !== void 0)\n break;\n }\n e !== void 0 && (c.searcherKey.value = e);\n }\n else\n c.searcherKey.value = -1, u.regionsIndexes.value = [...o.value];\n }\n }, { immediate: !0 }), t({\n getSearcher: p,\n getRegion: m\n }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", { class: (0, vue_1.normalizeClass)({\n \"top-regionSelector\": !0,\n \"top-regionSelector-onlySearcher\": e.onlySearcher\n }) }, [\n (0, vue_1.createVNode)(forms_CY5MOh7a_esm_js_1.n, {\n options: (0, vue_1.unref)(c).optionBySearcherKey.value,\n modelValue: (0, vue_1.unref)(c).searcherKey.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => (0, vue_1.unref)(c).searcherKey.value = e,\n name: \"searcher_key\",\n addChanger: e.addChanger\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"addChanger\"\n ]),\n !e.onlySearcher && (0, vue_1.unref)(c).searcherKey.value !== (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CY5MOh7a_esm_js_1.n, {\n key: 0,\n class: \"top-select-region\",\n options: (0, vue_1.unref)(l).optionByRegionIndex.value,\n modelValue: (0, vue_1.unref)(l).regionIndex.value,\n \"onUpdate:modelValue\": n[1] ||= (e) => (0, vue_1.unref)(l).regionIndex.value = e,\n name: a.value ? \"region_key\" : \"region_index\",\n addChanger: e.addChanger,\n \"data-top-icon\": e.addRegionIcon ? \"\" : void 0\n }, null, 8, [\n \"options\",\n \"modelValue\",\n \"name\",\n \"addChanger\",\n \"data-top-icon\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.addCompare && !e.onlySearcher && (0, vue_1.unref)(c).searcherKey.value === (0, vue_1.unref)(-1) ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(forms_CY5MOh7a_esm_js_1.h, {\n key: 1,\n name: \"compare\",\n onClick: h,\n \"data-count-compare-regions-indexes\": (0, vue_1.unref)(u).regionsIndexes.value.length\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(t.$i18n.Common.Selected_regions), 1)]),\n _: 1\n }, 8, [\"data-count-compare-regions-indexes\"])) : (0, vue_1.createCommentVNode)(\"\", !0)\n ], 2));\n }\n }), G = {\n id: 0,\n name: \"/\",\n path: \"/\"\n };\n exports.TopCompetitorSelector = ve;\n exports.useItemsFromCompetitors = ye;\n exports.genSearcherByKey = Oe;\n exports.findRegion = je;\n exports.dialogRegionSelector = Me;\n exports.TopRegionSelector = Le;\n function Re(t) {\n return t ? (0, forms_CY5MOh7a_esm_js_1.E)()?.Common.All_folders : \"/ (\" + (0, forms_CY5MOh7a_esm_js_1.E)()?.Keywords.Root_folder + \")\";\n }\n var ze = (e, t, n = /* @__PURE__ */ new Map(), r = { id: \"root\" }, i = 0) => (r.childsIds = [], r.id && (r.countAllGroupsActive = r.count_groups_active), e[r.id] && e[r.id].forEach((a) => {\n a = { ...a }, r.childsIds.push(a.id), a.id === 0 && (a.name = Re(t));\n let o = i > 1 ? \"-\".repeat(i - 1) + \" \" : \"\";\n o && !a.name.startsWith(o) && (a.name = o + a.name), n.set(a.id, a), ze(e, t, n, a, i + 1), r.childsIds = r.childsIds.concat(a.childsIds), r.id && a.count_groups_active && (r.countAllGroupsActive += a.count_groups_active);\n }), n), Be = (e, t) => e.gen(`/get/${t}/folders/`, [\n \"id\",\n \"parent_id\",\n \"name\",\n \"path\"\n ]).changeParams({\n orders: [\"ord_path\"],\n limit: 100\n });\n //#endregion\n //#region src/core/utils/composables/useWatch.ts\n function Ve(e, t, n) {\n let r = Object.keys(e);\n return (0, vue_1.watch)(r.map((t) => e[t]), (e, n, i) => {\n let a = {};\n e.forEach((e, t) => {\n if (!Object.is(e, n[t])) {\n let i = r[t];\n a[i] = {\n old: n[t],\n new: e\n };\n }\n }), Object.keys(a).length && t(a, i);\n }, n);\n }\n //#endregion\n //#region src/components/project/groupSelector/folders/folders.vue?vue&type=script&setup=true&lang.ts\n var He = [\"innerHTML\"], Ue = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"folders\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n folderId: {},\n folder: {},\n folders: {},\n projectId: {},\n canSelectAll: { type: Boolean },\n addChanger: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: {}\n }, {\n folderId: { required: !0 },\n folderIdModifiers: {},\n folder: { default: G },\n folderModifiers: {}\n }),\n emits: [\"update:folderId\", \"update:folder\"],\n setup(e) {\n let t = e, n = (0, vue_1.useModel)(e, \"folderId\"), r = (0, vue_1.useModel)(e, \"folder\"), i = t.client && !t.folders ? Be(t.client, t.service) : void 0, a = (0, vue_1.ref)(null);\n (0, vue_1.watch)(() => t.projectId, () => {\n i?.changeParams({ project_id: t.projectId }), i?.setOptions({ checkFingerprint: \"TopGroupSelectorFolders:\" + t.projectId }), a.value?.resetCache();\n }, { immediate: !0 });\n let o = (0, vue_1.computed)(() => ze(t.folders ?? { root: [G] }, t.canSelectAll)), s = (e) => (t.canSelectAll && e[0]?.id === 0 && (e[0] = {\n ...e[0],\n name: Re(!0)\n }), e);\n return Ve({\n modelFolder: r,\n modelFolderId: n\n }, async (e) => {\n if (n.value === r.value.id)\n return;\n if (e.modelFolder && !e.modelFolderId) {\n n.value = r.value.id;\n return;\n }\n let i = o.value.get(t.folderId);\n i ||= G, r.value = i, n.value = i.id;\n }, { immediate: !0 }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_DzXSTWaT_esm_js_1.s, {\n class: \"top-groupSelector_folder\",\n modelValue: r.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => r.value = e,\n items: e.folders ? [...o.value.values()] : void 0,\n \"search-type\": \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.folders ? void 0 : (0, vue_1.unref)(i),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_DzXSTWaT_esm_js_1.u)(...e, \"name\"),\n prepareItemsBeforeRender: s,\n addChanger: e.addChanger,\n useCache: \"\"\n }, {\n item: (0, vue_1.withCtx)(({ item: e }) => [(0, vue_1.createElementVNode)(\"div\", { innerHTML: e.name.replaceAll(/</g, \"< \") }, null, 8, He)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"addChanger\"\n ]));\n }\n }), K = {\n id: -1,\n name: \"--\",\n folder_id: G.id,\n folder_path: G.path\n }, q = {\n id: 0,\n name: \"All groups\",\n folder_id: G.id,\n folder_path: G.path\n }, J = () => (q.name = (0, forms_CY5MOh7a_esm_js_1.E)()?.Common.All_groups, q), We = () => (q.name = (0, forms_CY5MOh7a_esm_js_1.E)()?.Keywords.Choose_group, q), Ge = (e, t, n) => (e = [...e], t !== void 0 && (e = e.filter((e) => e.on == Number(t))), n && n.id && n.childsIds && (e = e.filter((e) => e.folder_id === n.id || n.childsIds.includes(e.folder_id))), e), Ke = (e, t) => e.gen(`/get/${t}/groups/`, [\n \"id\",\n \"name\",\n \"folder_id\",\n \"folder_path\"\n ]).changeParams({\n folder_id_depth: !0,\n limit: 100\n }), qe = (e, t) => e.gen(`/add/${t}/groups/`), Je = (e, t) => e.gen(`/del/${t}/groups/`), Ye = (e, t) => e.gen(`/edit/${t}/groups/rename/`), Xe = { class: \"top-groupSelector_groupItem top-ellipsis1\" }, Ze = {\n key: 0,\n class: \"top-comment\"\n }, Qe = [\"innerHTML\"], $e = [\"innerHTML\"], et = [\"innerHTML\"], tt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"groups\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n groupId: {},\n group: {},\n projectId: {},\n folder: {},\n groups: {},\n on: {\n type: Boolean,\n default: void 0\n },\n canAdd: { type: [String, Boolean] },\n canEditAndDel: { type: Boolean },\n canSelectAll: { type: [Boolean, String] },\n autoselect: { default: \"first\" },\n addChanger: {\n type: Boolean,\n default: !0\n },\n showPath: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: { default: \"keywords_2\" }\n }, {\n groupId: { required: !0 },\n groupIdModifiers: {},\n group: { required: !0 },\n groupModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"addGroup\",\n \"editGroup\",\n \"delGroup\"\n ], [\"update:groupId\", \"update:group\"]),\n setup(e, { expose: t, emit: n }) {\n let r = e, i = n, a = (0, vue_1.useModel)(e, \"groupId\"), s = (0, vue_1.useModel)(e, \"group\"), c = r.client && !r.groups ? Ke(r.client, r.service) : void 0, l = r.client ? qe(r.client, r.service) : void 0, u = r.client ? Je(r.client, r.service) : void 0, d = r.client ? Ye(r.client, r.service) : void 0, f = (0, vue_1.ref)(null), p = (0, vue_1.computed)(() => {\n if (r.groups !== void 0)\n return Ge(r.groups, r.on, r.folder);\n }), m = (0, field_DEusYVqS_esm_js_1.t)(\"folder_id\", \"EQUALS\", [r.folder?.id ?? 0]);\n c?.changeParams({\n project_id: r.projectId,\n folder_id_depth: !0,\n filters: [m]\n }), r.on !== void 0 && c?.params.filters?.push((0, field_DEusYVqS_esm_js_1.t)(\"on\", \"EQUALS\", [Number(r.on)]));\n let h = (e) => {\n s.value = e, a.value = e.id;\n }, g = (e = !1) => {\n f.value?.resetCache(e);\n };\n Ve({\n projectId: () => r.projectId,\n folderId: () => r.folder?.id,\n canSelectAll: () => r.canSelectAll\n }, (e) => {\n if (e.projectId && (c?.changeParams({ project_id: r.projectId }), c?.setOptions({ checkFingerprint: \"TopGroupSelectorGroups:\" + r.projectId })), e.folderId && (m.values = [r.folder?.id ?? 0]), g(), (e.folderId?.old !== void 0 || e.canSelectAll?.old !== void 0) && a.value !== null) {\n let e;\n r.autoselect === \"first\" && (e = p.value?.[0], r.canSelectAll && (e = (0, vue_1.reactive)(J()))), (r.autoselect === \"placeholder\" || !e) && (e = We()), h(e);\n }\n }, { immediate: !0 }), Ve({\n modelGroup: s,\n modelGroupId: a\n }, async (e) => {\n if (a.value !== s.value.id) {\n if (e.modelGroup && !e.modelGroupId) {\n a.value = s.value.id;\n return;\n }\n if (!(r.canAdd && a.value === null)) {\n if (r.groups) {\n let e = p.value?.find((e) => e.id === a.value);\n if (!e && r.canSelectAll && (e = J()), e)\n h(e);\n else {\n let e = p.value?.[0];\n e && !a.value ? h(e) : h(K);\n }\n }\n if (r.client && !r.groups && (a.value || a.value === 0 && !r.canSelectAll)) {\n let e = Ke(r.client, r.service).changeParams({\n project_id: r.projectId,\n id: a.value,\n filters: [m]\n });\n e?.setOptions({ checkFingerprint: \"TopGroupSelectorFindGroup:\" + r.projectId });\n let t = await e.call();\n if (!t.errors?.length && !t.result)\n return;\n !t.errors && t.result[0] ? h(t.result[0]) : h(K);\n }\n }\n }\n }, { immediate: !0 });\n let v = async (e) => {\n if (r.canAdd !== \"api\" || !l)\n return;\n let t = s.value, n = await l.changeParams({\n project_id: r.projectId,\n names: [e.name],\n to_id: r.folder?.id ?? G.id,\n to_type: \"in_folder_last\"\n }).call();\n if (n.result) {\n let e = n.result[0];\n h(e), i(\"addGroup\", e);\n }\n else\n h(t);\n f.value?.resetCache(!0);\n }, b = async (e, t) => {\n d && ((await d.changeParams({\n project_id: r.projectId,\n id: e.id,\n name: t\n }).call()).errors || (s.value.id === e.id && (s.value.name = t), i(\"editGroup\", {\n id: e.id,\n name: t\n }), f.value?.updateCacheItemById(e.id, { name: t })));\n }, x = async (e) => {\n u && ((await u.changeParams({\n project_id: r.projectId,\n id: e.id\n }).call()).errors || (s.value.id === e.id && h(r.canSelectAll ? J() : K), i(\"delGroup\", e.id), f.value?.deleteCacheItemById(e.id)));\n };\n return t({ resetCacheGroups: g }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_DzXSTWaT_esm_js_1.s, {\n ref_key: \"refSelector\",\n ref: f,\n class: \"top-groupSelector_group\",\n modelValue: s.value,\n \"onUpdate:modelValue\": n[0] ||= (e) => s.value = e,\n items: p.value ?? e.groups,\n searchType: \"inline\",\n icon: e.addIcon ? \"\" : void 0,\n api: e.groups ? void 0 : (0, vue_1.unref)(c),\n apiSetSearchParams: (...e) => (0, vue_1.unref)(formsExt_DzXSTWaT_esm_js_1.u)(...e, \"name\"),\n appendSearchToResult: !!e.canAdd,\n useAllItem: e.canSelectAll ? (0, vue_1.unref)(J)().name : !1,\n addChanger: e.addChanger,\n useCache: \"\",\n onAppendItem: v\n }, (0, vue_1.createSlots)({\n item: (0, vue_1.withCtx)(({ item: n }) => [(0, vue_1.createElementVNode)(\"div\", Xe, [\n n.id === (0, vue_1.unref)(null) ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Ze, (0, vue_1.toDisplayString)(t.$i18n.Common.Add) + \": \", 1)) : (0, vue_1.createCommentVNode)(\"\", !0),\n (0, vue_1.createElementVNode)(\"span\", {\n class: \"top-groupSelector_groupItemName top-ellipsis1\",\n innerHTML: n.name\n }, null, 8, Qe),\n n.folder_path && e.showPath ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 1,\n class: \"top-groupSelector_groupItemFolderPath top-ellipsis1\",\n innerHTML: n.folder_path\n }, null, 8, $e)) : (0, vue_1.createCommentVNode)(\"\", !0)\n ])]),\n _: 2\n }, [e.canEditAndDel && e.client ? {\n name: \"actions\",\n fn: (0, vue_1.withCtx)(({ item: r }) => [r.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [(0, vue_1.createVNode)(popup_3cwJ8Hev_esm_js_1.n, {\n submitText: t.$i18n.Common.Save,\n defaultValue: r.name,\n inputProps: { addCleaner: !1 },\n onSubmit: (e) => b(r, e)\n }, {\n opener: (0, vue_1.withCtx)(() => [...n[1] ||= [(0, vue_1.createElementVNode)(\"div\", { \"data-top-icon\": \"\" }, null, -1)]]),\n default: (0, vue_1.withCtx)(() => [...n[2] ||= []]),\n _: 1\n }, 8, [\n \"submitText\",\n \"defaultValue\",\n \"onSubmit\"\n ]), (0, vue_1.createVNode)(popup_3cwJ8Hev_esm_js_1.r, {\n isWarning: \"\",\n submitText: t.$i18n.Common.Delete,\n onSubmit: (e) => x(r)\n }, {\n opener: (0, vue_1.withCtx)(() => [...n[3] ||= [(0, vue_1.createElementVNode)(\"div\", { \"data-top-icon\": \"\" }, null, -1)]]),\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", { innerHTML: e.service === \"keywords_2\" ? t.$i18n.Keywords.Delete_group_warning : t.$i18n[\"Ai.Tracker\"].Delete_group_warning }, null, 8, et)]),\n _: 1\n }, 8, [\"submitText\", \"onSubmit\"])], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n key: \"0\"\n } : void 0]), 1032, [\n \"modelValue\",\n \"items\",\n \"icon\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResult\",\n \"useAllItem\",\n \"addChanger\"\n ]));\n }\n }), nt = { class: \"top-groupSelector\" }, rt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"groupSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n folderId: {},\n folder: {},\n groupId: {},\n group: {},\n projectId: {},\n folders: {},\n groups: {},\n on: {\n type: Boolean,\n default: void 0\n },\n canSelectAllGroups: {\n type: Boolean,\n default: !1\n },\n canAddGroup: { type: [String, Boolean] },\n canEditAndDelGroup: { type: Boolean },\n autoselect: { default: \"first\" },\n addChanger: {\n type: Boolean,\n default: !0\n },\n showFolders: {\n type: Boolean,\n default: !0\n },\n showGroups: {\n type: Boolean,\n default: !0\n },\n showGroupsPaths: { type: Boolean },\n addIcon: {\n type: Boolean,\n default: !0\n },\n client: {},\n service: { default: \"keywords_2\" }\n }, {\n folderId: { required: !0 },\n folderIdModifiers: {},\n folder: {},\n folderModifiers: {},\n groupId: { required: !0 },\n groupIdModifiers: {},\n group: { default: K },\n groupModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\"update:groups\"], [\n \"update:folderId\",\n \"update:folder\",\n \"update:groupId\",\n \"update:group\"\n ]),\n setup(e, { expose: t, emit: n }) {\n let r = e, i = (0, vue_1.ref)(null), a = (0, vue_1.useModel)(e, \"folderId\"), o = (0, vue_1.useModel)(e, \"folder\"), s = (0, vue_1.useModel)(e, \"groupId\"), c = (0, vue_1.useModel)(e, \"group\"), l = n;\n o.value = ze(r.folders ?? { root: [G] }, r.canSelectAllGroups).get(a.value);\n let u = r.groups?.find((e) => e.id === s.value);\n s.value || (u = r.groups?.[0]), r.canSelectAllGroups && !u && (u = J()), (r.autoselect === \"placeholder\" || !u) && (u = We()), u ??= K, c.value = u;\n let d = (e) => {\n let t;\n r.groups && e && (t = [...r.groups, e]), l(\"update:groups\", t);\n }, f = (e) => {\n if (!r.groups) {\n l(\"update:groups\");\n return;\n }\n let t = r.groups.find((t) => t.id === e.id);\n if (!t)\n return;\n let n = {\n ...t,\n ...e\n }, i = r.groups.map((e) => e.id === n.id ? n : e);\n l(\"update:groups\", i);\n }, p = (e) => {\n if (!r.groups) {\n l(\"update:groups\");\n return;\n }\n let t = r.groups.filter((t) => t.id !== e);\n l(\"update:groups\", t);\n };\n return t({ resetCacheGroups: (e = !1) => {\n i.value?.resetCacheGroups(e);\n } }), (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", nt, [e.showFolders ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Ue, {\n key: 0,\n folderId: a.value,\n \"onUpdate:folderId\": n[0] ||= (e) => a.value = e,\n folder: o.value,\n \"onUpdate:folder\": n[1] ||= (e) => o.value = e,\n projectId: e.projectId,\n folders: e.folders,\n canSelectAll: e.canSelectAllGroups,\n addChanger: e.addChanger,\n addIcon: e.addIcon,\n client: e.client,\n service: r.service\n }, null, 8, [\n \"folderId\",\n \"folder\",\n \"projectId\",\n \"folders\",\n \"canSelectAll\",\n \"addChanger\",\n \"addIcon\",\n \"client\",\n \"service\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0), e.showGroups ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(tt, {\n key: 1,\n ref_key: \"componentGroupsRef\",\n ref: i,\n groupId: s.value,\n \"onUpdate:groupId\": n[2] ||= (e) => s.value = e,\n group: c.value,\n \"onUpdate:group\": n[3] ||= (e) => c.value = e,\n projectId: e.projectId,\n folder: o.value,\n groups: e.groups,\n on: e.on,\n canAdd: e.canAddGroup,\n canEditAndDel: e.canEditAndDelGroup,\n canSelectAll: e.canSelectAllGroups,\n autoselect: e.autoselect,\n addChanger: e.addChanger,\n showPath: e.showGroupsPaths || e.showFolders,\n addIcon: e.addIcon,\n client: e.client,\n service: r.service,\n onAddGroup: d,\n onEditGroup: f,\n onDelGroup: p\n }, null, 8, [\n \"groupId\",\n \"group\",\n \"projectId\",\n \"folder\",\n \"groups\",\n \"on\",\n \"canAdd\",\n \"canEditAndDel\",\n \"canSelectAll\",\n \"autoselect\",\n \"addChanger\",\n \"showPath\",\n \"addIcon\",\n \"client\",\n \"service\"\n ])) : (0, vue_1.createCommentVNode)(\"\", !0)]));\n }\n }), it = (e) => ({\n id: null,\n name: e,\n listItemProps: {\n type: \"title\",\n class: \"top-projectSelector_item\"\n }\n }), at = {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n }, ot = (t, n) => {\n let r = [], i = {\n scheduledUpdate: it((0, forms_CY5MOh7a_esm_js_1.E)().Projects.Scheduled_update),\n manualUpdate: it((0, forms_CY5MOh7a_esm_js_1.E)().Projects.Manual_update),\n guestProjects: it((0, forms_CY5MOh7a_esm_js_1.E)().Projects.Guest_projects)\n }, a = n ? {\n scheduledUpdate: !1,\n manualUpdate: !1,\n guestProjects: !1\n } : at;\n for (let e of t)\n !a.scheduledUpdate && e.right?.startsWith(\"1\") && e.on > 0 && (r.push(i.scheduledUpdate), a.scheduledUpdate = !0), !a.manualUpdate && e.right?.startsWith(\"1\") && e.on === 0 && (r.push(i.manualUpdate), a.manualUpdate = !0), !a.guestProjects && e.right?.startsWith(\"0\") && e.on >= 0 && (r.push(i.guestProjects), a.guestProjects = !0), r.push(e);\n return r;\n }, st = (e) => ({\n ...e,\n externalLink: pt(e.url ?? \"\"),\n listItemProps: {\n class: \"top-projectSelector_item\",\n attrs: { title: e.name }\n }\n }), ct = (e, t, n) => !e || e.length === 0 ? [] : (t && Object.keys(at).forEach((e) => at[e] = !1), ot(e.map(st), n)), lt = (e) => {\n e = e.replace(/#.*/, \"\");\n let t = location.hash;\n return t = t.replace(/%22historyView%22:[^,]*,/, \"\"), t = t.replace(/%22modelsKeys%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22competitorsIds%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22searchersKeys%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22regionIndex%22:[^,]*,/, \"\"), t = t.replace(/%22regionsIndexes%22:\\[[^\\]]*],/, \"\"), t = t.replace(/%22folderId%22:[^,]*,/, \"\"), t = t.replace(/%22groupId%22:[^,]*,/, \"\"), t = t.replace(/%22tagsIds%22:\\[[^\\]]*],/, \"\"), /%22dataSort%22:\\{[^}]*0000-00-00[^}]*}/.test(t) || (t = t.replace(/,?%22dataSort%22:\\{[^}]*}(,?)/, \"$1\")), e + t;\n }, ut = (e) => {\n location.href = dt(e);\n }, dt = (e) => {\n let t = ft(), n = location.pathname.split(\"/\"), r = \"project/dynamics/\", i = \"\";\n n[1] == \"project\" && (r = n[1] + \"/\" + n[2] + \"/\"), n[2] == \"settings\" && (i = location.hash), [\n \"watcher\",\n \"indexing\",\n \"sitemap\",\n \"audit\",\n \"direct\",\n \"adwords\"\n ].includes(n[4]) && (i = n[4] + \"/\");\n let a = \"https://\" + t + \"/\" + r + e + \"/\" + i;\n return a = lt(a), a;\n }, ft = () => window.page?.subdomain ? window.location.host.replace(window.page?.subdomain + \".\", \"\") : window.location.host, pt = (e) => {\n let t = e.startsWith(\"http\") ? e : \"https://\" + e;\n return t = t.replace(/\"/g, \"%22\"), t;\n }, mt = (e, t) => {\n let n = e.params.filters ?? [];\n n = n.filter((e) => e.name !== \"GEN_SEARCH_STRING()\");\n let r = (0, keyboard_js_1.invertKeyboardLayout)(t), i = t.replace(/([[^$.|?*+()])/g, \"\\\\$1\"), a = r.replace(/([[^$.|?*+()])/g, \"\\\\$1\");\n t && n.push((0, field_DEusYVqS_esm_js_1.t)(\"GEN_SEARCH_STRING()\", \"REGEXP\", [`(${i}|${a})`])), e.changeParams({ filters: n });\n }, ht = (e) => {\n let n = e.gen(\"/get/projects_2/projects/\", [\n \"id\",\n \"user_id\",\n \"name\",\n \"url\",\n \"on\",\n \"right\"\n ]);\n return n.changeParams({\n filters: [(0, field_DEusYVqS_esm_js_1.t)(\"on\", \"GREATER_THAN_EQUALS\", [0])],\n orders: [\n (0, field_DEusYVqS_esm_js_1.n)(\"user_id\", \"DESC\", [forms_CY5MOh7a_esm_js_1.O.state.userId]),\n (0, field_DEusYVqS_esm_js_1.n)(\"on\", \"DESC\"),\n (0, field_DEusYVqS_esm_js_1.n)(\"favorite\", \"DESC\"),\n (0, field_DEusYVqS_esm_js_1.n)(\"id\", \"DESC\")\n ]\n }), n.options.loadingShowSpinner = !1, n.options.onApiLoaded = (e, t, n) => {\n let r = t.data.filters.length > 1, i = t.data.offset === 0, a = t.data.offset === void 0 || i && !r, o = r;\n e.result = ct(e.result, a, o), n?.(e, t);\n }, n;\n }, gt = (e) => e.gen(\"/add/projects_2/projects/\"), _t = { class: \"top-ellipsis1\" }, vt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"submenu\",\n props: { id: {} },\n setup(n) {\n let r = n, i = (0, forms_CY5MOh7a_esm_js_1.E)(), a = ft(), o = (e) => {\n let n = [\n {\n href: `https://${a}/project/keywords/${e.id}/`,\n title: i.Common.Menu_phrases,\n icon: \"\",\n right: \"2\"\n },\n {\n href: `https://${a}/project/dynamics/${e.id}/`,\n title: i.Common.Menu_dynamics,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/snapshots/${e.id}/`,\n title: i.Common.Menu_snapshots,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/competitors/${e.id}/`,\n title: i.Common.Menu_competitors,\n icon: \"\",\n right: \"1\"\n },\n {\n href: `https://${a}/project/ai-tracker/${e.id}/`,\n title: i.Common.Menu_aiTracker,\n icon: \"\",\n right: \"13\"\n },\n {\n href: `https://${a}/project/analytics/${e.id}/`,\n title: i.Common.Menu_analytics,\n icon: \"\",\n right: \"5\"\n },\n {\n href: `https://${a}/project/broker/${e.id}/`,\n title: i.Common.Menu_broker,\n icon: \"\",\n right: \"6\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/sitemap/`,\n title: i.Audit.Sitemap_gen,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/audit/`,\n title: i.Common.Menu_audit,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/indexing/`,\n title: i.Audit.Indexing,\n icon: \"\",\n right: \"8\"\n },\n {\n href: `https://${a}/project/audit/${e.id}/watcher/`,\n title: i.Audit.Watcher,\n icon: \"\",\n right: \"9\"\n },\n {\n href: `https://${a}/project/settings/${e.id}/`,\n title: i.Common.Menu_settings,\n icon: \"\",\n right: \"2\"\n }\n ].filter((e) => !Object.entries(forms_CY5MOh7a_esm_js_1.O.state.closedByMod).some(([t, n]) => n && e.href.includes(`/${t}/`)));\n return e.right.includes(\"0\") ? n.filter((t) => e.right[t.right] === \"1\") : n;\n };\n return (e, t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_3cwJ8Hev_esm_js_1.s), {\n id: r.id,\n class: \"top-projectSelectorSubmenu\",\n notch: !1,\n pos: \"2\"\n }, {\n contentList: (0, vue_1.withCtx)(({ data: t }) => [t ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(o(t.projectItem), (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.unref)(popup_3cwJ8Hev_esm_js_1.o), {\n href: t.href,\n title: t.title,\n \"data-top-icon\": t.icon,\n \"data-right\": t.right\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$core.state.isMobile ? t.title : \"\"), 1)]),\n _: 2\n }, 1032, [\n \"href\",\n \"title\",\n \"data-top-icon\",\n \"data-right\"\n ]))), 256)), (0, vue_1.createVNode)((0, vue_1.unref)(popup_3cwJ8Hev_esm_js_1.o), {\n href: t.projectItem.externalLink,\n title: t.projectItem.externalLink,\n class: \"top-ellipsis\",\n \"data-top-icon\": \"\",\n target: \"_blank\"\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createElementVNode)(\"span\", _t, (0, vue_1.toDisplayString)(e.$core.state.isMobile ? t.projectItem.externalLink : \"\"), 1)]),\n _: 2\n }, 1032, [\"href\", \"title\"])], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 1\n }, 8, [\"id\"]));\n }\n }), yt = 1440 * 60 * 1e3, Y = (0, vue_1.ref)(null), X = (0, vue_1.shallowRef)(), bt = (e) => {\n localStorage.setItem(\"ui_project_selector_total:\" + forms_CY5MOh7a_esm_js_1.O.state.userId, JSON.stringify({\n projectsTotal: e,\n expiresAt: Date.now() + yt\n }));\n }, xt = () => {\n let e = localStorage.getItem(\"ui_project_selector_total:\" + forms_CY5MOh7a_esm_js_1.O.state.userId);\n if (!e)\n return;\n let { projectsTotal: n, expiresAt: r } = JSON.parse(e);\n if (Date.now() > r) {\n localStorage.removeItem(\"ui_project_selector_total:\" + forms_CY5MOh7a_esm_js_1.O.state.userId);\n return;\n }\n return n;\n }, St = () => {\n Y.value = null, X.value = void 0, localStorage.removeItem(\"ui_project_selector_total:\" + forms_CY5MOh7a_esm_js_1.O.state.userId), (0, formsExt_DzXSTWaT_esm_js_1.d)(\"/get/projects_2/projects/\");\n }, Ct = { class: \"top-projectSelector_itemText\" }, wt = { class: \"top-comment\" }, Tt = {\n key: 0,\n class: \"top-comment\"\n }, Et = [\"href\"], Dt = 1e3, Ot = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"projectSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n client: {},\n menuMode: { type: Boolean },\n excludeProjectId: {},\n openerShortcut: {},\n modificator: {},\n placeholder: {},\n buttonProps: { default: () => ({\n color: \"theme\",\n styling: \"outline\"\n }) }\n }, {\n modelValue: { default: () => ({\n id: null,\n name: \"\"\n }) },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(n) {\n let r = (0, forms_CY5MOh7a_esm_js_1.E)(), i = n, a = (0, vue_1.useModel)(n, \"modelValue\"), o = ht(i.client);\n o.changeParams({ limit: Dt });\n let s = gt(i.client), c = (0, vue_1.ref)(xt()), l = (0, vue_1.ref)(null), f = (0, vue_1.useId)(), p = (0, vue_1.computed)(() => i.placeholder ?? r.Projects.Select_project), m = (0, vue_1.computed)(() => !X.value || !i.excludeProjectId ? X.value : X.value.filter((e) => e.id !== i.excludeProjectId)), h = (0, vue_1.computed)(() => {\n if (!(!c.value && c.value !== 0))\n return c.value < Dt ? \"static\" : \"api\";\n }), _ = async () => {\n Y.value ||= o.call();\n let e = await Y.value;\n return Y.value = null, e;\n }, v = async (e) => {\n let n = await s.changeParams({\n url: e.name,\n name: e.name\n }).call();\n if (!n.errors) {\n if (X.value && h.value === \"static\") {\n let r = st({\n id: n.result,\n user_id: forms_CY5MOh7a_esm_js_1.O.state.userId,\n name: e.name,\n url: e.name,\n on: 0,\n right: \"11111111111111111111\"\n }), i = X.value.findIndex((e) => e.on === 0);\n X.value = [\n ...X.value.slice(0, i),\n r,\n ...X.value.slice(i)\n ], c.value && (c.value += 1, bt(c.value));\n }\n h.value === \"api\" && l.value?.resetCache(!0);\n }\n }, y = async () => {\n if (X.value || h.value === \"api\")\n return;\n let e = await _();\n e.errors || (X.value = e.result);\n }, b = async () => {\n if (c.value) {\n let e = l.value?.popupOpenerRef?.$el;\n e && e.addEventListener(\"pointerenter\", () => y(), { once: !0 });\n }\n else {\n let e = await _();\n if (e.errors)\n return;\n c.value = e.total ?? void 0, !X.value && h.value !== \"api\" && (X.value = e.result), c.value && bt(c.value);\n }\n };\n return (0, vue_1.onMounted)(async () => {\n await b();\n }), (e, t) => {\n let r = (0, vue_1.resolveComponent)(\"TopButton\");\n return (0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [((0, vue_1.openBlock)(), (0, vue_1.createBlock)(formsExt_DzXSTWaT_esm_js_1.s, {\n key: h.value ?? \"dummy\",\n ref_key: \"refSelector\",\n ref: l,\n class: \"top-projectSelector\",\n modelValue: a.value,\n \"onUpdate:modelValue\": t[1] ||= (e) => n.menuMode ? (0, vue_1.unref)(ut)(e.id) : a.value = e,\n items: m.value,\n itemsIsLoading: h.value === \"static\" && (0, vue_1.unref)(X) === void 0,\n title: e.$i18n.Projects.Search_projects,\n modificator: n.modificator,\n searchFields: [\n \"id\",\n \"name\",\n \"url\"\n ],\n placeholder: p.value,\n hasCloserBtn: \"\",\n api: h.value === \"api\" ? (0, vue_1.unref)(o) : void 0,\n apiSetSearchParams: h.value === \"api\" ? (...e) => (0, vue_1.unref)(mt)(...e) : void 0,\n useCache: \"\",\n appendSearchToResult: \"\",\n appendSearchAllowDuplicate: \"\",\n appendSearchToResultCond: (0, vue_1.unref)(check_js_1.validUrl),\n appendWithoutSelect: \"\",\n buttonProps: {\n ...n.buttonProps,\n isProgress: !h.value,\n disabled: !h.value\n },\n openerShortcut: n.openerShortcut,\n onAppendItem: v,\n onOpen: y\n }, {\n item: (0, vue_1.withCtx)(({ item: i }) => [(0, vue_1.createElementVNode)(\"div\", Ct, [i.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)((0, vue_1.unref)(string_js_1.ellipsis)(i.name, 20)) + \" \", 1), (0, vue_1.createElementVNode)(\"span\", wt, \" id \" + (0, vue_1.toDisplayString)(i.id), 1)], 64)) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 1 }, [i.listItemProps?.type ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", Tt, (0, vue_1.toDisplayString)(e.$i18n.Projects.Add_project) + \": \", 1)), (0, vue_1.createTextVNode)(\" \" + (0, vue_1.toDisplayString)(i.name), 1)], 64))]), i.id ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [\n n.menuMode ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"a\", {\n key: 0,\n class: \"top-projectSelector_itemLink\",\n href: (0, vue_1.unref)(dt)(i.id)\n }, null, 8, Et)) : (0, vue_1.createCommentVNode)(\"\", !0),\n e.$core.state.isMobile ? (0, vue_1.createCommentVNode)(\"\", !0) : ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(r, {\n key: 1,\n href: i.externalLink,\n \"data-top-icon\": \"\",\n color: \"theme\",\n target: \"_blank\",\n onClick: t[0] ||= (0, vue_1.withModifiers)(() => { }, [\"stop\"])\n }, null, 8, [\"href\"])),\n (0, vue_1.createVNode)(popup_3cwJ8Hev_esm_js_1.c, {\n id: (0, vue_1.unref)(f),\n pos: \"2\",\n notch: !1,\n data: { projectItem: i }\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(r, {\n class: \"top-popup_listMore\",\n \"data-top-icon\": \"\",\n color: \"theme\"\n })]),\n _: 1\n }, 8, [\"id\", \"data\"])\n ], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)]),\n _: 1\n }, 8, [\n \"modelValue\",\n \"items\",\n \"itemsIsLoading\",\n \"title\",\n \"modificator\",\n \"placeholder\",\n \"api\",\n \"apiSetSearchParams\",\n \"appendSearchToResultCond\",\n \"buttonProps\",\n \"openerShortcut\"\n ])), (0, vue_1.createVNode)(vt, { id: (0, vue_1.unref)(f) }, null, 8, [\"id\"])], 64);\n };\n }\n }), kt = (e) => \"-\" + e, Z = (e) => e[0] === \"-\" ? e.substring(1) : e, Q = (e, t) => {\n e = Z(e);\n let n = t.find((t) => t.id === e);\n if (n)\n return n;\n }, At = (e, t, n) => {\n t ||= { id: e.id }, t.id = e.id, t.pos ??= \"3\", t.notch ??= !0, t.posBy ??= \"fixed\";\n let r = worker_Bv_yPPMv_esm_js_1.t.genElPopupOpener(\"div\", t);\n return r.classList.add(\"top-tagSelector\"), e.useTopButton && r.classList.add(\"top-tagSelector-useTopButton\", \"top-button\", \"top-color_theme\", \"top-as-selector\"), e.useTopButton || r.classList.add(\"top-tagSelector-custom\"), e.mode === \"filter\" && r.classList.add(\"top-tagSelector-filter\"), e.mode === \"setter\" && !e.filters && r.classList.add(\"top-tagSelector-setter_single\"), e.mode === \"setter\" && e.filters && r.classList.add(\"top-tagSelector-setter_several\"), r.onclick = (t) => {\n t.preventDefault(), t.stopPropagation(), r.onclick = null;\n let i = (0, vue_1.ref)(e.modelValue), a = {\n model: i,\n mode: e.mode,\n targetId: e.targetId,\n filters: e.filters,\n payload: e.payload\n };\n (0, dom_js_1.storage)(r, \"topTagSelectorTarget\", a), delete r.dataset.topPopupDisabled, (0, vue_1.isRef)(e.modelValue) || (0, vue_1.watch)(i, () => {\n e.modelValue = i.value, Mt(r, e, n);\n }), r.click();\n }, (0, vue_1.isRef)(e.modelValue) ? (0, vue_1.watch)(e.modelValue, () => Mt(r, e, n)) : (0, dom_js_1.storage)(r, \"topTagSelectorRender\", (t) => {\n e.modelValue = t;\n let i = (0, dom_js_1.storage)(r, \"topTagSelectorTarget\");\n i && (i.model.value = t), Mt(r, e, n);\n }), Mt(r, e, n), r;\n }, jt = (e, t) => {\n (0, dom_js_1.storage)(e, \"topTagSelectorRender\")?.(t);\n }, Mt = (t, n, r) => {\n let i = (0, vue_1.unref)(n.modelValue);\n if (t.classList.toggle(\"top-tagSelector-selectedOne\", !i.length || i.length === 1), t.classList.toggle(\"top-tagSelector-toTwoLine\", i.length > 5), n.mode === \"setter\" && n.filters) {\n t.innerHTML = `<div>${r}</div>`;\n return;\n }\n if (t.innerHTML = \"\", !i.length && n.mode === \"filter\") {\n let n = Nt({\n id: \"all\",\n colorId: \"\",\n name: (0, forms_CY5MOh7a_esm_js_1.E)().Common?.All_tags ?? \"\",\n state: \"\"\n });\n t.append(n);\n }\n i.forEach((e) => {\n let r = Nt({\n id: Z(e),\n colorId: Q(e, n.tags)?.color_id ?? \"\",\n name: Q(e, n.tags)?.name ?? \"\",\n state: Z(e) === e ? \"selected\" : \"excluded\"\n });\n t.append(r);\n });\n }, Nt = (e) => {\n let t = document.createElement(\"div\");\n return t.classList.add(\"top-tagSelector_tagIcon\"), t.classList.toggle(\"top-tagSelector-active\", !!e.state), t.classList.toggle(\"top-tagSelector-excluded\", e.state === \"excluded\"), t.dataset.tag_id = e.id, t.dataset.tag_color_id = e.colorId, t.title = e.name, t;\n }, Pt = [\n {\n id: \"1\",\n name: \"Without Tag\",\n color_id: \"1\"\n },\n {\n id: \"2\",\n name: \"Red\",\n color_id: \"2\"\n },\n {\n id: \"3\",\n name: \"Orange\",\n color_id: \"3\"\n },\n {\n id: \"4\",\n name: \"Yellow\",\n color_id: \"4\"\n },\n {\n id: \"5\",\n name: \"Blue\",\n color_id: \"5\"\n },\n {\n id: \"6\",\n name: \"Purple\",\n color_id: \"6\"\n },\n {\n id: \"7\",\n name: \"Green\",\n color_id: \"7\"\n },\n {\n id: \"8\",\n name: \"Magenta\",\n color_id: \"8\"\n },\n {\n id: \"9\",\n name: \"Dark blue\",\n color_id: \"9\"\n },\n {\n id: \"10\",\n name: \"Turquoise\",\n color_id: \"10\"\n }\n ], Ft = [\n \"data-tag_id\",\n \"data-tag_color_id\",\n \"title\"\n ], It = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagIcon\",\n props: {\n id: {},\n colorId: {},\n name: {},\n state: {}\n },\n setup(e) {\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagIcon\": !0,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n \"data-tag_id\": e.id,\n \"data-tag_color_id\": e.colorId,\n title: e.name\n }, null, 10, Ft));\n }\n }), Lt = [\"contenteditable\", \"onKeydown\"], Rt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagPopupListItem\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n editable: { type: Boolean },\n disabled: { type: Boolean },\n canExclude: { type: Boolean },\n id: {},\n colorId: {},\n name: {},\n state: {}\n }, {\n name: { required: !0 },\n nameModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"update:name\",\n \"unselect\",\n \"exclude\",\n \"select\"\n ], [\"update:name\"]),\n setup(e, { emit: t }) {\n let n = e, r = t, i = (0, vue_1.useModel)(e, \"name\"), a = (0, vue_1.ref)(null), o = (0, vue_1.computed)(() => navigator.userAgent.indexOf(\"Firefox\") == -1 ? {} : {\n contenteditable: s.value,\n onpaste: (e) => e.preventDefault()\n }), s = (0, vue_1.ref)(!1), c = async () => {\n s.value = !0, await (0, vue_1.nextTick)(), a.value?.focus();\n }, l = () => {\n let e = a.value?.innerText;\n if (!e)\n return u();\n a.value && (a.value.innerText = e), s.value = !1, r(\"update:name\", e);\n }, u = async () => {\n a.value && (a.value.innerText = n.name), s.value = !1;\n }, d = (e) => {\n if (s.value || n.disabled)\n return;\n let t = \"selected\";\n n.canExclude && (e.ctrlKey || e.metaKey) && (t = \"excluded\"), n.state == t && (t = \"\"), t === \"\" && r(\"unselect\"), t === \"selected\" && r(\"select\"), t === \"excluded\" && r(\"exclude\");\n };\n return (t, n) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_3cwJ8Hev_esm_js_1.o, {\n class: (0, vue_1.normalizeClass)({\n \"top-tagSelector_tagListItem\": !0,\n \"top-tagSelector_tagListItem-inEdit\": s.value,\n \"top-tagSelector_tagListItem-disabled\": e.disabled,\n \"top-tagSelector_tagListItem-canExclude\": e.canExclude,\n \"top-tagSelector-active\": !!e.state,\n \"top-tagSelector-excluded\": e.state === \"excluded\"\n }),\n onClick: (0, vue_1.withModifiers)(d, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [\n (0, vue_1.createVNode)(It, {\n id: e.id,\n name: i.value,\n colorId: e.colorId,\n state: e.state\n }, null, 8, [\n \"id\",\n \"name\",\n \"colorId\",\n \"state\"\n ]),\n (0, vue_1.createElementVNode)(\"span\", (0, vue_1.mergeProps)({\n ref_key: \"elName\",\n ref: a,\n class: \"top-tagSelector_tagListItemName\",\n contenteditable: s.value ? \"plaintext-only\" : !1\n }, o.value, { onKeydown: [(0, vue_1.withKeys)((0, vue_1.withModifiers)(l, [\"stop\"]), [\"enter\"]), (0, vue_1.withKeys)((0, vue_1.withModifiers)(u, [\"stop\"]), [\"esc\"])] }), (0, vue_1.toDisplayString)(i.value), 17, Lt),\n e.editable ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 0 }, [s.value ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 1,\n \"data-top-icon\": \"\",\n class: \"top-tagSelector_edit\",\n onClick: (0, vue_1.withModifiers)(l, [\"stop\"])\n })) : ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"span\", {\n key: 0,\n \"data-top-icon\": \"\",\n class: \"top-tagSelector_edit\",\n onClick: c\n }))], 64)) : (0, vue_1.createCommentVNode)(\"\", !0)\n ]),\n _: 1\n }, 8, [\"class\"]));\n }\n }), zt = { key: 1 }, Bt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n inheritAttrs: !1,\n __name: \"popupOpener\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n id: {},\n tags: {},\n mode: {},\n targetId: {},\n filters: {},\n useTopButton: { type: Boolean },\n payload: {},\n styling: {}\n }, {\n modelValue: { required: !0 },\n modelModifiers: {}\n }),\n emits: [\"update:modelValue\"],\n setup(e) {\n let t = e, n = (0, vue_1.useModel)(e, \"modelValue\"), i = t.useTopButton ? forms_CY5MOh7a_esm_js_1.h : \"div\", a = t.useTopButton ? \"html\" : \"default\", o = {\n model: n,\n mode: t.mode,\n targetId: t.targetId,\n filters: t.filters,\n payload: t.payload\n };\n return (r, s) => {\n let c = (0, vue_1.resolveDirective)(\"top-data\");\n return (0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_3cwJ8Hev_esm_js_1.c, { id: e.id }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.withDirectives)(((0, vue_1.openBlock)(), (0, vue_1.createBlock)((0, vue_1.resolveDynamicComponent)((0, vue_1.unref)(i)), (0, vue_1.mergeProps)({\n class: {\n \"top-tagSelector\": !0,\n \"top-tagSelector-useTopButton\": t.useTopButton,\n \"top-tagSelector-custom\": !t.useTopButton,\n \"top-as-selector\": t.useTopButton,\n \"top-tagSelector-filter\": t.mode === \"filter\",\n \"top-tagSelector-setter_single\": t.mode === \"setter\" && !e.filters,\n \"top-tagSelector-setter_several\": t.mode === \"setter\" && e.filters,\n \"top-tagSelector-selectedOne\": !n.value.length || n.value.length === 1,\n \"top-tagSelector-toTwoLine\": n.value.length > 5\n },\n color: \"theme\",\n styling: e.styling\n }, r.$attrs), {\n [(0, vue_1.unref)(a)]: (0, vue_1.withCtx)(() => [!n.value.length && e.mode === \"filter\" ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(It, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: r.$i18n.Common.All_tags ?? \"\",\n state: \"\"\n }, null, 8, [\"name\"])) : (0, vue_1.createCommentVNode)(\"\", !0), e.mode === \"setter\" && e.filters ? ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(\"div\", zt, [(0, vue_1.renderSlot)(r.$slots, \"default\")])) : ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, { key: 2 }, (0, vue_1.renderList)(n.value, (t) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(It, {\n id: (0, vue_1.unref)(Z)(t),\n colorId: (0, vue_1.unref)(Q)(t, e.tags)?.color_id ?? \"\",\n name: (0, vue_1.unref)(Q)(t, e.tags)?.name ?? \"\",\n state: (0, vue_1.unref)(Z)(t) === t ? \"selected\" : \"excluded\"\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\"\n ]))), 256))]),\n _: 2\n }, 1040, [\"class\", \"styling\"])), [[\n c,\n o,\n \"topTagSelectorTarget\"\n ]])]),\n _: 3\n }, 8, [\"id\"]);\n };\n }\n }), Vt = /* @__PURE__ */ (0, vue_1.defineComponent)({\n __name: \"tagSelector\",\n props: /*@__PURE__*/ (0, vue_1.mergeModels)({\n modelValue: {},\n tags: {},\n tagsEditable: { type: Boolean },\n tagsMax: { default: 10 },\n id: {},\n singleMode: { type: Boolean },\n requiredForSetter: {\n type: Boolean,\n default: !0\n },\n maxTagsForSetter: {},\n emitDelay: { default: 500 },\n useTopButton: {\n type: Boolean,\n default: !0\n },\n styling: {}\n }, {\n modelValue: { required: !0 },\n modelModifiers: {},\n tags: { default: (0, vue_1.reactive)(Pt) },\n tagsModifiers: {}\n }),\n emits: /*@__PURE__*/ (0, vue_1.mergeModels)([\n \"selector\",\n \"setter\",\n \"tagsChanged\"\n ], [\"update:modelValue\", \"update:tags\"]),\n setup(a, { emit: o }) {\n let c = (0, forms_CY5MOh7a_esm_js_1.E)(), l = a, u = (0, vue_1.useModel)(a, \"modelValue\"), d = (0, vue_1.useModel)(a, \"tags\"), f = o, p = (0, forms_CY5MOh7a_esm_js_1.P)((e, t) => {\n f(e, t);\n }, l.emitDelay);\n l.singleMode && !u.value.length && (u.value = [d.value[0].id]);\n let m = l.id ?? \"top-popup-id-\" + Math.random(), h = (0, vue_1.ref)(\"add\"), g = () => {\n let e = \" \" + c.Common.Tags?.toLowerCase(), t = /* @__PURE__ */ new Map();\n return t.set(\"add\", {\n value: \"add\",\n title: c.Common.Add + e\n }), t.set(\"replace\", {\n value: \"replace\",\n title: c.Common.Replace + e\n }), t.set(\"delete\", {\n value: \"delete\",\n title: c.Common.Delete + e\n }), t;\n }, _ = (0, vue_1.shallowRef)({\n model: u,\n mode: \"filter\",\n targetId: void 0,\n filters: void 0,\n payload: void 0\n });\n (0, vue_1.watch)(u, () => {\n p(\"selector\", u.value);\n });\n let y = (0, vue_1.computed)(() => {\n if (_.value.mode === \"setter\" && l.maxTagsForSetter && !_.value.filters)\n return _.value.model.value.length >= l.maxTagsForSetter;\n }), x = (e) => {\n if (e !== \"all\") {\n if (_.value.model.value.includes(e))\n return \"selected\";\n if (_.value.model.value.includes(kt(e)))\n return \"excluded\";\n }\n return e === \"all\" && !_.value.model.value.length ? \"selected\" : \"\";\n }, S = (e, t) => {\n let n = kt(e), r = _.value.model.value.filter((t) => t !== e && t !== n);\n t === \"select\" && r.push(e), t === \"exclude\" && r.push(n), _.value.mode === \"setter\" && _.value.targetId !== void 0 && l.requiredForSetter && (r.length || r.push(\"1\"), r.length === 2 && _.value.model.value.length === 1 && _.value.model.value[0] === \"1\" && (r = r.filter((e) => e !== \"1\"))), l.singleMode && !_.value.filters && (r.length || (r = _.value.model.value), r.length > 1 && (r = [r[r.length - 1]])), r.sort((e, t) => l.tags ? l.tags.findIndex((t) => t.id === e) - l.tags.findIndex((e) => e.id === t) : 0), _.value.model.value = r, _.value.mode === \"setter\" && _.value.targetId !== void 0 && p(\"setter\", {\n tagsIds: r,\n targetId: _.value.targetId,\n payload: _.value.payload\n });\n }, C = (0, vue_1.computed)(() => {\n let e = \"top-tagSelector_popup\";\n return _.value.mode === \"filter\" && (e += \" top-tagSelector_popup-filter\"), _.value.mode === \"setter\" && (e += \" top-tagSelector_popup-setter\"), e;\n }), ee = () => {\n let e = prompt(\"\", \"New tag\");\n if (!e || e === \"New tag\")\n return;\n let t = d.value.length + 1;\n d.value.push({\n id: String(t),\n name: e,\n color_id: String((t - 1) % 10 + 1)\n }), f(\"tagsChanged\", d.value);\n }, k = (e) => {\n if (_.value = (0, dom_js_1.storage)(e.elPopupOpener, \"topTagSelectorTarget\"), !_.value)\n throw Error(\"Open popup TopTagSelector required v-data:topTagSelectorTarget\");\n if (_.value.filters && (h.value = \"add\", _.value.model.value = []), !forms_CY5MOh7a_esm_js_1.O.$?.ui.sortable) {\n console.info(\"Для работы сортировки требуется глобальная загрузка jQuery UI Sortable\");\n return;\n }\n !forms_CY5MOh7a_esm_js_1.O.state.isMobile && !forms_CY5MOh7a_esm_js_1.O.state.isMobileUA && d.value && $(e.elPopup).sortable({\n items: \"li:has([data-tag_id]:not([data-tag_id=\\\"all\\\"]))\",\n cancel: \"[contenteditable=\\\"plaintext-only\\\"], [contenteditable=\\\"true\\\"]\",\n distance: 10,\n stop: function (e, t) {\n if (!d.value)\n return;\n let n = $(t.item).parent().find(\"[data-tag_id]\"), r = [];\n n.each((e, t) => {\n if (!d.value)\n return;\n let n = $(t).attr(\"data-tag_id\");\n r.push(n);\n }), d.value.sort((e, t) => r.findIndex((t) => t === e.id) - r.findIndex((e) => e === t.id)), p(\"tagsChanged\", d.value);\n }\n });\n }, M = (e) => {\n forms_CY5MOh7a_esm_js_1.O.$?.ui.sortable && $(e.elPopup).data(\"ui-sortable\") && $(e.elPopup).sortable(\"destroy\");\n };\n return (e, t) => ((0, vue_1.openBlock)(), (0, vue_1.createElementBlock)(vue_1.Fragment, null, [(0, vue_1.createVNode)(Bt, {\n modelValue: u.value,\n \"onUpdate:modelValue\": t[0] ||= (e) => u.value = e,\n id: (0, vue_1.unref)(m),\n tags: d.value,\n styling: a.styling,\n mode: \"filter\",\n useTopButton: a.useTopButton\n }, null, 8, [\n \"modelValue\",\n \"id\",\n \"tags\",\n \"styling\",\n \"useTopButton\"\n ]), (0, vue_1.createVNode)(popup_3cwJ8Hev_esm_js_1.s, {\n id: (0, vue_1.unref)(m),\n class: (0, vue_1.normalizeClass)(C.value),\n onOpen: t[4] ||= (e) => k(e),\n onClose: t[5] ||= (e) => M(e),\n \"transition-duration\": 50\n }, (0, vue_1.createSlots)({\n contentList: (0, vue_1.withCtx)(() => [\n _.value.mode === \"filter\" && !a.singleMode ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Rt, {\n key: 0,\n id: \"all\",\n colorId: \"\",\n name: e.$i18n.Common.All_tags ?? \"\",\n state: _.value.model.value.length ? \"\" : \"selected\",\n onSelect: t[3] ||= (e) => _.value.model.value = []\n }, null, 8, [\"name\", \"state\"])) : (0, vue_1.createCommentVNode)(\"\", !0),\n ((0, vue_1.openBlock)(!0), (0, vue_1.createElementBlock)(vue_1.Fragment, null, (0, vue_1.renderList)(d.value, (e) => ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(Rt, {\n key: e.id,\n id: e.id,\n colorId: e.color_id,\n name: e.name,\n state: x(e.id),\n canExclude: _.value.mode === \"filter\" && !a.singleMode,\n editable: a.tagsEditable,\n disabled: y.value && x(e.id) === \"\",\n onUnselect: (t) => S(e.id, \"unselect\"),\n onSelect: (t) => S(e.id, \"select\"),\n onExclude: (t) => S(e.id, \"exclude\"),\n \"onUpdate:name\": (t) => {\n e.name = t, (0, vue_1.unref)(p)(\"tagsChanged\", d.value);\n }\n }, null, 8, [\n \"id\",\n \"colorId\",\n \"name\",\n \"state\",\n \"canExclude\",\n \"editable\",\n \"disabled\",\n \"onUnselect\",\n \"onSelect\",\n \"onExclude\",\n \"onUpdate:name\"\n ]))), 128)),\n a.tagsEditable && d.value.length < a.tagsMax && d.value.length < 20 ? ((0, vue_1.openBlock)(), (0, vue_1.createBlock)(popup_3cwJ8Hev_esm_js_1.o, {\n key: 1,\n \"data-top-icon\": \"\",\n onClick: (0, vue_1.withModifiers)(ee, [\"stop\"])\n }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Add), 1)]),\n _: 1\n })) : (0, vue_1.createCommentVNode)(\"\", !0)\n ]),\n _: 2\n }, [_.value.mode === \"setter\" && _.value.filters ? {\n name: \"header\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CY5MOh7a_esm_js_1.n, {\n modelValue: h.value,\n \"onUpdate:modelValue\": t[1] ||= (e) => h.value = e,\n options: g()\n }, null, 8, [\"modelValue\", \"options\"])]),\n key: \"0\"\n } : void 0, _.value.mode === \"setter\" && _.value.filters ? {\n name: \"footer\",\n fn: (0, vue_1.withCtx)(() => [(0, vue_1.createVNode)(forms_CY5MOh7a_esm_js_1.h, { color: \"theme\" }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(e.$i18n.Common.Cancel), 1)]),\n _: 1\n }), (0, vue_1.createVNode)(forms_CY5MOh7a_esm_js_1.h, { onClick: t[2] ||= (e) => (0, vue_1.unref)(p)(\"setter\", {\n tagsIds: _.value.model.value,\n filters: _.value.filters,\n filtersAction: h.value,\n payload: _.value.payload\n }) }, {\n default: (0, vue_1.withCtx)(() => [(0, vue_1.createTextVNode)((0, vue_1.toDisplayString)(h.value === \"add\" ? e.$i18n.Common.Add : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"replace\" ? e.$i18n.Common.Replace : \"\") + \" \" + (0, vue_1.toDisplayString)(h.value === \"delete\" ? e.$i18n.Common.Delete : \"\"), 1)]),\n _: 1\n })]),\n key: \"1\"\n } : void 0]), 1032, [\"id\", \"class\"])], 64));\n }\n });\n exports.TopGroupSelector = rt;\n exports.topProjectSelectorClearCache = St;\n exports.TopProjectSelector = Ot;\n exports.genElTopTagSelectorPopupOpener = At;\n exports.renderElTopTagSelectorPopupOpener = jt;\n exports.TopTagSelectorTagIcon = It;\n exports.TopTagSelectorPopupOpener = Bt;\n exports.TopTagSelector = Vt;\n});\n//# sourceMappingURL=project.js.map\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Props } from './types';\nimport Core from '@/core/core/core';\nimport Button from '@/components/forms/button/button.vue';\nimport Popup from '@/components/popup/popup/popup.vue';\nimport ListItem from '@/components/popup/popup/listItem.vue';\nimport Menu from '@/components/formsExt/menu/menu.vue';\nimport { useI18n } from '@/core/plugins/i18n';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tshowSelectAllItem: true,\n\tselectAllItemIcon: '',\n});\nconst model = defineModel<Props['modelValue']>();\n\nconst selectAllItem = computed(() => {\n\tif (props.showSelectAllItem) {\n\t\treturn {\n\t\t\ticon: props.selectAllItemIcon,\n\t\t\ttitle: useI18n().Common.Select_all,\n\t\t\tvalue: 'all',\n\t\t\tcontent: '',\n\t\t};\n\t}\n\t\n\treturn undefined;\n});\n</script>\n\n<template>\n\t<div class=\"top-competitorSelector\">\n\t\t<Popup v-if=\"Core.state.isMobile\">\n\t\t\t<template #opener>\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-competitorSelector_opener\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t\ticon2=\"\"\n\t\t\t\t>\n\t\t\t\t\t{{ items.find((item) => item.value === model?.[0])?.content }}\n\t\t\t\t</Button>\n\t\t\t</template>\n\n\t\t\t<template #contentList>\n\t\t\t\t<ListItem\n\t\t\t\t\tv-for=\"(item) in items\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t'top-active': model?.includes(item.value)\n\t\t\t\t\t}\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t@click=\"() => model = [item.value]\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"top-ellipsis1\">\n\t\t\t\t\t\t{{ item.content }}\n\t\t\t\t\t</span>\n\t\t\t\t</ListItem>\n\t\t\t</template>\n\t\t</Popup>\n\n\t\t<Menu\n\t\t\tv-else\n\t\t\tv-model=\"model\"\n\t\t\t:items=\"items\"\n\t\t\t:isMultiple=\"true\"\n\t\t\tstyling=\"bar\"\n\t\t\t:canBeEmptyMultiple=\"false\"\n\t\t\t:selectAllItem=\"selectAllItem\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-competitorSelector_opener.top-button {\n\twidth: 100%;\n}\n</style>\n","import type { MaybeRefOrGetter } from 'vue';\nimport { computed, toValue } from 'vue';\nimport type { Competitor, Item } from '@/components/project/competitorSelector/types';\n\nexport const useItemsFromCompetitors = (competitors: MaybeRefOrGetter<Competitor[]>, projectId: MaybeRefOrGetter<number>) => {\n\treturn computed(() => {\n\t\tconst activeCompetitors = toValue(competitors).filter(competitor => competitor.on >= 0 || competitor.id === projectId);\n\n\t\tconst items: Item[] = activeCompetitors.map(competitor => {\n\t\t\treturn {\n\t\t\t\tvalue: competitor.id,\n\t\t\t\ttitle: competitor.url + ` [${competitor.id}]`,\n\t\t\t\ticon: competitor.id === toValue(projectId) ? '' : '',\n\t\t\t\tcontent: competitor.name,\n\t\t\t};\n\t\t});\n\n\t\treturn items;\n\t});\n};\n","import type { Region, SearcherIndexed } from '../types';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Ключ ПС - для выбора нескольких ПС или регионов\n */\nexport const searhcerCompareKey = -1;\n\n/**\n * Ключ ПС или индекса Региона, используется для ПС или Региона, не настроенных в проекте\n *\n * Также, используется для API с возможностью не указывать регион, см. `props.autoRegion`\n */\nexport const dummyIndex = -2;\n\n/**\n * Регион - без региона\n */\nexport const globalRegionIndex = -1;\n\nexport const searchersNames = {\n\t0: 'Yandex',\n\t1: 'Google',\n\t4: 'YouTube',\n\t5: 'Bing',\n\t7: 'Seznam',\n\t8: 'AppStore',\n\t9: 'GoogleStore',\n\t20: 'Yandex.com',\n\t21: 'Yandex.com.tr',\n\t22: 'YandexLive',\n};\n\nexport const regionUndefined: Region = {\n\tkey: dummyIndex,\n\tname: '--',\n\tindex: dummyIndex,\n};\n\nexport const searcherUndefined: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: '--',\n\tregions: [regionUndefined],\n\tregionByIndex: new Map([[dummyIndex, regionUndefined]]),\n};\n\nconst regionAuto: Region = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tindex: dummyIndex,\n};\n\nconst searcherAuto: SearcherIndexed = {\n\tkey: dummyIndex,\n\tname: 'Autoselect',\n\tregions: [regionAuto],\n\tregionByIndex: new Map([[dummyIndex, regionAuto]]),\n};\n\nconst regionGlobal: Region = {\n\tcountryCode: '00',\n\tdepth: 1,\n\tdevice: 0,\n\tkey: globalRegionIndex,\n\tindex: globalRegionIndex,\n\tlang: 'ru',\n\tname: 'Without region',\n};\n\nexport const getRegionAuto = () => {\n\tregionAuto.name = useI18n().Common.Autoselect!;\n\n\treturn regionAuto;\n};\n\nexport const getSearcherAuto = () => {\n\tgetRegionAuto();\n\n\tsearcherAuto.name = useI18n().Common.Autoselect!;\n\tconsole.log(searcherAuto);\n\n\treturn searcherAuto;\n};\n\nexport const getRegionGlobal = () => {\n\tregionGlobal.name = useI18n().Keywords.Without_region!;\n\n\treturn regionGlobal;\n};\n","import Core from '@/core/core/core';\nimport type { ForMode, Region, Searcher, SearcherByKey, SearcherIndexed } from '../types';\nimport { dummyIndex, getRegionGlobal, getSearcherAuto, searchersNames, searcherUndefined } from './consts';\nimport { useAsyncTopDialog } from '@/components/dialog/dialog/composables/utils';\n\n/**\n * Генерация Map ПС с Map регионов из массива searchers\n * - ключ для ПС - searcherKey\n * - ключ для региона - regionIndex\n *\n * Если поисковиков в списке нет, в список будет добавлен searcherUndefined\n *\n * Если регионов в списке нет, в список будет добавлен regionUndefined\n *\n * @param forMode - Режим выбора регионов\n * @param autoRegion - добавить элемент с ключем -2, который в API заменяется на нужный ключ в зависимости от контекста\n * @param searchers - поисковики с регионами проекта, см.: get/projects_2/projects, show_searchers_and_regions = 1\n */\nexport const genSearcherByKey = (\n\tforMode: ForMode = '',\n\tautoRegion: boolean = false,\n\tsearchers: Searcher[] = [],\n) => {\n\tlet searcherByKey: SearcherByKey;\n\n\tif (forMode) {\n\t\tsearcherByKey = genSearchersMapForMode(searchers, forMode);\n\t} else {\n\t\tsearcherByKey = genSearchersMapCommon(searchers);\n\t}\n\n\tif (autoRegion) searcherByKey.set(dummyIndex, getSearcherAuto());\n\tif (!searcherByKey.size) searcherByKey.set(dummyIndex, searcherUndefined);\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами\n *\n * @param searchers\n * @param onlyEnabledRegions\n * @param forceSearchersKeys - ключи ПС, которые нееобходимо вывести в любом случае\n * @param forMode - Режим выбора регионов (при непустом значении остаются только Яндекс, Google и Mail)\n */\nconst genSearchersMapCommon = (\n\tsearchers: Searcher[],\n\tonlyEnabledRegions: boolean = true,\n\tforceSearchersKeys: Searcher['key'][] = [],\n\tforMode: ForMode = '',\n) => {\n\tconst searcherByKey: Map<Searcher['key'], SearcherIndexed> = new Map();\n\n\t// настроенные ПС\n\tsearchers.forEach((searcher) => {\n\t\tif (forMode !== 'project_relevant_url' && !searcher.enabled) return;\n\t\tif (forMode && typeof searcher.key === 'number' && searcher.key > 1) return;\n\n\t\tconst searcherI = { ...searcher } as SearcherIndexed;\n\t\tsearcherI.regionByIndex = new Map();\n\n\t\tif (searcher.regions) {\n\t\t\tsearcher.regions.forEach((region: Region) => {\n\t\t\t\tif (onlyEnabledRegions && !region.enabled) return;\n\n\t\t\t\tconst regionI = { ...region };\n\t\t\t\tsearcherI.regionByIndex.set(regionI.index, regionI);\n\t\t\t});\n\t\t}\n\n\t\tif (!searcherI.regionByIndex.size && !forceSearchersKeys.length) {\n\t\t\t// searcherI.regionByIndex.set(regionUndefined.index, regionUndefined);\n\t\t}\n\n\t\tif (\n\t\t\t// режим вывода ПС без регионов\n\t\t\t!searcher.regions ||\n\n\t\t\t// есть включенные регионы\n\t\t\tsearcherI.regionByIndex.size ||\n\n\t\t\t// запрошен вывод конкретных ПС\n\t\t\tforceSearchersKeys.length\n\t\t) {\n\t\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t\t}\n\t});\n\n\t// дополнительные ПС\n\tforceSearchersKeys.forEach((searcherKey) => {\n\t\tif (searcherByKey.has(searcherKey)) return;\n\n\t\tconst searcherI: SearcherIndexed = {\n\t\t\tkey: searcherKey,\n\t\t\tname: searchersNames[searcherKey],\n\t\t\tregions: [],\n\t\t\tregionByIndex: new Map(),\n\t\t};\n\n\t\tsearcherByKey.set(searcherI.key, searcherI);\n\t});\n\n\treturn searcherByKey;\n};\n\n/**\n * Список ПС с регионами для проверки частоты (Яндекс, Google, Mail если добавлен в проект)\n *\n * @param searchers\n * @param forMode - Режим выбора регионов\n */\nconst genSearchersMapForMode = (searchers: Searcher[], forMode: ForMode) => {\n\tconst serarcherByKey = genSearchersMapCommon(searchers, false, Core.state.forceSearchersKeysForKeywordsStats, forMode);\n\n\t// в Mail нет регионов\n\tif (serarcherByKey.has(2)) {\n\t\tconst searcherMail = serarcherByKey.get(2);\n\t\tif (searcherMail) searcherMail.regionByIndex = new Map();\n\t}\n\n\tif ((forMode === 'volume' || forMode === 'cost_forecast') && Core.state.showGlobalRegionForKeywordsStats) {\n\t\t// добавление глобального региона\n\t\tserarcherByKey.forEach((searcher) => {\n\t\t\tif (!searcher.regionByIndex) return;\n\n\t\t\tconst region = { ...getRegionGlobal() };\n\t\t\tsearcher.regionByIndex.set(region.index, region);\n\t\t});\n\t}\n\n\treturn serarcherByKey;\n};\n\n/**\n * Поиск региона по заданному критерию из списка поисковиков проекта\n *\n * @param forMode - Режим выбора регионов\n * @param searchRegion - объект с параметрами региона, который следует найти\n * @param searchers\n */\nexport const findRegion = (forMode: ForMode, searchRegion: Partial<Region>, searchers: Searcher[] = []) => {\n\tconst searcherByKey = genSearcherByKey(forMode, false, searchers);\n\n\tlet findedRegion: Region | undefined;\n\n\t// поиск ПС\n\tsearcherByKey.forEach((searcher) => {\n\t\tif (searchRegion.searcher_key !== undefined && searchRegion.searcher_key != searcher.key) return;\n\t\tif (!searcher.regions) return;\n\n\t\t// поиск региона\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (findedRegion) return;\n\n\t\t\tif (searchRegion.key !== undefined && searchRegion.key != region.key) return;\n\t\t\tif (searchRegion.index !== undefined && searchRegion.index != region.index) return;\n\n\t\t\tif (!forMode) {\n\t\t\t\tif (searchRegion.lang !== undefined && searchRegion.lang != region.lang) return;\n\t\t\t\tif (searchRegion.device !== undefined && searchRegion.device != region.device) return;\n\t\t\t}\n\n\t\t\tregion.searcher_key = searcher.key;\n\t\t\tfindedRegion = region;\n\n\t\t\treturn false;\n\t\t});\n\n\t\tif (findedRegion) return false;\n\t});\n\n\treturn findedRegion;\n};\n\n/**\n * Открыть диалоговое окно с выбором нескольких регионов\n *\n * @see import('../dialog_regionSelectorRegions/types').Props\n */\nexport const dialogRegionSelector = useAsyncTopDialog(() => {\n\treturn import('@/components/project/regionSelector/dialog_regionSelectorRegions/dialog_regionSelectorRegions.vue');\n});\n","import { computed, type ComputedRef, ref } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Props, SearcherByKey } from '../types';\nimport type { Option, Options } from '@/components/forms/select/types';\nimport { dummyIndex, searhcerCompareKey } from '../utils/consts';\nimport { getSearcherGIcon } from '@/core/utils/searchers';\n\n/**\n * Создание и управление реактивными переменными для выбора ПС\n *\n * @param props - входные props компонента\n * @param mapSearchers - Map ПС (реактивная)\n */\nexport const useSelectSearcher = (\n\tprops: Props,\n\tmapSearchers: ComputedRef<SearcherByKey>,\n) => {\n\tconst i18n = useI18n();\n\n\t/**\n\t * Ключ выбранной поисковой системы\n\t */\n\tconst searcherKey = ref(mapSearchers.value.keys().next().value ?? dummyIndex);\n\n\t/**\n\t * Коллекция опций для выбора ПС\n\t */\n\tconst optionBySearcherKey = computed(() => {\n\t\tconst res: Options = new Map();\n\t\tmapSearchers.value.forEach((searcher) => {\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: searcher.key,\n\t\t\t\ttitle: searcher.name,\n\t\t\t};\n\n\t\t\tif (props.addSearcherIcon) option.icon = getSearcherGIcon(searcher.key);\n\n\t\t\tres.set(searcher.key, option);\n\t\t});\n\n\t\t// добавить режим сравнения, если есть хотя бы одна ПС с одним регионом\n\t\tif (props.addCompare && !res.has(dummyIndex)) {\n\t\t\tconst dummyOption: Option = {\n\t\t\t\tvalue: '',\n\t\t\t\ttitle: '--------------------',\n\t\t\t\tdisabled: true,\n\t\t\t};\n\t\t\tres.set(dummyOption.value, dummyOption);\n\n\t\t\tconst compareOption: Option = {\n\t\t\t\tvalue: searhcerCompareKey,\n\t\t\t\ttitle: i18n.Common.Compare!,\n\t\t\t};\n\t\t\tres.set(compareOption.value, compareOption);\n\t\t}\n\n\t\treturn res;\n\t});\n\n\treturn {\n\t\tsearcherKey,\n\t\toptionBySearcherKey,\n\t};\n};\n","import { computed, type ComputedRef, ref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getDeviceGIcon, getLangLabel } from '@/core/utils/searchers';\nimport type { Option } from '@/components/forms/select/types';\nimport { dummyIndex } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\n\n/**\n * Создание и управление реактивными переменными для выбора региона\n *\n * @param props - входные props компонента\n * @param activeSearcherIndexed - объект активной поисковой системы (реактивная)\n */\nexport const useSelectRegion = (props: Props, activeSearcherIndexed: ComputedRef<SearcherIndexed>) => {\n\tconst i18n = useI18n();\n\tconst useRegionKey = computed(() => props.forMode === 'volume' || props.forMode === 'cost_forecast');\n\n\t/**\n\t * Индекс выбранного региона\n\t */\n\tconst regionIndex = ref(dummyIndex);\n\n\tif (props.modelValue.length === 1) {\n\t\tregionIndex.value = props.modelValue[0];\n\t}\n\n\tif (regionIndex.value === dummyIndex) {\n\t\tif (useRegionKey.value) {\n\t\t\t// в качестве ключа используется region.key, а не region.index\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.values().next().value?.key ?? dummyIndex;\n\t\t} else {\n\t\t\tregionIndex.value = activeSearcherIndexed.value?.regionByIndex.keys().next().value ?? dummyIndex;\n\t\t}\n\t}\n\n\t/**\n\t * Коллекция опций для выбора региона\n\t */\n\tconst optionByRegionIndex = computed(() => {\n\t\tconst options = new Map<number, Option>();\n\n\t\tactiveSearcherIndexed.value.regionByIndex?.forEach((region) => {\n\t\t\tlet regionLabel = region.name;\n\n\t\t\t// на частоту в текущей версии устройство и язык не влияют\n\t\t\t// обратите внимание, в качестве ключа используется region.key, а не region.index\n\t\t\tif (useRegionKey.value) {\n\t\t\t\tconst option: Option = {\n\t\t\t\t\tvalue: region.key,\n\t\t\t\t\ttitle: regionLabel,\n\t\t\t\t};\n\t\t\t\tif (!options.has(region.key)) options.set(region.key, option);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (region.device) {\n\t\t\t\tregionLabel += ' (' + i18n.Common['Device_' + region.device] + ')';\n\t\t\t}\n\n\t\t\tconst langLabel = getLangLabel(activeSearcherIndexed.value.key || 0, region.lang ?? '');\n\t\t\tif (langLabel) regionLabel += ' / ' + langLabel;\n\n\t\t\tconst option: Option = {\n\t\t\t\tvalue: region.index,\n\t\t\t\ttitle: regionLabel,\n\t\t\t\ticon: region.device ? getDeviceGIcon(region.device) : undefined,\n\t\t\t};\n\n\t\t\toptions.set(region.index, option);\n\t\t});\n\n\t\treturn options;\n\t});\n\n\t/**\n\t * Выбор максимально похожего региона в новой коллекции регионов\n\t */\n\twatch(optionByRegionIndex, (optionByRegionIndex, oldOptionByRegionIndex) => {\n\t\tif (props.onlySearcher || regionIndex.value !== undefined && optionByRegionIndex.get(regionIndex.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet newRegionIndex = optionByRegionIndex.keys().next().value as Region['index'];\n\t\tif (regionIndex.value === dummyIndex || newRegionIndex === dummyIndex) {\n\t\t\tregionIndex.value = newRegionIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst regionName = (oldOptionByRegionIndex?.get(regionIndex.value) as Option)?.title || '';\n\t\tlet regionMatchLevel = -1;\n\t\tfor (const [index, option] of optionByRegionIndex.entries()) {\n\t\t\tconst title = (option as Option).title;\n\n\t\t\tif (typeof title !== 'string' || typeof index === 'string') {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// полное совпадение\n\t\t\tif (title === regionName) {\n\t\t\t\tnewRegionIndex = index;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst regexpDevice = new RegExp(` \\\\((${i18n.Common['Device_1']}|${i18n.Common['Device_2']})\\\\)`);\n\t\t\tlet regionNameCompare = regionName;\n\t\t\tlet regionMatchLevelI = 3;\n\n\t\t\t// без устройства\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\t// без устройства и без языка\n\t\t\tif (title.indexOf(regionNameCompare) === -1) {\n\t\t\t\tregionNameCompare = regionName.replace(/ \\/.*/, '');\n\t\t\t\tregionNameCompare = regionNameCompare.replace(/^[^a-zа-я]/i, '').replace(regexpDevice, '');\n\n\t\t\t\tregionMatchLevelI--;\n\t\t\t}\n\n\t\t\tif (title.indexOf(regionNameCompare) === -1) continue;\n\t\t\tif (regionMatchLevelI <= regionMatchLevel) continue;\n\n\t\t\tregionMatchLevel = regionMatchLevelI;\n\t\t\tnewRegionIndex = index;\n\t\t}\n\n\t\tregionIndex.value = newRegionIndex;\n\t});\n\n\treturn {\n\t\tregionIndex,\n\t\toptionByRegionIndex,\n\t};\n};\n","import { type ComputedRef, ref, watch } from 'vue';\nimport type { Props, SearcherByKey } from '../types';\n\n/**\n * Создание и управление реактивными переменными для сравнения\n *\n * @param props - входные props компонента\n * @param searcherByKey - Map ПС (реактивная)\n * @param allRegionsIndexes - Все доступные индексы регионов (реактивная)\n */\nexport const useCompare = (props: Props, searcherByKey: ComputedRef<SearcherByKey>, allRegionsIndexes: ComputedRef<Set<number>>) => {\n\t/**\n\t * Индексы регионов/ПС в сравнение\n\t */\n\tconst regionsIndexes = ref<number[]>([]);\n\n\t/**\n\t * Загрузка индексов регионов для сравнения\n\t *\n\t * Если в modelValue передано несколько регионов, они будут установлены как выбранные для сравнения\n\t */\n\tconst compareLoad = () => {\n\t\tif (props.onlySearcher && searcherByKey.value) {\n\t\t\tregionsIndexes.value = Array.from(searcherByKey.value.keys());\n\n\t\t\treturn;\n\t\t}\n\n\t\tlet regionsIndexesSaved: Props['modelValue'] = [];\n\n\t\tif (props.modelValue.length > 1) {\n\t\t\tregionsIndexesSaved = [...props.modelValue];\n\t\t} else {\n\t\t\ttry {\n\t\t\t\t// загрузить индексы регионов, если они были сохранены\n\t\t\t\tregionsIndexesSaved = JSON.parse(\n\t\t\t\t\tlocalStorage.getItem('ui:project:regionSelector' + props.projectId + ':regionsIndexes') as string,\n\t\t\t\t) ?? [];\n\t\t\t} catch (e) {\n\n\t\t\t}\n\t\t}\n\n\t\t// убрать из сравнения регионы, которых нет в props.searchers\n\t\tif (regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = regionsIndexesSaved.filter((regionIndex) => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\t// если не сохранено ни одного региона, выбрать все регионы проекта\n\t\tif (!regionsIndexesSaved.length) {\n\t\t\tregionsIndexesSaved = Array.from(allRegionsIndexes.value);\n\t\t}\n\n\t\tregionsIndexes.value = [...regionsIndexesSaved];\n\t};\n\n\t/**\n\t * Сохранение выбранных регионов\n\t */\n\tconst compareSave = () => {\n\t\tif (regionsIndexes.value.length) {\n\t\t\tlocalStorage.setItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes', JSON.stringify(regionsIndexes.value));\n\t\t} else {\n\t\t\tlocalStorage.removeItem('ui:project:regionSelector:' + props.projectId + ':regionsIndexes');\n\t\t}\n\t};\n\n\twatch(regionsIndexes, () => {\n\t\tcompareSave();\n\t});\n\n\tif (props.addCompare) {\n\t\t// if (props.compareRegionsIndexes?.length) {\n\t\t// \tcompareRegionsIndexes.value = [...props.compareRegionsIndexes];\n\t\t// } else {\n\t\t// \tcompareLoad();\n\t\t// }\n\n\t\tcompareLoad();\n\t}\n\n\treturn {\n\t\tregionsIndexes,\n\t};\n};\n","import { computed, watch } from 'vue';\nimport { findRegion, genSearcherByKey } from '../utils/utils';\nimport { dummyIndex, globalRegionIndex, searcherUndefined, searhcerCompareKey } from '../utils/consts';\nimport type { Props, Region, SearcherIndexed } from '../types';\nimport { useSelectSearcher } from './selectSearcher';\nimport { useSelectRegion } from './selectRegion';\nimport { useCompare } from './compare';\n\n/**\n * Создание и управления рективными переменными компонента\n *\n * @param props - входные props компонента\n */\nexport const useSelectorRegion = (props: Props) => {\n\tconst useRegionKey = computed(() => props.forMode === 'volume' || props.forMode === 'cost_forecast');\n\n\tconst searcherByKey = computed(() => {\n\t\treturn genSearcherByKey(props.forMode, props.autoRegion, props.searchers);\n\t});\n\n\tconst activeSearcherIndexed = computed(() => {\n\t\treturn searcherByKey.value.get(selectSearcher.searcherKey.value) || searcherUndefined;\n\t});\n\n\t/**\n\t * Все индексы регионов из searcherByKey\n\t *\n\t * Активность регионов определяется в searcherByKey\n\t */\n\tconst allRegionsIndexes = computed(() => {\n\t\tconst regionsIndexes = new Set<number>();\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\tregionsIndexes.add(region.index);\n\t\t\t});\n\t\t});\n\n\t\treturn regionsIndexes;\n\t});\n\n\tconst selectSearcher = useSelectSearcher(props, searcherByKey);\n\tconst selectRegion = useSelectRegion(props, activeSearcherIndexed);\n\tconst compare = useCompare(props, searcherByKey, allRegionsIndexes);\n\n\t// контроль за внешним изменением списка ПС\n\twatch(searcherByKey, () => {\n\t\t// возможные значения для сравнения регионов/пс\n\t\tif (props.onlySearcher) {\n\t\t\tcompare.regionsIndexes.value = Array.from(searcherByKey.value.keys());\n\t\t} else {\n\t\t\tcompare.regionsIndexes.value = compare.regionsIndexes.value.filter(regionIndex => {\n\t\t\t\treturn allRegionsIndexes.value.has(regionIndex);\n\t\t\t});\n\t\t}\n\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey) return;\n\n\t\tlet newSearcherKey = searcherByKey.value.keys().next().value;\n\n\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t// определить выбранную ПС\n\t\t\tif (props.onlySearcher && searcher.key === selectSearcher.searcherKey.value) {\n\t\t\t\tnewSearcherKey = selectSearcher.searcherKey.value;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tselectRegion.regionIndex.value &&\n\t\t\t\tsearcher.regionByIndex?.has(selectRegion.regionIndex.value)\n\t\t\t) {\n\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t}\n\n\t\t\t// выбрать первую ПС с выбранным регионом\n\t\t\tif (!props.onlySearcher) {\n\t\t\t\tlet regionsNewSearcher: SearcherIndexed['regionByIndex'] | undefined;\n\n\t\t\t\tif (newSearcherKey !== undefined) {\n\t\t\t\t\tregionsNewSearcher = searcherByKey.value.get(newSearcherKey)?.regionByIndex;\n\t\t\t\t}\n\n\t\t\t\tconst regionsCurrentSearcher = searcherByKey.value.get(searcher.key)?.regionByIndex;\n\t\t\t\tif (\n\t\t\t\t\tregionsNewSearcher?.has(dummyIndex) &&\n\t\t\t\t\t!regionsCurrentSearcher?.has(dummyIndex)\n\t\t\t\t) {\n\t\t\t\t\tnewSearcherKey = searcher.key;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// if (props.addCompare && !selectSearcher.optionBySearcherKey.value.has(dummyIndex)) {\n\t\t// \tif (!selectRegion.regionIndex.value && compare.regionsIndexes.value?.length) newSearcherKey = searhcerCompareKey;\n\t\t// }\n\n\t\t// if (props.onlySearcher && selectRegion.regionIndex.value !== dummyIndex) newSearcherKey = selectRegion.regionIndex.value;\n\n\t\tif (newSearcherKey !== undefined) {\n\t\t\tselectSearcher.searcherKey.value = newSearcherKey;\n\t\t}\n\n\t\tif (\n\t\t\tselectRegion.regionIndex.value !== undefined &&\n\t\t\t!(activeSearcherIndexed.value?.regionByIndex)?.has(selectRegion.regionIndex.value)\n\t\t) {\n\t\t\tselectRegion.regionIndex.value = activeSearcherIndexed.value?.regions?.keys().next().value as number;\n\t\t}\n\t}, { immediate: true });\n\n\tconst getSearcherKey = () => {\n\t\tif (selectSearcher.searcherKey.value === searhcerCompareKey || selectSearcher.searcherKey.value === dummyIndex) return;\n\n\t\treturn selectSearcher.searcherKey.value;\n\t};\n\n\tconst getRegionIndex = () => {\n\t\tif (props.onlySearcher) return;\n\n\t\tif (selectRegion.regionIndex.value === dummyIndex) return;\n\n\t\tlet res: Region['index'] | undefined = selectRegion.regionIndex.value;\n\n\t\t// в качестве ключа используется region.key\n\t\tif (useRegionKey.value && props.forMode) {\n\t\t\tconst regionKey = selectRegion.regionIndex.value;\n\t\t\tconst region = findRegion(props.forMode, { searcher_key: getSearcherKey(), key: regionKey } as Region, props.searchers);\n\n\t\t\tres = region?.index;\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Получить выбранную ПС\n\t */\n\tconst getSearcher = () => {\n\t\tconst searcherKey = getSearcherKey();\n\t\tif (searcherKey === undefined) return;\n\n\t\treturn searcherByKey.value.get(searcherKey);\n\t};\n\n\t/**\n\t * Получить выбранный регион\n\t */\n\tconst getRegion = () => {\n\t\tconst regionIndex = getRegionIndex();\n\t\tif (regionIndex === undefined) return;\n\n\t\treturn getSearcher()?.regionByIndex?.get(regionIndex);\n\t};\n\n\treturn {\n\t\tselectSearcher,\n\t\tselectRegion,\n\t\tcompare,\n\n\t\tsearcherByKey,\n\t\tallRegionsIndexes,\n\n\t\tgetSearcher,\n\t\tgetRegion,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { computed, watch } from 'vue';\nimport type { Props, Region } from './types';\nimport Select from '@/components/forms/select/select.vue';\nimport Button from '@/components/forms/button/button.vue';\nimport { useSelectorRegion } from './composables/selectorRegion';\nimport { dummyIndex, globalRegionIndex, searhcerCompareKey } from './utils/consts';\nimport { dialogRegionSelector } from '@/components/project/regionSelector/utils/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsearchers: () => [],\n\t// compareRegionsIndexes: () => [],\n\taddSearcherIcon: true,\n\taddRegionIcon: true,\n\taddChanger: true,\n});\nconst useRegionKey = computed(() => props.forMode === 'volume' || props.forMode === 'cost_forecast');\nconst model = defineModel<Props['modelValue']>({ required: true });\nconst modelSingle = defineModel<Props['modelValueSingle']>('modelValueSingle');\n\nconst {\n\tselectSearcher,\n\tselectRegion,\n\tcompare,\n\n\tsearcherByKey,\n\tallRegionsIndexes,\n\n\tgetSearcher,\n\tgetRegion,\n} = useSelectorRegion(props);\n\nconst onClickCompare = () => {\n\tconst regions: Region[] = [];\n\n\tsearcherByKey.value.forEach((searcher) => {\n\t\tif (props.forMode !== 'project_relevant_url' && !searcher.enabled) return;\n\n\t\tsearcher.regions.forEach((region) => {\n\t\t\tif (props.forMode !== 'project_relevant_url' && !region.enabled) return;\n\t\t\tif (region.index === globalRegionIndex) return;\n\n\t\t\tregions.push(region);\n\t\t});\n\t});\n\n\tdialogRegionSelector.open('regions', {\n\t\tregions,\n\t\tregionsIndexes: compare.regionsIndexes.value,\n\t\t'@update:regionsIndexes': (regionsIndexes: number[]) => compare.regionsIndexes.value = regionsIndexes,\n\t});\n};\n\nwatch([selectRegion.regionIndex, selectSearcher.searcherKey, compare.regionsIndexes], () => {\n\tif (selectSearcher.searcherKey.value === searhcerCompareKey && compare.regionsIndexes.value.length) {\n\t\tif (JSON.stringify(model.value) === JSON.stringify(compare.regionsIndexes.value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tmodel.value = [...compare.regionsIndexes.value];\n\t} else {\n\t\tif (props.onlySearcher) {\n\t\t\tmodel.value = [selectSearcher.searcherKey.value];\n\n\t\t\tif (selectSearcher.searcherKey.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t} else {\n\t\t\tmodel.value = [selectRegion.regionIndex.value];\n\n\t\t\t// не добавлять несуществующий регион в результаты\n\t\t\tif (selectRegion.regionIndex.value === dummyIndex && !props.autoRegion) model.value.length = 0;\n\t\t}\n\t}\n\n\t// регионов нет\n\tif (!props.onlySearcher && !allRegionsIndexes.value.size) {\n\t\tselectSearcher.searcherKey.value = dummyIndex;\n\t}\n});\n\nif (modelSingle.value) {\n\twatch(modelSingle, () => {\n\t\tif (modelSingle.value) {\n\t\t\tmodel.value = [modelSingle.value];\n\t\t}\n\t}, { immediate: true });\n}\n\nwatch(model, () => {\n\tif (model.value[0]) {\n\t\tmodelSingle.value = model.value[0];\n\t}\n\n\t// проверка входных данных v-model на корректность\n\tif (props.onlySearcher) {\n\t\tif (\n\t\t\t!model.value.length ||\n\t\t\tmodel.value.length === 1 && !searcherByKey.value.has(model.value[0]) ||\n\t\t\tmodel.value.length === 1 && model.value[0] === dummyIndex && !props.autoRegion\n\t\t) {\n\t\t\tlet defaultKey: number | undefined = searcherByKey.value.keys().next().value;\n\n\t\t\t// запретить устанавливать несуществующий регион\n\t\t\tif (defaultKey === dummyIndex && !props.autoRegion) {\n\t\t\t\tdefaultKey = undefined;\n\n\t\t\t\tmodelSingle.value = dummyIndex;\n\t\t\t}\n\n\t\t\tif (defaultKey !== undefined) {\n\t\t\t\tmodel.value = [defaultKey];\n\t\t\t}else{\n\t\t\t\tmodel.value.length = 0;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tmodel.value.length > 1 &&\n\t\t\tJSON.stringify(model.value) !== JSON.stringify(compare.regionsIndexes.value)\n\t\t) {\n\t\t\tmodel.value = [...compare.regionsIndexes.value];\n\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tlet newModel = [...new Set(model.value)];\n\n\t\tlet defaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.keys().next().value;\n\t\tif (useRegionKey.value) {\n\t\t\tdefaultIndex = searcherByKey.value.values().next().value?.regionByIndex?.values().next().value?.key;\n\t\t}\n\n\t\t// запретить устанавливать несуществующий регион\n\t\tif (defaultIndex === dummyIndex && !props.autoRegion) {\n\t\t\tdefaultIndex = undefined;\n\n\t\t\tmodelSingle.value = dummyIndex;\n\t\t}\n\n\t\tif (!newModel.length) {\n\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t} else if (newModel.length === 1) {\n\t\t\tlet all = allRegionsIndexes.value;\n\n\t\t\tif (useRegionKey.value) {\n\t\t\t\tall = new Set();\n\t\t\t\tsearcherByKey.value.forEach((searcher) => {\n\t\t\t\t\tsearcher.regionByIndex.forEach((region) => {\n\t\t\t\t\t\tif (region.index === globalRegionIndex) return;\n\t\t\t\t\t\tif (region.index === dummyIndex) return;\n\n\t\t\t\t\t\tall.add(region.key);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// убрано, так как dummyIndex запрещено выбирать в model\n\t\t\t// if (!all.has(newModel[0]) && newModel[0] !== dummyIndex) {\n\t\t\tif (!all.has(newModel[0])) {\n\t\t\t\tnewModel = [];\n\t\t\t\tif (defaultIndex !== undefined) {\n\t\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tnewModel = newModel.filter(index => allRegionsIndexes.value.has(index));\n\t\t\tif (!newModel.length && defaultIndex !== undefined) {\n\t\t\t\tnewModel.push(defaultIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (JSON.stringify(model.value) !== JSON.stringify(newModel)) {\n\t\t\tmodel.value = newModel;\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// входные данные v-model совпадают с внутренними значениями\n\tif (\n\t\tmodel.value.length === 1 &&\n\t\tmodel.value[0] === (props.onlySearcher ? selectSearcher.searcherKey.value : selectRegion.regionIndex.value)\n\t) {\n\t\treturn;\n\t}\n\n\t// if (\n\t// \tmodel.value.length > 1 &&\n\t// \tselectorSearcher.searcherKey.value === searhcerCompareKey &&\n\t// \tJSON.stringify(model.value) === JSON.stringify(selectorCompare.regionsIndexes.value)\n\t// ) {\n\t// \treturn;\n\t// }\n\n\t// обновление regionIndex, searcherKey, selectorCompare.regionsIndexes\n\tif (props.onlySearcher) {\n\t\t// if (!model.value.length) {\n\t\t// \tselectorSearcher.searcherKey.value = dummyIndex;\n\t\t//\n\t\t// \treturn;\n\t\t// }\n\n\t\tif (model.value.length === 1) {\n\t\t\tselectSearcher.searcherKey.value = model.value[0];\n\n\t\t\treturn;\n\t\t}\n\n\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\n\t\treturn;\n\t} else {\n\t\tif (!model.value.length) {\n\t\t\t// selectSearcher.searcherKey.value = dummyIndex;\n\t\t\t// selectRegion.regionIndex.value = dummyIndex;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (model.value.length === 1 && selectSearcher.searcherKey.value !== searhcerCompareKey) {\n\t\t\tselectRegion.regionIndex.value = model.value[0];\n\n\t\t\tlet newSearherKey: number | undefined;\n\t\t\tfor (const searcher of searcherByKey.value.values()) {\n\t\t\t\tfor (const region of searcher.regionByIndex.values()) {\n\t\t\t\t\tconst currentRegionIndex = useRegionKey.value\n\t\t\t\t\t\t? region.key\n\t\t\t\t\t\t: region.index;\n\t\t\t\t\tif (currentRegionIndex === selectRegion.regionIndex.value) {\n\t\t\t\t\t\tnewSearherKey = searcher.key;\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newSearherKey !== undefined) {\n\t\t\t\tselectSearcher.searcherKey.value = newSearherKey;\n\t\t\t}\n\t\t} else {\n\t\t\tselectSearcher.searcherKey.value = searhcerCompareKey;\n\t\t\tcompare.regionsIndexes.value = [...model.value];\n\t\t}\n\t}\n}, { immediate: true });\n\ndefineExpose({\n\tgetSearcher,\n\tgetRegion,\n});\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-regionSelector': true,\n\t\t\t'top-regionSelector-onlySearcher': onlySearcher,\n\t\t}\"\n\t>\n\t\t<Select\n\t\t\t:options=\"selectSearcher.optionBySearcherKey.value\"\n\t\t\tv-model=\"selectSearcher.searcherKey.value\"\n\t\t\tname=\"searcher_key\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t/>\n\n\t\t<Select\n\t\t\tv-if=\"!onlySearcher && selectSearcher.searcherKey.value !== searhcerCompareKey\"\n\t\t\tclass=\"top-select-region\"\n\t\t\t:options=\"selectRegion.optionByRegionIndex.value\"\n\t\t\tv-model=\"selectRegion.regionIndex.value\"\n\t\t\t:name=\"useRegionKey ? 'region_key' : 'region_index'\"\n\t\t\t:addChanger=\"addChanger\"\n\t\t\t:data-top-icon=\"addRegionIcon ? '' : undefined\"\n\t\t/>\n\n\t\t<Button\n\t\t\tv-if=\"addCompare && !onlySearcher && selectSearcher.searcherKey.value === searhcerCompareKey\"\n\t\t\tname=\"compare\"\n\t\t\t@click=\"onClickCompare\"\n\t\t\t:data-count-compare-regions-indexes=\"compare.regionsIndexes.value.length\"\n\t\t>\n\t\t\t{{ $i18n.Common.Selected_regions }}\n\t\t</Button>\n\t</div>\n</template>\n\n<style>\n@import \"./styles/searcherColors.css\";\n\n.top-regionSelector {\n\twidth: 340px;\n\tdisplay: inline-flex;\n\tvertical-align: middle;\n}\n\n.top-regionSelector > .top-select {\n\tflex-grow: 1;\n}\n\n.top-regionSelector > .top-select:focus-within {\n\tz-index: 4;\n}\n\n.top-regionSelector > .top-select > .top-select_select:hover,\n.top-regionSelector > .top-select > .top-select_select.top-error {\n\tz-index: 1;\n}\n\n.top-regionSelector > .top-select-searcher_key {\n\twidth: 140px;\n\tmax-width: 160px;\n\tmargin-right: -1px;\n}\n\n.top-regionSelector > .top-select-region > select {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n\n.top-regionSelector > .top-select-region {\n\t--top-icon-size: 20px;\n\t--top-icon-color: var(--color-text-primary);\n\n\t--top-icon2-size: 20px;\n\t--top-icon2-color: var(--color-text-primary);\n}\n\n.top-regionSelector > .top-select-region[data-top-icon][data-top-icon2] {\n\t--top-icon2-size: 16px;\n}\n\n.top-regionSelector > .top-select-region[data-top-icon][data-top-icon2]:after {\n\ttext-indent: -4px;\n}\n\n.top-regionSelector > [name=\"compare\"] {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\tflex-grow: 1;\n}\n\n.top-regionSelector > [name=\"compare\"]:after {\n\tcontent: \"(\" attr(data-count-compare-regions-indexes) \")\";\n\tmargin: 0 0 0 6px;\n}\n\n.top-regionSelector:not(.top-regionSelector-onlySearcher) > .top-select-searcher_key > select {\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n\tmargin-right: 0;\n}\n\n.top-regionSelector:not(.top-regionSelector-onlySearcher) > .top-select-searcher_key[data-value=\"-1\"] > select {\n\tborder-right: none;\n}\n\n.top-regionSelector-onlySearcher {\n\twidth: 140px;\n}\n</style>\n","// Генерация плоского массива объектов папок с заполнением childsIds и счетчиков\nimport type { Folder, FolderTree } from './types';\nimport type { Props } from '../types';\nimport { useI18n } from '@/core/app';\n\nexport const folderDefault: Folder = {\n\tid: 0,\n\tname: '/',\n\tpath: '/',\n};\n\n/**\n * Сгенерировать объект корневой папки для компонента\n *\n * Содержит измененное имя\n *\n * Необходимо предустанавливать для минимизации `rerender`\n */\nexport const genRootFolder = (folders: FolderTree | undefined, useSelectAll: boolean) => {\n\tlet rootFolder = folders?.['root'][0] ?? folderDefault;\n\trootFolder = { ...rootFolder };\n\n\trootFolder.name = genRootFolderName(useSelectAll);\n\n\treturn rootFolder;\n};\n\nexport function genRootFolderName(useSelectAll: boolean) {\n\tif (useSelectAll) {\n\t\treturn useI18n()?.Common.All_folders;\n\t} else {\n\t\treturn '/ (' + useI18n()?.Keywords.Root_folder + ')';\n\t}\n}\n\n/**\n * Сгенерировать плоский список папок\n *\n * В `folders` должен передаваться список всех папок, дозагрузка не предусмотрена\n */\nexport const genFlat = (\n\tfolderById: NonNullable<Props['folders']>,\n\tuseSelectAll: boolean,\n\tresultFolders = new Map<Folder['id'], Folder>(),\n\tparentFolder: Folder = { id: 'root' } as unknown as Folder,\n\tdepth = 0,\n) => {\n\tparentFolder.childsIds = [];\n\n\tif (parentFolder.id) {\n\t\tparentFolder.countAllGroupsActive = parentFolder.count_groups_active;\n\t}\n\n\tif (!folderById[parentFolder.id]) {\n\t\treturn resultFolders;\n\t}\n\n\tfolderById[parentFolder.id].forEach((folder) => {\n\t\tfolder = { ...folder };\n\n\t\tparentFolder.childsIds!.push(folder.id);\n\n\t\tif (folder.id === 0) folder.name = genRootFolderName(useSelectAll);\n\n\t\tconst prefix = depth > 1 ? '-'.repeat(depth - 1) + ' ' : '';\n\t\tif (prefix && !folder.name.startsWith(prefix)) folder.name = prefix + folder.name;\n\n\t\tresultFolders.set(folder.id, folder);\n\n\t\tgenFlat(folderById, useSelectAll, resultFolders, folder, depth + 1);\n\n\t\tparentFolder.childsIds = parentFolder.childsIds!.concat(folder.childsIds!);\n\n\t\tif (parentFolder.id && folder.count_groups_active) {\n\t\t\tparentFolder.countAllGroupsActive! += folder.count_groups_active;\n\t\t}\n\t});\n\n\treturn resultFolders;\n};\n\n/**\n * Создать API запрос на получение групп\n */\nexport const genApiGetFolders = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/get/${service}/folders/`, ['id', 'parent_id', 'name', 'path']).changeParams({ orders: ['ord_path'] as any, limit: 100 });\n};\n","import { watch, type WatchOptions, type WatchSource, type WatchStopHandle } from 'vue';\n\ntype UnwrapSource<T> = T extends WatchSource<infer V>\n\t? V\n\t: T extends object ? T : never;\n\ntype Changes<T> = Partial<{\n\t[K in keyof T]: {\n\t\told: UnwrapSource<T[K]> | undefined;\n\t\tnew: UnwrapSource<T[K]>\n\t}\n}>;\n\n/**\n * useWatch — расширенный `watch` с измененным callback\n * - принимает объект с реактивными свойствами, точно такими же, как при указании в массиве в стандартном `watch`\n * - callback возвращает изменившиеся свойства в объекте `changes` с `{old, new}`\n *\n * Если у вас есть несколько `watch`, которые меняют одно состояние, то могут возникнуть проблемы:\n * - рост длины цепочек `watch`, когда один `watch` приводит к срабатыванию другого\n * - лишние вызовы при согласованных состояниях, когда разные `watch` устанавливают одно и то же значение\n * - гонка при несогласованных состояниях, когда разные `watch` в разные тики при этом одновременно могут устанавливать разные состояния\n *\n * Если у вас такой случай и его нельзя упростить, то используйте `useWatch`, в остальных случаях используйте только стандартный `watch`\n *\n * @example\n *\n * ```js\n *\n * useWatch({ a: ref(5), b: ref('word') }, (changes) => {\n * \tconsole.log(changes.a?.new, changes.a?.old);\n * \tconsole.log(changes.b?.new, changes.b?.old);\n * });\n * ```\n */\nexport function useWatch<T extends Record<string, WatchSource>>(\n\tsourcesObj: T,\n\tcb: (\n\t\tchanges: Changes<T>,\n\t\tonCleanup: (fn: () => void) => void,\n\t) => void | Promise<void>,\n\toptions?: WatchOptions,\n): WatchStopHandle {\n\tconst keys = Object.keys(sourcesObj) as (keyof T)[];\n\tconst sources = keys.map(k => sourcesObj[k]);\n\n\treturn watch(sources, (newValues, oldValues, onCleanup) => {\n\t\tconst changed = {} as Changes<T>;\n\n\t\tnewValues.forEach((val, i) => {\n\t\t\tif (!Object.is(val, oldValues[i])) {\n\t\t\t\tconst k = keys[i];\n\n\t\t\t\tchanged[k] = {\n\t\t\t\t\told: oldValues[i],\n\t\t\t\t\tnew: val,\n\t\t\t\t} as any;\n\t\t\t}\n\t\t});\n\n\t\tif (Object.keys(changed).length) cb(changed, onCleanup);\n\t}, options);\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport type { Item } from '@/components/formsExt/selector2/types';\nimport type { Props } from './types';\nimport { folderDefault, genApiGetFolders, genFlat, genRootFolderName } from './utils';\nimport { apiSetSearchParamsFilter } from '@/components/formsExt/formsExt';\nimport { useWatch } from '@/core/utils/composables/useWatch';\n\nconst props = withDefaults(defineProps<Props>(), {\n\taddIcon: true,\n});\n\nconst modelFolderId = defineModel<Props['folderId']>('folderId', { required: true });\nconst modelFolder = defineModel<NonNullable<Props['folder']>>('folder', { default: folderDefault });\n\nconst apiGet = props.client && !props.folders ? genApiGetFolders(props.client, props.service) : undefined;\n\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\n// Настройка API\nwatch(() => props.projectId, () => {\n\tapiGet?.changeParams({\n\t\tproject_id: props.projectId,\n\t});\n\n\tapiGet?.setOptions({\n\t\tcheckFingerprint: 'TopGroupSelectorFolders:' + props.projectId,\n\t});\n\n\trefSelector.value?.resetCache();\n}, { immediate: true });\n\n/**\n * Плоский список папок\n */\nconst foldersFlat = computed(() => {\n\treturn genFlat(props.folders ?? { root: [folderDefault] }, props.canSelectAll);\n});\n\n/**\n * Нормализовать корневую папку\n *\n * Нужно только для замены \"Корневая папка\" на \"Все папки\"\n *\n * @note Другие решения с подменой `name` не сработают, так как API сохраняет items в cache, который менять нельзя\n */\nconst prepareItemsBeforeRender = (items: Item[]) => {\n\tif (props.canSelectAll && items[0]?.id === 0) {\n\t\titems[0] = {\n\t\t\t...items[0],\n\t\t\tname: genRootFolderName(true),\n\t\t};\n\t}\n\n\treturn items;\n};\n\n/**\n * Проверка входного значения `modelFolderId` и изменение `modelFolder`\n *\n * Определяем существует ли папка:\n * - Если существует: меняем папку на указанную\n * - Если не существует: устанавливаем Корневую папку\n *\n * При загрузке групп по API проверка выполняется в асинхронном режиме\n */\nuseWatch({\n\tmodelFolder,\n\tmodelFolderId,\n}, async (changes) => {\n\tif (modelFolderId.value === modelFolder.value.id) {\n\t\treturn;\n\t}\n\n\t// изменение только `modelFolder`\n\tif (changes.modelFolder && !changes.modelFolderId) {\n\t\tmodelFolderId.value = modelFolder.value.id;\n\n\t\treturn;\n\t}\n\n\tlet folderSelected = foldersFlat.value.get(props.folderId);\n\tif (!folderSelected) folderSelected = folderDefault;\n\n\tmodelFolder.value = folderSelected;\n\tmodelFolderId.value = folderSelected.id;\n\n\t// /**\n\t// * Для не api\n\t// */\n\t// if (props.folders) {\n\t// \tmodelFolder.value = folderSelected;\n\t// \tmodelFolderId.value = folderSelected.id;\n\t// }\n\t//\n\t// /**\n\t// * Для api проверка не делается\n\t// */\n\t// if (!props.folders) {\n\t// \tmodelFolder.value = folderSelected;\n\t// \tmodelFolderId.value = folderSelected.id;\n\t// }\n}, { immediate: true });\n</script>\n\n<template>\n\t<Selector2\n\t\tclass=\"top-groupSelector_folder\"\n\t\tv-model=\"modelFolder\"\n\t\t:items=\"folders ? [...foldersFlat.values()] : undefined\"\n\t\tsearch-type=\"inline\"\n\t\t:icon=\"addIcon ? '' : undefined\"\n\t\t:api=\"folders ? undefined : apiGet\"\n\t\t:apiSetSearchParams=\"(...args) => apiSetSearchParamsFilter(...args, 'name')\"\n\t\t:prepareItemsBeforeRender\n\t\t:addChanger\n\t\tuseCache\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div v-html=\"item.name.replaceAll(/</g, '< ')\"></div>\n\t\t</template>\n\t</Selector2>\n</template>\n","import type { Folder } from '../folders/types';\nimport type { Group, Props } from './types';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { folderDefault } from '../folders/utils';\nimport { ITEM_ID_ALL } from '@/components/formsExt/selector2/utils';\n\n/**\n * Элемент - группа ненайдена\n *\n * Указывается несуществующий id\n */\nexport const groupNone: Group = {\n\tid: -1,\n\tname: '--',\n\tfolder_id: folderDefault.id,\n\tfolder_path: folderDefault.path,\n};\n\n/**\n * Элемент для выбора всех групп\n */\nexport const groupAll: Group = {\n\tid: ITEM_ID_ALL,\n\tname: 'All groups',\n\tfolder_id: folderDefault.id,\n\tfolder_path: folderDefault.path,\n};\n\n/**\n * Элемент - `Все группы`\n */\nexport const genGroupAll = () => {\n\tgroupAll.name = useI18n()?.Common.All_groups;\n\n\treturn groupAll;\n};\n\n/**\n * Элемент - `Выберите группу`\n */\nexport const genGroupPlaceholder = () => {\n\tgroupAll.name = useI18n()?.Keywords.Choose_group;\n\n\treturn groupAll;\n};\n\n/**\n * Сгенерировать список групп для TopSelector\n */\nexport const genItems = (groups: Group[], on?: boolean, folderForFilter?: Folder) => {\n\tgroups = [...groups];\n\n\t// фильтр по активности\n\tif (on !== undefined) {\n\t\tgroups = groups.filter((group) => {\n\t\t\treturn group.on == Number(on);\n\t\t});\n\t}\n\n\t// фильтр по папке\n\tif (folderForFilter && folderForFilter.id && folderForFilter.childsIds) {\n\t\tgroups = groups.filter((group) => {\n\t\t\treturn (\n\t\t\t\tgroup.folder_id === folderForFilter.id ||\n\t\t\t\tfolderForFilter.childsIds!.includes(group.folder_id)\n\t\t\t);\n\t\t});\n\t}\n\n\treturn groups;\n};\n\n/**\n * Создать API запрос на получение групп\n */\nexport const genApiGetGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/get/${service}/groups/`, ['id', 'name', 'folder_id', 'folder_path']).changeParams({ folder_id_depth: true, limit: 100 });\n};\n\n/**\n * Создать API запрос на добавление групп\n */\nexport const genApiAddGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/add/${service}/groups/`);\n};\n\n/**\n * Создать API запрос на удаление группы\n */\nexport const genApiDelGroups = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/del/${service}/groups/`);\n}\n\n/**\n * Создать API запрос на переименование группы\n */\nexport const genApiEditGroupsRename = (client: Api.Client<Api.TV.Paths, true>, service: NonNullable<Props['service']>) => {\n\treturn client.gen(`/edit/${service}/groups/rename/`);\n}\n","<script setup lang=\"ts\">\nimport { computed, reactive, ref } from 'vue';\nimport { useWatch } from '@/core/utils/composables/useWatch';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport PopupConfirm from '@/components/popup/popupConfirm/popupConfirm.vue';\nimport PopupPrompt from '@/components/popup/popupPrompt/popupPrompt.vue';\nimport type { Item as SelectorItem } from '@/components/formsExt/selector2/types';\nimport { apiSetSearchParamsFilter, ITEM_ID_ALL, ITEM_ID_NEW } from '@/components/formsExt/formsExt';\nimport type { Emits, Group, Props } from './types';\nimport {\n\tgenApiAddGroups,\n\tgenApiDelGroups,\n\tgenApiEditGroupsRename,\n\tgenApiGetGroups,\n\tgenGroupAll,\n\tgenGroupPlaceholder,\n\tgenItems,\n\tgroupNone,\n} from './utils';\nimport { genFieldFilter } from '@/api/api/index';\nimport { folderDefault } from '../folders/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tautoselect: 'first',\n\taddChanger: true,\n\taddIcon: true,\n\tservice: 'keywords_2',\n});\n\nconst emits = defineEmits<Emits>();\n\nconst modelGroupId = defineModel<Props['groupId']>('groupId', { required: true });\nconst modelGroup = defineModel<Props['group']>('group', { required: true });\n\nconst apiGet = props.client && !props.groups ? genApiGetGroups(props.client, props.service) : undefined;\nconst apiAdd = props.client ? genApiAddGroups(props.client, props.service) : undefined;\nconst apiDel = props.client ? genApiDelGroups(props.client, props.service) : undefined;\nconst apiEditRename = props.client ? genApiEditGroupsRename(props.client, props.service) : undefined;\n\nconst refSelector = ref<InstanceType<typeof Selector2> | null>(null);\n\n/**\n * Группы выбранной папки\n */\nconst groupsBySelectedFolder = computed(() => {\n\tif (props.groups === undefined) return undefined;\n\n\treturn genItems(props.groups, props.on, props.folder);\n});\n\nconst filterByFolder = genFieldFilter('folder_id', 'EQUALS', [props.folder?.id ?? 0]);\n\napiGet?.changeParams({\n\tproject_id: props.projectId,\n\tfolder_id_depth: true,\n\tfilters: [\n\t\tfilterByFolder,\n\t],\n});\n\nif (props.on !== undefined) {\n\tapiGet?.params.filters?.push(genFieldFilter('on', 'EQUALS', [Number(props.on)]));\n}\n\n/**\n * Синхронная установка группы и id группы\n *\n * Id рекомендуется вместе с группой\n * - для согласованной смены состояния\n * - для уменьшения цепочки `watch` синхронизации состояний `modelGroupId` и `modelGroup`\n *\n * Пример несогласованности: если передать `modelGroup` и значение `modelGroupId`, которое ему не соответствует, то попытка установить ту же самую группу в `modelGroup` не приведет к смене `modelGroupId`\n */\nconst setGroup = (group: Props['group']) => {\n\tmodelGroup.value = group;\n\tmodelGroupId.value = group.id;\n};\n\n/**\n * Сбросить кэш\n *\n * @param resetAPICache - Сбросить API кэш\n */\nconst resetCacheSelector = (resetAPICache = false) => {\n\trefSelector.value?.resetCache(resetAPICache);\n};\n\n// Настройка API, обработка смены папки и выбор всех групп\nuseWatch({\n\tprojectId: () => props.projectId,\n\tfolderId: () => props.folder?.id,\n\tcanSelectAll: () => props.canSelectAll,\n}, (changes) => {\n\t// Настройка API\n\tif (changes.projectId) {\n\t\tapiGet?.changeParams({\n\t\t\tproject_id: props.projectId,\n\t\t});\n\n\t\tapiGet?.setOptions({\n\t\t\tcheckFingerprint: 'TopGroupSelectorGroups:' + props.projectId,\n\t\t});\n\t}\n\n\t// Обработка смены папки\n\tif (changes.folderId) {\n\t\tfilterByFolder.values = [\n\t\t\tprops.folder?.id ?? 0,\n\t\t];\n\t}\n\n\tresetCacheSelector();\n\n\t/**\n\t * При смене папки автоматически выбирать нужную группу с учетом `props.autoselect`\n\t *\n\t * Новая группа, при смене папки не меняется\n\t */\n\tif (\n\t\t(changes.folderId?.old !== undefined || changes.canSelectAll?.old !== undefined) &&\n\t\tmodelGroupId.value !== ITEM_ID_NEW\n\t) {\n\t\tlet group: Props['group'] | undefined;\n\n\t\tif (props.autoselect === 'first') {\n\t\t\tgroup = groupsBySelectedFolder.value?.[0];\n\n\t\t\tif (props.canSelectAll) {\n\t\t\t\tgroup = reactive(genGroupAll());\n\t\t\t}\n\t\t}\n\n\t\tif (props.autoselect === 'placeholder' || !group) {\n\t\t\tgroup = genGroupPlaceholder();\n\t\t}\n\n\t\tsetGroup(group);\n\t}\n}, { immediate: true });\n\n/**\n * Проверка входного значения `modelGroupId` и изменение `modelGroup`\n *\n * Определяем существует ли группа:\n * - Если существует: меняем группу на указанную\n * - Если не существует: устанавливаем \"Нет группы\"\n *\n * При загрузке групп по API проверка выполняется в асинхронном режиме\n */\nuseWatch({\n\tmodelGroup,\n\tmodelGroupId,\n}, async (changes) => {\n\tif (modelGroupId.value === modelGroup.value.id) {\n\t\treturn;\n\t}\n\n\t// изменение только `modelGroup`\n\tif (changes.modelGroup && !changes.modelGroupId) {\n\t\tmodelGroupId.value = modelGroup.value.id;\n\n\t\treturn;\n\t}\n\n\tif (props.canAdd && modelGroupId.value === ITEM_ID_NEW) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Для не api\n\t */\n\tif (props.groups) {\n\t\tlet groupSelected = groupsBySelectedFolder.value?.find((group) => group.id === modelGroupId.value);\n\n\t\tif (!groupSelected && props.canSelectAll) groupSelected = genGroupAll();\n\n\t\tif (groupSelected) {\n\t\t\tsetGroup(groupSelected);\n\t\t} else {\n\t\t\tconst firstGroup = groupsBySelectedFolder.value?.[0];\n\t\t\tif (firstGroup && !modelGroupId.value) {\n\t\t\t\t// группа не была указана, инициализация компонента\n\t\t\t\tsetGroup(firstGroup);\n\t\t\t} else {\n\t\t\t\tsetGroup(groupNone);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Для api\n\t */\n\tif (props.client && !props.groups && (modelGroupId.value || modelGroupId.value === ITEM_ID_ALL && !props.canSelectAll)) {\n\t\tconst api = genApiGetGroups(props.client, props.service).changeParams({\n\t\t\tproject_id: props.projectId,\n\t\t\tid: modelGroupId.value,\n\t\t\tfilters: [\n\t\t\t\tfilterByFolder,\n\t\t\t],\n\t\t});\n\n\t\t/**\n\t\t * @remarks При выборе группы \"Все группы\" или при добавлении группы отмена запроса не происходит\n\t\t */\n\t\tapi?.setOptions({\n\t\t\tcheckFingerprint: 'TopGroupSelectorFindGroup:' + props.projectId,\n\t\t});\n\n\t\tconst res = await api.call();\n\n\t\t// при отмене запроса, смену группы не выполняем\n\t\tif (!res.errors?.length && !res.result) return;\n\n\t\tif (!res.errors && res.result[0]) {\n\t\t\tsetGroup(res.result[0] as Group);\n\t\t} else {\n\t\t\tsetGroup(groupNone);\n\t\t}\n\t}\n}, { immediate: true });\n\nconst addGroups = async (group: SelectorItem) => {\n\t// просто выбор произвольной группы, без реального добавления\n\tif (props.canAdd !== 'api') return;\n\n\t// при добавлении группы `props.client` обязателен\n\tif (!apiAdd) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiAdd.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\tconst modelGroupOld = modelGroup.value;\n\n\t// Для api\n\tconst res = await apiAdd.changeParams({\n\t\tproject_id: props.projectId,\n\t\tnames: [group.name],\n\t\tto_id: props.folder?.id ?? folderDefault.id,\n\t\tto_type: 'in_folder_last',\n\t}).call();\n\n\tif (res.result) {\n\t\tconst group = res.result[0] as Group;\n\n\t\tsetGroup(group);\n\n\t\temits('addGroup', group);\n\t} else {\n\t\t// вернуть предыдущий выбор в случае ошибки добавления группы\n\t\tsetGroup(modelGroupOld);\n\t}\n\n\trefSelector.value?.resetCache(true);\n};\n\nconst renameGroup = async (group: SelectorItem, newName: string) => {\n\t// при переименовании группы `props.client` обязателен\n\tif (!apiEditRename) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiEditRename.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\t// Для api\n\tconst res = await apiEditRename.changeParams({\n\t\tproject_id: props.projectId,\n\t\tid: group.id,\n\t\tname: newName,\n\t}).call();\n\n\tif (res.errors) return;\n\n\t/**\n\t * Свойства Model напрямую менять нельзя\n\t *\n\t * Данный код вообще не нужен, потому что:\n\t * - локальный список групп управляется состоянием компонента через `props.group` и `@update:group`\n\t * - список, обновляемый через API, обновляется через систему кеширования\n\t */\n\t// if (modelGroup.value.id === group.id) {\n\t// \tmodelGroup.value = {\n\t// \t\t...modelGroup.value,\n\t// \t\tname: newName,\n\t// \t};\n\t// }\n\n\t// Модификация группы без переприсвоения, чтобы не вызывать лишних запросов\n\tif (modelGroup.value.id === group.id) modelGroup.value.name = newName;\n\n\temits('editGroup', {\n\t\tid: group.id!,\n\t\tname: newName,\n\t});\n\n\trefSelector.value?.updateCacheItemById(group.id, {\n\t\tname: newName,\n\t});\n};\n\nconst deleteGroups = async (group: SelectorItem) => {\n\t// при удалении группы `props.client` обязателен\n\tif (!apiDel) return;\n\n\tif (import.meta.env.STORYBOOK) {\n\t\tapiDel.changeParams({\n\t\t\t// @ts-ignore Для storybook\n\t\t\t__sbIsUseAPI: !props.groups,\n\t\t});\n\t}\n\n\t// Для api\n\tconst res = await apiDel.changeParams({\n\t\tproject_id: props.projectId,\n\t\tid: group.id,\n\t}).call();\n\n\tif (res.errors) return;\n\n\t// при удалении выбранной группа убрать выбор группы\n\tif (modelGroup.value.id === group.id) setGroup(props.canSelectAll ? genGroupAll() : groupNone);\n\n\temits('delGroup', group.id!);\n\n\trefSelector.value?.deleteCacheItemById(group.id);\n};\n\ndefineExpose({\n\tresetCacheGroups: resetCacheSelector,\n});\n</script>\n\n<template>\n\t<Selector2\n\t\tref=\"refSelector\"\n\t\tclass=\"top-groupSelector_group\"\n\t\tv-model=\"modelGroup\"\n\t\t:items=\"groupsBySelectedFolder ?? groups\"\n\t\tsearchType=\"inline\"\n\t\t:icon=\"addIcon ? '' : undefined\"\n\t\t:api=\"groups ? undefined : apiGet\"\n\t\t:apiSetSearchParams=\"(...args) => apiSetSearchParamsFilter(...args, 'name')\"\n\t\t:appendSearchToResult=\"!!canAdd\"\n\t\t:useAllItem=\"canSelectAll ? genGroupAll().name : false\"\n\t\t:addChanger\n\t\tuseCache\n\t\t@appendItem=\"addGroups\"\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div class=\"top-groupSelector_groupItem top-ellipsis1\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\tv-if=\"item.id === ITEM_ID_NEW\"\n\t\t\t\t>\n\t\t\t\t\t{{ $i18n.Common.Add }}:\n\t\t\t\t</div>\n\n\t\t\t\t<!--<span>{{ item.name }}</span>-->\n\t\t\t\t<span\n\t\t\t\t\tclass=\"top-groupSelector_groupItemName top-ellipsis1\"\n\t\t\t\t\tv-html=\"item.name\"\n\t\t\t\t></span>\n\n\t\t\t\t<!--<span v-if=\"item.folder_path && showPath\" class=\"top-groupSelector_groupItemFolderPath\">-->\n\t\t\t\t<!--\t{{ item.folder_path }}-->\n\t\t\t\t<!--</span>-->\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"item.folder_path && showPath\"\n\t\t\t\t\tclass=\"top-groupSelector_groupItemFolderPath top-ellipsis1\"\n\t\t\t\t\tv-html=\"item.folder_path\"\n\t\t\t\t></span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template\n\t\t\t#actions=\"{ item }\"\n\t\t\tv-if=\"canEditAndDel && client\"\n\t\t>\n\t\t\t<template v-if=\"item.id\">\n\t\t\t\t<!-- переименование группы -->\n\t\t\t\t<PopupPrompt\n\t\t\t\t\t:submitText=\"$i18n.Common.Save\"\n\t\t\t\t\t:defaultValue=\"item.name\"\n\t\t\t\t\t:inputProps=\"{ addCleaner: false }\"\n\t\t\t\t\t@submit=\"(value) => renameGroup(item, value)\"\n\t\t\t\t>\n\t\t\t\t\t<template #opener>\n\t\t\t\t\t\t<div data-top-icon=\"\"></div>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<template #default></template>\n\t\t\t\t</PopupPrompt>\n\n\t\t\t\t<!-- удаление группы -->\n\t\t\t\t<PopupConfirm\n\t\t\t\t\tisWarning\n\t\t\t\t\t:submitText=\"$i18n.Common.Delete\"\n\t\t\t\t\t@submit=\"deleteGroups(item)\"\n\t\t\t\t>\n\t\t\t\t\t<template #opener>\n\t\t\t\t\t\t<div data-top-icon=\"\"></div>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<span v-html=\"service === 'keywords_2' ? $i18n.Keywords.Delete_group_warning : $i18n['Ai.Tracker'].Delete_group_warning\"></span>\n\t\t\t\t</PopupConfirm>\n\t\t\t</template>\n\t\t</template>\n\t</Selector2>\n</template>\n\n<style>\n.top-groupSelector_groupItem {\n\tmin-height: 20px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-padding-1);\n}\n\n.top-groupSelector_groupItemFolderPath {\n\twidth: 100%;\n\tcolor: var(--color-text-4);\n\tfont-size: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { type ModelRef, ref } from 'vue';\nimport type { Emits, Props } from './types';\nimport type { Group } from './groups/types';\nimport Folders from './folders/folders.vue';\nimport Groups from './groups/groups.vue';\nimport { folderDefault, genFlat } from './folders/utils';\nimport { genGroupAll, genGroupPlaceholder, groupNone } from './groups/utils';\n\nconst props = withDefaults(defineProps<Props>(), {\n\ton: undefined,\n\tcanSelectAllGroups: false,\n\tautoselect: 'first',\n\taddChanger: true,\n\tshowFolders: true,\n\tshowGroups: true,\n\taddIcon: true,\n\tservice: 'keywords_2',\n});\n\nconst componentGroupsRef = ref<InstanceType<typeof Groups> | null>(null);\n\nconst modelFolderId = defineModel<Props['folderId']>('folderId', { required: true });\nconst modelFolder = defineModel<Props['folder']>('folder');\n\nconst modelGroupId = defineModel<Props['groupId']>('groupId', { required: true });\nconst modelGroup = defineModel<Props['group']>('group', { default: groupNone }) as ModelRef<NonNullable<Props['group']>>;\n\nconst emit = defineEmits<Emits>();\n\n/**\n * Выбранная папка\n *\n * Спекулятивное предсказание выбранной папки\n *\n * Если папка не определена, она ставится в `undefined`, чтобы при последующем определении не фиксировались события смены папки, см. `groups.vue`\n */\nconst foldersFlat = genFlat(props.folders ?? { root: [folderDefault] }, props.canSelectAllGroups);\nmodelFolder.value = foldersFlat.get(modelFolderId.value);\n\n/**\n * Спекулятивное предсказание выбранной группы, чтобы не было лишней перерисовки\n *\n * Точная проверка происходит в `groups.vue`\n */\nlet groupInitial = props.groups?.find((group) => group.id === modelGroupId.value);\nif (!modelGroupId.value) groupInitial = props.groups?.[0];\nif (props.canSelectAllGroups && !groupInitial) {\n\tgroupInitial = genGroupAll();\n}\nif (props.autoselect === 'placeholder' || !groupInitial) {\n\tgroupInitial = genGroupPlaceholder();\n}\ngroupInitial ??= groupNone;\n\nmodelGroup.value = groupInitial;\n\nconst onAddGroup = (group: Group) => {\n\t// если загрузка групп производится по api, то добавлять новые группы в `props.groups` не нужно\n\tlet groups: Group[] | undefined;\n\n\tif (props.groups && group) {\n\t\tgroups = [...props.groups, group];\n\t}\n\n\temit('update:groups', groups);\n};\n\nconst onEditGroup = (groupEditedPatch: Partial<Group> & { id: Group['id'] }) => {\n\t// если загрузка групп производится по api, то обновлять группы в `props.groups` не нужно\n\tif (!props.groups) {\n\t\temit('update:groups');\n\n\t\treturn;\n\t}\n\n\tconst groupFinded = props.groups.find((group) => group.id === groupEditedPatch.id);\n\tif (!groupFinded) return;\n\n\tconst groupEdited = { ...groupFinded, ...groupEditedPatch };\n\n\tconst groups = props.groups.map((group) => group.id === groupEdited.id ? groupEdited : group);\n\n\temit('update:groups', groups);\n};\n\nconst onDelGroup = (groupDeletedId: Group['id']) => {\n\t// если загрузка групп производится по api, то удалять группы из `props.groups` не нужно\n\tif (!props.groups) {\n\t\temit('update:groups');\n\n\t\treturn;\n\t}\n\n\tconst groups = props.groups.filter((group) => group.id !== groupDeletedId);\n\n\temit('update:groups', groups);\n};\n\ndefineExpose({\n\t/**\n\t * Сбросить кэш\n\t *\n\t * @param resetAPICache - Сбросить API кэш\n\t */\n\tresetCacheGroups: (resetAPICache = false) => {\n\t\tcomponentGroupsRef.value?.resetCacheGroups(resetAPICache);\n\t},\n});\n</script>\n\n<template>\n\t<div class=\"top-groupSelector\">\n\t\t<Folders\n\t\t\tv-if=\"showFolders\"\n\t\t\tv-model:folderId=\"modelFolderId\"\n\t\t\tv-model:folder=\"modelFolder\"\n\t\t\t:projectId\n\t\t\t:folders\n\t\t\t:canSelectAll=\"canSelectAllGroups\"\n\t\t\t:addChanger\n\t\t\t:addIcon\n\t\t\t:client\n\t\t\t:service=\"props.service\"\n\t\t/>\n\n\t\t<Groups\n\t\t\tv-if=\"showGroups\"\n\t\t\tref=\"componentGroupsRef\"\n\t\t\tv-model:groupId=\"modelGroupId\"\n\t\t\tv-model:group=\"modelGroup\"\n\t\t\t:projectId\n\t\t\t:folder=\"modelFolder\"\n\t\t\t:groups\n\t\t\t:on\n\t\t\t:canAdd=\"canAddGroup\"\n\t\t\t:canEditAndDel=\"canEditAndDelGroup\"\n\t\t\t:canSelectAll=\"canSelectAllGroups\"\n\t\t\t:autoselect\n\t\t\t:addChanger\n\t\t\t:showPath=\"showGroupsPaths || showFolders\"\n\t\t\t:addIcon\n\t\t\t:client\n\t\t\t:service=\"props.service\"\n\t\t\t@addGroup=\"onAddGroup\"\n\t\t\t@editGroup=\"onEditGroup\"\n\t\t\t@delGroup=\"onDelGroup\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-groupSelector {\n\tdisplay: inline-flex;\n\tgap: var(--top-padding-1);\n}\n</style>\n","import { useI18n } from '@/core/plugins/i18n';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport { genFieldFilter, genFieldOrder } from '@/api/api';\nimport Core from '@/core/core/core';\nimport type { Props } from '@/components/formsExt/selector2/types';\nimport type { Item, Project } from './types';\n\n/**\n * Создать объект заголовка для категории проектов\n */\nconst createProjectCategoryTitles = (name: string): Item => {\n\treturn {\n\t\tid: null,\n\t\tname,\n\t\tlistItemProps: {\n\t\t\ttype: 'title',\n\t\t\tclass: 'top-projectSelector_item',\n\t\t},\n\t};\n};\n\n/**\n * Состояние вставки заголовков категорий\n *\n * Используется для отслеживания, какие заголовки уже были добавлены в список,\n * чтобы не дублировать их при постраничной загрузке данных\n */\nconst globalTitlesState = {\n\tscheduledUpdate: false,\n\tmanualUpdate: false,\n\tguestProjects: false,\n};\n\n/**\n * Сгенерировать результат с заголовками категорий перед соответствующими группами проектов\n *\n * Использует `globalTitlesState`, оно сохраняется между вызовами, так как проекты подгружаются частями\n *\n * При `useLocalTitlesState` = `true` создаётся временное состояние заголовков для этого вызова функции, не влияющее на глобальное состояние.\n * Используется при поиске проектов, чтобы сохранить исходное состояние заголовков\n */\nconst genResultWithCategoryTitles = (projects: Item[], useLocalTitlesState?: boolean): Item[] => {\n\tconst result: Item[] = [];\n\n\tconst categoriesTitle = {\n\t\tscheduledUpdate: createProjectCategoryTitles(useI18n().Projects.Scheduled_update),\n\t\tmanualUpdate: createProjectCategoryTitles(useI18n().Projects.Manual_update),\n\t\tguestProjects: createProjectCategoryTitles(useI18n().Projects.Guest_projects),\n\t};\n\n\tconst titlesState = useLocalTitlesState ? {\n\t\tscheduledUpdate: false,\n\t\tmanualUpdate: false,\n\t\tguestProjects: false,\n\t} : globalTitlesState;\n\n\tfor (const project of projects) {\n\t\tif (!titlesState.scheduledUpdate && project.right?.startsWith('1') && project.on > 0) {\n\t\t\tresult.push(categoriesTitle.scheduledUpdate);\n\t\t\ttitlesState.scheduledUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.manualUpdate && project.right?.startsWith('1') && project.on === 0) {\n\t\t\tresult.push(categoriesTitle.manualUpdate);\n\t\t\ttitlesState.manualUpdate = true;\n\t\t}\n\n\t\tif (!titlesState.guestProjects && project.right?.startsWith('0') && project.on >= 0) {\n\t\t\tresult.push(categoriesTitle.guestProjects);\n\t\t\ttitlesState.guestProjects = true;\n\t\t}\n\n\t\tresult.push(project);\n\t}\n\n\treturn result;\n};\n\n/**\n * Сгенерировать элемент для TopSelector\n */\nexport const genProjectItem = (project: Project): Item => ({\n\t...project,\n\texternalLink: genProjectExternalLink(project.url ?? ''),\n\tlistItemProps: {\n\t\tclass: 'top-projectSelector_item',\n\t\tattrs: {\n\t\t\ttitle: project.name!,\n\t\t},\n\t},\n});\n\n/**\n * Подготовить данные проектов для отображения:\n * - сбросить состояние вставки заголовков категорий, если требуется\n * - добавить `listItemProps` для шаблона TopSelector\n * - добавить заголовки к категориям\n */\nconst prepareProjects = (\n\tprojects: Project[] | undefined,\n\tresetTitlesState?: boolean,\n\tuseLocalTitlesState?: boolean,\n): Item[] | undefined => {\n\tif (!projects || projects.length === 0) return [];\n\n\tif (resetTitlesState) Object.keys(globalTitlesState).forEach((key) => globalTitlesState[key] = false);\n\n\tconst projectsWithListItem = projects.map(genProjectItem);\n\n\treturn genResultWithCategoryTitles(projectsWithListItem, useLocalTitlesState);\n};\n\n/**\n * Добавить к ссылке релевантные hash-параметров текущего проекта\n */\nconst prepareProjectLink = (link: string) => {\n\tlink = link.replace(/#.*/, '');\n\n\tlet hash = location.hash;\n\n\t// Игнорируемые параметры при переходе между проектами (формат плагина piniaTPA)\n\thash = hash.replace(/%22historyView%22:[^,]*,/, '');\n\thash = hash.replace(/%22modelsKeys%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22competitorsIds%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22searchersKeys%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22regionIndex%22:[^,]*,/, '');\n\thash = hash.replace(/%22regionsIndexes%22:\\[[^\\]]*],/, '');\n\thash = hash.replace(/%22folderId%22:[^,]*,/, '');\n\thash = hash.replace(/%22groupId%22:[^,]*,/, '');\n\thash = hash.replace(/%22tagsIds%22:\\[[^\\]]*],/, '');\n\n\t// Сохранить сортировку по дате последней проверки\n\tif (!/%22dataSort%22:\\{[^}]*0000-00-00[^}]*}/.test(hash)) {\n\t\thash = hash.replace(/,?%22dataSort%22:\\{[^}]*}(,?)/, '$1');\n\t}\n\n\treturn link + hash;\n};\n\nexport const navigateToProject = (projectId: number) => {\n\tlocation.href = genLinkToProjectMod(projectId);\n};\n\n/**\n * Сгенерировать ссылку на страницу проекта с инструментом\n *\n * @note Ссылка сейчас пересчитывается только в момент открытия меню\n */\nexport const genLinkToProjectMod = (projectId: number) => {\n\tconst host = getBaseHost();\n\tconst pathname = location.pathname.split('/');\n\n\tlet prefix = 'project/dynamics/';\n\tlet suffix = '';\n\tif (pathname[1] == 'project') prefix = pathname[1] + '/' + pathname[2] + '/';\n\tif (pathname[2] == 'settings') suffix = location.hash;\n\tif (['watcher', 'indexing', 'sitemap', 'audit', 'direct', 'adwords'].includes(pathname[4])) suffix = pathname[4] + '/';\n\n\tlet link = 'https://' + host + '/' + prefix + projectId + '/' + suffix;\n\tlink = prepareProjectLink(link);\n\n\treturn link;\n};\n\n/**\n * Вернуть базовый хост без поддомена\n */\nexport const getBaseHost = () => {\n\tif (window['page']?.subdomain) {\n\t\treturn window.location.host.replace(window['page']?.subdomain + '.', '');\n\t}\n\n\treturn window.location.host;\n};\n\n/**\n * Сгенерировать ссылку на сайт проекта\n */\nexport const genProjectExternalLink = (url: string) => {\n\tlet link = url.startsWith('http') ? url : 'https://' + url;\n\n\tlink = link.replace(/\"/g, '%22');\n\n\treturn link;\n};\n\n/**\n * Расширяет функционал аналогичной функции в Selector2\n *\n * Добавить фильтр поиска по полям `id`, `name`, `url` в параметры API.\n * Поиск выполняется по строке `search` и по строке с инвертированной раскладкой клавиатуры.\n *\n * @param api - api, которое используется в `TopProjectSelector`\n * @param search - введенная строка поиска\n *\n * @todo Объединить с apiSetSearchParamsFilter() из @/components/formsExt/selector2/utils.ts\n */\nexport const apiSetSearchParamsFilter = (api: NonNullable<Props['api']>, search: string) => {\n\tlet filters = api.params.filters ?? [];\n\n\t// удаление других фильтров по этому полю\n\tfilters = filters.filter((filter: { name: string; }) => { return filter.name !== 'GEN_SEARCH_STRING()'; });\n\n\tconst searchInvert = invertKeyboardLayout(search);\n\tconst searchPrepared = search.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\tconst searchInvertPrepared = searchInvert.replace(/([[^$.|?*+()])/g, '\\\\$1');\n\n\tif (search) {\n\t\tfilters.push(genFieldFilter('GEN_SEARCH_STRING()', 'REGEXP', [`(${searchPrepared}|${searchInvertPrepared})`]));\n\t}\n\n\tapi.changeParams({ filters });\n};\n\n/**\n * Создать API запрос на получение списка проектов\n *\n * Данные после загрузки преобразуются с помощью `prepareProjects()`\n *\n * @see prepareProjects\n */\nexport const genApiGetProjects = (client: Api.Client<Api.TV.Paths, true>) => {\n\tconst api = client.gen('/get/projects_2/projects/', ['id', 'user_id', 'name', 'url', 'on', 'right']);\n\n\tapi.changeParams({\n\t\tfilters: [\n\t\t\tgenFieldFilter('on', 'GREATER_THAN_EQUALS', [0]),\n\t\t],\n\t\torders: [\n\t\t\tgenFieldOrder('user_id', 'DESC', [Core.state.userId]),\n\t\t\tgenFieldOrder('on', 'DESC'),\n\t\t\tgenFieldOrder('favorite', 'DESC'),\n\t\t\tgenFieldOrder('id', 'DESC'),\n\t\t],\n\t});\n\n\tapi.options.loadingShowSpinner = false;\n\n\tapi.options.onApiLoaded = (res, ctx, clientOnApiLoaded) => {\n\t\tconst isSearch = ctx.data.filters.length > 1;\n\t\tconst isFirstApiPage = ctx.data.offset === 0;\n\t\tconst isStaticRequest = ctx.data.offset === undefined;\n\n\t\t/**\n\t\t * Флаг для сброса глобального состояния заголовков\n\t\t *\n\t\t * Срабатывает при добавлении проекта или полной перезагрузке списка\n\t\t */\n\t\tconst needResetTitle = isStaticRequest || (isFirstApiPage && !isSearch);\n\n\t\t/**\n\t\t * Флаг для использования локального состояния заголовков\n\t\t *\n\t\t * Срабатывает при API-поиске проектов, чтобы не сбрасывать уже вставленные заголовки\n\t\t * В этом случае запрос содержит дополнительный search-фильтр\n\t\t */\n\t\tconst useLocalTitlesState = isSearch;\n\n\t\tres.result = prepareProjects(res.result as Project[], needResetTitle, useLocalTitlesState);\n\n\t\tclientOnApiLoaded?.(res, ctx);\n\t};\n\n\treturn api;\n};\n\n/**\n * Создать API запрос для добавления проекта\n */\nexport const genApiAddProject = (client: Api.Client<Api.TV.Paths, true>) => {\n\treturn client.gen('/add/projects_2/projects/');\n};\n","<script setup lang=\"ts\">\nimport type { PopupData, Props } from './types';\nimport { TopPopup, TopPopupListItem } from '@/components/popup/popup';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { getBaseHost } from '@/components/project/projectSelector/utils';\nimport { Core } from '@/core/app';\n\nconst props = defineProps<Props>();\n\nconst i18n = useI18n();\nconst host = getBaseHost();\n\nconst genItems = (projectItem: PopupData['projectItem']) => {\n\tconst submenuItems = [\n\t\t{\n\t\t\thref: `https://${host}/project/keywords/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_phrases,\n\t\t\ticon: '',\n\t\t\tright: '2',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/dynamics/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_dynamics,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/snapshots/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_snapshots,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/competitors/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_competitors,\n\t\t\ticon: '',\n\t\t\tright: '1',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/ai-tracker/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_aiTracker,\n\t\t\ticon: '',\n\t\t\tright: '13',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/analytics/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_analytics,\n\t\t\ticon: '',\n\t\t\tright: '5',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/broker/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_broker,\n\t\t\ticon: '',\n\t\t\tright: '6',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/sitemap/`,\n\t\t\ttitle: i18n.Audit.Sitemap_gen,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/audit/`,\n\t\t\ttitle: i18n.Common.Menu_audit,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/indexing/`,\n\t\t\ttitle: i18n.Audit.Indexing,\n\t\t\ticon: '',\n\t\t\tright: '8',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/audit/${projectItem.id}/watcher/`,\n\t\t\ttitle: i18n.Audit.Watcher,\n\t\t\ticon: '',\n\t\t\tright: '9',\n\t\t},\n\t\t{\n\t\t\thref: `https://${host}/project/settings/${projectItem.id}/`,\n\t\t\ttitle: i18n.Common.Menu_settings,\n\t\t\ticon: '',\n\t\t\tright: '2',\n\t\t},\n\t].filter(item => {\n\t\treturn !Object.entries(Core.state.closedByMod).some(([mod, closed]) => {\n\t\t\treturn closed && item.href.includes(`/${mod}/`);\n\t\t});\n\t});\n\n\tif (!projectItem.right.includes('0')) {\n\t\treturn submenuItems;\n\t}\n\n\treturn submenuItems.filter((item) => {\n\t\treturn projectItem.right[item.right] === '1';\n\t});\n};\n</script>\n\n<template>\n\t<TopPopup\n\t\t:id=\"props.id\"\n\t\tclass=\"top-projectSelectorSubmenu\"\n\t\t:notch=\"false\"\n\t\tpos=\"2\"\n\t>\n\t\t<template #contentList=\"{ data }: { data: PopupData }\">\n\t\t\t<template v-if=\"data\">\n\t\t\t\t<TopPopupListItem\n\t\t\t\t\tv-for=\"item in genItems(data.projectItem)\"\n\t\t\t\t\t:href=\"item.href\"\n\t\t\t\t\t:title=\"item.title\"\n\t\t\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t\t\t:data-right=\"item.right\"\n\t\t\t\t>\n\t\t\t\t\t{{ $core.state.isMobile ? item.title : '' }}\n\t\t\t\t</TopPopupListItem>\n\n\t\t\t\t<TopPopupListItem\n\t\t\t\t\t:href=\"data.projectItem.externalLink\"\n\t\t\t\t\t:title=\"data.projectItem.externalLink\"\n\t\t\t\t\tclass=\"top-ellipsis\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"top-ellipsis1\">\n\t\t\t\t\t\t{{ $core.state.isMobile ? data.projectItem.externalLink : '' }}\n\t\t\t\t\t</span>\n\t\t\t\t</TopPopupListItem>\n\t\t\t</template>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n@media (width >= 900px) {\n\t.top-projectSelectorSubmenu .top-popup {\n\t\tmin-width: unset;\n\t}\n\n\t.top-projectSelectorSubmenu ul {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(3, 1fr);\n\t}\n\n\t.top-projectSelectorSubmenu ul.top-popup_content li > a[data-top-icon]:before {\n\t\t--top-icon-size: 24px;\n\t\t--top-icon-width: 32px;\n\n\t\theight: var(--top-icon-width);\n\t\tmargin: 0;\n\t}\n}\n</style>\n","import type { Item } from '@/components/formsExt/selector2/types';\nimport { clearCache as SelectorClearCache } from '@/components/formsExt/selector2/cache';\n\nimport { ref, shallowRef } from 'vue';\nimport Core from '@/core/core/core';\n\nconst CACHE_KEY = 'ui_project_selector_total';\n\n/**\n * Время жизни кеша - 1 сутки\n */\nconst CACHE_TTL = 24 * 60 * 60 * 1000;\n\n/**\n * Promise текущего выполняющегося запроса на получение проектов.\n *\n * Используется для дедупликации запросов между экземплярами: если запрос уже запущен, повторные вызовы будут ждать один и тот же Promise.\n */\nexport const projectsRequest = ref<Promise<Api.ResponseSuccess<any, 'get'> | Api.ResponseError<any>> | null>(null);\n\n/**\n * Кеш списка проектов\n *\n * Используется только при `dataSource` = `static`\n * Данные синхронизируются между всеми экземплярами ProjectSelector\n *\n * @todo Добавить поддержку моков\n */\nexport const projectsCache = shallowRef<Item[]>();\n\nexport const setCacheTotal = (projectsTotal: number) => {\n\tlocalStorage.setItem(\n\t\tCACHE_KEY + ':' + Core.state.userId,\n\t\tJSON.stringify({ projectsTotal, expiresAt: Date.now() + CACHE_TTL }),\n\t);\n};\n\nexport const getCacheTotal = () => {\n\tconst raw = localStorage.getItem(CACHE_KEY + ':' + Core.state.userId);\n\tif (!raw) return;\n\n\tconst { projectsTotal, expiresAt } = JSON.parse(raw) as Record<string, number>;\n\tif (Date.now() > expiresAt) {\n\t\tlocalStorage.removeItem(CACHE_KEY + ':' + Core.state.userId);\n\n\t\treturn;\n\t}\n\n\treturn projectsTotal;\n};\n\n/**\n * Сбросить локальный кеш и кеш API `/get/projects_2/projects/`\n */\nexport const clearCache = () => {\n\tprojectsRequest.value = null;\n\tprojectsCache.value = undefined;\n\n\tlocalStorage.removeItem(CACHE_KEY + ':' + Core.state.userId);\n\n\tSelectorClearCache('/get/projects_2/projects/');\n};\n","<script setup lang=\"ts\">\nimport type { Item as SelectorItem } from '@/components/formsExt/selector2/types';\nimport type { ComponentExposed } from 'vue-component-type-helpers';\nimport type { Props, Item } from './types';\nimport type { PopupData } from './submenu/types';\nimport { computed, onMounted, ref, useId } from 'vue';\nimport Selector2 from '@/components/formsExt/selector2/selector2.vue';\nimport { validUrl } from '@/core/utils/check';\nimport { ellipsis } from '@/core/utils/string';\nimport { useI18n } from '@/core/plugins/i18n';\nimport Core from '@/core/core/core';\nimport TopPopupOpener from '@/components/popup/popup/opener/opener.vue';\nimport Submenu from './submenu/submenu.vue';\nimport { apiSetSearchParamsFilter, genApiAddProject, genApiGetProjects, genProjectItem, genLinkToProjectMod, navigateToProject } from './utils';\nimport { getCacheTotal, projectsCache, projectsRequest, setCacheTotal } from './cache';\n\nconst i18n = useI18n();\n\n/**\n * Количество проектов, при котором включается динамическая загрузка через API\n *\n * Это же значение используется как лимит при загрузке списка проектов\n */\nconst PROJECTS_TOTAL_THRESHOLD = 1000;\n\nconst props = withDefaults(defineProps<Props>(), {\n\tbuttonProps: () => {\n\t\treturn {\n\t\t\tcolor: 'theme',\n\t\t\tstyling: 'outline',\n\t\t};\n\t},\n});\n\nconst model = defineModel<NonNullable<Props['modelValue']>>({\n\tdefault: () => {\n\t\treturn {\n\t\t\tid: null,\n\t\t\tname: '',\n\t\t};\n\t},\n});\n\nconst apiGet = genApiGetProjects(props.client);\napiGet.changeParams({ limit: PROJECTS_TOTAL_THRESHOLD });\n\nconst apiAdd = genApiAddProject(props.client);\n\nconst projectsTotal = ref<number | undefined>(getCacheTotal());\nconst refSelector = ref<ComponentExposed<typeof Selector2<Item>> | null>(null);\nconst uid = useId();\n\nconst placeholder = computed(() => {\n\treturn props.placeholder ?? i18n.Projects.Select_project;\n});\n\nconst itemsForSelector = computed(() => {\n\tif (!projectsCache.value || !props.excludeProjectId) return projectsCache.value;\n\n\treturn projectsCache.value.filter((project) => project.id !== props.excludeProjectId);\n});\n\n/**\n * Источник данных для списка проектов:\n * - `static` — список проектов передан через props\n * - `api` — список загружается через HTTP (API)\n *\n * Выбор режима: `static`, если `projectsTotal` < `PROJECTS_TOTAL_THRESHOLD`, иначе `api`\n */\nconst dataSource = computed(() => {\n\tif (!projectsTotal.value && projectsTotal.value !== 0) return;\n\n\treturn projectsTotal.value < PROJECTS_TOTAL_THRESHOLD ? 'static' : 'api';\n});\n\nconst getProjects = async () => {\n\tif (!projectsRequest.value) {\n\t\tprojectsRequest.value = apiGet.call();\n\t}\n\n\tconst res = await projectsRequest.value;\n\tprojectsRequest.value = null;\n\n\treturn res;\n};\n\n/**\n * Создать новый проект, если введен валидный url\n */\nconst addProject = async (item: SelectorItem) => {\n\tconst res = await apiAdd.changeParams({\n\t\turl: item.name,\n\t\tname: item.name,\n\t}).call();\n\tif (res.errors) return;\n\n\tif (projectsCache.value && dataSource.value === 'static') {\n\t\tconst newProject = genProjectItem({\n\t\t\tid: res.result,\n\t\t\tuser_id: Core.state.userId,\n\t\t\tname: item.name,\n\t\t\turl: item.name,\n\t\t\ton: 0,\n\t\t\tright: '11111111111111111111',\n\t\t});\n\n\t\tconst firstManualUpdateProjectIndex = projectsCache.value.findIndex((project) => project.on === 0);\n\t\tprojectsCache.value = [\n\t\t\t...projectsCache.value.slice(0, firstManualUpdateProjectIndex),\n\t\t\tnewProject,\n\t\t\t...projectsCache.value.slice(firstManualUpdateProjectIndex),\n\t\t];\n\n\t\tif (projectsTotal.value) {\n\t\t\tprojectsTotal.value += 1;\n\t\t\tsetCacheTotal(projectsTotal.value);\n\t\t}\n\t}\n\n\t// Сбросить кеш popup и его API, `projectsCache` сбрасывать не нужно\n\tif (dataSource.value === 'api') refSelector.value?.resetCache(true);\n};\n\n/**\n * Загрузить данные проектов при открытии списка\n *\n * Только при `dataSource` = `static`\n *\n * При `dataSource` = `api` данные будут загружаться внутри `Selector2`\n */\nconst onOpen = async () => {\n\tif (projectsCache.value || dataSource.value === 'api') return;\n\n\tconst res = await getProjects();\n\tif (res.errors) return;\n\n\tprojectsCache.value = res.result;\n};\n\n/**\n * Инициализировать данные проектов при первом открытии списка\n * - сохранить список проектов и их общее количество в кеше (на сутки или до сброса)\n * - при `dataSource` = `static` сразу записать полученные проекты в список\n *\n * Если `projectsTotal` уже получен из кеша, загрузка списка проектов произойдет при открытии списка\n */\nconst initProjects = async () => {\n\tif (!projectsTotal.value) {\n\t\tconst res = await getProjects();\n\t\tif (res.errors) return;\n\n\t\tprojectsTotal.value = res.total ?? undefined;\n\t\tif (!projectsCache.value && dataSource.value !== 'api') projectsCache.value = res.result;\n\n\t\tif (projectsTotal.value) setCacheTotal(projectsTotal.value);\n\t} else {\n\t\t/**\n\t\t * Спекулятивное выполнение загрузки проектов\n\t\t *\n\t\t * UX: Отзывчивость\n\t\t */\n\t\tconst elPopupOpenel = refSelector.value?.popupOpenerRef?.$el;\n\t\tif (elPopupOpenel) {\n\t\t\telPopupOpenel.addEventListener('pointerenter', () => onOpen(), { once: true });\n\t\t}\n\t}\n};\n\nonMounted(async () => {\n\tawait initProjects();\n});\n</script>\n\n<template>\n\t<Selector2\n\t\t:key=\"dataSource ?? 'dummy'\"\n\t\tref=\"refSelector\"\n\t\tclass=\"top-projectSelector\"\n\t\t:modelValue=\"model\"\n\t\t@update:modelValue=\"!menuMode ? model = $event : navigateToProject($event.id)\"\n\t\t:items=\"itemsForSelector\"\n\t\t:itemsIsLoading=\"dataSource === 'static' && projectsCache === undefined\"\n\t\t:title=\"$i18n.Projects.Search_projects\"\n\t\t:modificator\n\t\t:searchFields=\"['id', 'name', 'url']\"\n\t\t:placeholder\n\t\thasCloserBtn\n\t\t:api=\"dataSource === 'api' ? apiGet : undefined\"\n\t\t:apiSetSearchParams=\"dataSource === 'api' ? (...args: any) => apiSetSearchParamsFilter(...args) : undefined\"\n\t\tuseCache\n\t\tappendSearchToResult\n\t\tappendSearchAllowDuplicate\n\t\t:appendSearchToResultCond=\"validUrl\"\n\t\tappendWithoutSelect\n\t\t:buttonProps=\"{...buttonProps, isProgress:!dataSource, disabled:!dataSource}\"\n\t\t:openerShortcut\n\t\t@appendItem=\"addProject\"\n\t\t@open=\"onOpen\"\n\t>\n\t\t<template #item=\"{ item }\">\n\t\t\t<div class=\"top-projectSelector_itemText\">\n\t\t\t\t<template v-if=\"item.id\">\n\t\t\t\t\t{{ ellipsis(item.name, 20) }}\n\t\t\t\t\t<span class=\"top-comment\">\n\t\t\t\t\t\t\tid {{ item.id }}\n\t\t\t\t\t\t</span>\n\t\t\t\t</template>\n\n\t\t\t\t<template v-else>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"!item.listItemProps?.type\"\n\t\t\t\t\t\tclass=\"top-comment\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $i18n.Projects.Add_project }}:\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"item.id\">\n\t\t\t\t<a\n\t\t\t\t\tv-if=\"menuMode\"\n\t\t\t\t\tclass=\"top-projectSelector_itemLink\"\n\t\t\t\t\t:href=\"genLinkToProjectMod(item.id)\"\n\t\t\t\t></a>\n\n\t\t\t\t<TopButton\n\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t:href=\"item.externalLink\"\n\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t@click.stop\n\t\t\t\t></TopButton>\n\n\t\t\t\t<!-- @vue-generic {PopupData} -->\n\t\t\t\t<TopPopupOpener\n\t\t\t\t\t:id=\"uid\"\n\t\t\t\t\t:pos=\"'2'\"\n\t\t\t\t\t:notch=\"false\"\n\t\t\t\t\t:data=\"{ projectItem: item } satisfies PopupData\"\n\t\t\t\t>\n\t\t\t\t\t<TopButton\n\t\t\t\t\t\tclass=\"top-popup_listMore\"\n\t\t\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\t></TopButton>\n\t\t\t\t</TopPopupOpener>\n\t\t\t</template>\n\t\t</template>\n\t</Selector2>\n\n\t<Submenu :id=\"uid\"/>\n</template>\n\n<style>\n.top-projectSelector .top-popup {\n\twidth: 278px;\n}\n\n.top-projectSelector_itemLink {\n\tposition: absolute;\n\tinset: 0;\n}\n\n.top-projectSelector_itemText {\n\tflex-grow: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-1);\n}\n\n.top-projectSelector_item > .top-button {\n\topacity: 0;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.top-projectSelector_item:hover > .top-button,\n.top-projectSelector_item.top-active > .top-button {\n\topacity: 1;\n}\n\n@media screen and (min-width: 900px) {\n\t/* Ограничиваем стандартную высоту popup */\n\t.top-projectSelector.p3 div.top-popup {\n\t\tmax-height: min(calc(var(--top-popup-bottom) - 16px), 800px);\n\t}\n}\n\n@media screen and (max-width: 900px) {\n\t.top-projectSelector_item > .top-button {\n\t\topacity: 1;\n\t}\n}\n</style>\n","import type { Props as TagSelectorOpenerProps } from '../popupOpener/types';\nimport type { Tag, TagIdExclude } from '../types';\n\n/**\n * Полуичить значение исключения тега tagId\n */\nexport const genTagIdExcluded = (tagId: Tag['id']): TagIdExclude => {\n\treturn '-' + tagId as TagIdExclude;\n};\n\n/**\n * Вернуть чистый tagId без exclude флага\n */\nexport const genTagIdClear = (tagId: Tag['id'] | TagIdExclude) => {\n\tif (tagId[0] === '-') return tagId.substring(1) as Tag['id'];\n\n\treturn tagId as Tag['id'];\n};\n\n/**\n * Получить инфомрацию о теге по его id\n */\nexport const getTagById = (tagId: Tag['id'] | TagIdExclude, tags: TagSelectorOpenerProps['tags']) => {\n\ttagId = genTagIdClear(tagId);\n\n\tconst tag = tags.find(tag => tag.id === tagId);\n\tif (!tag) return;\n\n\treturn tag;\n};\n","import { isRef, type Ref, ref, unref, watch } from 'vue';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { storage } from '@/core/utils/dom';\nimport TopPopupWorker from '@/components/popup/lib/worker';\nimport type { OpenerProps as PopupOpenerProps } from '@/components/popup/popup/opener/types';\nimport type { Props as TagSelectorOpenerProps, TagSelectorTarget } from '../popupOpener/types';\nimport type { Props as TagIconProps } from '../tagIcon/types';\nimport { genTagIdClear, getTagById } from './utils';\n\n/**\n * Сгенерировать элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelectorPopupOpener для работы вне vue\n *\n * Требует монтирования компонента TopTagSelector\n */\nexport const genElPopupOpener = (\n\tprops: TagSelectorOpenerProps & { modelValue: TagSelectorOpenerProps['modelValue'] | Ref<TagSelectorOpenerProps['modelValue']> },\n\tpropsPopup?: Partial<PopupOpenerProps>,\n\thtmlSetterSeveral?: string,\n): HTMLElement => {\n\tif (!propsPopup) propsPopup = { id: props.id };\n\n\t// Значения по умолчанию см. в: `@/components/popup/popup/opener/opener.vue`\n\tpropsPopup.id = props.id;\n\tpropsPopup.pos ??= '3';\n\tpropsPopup.notch ??= true;\n\tpropsPopup.posBy ??= 'fixed';\n\n\tconst el = TopPopupWorker.genElPopupOpener('div', propsPopup as PopupOpenerProps);\n\n\tel.classList.add('top-tagSelector');\n\tif (props.useTopButton) el.classList.add('top-tagSelector-useTopButton', 'top-button', 'top-color_theme', 'top-as-selector');\n\tif (!props.useTopButton) el.classList.add('top-tagSelector-custom');\n\tif (props.mode === 'filter') el.classList.add('top-tagSelector-filter');\n\tif (props.mode === 'setter' && !props.filters) el.classList.add('top-tagSelector-setter_single');\n\tif (props.mode === 'setter' && props.filters) el.classList.add('top-tagSelector-setter_several');\n\n\t// прокcи клик: lazy connect\n\tel.onclick = (e) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tel.onclick = null;\n\n\t\tconst model = ref(props.modelValue);\n\n\t\tconst target: TagSelectorTarget = {\n\t\t\tmodel,\n\t\t\tmode: props.mode,\n\t\t\ttargetId: props.targetId,\n\t\t\tfilters: props.filters,\n\t\t\tpayload: props.payload,\n\t\t};\n\n\t\tstorage(el, 'topTagSelectorTarget', target);\n\n\t\tdelete el.dataset.topPopupDisabled;\n\n\t\tif (!isRef(props.modelValue)) {\n\t\t\twatch(model, () => {\n\t\t\t\tprops.modelValue = model.value;\n\n\t\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t\t});\n\t\t}\n\n\t\t// выполнение клика\n\t\tel.click();\n\t};\n\n\tif (isRef(props.modelValue)) {\n\t\twatch(props.modelValue, () => elPopupOpenerRender(el, props, htmlSetterSeveral));\n\t} else {\n\t\tstorage(el, 'topTagSelectorRender', (modelValue: TagSelectorOpenerProps['modelValue']) => {\n\t\t\tprops.modelValue = modelValue;\n\n\t\t\tconst target = storage(el, 'topTagSelectorTarget');\n\t\t\tif (target) target.model.value = modelValue;\n\n\t\t\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\t\t});\n\t}\n\n\telPopupOpenerRender(el, props, htmlSetterSeveral);\n\n\treturn el;\n};\n\n/**\n * Вызвать перерисовку элемента, который был создан через genElPopupOpener()\n *\n * Работет только для элементов не с реактивным modelValue\n */\nexport const renderElPopupOpener = (el: HTMLElement, modelValue: TagSelectorOpenerProps['modelValue']) => {\n\tstorage(el, 'topTagSelectorRender')?.(modelValue);\n};\n\n/**\n * Отрисовать TopTagSelecorPopupOpener\n */\nconst elPopupOpenerRender = (el, props: TagSelectorOpenerProps, htmlSetterSeveral?: string) => {\n\tconst tagsIds = unref(props.modelValue);\n\n\tel.classList.toggle('top-tagSelector-selectedOne', !tagsIds.length || tagsIds.length === 1);\n\tel.classList.toggle('top-tagSelector-toTwoLine', tagsIds.length > 5);\n\n\tif (props.mode === 'setter' && props.filters) {\n\t\tel.innerHTML = `<div>${htmlSetterSeveral}</div>`;\n\n\t\treturn;\n\t}\n\n\tel.innerHTML = '';\n\n\tif (!tagsIds.length && props.mode === 'filter') {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: 'all',\n\t\t\tcolorId: '',\n\t\t\tname: useI18n().Common?.All_tags ?? '',\n\t\t\tstate: '',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t}\n\n\ttagsIds.forEach(tagId => {\n\t\tconst elTagIcon = genElTagIcon({\n\t\t\tid: genTagIdClear(tagId),\n\t\t\tcolorId: getTagById(tagId, props.tags)?.color_id ?? '',\n\t\t\tname: getTagById(tagId, props.tags)?.name ?? '',\n\t\t\tstate: genTagIdClear(tagId) === tagId ? 'selected' : 'excluded',\n\t\t});\n\n\t\tel.append(elTagIcon);\n\t});\n};\n\n/**\n * Сгенерировтаь элемент для открытия popup с выбором тегов\n *\n * Альтернатива TopTagSelecorTagIcon для работы вне vue\n */\nconst genElTagIcon = (props: TagIconProps) => {\n\tconst el = document.createElement('div');\n\n\tel.classList.add('top-tagSelector_tagIcon');\n\tel.classList.toggle('top-tagSelector-active', !!props.state);\n\tel.classList.toggle('top-tagSelector-excluded', props.state === 'excluded');\n\n\tel.dataset.tag_id = props.id;\n\tel.dataset.tag_color_id = props.colorId;\n\tel.title = props.name;\n\n\treturn el;\n};\n","import type { Tag } from './types';\n\nexport default [\n\t{\n\t\tid: '1',\n\t\tname: 'Without Tag',\n\t\tcolor_id: '1',\n\t},\n\t{\n\t\tid: '2',\n\t\tname: 'Red',\n\t\tcolor_id: '2',\n\t},\n\t{\n\t\tid: '3',\n\t\tname: 'Orange',\n\t\tcolor_id: '3',\n\t},\n\t{\n\t\tid: '4',\n\t\tname: 'Yellow',\n\t\tcolor_id: '4',\n\t},\n\t{\n\t\tid: '5',\n\t\tname: 'Blue',\n\t\tcolor_id: '5',\n\t},\n\t{\n\t\tid: '6',\n\t\tname: 'Purple',\n\t\tcolor_id: '6',\n\t},\n\t{\n\t\tid: '7',\n\t\tname: 'Green',\n\t\tcolor_id: '7',\n\t},\n\t{\n\t\tid: '8',\n\t\tname: 'Magenta',\n\t\tcolor_id: '8',\n\t},\n\t{\n\t\tid: '9',\n\t\tname: 'Dark blue',\n\t\tcolor_id: '9',\n\t},\n\t{\n\t\tid: '10',\n\t\tname: 'Turquoise',\n\t\tcolor_id: '10',\n\t},\n] as Tag[];\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\ndefineProps<Props>();\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagIcon': true,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded',\n\t\t}\"\n\t\t:data-tag_id=\"id\"\n\t\t:data-tag_color_id=\"colorId\"\n\t\t:title=\"name\"\n\t></div>\n</template>\n\n<style>\n[data-tag_id] { display: inline-flex; gap: var(--top-gap-2); align-items: center; }\n\n[data-tag_id=\"\"] { border-color: #bdc3c7 !important; color: #55555F !important; }\n[data-tag_color_id=\"1\"] { border-color: var(--color-tag-1) !important; color: #55555F !important; }\n[data-tag_color_id=\"2\"] { border-color: var(--color-tag-2) !important; color: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"] { border-color: var(--color-tag-3) !important; color: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"] { border-color: var(--color-tag-4) !important; color: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"] { border-color: var(--color-tag-5) !important; color: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"] { border-color: var(--color-tag-6) !important; color: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"] { border-color: var(--color-tag-7) !important; color: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"] { border-color: var(--color-tag-8) !important; color: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"] { border-color: var(--color-tag-9) !important; color: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"] { border-color: var(--color-tag-10) !important; color: var(--color-tag-10) !important; }\n\n[data-tag_id=\"\"].top-tagSelector-active { background: #bdc3c7 !important; }\n[data-tag_color_id=\"1\"].top-tagSelector-active { background: var(--color-tag-1) !important; }\n[data-tag_color_id=\"2\"].top-tagSelector-active { background: var(--color-tag-2) !important; }\n[data-tag_color_id=\"3\"].top-tagSelector-active { background: var(--color-tag-3) !important; }\n[data-tag_color_id=\"4\"].top-tagSelector-active { background: var(--color-tag-4) !important; }\n[data-tag_color_id=\"5\"].top-tagSelector-active { background: var(--color-tag-5) !important; }\n[data-tag_color_id=\"6\"].top-tagSelector-active { background: var(--color-tag-6) !important; }\n[data-tag_color_id=\"7\"].top-tagSelector-active { background: var(--color-tag-7) !important; }\n[data-tag_color_id=\"8\"].top-tagSelector-active { background: var(--color-tag-8) !important; }\n[data-tag_color_id=\"9\"].top-tagSelector-active { background: var(--color-tag-9) !important; }\n[data-tag_color_id=\"10\"].top-tagSelector-active { background: var(--color-tag-10) !important; }\n\n[data-tag_id=\"all\"] {\n\tborder-color: transparent !important; background: none !important;\n}\n\n[data-tag_id=\"all\"]:before {\n\tcontent: \"\";\n\tcolor: var(--color-tag-all) !important;\n\tfont-size: 26px;\n\tmin-width: calc(100% + 4px);\n\theight: calc(100% + 4px);\n\tmargin-top: -18px;\n\tmargin-left: -8px;\n}\n\n/* в кнопке выбора тэгов и в popup */\n.top-tagSelector-useTopButton [data-tag_id],\n.top-tagSelector_popup [data-tag_id] {\n\t--top-tag-selector-size: 10px;\n\n\tbox-sizing: content-box;\n\tborder-radius: 100%; border: 2px solid var(--color-layout-front-1); background: var(--color-layout-front-1);\n\twidth: var(--top-tag-selector-size);\n\theight: var(--top-tag-selector-size);\n\tfont-size: calc(var(--top-tag-selector-size) + 4px);\n\t/*font-family: inherit !important;*/\n}\n\n/* исключение тегов */\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id],\n[data-tag_id].top-tagSelector-excluded { position: relative; }\n\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:before,\n[data-tag_id].top-tagSelector-excluded:before {\n\tcontent: \"\";\n\twidth: calc(var(--top-tag-selector-size) * 2); height: 1px; background: inherit;\n\ttransform: rotate(-45deg); filter: brightness(80%);\n\tdisplay: block;\n\tposition: absolute; top: calc(var(--top-tag-selector-size) / 2); left: calc(0px - var(--top-tag-selector-size) / 2);\n}\n.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:not([data-tag_id=\"all\"]):not(.top-tagSelector-active):before { background: #AAA; }\n[data-tag_id].top-tagSelector-excluded:after,\n[data-tag_id].top-tagSelector-excluded ~ .top-tagSelector_tagListItemName { text-decoration: line-through; }\n\n/* popup */\n.top-popup_listItem.top-tagSelector-active { background: var(--top-popup-background-color-active) !important; }\n\n.top-popup_listItem:hover [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-hover); }\n.top-popup_listItem.top-tagSelector-active [data-tag_id=\"all\"]:before,\n.top-popup_listItem.top-active [data-tag_id=\"all\"]:before { border-color: var(--top-popup-background-color-active); }\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\nimport TopPopupListItem from '@/components/popup/popup/listItem.vue';\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst name = defineModel<Props['name']>('name', {\n\trequired: true,\n});\n\nconst elName = ref<HTMLElement | null>(null);\n\n/**\n * @todo Удалить через пол года после выхода версии firefox с поддержкой contenteditable plaintext-only, включая бета версии\n */\nconst firefoxProps = computed(() => {\n\tif (navigator.userAgent.indexOf('Firefox') != -1) {\n\n\t\treturn {\n\t\t\tcontenteditable: inEdit.value,\n\t\t\tonpaste: (event: Event) => event.preventDefault(),\n\t\t};\n\t}\n\n\treturn {};\n});\n\n/**\n * Включен режим редактирвоания\n */\nconst inEdit = ref(false);\n\n/**\n * Включить режим редактирование\n */\nconst turnToEdit = async () => {\n\tinEdit.value = true;\n\n\tawait nextTick();\n\n\telName.value?.focus();\n};\n\n/**\n * Применить редактирование\n */\nconst editCommit = () => {\n\tconst name = elName.value?.innerText;\n\tif (!name) return editCancel();\n\n\tif (elName.value) elName.value.innerText = name;\n\n\tinEdit.value = false;\n\n\temit('update:name', name);\n};\n\n/**\n * Отменить редактирование\n */\nconst editCancel = async () => {\n\tif (elName.value) elName.value.innerText = props.name;\n\n\tinEdit.value = false;\n};\n\n/**\n * Применить выбор\n */\nconst changeSelect = (e: MouseEvent) => {\n\t// в режиме редактирования выбор не применяется\n\tif (inEdit.value) return;\n\n\t// тег запрещено выбирать\n\tif (props.disabled) return;\n\n\tlet toState: Props['state'] = 'selected';\n\n\tif (props.canExclude) {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\ttoState = 'excluded';\n\t\t}\n\t}\n\n\tif (props.state == toState) {\n\t\ttoState = '';\n\t}\n\n\tif (toState === '') emit('unselect');\n\tif (toState === 'selected') emit('select');\n\tif (toState === 'excluded') emit('exclude');\n};\n</script>\n\n<template>\n\t<TopPopupListItem\n\t\t:class=\"{\n\t\t\t'top-tagSelector_tagListItem': true,\n\t\t\t'top-tagSelector_tagListItem-inEdit': inEdit,\n\t\t\t'top-tagSelector_tagListItem-disabled': disabled,\n\t\t\t'top-tagSelector_tagListItem-canExclude': canExclude,\n\t\t\t'top-tagSelector-active': !!state,\n\t\t\t'top-tagSelector-excluded': state === 'excluded'\n\t\t}\"\n\t\t@click.stop=\"changeSelect\"\n\t>\n\t\t<TopTagIcon\n\t\t\t:id\n\t\t\t:name\n\t\t\t:colorId\n\t\t\t:state\n\t\t/>\n\n\t\t<span\n\t\t\tref=\"elName\"\n\t\t\tclass=\"top-tagSelector_tagListItemName\"\n\t\t\t:contenteditable=\"inEdit ? 'plaintext-only' : false\"\n\t\t\t:=\"firefoxProps\"\n\t\t\t@keydown.enter.stop=\"editCommit\"\n\t\t\t@keydown.esc.stop=\"editCancel\"\n\t\t>\n\t\t\t{{ name }}\n\t\t</span>\n\n\t\t<template v-if=\"editable\">\n\t\t\t<span\n\t\t\t\tv-if=\"!inEdit\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click=\"turnToEdit\"\n\t\t\t></span>\n\n\t\t\t<span\n\t\t\t\tv-else\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\tclass=\"top-tagSelector_edit\"\n\t\t\t\t@click.stop=\"editCommit\"\n\t\t\t></span>\n\t\t</template>\n\t</TopPopupListItem>\n</template>\n\n<style>\n.top-tagSelector_tagListItem.top-popup_listItem {\n\tpadding-top: var(--top-padding-2) !important;\n\tpadding-bottom: var(--top-padding-2) !important;\n\tgap: 10px;\n}\n\n.top-tagSelector_tagListItemName {\n\tborder-radius: var(--top-radius-1);\n\twidth: 120px;\n\tpadding: 4px 2px;\n\tmargin: -4px -2px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tflex-grow: 1;\n}\n\n/* редактирование */\n.top-tagSelector_edit {\n\t--top-icon-size: 18px;\n\t--top-icon-color: var(--color-text-3);\n\n\twidth: 20px;\n\tflex-grow: 0;\n}\n\n.top-tagSelector_edit:before {\n\tline-height: 0;\n}\n\n.top-tagSelector_edit { opacity: 0; }\n.top-tagSelector_edit:hover {\n\t--top-icon-color: var(--color-text-primary);\n}\n\n.top-tagSelector_tagListItem:hover .top-tagSelector_edit,\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_edit {\n\tcursor: pointer;\n\topacity: 1;\n}\n\n.top-tagSelector_tagListItem-inEdit {\n\tbackground: var(--color-layout-front-3) !important;\n\toutline: 1px dashed var(--color-line-2);\n\toutline-offset: -1px;\n}\n\n.top-tagSelector_tagListItem-inEdit .top-tagSelector_tagListItemName {\n\tcursor: text;\n\tbackground: var(--color-layout-front-1);\n}\n\n/* disabled */\n.top-tagSelector_tagListItem-disabled {\n\tcursor: not-allowed !important;\n\topacity: 0.85;\n}\n.top-tagSelector_tagListItem-disabled:hover {\n\tbackground: inherit;\n}\n.top-tagSelector_tagListItem-disabled [data-tag_id] {\n\topacity: 0.6;\n}\n</style>\n","top-forms-focusable top-size_s top-button-withoutText top-tagSelector-useTopButton\n\n<script setup lang=\"ts\">\nimport type { Props, TagSelectorTarget } from './types';\nimport TopPopupOpener from '@/components/popup/popup/opener/opener.vue';\nimport TopButton from '@/components/forms/button/button.vue';\nimport { genTagIdClear, getTagById } from '../utils/utils';\nimport TopTagIcon from '../tagIcon/tagIcon.vue';\n\ndefineOptions({\n\tinheritAttrs: false,\n});\n\nconst props = defineProps<Props>();\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst component = props.useTopButton ? TopButton : 'div';\nconst componentSlotName = props.useTopButton ? 'html' : 'default';\n\nconst topTagSelectorTarget: TagSelectorTarget = {\n\tmodel,\n\tmode: props.mode,\n\ttargetId: props.targetId,\n\tfilters: props.filters,\n\tpayload: props.payload,\n};\n</script>\n\n<template>\n\t<TopPopupOpener :id>\n\t\t<component\n\t\t\t:is=\"component\"\n\t\t\t:class=\"{\n\t\t\t\t'top-tagSelector': true,\n\t\t\t\t'top-tagSelector-useTopButton': props.useTopButton,\n\t\t\t\t'top-tagSelector-custom': !props.useTopButton,\n\t\t\t\t'top-as-selector': props.useTopButton,\n\t\t\t\t'top-tagSelector-filter': props.mode === 'filter',\n\t\t\t\t'top-tagSelector-setter_single': props.mode === 'setter' && !filters,\n\t\t\t\t'top-tagSelector-setter_several': props.mode === 'setter' && filters,\n\t\t\t\t'top-tagSelector-selectedOne': !model.length || model.length === 1,\n\t\t\t\t'top-tagSelector-toTwoLine': model.length > 5,\n\t\t\t}\"\n\t\t\tcolor=\"theme\"\n\t\t\t:styling\n\t\t\tv-top-data:topTagSelectorTarget=\"topTagSelectorTarget\"\n\t\t\t:=$attrs\n\t\t>\n\t\t\t<template #[componentSlotName]>\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-if=\"!model.length && mode === 'filter'\"\n\t\t\t\t\tid=\"all\"\n\t\t\t\t\tcolorId=\"\"\n\t\t\t\t\t:name=\"$i18n.Common.All_tags ?? ''\"\n\t\t\t\t\tstate=\"\"\n\t\t\t\t/>\n\n\t\t\t\t<!-- Массовое редактирование -->\n\t\t\t\t<div v-if=\"mode === 'setter' && filters\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Список тегов -->\n\t\t\t\t<TopTagIcon\n\t\t\t\t\tv-else\n\t\t\t\t\tv-for=\"tagId in model\"\n\t\t\t\t\t:id=\"genTagIdClear(tagId)\"\n\t\t\t\t\t:colorId=\"getTagById(tagId, tags)?.color_id ?? ''\"\n\t\t\t\t\t:name=\"getTagById(tagId, tags)?.name ?? ''\"\n\t\t\t\t\t:state=\"genTagIdClear(tagId) === tagId ? 'selected' : 'excluded'\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</component>\n\t</TopPopupOpener>\n</template>\n\n<style>\n.top-tagSelector {\n\tcursor: pointer;\n\tmin-width: 0;\n\twhite-space: nowrap;\n\tjustify-content: left;\n}\n\n.top-tagSelector-useTopButton {\n\twidth: 118px;\n\tgap: var(--top-gap-1);\n\tvertical-align: middle;\n}\n\n.top-tagSelector.top-button.top-as-selector {\n\twidth: calc(118px + 8px);\n}\n\n/* все теги в фильтре */\n.top-tagSelector-useTopButton [data-tag_id=\"all\"]:before {\n\tmargin-right: 6px;\n}\n\n/* фильтр по одному тегу */\n.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id]:after {\n\tcontent: attr(title);\n\tmargin-left: 20px;\n\tmin-width: 74px;\n\ttext-align: left;\n\tline-height: 1.2;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n\n.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id=\"all\"]:after {\n\tmargin-left: 0;\n}\n\n/* фильтр по многим тегам */\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine {\n\tflex-wrap: wrap;\n\talign-content: center;\n}\n\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id] {\n\t--top-tag-selector-size: 8px;\n}\n\n.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id]:nth-child(5) {\n\tmargin-right: 4px;\n}\n\n/* установка тегов */\n.top-tagSelector-useTopButton.top-tagSelector-setter_several,\n.top-tagSelector-useTopButton.top-tagSelector-setter_several.top-as-selector{\n\twidth: auto;\n}\n\n.top-tagSelector-custom {\n\tposition: relative;\n\tdisplay: flex !important; flex-direction: column; flex-wrap: wrap; align-items: stretch !important;\n}\n\n.top-tagSelector-custom [data-tag_id] {\n\twidth: auto; min-height: 20%; min-width: 50%;\n\tflex: 1 1 auto;\n}\n</style>\n","<script setup lang=\"ts\">\n/* global $ */\n\nimport { computed, reactive, ref, shallowRef, watch } from 'vue';\n\nimport Core from '@/core/core/core';\nimport { useI18n } from '@/core/plugins/i18n';\nimport { storage } from '@/core/utils/dom';\nimport { debounce } from '@/core/utils/lodash';\n\nimport type { Option } from '@/components/forms/select/types';\nimport TopSelect from '@/components/forms/select/select.vue';\n\nimport TopButton from '@/components/forms/button/button.vue';\n\nimport type { PopupEvent } from '@/components/popup/popup/types';\nimport TopPopup from '../../popup/popup/popup.vue';\nimport TopPopupListItem from '../../popup/popup/listItem.vue';\n\nimport type { Emits, FiltersAction, Props, Tag } from './types';\nimport tagsDefaults from './tagsDefaults';\nimport { genTagIdExcluded } from './utils/utils';\n\nimport type { Props as TagListItemProps } from './popupListItem/types';\nimport TopTagListItem from './popupListItem/tagPopupListItem.vue';\n\nimport type { TagSelectorTarget } from './popupOpener/types';\nimport TopTagSelectorPopupOpener from './popupOpener/popupOpener.vue';\n\nconst i18n = useI18n();\n\nconst props = withDefaults(defineProps<Props>(), {\n\ttagsMax: 10,\n\trequiredForSetter: true,\n\temitDelay: 500,\n\tuseTopButton: true,\n});\n\n/**\n * Выбранные теги кнопки в этом компоненте\n *\n * Редактирвоание ведется только через `editTarget.model`\n */\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n/**\n * Список тегов\n */\nconst tags = defineModel<Tag[]>('tags', {\n\tdefault: reactive(tagsDefaults),\n});\n\nconst emit = defineEmits<Emits>();\n\nconst emitDebounce: typeof emit = debounce((name, e) => {\n\temit(name, e);\n}, props.emitDelay);\n\n// требуется сразу указать один тег\nif (props.singleMode && !model.value.length) {\n\tmodel.value = [tags.value[0].id];\n}\n\nconst id = props.id ?? 'top-popup-id-' + Math.random() + '';\n\nconst filtersAction = ref<FiltersAction>('add');\n\n/**\n * Сгенерировать опции для выбора дейсвтия массого редактирования\n */\nconst genFiltersActionOptions = () => {\n\tconst tagsText = ' ' + i18n.Common.Tags?.toLowerCase();\n\n\tconst res = new Map<FiltersAction, Option>();\n\tres.set('add', { value: 'add', title: i18n.Common.Add + tagsText });\n\tres.set('replace', { value: 'replace', title: i18n.Common.Replace + tagsText });\n\tres.set('delete', { value: 'delete', title: i18n.Common.Delete + tagsText });\n\n\treturn res;\n};\n\n/**\n * Целевой объект редактирования тегов\n *\n * Определяется кнопкой, которая открыла popup выбора тегов\n */\nconst target = shallowRef<TagSelectorTarget>({\n\tmodel,\n\tmode: 'filter',\n\ttargetId: undefined,\n\tfilters: undefined,\n\tpayload: undefined,\n});\n\nwatch(model, () => {\n\temitDebounce('selector', model.value);\n});\n\n/**\n * Можно ли выбрать еще теги\n */\nconst disabled = computed(() => {\n\tif (target.value.mode !== 'setter') return;\n\n\tif (!props.maxTagsForSetter) return;\n\n\t// массовая смена тегов, количество тегов в результате узнать невозможно\n\tif (target.value.filters) return;\n\n\treturn target.value.model.value.length >= props.maxTagsForSetter;\n});\n\nconst genTargetTagState = (tagId: Tag['id'] | 'all'): TagListItemProps['state'] => {\n\tif (tagId !== 'all') {\n\t\tif (target.value.model.value.includes(tagId)) return 'selected';\n\n\t\tif (target.value.model.value.includes(genTagIdExcluded(tagId))) return 'excluded';\n\t}\n\n\t// Все теги, ни один из тегов не выбран\n\tif (tagId === 'all' && !target.value.model.value.length) return 'selected';\n\n\treturn '';\n};\n\nconst updateTargetModel = (tagId: Tag['id'], action: 'unselect' | 'select' | 'exclude') => {\n\tconst tagIdExcluded = genTagIdExcluded(tagId);\n\n\tlet tagsIds = target.value.model.value.filter(modelTagId => modelTagId !== tagId && modelTagId !== tagIdExcluded);\n\n\tif (action === 'select') tagsIds.push(tagId);\n\tif (action === 'exclude') tagsIds.push(tagIdExcluded);\n\n\t// режим редактирвоания тегов одного объекта с требованием указать хотя бы один тег\n\tif (target.value.mode === 'setter' && target.value.targetId !== undefined && props.requiredForSetter) {\n\t\t// нельзя снимать выделение со всех тегов\n\t\tif (!tagsIds.length) {\n\t\t\ttagsIds.push('1');\n\t\t}\n\n\t\t// при первом выборе сразу снять тег \"Без тега\"\n\t\tif (tagsIds.length === 2 && target.value.model.value.length === 1 && target.value.model.value[0] === '1') {\n\t\t\ttagsIds = tagsIds.filter((tagId) => tagId !== '1');\n\t\t}\n\t}\n\n\t// режим выбора одного тега\n\tif (props.singleMode && !target.value.filters) {\n\t\t// нужно указать хотя бы один тег\n\t\tif (!tagsIds.length) {\n\t\t\ttagsIds = target.value.model.value;\n\t\t}\n\n\t\tif (tagsIds.length > 1) {\n\t\t\ttagsIds = [tagsIds[tagsIds.length - 1]];\n\t\t}\n\t}\n\n\t// всегда выводить теги в порядке, указанном в настройках tags\n\ttagsIds.sort((a, b) => {\n\t\tif (!props.tags) return 0;\n\n\t\tconst aIndex = props.tags.findIndex((tag) => tag.id === a);\n\t\tconst bIndex = props.tags.findIndex((tag) => tag.id === b);\n\n\t\treturn aIndex - bIndex;\n\t});\n\n\ttarget.value.model.value = tagsIds;\n\n\tif (target.value.mode === 'setter' && target.value.targetId !== undefined) {\n\t\temitDebounce('setter', {\n\t\t\ttagsIds: tagsIds as Tag['id'][],\n\t\t\ttargetId: target.value.targetId,\n\t\t\tpayload: target.value.payload,\n\t\t});\n\t}\n};\n\nconst classString = computed(() => {\n\tlet res = 'top-tagSelector_popup';\n\n\tif (target.value.mode === 'filter') res += ' top-tagSelector_popup-filter';\n\tif (target.value.mode === 'setter') res += ' top-tagSelector_popup-setter';\n\n\treturn res;\n});\n\n/**\n * Добавить тег\n */\nconst addTag = () => {\n\tconst tagName = prompt('', 'New tag');\n\tif (!tagName || tagName === 'New tag') return;\n\n\tconst tagId = tags.value.length + 1;\n\n\ttags.value.push({\n\t\tid: String(tagId) as Tag['id'],\n\t\tname: tagName,\n\t\tcolor_id: String((tagId - 1) % 10 + 1) as Tag['color_id'],\n\t});\n\n\temit('tagsChanged', tags.value);\n};\n\nconst onOpen = (popupEvent: PopupEvent) => {\n\t// popup открыт другой кнопкой c другим modelValue, для редактирвоания объектов\n\ttarget.value = storage(popupEvent.elPopupOpener, 'topTagSelectorTarget');\n\tif (!target.value) throw new Error('Open popup TopTagSelector required v-data:topTagSelectorTarget');\n\n\t// при начале массовой установки тегов сбросить состояние формы\n\tif (target.value.filters) {\n\t\tfiltersAction.value = 'add';\n\t\ttarget.value.model.value = [];\n\t}\n\n\tif (!Core.$?.ui['sortable']) {\n\t\tconsole.info('Для работы сортировки требуется глобальная загрузка jQuery UI Sortable');\n\n\t\treturn;\n\t}\n\n\tif (!Core.state.isMobile && !Core.state.isMobileUA && tags.value) {\n\t\t$(popupEvent.elPopup).sortable({\n\t\t\titems: 'li:has([data-tag_id]:not([data-tag_id=\"all\"]))',\n\n\t\t\t/**\n\t\t\t * @todo Удалить `[contenteditable=\"true\"]` через пол года после выхода версии firefox с поддержкой contenteditable plaintext-only, включая бета версии\n\t\t\t */\n\t\t\tcancel: '[contenteditable=\"plaintext-only\"], [contenteditable=\"true\"]',\n\n\t\t\tdistance: 10,\n\t\t\tstop: function (_e, ui) {\n\t\t\t\tif (!tags.value) return;\n\n\t\t\t\tconst $tags = $(ui.item).parent().find('[data-tag_id]');\n\n\t\t\t\tconst tagsSorted: Tag['id'][] = [];\n\t\t\t\t$tags.each((_index, elTag) => {\n\t\t\t\t\tif (!tags.value) return;\n\n\t\t\t\t\tconst tagId = $(elTag).attr('data-tag_id') as Tag['id'];\n\t\t\t\t\ttagsSorted.push(tagId);\n\t\t\t\t});\n\n\t\t\t\ttags.value.sort((tagIdA, tagIdB) => {\n\t\t\t\t\tconst a = tagsSorted.findIndex(tagSorted => tagSorted === tagIdA.id);\n\t\t\t\t\tconst b = tagsSorted.findIndex(tagSorted => tagSorted === tagIdB.id);\n\n\t\t\t\t\treturn a - b;\n\t\t\t\t});\n\n\t\t\t\temitDebounce('tagsChanged', tags.value);\n\t\t\t},\n\t\t});\n\t}\n};\n\nconst onClose = (popupEvent: PopupEvent) => {\n\tif (!Core.$?.ui['sortable']) return;\n\n\tif ($(popupEvent.elPopup).data('ui-sortable')) {\n\t\t$(popupEvent.elPopup).sortable('destroy');\n\t}\n};\n</script>\n\n<template>\n\t<TopTagSelectorPopupOpener\n\t\tv-model=\"model\"\n\t\t:id\n\t\t:tags\n\t\t:styling\n\t\tmode=\"filter\"\n\t\t:useTopButton\n\t/>\n\n\t<TopPopup\n\t\t:id\n\t\t:class=\"classString\"\n\t\t@open=\"onOpen($event)\"\n\t\t@close=\"onClose($event)\"\n\t\t:transition-duration=\"50\"\n\t>\n\t\t<!-- Массовое редактирование-->\n\t\t<template #header v-if=\"target.mode === 'setter' && target.filters\">\n\t\t\t<TopSelect\n\t\t\t\tv-model=\"filtersAction\"\n\t\t\t\t:options=\"genFiltersActionOptions()\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #footer v-if=\"target.mode === 'setter' && target.filters\">\n\t\t\t<TopButton color=\"theme\">\n\t\t\t\t{{ $i18n.Common.Cancel }}\n\t\t\t</TopButton>\n\n\t\t\t<TopButton\n\t\t\t\t@click=\"emitDebounce('setter', {\n\t\t\t\t\ttagsIds: target.model.value as Tag['id'][],\n\t\t\t\t\tfilters: target.filters,\n\t\t\t\t\tfiltersAction,\n\t\t\t\t\tpayload: target.payload,\n\t\t\t\t})\"\n\t\t\t>\n\t\t\t\t{{ filtersAction === 'add' ? $i18n.Common['Add'] : '' }}\n\t\t\t\t{{ filtersAction === 'replace' ? $i18n.Common['Replace'] : '' }}\n\t\t\t\t{{ filtersAction === 'delete' ? $i18n.Common['Delete'] : '' }}\n\t\t\t</TopButton>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopTagListItem\n\t\t\t\tv-if=\"target.mode === 'filter' && !singleMode\"\n\t\t\t\tid=\"all\"\n\t\t\t\tcolorId=\"\"\n\t\t\t\t:name=\"$i18n.Common.All_tags ?? ''\"\n\t\t\t\t:state=\"target.model.value.length ? '' : 'selected'\"\n\t\t\t\t@select=\"target.model.value = []\"\n\t\t\t/>\n\n\t\t\t<TopTagListItem\n\t\t\t\tv-for=\"tag in tags\"\n\t\t\t\t:key=\"tag.id\"\n\t\t\t\t:id=\"tag.id\"\n\t\t\t\t:colorId=\"tag.color_id\"\n\t\t\t\t:name=\"tag.name\"\n\t\t\t\t:state=\"genTargetTagState(tag.id)\"\n\t\t\t\t:canExclude=\"target.mode === 'filter' && !singleMode\"\n\t\t\t\t:editable=\"tagsEditable\"\n\t\t\t\t:disabled=\"disabled && genTargetTagState(tag.id) === ''\"\n\t\t\t\t@unselect=\"updateTargetModel(tag.id, 'unselect')\"\n\t\t\t\t@select=\"updateTargetModel(tag.id, 'select')\"\n\t\t\t\t@exclude=\"updateTargetModel(tag.id, 'exclude')\"\n\t\t\t\t@update:name=\"tag.name = $event as string, emitDebounce('tagsChanged', tags);\"\n\t\t\t/>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"tagsEditable && tags.length < tagsMax && tags.length < 20\"\n\t\t\t\tdata-top-icon=\"\"\n\t\t\t\t@click.stop=\"addTag\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.Add }}\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-tagSelector_popup .top-popup {\n\tuser-select: none;\n\tmin-width: 220px !important;\n\ttext-align: left;\n}\n\n.top-tagSelector_popup .top-popup_header .top-select{\n\tflex-grow: 1;\n}\n</style>\n"]}