sa2kit 1.6.23 → 1.6.24

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/universalExport/constants.ts","../../src/universalExport/utils.ts","../../src/universalExport/client.ts","../../src/universalExport/components/ExportConfigEditor.tsx","../../src/universalExport/components/UniversalExportButton.tsx"],"names":["React","FileText","FileSpreadsheet","Database","useState","useCallback","config","useEffect","Settings","Type","Group","X","Eye","EyeOff","MoveUp","MoveDown","Trash2","Save","Loader2","Download","ChevronDown"],"mappings":";;;;;;;;;;;;AASO,IAAM,wBAAA,GAA2B;AAGjC,IAAM,qBAAA,GAAwB;AAK9B,IAAM,qBAAA,GAAsC;AAG5C,IAAM,qBAAA,GAAwB;AAG9B,IAAM,gBAAA,GAAmB;AAGzB,IAAM,eAAA,GAAkB;AAGxB,IAAM,qBAAA,GAAwB,MAAM,IAAA,GAAO;AAG3C,IAAM,gBAAA,GAAmB;AAGzB,IAAM,8BAAA,GAAiC;AAGvC,IAAM,sBAAA,GAAyB;AAG/B,IAAM,wBAAA,GAA2B;AAGjC,IAAM,wBAAA,GAA2B;AAKjC,IAAM,wBAAA,GAAyD;AAAA,EACpE,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,MAAA;AAAA,EACP,IAAA,EAAM;AACR;AAGO,IAAM,wBAAA,GAAyD;AAAA,EACpE,GAAA,EAAK,yBAAA;AAAA,EACL,KAAA,EAAO,mEAAA;AAAA,EACP,IAAA,EAAM;AACR;AAKO,IAAM,aAAA,GAAgB;AAGtB,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,WAAA,EAAa,GAAG,aAAa,CAAA,QAAA,CAAA;AAAA;AAAA,EAE7B,aAAA,EAAe,GAAG,aAAa,CAAA,QAAA,CAAA;AAAA;AAAA,EAE/B,eAAe,CAAC,QAAA,KAAqB,CAAA,EAAG,aAAa,YAAY,QAAQ,CAAA,CAAA;AAAA;AAAA,EAEzE,eAAe,CAAC,QAAA,KAAqB,CAAA,EAAG,aAAa,YAAY,QAAQ,CAAA,CAAA;AAAA;AAAA,EAEzE,WAAA,EAAa,GAAG,aAAa,CAAA,OAAA,CAAA;AAAA;AAAA,EAE7B,cAAc,CAAC,QAAA,KAAqB,CAAA,EAAG,aAAa,WAAW,QAAQ,CAAA,SAAA,CAAA;AAAA;AAAA,EAEvE,eAAe,CAAC,QAAA,KAAqB,CAAA,EAAG,aAAa,WAAW,QAAQ,CAAA,SAAA;AAC1E;AAKO,IAAM,WAAA,GAAc;AAAA;AAAA,EAEzB,mBAAA,EAAqB,qBAAA;AAAA;AAAA,EAErB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAEnB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAEnB,aAAA,EAAe,eAAA;AAAA;AAAA,EAEf,aAAA,EAAe,eAAA;AAAA;AAAA,EAEf,YAAA,EAAc,cAAA;AAAA;AAAA,EAEd,YAAA,EAAc;AAChB;;;AC3FO,SAAS,sBAAA,CAAuB,UAAkB,MAAA,EAA8B;AACrF,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACnD,EAAA,MAAM,OAAA,GAAA,CAAW,GAAA,CAAI,YAAA,EAAa,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,EAAI,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC1E,EAAA,MAAM,SAAA,GAAY,yBAAyB,MAAM,CAAA;AAEjD,EAAA,OACE,SACG,OAAA,CAAQ,QAAA,EAAU,OAAO,CAAA,CACzB,OAAA,CAAQ,UAAU,OAAO,CAAA,CACzB,OAAA,CAAQ,aAAA,EAAe,IAAI,OAAA,EAAQ,CAAE,UAAU,CAAA,GAAI,IAAI,SAAS,CAAA,CAAA;AAEvE;AAKO,SAAS,iBAAiB,QAAA,EAA2B;AAE1D,EAAA,MAAM,YAAA,GAAe,eAAA;AACrB,EAAA,IAAI,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,QAAA,CAAS,SAAS,GAAA,EAAK;AAClD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,iBAAiB,QAAA,EAA0B;AACzD,EAAA,OAAO,SAAS,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA,CAAE,SAAA,CAAU,GAAG,GAAG,CAAA;AACjE;AAOO,SAAS,cAAA,CAAe,KAAA,EAAe,SAAA,GAAoB,GAAA,EAAa;AAC7E,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAGnC,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AACrF,IAAA,OAAO,CAAA,CAAA,EAAI,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,cAAc,KAAA,EAAuB;AAEnD,EAAA,IAAI,MAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAChD,IAAA,OAAO,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,KAAA;AACT;AAOO,IAAM,kBAAA,GAAgD;AAAA;AAAA,EAE3D,IAAA,EAAM,CAAC,KAAA,KAAe;AACpB,IAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAC3B,IAAA,IAAI,MAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,OAAO,OAAO,KAAK,CAAA;AAC9C,IAAA,OAAO,KAAK,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAAA,EAC7C,CAAA;AAAA;AAAA,EAGA,QAAA,EAAU,CAAC,KAAA,KAAe;AACxB,IAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAC3B,IAAA,IAAI,MAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,OAAO,OAAO,KAAK,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,EACpC,CAAA;AAAA;AAAA,EAGA,MAAA,EAAQ,CAAC,KAAA,KAAe;AACtB,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA;AAClD,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB,CAAA;AAAA;AAAA,EAGA,QAAA,EAAU,CAAC,KAAA,KAAe;AACxB,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA;AAClD,IAAA,OAAO,OAAI,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,EACrC,CAAA;AAAA;AAAA,EAGA,UAAA,EAAY,CAAC,KAAA,KAAe;AAC1B,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA;AAClD,IAAA,OAAO,IAAI,MAAA,CAAO,KAAK,IAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAC5C,CAAA;AAAA;AAAA,EAGA,OAAA,EAAS,CAAC,KAAA,KAAe;AACvB,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA;AAClD,IAAA,OAAO,QAAQ,QAAA,GAAM,QAAA;AAAA,EACvB,CAAA;AAAA;AAAA,EAGA,KAAA,EAAO,CAAC,KAAA,KAAe;AACrB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,EAAA;AAClC,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB,CAAA;AAAA;AAAA,EAGA,MAAA,EAAQ,CAAC,KAAA,KAAe;AACtB,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,EAAA;AAChD,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AACF;AAKO,SAAS,cAAA,CAAe,KAAA,EAAY,SAAA,EAAuB,IAAA,EAAuB;AAEvF,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,UAAU,KAAK,CAAA;AAAA,EACxB;AAGA,EAAA,IAAI,IAAA,IAAQ,kBAAA,CAAmB,IAAI,CAAA,EAAG;AACpC,IAAA,OAAO,kBAAA,CAAmB,IAAI,CAAA,CAAE,KAAK,CAAA;AAAA,EACvC;AAGA,EAAA,OAAO,MAAA,CAAO,SAAS,EAAE,CAAA;AAC3B;AAOO,SAAS,qBAAqB,MAAA,EAAmD;AACtF,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,IAAQ,OAAO,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAC7C,IAAA,MAAA,CAAO,KAAK,kDAAU,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,IAAK,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACjF,IAAA,MAAA,CAAO,KAAK,8DAAY,CAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA,KAAW,EAAE,OAAO,CAAA;AAChE,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,KAAK,8DAAY,CAAA;AAAA,IAC1B;AAGA,IAAA,MAAM,OAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,KAAW,EAAE,GAAG,CAAA;AAChD,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,IAAI,CAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,UAAA,CAAW,IAAA,EAAM;AACnC,MAAA,MAAA,CAAO,KAAK,kDAAU,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAKO,SAAS,sBAAsB,OAAA,EAAoD;AACxF,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,IAAA,MAAA,CAAO,KAAK,oDAAY,CAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,IAAA,MAAA,CAAO,KAAK,4CAAS,CAAA;AAAA,EACvB;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAOO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,KAAA;AAExB,EAAA,MAAM,QAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAElD,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC3D;AAOO,SAAS,eAAe,YAAA,EAA8B;AAC3D,EAAA,IAAI,eAAe,GAAA,EAAM;AACvB,IAAA,OAAO,GAAG,YAAY,CAAA,EAAA,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,GAAI,CAAA;AAE9C,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,OAAO,GAAG,OAAO,CAAA,MAAA,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,MAAM,mBAAmB,OAAA,GAAU,EAAA;AAEnC,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,OAAO,gBAAA,GAAmB,IAAI,CAAA,EAAG,OAAO,SAAI,gBAAgB,CAAA,MAAA,CAAA,GAAM,GAAG,OAAO,CAAA,YAAA,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACrC,EAAA,MAAM,mBAAmB,OAAA,GAAU,EAAA;AAEnC,EAAA,OAAO,gBAAA,GAAmB,IAAI,CAAA,EAAG,KAAK,eAAK,gBAAgB,CAAA,YAAA,CAAA,GAAO,GAAG,KAAK,CAAA,YAAA,CAAA;AAC5E;AAKO,SAAS,eAAA,CACd,SAAA,EACA,aAAA,EACA,SAAA,EACkB;AAClB,EAAA,IAAI,aAAA,KAAkB,CAAA,IAAK,SAAA,KAAc,CAAA,EAAG;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,UAAU,OAAA,EAAQ;AAC/C,EAAA,MAAM,gBAAgB,OAAA,GAAU,aAAA;AAChC,EAAA,MAAM,gBAAgB,SAAA,GAAY,aAAA;AAClC,EAAA,MAAM,gBAAgB,aAAA,GAAgB,aAAA;AAEtC,EAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,aAAa,CAAA;AAC5C;AAOO,SAAS,cAAA,CAAe,KAAU,IAAA,EAAmB;AAC1D,EAAA,OAAO,KAAK,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,CAAC,SAAS,GAAA,KAAQ;AAC9C,IAAA,OAAO,WAAW,OAAA,CAAQ,GAAG,MAAM,MAAA,GAAY,OAAA,CAAQ,GAAG,CAAA,GAAI,IAAA;AAAA,EAChE,GAAG,GAAG,CAAA;AACR;AAKO,SAAS,cAAA,CAAe,GAAA,EAAU,IAAA,EAAc,KAAA,EAAkB;AACvE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AAEzB,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,CAAC,SAAS,GAAA,KAAQ;AAC3C,IAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAG,MAAM,QAAA,EAAU;AACrD,MAAA,OAAA,CAAQ,GAAG,IAAI,EAAC;AAAA,IAClB;AACA,IAAA,OAAO,QAAQ,GAAG,CAAA;AAAA,EACpB,GAAG,GAAG,CAAA;AAEN,EAAA,MAAA,CAAO,OAAO,CAAA,GAAI,KAAA;AACpB;AAOO,SAAS,iBAAA,CACd,IAAA,EACA,OAAA,EACA,OAAA,EACmF;AACnF,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,sBAAe,IAAA;AAAK,GACtB;AACF;AAKO,SAAS,mBAAmB,KAAA,EAAwB;AACzD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,0BAAA;AACT;;;ACxTO,IAAM,wBAAN,MAA4B;AAAA,EAGjC,WAAA,CAAY,MAAA,GAAsC,EAAC,EAAG;AACpD,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,OAAA,EAAS,OAAO,OAAA,IAAW,EAAA;AAAA,MAC3B,OAAA,EAAS,OAAO,OAAA,IAAW,GAAA;AAAA,MAC3B,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW;AAAC,KAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAA,CAAmB,QAAA,EAAkB,UAAA,EAA8C;AACvF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,UAAU,CAAA;AAC/C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,CAAO,MAAA,CAAO,cAAc,UAAU,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,aAAA,CAAc,WAAW,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAExE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK;AAAA,QAChD,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,KAAK,UAAA;AAAW,OAC1B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAW,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAClD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,iBAAA;AAAA,QACJ,WAAA,CAAY,aAAA;AAAA,QACZ,CAAA,kDAAA,EAAa,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAAA,QACtC,EAAE,QAAA,EAAU,UAAA,EAAY,aAAA,EAAe,KAAA;AAAM,OAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,MAAA,EACuB;AACvB,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA,EAAG,cAAc,aAAa,CAAA,CAAA;AAEhE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK;AAAA,QAChD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,UAAA,EAAW;AAAA,UACnB,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,OAC5B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAW,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAClD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,MAAM,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,iBAAA;AAAA,QACJ,WAAA,CAAY,aAAA;AAAA,QACZ,CAAA,kDAAA,EAAa,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAAA,QACtC,EAAE,MAAA,EAAQ,aAAA,EAAe,KAAA;AAAM,OACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,QAAA,EAAkB,OAAA,EAAuD;AAC1F,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,aAAA,CAAc,aAAA,CAAc,QAAQ,CAAC,CAAA,CAAA;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK;AAAA,QAChD,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,UAAA,EAAW;AAAA,UACnB,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OAC7B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAW,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAClD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,MAAM,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,iBAAA;AAAA,QACJ,WAAA,CAAY,aAAA;AAAA,QACZ,CAAA,kDAAA,EAAa,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAAA,QACtC,EAAE,QAAA,EAAU,OAAA,EAAS,aAAA,EAAe,KAAA;AAAM,OAC5C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAA,EAAiC;AAClD,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,aAAA,CAAc,aAAA,CAAc,QAAQ,CAAC,CAAA,CAAA;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK;AAAA,QAChD,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS,KAAK,UAAA;AAAW,OAC1B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAW,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAClD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,iBAAA;AAAA,QACJ,WAAA,CAAY,aAAA;AAAA,QACZ,CAAA,kDAAA,EAAa,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAAA,QACtC,EAAE,QAAA,EAAU,aAAA,EAAe,KAAA;AAAM,OACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,OAAA,EAAkE;AACjF,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA,EAAG,cAAc,WAAW,CAAA,CAAA;AAE9D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK;AAAA,QAChD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,UAAA,EAAW;AAAA,UACnB,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,YAAY,OAAO,OAAA,CAAQ,UAAA,KAAe,QAAA,GAAW,QAAQ,UAAA,GAAa,KAAA,CAAA;AAAA,UAC1E,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,cAAc,OAAA,CAAQ,YAAA;AAAA,UACtB,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,UACpB,gBAAgB,OAAA,CAAQ;AAAA,SACzB;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAAS,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAChD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,CAAK,4BAAA,CAA6B,IAAA,CAAK,MAAM,CAAA;AAAA,IACtD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,iBAAA;AAAA,QACJ,WAAA,CAAY,iBAAA;AAAA,QACZ,CAAA,sCAAA,EAAW,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAAA,QACpC,EAAE,OAAA,EAAS,aAAA,EAAe,KAAA;AAAM,OAClC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,QAAA,EAA2C;AACjE,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,aAAA,CAAc,YAAA,CAAa,QAAQ,CAAC,CAAA,CAAA;AAEzE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK;AAAA,QAChD,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,KAAK,UAAA;AAAW,OAC1B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAa,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,QAAQ,CAAA;AAAA,IACpD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,iBAAA;AAAA,QACJ,WAAA,CAAY,aAAA;AAAA,QACZ,CAAA,kDAAA,EAAa,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAAA,QACtC,EAAE,QAAA,EAAU,aAAA,EAAe,KAAA;AAAM,OACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,QAAA,EAAiC;AACxD,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,aAAA,CAAc,aAAA,CAAc,QAAQ,CAAC,CAAA,CAAA;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK;AAAA,QAChD,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,KAAK,UAAA;AAAW,OAC1B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAW,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MAClD;AAEA,MAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,iBAAA;AAAA,QACJ,WAAA,CAAY,aAAA;AAAA,QACZ,CAAA,kDAAA,EAAa,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAAA,QACtC,EAAE,QAAA,EAAU,aAAA,EAAe,KAAA;AAAM,OACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UAAA,GAAqC;AAC3C,IAAA,OAAO;AAAA,MACL,GAAG,KAAK,MAAA,CAAO;AAAA,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CAAiB,GAAA,EAAa,OAAA,EAAyC;AACnF,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,GAAG,OAAA;AAAA,QACH,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,iBAAA,CAAkB,WAAA,CAAY,aAAA,EAAe,0BAAA,EAAQ;AAAA,UACzD,GAAA;AAAA,UACA,OAAA,EAAS,KAAK,MAAA,CAAO;AAAA,SACtB,CAAA;AAAA,MACH;AACA,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,SAAA,EAA8B;AAC3D,IAAA,OAAO;AAAA,MACL,IAAI,SAAA,CAAU,EAAA;AAAA,MACd,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,WAAA,EAAa,UAAU,WAAA,IAAe,MAAA;AAAA,MACtC,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,kBAAkB,SAAA,CAAU,gBAAA;AAAA,MAC5B,eAAe,SAAA,CAAU,aAAA;AAAA,MACzB,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,OAAA,EAAS,UAAU,OAAA,IAAW,MAAA;AAAA,MAC9B,SAAA,EAAW,IAAI,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,MACvC,SAAA,EAAW,IAAI,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,MACvC,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,UAAA,EAAY,UAAU,UAAA,IAAc,MAAA;AAAA,MACpC,SAAA,EAAW,UAAU,SAAA,IAAa;AAAA,KACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,UAAA,EAAmC;AACjE,IAAA,OAAO,WAAW,GAAA,CAAI,CAAC,WAAW,IAAA,CAAK,sBAAA,CAAuB,MAAM,CAAC,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKQ,6BAA6B,SAAA,EAA8B;AACjE,IAAA,OAAO;AAAA,MACL,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,SAAS,SAAA,CAAU,OAAA;AAAA,MACnB,cAAc,SAAA,CAAU,YAAA;AAAA,MACxB,SAAA,EAAW,IAAI,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,MACvC,OAAA,EAAS,IAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,MACnC,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,YAAY,SAAA,CAAU;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,WAAA,EAAkC;AACjE,IAAA,OAAO;AAAA,MACL,UAAU,WAAA,CAAY,QAAA;AAAA,MACtB,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,UAAU,WAAA,CAAY,QAAA;AAAA,MACtB,eAAe,WAAA,CAAY,aAAA;AAAA,MAC3B,WAAW,WAAA,CAAY,SAAA;AAAA,MACvB,SAAA,EAAW,IAAI,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAAA,MACzC,kBAAkB,WAAA,CAAY,gBAAA,GAC1B,IAAI,IAAA,CAAK,WAAA,CAAY,gBAAgB,CAAA,GACrC,MAAA;AAAA,MACJ,aAAa,WAAA,CAAY,WAAA;AAAA,MACzB,OAAO,WAAA,CAAY;AAAA,KACrB;AAAA,EACF;AACF;AAOO,IAAM,qBAAA,GAAwB,IAAI,qBAAA;AAKlC,SAAS,mBAAmB,MAAA,EAA6D;AAC9F,EAAA,OAAO,IAAI,sBAAsB,MAAM,CAAA;AACzC;ACxPA,IAAM,YAAA,GAAsD;AAAA,EAC1D,GAAA,kBAAKA,sBAAA,CAAA,aAAA,CAACC,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,EACnC,KAAA,kBAAOD,sBAAA,CAAA,aAAA,CAACE,2BAAA,EAAA,EAAgB,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,EAC5C,IAAA,kBAAMF,sBAAA,CAAA,aAAA,CAACG,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU;AACtC,CAAA;AAEA,IAAM,mBAAA,GAAoD;AAAA,EACxD,GAAA,EAAK,gFAAA;AAAA,EACL,KAAA,EAAO,uGAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAIO,IAAM,qBAAwD,CAAC;AAAA,EACpE,aAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,KAAM;AAGJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,eAAuB,MAAM;AACvD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,OAAO,EAAE,GAAG,aAAA,EAAc;AAAA,IAC5B;AAGA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,EAAA;AAAA,MACJ,IAAA,EAAM,sCAAA;AAAA,MACN,WAAA,EAAa,EAAA;AAAA,MACb,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,CAAC,OAAO,KAAA,MAAW;AAAA,QAC7C,GAAG,KAAA;AAAA,QACH,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW;AAAA,OACb,CAAE,CAAA;AAAA,MACF,QAAA,EAAU;AAAA,QACR,OAAA,EAAS,KAAA;AAAA,QACT,QAAQ,EAAC;AAAA,QACT,aAAA,EAAe,IAAA;AAAA,QACf,iBAAA,EAAmB,UAAA;AAAA,QACnB,aAAA,EAAe;AAAA,OACjB;AAAA,MACA,gBAAA,EAAkB,iCAAA;AAAA,MAClB,aAAA,EAAe,IAAA;AAAA,MACf,SAAA,EAAW,GAAA;AAAA,MACX,QAAA,EAAU,OAAA;AAAA,MACV,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAqD,OAAO,CAAA;AAG9F,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,cAAA,CAAyB,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAG5E,EAAA,MAAM,gBAAA,GAAmBC,kBAAY,YAAY;AAC/C,IAAA,IAAI,CAAC,OAAA,IAAW,SAAA,KAAc,QAAA,EAAU;AAExC,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,UAAU,CAAA;AAC/C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAA,CAAO,GAAA,CAAI,cAAc,UAAU,CAAA;AAAA,MACrC;AAEA,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,iCAAiC,MAAA,CAAO,QAAA,EAAU,CAAA,CAAE,CAAA;AACjF,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,eAAA,CAAgB,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AAAA,MACpC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAW,KAAK,CAAA;AAAA,IAChC,CAAA,SAAE;AACA,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,UAAU,CAAC,CAAA;AAG7C,EAAA,MAAM,YAAA,GAAeA,iBAAA,CAAY,OAAO,QAAA,KAAqB;AAC3D,IAAA,mBAAA,CAAoB,QAAQ,CAAA;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,8BAAA,EAAiC,QAAQ,CAAA,CAAA,EAAI;AAAA,QACxE,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,eAAA,CAAgB,UAAQ,IAAA,CAAK,MAAA,CAAO,SAAO,GAAA,CAAI,EAAA,KAAO,QAAQ,CAAC,CAAA;AAC/D,QAAA,cAAA,IAAiB;AAAA,MACnB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAW,KAAK,CAAA;AAAA,IAChC,CAAA,SAAE;AACA,MAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,EAAA,MAAM,kBAAA,GAAqBA,iBAAA,CAAY,CAACC,OAAAA,KAAyB;AAC/D,IAAA,SAAA,CAAUA,OAAM,CAAA;AAChB,IAAA,YAAA,CAAa,OAAO,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,MAAA,gBAAA,EAAiB;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAGhC,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,OAAA;AAC/B,IAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,CAAA,EAAI,OAAO,CAAA,EAAA,CAAA;AACrC,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,IAAA,GAAO,GAAA;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,KAAA,GAAQ,GAAA;AAC5B,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAE/B,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,QAAA,IAAW;AAAA,MACb;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAElD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,EAAA;AAC/B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,GAAA,GAAM,EAAA;AAC1B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,IAAA,GAAO,EAAA;AAC3B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,KAAA,GAAQ,EAAA;AAC5B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,EAAA;AAC/B,MAAA,MAAA,CAAO,QAAA,CAAS,GAAG,OAAO,CAAA;AAC1B,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AAItB,EAAA,MAAM,kBAAA,GAAqBF,iBAAA,CAAY,CAAC,QAAA,KAAqB;AAC3D,IAAA,SAAA,CAAU,CAAA,IAAA,MAAS;AAAA,MACjB,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,KAAK,MAAA,CAAO,GAAA;AAAA,QAAI,CAAA,KAAA,KACtB,KAAA,CAAM,GAAA,KAAQ,QAAA,GACV,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,CAAC,KAAA,CAAM,OAAA,EAAQ,GACpC;AAAA;AACN,KACF,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAoBA,iBAAA,CAAY,CAAC,QAAA,EAAkB,OAAA,KAAkC;AACnF,IAAA,SAAA,CAAU,CAAA,IAAA,MAAS;AAAA,MACjB,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,KAAK,MAAA,CAAO,GAAA;AAAA,QAAI,CAAA,KAAA,KACtB,MAAM,GAAA,KAAQ,QAAA,GACV,EAAE,GAAG,KAAA,EAAO,GAAG,OAAA,EAAQ,GACvB;AAAA;AACN,KACF,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE;AAEL,EAAA,MAAM,SAAA,GAAYA,iBAAA,CAAY,CAAC,QAAA,EAAkB,SAAA,KAA6B;AAC5E,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AAChB,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAC9B,MAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,QAAQ,CAAA;AAEtD,MAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,KAAA,GAAQ,CAAA,EAAG;AACnC,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC7B,QAAA,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAChC,QAAA,MAAA,CAAO,KAAK,CAAA,GAAI,IAAA;AAAA,MAClB,WAAW,SAAA,KAAc,MAAA,IAAU,KAAA,GAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5D,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC7B,QAAA,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAChC,QAAA,MAAA,CAAO,KAAK,CAAA,GAAI,IAAA;AAAA,MAClB;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,MAAS,EAAE,GAAG,KAAA,EAAO,SAAA,EAAW,GAAA,EAAI,CAAE;AAAA,OACnE;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,iBAAA,CAAY,CAAC,QAAA,KAAqB;AACpD,IAAA,SAAA,CAAU,CAAA,IAAA,MAAS;AAAA,MACjB,GAAG,IAAA;AAAA,MACH,QAAQ,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,QAAQ;AAAA,KACpD,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAIL,EAAA,MAAM,cAAA,GAAiBA,iBAAA,CAAY,CAAC,OAAA,KAAqB;AACvD,IAAA,SAAA,CAAU,CAAA,IAAA,MAAS;AAAA,MACjB,GAAG,IAAA;AAAA,MACH,QAAA,EAAU;AAAA,QACR,GAAG,IAAA,CAAK,QAAA;AAAA,QACR;AAAA;AACF,KACF,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,iBAAA,CAAY,CAAC,QAAA,KAAqB;AACzD,IAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,QAAQ,CAAA;AACxD,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,UAAA,GAA4B;AAAA,MAChC,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,IAAA,EAAM,OAAA;AAAA,MACN,eAAA,EAAiB,OAAA;AAAA,MACjB,eAAA,EAAiB,KAAA;AAAA,MACjB,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,SAAA,CAAU,CAAA,IAAA,MAAS;AAAA,MACjB,GAAG,IAAA;AAAA,MACH,QAAA,EAAU;AAAA,QACR,GAAG,IAAA,CAAK,QAAA;AAAA,QACR,QAAQ,CAAC,GAAG,IAAA,CAAK,QAAA,CAAU,QAAQ,UAAU;AAAA;AAC/C,KACF,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,MAAA,CAAO,MAAM,CAAC,CAAA;AAElB,EAAA,MAAM,mBAAA,GAAsBA,iBAAA,CAAY,CAAC,QAAA,KAAqB;AAC5D,IAAA,SAAA,CAAU,CAAA,IAAA,MAAS;AAAA,MACjB,GAAG,IAAA;AAAA,MACH,QAAA,EAAU;AAAA,QACR,GAAG,IAAA,CAAK,QAAA;AAAA,QACR,MAAA,EAAQ,KAAK,QAAA,CAAU,MAAA,CAAO,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,QAAQ;AAAA;AAC9D,KACF,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,mBAAA,GAAsBA,iBAAA,CAAY,CAAC,QAAA,EAAkB,OAAA,KAAoC;AAC7F,IAAA,SAAA,CAAU,CAAA,IAAA,MAAS;AAAA,MACjB,GAAG,IAAA;AAAA,MACH,QAAA,EAAU;AAAA,QACR,GAAG,IAAA,CAAK,QAAA;AAAA,QACR,MAAA,EAAQ,IAAA,CAAK,QAAA,CAAU,MAAA,CAAO,GAAA;AAAA,UAAI,CAAA,KAAA,KAChC,MAAM,GAAA,KAAQ,QAAA,GACV,EAAE,GAAG,KAAA,EAAO,GAAG,OAAA,EAAQ,GACvB;AAAA;AACN;AACF,KACF,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAA0BA,iBAAA,CAAY,CAAC,QAAA,EAAkB,SAAA,KAA6B;AACpF,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AAChB,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,SAAU,MAAM,CAAA;AACxC,MAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,QAAQ,CAAA;AAEtD,MAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,KAAA,GAAQ,CAAA,EAAG;AACnC,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC7B,QAAA,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAChC,QAAA,MAAA,CAAO,KAAK,CAAA,GAAI,IAAA;AAAA,MAClB,WAAW,SAAA,KAAc,MAAA,IAAU,KAAA,GAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5D,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC7B,QAAA,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAChC,QAAA,MAAA,CAAO,KAAK,CAAA,GAAI,IAAA;AAAA,MAClB;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,QAAA,EAAU;AAAA,UACR,GAAG,IAAA,CAAK,QAAA;AAAA,UACR;AAAA;AACF,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE;AAEL,EAA6BA,iBAAA,CAAY,CAAC,OAAA,KAAqC;AAC7E,IAAA,SAAA,CAAU,CAAA,IAAA,MAAS;AAAA,MACjB,GAAG,IAAA;AAAA,MACH,QAAA,EAAU;AAAA,QACR,GAAG,IAAA,CAAK,QAAA;AAAA,QACR,GAAG;AAAA;AACL,KACF,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE;AAIL,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACnC,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK,EAAG;AACvB,MAAA,KAAA,CAAM,4CAAS,CAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACzD,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,8DAAY,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAA8B;AAAA,MAClC,GAAG,MAAA;AAAA,MACH,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,MAAA,GAAS,aAAa,CAAA;AACtB,IAAA,cAAA,IAAiB;AAAA,EACnB,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,cAAc,CAAC,CAAA;AAInC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,EAAE,EAAA,EAAI,OAAA,EAAkB,KAAA,EAAO,0BAAA,EAAQ,IAAA,kBAAML,sBAAA,CAAA,aAAA,CAACQ,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA,EAAI,WAAA,EAAa,0EAAA,EAAe;AAAA,IAC3G,EAAE,EAAA,EAAI,QAAA,EAAmB,KAAA,EAAO,0BAAA,EAAQ,IAAA,kBAAMR,sBAAA,CAAA,aAAA,CAACS,gBAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA,EAAI,WAAA,EAAa,wDAAA,EAAY;AAAA,IACrG,EAAE,EAAA,EAAI,UAAA,EAAqB,KAAA,EAAO,0BAAA,EAAQ,IAAA,kBAAMT,sBAAA,CAAA,aAAA,CAACU,iBAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,CAAA,EAAI,WAAA,EAAa,oEAAA,EAAc;AAAA,IAC1G,EAAE,EAAA,EAAI,QAAA,EAAmB,KAAA,EAAO,0BAAA,EAAQ,IAAA,kBAAMV,sBAAA,CAAA,aAAA,CAACG,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA,EAAI,WAAA,EAAa,8DAAA;AAAa,GAC5G;AAEA,EAAA,uBACEH,sBAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,oFAAoF,SAAS,CAAA,CAAA;AAAA,MACxG,OAAA,EAAS;AAAA,KAAA;AAAA,oBAETA,sBAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,2EAAA;AAAA,QACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA;AAAgB,OAAA;AAAA,2DAGjC,KAAA,EAAA,EAAI,SAAA,EAAU,kFACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAACQ,oBAAA,EAAA,EAAS,SAAA,EAAU,yBAAwB,CAAA,kBAC5CR,sBAAA,CAAA,aAAA,CAAC,6BACCA,sBAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,qCAAA,EAAA,EAAsC,4CAAO,CAAA,kBAC3DA,sBAAA,CAAA,aAAA,CAAC,OAAE,SAAA,EAAU,uBAAA,EAAA,EAAwB,oEAAW,CAClD,CACF,mBACAA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,QAAA,EAAU,WAAU,oEAAA,EAAA,kBACnCA,sBAAA,CAAA,aAAA,CAACW,iBAAE,SAAA,EAAU,SAAA,EAAU,CACzB,CACF,CAAA;AAAA,sBAGAX,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAA,EACZ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACTA,sBAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAK,GAAA,CAAI,EAAA;AAAA,UACT,OAAA,EAAS,MAAM,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAAA,UAClC,WAAW,CAAA,mFAAA,EACT,SAAA,KAAc,GAAA,CAAI,EAAA,GAAK,4DAA4D,mCACrF,CAAA;AAAA,SAAA;AAAA,QAEC,GAAA,CAAI,IAAA;AAAA,wBACLA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,GAAA,CAAI,KAAM;AAAA,OAEpB,CACH,CACF,CAAA;AAAA,sBAGAA,sBAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,sCAAA,EAAA,uDACZ,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DACZ,IAAA,CAAK,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA,EAAG,IAAA,EACpC,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,SAAS,CAAA,EAAG,WACvC,CACF,CAAA,uDAEC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAA,EACZ,SAAA,KAAc,OAAA,oBACbA,sBAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,uDACZ,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EAAA,EAA0C,4BAAM,CAAA,kBACjEA,sBAAA,CAAA,aAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,OAAO,MAAA,CAAO,IAAA;AAAA,UACd,QAAA,EAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,UACtE,SAAA,EAAU;AAAA;AAAA,yBAEZA,sBAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EAAA,EAA0C,cAAE,CAAA,kBAC7DA,sBAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAO,MAAA,CAAO,WAAA;AAAA,UACd,QAAA,EAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,UAC7E,SAAA,EAAU,oDAAA;AAAA,UACV,IAAA,EAAM;AAAA;AAAA,OACR,kBACAA,sBAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yCAAA,EAAA,EAA0C,0BAAI,CAAA,kBAC/DA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,EACX,CAAC,OAAO,OAAA,EAAS,MAAM,CAAA,CAAqB,GAAA,CAAI,CAAC,MAAA,0DAChD,OAAA,EAAA,EAAM,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAU,mFAAA,EAAA,kBAC5BA,sBAAA,CAAA,aAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAS,OAAO,MAAA,KAAW,MAAA;AAAA,UAC3B,QAAA,EAAU,MAAM,SAAA,CAAU,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,QAAO,CAAE,CAAA;AAAA,UACvD,SAAA,EAAU;AAAA;AAAA,OACZ,kBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,IAAA,kBACCA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EAAA,EACZ,YAAA,CAAa,MAAM,CAAA,EAAE,GAAA,EAAE,MAAA,CAAO,aACjC,CAAA,kBACAA,sBAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAA,EAAyB,mBAAA,CAAoB,MAAM,CAAE,CACpE,CACF,CACD,CACH,CACF,CACF,CAAA,EAGD,SAAA,KAAc,QAAA,oBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACZ,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,0DACxB,KAAA,EAAA,EAAI,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,SAAA,EAAU,wDAAA,EAAA,kBAC7BA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,kBAAA,CAAmB,KAAA,CAAM,GAAG,CAAA,EAAG,WAAW,KAAA,CAAM,OAAA,GAAU,eAAA,GAAkB,eAAA,EAAA,EAChG,KAAA,CAAM,OAAA,wDAAWY,eAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA,mBAAKZ,sBAAA,CAAA,aAAA,CAACa,kBAAA,EAAA,EAAO,WAAU,SAAA,EAAU,CAC7E,CAAA,kBACAb,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAA,EAAe,KAAA,CAAM,KAAM,CAAA,uDACzC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAA,EAAyB,KAAA,CAAM,GAAI,CACpD,CAAA,kBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,SAAA,CAAU,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA,EAAG,QAAA,EAAU,KAAA,KAAU,CAAA,EAAG,SAAA,EAAU,qBAAA,EAAA,kBAAsBA,sBAAA,CAAA,aAAA,CAACc,kBAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAE,CAAA,kBACxId,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,SAAA,CAAU,MAAM,GAAA,EAAK,MAAM,CAAA,EAAG,QAAA,EAAU,KAAA,KAAU,MAAA,CAAO,OAAO,MAAA,GAAS,CAAA,EAAG,SAAA,EAAU,qBAAA,EAAA,kBAAsBA,sBAAA,CAAA,aAAA,CAACe,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAE,CAAA,kBACnKf,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,YAAY,KAAA,CAAM,GAAG,CAAA,EAAG,SAAA,EAAU,cAAA,EAAA,kBAAeA,sBAAA,CAAA,aAAA,CAACgB,kBAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAE,CACxG,CACF,CACD,CACH,GAGD,SAAA,KAAc,UAAA,oBACbhB,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6CAAA,EAAA,uDAA+CU,iBAAA,EAAA,EAAM,SAAA,EAAU,uBAAA,EAAwB,CAAA,EAAE,2BAAK,CAAA,uDAC3G,OAAA,EAAA,EAAM,SAAA,EAAU,yBAAA,EAAA,kBACfV,sBAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,YAAW,OAAA,EAAS,MAAA,CAAO,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,EAAG,CAAA,EAAE,0BAEjH,CACF,CAAA,EACC,MAAA,CAAO,QAAA,EAAU,OAAA,oBAChBA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,EACZ,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,EAAA,EAAI,0BAC/BA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,EAAA,CAAG,GAAA,EAAK,SAAA,EAAU,kDAAA,EAAA,kBAC1BA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAA6B,EAAA,CAAG,KAAM,CAAA,kBACtDA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,mBAAA,CAAoB,EAAA,CAAG,GAAG,CAAA,EAAG,SAAA,EAAU,cAAA,EAAA,uDAAgBgB,kBAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAE,CAC7G,CAAA,kBACAhB,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,EAAA,CAAG,MAAM,QAAA,EAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,EAAA,CAAG,GAAA,EAAK,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAuB,CAAA,EAAG,WAAU,oBAAA,EAAA,kBACxHA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,OAAA,EAAA,EAAQ,0BAAI,CAAA,kBAC1BA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,UAAA,EAAA,EAAW,0BAAI,CAAA,kBAC7BA,sBAAA,CAAA,aAAA,CAAC,YAAO,KAAA,EAAM,QAAA,EAAA,EAAS,0BAAI,CAC7B,CAAA,kBACAA,sBAAA,CAAA,aAAA,CAAC,YAAO,KAAA,EAAO,EAAA,CAAG,eAAA,EAAiB,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAoB,EAAA,CAAG,GAAA,EAAK,EAAE,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,KAAA,EAA+B,CAAA,EAAG,SAAA,EAAU,oBAAA,EAAA,kBACtJA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,WAAQ,cAAE,CAAA,kBACxBA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,KAAA,EAAA,EAAM,cAAE,CAAA,kBACtBA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,OAAA,EAAA,EAAQ,cAAE,CAC1B,CACF,CACF,CACD,CAAA,kBACDA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,KAAA,IAAS,gBAAA,CAAiB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG,SAAA,EAAU,2BAAA,EAAA,kBACrFA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,MAAG,yCAAS,CAAA,EACzB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAA,IAAW,CAAC,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,CAAA,EAAA,KAAM,EAAA,CAAG,GAAA,KAAQ,CAAA,CAAE,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,uBACjGA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,GAAA,EAAA,EAAM,CAAA,CAAE,KAAM,CAC5C,CACH,CACF,CAEJ,GAGD,SAAA,KAAc,QAAA,oBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,EACZ,cAAA,mBAAiBA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAA,EAAoB,uBAAM,CAAA,GAAS,YAAA,CAAa,IAAI,CAAA,EAAA,qBACnFA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,EAAA,CAAG,EAAA,EAAI,WAAU,yDAAA,EAAA,kBACzBA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,IAAA,kBACCA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAe,EAAA,CAAG,IAAK,CAAA,kBACtCA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAA,EAAyB,EAAA,CAAG,MAAO,CACpD,CAAA,kBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCACbA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,kBAAA,CAAmB,EAAE,CAAA,EAAG,SAAA,EAAU,wCAAA,EAAA,EAAyC,cAAE,CAAA,kBACpGA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,YAAA,CAAa,EAAA,CAAG,EAAE,CAAA,EAAG,SAAA,EAAU,uCAAA,EAAA,EAAwC,cAAE,CAClG,CACF,CACD,CACH,CAEJ,CACF,CAAA;AAAA,sBAGAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,QAAA,EAAU,SAAA,EAAU,0BAAA,EAAA,EAA2B,cAAE,CAAA,EACjE,SAAA,KAAc,4BACbA,sBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,UAAA,EAAY,SAAA,EAAU,kEAAA,EAAA,kBACrCA,sBAAA,CAAA,aAAA,CAACiB,gBAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA,EAAE,2BAC9B,CAEJ;AAAA;AACF,GACF;AAEJ;;;ACvkBA,IAAM,aAAA,GAAgB;AAAA,EACpB,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,8DAAA;AAAA,IACJ,EAAA,EAAI,4DAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAAA,EACA,SAAA,EAAW;AAAA,IACT,EAAA,EAAI,8DAAA;AAAA,IACJ,EAAA,EAAI,4DAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,2EAAA;AAAA,IACJ,EAAA,EAAI,yEAAA;AAAA,IACJ,EAAA,EAAI;AAAA;AAER,CAAA;AAIO,IAAM,wBAA8D,CAAC;AAAA,EAC1E,aAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA,GAAa,0BAAA;AAAA,EACb,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,EAAA;AAAA,EACZ,eAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAAM;AAGJ,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIb,eAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAgC,IAAI,CAAA;AAChF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,cAAAA,CAAyB,EAAE,CAAA;AAGnE,EAAA,MAAM,gBAAA,GAAmBC,kBAAY,YAAY;AAC/C,IAAA,IAAI;AACF,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,kBAAA,CAAmB,UAAU,UAAU,CAAA;AAC3E,QAAA,eAAA,CAAgB,OAAO,CAAA;AAAA,MACzB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2DAAc,KAAK,CAAA;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,QAAA,EAAU,UAAU,CAAC,CAAA;AAGxC,EAAAL,sBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,gBAAA,EAAiB;AAAA,EACnB,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAIrB,EAAA,MAAM,YAAA,GAAeK,iBAAAA,CAAY,OAAO,MAAA,KAAyB;AAC/D,IAAA,OAAA,CAAQ,IAAI,6DAAA,EAAoC;AAAA,MAC9C,UAAU,MAAA,CAAO,EAAA;AAAA,MACjB,YAAY,MAAA,CAAO,IAAA;AAAA,MACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,WAAA,EAAa,OAAO,MAAA,CAAO;AAAA,KAC5B,CAAA;AAED,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,OAAA,CAAQ,MAAM,iFAAoC,CAAA;AAClD,MAAA,aAAA,GAAgB,kDAAU,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAEtB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAyB;AAAA,QAC7B,QAAA,EAAU,MAAA;AAAA,QACV,UAAA;AAAA,QACA,SAAA,EAAW;AAAA,UACT,UAAA,EAAY,CAAC,QAAA,KAAa;AACxB,YAAA,OAAA,CAAQ,GAAA,CAAI,+DAAoC,QAAQ,CAAA;AACxD,YAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,UAC5B,CAAA;AAAA,UACA,SAAA,EAAW,CAAC,MAAA,KAAW;AACrB,YAAA,OAAA,CAAQ,IAAI,0DAAA,EAAmC;AAAA,cAC7C,UAAU,MAAA,CAAO,QAAA;AAAA,cACjB,UAAU,MAAA,CAAO,QAAA;AAAA,cACjB,cAAc,MAAA,CAAO;AAAA,aACtB,CAAA;AACD,YAAA,cAAA,CAAe,KAAK,CAAA;AACpB,YAAA,iBAAA,CAAkB,IAAI,CAAA;AAGtB,YAAA,IAAI,OAAO,QAAA,EAAU;AACnB,cAAA,OAAA,CAAQ,IAAI,2EAAsC,CAAA;AAClD,cAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,eAAA,CAAgB,OAAO,QAAQ,CAAA;AACtD,cAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,cAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AACZ,cAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,cAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,cAAA,IAAA,CAAK,KAAA,EAAM;AACX,cAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,cAAA,MAAA,CAAO,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAC9B,cAAA,OAAA,CAAQ,IAAI,qEAAkC,CAAA;AAAA,YAChD;AAEA,YAAA,eAAA,GAAkB,MAAM,CAAA;AAAA,UAC1B,CAAA;AAAA,UACA,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,YAAA,OAAA,CAAQ,KAAA,CAAM,4DAAmC,KAAK,CAAA;AACtD,YAAA,cAAA,CAAe,KAAK,CAAA;AACpB,YAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,YAAA,aAAA,GAAgB,MAAM,OAAO,CAAA;AAAA,UAC/B;AAAA;AACF,OACF;AAEA,MAAA,OAAA,CAAQ,IAAI,2EAAsC,CAAA;AAClD,MAAA,MAAM,aAAA,CAAc,WAAW,OAAO,CAAA;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,4DAAmC,KAAK,CAAA;AACtD,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,aAAA,GAAgB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAAM,CAAA;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,UAAA,EAAY,eAAA,EAAiB,aAAa,CAAC,CAAA;AAE9D,EAAA,MAAM,iBAAA,GAAoBA,kBAAY,YAAY;AAChD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,aAAa,aAAa,CAAA;AAAA,IAClC,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAuB;AAAA,QAC3B,EAAA,EAAI,cAAA;AAAA,QACJ,IAAA,EAAM,0BAAA;AAAA,QACN,WAAA,EAAa,8DAAA;AAAA,QACb,MAAA,EAAQ,KAAA;AAAA,QACR,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,CAAC,OAAO,KAAA,MAAW;AAAA,UAC7C,GAAG,KAAA;AAAA,UACH,OAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAW;AAAA,SACb,CAAE,CAAA;AAAA,QACF,gBAAA,EAAkB,iCAAA;AAAA,QAClB,aAAA,EAAe,IAAA;AAAA,QACf,SAAA,EAAW,GAAA;AAAA,QACX,QAAA,EAAU,OAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,QAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,aAAa,MAAM,CAAA;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,iBAAiB,QAAA,EAAU,UAAA,EAAY,YAAY,CAAC,CAAA;AAIvE,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA,CAAY,OAAO,MAAA,KAAyB;AACnE,IAAA,IAAI;AACF,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,WAAA,GAAc,MAAM,aAAA,CAAc,YAAA,CAAa,MAAM,CAAA;AAE3D,QAAA,MAAM,gBAAA,EAAiB;AACvB,QAAA,YAAA,GAAe,WAAW,CAAA;AAAA,MAC5B;AACA,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAA,aAAA,GAAgB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,sCAAQ,CAAA;AAAA,IACnE;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,YAAA,EAAc,aAAA,EAAe,gBAAgB,CAAC,CAAA;AAIjE,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,aAAA,EAAe,WAAU,GAAI,cAAA;AAEvD,IAAA,uBACEL,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uGAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAAA,kBACbA,uBAAA,aAAA,CAACkB,mBAAA,EAAA,EAAQ,SAAA,EAAU,oCAAA,EAAqC,CAAA,kBACxDlB,sBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,mCAAA,EAAA,EACb,MAAA,KAAW,YAAA,GAAe,6BAAA,GAAY,0BACzC,CACF,CAAA,kBAEAA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,4CAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAK,gBAAA,EAAK,QAAA,EAAS,GAAC,CAAA,kBACrBA,sBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,aAAA,EAAc,KAAA,EAAI,SAAA,EAAU,SAAE,CACvC,CAAA,kBAEAA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0DAAA;AAAA,QACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA;AAAI;AAAA,KAEnC,CACF,CACF,CAAA;AAAA,EAEJ,CAAA;AAIA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,IAAA,uBACEA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,yGAAA,EAAA,kBAEbA,sBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAS,MAAM;AACb,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,iBAAA,EAAkB;AAAA,QACpB,CAAA;AAAA,QACA,QAAA,EAAU,WAAA;AAAA,QACV,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,sBAAAA,CAAA,aAAA,CAACmB,oBAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,MAAE;AAAA,KAElC,EAGC,aAAa,MAAA,GAAS,CAAA,oBACrBnB,sBAAAA,CAAA,aAAA,CAAAA,uBAAA,QAAA,EAAA,IAAA,kBACEA,uBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+BAAA,EAAgC,CAAA,EAC9C,aAAa,GAAA,CAAI,CAAC,MAAA,qBACjBA,sBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAK,MAAA,CAAO,EAAA;AAAA,QACZ,SAAS,MAAM;AACb,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,YAAA,CAAa,MAAM,CAAA;AAAA,QACrB,CAAA;AAAA,QACA,QAAA,EAAU,WAAA;AAAA,QACV,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,sBAAAA,CAAA,aAAA,CAACC,oBAAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,MAC7B,MAAA,CAAO;AAAA,KAEX,CACH,CAAA,kBAIFD,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,CAAA,kBAC/CA,sBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAS,MAAM;AACb,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,QAC1B,CAAA;AAAA,QACA,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,sBAAAA,CAAA,aAAA,CAACQ,oBAAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,MAAE;AAAA,KAGpC,CAAA;AAAA,EAEJ,CAAA;AAIA,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,OAAO,CAAA,CAAE,IAAI,CAAA;AAC/C,EAAA,MAAM,WAAA,GAAc,mMAAmM,WAAW,CAAA,CAAA;AAElO,EAAA,uBACER,uBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAW,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAA,kBAEnCA,sBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAC,YAAY,CAAA;AAAA,MAC5C,UAAU,QAAA,IAAY,WAAA;AAAA,MACtB,WAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,WAAA,GAAc,uBAAuB,EAAE,CAAA;AAAA,KAAA;AAAA,IAEnE,WAAA,mBACCA,sBAAAA,CAAA,aAAA,CAACkB,mBAAA,EAAA,EAAQ,SAAA,EAAU,sBAAA,EAAuB,CAAA,mBAE1ClB,sBAAAA,CAAA,aAAA,CAACmB,oBAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,oBAEhCnB,sBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,WAAA,GAAc,0BAAW,UAAW,CAAA;AAAA,oBAC3CA,sBAAAA,CAAA,aAAA,CAACoB,uBAAA,EAAA,EAAY,WAAU,SAAA,EAAU;AAAA,KAIlC,cAAA,EAAe,EAGf,cAAA,EAAe,kBAGhBpB,sBAAAA,CAAA,aAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA,MAAA,EAAQ,gBAAA;AAAA,MACR,QAAA,EAAU,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAAA,MACzC,OAAA,EAAS,gBAAA;AAAA,MACT,cAAA,EAAgB;AAAA;AAAA,GAClB,EAGC,YAAA,oBACCA,sBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,qBAAA;AAAA,MACV,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK;AAAA;AAAA,GAG1C,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * 通用导出服务常量定义\n */\n\nimport type { ExportFormat } from './types';\n\n// ============= 版本信息 =============\n\n/** 模块版本 */\nexport const UNIVERSAL_EXPORT_VERSION = '1.0.0';\n\n/** 模块名称 */\nexport const UNIVERSAL_EXPORT_NAME = '@lyricnote/universal-export';\n\n// ============= 默认配置 =============\n\n/** 默认导出格式 */\nexport const DEFAULT_EXPORT_FORMAT: ExportFormat = 'csv';\n\n/** 默认CSV分隔符 */\nexport const DEFAULT_CSV_DELIMITER = ',';\n\n/** 默认编码格式 */\nexport const DEFAULT_ENCODING = 'utf-8';\n\n/** 默认是否添加BOM */\nexport const DEFAULT_ADD_BOM = true;\n\n/** 默认最大文件大小(字节) - 100MB */\nexport const DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;\n\n/** 默认最大行数限制 */\nexport const DEFAULT_MAX_ROWS = 100000;\n\n/** 默认并发导出数量 */\nexport const DEFAULT_MAX_CONCURRENT_EXPORTS = 5;\n\n/** 默认导出超时时间(毫秒) - 5分钟 */\nexport const DEFAULT_EXPORT_TIMEOUT = 300000;\n\n/** 默认配置缓存TTL(秒) - 1小时 */\nexport const DEFAULT_CONFIG_CACHE_TTL = 3600;\n\n/** 默认结果缓存TTL(秒) - 30分钟 */\nexport const DEFAULT_RESULT_CACHE_TTL = 1800;\n\n// ============= 文件扩展名 =============\n\n/** 导出格式对应的文件扩展名 */\nexport const EXPORT_FORMAT_EXTENSIONS: Record<ExportFormat, string> = {\n csv: 'csv',\n excel: 'xlsx',\n json: 'json',\n};\n\n/** 导出格式对应的MIME类型 */\nexport const EXPORT_FORMAT_MIME_TYPES: Record<ExportFormat, string> = {\n csv: 'text/csv; charset=utf-8',\n excel: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n json: 'application/json; charset=utf-8',\n};\n\n// ============= API端点 =============\n\n/** API基础路径 */\nexport const API_BASE_PATH = '/api/universal-export';\n\n/** API端点 */\nexport const API_ENDPOINTS = {\n /** 获取配置列表 */\n GET_CONFIGS: `${API_BASE_PATH}/configs`,\n /** 创建配置 */\n CREATE_CONFIG: `${API_BASE_PATH}/configs`,\n /** 更新配置 */\n UPDATE_CONFIG: (configId: string) => `${API_BASE_PATH}/configs/${configId}`,\n /** 删除配置 */\n DELETE_CONFIG: (configId: string) => `${API_BASE_PATH}/configs/${configId}`,\n /** 触发导出 */\n EXPORT_DATA: `${API_BASE_PATH}/export`,\n /** 查询导出进度 */\n GET_PROGRESS: (exportId: string) => `${API_BASE_PATH}/export/${exportId}/progress`,\n /** 下载导出文件 */\n DOWNLOAD_FILE: (exportId: string) => `${API_BASE_PATH}/export/${exportId}/download`,\n} as const;\n\n// ============= 错误代码 =============\n\n/** 错误代码 */\nexport const ERROR_CODES = {\n /** 导出配置错误 */\n EXPORT_CONFIG_ERROR: 'EXPORT_CONFIG_ERROR',\n /** 导出数据错误 */\n EXPORT_DATA_ERROR: 'EXPORT_DATA_ERROR',\n /** 导出文件错误 */\n EXPORT_FILE_ERROR: 'EXPORT_FILE_ERROR',\n /** 网络错误 */\n NETWORK_ERROR: 'NETWORK_ERROR',\n /** 超时错误 */\n TIMEOUT_ERROR: 'TIMEOUT_ERROR',\n /** 未授权 */\n UNAUTHORIZED: 'UNAUTHORIZED',\n /** 服务器错误 */\n SERVER_ERROR: 'SERVER_ERROR',\n} as const;\n","/**\n * 通用导出服务工具函数\n */\n\nimport type { ExportFormat, Formatter } from './types';\nimport { EXPORT_FORMAT_EXTENSIONS } from './constants';\n\n// ============= 文件名处理 =============\n\n/**\n * 生成导出文件名\n */\nexport function generateExportFileName(template: string, format: ExportFormat): string {\n const now = new Date();\n const dateStr = now.toISOString().split('T')[0] || '';\n const timeStr = (now.toTimeString().split(' ')[0] || '').replace(/:/g, '-');\n const extension = EXPORT_FORMAT_EXTENSIONS[format];\n\n return (\n template\n .replace('{date}', dateStr)\n .replace('{time}', timeStr)\n .replace('{timestamp}', now.getTime().toString()) + `.${extension}`\n );\n}\n\n/**\n * 验证文件名是否合法\n */\nexport function validateFileName(fileName: string): boolean {\n // 检查是否包含非法字符\n const invalidChars = /[<>:\"|?*\\/\\\\]/;\n if (invalidChars.test(fileName)) {\n return false;\n }\n\n // 检查长度\n if (fileName.length === 0 || fileName.length > 255) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 清理文件名,移除非法字符\n */\nexport function sanitizeFileName(fileName: string): string {\n return fileName.replace(/[<>:\"|?*\\/\\\\]/g, '_').substring(0, 255);\n}\n\n// ============= CSV处理 =============\n\n/**\n * 转义CSV字段\n */\nexport function escapeCSVField(value: string, delimiter: string = ','): string {\n const valueStr = String(value || '');\n\n // 如果包含分隔符、双引号或换行符,需要用双引号包裹并转义内部的双引号\n if (valueStr.includes(delimiter) || valueStr.includes('\"') || valueStr.includes('\\n')) {\n return `\"${valueStr.replace(/\"/g, '\"\"')}\"`;\n }\n\n return valueStr;\n}\n\n/**\n * 解析CSV字段\n */\nexport function parseCSVField(field: string): string {\n // 如果字段被双引号包裹,移除双引号并还原转义的双引号\n if (field.startsWith('\"') && field.endsWith('\"')) {\n return field.slice(1, -1).replace(/\"\"/g, '\"');\n }\n\n return field;\n}\n\n// ============= 数据格式化 =============\n\n/**\n * 内置格式化器集合\n */\nexport const DEFAULT_FORMATTERS: Record<string, Formatter> = {\n // 日期格式化\n date: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n if (isNaN(date.getTime())) return String(value);\n return date.toISOString().split('T')[0] || '';\n },\n\n // 时间格式化\n datetime: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n if (isNaN(date.getTime())) return String(value);\n return date.toLocaleString('zh-CN');\n },\n\n // 数字格式化\n number: (value: any) => {\n if (value === null || value === undefined) return '';\n return String(value);\n },\n\n // 货币格式化\n currency: (value: any) => {\n if (value === null || value === undefined) return '';\n return `¥${Number(value).toFixed(2)}`;\n },\n\n // 百分比格式化\n percentage: (value: any) => {\n if (value === null || value === undefined) return '';\n return `${(Number(value) * 100).toFixed(2)}%`;\n },\n\n // 布尔值格式化\n boolean: (value: any) => {\n if (value === null || value === undefined) return '';\n return value ? '是' : '否';\n },\n\n // 数组格式化\n array: (value: any) => {\n if (!Array.isArray(value)) return '';\n return value.join(', ');\n },\n\n // 对象格式化\n object: (value: any) => {\n if (!value || typeof value !== 'object') return '';\n return JSON.stringify(value);\n },\n};\n\n/**\n * 应用格式化器\n */\nexport function applyFormatter(value: any, formatter?: Formatter, type?: string): string {\n // 优先使用自定义格式化器\n if (formatter) {\n return formatter(value);\n }\n\n // 使用类型对应的默认格式化器\n if (type && DEFAULT_FORMATTERS[type]) {\n return DEFAULT_FORMATTERS[type](value);\n }\n\n // 默认转字符串\n return String(value || '');\n}\n\n// ============= 数据验证 =============\n\n/**\n * 验证导出配置\n */\nexport function validateExportConfig(config: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 检查必填字段\n if (!config.name || config.name.trim() === '') {\n errors.push('配置名称不能为空');\n }\n\n if (!config.fields || !Array.isArray(config.fields) || config.fields.length === 0) {\n errors.push('至少需要定义一个字段');\n }\n\n if (config.fields) {\n const enabledFields = config.fields.filter((f: any) => f.enabled);\n if (enabledFields.length === 0) {\n errors.push('至少需要启用一个字段');\n }\n\n // 检查字段键名唯一性\n const keys = config.fields.map((f: any) => f.key);\n const uniqueKeys = new Set(keys);\n if (keys.length !== uniqueKeys.size) {\n errors.push('字段键名必须唯一');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * 验证导出请求\n */\nexport function validateExportRequest(request: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!request.configId) {\n errors.push('导出配置ID不能为空');\n }\n\n if (!request.dataSource) {\n errors.push('数据源不能为空');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n// ============= 文件大小格式化 =============\n\n/**\n * 格式化文件大小\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${units[i]}`;\n}\n\n// ============= 时间处理 =============\n\n/**\n * 格式化持续时间\n */\nexport function formatDuration(milliseconds: number): string {\n if (milliseconds < 1000) {\n return `${milliseconds}ms`;\n }\n\n const seconds = Math.floor(milliseconds / 1000);\n\n if (seconds < 60) {\n return `${seconds}秒`;\n }\n\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n\n if (minutes < 60) {\n return remainingSeconds > 0 ? `${minutes}分${remainingSeconds}秒` : `${minutes}分钟`;\n }\n\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n\n return remainingMinutes > 0 ? `${hours}小时${remainingMinutes}分钟` : `${hours}小时`;\n}\n\n/**\n * 计算预计完成时间\n */\nexport function estimateEndTime(\n startTime: Date,\n processedRows: number,\n totalRows: number\n): Date | undefined {\n if (processedRows === 0 || totalRows === 0) {\n return undefined;\n }\n\n const elapsed = Date.now() - startTime.getTime();\n const avgTimePerRow = elapsed / processedRows;\n const remainingRows = totalRows - processedRows;\n const remainingTime = avgTimePerRow * remainingRows;\n\n return new Date(Date.now() + remainingTime);\n}\n\n// ============= 数据处理 =============\n\n/**\n * 获取嵌套对象的值\n */\nexport function getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => {\n return current && current[key] !== undefined ? current[key] : null;\n }, obj);\n}\n\n/**\n * 设置嵌套对象的值\n */\nexport function setNestedValue(obj: any, path: string, value: any): void {\n const keys = path.split('.');\n const lastKey = keys.pop();\n\n if (!lastKey) return;\n\n const target = keys.reduce((current, key) => {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n return current[key];\n }, obj);\n\n target[lastKey] = value;\n}\n\n// ============= 错误处理 =============\n\n/**\n * 创建导出错误对象\n */\nexport function createExportError(\n code: string,\n message: string,\n details?: Record<string, any>\n): { code: string; message: string; details?: Record<string, any>; timestamp: Date } {\n return {\n code,\n message,\n details,\n timestamp: new Date(),\n };\n}\n\n/**\n * 格式化错误消息\n */\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return '未知错误';\n}\n","/**\n * 通用导出服务客户端SDK\n *\n * 提供与后端API交互的客户端接口\n */\n\nimport type { ExportConfig, ExportProgress, ExportResult, ExportRequest } from './types';\nimport { API_ENDPOINTS, ERROR_CODES } from './constants';\nimport { createExportError, formatErrorMessage } from './utils';\n\n// ============= 配置类型 =============\n\nexport interface UniversalExportClientConfig {\n /** API基础URL */\n baseUrl?: string;\n /** 请求超时时间(毫秒) */\n timeout?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\n// ============= 客户端类 =============\n\n/**\n * 通用导出服务客户端\n */\nexport class UniversalExportClient {\n private config: UniversalExportClientConfig;\n\n constructor(config: UniversalExportClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl || '',\n timeout: config.timeout || 30000,\n headers: config.headers || {},\n };\n }\n\n // ============= 配置管理API =============\n\n /**\n * 获取模块的导出配置列表\n */\n async getConfigsByModule(moduleId: string, businessId?: string): Promise<ExportConfig[]> {\n const params = new URLSearchParams({ moduleId });\n if (businessId) {\n params.append('businessId', businessId);\n }\n\n const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_CONFIGS}?${params}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`获取配置失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformConfigsFromAPI(data.configs || []);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `获取导出配置失败: ${formatErrorMessage(error)}`,\n { moduleId, businessId, originalError: error }\n );\n }\n }\n\n /**\n * 创建导出配置\n */\n async createConfig(\n config: Omit<ExportConfig, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<ExportConfig> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.CREATE_CONFIG}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(config),\n });\n\n if (!response.ok) {\n throw new Error(`创建配置失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformConfigFromAPI(data.config);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `创建导出配置失败: ${formatErrorMessage(error)}`,\n { config, originalError: error }\n );\n }\n }\n\n /**\n * 更新导出配置\n */\n async updateConfig(configId: string, updates: Partial<ExportConfig>): Promise<ExportConfig> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.UPDATE_CONFIG(configId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'PUT',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updates),\n });\n\n if (!response.ok) {\n throw new Error(`更新配置失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformConfigFromAPI(data.config);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `更新导出配置失败: ${formatErrorMessage(error)}`,\n { configId, updates, originalError: error }\n );\n }\n }\n\n /**\n * 删除导出配置\n */\n async deleteConfig(configId: string): Promise<void> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.DELETE_CONFIG(configId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'DELETE',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`删除配置失败: ${response.statusText}`);\n }\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `删除导出配置失败: ${formatErrorMessage(error)}`,\n { configId, originalError: error }\n );\n }\n }\n\n // ============= 导出执行API =============\n\n /**\n * 触发数据导出\n */\n async exportData(request: Omit<ExportRequest, 'callbacks'>): Promise<ExportResult> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.EXPORT_DATA}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n configId: request.configId,\n dataSource: typeof request.dataSource === 'string' ? request.dataSource : undefined,\n queryParams: request.queryParams,\n fieldMapping: request.fieldMapping,\n filters: request.filters,\n sortBy: request.sortBy,\n pagination: request.pagination,\n customFileName: request.customFileName,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`导出失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformExportResultFromAPI(data.result);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.EXPORT_DATA_ERROR,\n `数据导出失败: ${formatErrorMessage(error)}`,\n { request, originalError: error }\n );\n }\n }\n\n /**\n * 查询导出进度\n */\n async getExportProgress(exportId: string): Promise<ExportProgress> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_PROGRESS(exportId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`获取导出进度失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformProgressFromAPI(data.progress);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `获取导出进度失败: ${formatErrorMessage(error)}`,\n { exportId, originalError: error }\n );\n }\n }\n\n /**\n * 下载导出文件\n */\n async downloadExportFile(exportId: string): Promise<Blob> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.DOWNLOAD_FILE(exportId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`下载文件失败: ${response.statusText}`);\n }\n\n return await response.blob();\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `下载导出文件失败: ${formatErrorMessage(error)}`,\n { exportId, originalError: error }\n );\n }\n }\n\n // ============= 私有辅助方法 =============\n\n /**\n * 获取请求头\n */\n private getHeaders(): Record<string, string> {\n return {\n ...this.config.headers,\n };\n }\n\n /**\n * 带超时的fetch请求\n */\n private async fetchWithTimeout(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw createExportError(ERROR_CODES.TIMEOUT_ERROR, '请求超时', {\n url,\n timeout: this.config.timeout,\n });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * 转换API返回的配置数据\n */\n private transformConfigFromAPI(apiConfig: any): ExportConfig {\n return {\n id: apiConfig.id,\n name: apiConfig.name,\n description: apiConfig.description || undefined,\n format: apiConfig.format,\n fields: apiConfig.fields,\n grouping: apiConfig.grouping,\n fileNameTemplate: apiConfig.fileNameTemplate,\n includeHeader: apiConfig.includeHeader,\n delimiter: apiConfig.delimiter,\n encoding: apiConfig.encoding,\n addBOM: apiConfig.addBOM,\n maxRows: apiConfig.maxRows || undefined,\n createdAt: new Date(apiConfig.createdAt),\n updatedAt: new Date(apiConfig.updatedAt),\n moduleId: apiConfig.moduleId,\n businessId: apiConfig.businessId || undefined,\n createdBy: apiConfig.createdBy || undefined,\n };\n }\n\n /**\n * 转换API返回的配置列表\n */\n private transformConfigsFromAPI(apiConfigs: any[]): ExportConfig[] {\n return apiConfigs.map((config) => this.transformConfigFromAPI(config));\n }\n\n /**\n * 转换API返回的导出结果\n */\n private transformExportResultFromAPI(apiResult: any): ExportResult {\n return {\n exportId: apiResult.exportId,\n fileName: apiResult.fileName,\n fileSize: apiResult.fileSize,\n fileUrl: apiResult.fileUrl,\n exportedRows: apiResult.exportedRows,\n startTime: new Date(apiResult.startTime),\n endTime: new Date(apiResult.endTime),\n duration: apiResult.duration,\n statistics: apiResult.statistics,\n };\n }\n\n /**\n * 转换API返回的进度数据\n */\n private transformProgressFromAPI(apiProgress: any): ExportProgress {\n return {\n exportId: apiProgress.exportId,\n status: apiProgress.status,\n progress: apiProgress.progress,\n processedRows: apiProgress.processedRows,\n totalRows: apiProgress.totalRows,\n startTime: new Date(apiProgress.startTime),\n estimatedEndTime: apiProgress.estimatedEndTime\n ? new Date(apiProgress.estimatedEndTime)\n : undefined,\n currentData: apiProgress.currentData,\n error: apiProgress.error,\n };\n }\n}\n\n// ============= 单例导出 =============\n\n/**\n * 默认客户端实例\n */\nexport const universalExportClient = new UniversalExportClient();\n\n/**\n * 创建自定义客户端实例\n */\nexport function createExportClient(config?: UniversalExportClientConfig): UniversalExportClient {\n return new UniversalExportClient(config);\n}\n","/**\n * 导出配置编辑器组件\n * \n * 提供可视化的导出字段配置编辑功能\n */\n\n'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { \n Settings, \n Trash2, \n Eye, \n EyeOff, \n MoveUp, \n MoveDown, \n Save, \n X,\n FileText,\n Calendar,\n Hash,\n CheckSquare,\n Type,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Group,\n GitMerge,\n Layers,\n ArrowUpDown,\n FileSpreadsheet,\n Database\n} from 'lucide-react';\n\nimport type { \n ExportConfig, \n ExportField, \n FieldType, \n FieldAlignment,\n ExportFormat,\n GroupingConfig,\n GroupingField,\n GroupingMode,\n GroupValueProcessing\n} from '../types';\n\n// ============= 类型定义 =============\n\nexport interface ExportConfigEditorProps {\n /** 初始配置 */\n initialConfig?: ExportConfig;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 可用的字段定义 */\n availableFields: ExportField[];\n /** 保存配置回调 */\n onSave?: (config: ExportConfig) => void;\n /** 取消回调 */\n onCancel?: () => void;\n /** 是否显示 */\n visible?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 配置变化回调(新增/删除/更新) */\n onConfigChange?: () => void;\n}\n\n// ============= 字段类型图标映射 =============\n\nconst FIELD_TYPE_ICONS: Record<FieldType, React.ReactNode> = {\n string: <Type className=\"w-4 h-4\" />,\n number: <Hash className=\"w-4 h-4\" />,\n date: <Calendar className=\"w-4 h-4\" />,\n boolean: <CheckSquare className=\"w-4 h-4\" />,\n array: <FileText className=\"w-4 h-4\" />,\n object: <FileText className=\"w-4 h-4\" />,\n};\n\nconst FIELD_TYPE_LABELS: Record<FieldType, string> = {\n string: '文本',\n number: '数字',\n date: '日期',\n boolean: '布尔',\n array: '数组',\n object: '对象',\n};\n\nconst ALIGNMENT_ICONS: Record<FieldAlignment, React.ReactNode> = {\n left: <AlignLeft className=\"w-4 h-4\" />,\n center: <AlignCenter className=\"w-4 h-4\" />,\n right: <AlignRight className=\"w-4 h-4\" />,\n};\n\nconst ALIGNMENT_LABELS: Record<FieldAlignment, string> = {\n left: '左对齐',\n center: '居中对齐',\n right: '右对齐',\n};\n\n// ============= 分组相关标签 =============\n\nconst GROUPING_MODE_LABELS: Record<GroupingMode, string> = {\n merge: '合并模式',\n separate: '分离模式',\n nested: '嵌套模式',\n};\n\nconst GROUPING_MODE_DESCRIPTIONS: Record<GroupingMode, string> = {\n merge: '同组数据合并显示,Excel支持单元格合并',\n separate: '每个分组独立显示,可添加分组头',\n nested: '支持多级嵌套分组',\n};\n\nconst VALUE_PROCESSING_LABELS: Record<GroupValueProcessing, string> = {\n first: '取第一个值',\n last: '取最后一个值',\n concat: '连接所有值',\n sum: '求和',\n count: '计数',\n custom: '自定义处理',\n};\n\nconst FORMAT_ICONS: Record<ExportFormat, React.ReactNode> = {\n csv: <FileText className=\"w-4 h-4\" />,\n excel: <FileSpreadsheet className=\"w-4 h-4\" />,\n json: <Database className=\"w-4 h-4\" />,\n};\n\nconst FORMAT_DESCRIPTIONS: Record<ExportFormat, string> = {\n csv: '逗号分隔值文件,兼容性最好',\n excel: 'Excel表格文件,支持格式化和单元格合并',\n json: 'JSON数据文件,适合开发者使用',\n};\n\n// ============= 主组件 =============\n\nexport const ExportConfigEditor: React.FC<ExportConfigEditorProps> = ({\n initialConfig,\n moduleId,\n businessId,\n availableFields,\n onSave,\n onCancel,\n visible = false,\n className = '',\n onConfigChange,\n}) => {\n // ============= 状态管理 =============\n \n const [config, setConfig] = useState<ExportConfig>(() => {\n if (initialConfig) {\n return { ...initialConfig };\n }\n \n // 创建默认配置\n return {\n id: '',\n name: '新建导出配置',\n description: '',\n format: 'csv',\n fields: availableFields.map((field, index) => ({\n ...field,\n enabled: true,\n sortOrder: index,\n })),\n grouping: {\n enabled: false,\n fields: [],\n preserveOrder: true,\n nullValueHandling: 'separate',\n nullGroupName: '未分组'\n },\n fileNameTemplate: '导出数据_{date}',\n includeHeader: true,\n delimiter: ',',\n encoding: 'utf-8',\n addBOM: true,\n maxRows: undefined,\n createdAt: new Date(),\n updatedAt: new Date(),\n moduleId,\n businessId,\n };\n });\n\n const [activeTab, setActiveTab] = useState<'basic' | 'fields' | 'grouping' | 'manage'>('basic');\n \n // 配置管理相关状态\n const [savedConfigs, setSavedConfigs] = useState<ExportConfig[]>([]);\n const [loadingConfigs, setLoadingConfigs] = useState(false);\n const [deletingConfigId, setDeletingConfigId] = useState<string | null>(null);\n\n // 加载已保存的配置\n const loadSavedConfigs = useCallback(async () => {\n if (!visible || activeTab !== 'manage') return;\n \n setLoadingConfigs(true);\n try {\n const params = new URLSearchParams({ moduleId });\n if (businessId) {\n params.set('businessId', businessId);\n }\n \n const response = await fetch(`/api/universal-export/configs?${params.toString()}`);\n if (response.ok) {\n const data = await response.json();\n setSavedConfigs(data.configs || []);\n }\n } catch (error) {\n console.error('加载配置异常:', error);\n } finally {\n setLoadingConfigs(false);\n }\n }, [visible, activeTab, moduleId, businessId]);\n\n // 删除配置\n const deleteConfig = useCallback(async (configId: string) => {\n setDeletingConfigId(configId);\n try {\n const response = await fetch(`/api/universal-export/configs/${configId}`, {\n method: 'DELETE'\n });\n if (response.ok) {\n setSavedConfigs(prev => prev.filter(cfg => cfg.id !== configId));\n onConfigChange?.();\n }\n } catch (error) {\n console.error('删除配置失败:', error);\n } finally {\n setDeletingConfigId(null);\n }\n }, [onConfigChange]);\n\n // 加载配置到编辑器\n const loadConfigToEditor = useCallback((config: ExportConfig) => {\n setConfig(config);\n setActiveTab('basic');\n }, []);\n\n // 当切换到管理tab时加载配置\n useEffect(() => {\n if (activeTab === 'manage') {\n loadSavedConfigs();\n }\n }, [activeTab, loadSavedConfigs]);\n\n // 阻止背景滚动\n useEffect(() => {\n if (!visible) return;\n \n const scrollY = window.scrollY;\n document.body.style.position = 'fixed';\n document.body.style.top = `-${scrollY}px`;\n document.body.style.left = '0';\n document.body.style.right = '0';\n document.body.style.overflow = 'hidden';\n \n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel?.();\n }\n };\n \n document.addEventListener('keydown', handleKeyDown);\n \n return () => {\n document.body.style.position = '';\n document.body.style.top = '';\n document.body.style.left = '';\n document.body.style.right = '';\n document.body.style.overflow = '';\n window.scrollTo(0, scrollY);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [visible, onCancel]);\n\n // ============= 字段管理 =============\n\n const toggleFieldEnabled = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.map(field =>\n field.key === fieldKey\n ? { ...field, enabled: !field.enabled }\n : field\n ),\n }));\n }, []);\n\n const updateField = useCallback((fieldKey: string, updates: Partial<ExportField>) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.map(field =>\n field.key === fieldKey\n ? { ...field, ...updates }\n : field\n ),\n }));\n }, []);\n\n const moveField = useCallback((fieldKey: string, direction: 'up' | 'down') => {\n setConfig(prev => {\n const fields = [...prev.fields];\n const index = fields.findIndex(f => f.key === fieldKey);\n \n if (direction === 'up' && index > 0) {\n const temp = fields[index - 1]!;\n fields[index - 1] = fields[index]!;\n fields[index] = temp;\n } else if (direction === 'down' && index < fields.length - 1) {\n const temp = fields[index + 1]!;\n fields[index + 1] = fields[index]!;\n fields[index] = temp;\n }\n \n return {\n ...prev,\n fields: fields.map((field, idx) => ({ ...field, sortOrder: idx })),\n };\n });\n }, []);\n\n const removeField = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.filter(f => f.key !== fieldKey),\n }));\n }, []);\n\n // ============= 分组配置管理 =============\n\n const toggleGrouping = useCallback((enabled: boolean) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n enabled,\n },\n }));\n }, []);\n\n const addGroupingField = useCallback((fieldKey: string) => {\n const field = config.fields.find(f => f.key === fieldKey);\n if (!field) return;\n\n const groupField: GroupingField = {\n key: field.key,\n label: field.label,\n mode: 'merge',\n valueProcessing: 'first',\n showGroupHeader: false,\n mergeCells: true,\n };\n\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: [...prev.grouping!.fields, groupField],\n },\n }));\n }, [config.fields]);\n\n const removeGroupingField = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: prev.grouping!.fields.filter(f => f.key !== fieldKey),\n },\n }));\n }, []);\n\n const updateGroupingField = useCallback((fieldKey: string, updates: Partial<GroupingField>) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: prev.grouping!.fields.map(field =>\n field.key === fieldKey\n ? { ...field, ...updates }\n : field\n ),\n },\n }));\n }, []);\n\n const moveGroupingField = useCallback((fieldKey: string, direction: 'up' | 'down') => {\n setConfig(prev => {\n const fields = [...prev.grouping!.fields];\n const index = fields.findIndex(f => f.key === fieldKey);\n \n if (direction === 'up' && index > 0) {\n const temp = fields[index - 1]!;\n fields[index - 1] = fields[index]!;\n fields[index] = temp;\n } else if (direction === 'down' && index < fields.length - 1) {\n const temp = fields[index + 1]!;\n fields[index + 1] = fields[index]!;\n fields[index] = temp;\n }\n \n return {\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields,\n },\n };\n });\n }, []);\n\n const updateGroupingConfig = useCallback((updates: Partial<GroupingConfig>) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n ...updates,\n },\n }));\n }, []);\n\n // ============= 保存配置 =============\n\n const handleSave = useCallback(() => {\n if (!config.name.trim()) {\n alert('请输入配置名称');\n return;\n }\n\n const enabledFields = config.fields.filter(f => f.enabled);\n if (enabledFields.length === 0) {\n alert('至少需要启用一个字段');\n return;\n }\n\n const updatedConfig: ExportConfig = {\n ...config,\n updatedAt: new Date(),\n };\n\n onSave?.(updatedConfig);\n onConfigChange?.();\n }, [config, onSave, onConfigChange]);\n\n // ============= 渲染组件 =============\n\n if (!visible) {\n return null;\n }\n\n const tabs = [\n { id: 'basic' as const, label: '基本配置', icon: <Settings className=\"w-4 h-4\" />, description: '配置名称、格式和基本选项' },\n { id: 'fields' as const, label: '字段设置', icon: <Type className=\"w-4 h-4\" />, description: '选择和配置导出字段' },\n { id: 'grouping' as const, label: '分组设置', icon: <Group className=\"w-4 h-4\" />, description: '配置数据分组和合并选项' },\n { id: 'manage' as const, label: '配置管理', icon: <Database className=\"w-4 h-4\" />, description: '管理已保存的导出配置' },\n ];\n\n return (\n <div \n className={`fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-[50] p-4 ${className}`}\n onClick={onCancel}\n >\n <div \n className=\"bg-white rounded-lg shadow-xl w-full max-w-5xl max-h-[90vh] flex flex-col\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-4 border-b flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <Settings className=\"w-6 h-6 text-blue-600\" />\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900\">导出配置编辑器</h2>\n <p className=\"text-sm text-gray-600\">配置导出字段和格式选项</p>\n </div>\n </div>\n <button onClick={onCancel} className=\"p-2 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded-lg\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Tab导航 */}\n <div className=\"border-b bg-gray-50 flex-shrink-0\">\n <nav className=\"flex space-x-1 p-2\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={`flex items-center gap-2 px-4 py-3 text-sm font-medium rounded-lg transition-colors ${\n activeTab === tab.id ? 'bg-white text-blue-600 shadow-sm border border-gray-200' : 'text-gray-600 hover:text-gray-900'\n }`}\n >\n {tab.icon}\n <span>{tab.label}</span>\n </button>\n ))}\n </nav>\n </div>\n\n {/* Tab内容 */}\n <div className=\"flex-1 overflow-hidden flex flex-col\">\n <div className=\"bg-blue-50 border-b border-blue-100 p-4 flex-shrink-0\">\n <div className=\"flex items-center gap-2 text-blue-800 text-sm font-medium\">\n {tabs.find(t => t.id === activeTab)?.icon}\n {tabs.find(t => t.id === activeTab)?.description}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4 sm:p-6\">\n {activeTab === 'basic' && (\n <div className=\"max-w-2xl mx-auto space-y-6\">\n <div className=\"space-y-4\">\n <label className=\"block text-sm font-medium text-gray-700\">配置名称 *</label>\n <input\n type=\"text\"\n value={config.name}\n onChange={(e) => setConfig(prev => ({ ...prev, name: e.target.value }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n />\n <label className=\"block text-sm font-medium text-gray-700\">描述</label>\n <textarea\n value={config.description}\n onChange={(e) => setConfig(prev => ({ ...prev, description: e.target.value }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n rows={3}\n />\n <label className=\"block text-sm font-medium text-gray-700\">导出格式</label>\n <div className=\"space-y-3\">\n {(['csv', 'excel', 'json'] as ExportFormat[]).map((format) => (\n <label key={format} className=\"flex items-start gap-3 p-3 border rounded-lg cursor-pointer hover:border-blue-300\">\n <input\n type=\"radio\"\n checked={config.format === format}\n onChange={() => setConfig(prev => ({ ...prev, format }))}\n className=\"mt-1\"\n />\n <div>\n <div className=\"flex items-center gap-2 font-medium\">\n {FORMAT_ICONS[format]} {format.toUpperCase()}\n </div>\n <p className=\"text-sm text-gray-600\">{FORMAT_DESCRIPTIONS[format]}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {activeTab === 'fields' && (\n <div className=\"space-y-4\">\n {config.fields.map((field, index) => (\n <div key={field.key} className=\"flex items-center gap-3 p-3 border rounded-lg bg-white\">\n <button onClick={() => toggleFieldEnabled(field.key)} className={field.enabled ? 'text-blue-600' : 'text-gray-400'}>\n {field.enabled ? <Eye className=\"w-4 h-4\" /> : <EyeOff className=\"w-4 h-4\" />}\n </button>\n <div className=\"flex-1\">\n <div className=\"font-medium\">{field.label}</div>\n <div className=\"text-xs text-gray-500\">{field.key}</div>\n </div>\n <div className=\"flex gap-1\">\n <button onClick={() => moveField(field.key, 'up')} disabled={index === 0} className=\"disabled:opacity-30\"><MoveUp className=\"w-4 h-4\" /></button>\n <button onClick={() => moveField(field.key, 'down')} disabled={index === config.fields.length - 1} className=\"disabled:opacity-30\"><MoveDown className=\"w-4 h-4\" /></button>\n <button onClick={() => removeField(field.key)} className=\"text-red-600\"><Trash2 className=\"w-4 h-4\" /></button>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {activeTab === 'grouping' && (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-lg font-medium flex items-center gap-2\"><Group className=\"w-5 h-5 text-blue-600\" /> 分组配置</h3>\n <label className=\"flex items-center gap-2\">\n <input type=\"checkbox\" checked={config.grouping?.enabled} onChange={(e) => toggleGrouping(e.target.checked)} />\n 启用分组\n </label>\n </div>\n {config.grouping?.enabled && (\n <div className=\"space-y-4\">\n {config.grouping.fields.map((gf, index) => (\n <div key={gf.key} className=\"p-4 border rounded-lg bg-blue-50 border-blue-200\">\n <div className=\"flex justify-between items-center mb-4\">\n <span className=\"font-medium text-blue-900\">{gf.label}</span>\n <button onClick={() => removeGroupingField(gf.key)} className=\"text-red-600\"><Trash2 className=\"w-4 h-4\" /></button>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <select value={gf.mode} onChange={(e) => updateGroupingField(gf.key, { mode: e.target.value as GroupingMode })} className=\"border rounded p-2\">\n <option value=\"merge\">合并模式</option>\n <option value=\"separate\">分离模式</option>\n <option value=\"nested\">嵌套模式</option>\n </select>\n <select value={gf.valueProcessing} onChange={(e) => updateGroupingField(gf.key, { valueProcessing: e.target.value as GroupValueProcessing })} className=\"border rounded p-2\">\n <option value=\"first\">首值</option>\n <option value=\"sum\">求和</option>\n <option value=\"count\">计数</option>\n </select>\n </div>\n </div>\n ))}\n <select onChange={(e) => e.target.value && addGroupingField(e.target.value)} className=\"w-full border rounded p-2\">\n <option value=\"\">添加分组字段...</option>\n {config.fields.filter(f => f.enabled && !config.grouping?.fields.some(gf => gf.key === f.key)).map(f => (\n <option key={f.key} value={f.key}>{f.label}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'manage' && (\n <div className=\"space-y-4\">\n {loadingConfigs ? <div className=\"text-center py-10\">加载中...</div> : savedConfigs.map(sc => (\n <div key={sc.id} className=\"flex justify-between items-center p-4 border rounded-lg\">\n <div>\n <div className=\"font-medium\">{sc.name}</div>\n <div className=\"text-sm text-gray-500\">{sc.format}</div>\n </div>\n <div className=\"flex gap-2\">\n <button onClick={() => loadConfigToEditor(sc)} className=\"text-blue-600 px-3 py-1 border rounded\">编辑</button>\n <button onClick={() => deleteConfig(sc.id)} className=\"text-red-600 px-3 py-1 border rounded\">删除</button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* 底部 */}\n <div className=\"flex justify-end gap-3 p-4 border-t bg-gray-50\">\n <button onClick={onCancel} className=\"px-4 py-2 border rounded\">取消</button>\n {activeTab !== 'manage' && (\n <button onClick={handleSave} className=\"px-4 py-2 bg-blue-600 text-white rounded flex items-center gap-2\">\n <Save className=\"w-4 h-4\" /> 保存配置\n </button>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n","/**\n * 通用导出按钮组件\n * \n * 提供统一的导出功能入口,支持配置化导出\n */\n\n'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport { \n Download, \n Settings, \n FileText, \n Loader2,\n ChevronDown\n} from 'lucide-react';\n\nimport type { \n ExportConfig, \n ExportField, \n ExportRequest,\n ExportResult,\n ExportProgress \n} from '../types';\n\nimport { ExportConfigEditor } from './ExportConfigEditor';\n\n// ============= 类型定义 =============\n\nexport interface UniversalExportButtonProps {\n /** 导出服务实例 */\n exportService: any; // UniversalExportClient\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 可用的字段定义 */\n availableFields: ExportField[];\n /** 数据源函数 */\n dataSource: () => Promise<any[]>;\n /** 默认配置 */\n defaultConfig?: ExportConfig;\n /** 按钮文本 */\n buttonText?: string;\n /** 按钮样式 */\n variant?: 'primary' | 'secondary' | 'outline';\n /** 按钮大小 */\n size?: 'sm' | 'md' | 'lg';\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 导出成功回调 */\n onExportSuccess?: (result: ExportResult) => void;\n /** 导出失败回调 */\n onExportError?: (error: string) => void;\n /** 配置保存回调 */\n onConfigSave?: (config: ExportConfig) => void;\n}\n\n// ============= 按钮样式配置 =============\n\nconst BUTTON_STYLES = {\n primary: {\n sm: 'px-3 py-1.5 text-sm bg-blue-600 text-white hover:bg-blue-700',\n md: 'px-4 py-2 text-sm bg-blue-600 text-white hover:bg-blue-700',\n lg: 'px-6 py-3 text-base bg-blue-600 text-white hover:bg-blue-700',\n },\n secondary: {\n sm: 'px-3 py-1.5 text-sm bg-gray-600 text-white hover:bg-gray-700',\n md: 'px-4 py-2 text-sm bg-gray-600 text-white hover:bg-gray-700',\n lg: 'px-6 py-3 text-base bg-gray-600 text-white hover:bg-gray-700',\n },\n outline: {\n sm: 'px-3 py-1.5 text-sm border border-gray-300 text-gray-700 hover:bg-gray-50',\n md: 'px-4 py-2 text-sm border border-gray-300 text-gray-700 hover:bg-gray-50',\n lg: 'px-6 py-3 text-base border border-gray-300 text-gray-700 hover:bg-gray-50',\n },\n};\n\n// ============= 主组件 =============\n\nexport const UniversalExportButton: React.FC<UniversalExportButtonProps> = ({\n exportService,\n moduleId,\n businessId,\n availableFields,\n dataSource,\n defaultConfig,\n buttonText = '导出数据',\n variant = 'primary',\n size = 'md',\n disabled = false,\n className = '',\n onExportSuccess,\n onExportError,\n onConfigSave,\n}) => {\n // ============= 状态管理 =============\n \n const [showConfigEditor, setShowConfigEditor] = useState(false);\n const [showDropdown, setShowDropdown] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n const [exportProgress, setExportProgress] = useState<ExportProgress | null>(null);\n const [savedConfigs, setSavedConfigs] = useState<ExportConfig[]>([]);\n\n // 加载保存的配置\n const loadSavedConfigs = useCallback(async () => {\n try {\n if (exportService) {\n const configs = await exportService.getConfigsByModule(moduleId, businessId);\n setSavedConfigs(configs);\n }\n } catch (error) {\n console.error('加载保存的配置失败:', error);\n }\n }, [exportService, moduleId, businessId]);\n\n // 组件挂载时加载配置\n React.useEffect(() => {\n loadSavedConfigs();\n }, [loadSavedConfigs]);\n\n // ============= 导出处理 =============\n\n const handleExport = useCallback(async (config: ExportConfig) => {\n console.log('🚀 [UniversalExportButton] 开始导出:', {\n configId: config.id,\n configName: config.name,\n format: config.format,\n fieldsCount: config.fields.length,\n });\n\n if (!exportService) {\n console.error('❌ [UniversalExportButton] 导出服务未初始化');\n onExportError?.('导出服务未初始化');\n return;\n }\n\n setIsExporting(true);\n setExportProgress(null);\n\n try {\n const request: ExportRequest = {\n configId: config,\n dataSource,\n callbacks: {\n onProgress: (progress) => {\n console.log('📊 [UniversalExportButton] 导出进度:', progress);\n setExportProgress(progress);\n },\n onSuccess: (result) => {\n console.log('✅ [UniversalExportButton] 导出成功:', {\n fileName: result.fileName,\n fileSize: result.fileSize,\n exportedRows: result.exportedRows,\n });\n setIsExporting(false);\n setExportProgress(null);\n \n // 下载文件\n if (result.fileBlob) {\n console.log('📥 [UniversalExportButton] 开始下载文件...');\n const url = window.URL.createObjectURL(result.fileBlob);\n const link = document.createElement('a');\n link.href = url;\n link.download = result.fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n console.log('✅ [UniversalExportButton] 文件下载完成');\n }\n \n onExportSuccess?.(result);\n },\n onError: (error) => {\n console.error('❌ [UniversalExportButton] 导出失败:', error);\n setIsExporting(false);\n setExportProgress(null);\n onExportError?.(error.message);\n },\n },\n };\n\n console.log('📞 [UniversalExportButton] 调用导出服务...');\n await exportService.exportData(request);\n } catch (error) {\n console.error('❌ [UniversalExportButton] 导出异常:', error);\n setIsExporting(false);\n setExportProgress(null);\n onExportError?.(error instanceof Error ? error.message : '导出失败');\n }\n }, [exportService, dataSource, onExportSuccess, onExportError]);\n\n const handleQuickExport = useCallback(async () => {\n if (defaultConfig) {\n await handleExport(defaultConfig);\n } else {\n // 创建默认配置\n const config: ExportConfig = {\n id: 'quick_export',\n name: '快速导出',\n description: '使用默认配置快速导出',\n format: 'csv',\n fields: availableFields.map((field, index) => ({\n ...field,\n enabled: true,\n sortOrder: index,\n })),\n fileNameTemplate: '导出数据_{date}',\n includeHeader: true,\n delimiter: ',',\n encoding: 'utf-8',\n addBOM: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n moduleId,\n businessId,\n };\n \n await handleExport(config);\n }\n }, [defaultConfig, availableFields, moduleId, businessId, handleExport]);\n\n // ============= 配置管理 =============\n\n const handleConfigSave = useCallback(async (config: ExportConfig) => {\n try {\n if (exportService) {\n const savedConfig = await exportService.createConfig(config);\n // 重新加载配置列表\n await loadSavedConfigs();\n onConfigSave?.(savedConfig);\n }\n setShowConfigEditor(false);\n } catch (error) {\n onExportError?.(error instanceof Error ? error.message : '保存配置失败');\n }\n }, [exportService, onConfigSave, onExportError, loadSavedConfigs]);\n\n // ============= 渲染进度 =============\n\n const renderProgress = () => {\n if (!exportProgress) return null;\n\n const { status, progress, processedRows, totalRows } = exportProgress;\n\n return (\n <div className=\"absolute top-full left-0 right-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg p-4 z-[10]\">\n <div className=\"flex items-center gap-3 mb-2\">\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-600\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {status === 'processing' ? '正在导出...' : '导出完成'}\n </span>\n </div>\n \n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-xs text-gray-600\">\n <span>进度: {progress}%</span>\n <span>{processedRows} / {totalRows} 行</span>\n </div>\n \n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div \n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n </div>\n );\n };\n\n // ============= 渲染下拉菜单 =============\n\n const renderDropdown = () => {\n if (!showDropdown) return null;\n\n return (\n <div className=\"absolute top-full left-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg py-2 z-[10] min-w-48\">\n {/* 快速导出 */}\n <button\n onClick={() => {\n setShowDropdown(false);\n handleQuickExport();\n }}\n disabled={isExporting}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <Download className=\"w-4 h-4\" />\n 快速导出\n </button>\n\n {/* 使用保存的配置 */}\n {savedConfigs.length > 0 && (\n <>\n <div className=\"border-t border-gray-200 my-1\" />\n {savedConfigs.map((config) => (\n <button\n key={config.id}\n onClick={() => {\n setShowDropdown(false);\n handleExport(config);\n }}\n disabled={isExporting}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <FileText className=\"w-4 h-4\" />\n {config.name}\n </button>\n ))}\n </>\n )}\n\n {/* 配置编辑器 */}\n <div className=\"border-t border-gray-200 my-1\" />\n <button\n onClick={() => {\n setShowDropdown(false);\n setShowConfigEditor(true);\n }}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <Settings className=\"w-4 h-4\" />\n 自定义配置\n </button>\n </div>\n );\n };\n\n // ============= 渲染组件 =============\n\n const buttonStyle = BUTTON_STYLES[variant][size];\n const baseClasses = `inline-flex items-center gap-2 rounded-lg font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed ${buttonStyle}`;\n\n return (\n <div className={`relative ${className}`}>\n {/* 主按钮 */}\n <button\n onClick={() => setShowDropdown(!showDropdown)}\n disabled={disabled || isExporting}\n className={`${baseClasses} ${isExporting ? 'cursor-not-allowed' : ''}`}\n >\n {isExporting ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Download className=\"w-4 h-4\" />\n )}\n <span>{isExporting ? '导出中...' : buttonText}</span>\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n\n {/* 下拉菜单 */}\n {renderDropdown()}\n\n {/* 进度显示 */}\n {renderProgress()}\n\n {/* 配置编辑器 */}\n <ExportConfigEditor\n moduleId={moduleId}\n businessId={businessId}\n availableFields={availableFields}\n onSave={handleConfigSave}\n onCancel={() => setShowConfigEditor(false)}\n visible={showConfigEditor}\n onConfigChange={loadSavedConfigs}\n />\n\n {/* 点击外部关闭下拉菜单 */}\n {showDropdown && (\n <div\n className=\"fixed inset-0 z-[0]\"\n onClick={() => setShowDropdown(false)}\n />\n )}\n </div>\n );\n};\n\n"]}
1
+ {"version":3,"sources":["../../src/universalExport/constants.ts","../../src/universalExport/utils.ts","../../src/universalExport/client.ts","../../src/universalExport/components/ExportConfigEditor.tsx","../../src/universalExport/components/UniversalExportButton.tsx"],"names":["React","FileText","FileSpreadsheet","Database","useState","useCallback","config","useEffect","Settings","Type","Group","X","Eye","EyeOff","MoveUp","MoveDown","Trash2","Save","Loader2","Download","ChevronDown"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 通用导出服务常量定义\n */\n\nimport type { ExportFormat } from './types';\n\n// ============= 版本信息 =============\n\n/** 模块版本 */\nexport const UNIVERSAL_EXPORT_VERSION = '1.0.0';\n\n/** 模块名称 */\nexport const UNIVERSAL_EXPORT_NAME = '@lyricnote/universal-export';\n\n// ============= 默认配置 =============\n\n/** 默认导出格式 */\nexport const DEFAULT_EXPORT_FORMAT: ExportFormat = 'csv';\n\n/** 默认CSV分隔符 */\nexport const DEFAULT_CSV_DELIMITER = ',';\n\n/** 默认编码格式 */\nexport const DEFAULT_ENCODING = 'utf-8';\n\n/** 默认是否添加BOM */\nexport const DEFAULT_ADD_BOM = true;\n\n/** 默认最大文件大小(字节) - 100MB */\nexport const DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;\n\n/** 默认最大行数限制 */\nexport const DEFAULT_MAX_ROWS = 100000;\n\n/** 默认并发导出数量 */\nexport const DEFAULT_MAX_CONCURRENT_EXPORTS = 5;\n\n/** 默认导出超时时间(毫秒) - 5分钟 */\nexport const DEFAULT_EXPORT_TIMEOUT = 300000;\n\n/** 默认配置缓存TTL(秒) - 1小时 */\nexport const DEFAULT_CONFIG_CACHE_TTL = 3600;\n\n/** 默认结果缓存TTL(秒) - 30分钟 */\nexport const DEFAULT_RESULT_CACHE_TTL = 1800;\n\n// ============= 文件扩展名 =============\n\n/** 导出格式对应的文件扩展名 */\nexport const EXPORT_FORMAT_EXTENSIONS: Record<ExportFormat, string> = {\n csv: 'csv',\n excel: 'xlsx',\n json: 'json',\n};\n\n/** 导出格式对应的MIME类型 */\nexport const EXPORT_FORMAT_MIME_TYPES: Record<ExportFormat, string> = {\n csv: 'text/csv; charset=utf-8',\n excel: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n json: 'application/json; charset=utf-8',\n};\n\n// ============= API端点 =============\n\n/** API基础路径 */\nexport const API_BASE_PATH = '/api/universal-export';\n\n/** API端点 */\nexport const API_ENDPOINTS = {\n /** 获取配置列表 */\n GET_CONFIGS: `${API_BASE_PATH}/configs`,\n /** 创建配置 */\n CREATE_CONFIG: `${API_BASE_PATH}/configs`,\n /** 更新配置 */\n UPDATE_CONFIG: (configId: string) => `${API_BASE_PATH}/configs/${configId}`,\n /** 删除配置 */\n DELETE_CONFIG: (configId: string) => `${API_BASE_PATH}/configs/${configId}`,\n /** 触发导出 */\n EXPORT_DATA: `${API_BASE_PATH}/export`,\n /** 查询导出进度 */\n GET_PROGRESS: (exportId: string) => `${API_BASE_PATH}/export/${exportId}/progress`,\n /** 下载导出文件 */\n DOWNLOAD_FILE: (exportId: string) => `${API_BASE_PATH}/export/${exportId}/download`,\n} as const;\n\n// ============= 错误代码 =============\n\n/** 错误代码 */\nexport const ERROR_CODES = {\n /** 导出配置错误 */\n EXPORT_CONFIG_ERROR: 'EXPORT_CONFIG_ERROR',\n /** 导出数据错误 */\n EXPORT_DATA_ERROR: 'EXPORT_DATA_ERROR',\n /** 导出文件错误 */\n EXPORT_FILE_ERROR: 'EXPORT_FILE_ERROR',\n /** 网络错误 */\n NETWORK_ERROR: 'NETWORK_ERROR',\n /** 超时错误 */\n TIMEOUT_ERROR: 'TIMEOUT_ERROR',\n /** 未授权 */\n UNAUTHORIZED: 'UNAUTHORIZED',\n /** 服务器错误 */\n SERVER_ERROR: 'SERVER_ERROR',\n} as const;\n","/**\n * 通用导出服务工具函数\n */\n\nimport type { ExportFormat, Formatter } from './types';\nimport { EXPORT_FORMAT_EXTENSIONS } from './constants';\n\n// ============= 文件名处理 =============\n\n/**\n * 生成导出文件名\n */\nexport function generateExportFileName(template: string, format: ExportFormat): string {\n const now = new Date();\n const dateStr = now.toISOString().split('T')[0] || '';\n const timeStr = (now.toTimeString().split(' ')[0] || '').replace(/:/g, '-');\n const extension = EXPORT_FORMAT_EXTENSIONS[format];\n\n return (\n template\n .replace('{date}', dateStr)\n .replace('{time}', timeStr)\n .replace('{timestamp}', now.getTime().toString()) + `.${extension}`\n );\n}\n\n/**\n * 验证文件名是否合法\n */\nexport function validateFileName(fileName: string): boolean {\n // 检查是否包含非法字符\n const invalidChars = /[<>:\"|?*\\/\\\\]/;\n if (invalidChars.test(fileName)) {\n return false;\n }\n\n // 检查长度\n if (fileName.length === 0 || fileName.length > 255) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 清理文件名,移除非法字符\n */\nexport function sanitizeFileName(fileName: string): string {\n return fileName.replace(/[<>:\"|?*\\/\\\\]/g, '_').substring(0, 255);\n}\n\n// ============= CSV处理 =============\n\n/**\n * 转义CSV字段\n */\nexport function escapeCSVField(value: string, delimiter: string = ','): string {\n const valueStr = String(value || '');\n\n // 如果包含分隔符、双引号或换行符,需要用双引号包裹并转义内部的双引号\n if (valueStr.includes(delimiter) || valueStr.includes('\"') || valueStr.includes('\\n')) {\n return `\"${valueStr.replace(/\"/g, '\"\"')}\"`;\n }\n\n return valueStr;\n}\n\n/**\n * 解析CSV字段\n */\nexport function parseCSVField(field: string): string {\n // 如果字段被双引号包裹,移除双引号并还原转义的双引号\n if (field.startsWith('\"') && field.endsWith('\"')) {\n return field.slice(1, -1).replace(/\"\"/g, '\"');\n }\n\n return field;\n}\n\n// ============= 数据格式化 =============\n\n/**\n * 内置格式化器集合\n */\nexport const DEFAULT_FORMATTERS: Record<string, Formatter> = {\n // 日期格式化\n date: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n if (isNaN(date.getTime())) return String(value);\n return date.toISOString().split('T')[0] || '';\n },\n\n // 时间格式化\n datetime: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n if (isNaN(date.getTime())) return String(value);\n return date.toLocaleString('zh-CN');\n },\n\n // 数字格式化\n number: (value: any) => {\n if (value === null || value === undefined) return '';\n return String(value);\n },\n\n // 货币格式化\n currency: (value: any) => {\n if (value === null || value === undefined) return '';\n return `¥${Number(value).toFixed(2)}`;\n },\n\n // 百分比格式化\n percentage: (value: any) => {\n if (value === null || value === undefined) return '';\n return `${(Number(value) * 100).toFixed(2)}%`;\n },\n\n // 布尔值格式化\n boolean: (value: any) => {\n if (value === null || value === undefined) return '';\n return value ? '是' : '否';\n },\n\n // 数组格式化\n array: (value: any) => {\n if (!Array.isArray(value)) return '';\n return value.join(', ');\n },\n\n // 对象格式化\n object: (value: any) => {\n if (!value || typeof value !== 'object') return '';\n return JSON.stringify(value);\n },\n};\n\n/**\n * 应用格式化器\n */\nexport function applyFormatter(value: any, formatter?: Formatter, type?: string): string {\n // 优先使用自定义格式化器\n if (formatter) {\n return formatter(value);\n }\n\n // 使用类型对应的默认格式化器\n if (type && DEFAULT_FORMATTERS[type]) {\n return DEFAULT_FORMATTERS[type](value);\n }\n\n // 默认转字符串\n return String(value || '');\n}\n\n// ============= 数据验证 =============\n\n/**\n * 验证导出配置\n */\nexport function validateExportConfig(config: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 检查必填字段\n if (!config.name || config.name.trim() === '') {\n errors.push('配置名称不能为空');\n }\n\n if (!config.fields || !Array.isArray(config.fields) || config.fields.length === 0) {\n errors.push('至少需要定义一个字段');\n }\n\n if (config.fields) {\n const enabledFields = config.fields.filter((f: any) => f.enabled);\n if (enabledFields.length === 0) {\n errors.push('至少需要启用一个字段');\n }\n\n // 检查字段键名唯一性\n const keys = config.fields.map((f: any) => f.key);\n const uniqueKeys = new Set(keys);\n if (keys.length !== uniqueKeys.size) {\n errors.push('字段键名必须唯一');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * 验证导出请求\n */\nexport function validateExportRequest(request: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!request.configId) {\n errors.push('导出配置ID不能为空');\n }\n\n if (!request.dataSource) {\n errors.push('数据源不能为空');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n// ============= 文件大小格式化 =============\n\n/**\n * 格式化文件大小\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${units[i]}`;\n}\n\n// ============= 时间处理 =============\n\n/**\n * 格式化持续时间\n */\nexport function formatDuration(milliseconds: number): string {\n if (milliseconds < 1000) {\n return `${milliseconds}ms`;\n }\n\n const seconds = Math.floor(milliseconds / 1000);\n\n if (seconds < 60) {\n return `${seconds}秒`;\n }\n\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n\n if (minutes < 60) {\n return remainingSeconds > 0 ? `${minutes}分${remainingSeconds}秒` : `${minutes}分钟`;\n }\n\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n\n return remainingMinutes > 0 ? `${hours}小时${remainingMinutes}分钟` : `${hours}小时`;\n}\n\n/**\n * 计算预计完成时间\n */\nexport function estimateEndTime(\n startTime: Date,\n processedRows: number,\n totalRows: number\n): Date | undefined {\n if (processedRows === 0 || totalRows === 0) {\n return undefined;\n }\n\n const elapsed = Date.now() - startTime.getTime();\n const avgTimePerRow = elapsed / processedRows;\n const remainingRows = totalRows - processedRows;\n const remainingTime = avgTimePerRow * remainingRows;\n\n return new Date(Date.now() + remainingTime);\n}\n\n// ============= 数据处理 =============\n\n/**\n * 获取嵌套对象的值\n */\nexport function getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => {\n return current && current[key] !== undefined ? current[key] : null;\n }, obj);\n}\n\n/**\n * 设置嵌套对象的值\n */\nexport function setNestedValue(obj: any, path: string, value: any): void {\n const keys = path.split('.');\n const lastKey = keys.pop();\n\n if (!lastKey) return;\n\n const target = keys.reduce((current, key) => {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n return current[key];\n }, obj);\n\n target[lastKey] = value;\n}\n\n// ============= 错误处理 =============\n\n/**\n * 创建导出错误对象\n */\nexport function createExportError(\n code: string,\n message: string,\n details?: Record<string, any>\n): { code: string; message: string; details?: Record<string, any>; timestamp: Date } {\n return {\n code,\n message,\n details,\n timestamp: new Date(),\n };\n}\n\n/**\n * 格式化错误消息\n */\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return '未知错误';\n}\n","/**\n * 通用导出服务客户端SDK\n *\n * 提供与后端API交互的客户端接口\n */\n\nimport type { ExportConfig, ExportProgress, ExportResult, ExportRequest } from './types';\nimport { API_ENDPOINTS, ERROR_CODES } from './constants';\nimport { createExportError, formatErrorMessage } from './utils';\n\n// ============= 配置类型 =============\n\nexport interface UniversalExportClientConfig {\n /** API基础URL */\n baseUrl?: string;\n /** 请求超时时间(毫秒) */\n timeout?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\n// ============= 客户端类 =============\n\n/**\n * 通用导出服务客户端\n */\nexport class UniversalExportClient {\n private config: UniversalExportClientConfig;\n\n constructor(config: UniversalExportClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl || '',\n timeout: config.timeout || 30000,\n headers: config.headers || {},\n };\n }\n\n // ============= 配置管理API =============\n\n /**\n * 获取模块的导出配置列表\n */\n async getConfigsByModule(moduleId: string, businessId?: string): Promise<ExportConfig[]> {\n const params = new URLSearchParams({ moduleId });\n if (businessId) {\n params.append('businessId', businessId);\n }\n\n const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_CONFIGS}?${params}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`获取配置失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformConfigsFromAPI(data.configs || []);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `获取导出配置失败: ${formatErrorMessage(error)}`,\n { moduleId, businessId, originalError: error }\n );\n }\n }\n\n /**\n * 创建导出配置\n */\n async createConfig(\n config: Omit<ExportConfig, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<ExportConfig> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.CREATE_CONFIG}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(config),\n });\n\n if (!response.ok) {\n throw new Error(`创建配置失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformConfigFromAPI(data.config);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `创建导出配置失败: ${formatErrorMessage(error)}`,\n { config, originalError: error }\n );\n }\n }\n\n /**\n * 更新导出配置\n */\n async updateConfig(configId: string, updates: Partial<ExportConfig>): Promise<ExportConfig> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.UPDATE_CONFIG(configId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'PUT',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updates),\n });\n\n if (!response.ok) {\n throw new Error(`更新配置失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformConfigFromAPI(data.config);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `更新导出配置失败: ${formatErrorMessage(error)}`,\n { configId, updates, originalError: error }\n );\n }\n }\n\n /**\n * 删除导出配置\n */\n async deleteConfig(configId: string): Promise<void> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.DELETE_CONFIG(configId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'DELETE',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`删除配置失败: ${response.statusText}`);\n }\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `删除导出配置失败: ${formatErrorMessage(error)}`,\n { configId, originalError: error }\n );\n }\n }\n\n // ============= 导出执行API =============\n\n /**\n * 触发数据导出\n */\n async exportData(request: Omit<ExportRequest, 'callbacks' | 'dataSource'> & {\n dataSource: any[] | string;\n }): Promise<ExportResult> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.EXPORT_DATA}`;\n\n try {\n // 如果 dataSource 是数组,我们需要将其作为请求体的一部分\n const isDataArray = Array.isArray(request.dataSource);\n\n const requestBody: any = {\n configId: request.configId,\n queryParams: request.queryParams,\n fieldMapping: request.fieldMapping,\n filters: request.filters,\n sortBy: request.sortBy,\n pagination: request.pagination,\n customFileName: request.customFileName,\n };\n\n // 如果是数组数据,直接包含在请求体中\n if (isDataArray) {\n requestBody.data = request.dataSource;\n } else {\n requestBody.dataSource = request.dataSource;\n }\n\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData;\n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n throw new Error(errorData.message || `导出失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformExportResultFromAPI(data.result);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.EXPORT_DATA_ERROR,\n `数据导出失败: ${formatErrorMessage(error)}`,\n { request, originalError: error }\n );\n }\n }\n\n /**\n * 查询导出进度\n */\n async getExportProgress(exportId: string): Promise<ExportProgress> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_PROGRESS(exportId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`获取导出进度失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformProgressFromAPI(data.progress);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `获取导出进度失败: ${formatErrorMessage(error)}`,\n { exportId, originalError: error }\n );\n }\n }\n\n /**\n * 下载导出文件\n */\n async downloadExportFile(exportId: string): Promise<Blob> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.DOWNLOAD_FILE(exportId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`下载文件失败: ${response.statusText}`);\n }\n\n return await response.blob();\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n `下载导出文件失败: ${formatErrorMessage(error)}`,\n { exportId, originalError: error }\n );\n }\n }\n\n // ============= 私有辅助方法 =============\n\n /**\n * 获取请求头\n */\n private getHeaders(): Record<string, string> {\n return {\n ...this.config.headers,\n };\n }\n\n /**\n * 带超时的fetch请求\n */\n private async fetchWithTimeout(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw createExportError(ERROR_CODES.TIMEOUT_ERROR, '请求超时', {\n url,\n timeout: this.config.timeout,\n });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * 转换API返回的配置数据\n */\n private transformConfigFromAPI(apiConfig: any): ExportConfig {\n return {\n id: apiConfig.id,\n name: apiConfig.name,\n description: apiConfig.description || undefined,\n format: apiConfig.format,\n fields: apiConfig.fields,\n grouping: apiConfig.grouping,\n fileNameTemplate: apiConfig.fileNameTemplate,\n includeHeader: apiConfig.includeHeader,\n delimiter: apiConfig.delimiter,\n encoding: apiConfig.encoding,\n addBOM: apiConfig.addBOM,\n maxRows: apiConfig.maxRows || undefined,\n createdAt: new Date(apiConfig.createdAt),\n updatedAt: new Date(apiConfig.updatedAt),\n moduleId: apiConfig.moduleId,\n businessId: apiConfig.businessId || undefined,\n createdBy: apiConfig.createdBy || undefined,\n };\n }\n\n /**\n * 转换API返回的配置列表\n */\n private transformConfigsFromAPI(apiConfigs: any[]): ExportConfig[] {\n return apiConfigs.map((config) => this.transformConfigFromAPI(config));\n }\n\n /**\n * 转换API返回的导出结果\n */\n private transformExportResultFromAPI(apiResult: any): ExportResult {\n return {\n exportId: apiResult.exportId,\n fileName: apiResult.fileName,\n fileSize: apiResult.fileSize,\n fileUrl: apiResult.fileUrl,\n exportedRows: apiResult.exportedRows,\n startTime: new Date(apiResult.startTime),\n endTime: new Date(apiResult.endTime),\n duration: apiResult.duration,\n statistics: apiResult.statistics,\n };\n }\n\n /**\n * 转换API返回的进度数据\n */\n private transformProgressFromAPI(apiProgress: any): ExportProgress {\n return {\n exportId: apiProgress.exportId,\n status: apiProgress.status,\n progress: apiProgress.progress,\n processedRows: apiProgress.processedRows,\n totalRows: apiProgress.totalRows,\n startTime: new Date(apiProgress.startTime),\n estimatedEndTime: apiProgress.estimatedEndTime\n ? new Date(apiProgress.estimatedEndTime)\n : undefined,\n currentData: apiProgress.currentData,\n error: apiProgress.error,\n };\n }\n}\n\n// ============= 单例导出 =============\n\n/**\n * 默认客户端实例\n */\nexport const universalExportClient = new UniversalExportClient();\n\n/**\n * 创建自定义客户端实例\n */\nexport function createExportClient(config?: UniversalExportClientConfig): UniversalExportClient {\n return new UniversalExportClient(config);\n}\n","/**\n * 导出配置编辑器组件\n * \n * 提供可视化的导出字段配置编辑功能\n */\n\n'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { \n Settings, \n Trash2, \n Eye, \n EyeOff, \n MoveUp, \n MoveDown, \n Save, \n X,\n FileText,\n Calendar,\n Hash,\n CheckSquare,\n Type,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Group,\n GitMerge,\n Layers,\n ArrowUpDown,\n FileSpreadsheet,\n Database\n} from 'lucide-react';\n\nimport type { \n ExportConfig, \n ExportField, \n FieldType, \n FieldAlignment,\n ExportFormat,\n GroupingConfig,\n GroupingField,\n GroupingMode,\n GroupValueProcessing\n} from '../types';\n\n// ============= 类型定义 =============\n\nexport interface ExportConfigEditorProps {\n /** 初始配置 */\n initialConfig?: ExportConfig;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 可用的字段定义 */\n availableFields: ExportField[];\n /** 保存配置回调 */\n onSave?: (config: ExportConfig) => void;\n /** 取消回调 */\n onCancel?: () => void;\n /** 是否显示 */\n visible?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 配置变化回调(新增/删除/更新) */\n onConfigChange?: () => void;\n}\n\n// ============= 字段类型图标映射 =============\n\nconst FIELD_TYPE_ICONS: Record<FieldType, React.ReactNode> = {\n string: <Type className=\"w-4 h-4\" />,\n number: <Hash className=\"w-4 h-4\" />,\n date: <Calendar className=\"w-4 h-4\" />,\n boolean: <CheckSquare className=\"w-4 h-4\" />,\n array: <FileText className=\"w-4 h-4\" />,\n object: <FileText className=\"w-4 h-4\" />,\n};\n\nconst FIELD_TYPE_LABELS: Record<FieldType, string> = {\n string: '文本',\n number: '数字',\n date: '日期',\n boolean: '布尔',\n array: '数组',\n object: '对象',\n};\n\nconst ALIGNMENT_ICONS: Record<FieldAlignment, React.ReactNode> = {\n left: <AlignLeft className=\"w-4 h-4\" />,\n center: <AlignCenter className=\"w-4 h-4\" />,\n right: <AlignRight className=\"w-4 h-4\" />,\n};\n\nconst ALIGNMENT_LABELS: Record<FieldAlignment, string> = {\n left: '左对齐',\n center: '居中对齐',\n right: '右对齐',\n};\n\n// ============= 分组相关标签 =============\n\nconst GROUPING_MODE_LABELS: Record<GroupingMode, string> = {\n merge: '合并模式',\n separate: '分离模式',\n nested: '嵌套模式',\n};\n\nconst GROUPING_MODE_DESCRIPTIONS: Record<GroupingMode, string> = {\n merge: '同组数据合并显示,Excel支持单元格合并',\n separate: '每个分组独立显示,可添加分组头',\n nested: '支持多级嵌套分组',\n};\n\nconst VALUE_PROCESSING_LABELS: Record<GroupValueProcessing, string> = {\n first: '取第一个值',\n last: '取最后一个值',\n concat: '连接所有值',\n sum: '求和',\n count: '计数',\n custom: '自定义处理',\n};\n\nconst FORMAT_ICONS: Record<ExportFormat, React.ReactNode> = {\n csv: <FileText className=\"w-4 h-4\" />,\n excel: <FileSpreadsheet className=\"w-4 h-4\" />,\n json: <Database className=\"w-4 h-4\" />,\n};\n\nconst FORMAT_DESCRIPTIONS: Record<ExportFormat, string> = {\n csv: '逗号分隔值文件,兼容性最好',\n excel: 'Excel表格文件,支持格式化和单元格合并',\n json: 'JSON数据文件,适合开发者使用',\n};\n\n// ============= 主组件 =============\n\nexport const ExportConfigEditor: React.FC<ExportConfigEditorProps> = ({\n initialConfig,\n moduleId,\n businessId,\n availableFields,\n onSave,\n onCancel,\n visible = false,\n className = '',\n onConfigChange,\n}) => {\n // ============= 状态管理 =============\n \n const [config, setConfig] = useState<ExportConfig>(() => {\n if (initialConfig) {\n return { ...initialConfig };\n }\n \n // 创建默认配置\n return {\n id: '',\n name: '新建导出配置',\n description: '',\n format: 'csv',\n fields: availableFields.map((field, index) => ({\n ...field,\n enabled: true,\n sortOrder: index,\n })),\n grouping: {\n enabled: false,\n fields: [],\n preserveOrder: true,\n nullValueHandling: 'separate',\n nullGroupName: '未分组'\n },\n fileNameTemplate: '导出数据_{date}',\n includeHeader: true,\n delimiter: ',',\n encoding: 'utf-8',\n addBOM: true,\n maxRows: undefined,\n createdAt: new Date(),\n updatedAt: new Date(),\n moduleId,\n businessId,\n };\n });\n\n const [activeTab, setActiveTab] = useState<'basic' | 'fields' | 'grouping' | 'manage'>('basic');\n \n // 配置管理相关状态\n const [savedConfigs, setSavedConfigs] = useState<ExportConfig[]>([]);\n const [loadingConfigs, setLoadingConfigs] = useState(false);\n const [deletingConfigId, setDeletingConfigId] = useState<string | null>(null);\n\n // 加载已保存的配置\n const loadSavedConfigs = useCallback(async () => {\n if (!visible || activeTab !== 'manage') return;\n \n setLoadingConfigs(true);\n try {\n const params = new URLSearchParams({ moduleId });\n if (businessId) {\n params.set('businessId', businessId);\n }\n \n const response = await fetch(`/api/universal-export/configs?${params.toString()}`);\n if (response.ok) {\n const data = await response.json();\n setSavedConfigs(data.configs || []);\n }\n } catch (error) {\n console.error('加载配置异常:', error);\n } finally {\n setLoadingConfigs(false);\n }\n }, [visible, activeTab, moduleId, businessId]);\n\n // 删除配置\n const deleteConfig = useCallback(async (configId: string) => {\n setDeletingConfigId(configId);\n try {\n const response = await fetch(`/api/universal-export/configs/${configId}`, {\n method: 'DELETE'\n });\n if (response.ok) {\n setSavedConfigs(prev => prev.filter(cfg => cfg.id !== configId));\n onConfigChange?.();\n }\n } catch (error) {\n console.error('删除配置失败:', error);\n } finally {\n setDeletingConfigId(null);\n }\n }, [onConfigChange]);\n\n // 加载配置到编辑器\n const loadConfigToEditor = useCallback((config: ExportConfig) => {\n setConfig(config);\n setActiveTab('basic');\n }, []);\n\n // 当切换到管理tab时加载配置\n useEffect(() => {\n if (activeTab === 'manage') {\n loadSavedConfigs();\n }\n }, [activeTab, loadSavedConfigs]);\n\n // 阻止背景滚动\n useEffect(() => {\n if (!visible) return;\n \n const scrollY = window.scrollY;\n document.body.style.position = 'fixed';\n document.body.style.top = `-${scrollY}px`;\n document.body.style.left = '0';\n document.body.style.right = '0';\n document.body.style.overflow = 'hidden';\n \n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel?.();\n }\n };\n \n document.addEventListener('keydown', handleKeyDown);\n \n return () => {\n document.body.style.position = '';\n document.body.style.top = '';\n document.body.style.left = '';\n document.body.style.right = '';\n document.body.style.overflow = '';\n window.scrollTo(0, scrollY);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [visible, onCancel]);\n\n // ============= 字段管理 =============\n\n const toggleFieldEnabled = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.map(field =>\n field.key === fieldKey\n ? { ...field, enabled: !field.enabled }\n : field\n ),\n }));\n }, []);\n\n const updateField = useCallback((fieldKey: string, updates: Partial<ExportField>) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.map(field =>\n field.key === fieldKey\n ? { ...field, ...updates }\n : field\n ),\n }));\n }, []);\n\n const moveField = useCallback((fieldKey: string, direction: 'up' | 'down') => {\n setConfig(prev => {\n const fields = [...prev.fields];\n const index = fields.findIndex(f => f.key === fieldKey);\n \n if (direction === 'up' && index > 0) {\n const temp = fields[index - 1]!;\n fields[index - 1] = fields[index]!;\n fields[index] = temp;\n } else if (direction === 'down' && index < fields.length - 1) {\n const temp = fields[index + 1]!;\n fields[index + 1] = fields[index]!;\n fields[index] = temp;\n }\n \n return {\n ...prev,\n fields: fields.map((field, idx) => ({ ...field, sortOrder: idx })),\n };\n });\n }, []);\n\n const removeField = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.filter(f => f.key !== fieldKey),\n }));\n }, []);\n\n // ============= 分组配置管理 =============\n\n const toggleGrouping = useCallback((enabled: boolean) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n enabled,\n },\n }));\n }, []);\n\n const addGroupingField = useCallback((fieldKey: string) => {\n const field = config.fields.find(f => f.key === fieldKey);\n if (!field) return;\n\n const groupField: GroupingField = {\n key: field.key,\n label: field.label,\n mode: 'merge',\n valueProcessing: 'first',\n showGroupHeader: false,\n mergeCells: true,\n };\n\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: [...prev.grouping!.fields, groupField],\n },\n }));\n }, [config.fields]);\n\n const removeGroupingField = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: prev.grouping!.fields.filter(f => f.key !== fieldKey),\n },\n }));\n }, []);\n\n const updateGroupingField = useCallback((fieldKey: string, updates: Partial<GroupingField>) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: prev.grouping!.fields.map(field =>\n field.key === fieldKey\n ? { ...field, ...updates }\n : field\n ),\n },\n }));\n }, []);\n\n const moveGroupingField = useCallback((fieldKey: string, direction: 'up' | 'down') => {\n setConfig(prev => {\n const fields = [...prev.grouping!.fields];\n const index = fields.findIndex(f => f.key === fieldKey);\n \n if (direction === 'up' && index > 0) {\n const temp = fields[index - 1]!;\n fields[index - 1] = fields[index]!;\n fields[index] = temp;\n } else if (direction === 'down' && index < fields.length - 1) {\n const temp = fields[index + 1]!;\n fields[index + 1] = fields[index]!;\n fields[index] = temp;\n }\n \n return {\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields,\n },\n };\n });\n }, []);\n\n const updateGroupingConfig = useCallback((updates: Partial<GroupingConfig>) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n ...updates,\n },\n }));\n }, []);\n\n // ============= 保存配置 =============\n\n const handleSave = useCallback(() => {\n if (!config.name.trim()) {\n alert('请输入配置名称');\n return;\n }\n\n const enabledFields = config.fields.filter(f => f.enabled);\n if (enabledFields.length === 0) {\n alert('至少需要启用一个字段');\n return;\n }\n\n const updatedConfig: ExportConfig = {\n ...config,\n updatedAt: new Date(),\n };\n\n onSave?.(updatedConfig);\n onConfigChange?.();\n }, [config, onSave, onConfigChange]);\n\n // ============= 渲染组件 =============\n\n if (!visible) {\n return null;\n }\n\n const tabs = [\n { id: 'basic' as const, label: '基本配置', icon: <Settings className=\"w-4 h-4\" />, description: '配置名称、格式和基本选项' },\n { id: 'fields' as const, label: '字段设置', icon: <Type className=\"w-4 h-4\" />, description: '选择和配置导出字段' },\n { id: 'grouping' as const, label: '分组设置', icon: <Group className=\"w-4 h-4\" />, description: '配置数据分组和合并选项' },\n { id: 'manage' as const, label: '配置管理', icon: <Database className=\"w-4 h-4\" />, description: '管理已保存的导出配置' },\n ];\n\n return (\n <div \n className={`fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-[50] p-4 ${className}`}\n onClick={onCancel}\n >\n <div \n className=\"bg-white rounded-lg shadow-xl w-full max-w-5xl max-h-[90vh] flex flex-col\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-4 border-b flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <Settings className=\"w-6 h-6 text-blue-600\" />\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900\">导出配置编辑器</h2>\n <p className=\"text-sm text-gray-600\">配置导出字段和格式选项</p>\n </div>\n </div>\n <button onClick={onCancel} className=\"p-2 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded-lg\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Tab导航 */}\n <div className=\"border-b bg-gray-50 flex-shrink-0\">\n <nav className=\"flex space-x-1 p-2\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={`flex items-center gap-2 px-4 py-3 text-sm font-medium rounded-lg transition-colors ${\n activeTab === tab.id ? 'bg-white text-blue-600 shadow-sm border border-gray-200' : 'text-gray-600 hover:text-gray-900'\n }`}\n >\n {tab.icon}\n <span>{tab.label}</span>\n </button>\n ))}\n </nav>\n </div>\n\n {/* Tab内容 */}\n <div className=\"flex-1 overflow-hidden flex flex-col\">\n <div className=\"bg-blue-50 border-b border-blue-100 p-4 flex-shrink-0\">\n <div className=\"flex items-center gap-2 text-blue-800 text-sm font-medium\">\n {tabs.find(t => t.id === activeTab)?.icon}\n {tabs.find(t => t.id === activeTab)?.description}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4 sm:p-6\">\n {activeTab === 'basic' && (\n <div className=\"max-w-2xl mx-auto space-y-6\">\n <div className=\"space-y-4\">\n <label className=\"block text-sm font-medium text-gray-700\">配置名称 *</label>\n <input\n type=\"text\"\n value={config.name}\n onChange={(e) => setConfig(prev => ({ ...prev, name: e.target.value }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n />\n <label className=\"block text-sm font-medium text-gray-700\">描述</label>\n <textarea\n value={config.description}\n onChange={(e) => setConfig(prev => ({ ...prev, description: e.target.value }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n rows={3}\n />\n <label className=\"block text-sm font-medium text-gray-700\">导出格式</label>\n <div className=\"space-y-3\">\n {(['csv', 'excel', 'json'] as ExportFormat[]).map((format) => (\n <label key={format} className=\"flex items-start gap-3 p-3 border rounded-lg cursor-pointer hover:border-blue-300\">\n <input\n type=\"radio\"\n checked={config.format === format}\n onChange={() => setConfig(prev => ({ ...prev, format }))}\n className=\"mt-1\"\n />\n <div>\n <div className=\"flex items-center gap-2 font-medium\">\n {FORMAT_ICONS[format]} {format.toUpperCase()}\n </div>\n <p className=\"text-sm text-gray-600\">{FORMAT_DESCRIPTIONS[format]}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {activeTab === 'fields' && (\n <div className=\"space-y-4\">\n {config.fields.map((field, index) => (\n <div key={field.key} className=\"flex items-center gap-3 p-3 border rounded-lg bg-white\">\n <button onClick={() => toggleFieldEnabled(field.key)} className={field.enabled ? 'text-blue-600' : 'text-gray-400'}>\n {field.enabled ? <Eye className=\"w-4 h-4\" /> : <EyeOff className=\"w-4 h-4\" />}\n </button>\n <div className=\"flex-1\">\n <div className=\"font-medium\">{field.label}</div>\n <div className=\"text-xs text-gray-500\">{field.key}</div>\n </div>\n <div className=\"flex gap-1\">\n <button onClick={() => moveField(field.key, 'up')} disabled={index === 0} className=\"disabled:opacity-30\"><MoveUp className=\"w-4 h-4\" /></button>\n <button onClick={() => moveField(field.key, 'down')} disabled={index === config.fields.length - 1} className=\"disabled:opacity-30\"><MoveDown className=\"w-4 h-4\" /></button>\n <button onClick={() => removeField(field.key)} className=\"text-red-600\"><Trash2 className=\"w-4 h-4\" /></button>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {activeTab === 'grouping' && (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-lg font-medium flex items-center gap-2\"><Group className=\"w-5 h-5 text-blue-600\" /> 分组配置</h3>\n <label className=\"flex items-center gap-2\">\n <input type=\"checkbox\" checked={config.grouping?.enabled} onChange={(e) => toggleGrouping(e.target.checked)} />\n 启用分组\n </label>\n </div>\n {config.grouping?.enabled && (\n <div className=\"space-y-4\">\n {config.grouping.fields.map((gf, index) => (\n <div key={gf.key} className=\"p-4 border rounded-lg bg-blue-50 border-blue-200\">\n <div className=\"flex justify-between items-center mb-4\">\n <span className=\"font-medium text-blue-900\">{gf.label}</span>\n <button onClick={() => removeGroupingField(gf.key)} className=\"text-red-600\"><Trash2 className=\"w-4 h-4\" /></button>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <select value={gf.mode} onChange={(e) => updateGroupingField(gf.key, { mode: e.target.value as GroupingMode })} className=\"border rounded p-2\">\n <option value=\"merge\">合并模式</option>\n <option value=\"separate\">分离模式</option>\n <option value=\"nested\">嵌套模式</option>\n </select>\n <select value={gf.valueProcessing} onChange={(e) => updateGroupingField(gf.key, { valueProcessing: e.target.value as GroupValueProcessing })} className=\"border rounded p-2\">\n <option value=\"first\">首值</option>\n <option value=\"sum\">求和</option>\n <option value=\"count\">计数</option>\n </select>\n </div>\n </div>\n ))}\n <select onChange={(e) => e.target.value && addGroupingField(e.target.value)} className=\"w-full border rounded p-2\">\n <option value=\"\">添加分组字段...</option>\n {config.fields.filter(f => f.enabled && !config.grouping?.fields.some(gf => gf.key === f.key)).map(f => (\n <option key={f.key} value={f.key}>{f.label}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'manage' && (\n <div className=\"space-y-4\">\n {loadingConfigs ? <div className=\"text-center py-10\">加载中...</div> : savedConfigs.map(sc => (\n <div key={sc.id} className=\"flex justify-between items-center p-4 border rounded-lg\">\n <div>\n <div className=\"font-medium\">{sc.name}</div>\n <div className=\"text-sm text-gray-500\">{sc.format}</div>\n </div>\n <div className=\"flex gap-2\">\n <button onClick={() => loadConfigToEditor(sc)} className=\"text-blue-600 px-3 py-1 border rounded\">编辑</button>\n <button onClick={() => deleteConfig(sc.id)} className=\"text-red-600 px-3 py-1 border rounded\">删除</button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* 底部 */}\n <div className=\"flex justify-end gap-3 p-4 border-t bg-gray-50\">\n <button onClick={onCancel} className=\"px-4 py-2 border rounded\">取消</button>\n {activeTab !== 'manage' && (\n <button onClick={handleSave} className=\"px-4 py-2 bg-blue-600 text-white rounded flex items-center gap-2\">\n <Save className=\"w-4 h-4\" /> 保存配置\n </button>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n","/**\n * 通用导出按钮组件\n * \n * 提供统一的导出功能入口,支持配置化导出\n */\n\n'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport { \n Download, \n Settings, \n FileText, \n Loader2,\n ChevronDown\n} from 'lucide-react';\n\nimport type { \n ExportConfig, \n ExportField, \n ExportRequest,\n ExportResult,\n ExportProgress \n} from '../types';\n\nimport { ExportConfigEditor } from './ExportConfigEditor';\n\n// ============= 类型定义 =============\n\nexport interface UniversalExportButtonProps {\n /** 导出服务实例 */\n exportService: any; // UniversalExportClient\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 可用的字段定义 */\n availableFields: ExportField[];\n /** 数据源函数 */\n dataSource: () => Promise<any[]>;\n /** 默认配置 */\n defaultConfig?: ExportConfig;\n /** 按钮文本 */\n buttonText?: string;\n /** 按钮样式 */\n variant?: 'primary' | 'secondary' | 'outline';\n /** 按钮大小 */\n size?: 'sm' | 'md' | 'lg';\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 导出成功回调 */\n onExportSuccess?: (result: ExportResult) => void;\n /** 导出失败回调 */\n onExportError?: (error: string) => void;\n /** 配置保存回调 */\n onConfigSave?: (config: ExportConfig) => void;\n}\n\n// ============= 按钮样式配置 =============\n\nconst BUTTON_STYLES = {\n primary: {\n sm: 'px-3 py-1.5 text-sm bg-blue-600 text-white hover:bg-blue-700',\n md: 'px-4 py-2 text-sm bg-blue-600 text-white hover:bg-blue-700',\n lg: 'px-6 py-3 text-base bg-blue-600 text-white hover:bg-blue-700',\n },\n secondary: {\n sm: 'px-3 py-1.5 text-sm bg-gray-600 text-white hover:bg-gray-700',\n md: 'px-4 py-2 text-sm bg-gray-600 text-white hover:bg-gray-700',\n lg: 'px-6 py-3 text-base bg-gray-600 text-white hover:bg-gray-700',\n },\n outline: {\n sm: 'px-3 py-1.5 text-sm border border-gray-300 text-gray-700 hover:bg-gray-50',\n md: 'px-4 py-2 text-sm border border-gray-300 text-gray-700 hover:bg-gray-50',\n lg: 'px-6 py-3 text-base border border-gray-300 text-gray-700 hover:bg-gray-50',\n },\n};\n\n// ============= 主组件 =============\n\nexport const UniversalExportButton: React.FC<UniversalExportButtonProps> = ({\n exportService,\n moduleId,\n businessId,\n availableFields,\n dataSource,\n defaultConfig,\n buttonText = '导出数据',\n variant = 'primary',\n size = 'md',\n disabled = false,\n className = '',\n onExportSuccess,\n onExportError,\n onConfigSave,\n}) => {\n // ============= 状态管理 =============\n \n const [showConfigEditor, setShowConfigEditor] = useState(false);\n const [showDropdown, setShowDropdown] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n const [exportProgress, setExportProgress] = useState<ExportProgress | null>(null);\n const [savedConfigs, setSavedConfigs] = useState<ExportConfig[]>([]);\n\n // 加载保存的配置\n const loadSavedConfigs = useCallback(async () => {\n try {\n if (exportService) {\n const configs = await exportService.getConfigsByModule(moduleId, businessId);\n setSavedConfigs(configs);\n }\n } catch (error) {\n console.error('加载保存的配置失败:', error);\n }\n }, [exportService, moduleId, businessId]);\n\n // 组件挂载时加载配置\n React.useEffect(() => {\n loadSavedConfigs();\n }, [loadSavedConfigs]);\n\n // ============= 导出处理 =============\n\n const handleExport = useCallback(async (config: ExportConfig) => {\n console.log('🚀 [UniversalExportButton] 开始导出:', {\n configId: config.id,\n configName: config.name,\n format: config.format,\n fieldsCount: config.fields.length,\n });\n\n if (!exportService) {\n console.error('❌ [UniversalExportButton] 导出服务未初始化');\n onExportError?.('导出服务未初始化');\n return;\n }\n\n setIsExporting(true);\n setExportProgress(null);\n\n try {\n // 获取数据\n console.log('📊 [UniversalExportButton] 获取数据...');\n const data = await dataSource();\n console.log('✅ [UniversalExportButton] 数据获取成功:', {\n dataType: typeof data,\n isArray: Array.isArray(data),\n length: Array.isArray(data) ? data.length : 'N/A',\n });\n\n // 创建导出请求(不包含回调,因为客户端不支持)\n const request = {\n configId: config,\n dataSource: data, // 传递实际数据而不是函数\n queryParams: undefined,\n fieldMapping: undefined,\n filters: undefined,\n sortBy: undefined,\n pagination: undefined,\n customFileName: undefined,\n };\n\n console.log('📞 [UniversalExportButton] 调用导出服务...');\n const result = await exportService.exportData(request);\n\n console.log('✅ [UniversalExportButton] 导出成功:', {\n fileName: result.fileName,\n fileSize: result.fileSize,\n exportedRows: result.exportedRows,\n });\n\n // 由于客户端不支持进度回调,我们模拟一个完成状态\n const progress: ExportProgress = {\n exportId: result.exportId,\n status: 'completed',\n progress: 100,\n processedRows: result.exportedRows,\n totalRows: result.exportedRows,\n startTime: result.startTime,\n estimatedEndTime: result.endTime,\n };\n setExportProgress(progress);\n\n // 下载文件\n if (result.fileUrl) {\n console.log('📥 [UniversalExportButton] 从URL下载文件...');\n const link = document.createElement('a');\n link.href = result.fileUrl;\n link.download = result.fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n console.log('✅ [UniversalExportButton] 文件下载完成');\n } else if (result.fileBlob) {\n console.log('📥 [UniversalExportButton] 从Blob下载文件...');\n const url = window.URL.createObjectURL(result.fileBlob);\n const link = document.createElement('a');\n link.href = url;\n link.download = result.fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n console.log('✅ [UniversalExportButton] 文件下载完成');\n }\n\n // 延迟清除进度状态\n setTimeout(() => {\n setIsExporting(false);\n setExportProgress(null);\n }, 1000);\n\n onExportSuccess?.(result);\n } catch (error) {\n console.error('❌ [UniversalExportButton] 导出异常:', error);\n setIsExporting(false);\n setExportProgress(null);\n\n // 更好地处理错误信息\n let errorMessage = '导出失败';\n if (error && typeof error === 'object') {\n if ('message' in error && typeof error.message === 'string') {\n errorMessage = error.message;\n } else if ('code' in error && 'message' in error) {\n errorMessage = `${error.code}: ${error.message}`;\n }\n } else if (typeof error === 'string') {\n errorMessage = error;\n }\n\n onExportError?.(errorMessage);\n }\n }, [exportService, dataSource, onExportSuccess, onExportError]);\n\n const handleQuickExport = useCallback(async () => {\n if (defaultConfig) {\n await handleExport(defaultConfig);\n } else {\n // 创建默认配置\n const config: ExportConfig = {\n id: 'quick_export',\n name: '快速导出',\n description: '使用默认配置快速导出',\n format: 'csv',\n fields: availableFields.map((field, index) => ({\n ...field,\n enabled: true,\n sortOrder: index,\n })),\n fileNameTemplate: '导出数据_{date}',\n includeHeader: true,\n delimiter: ',',\n encoding: 'utf-8',\n addBOM: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n moduleId,\n businessId,\n };\n \n await handleExport(config);\n }\n }, [defaultConfig, availableFields, moduleId, businessId, handleExport]);\n\n // ============= 配置管理 =============\n\n const handleConfigSave = useCallback(async (config: ExportConfig) => {\n try {\n if (exportService) {\n const savedConfig = await exportService.createConfig(config);\n // 重新加载配置列表\n await loadSavedConfigs();\n onConfigSave?.(savedConfig);\n }\n setShowConfigEditor(false);\n } catch (error) {\n onExportError?.(error instanceof Error ? error.message : '保存配置失败');\n }\n }, [exportService, onConfigSave, onExportError, loadSavedConfigs]);\n\n // ============= 渲染进度 =============\n\n const renderProgress = () => {\n if (!exportProgress) return null;\n\n const { status, progress, processedRows, totalRows } = exportProgress;\n\n return (\n <div className=\"absolute top-full left-0 right-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg p-4 z-[10]\">\n <div className=\"flex items-center gap-3 mb-2\">\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-600\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {status === 'processing' ? '正在导出...' : '导出完成'}\n </span>\n </div>\n \n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-xs text-gray-600\">\n <span>进度: {progress}%</span>\n <span>{processedRows} / {totalRows} 行</span>\n </div>\n \n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div \n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n </div>\n );\n };\n\n // ============= 渲染下拉菜单 =============\n\n const renderDropdown = () => {\n if (!showDropdown) return null;\n\n return (\n <div className=\"absolute top-full left-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg py-2 z-[10] min-w-48\">\n {/* 快速导出 */}\n <button\n onClick={() => {\n setShowDropdown(false);\n handleQuickExport();\n }}\n disabled={isExporting}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <Download className=\"w-4 h-4\" />\n 快速导出\n </button>\n\n {/* 使用保存的配置 */}\n {savedConfigs.length > 0 && (\n <>\n <div className=\"border-t border-gray-200 my-1\" />\n {savedConfigs.map((config) => (\n <button\n key={config.id}\n onClick={() => {\n setShowDropdown(false);\n handleExport(config);\n }}\n disabled={isExporting}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <FileText className=\"w-4 h-4\" />\n {config.name}\n </button>\n ))}\n </>\n )}\n\n {/* 配置编辑器 */}\n <div className=\"border-t border-gray-200 my-1\" />\n <button\n onClick={() => {\n setShowDropdown(false);\n setShowConfigEditor(true);\n }}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <Settings className=\"w-4 h-4\" />\n 自定义配置\n </button>\n </div>\n );\n };\n\n // ============= 渲染组件 =============\n\n const buttonStyle = BUTTON_STYLES[variant][size];\n const baseClasses = `inline-flex items-center gap-2 rounded-lg font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed ${buttonStyle}`;\n\n return (\n <div className={`relative ${className}`}>\n {/* 主按钮 */}\n <button\n onClick={() => setShowDropdown(!showDropdown)}\n disabled={disabled || isExporting}\n className={`${baseClasses} ${isExporting ? 'cursor-not-allowed' : ''}`}\n >\n {isExporting ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Download className=\"w-4 h-4\" />\n )}\n <span>{isExporting ? '导出中...' : buttonText}</span>\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n\n {/* 下拉菜单 */}\n {renderDropdown()}\n\n {/* 进度显示 */}\n {renderProgress()}\n\n {/* 配置编辑器 */}\n <ExportConfigEditor\n moduleId={moduleId}\n businessId={businessId}\n availableFields={availableFields}\n onSave={handleConfigSave}\n onCancel={() => setShowConfigEditor(false)}\n visible={showConfigEditor}\n onConfigChange={loadSavedConfigs}\n />\n\n {/* 点击外部关闭下拉菜单 */}\n {showDropdown && (\n <div\n className=\"fixed inset-0 z-[0]\"\n onClick={() => setShowDropdown(false)}\n />\n )}\n </div>\n );\n};\n\n"]}