@pfm-platform/budgets-ui-mui 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/BudgetList.tsx","../src/components/BudgetSummary.tsx","../src/components/BudgetCreateForm.tsx","../src/components/BudgetEditForm.tsx","../src/components/BudgetDeleteButton.tsx","../src/components/BudgetProgressCard.tsx","../src/components/BudgetProgressList.tsx","../src/components/BudgetInsightsCard.tsx","../src/components/BudgetInsightDialog.tsx","../src/components/BudgetStateIndicator.tsx","../src/components/BudgetTagInsight.tsx","../src/components/BudgetOverviewMessage.tsx","../src/components/BudgetStepper.tsx"],"names":["jsx","Card","jsxs","CardContent","Typography","Box","Chip","LinearProgress","useState","TextField","Alert","Button","CircularProgress","Dialog","DialogTitle","DialogContent","DialogActions","Grid","WarningIcon","TrendingDownIcon","CheckCircleIcon","TrendingUpIcon","Fragment","ExpandMoreIcon","defaultCurrencyFormatter","DialogContentText","alpha","ErrorIcon","useTheme","InfoIcon","LocalOfferIcon","Divider","AddIcon","error","Paper"],"mappings":";;;;;;;;;AAqBO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,SAAA;AAAA,EACR,cAAA,GAAiB,GAAA;AAAA,EACjB;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,UAAU,iBAAA,CAAkB,EAAE,MAAA,EAAQ,UAAA,EAAY,UAAU,CAAA;AAElE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,MAClC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,0BACC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,oBAAA,EAEnD;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,iBAAiB,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,OAAA;AAE/D,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,MAClC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,IACC,eAAe,MAAA,KAAW,CAAA,uBACxB,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAAiB,8BAEnD,CAAA,mBAEA,GAAA,CAAC,QAAK,cAAA,EAAc,IAAA,EACjB,yBAAe,GAAA,CAAI,CAAC,QAAQ,KAAA,qBAC3B,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAAS,KAAA,GAAQ,cAAA,CAAe,MAAA,GAAS,CAAA;AAAA,QACzC,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,SAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,UAAA,EAAY,YAAA,EAAa;AAAA,QAEhF,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,KAAI,EACxG,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EACvD,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAQ,UAAA,EAAW,QAAA,EACpC,iBAAO,IAAA,EACV,CAAA;AAAA,8BACA,GAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,OAAO,MAAA,CAAO,KAAA;AAAA,kBACd,IAAA,EAAK,OAAA;AAAA,kBACL,KAAA,EAAO,OAAO,KAAA,KAAU,MAAA,GAAS,UAAU,MAAA,CAAO,KAAA,KAAU,SAAS,SAAA,GAAY,SAAA;AAAA,kBACjF,OAAA,EAAQ;AAAA;AAAA;AACV,aAAA,EACF,CAAA;AAAA,4BACA,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,YAAW,QAAA,EACpC,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,cAAgB,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,cAAE,KAAA;AAAA,cAAI,cAAA;AAAA,cAAgB,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,CAAC;AAAA,aAAA,EAC5F;AAAA,WAAA,EACF,CAAA;AAAA,+BACC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,KAAA,EAAO,QAAO,EACvB,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,aAAA;AAAA,gBACR,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,cAAc,GAAG,CAAA;AAAA,gBACxC,KAAA,EAAO,OAAO,KAAA,KAAU,MAAA,GAAS,UAAU,MAAA,CAAO,KAAA,KAAU,SAAS,SAAA,GAAY,SAAA;AAAA,gBACjF,EAAA,EAAI,EAAE,MAAA,EAAQ,CAAA,EAAG,cAAc,CAAA;AAAE;AAAA,aACnC;AAAA,4BACA,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,OAAM,gBAAA,EACjC,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,cAAE,WAAA;AAAA,cAAK,cAAA;AAAA,cAAgB,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA;AAAA,cAAE;AAAA,aAAA,EACnF;AAAA,WAAA,EACF;AAAA;AAAA,OAAA;AAAA,MA9BK,MAAA,CAAO;AAAA,KAgCf,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;ACjFO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,gBAAA;AAAA,EACR,cAAA,GAAiB;AACnB,CAAA,EAAuB;AACrB,EAAA,MAAM,UAAU,gBAAA,CAAiB,EAAE,MAAA,EAAQ,UAAA,EAAY,UAAU,CAAA;AAEjE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACEA,GAAAA,CAACC,IAAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAACC,aAAA,EACC,QAAA,EAAA;AAAA,sBAAAH,IAACI,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,YAAA,EAAY,MAClC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBACAJ,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,2BAAA,EAEnD;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,IAAA,uBACEJ,GAAAA,CAACC,IAAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAACC,aAAA,EACC,QAAA,EAAA;AAAA,sBAAAH,IAACI,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,YAAA,EAAY,MAClC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBACAJ,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,kBAAA,EAEnD;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEJ,GAAAA,CAACC,IAAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAACC,aAAA,EACC,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,GAAE,EACvF,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,MACjB,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBACAJ,GAAAA;AAAA,QAACM,IAAAA;AAAA,QAAA;AAAA,UACC,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,QAAQ,KAAA,KAAU,MAAA,GAAS,UAAU,OAAA,CAAQ,KAAA,KAAU,SAAS,SAAA,GAAY;AAAA;AAAA;AACrF,KAAA,EACF,CAAA;AAAA,oBACAJ,IAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACvB,QAAA,EAAA;AAAA,sBAAAF,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,GACV,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAAiB,YAAA,EAAY,IAAA,EAAC,QAAA,EAAA,eAAA,EAEhE,CAAA;AAAA,wBACAJ,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAM,kBAAQ,YAAA,EAAa;AAAA,OAAA,EACjD,CAAA,EACF,CAAA;AAAA,sBACAJ,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,GACV,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAAiB,YAAA,EAAY,IAAA,EAAC,QAAA,EAAA,cAAA,EAEhE,CAAA;AAAA,wBACAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,SAAQ,IAAA,EACjB,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,UAAgB,OAAA,CAAQ,WAAA,CAAY,OAAA,CAAQ,CAAC;AAAA,SAAA,EAChD;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAJ,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,GACV,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAAiB,YAAA,EAAY,IAAA,EAAC,QAAA,EAAA,aAAA,EAEhE,CAAA;AAAA,wBACAF,IAAAA;AAAA,UAACE,UAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,OAAA,CAAQ,KAAA,KAAU,MAAA,GAAS,YAAA,GAAe,cAAA;AAAA,YAEhD,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,cAAgB,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,CAAC;AAAA;AAAA;AAAA;AAC/C,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAJ,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,GACV,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAAiB,YAAA,EAAY,IAAA,EAAC,QAAA,EAAA,WAAA,EAEhE,CAAA;AAAA,wBACAF,IAAAA;AAAA,UAACE,UAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,OAAA,CAAQ,cAAA,IAAkB,CAAA,GAAI,cAAA,GAAiB,YAAA;AAAA,YAErD,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,cAAgB,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,CAAC;AAAA;AAAA;AAAA;AACnD,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAJ,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IACV,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAH,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,GAAA,EAAI,EACnE,QAAA,EAAA;AAAA,0BAAAL,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,kBAAA,EAEnD,CAAA;AAAA,0BACAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,YAAW,QAAA,EACpC,QAAA,EAAA;AAAA,YAAA,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,YAAE;AAAA,WAAA,EACnC;AAAA,SAAA,EACF,CAAA;AAAA,wBACAJ,GAAAA;AAAA,UAACO,cAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,aAAA;AAAA,YACR,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,cAAc,GAAG,CAAA;AAAA,YACzC,KAAA,EAAO,QAAQ,KAAA,KAAU,MAAA,GAAS,UAAU,OAAA,CAAQ,KAAA,KAAU,SAAS,SAAA,GAAY,SAAA;AAAA,YACnF,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,cAAc,CAAA;AAAE;AAAA;AACpC,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACxHO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,MAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAe,eAAA,CAAgB;AAAA,IACnC,WAAW,MAAM;AACf,MAAA,OAAA,CAAQ,EAAE,CAAA;AACV,MAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,SAAA,IAAY;AAAA,IACd,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,yBAAyB,CAAA;AAAA,IACzE;AAAA,GACD,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,MAAA,QAAA,CAAS,yBAAyB,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,WAAW,YAAY,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA,IAAU,CAAA,EAAG;AAChC,MAAA,QAAA,CAAS,yCAAyC,CAAA;AAClD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAO,QAAA,CACV,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,CAAA,CACvB,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,CAAC,CAAA;AAEjC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,QAAA,CAAS,8BAA8B,CAAA;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAqB;AAAA,MACzB,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,aAAA,EAAe,MAAA;AAAA,MACf,SAAA,EAAW,IAAA;AAAA,MACX,iBAAA,EAAmB;AAAA,KACrB;AAEA,IAAA,YAAA,CAAa,MAAA,CAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,uBACEL,IAAAA,CAAC,KAAA,EAAA,EAAM,IAAI,EAAE,CAAA,EAAG,GAAE,EAChB,QAAA,EAAA;AAAA,oBAAAF,IAACI,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,YAAA,EAAY,MAAC,QAAA,EAAA,eAAA,EAEtC,CAAA;AAAA,oBACAF,IAAAA;AAAA,MAACG,GAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,MAAA;AAAA,QACV,QAAA,EAAU,YAAA;AAAA,QACV,IAAI,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,KAAK,CAAA,EAAE;AAAA,QAEvD,QAAA,EAAA;AAAA,0BAAAL,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,aAAA;AAAA,cACN,KAAA,EAAO,IAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AACtB,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,OAAO,CAAC,CAAC,KAAA,IAAS,CAAC,KAAK,IAAA,EAAK;AAAA,cAC7B,UAAA,EAAW,0DAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,SAAA,EAAW;AAAA;AACb;AAAA,WACF;AAAA,0BAEAA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,eAAA;AAAA,cACN,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,YAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9B,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,KAAA,EAAO,CAAC,CAAC,KAAA,KAAU,KAAA,CAAM,UAAA,CAAW,YAAY,CAAC,CAAA,IAAK,UAAA,CAAW,YAAY,CAAA,IAAK,CAAA,CAAA;AAAA,cAClF,UAAA,EAAW,8CAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,GAAA,EAAK,IAAA;AAAA,gBACL,IAAA,EAAM;AAAA;AACR;AAAA,WACF;AAAA,0BAEAA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,wBAAA;AAAA,cACN,KAAA,EAAO,QAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAC1B,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,KAAA,EAAO,CAAC,CAAC,KAAA,IAAS,SAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,EAAE,MAAA,KAAW,CAAA;AAAA,cACzE,UAAA,EAAW,sEAAA;AAAA,cACX,SAAA,EAAS,IAAA;AAAA,cACT,IAAA,EAAM;AAAA;AAAA,WACR;AAAA,UAEC,KAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA,EACjD,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,0BAGFA,GAAAA,CAACK,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAE,EACjC,QAAA,kBAAAL,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,WAAA;AAAA,cACR,QAAA,EAAU,YAAA,CAAa,SAAA,IAAa,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,CAAC,YAAA,IAAgB,CAAC,QAAA,CAAS,IAAA,EAAK;AAAA,cACpF,SAAA,EAAW,aAAa,SAAA,mBAAYA,IAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,IAAI,CAAA,GAAK,IAAA;AAAA,cAEpE,QAAA,EAAA,YAAA,CAAa,YAAY,aAAA,GAAgB;AAAA;AAAA,WAC5C,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACtIO,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIQ,QAAAA,CAAS,OAAO,IAAI,CAAA;AAC5C,EAAA,MAAM,CAAC,cAAc,eAAe,CAAA,GAAIA,SAAS,MAAA,CAAO,aAAA,CAAc,UAAU,CAAA;AAChF,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIA,SAAS,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AACpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAe,eAAA,CAAgB;AAAA,IACnC,WAAW,MAAM;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,yBAAyB,CAAA;AAAA,IACzE;AAAA,GACD,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,MAAA,QAAA,CAAS,yBAAyB,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,WAAW,YAAY,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA,IAAU,CAAA,EAAG;AAChC,MAAA,QAAA,CAAS,yCAAyC,CAAA;AAClD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAO,QAAA,CACV,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,CAAA,CACvB,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,CAAC,CAAA;AAEjC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,QAAA,CAAS,8BAA8B,CAAA;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAqB;AAAA,MACzB,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,aAAA,EAAe,MAAA;AAAA,MACf,SAAA,EAAW,IAAA;AAAA,MACX,iBAAA,EAAmB;AAAA,KACrB;AAEA,IAAA,YAAA,CAAa,OAAO,EAAE,MAAA,EAAQ,UAAU,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC3B,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA;AAEA,EAAA,uBACER,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAS,IAAA;AAAA,MACT,iBAAA,EAAgB,0BAAA;AAAA,MAEhB,QAAA,kBAAAE,IAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EACd,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,WAAA,EAAA,EAAY,EAAA,EAAG,0BAAA,EAA2B,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBACtDA,GAAAA,CAAC,aAAA,EAAA,EACC,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,KAAK,CAAA,EAAG,EAAA,EAAI,GAAE,EACjE,QAAA,EAAA;AAAA,0BAAAL,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,aAAA;AAAA,cACN,KAAA,EAAO,IAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AACtB,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,OAAO,CAAC,CAAC,KAAA,IAAS,CAAC,KAAK,IAAA,EAAK;AAAA,cAC7B,UAAA,EAAW,8BAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,SAAA,EAAW;AAAA;AACb;AAAA,WACF;AAAA,0BAEAT,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,eAAA;AAAA,cACN,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,YAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9B,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,KAAA,EAAO,CAAC,CAAC,KAAA,KAAU,KAAA,CAAM,UAAA,CAAW,YAAY,CAAC,CAAA,IAAK,UAAA,CAAW,YAAY,CAAA,IAAK,CAAA,CAAA;AAAA,cAClF,UAAA,EAAW,+BAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,GAAA,EAAK,IAAA;AAAA,gBACL,IAAA,EAAM;AAAA;AACR;AAAA,WACF;AAAA,0BAEAT,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,wBAAA;AAAA,cACN,KAAA,EAAO,QAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAC1B,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,KAAA,EAAO,CAAC,CAAC,KAAA,IAAS,SAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,EAAE,MAAA,KAAW,CAAA;AAAA,cACzE,UAAA,EAAW,gCAAA;AAAA,cACX,SAAA,EAAS,IAAA;AAAA,cACT,IAAA,EAAM;AAAA;AAAA,WACR;AAAA,UAEC,KAAA,oBACCT,GAAAA,CAACU,KAAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA,EACjD,QAAA,EAAA,KAAA,EACH;AAAA,SAAA,EAEJ,CAAA,EACF,CAAA;AAAA,wBACAR,KAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAACW,QAAA,EAAO,OAAA,EAAS,aAAa,QAAA,EAAU,YAAA,CAAa,WAAW,QAAA,EAAA,QAAA,EAEhE,CAAA;AAAA,0BACAX,GAAAA;AAAA,YAACW,MAAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,WAAA;AAAA,cACR,QAAA,EAAU,YAAA,CAAa,SAAA,IAAa,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,CAAC,YAAA,IAAgB,CAAC,QAAA,CAAS,IAAA,EAAK;AAAA,cACpF,SAAA,EAAW,aAAa,SAAA,mBAAYX,IAACY,gBAAAA,EAAA,EAAiB,IAAA,EAAM,EAAA,EAAI,CAAA,GAAK,IAAA;AAAA,cAEpE,QAAA,EAAA,YAAA,CAAa,YAAY,WAAA,GAAc;AAAA;AAAA;AAC1C,SAAA,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;ACxJO,SAAS,kBAAA,CAAmB;AAAA,EACjC,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,SAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,eAAe,eAAA,CAAgB;AAAA,IACnC,WAAW,MAAM;AACf,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,GACD,CAAA;AAED,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,YAAA,CAAa,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,uBACEN,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAM,eAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC3B,KAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAK,OAAA;AAAA,QACL,YAAA,EAAY,iBAAiB,UAAU,CAAA,CAAA;AAAA,QAEvC,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW;AAAA;AAAA,KACd,EACF,CAAA;AAAA,oBAEAE,IAAAA;AAAA,MAACW,MAAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAS,MAAM,CAAC,YAAA,CAAa,SAAA,IAAa,QAAQ,KAAK,CAAA;AAAA,QACvD,iBAAA,EAAgB,4BAAA;AAAA,QAEhB,QAAA,EAAA;AAAA,0BAAAb,GAAAA,CAACc,WAAAA,EAAA,EAAY,EAAA,EAAG,8BAA6B,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,0BAC3Dd,GAAAA,CAACe,aAAAA,EAAA,EACC,QAAA,kBAAAb,KAAC,iBAAA,EAAA,EAAkB,QAAA,EAAA;AAAA,YAAA,8CAAA;AAAA,YAC4B,UAAA;AAAA,YAAW;AAAA,WAAA,EAC1D,CAAA,EACF,CAAA;AAAA,0BACAA,IAAAA,CAACc,aAAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAhB,GAAAA;AAAA,cAACW,MAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,gBAC5B,UAAU,YAAA,CAAa,SAAA;AAAA,gBACxB,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACAX,GAAAA;AAAA,cAACW,MAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,YAAA;AAAA,gBACT,KAAA,EAAM,OAAA;AAAA,gBACN,OAAA,EAAQ,WAAA;AAAA,gBACR,UAAU,YAAA,CAAa,SAAA;AAAA,gBACvB,SAAA,EAAS,IAAA;AAAA,gBAER,QAAA,EAAA,YAAA,CAAa,YAAY,aAAA,GAAgB;AAAA;AAAA;AAC5C,WAAA,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACtCO,SAAS,kBAAA,CAAmB;AAAA,EACjC,MAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA,GAAiB,GAAA;AAAA,EACjB,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,QAAQ,MAAA,CAAO,aAAA;AACrB,EAAA,MAAM,YAAY,KAAA,GAAQ,YAAA;AAC1B,EAAA,MAAM,UAAA,GAAc,eAAe,KAAA,GAAS,GAAA;AAG5C,EAAA,MAAM,WAAW,MAAuC;AACtD,IAAA,IAAI,UAAA,IAAc,IAAI,OAAO,SAAA;AAC7B,IAAA,IAAI,UAAA,IAAc,IAAI,OAAO,SAAA;AAC7B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,QAAQ,QAAA,EAAS;AAGvB,EAAA,MAAM,KAAA,GAAQ,eAAA,KAAoB,MAAA,GAAY,YAAA,GAAe,eAAA,GAAkB,IAAA;AAC/E,EAAA,MAAM,eAAA,GAAkB,UAAU,IAAA,IAAQ,eAAA,KAAoB,UAAa,eAAA,GAAkB,CAAA,GACvF,KAAA,GAAQ,eAAA,GAAmB,GAAA,GAC7B,IAAA;AAEJ,EAAA,uBACEX,GAAAA,CAACC,IAAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAACC,aAAA,EAEC,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,UAAA,EAAY,YAAA,EAAc,EAAA,EAAI,GAAE,EAC3F,QAAA,EAAA;AAAA,sBAAAH,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,MAAK,YAAA,EAAY,IAAA,EAClC,iBAAO,IAAA,EACV,CAAA;AAAA,QACC,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,CAAA,oBACzBJ,GAAAA;AAAA,UAACM,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA;AAAA,YACzB,IAAA,EAAK,OAAA;AAAA,YACL,OAAA,EAAQ,UAAA;AAAA,YACR,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA;AAAE;AAAA;AACd,OAAA,EAEJ,CAAA;AAAA,MACC,UAAA,GAAa,sBACZN,GAAAA;AAAA,QAACM,IAAAA;AAAA,QAAA;AAAA,UACC,IAAA,kBAAMN,GAAAA,CAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,UACf,KAAA,EAAM,aAAA;AAAA,UACN,KAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAK;AAAA;AAAA;AACP,KAAA,EAEJ,CAAA;AAAA,oBAGAE,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,EAAA,EAAI,GAAE,EACf,QAAA,EAAA;AAAA,sBAAAH,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,CAAA,EAAE,EACjE,QAAA,EAAA;AAAA,wBAAAL,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,UAAA,EAEnD,CAAA;AAAA,wBACAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,UAAA,EAAW,MAAA,EAAO,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,KAAA,CAAA,EAC1D,QAAA,EAAA;AAAA,UAAA,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,UAAE;AAAA,SAAA,EACzB;AAAA,OAAA,EACF,CAAA;AAAA,sBACAJ,GAAAA;AAAA,QAACO,cAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,aAAA;AAAA,UACR,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,GAAG,CAAA;AAAA,UAC/B,KAAA;AAAA,UACA,EAAA,EAAI,EAAE,MAAA,EAAQ,CAAA,EAAG,cAAc,CAAA;AAAE;AAAA;AACnC,KAAA,EACF,CAAA;AAAA,oBAGAL,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,CAAA,EAAE,EACjE,QAAA,EAAA;AAAA,sBAAAH,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,WAAU,KAAA,EAAM,gBAAA,EAAiB,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA,OAAA,EAErE,CAAA;AAAA,wBACAF,KAACE,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,KAAA,CAAA,EACrC,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,UAAgB,YAAA,CAAa,QAAQ,CAAC;AAAA,SAAA,EACzC;AAAA,OAAA,EACF,CAAA;AAAA,sBACAF,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,SAAA,EAAW,UAAS,EAC7B,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,WAAU,KAAA,EAAM,gBAAA,EAAiB,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA,OAAA,EAErE,CAAA;AAAA,wBACAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,SAAQ,IAAA,EACjB,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,UAAgB,KAAA,CAAM,QAAQ,CAAC;AAAA,SAAA,EAClC;AAAA,OAAA,EACF,CAAA;AAAA,sBACAF,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,SAAA,EAAW,SAAQ,EAC5B,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,WAAU,KAAA,EAAM,gBAAA,EAAiB,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA,WAAA,EAErE,CAAA;AAAA,wBACAF,IAAAA;AAAA,UAACE,UAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,SAAA,IAAa,CAAA,GAAI,cAAA,GAAiB,YAAA;AAAA,YAExC,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,cAAgB,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,CAAE,QAAQ,CAAC;AAAA;AAAA;AAAA;AAChD,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,aAAa,KAAA,KAAU,IAAA,IAAQ,eAAA,KAAoB,IAAA,oBAClDF,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,GAAA,EAAK,GAAE,EACtD,QAAA,EAAA;AAAA,MAAA,KAAA,GAAQ,oBACPL,GAAAA;AAAA,QAACM,IAAAA;AAAA,QAAA;AAAA,UACC,IAAA,kBAAMN,GAAAA,CAAC,UAAA,EAAA,EAAW,CAAA;AAAA,UAClB,KAAA,EAAO,CAAA,CAAA,EAAI,cAAc,CAAA,EAAG,KAAK,GAAA,CAAI,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAAM,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,UACtF,KAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ;AAAA;AAAA,0BAGVA,GAAAA;AAAA,QAACM,IAAAA;AAAA,QAAA;AAAA,UACC,IAAA,kBAAMN,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,UACpB,KAAA,EAAO,CAAA,CAAA,EAAI,cAAc,CAAA,EAAG,KAAK,GAAA,CAAI,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,UACrF,KAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ;AAAA;AAAA,OACV;AAAA,sBAEFA,IAACI,UAAAA,EAAA,EAAW,SAAQ,SAAA,EAAU,KAAA,EAAM,kBAAiB,QAAA,EAAA,gBAAA,EAErD;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;AC5HO,SAAS,kBAAA,CAAmB;AAAA,EACjC,OAAA;AAAA,EACA,aAAA;AAAA,EACA,uBAAA;AAAA,EACA,cAAA,GAAiB,GAAA;AAAA,EACjB,UAAA,GAAa,KAAA;AAAA,EACb,oBAAA,GAAuB;AACzB,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAII,SAAsB,KAAK,CAAA;AACnE,EAAA,MAAM,CAAC,cAAA,EAAgB,WAAW,CAAA,GAAIA,SAAiB,KAAK,CAAA;AAG5D,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AACzC,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC1B,MAAA,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAChC,QAAA,gBAAA,CAAiB,IAAI,GAAG,CAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAAE,IAAA,EAAK;AAAA,EAC3C,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAM;AACpC,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW;AAChC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,IAAK,CAAA;AAC9C,MAAA,MAAM,QAAQ,MAAA,CAAO,aAAA;AACrB,MAAA,MAAM,UAAA,GAAc,QAAQ,KAAA,GAAS,GAAA;AAGrC,MAAA,IAAI,YAAA,KAAiB,UAAA,IAAc,UAAA,GAAa,EAAA,EAAI,OAAO,KAAA;AAC3D,MAAA,IAAI,iBAAiB,SAAA,KAAc,UAAA,IAAc,EAAA,IAAM,UAAA,GAAa,KAAK,OAAO,KAAA;AAChF,MAAA,IAAI,YAAA,KAAiB,aAAA,IAAiB,UAAA,IAAc,EAAA,EAAI,OAAO,KAAA;AAG/D,MAAA,IAAI,cAAA,KAAmB,SAAS,CAAC,MAAA,CAAO,UAAU,QAAA,CAAS,cAAc,GAAG,OAAO,KAAA;AAEnF,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,OAAA,EAAS,aAAA,EAAe,YAAA,EAAc,cAAc,CAAC,CAAA;AAGzD,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM;AAC1B,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK;AAClC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAc,KAAA,GAAQ,CAAA,CAAE,aAAA,GAAiB,GAAA;AAC/C,MAAA,OAAO,UAAA,IAAc,EAAA;AAAA,IACvB,CAAC,CAAA,CAAE,MAAA;AAEH,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK;AAClC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAc,KAAA,GAAQ,CAAA,CAAE,aAAA,GAAiB,GAAA;AAC/C,MAAA,OAAO,UAAA,GAAa,MAAM,UAAA,IAAc,EAAA;AAAA,IAC1C,CAAC,CAAA,CAAE,MAAA;AAEH,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK;AACrC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAc,KAAA,GAAQ,CAAA,CAAE,aAAA,GAAiB,GAAA;AAC/C,MAAA,OAAO,UAAA,GAAa,EAAA;AAAA,IACtB,CAAC,CAAA,CAAE,MAAA;AAEH,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,UAAA,EAAW;AAAA,EACxC,CAAA,EAAG,CAAC,OAAA,EAAS,aAAa,CAAC,CAAA;AAE3B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBACER,GAAAA,CAACU,KAAAA,EAAA,EAAM,QAAA,EAAS,QAAO,QAAA,EAAA,oEAAA,EAEvB,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACER,IAAAA,CAACG,GAAAA,EAAA,EAEC,QAAA,EAAA;AAAA,oBAAAH,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,EAAA,EAAI,GAAE,EACf,QAAA,EAAA;AAAA,sBAAAL,IAACI,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,YAAA,EAAY,MAAC,QAAA,EAAA,iBAAA,EAEtC,CAAA;AAAA,sBAGAF,IAAAA,CAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,QAAA,EAAU,QAAO,EAC1D,QAAA,EAAA;AAAA,wBAAAH,KAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,gBAAA,EAChC,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ,CAAA;AAAA,UAAS;AAAA,SAAA,EAClC,CAAA;AAAA,wBACAE,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,cAAA,EAChC,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ,CAAA;AAAA,UAAS;AAAA,SAAA,EAClC,CAAA;AAAA,wBACAE,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,YAAA,EAChC,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,UAAA,EAAW,CAAA;AAAA,UAAS;AAAA,SAAA,EACrC;AAAA,OAAA,EACF,CAAA;AAAA,sBAGAE,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,MAAA,EAAO,EACnD,QAAA,EAAA;AAAA,wBAAAH,IAAAA,CAAC,eAAY,IAAA,EAAK,OAAA,EAAQ,IAAI,EAAE,QAAA,EAAU,KAAI,EAC5C,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,cAAW,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAClBE,IAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,YAAA;AAAA,cACP,KAAA,EAAM,QAAA;AAAA,cACN,UAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAoB,CAAA;AAAA,cAE9D,QAAA,EAAA;AAAA,gCAAAF,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,gCACjCA,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,YAAW,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,gCACnCA,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,WAAU,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,gCACjCA,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,eAAc,QAAA,EAAA,aAAA,EAAW;AAAA;AAAA;AAAA;AAC3C,SAAA,EACF,CAAA;AAAA,QAEC,oBAAA,IAAwB,UAAA,CAAW,MAAA,GAAS,CAAA,oBAC3CE,IAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAK,OAAA,EAAQ,EAAA,EAAI,EAAE,QAAA,EAAU,KAAI,EAC5C,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,cAAW,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,0BACpBE,IAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,cAAA;AAAA,cACP,KAAA,EAAM,UAAA;AAAA,cACN,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAE3C,QAAA,EAAA;AAAA,gCAAAF,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,gBACnC,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,qBACfA,GAAAA,CAAC,QAAA,EAAA,EAAmB,KAAA,EAAO,GAAA,EACxB,QAAA,EAAA,GAAA,EAAA,EADY,GAEf,CACD;AAAA;AAAA;AAAA;AACH,SAAA,EACF;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,eAAA,CAAgB,WAAW,CAAA,mBAC1BA,IAACU,KAAAA,EAAA,EAAM,QAAA,EAAS,MAAA,EAAO,QAAA,EAAA,wCAAA,EAEvB,CAAA,mBAEAV,GAAAA,CAACiB,IAAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACtB,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,KAAW;AAC/B,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,IAAK,CAAA;AAC9C,MAAA,MAAM,eAAA,GAAkB,uBAAA,EAAyB,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAE9D,MAAA,uBACEjB,GAAAA,CAACiB,IAAAA,EAAA,EAAqB,IAAA,EAAM,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,IAC/C,QAAA,kBAAAjB,GAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,YAAA,EAAc,KAAA;AAAA,UACd,cAAA;AAAA,UACA,SAAA,EAAW,UAAA;AAAA,UACX;AAAA;AAAA,OACF,EAAA,EAPS,OAAO,EAQlB,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACzDA,IAAM,wBAAA,GAA2B,CAAC,KAAA,KAA0B;AAC1D,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACjB,CAAA;AAKA,SAAS,eAAA,CAAgB,MAAmB,KAAA,EAAY;AACtD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,cAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,kBAAMA,GAAAA,CAACkB,OAAA,EAAA,EAAY,CAAA;AAAA,QACnB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAA;AAAA,QAC3B,SAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,GAAG;AAAA,OAC9C;AAAA,IACF,KAAK,eAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,kBAAMlB,GAAAA,CAACmB,YAAA,EAAA,EAAiB,CAAA;AAAA,QACxB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAA;AAAA,QAC1B,SAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,GAAG;AAAA,OAC7C;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,kBAAMnB,GAAAA,CAACoB,WAAA,EAAA,EAAgB,CAAA;AAAA,QACvB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG;AAAA,OAChD;AAAA,IACF,KAAK,aAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,kBAAMpB,GAAAA,CAACqB,UAAA,EAAA,EAAe,CAAA;AAAA,QACtB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG;AAAA,OAChD;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,IAAA,kBAAMrB,GAAAA,CAACoB,WAAA,EAAA,EAAgB,CAAA;AAAA,QACvB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,QAC1B,SAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,GAAG;AAAA,OAClD;AAAA;AAEN;AAsBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA,GAAsB,CAAA;AAAA,EACtB,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA,GAAoB;AACtB,CAAA,EAA4B;AAC1B,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIZ,SAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,kBAAkB,OAAA,GAAU,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,GAAG,mBAAmB,CAAA;AAClF,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,GAAS,mBAAA;AAElC,EAAA,MAAM,eAAe,cAAA,CAAe,KAAA,KAAU,SAC1C,EAAE,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,IAAA,kBAAMR,GAAAA,CAACkB,OAAA,EAAA,EAAY,GAAG,GACzD,cAAA,CAAe,UAAU,OAAA,GACzB,EAAE,KAAA,EAAO,KAAA,CAAM,QAAQ,OAAA,CAAQ,IAAA,EAAM,sBAAMlB,GAAAA,CAACoB,eAAgB,CAAA,EAAG,GAC/D,EAAE,KAAA,EAAO,KAAA,CAAM,QAAQ,IAAA,CAAK,IAAA,EAAM,sBAAMpB,GAAAA,CAACoB,eAAgB,CAAA,EAAG;AAEhE,EAAA,uBACEpB,IAACC,IAAAA,EAAA,EAAK,eAAY,sBAAA,EAChB,QAAA,kBAAAC,IAAAA,CAACC,WAAAA,EAAA,EAEC,QAAA,EAAA;AAAA,oBAAAH,IAACI,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,YAAA,EAAY,MAAC,QAAA,EAAA,iBAAA,EAEtC,CAAA;AAAA,oBAGAF,IAAAA;AAAA,MAACG,GAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,GAAA,EAAK,CAAA;AAAA,UACL,CAAA,EAAG,CAAA;AAAA,UACH,EAAA,EAAI,CAAA;AAAA,UACJ,OAAA,EAAS,KAAA,CAAM,YAAA,CAAa,KAAA,EAAO,GAAG,CAAA;AAAA,UACtC,YAAA,EAAc;AAAA,SAChB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAACK,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAO,YAAA,CAAa,KAAA,EAAM,EAClC,QAAA,EAAA,YAAA,CAAa,IAAA,EAChB,CAAA;AAAA,0BACAH,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAChB,QAAA,EAAA;AAAA,YAAA,cAAA,CAAe,cAAc,CAAA,oBAC5BH,KAACE,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,8BACdJ,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,cAAS,KAAA;AAAA,cAAI,GAAA;AAAA,8BAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,iBAAA,CAAkB,cAAA,CAAe,WAAW,CAAA,EAAE,CAAA;AAAA,cAAU,GAAA;AAAA,cAAI,8BAAA;AAAA,cACxC,GAAA;AAAA,8BAC7BE,KAAC,QAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,gBAAA,cAAA,CAAe,MAAA;AAAA,gBAAO;AAAA,eAAA,EAAO,CAAA;AAAA,cAAS;AAAA,aAAA,EACjD,CAAA;AAAA,YAED,cAAA,CAAe,cAAc,CAAA,oBAC5BA,KAACE,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,QAAA,EAAA;AAAA,cAAA,WAAA;AAAA,8BACjBJ,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,cAAS,KAAA;AAAA,cAAI,GAAA;AAAA,8BACvCA,IAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,iBAAA,CAAkB,KAAK,GAAA,CAAI,cAAA,CAAe,WAAW,CAAC,CAAA,EAAE,CAAA;AAAA,cAAU,GAAA;AAAA,cAAI,8BAAA;AAAA,cAClD,GAAA;AAAA,8BAC7BE,KAAC,QAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,gBAAA,cAAA,CAAe,MAAA;AAAA,gBAAO;AAAA,eAAA,EAAO,CAAA;AAAA,cAAS;AAAA,aAAA,EACjD,CAAA;AAAA,YAED,cAAA,CAAe,gBAAgB,CAAA,oBAC9BA,KAACE,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,QAAA,EAAA;AAAA,cAAA,UAAA;AAAA,8BAClBJ,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,cAAS,iCAAA;AAAA,cAAgC,GAAA;AAAA,8BACjEE,KAAC,QAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,gBAAA,cAAA,CAAe,MAAA;AAAA,gBAAO;AAAA,eAAA,EAAO,CAAA;AAAA,cAAS;AAAA,aAAA,EACjD;AAAA,WAAA,EAEJ;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAF,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAI,EAAE,EAAA,EAAI,GAAE,EAAG,CAAA;AAAA,IAGvB,QAAA,CAAS,WAAW,CAAA,mBACnBA,IAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,IAAI,EAAE,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,CAAA,EAAE,EAAG,gEAEvF,CAAA,mBAEAF,IAAAA,CAAAoB,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,OAAA,KAAY;AAChC,QAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AACjD,QAAA,uBACEpB,IAAAA;AAAA,UAACG,GAAAA;AAAA,UAAA;AAAA,YAEC,aAAA,EAAa,CAAA,eAAA,EAAkB,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,YACzC,EAAA,EAAI;AAAA,cACF,CAAA,EAAG,CAAA;AAAA,cACH,EAAA,EAAI,CAAA;AAAA,cACJ,SAAS,KAAA,CAAM,OAAA;AAAA,cACf,YAAA,EAAc,CAAA;AAAA,cACd,UAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,KAAK,CAAA;AAAA,aACtC;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAH,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,YAAA,EAAc,GAAA,EAAK,GAAA,EAAI,EAC7D,QAAA,EAAA;AAAA,gCAAAL,GAAAA,CAACK,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,EAAA,EAAI,GAAA,EAAI,EACpC,QAAA,EAAA,KAAA,CAAM,IAAA,EACT,CAAA;AAAA,gCACAH,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EACjB,QAAA,EAAA;AAAA,kCAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,aAAY,YAAA,EAAY,IAAA,EACzC,kBAAQ,UAAA,EACX,CAAA;AAAA,kCACAJ,GAAAA,CAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAC5D,kBAAQ,cAAA,EACX,CAAA;AAAA,kCACAF,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,MAAA,EAAO,EACnD,QAAA,EAAA;AAAA,oCAAAL,GAAAA;AAAA,sBAACM,IAAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,MAAA,CAAA;AAAA,wBAC7B,IAAA,EAAK,OAAA;AAAA,wBACL,OAAA,EAAQ;AAAA;AAAA,qBACV;AAAA,oCACAN,GAAAA;AAAA,sBAACM,IAAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO,CAAA,EAAG,OAAA,CAAQ,cAAc,CAAA,OAAA,CAAA;AAAA,wBAChC,IAAA,EAAK,OAAA;AAAA,wBACL,OAAA,EAAQ;AAAA;AAAA,qBACV;AAAA,oCACAN,GAAAA;AAAA,sBAACM,IAAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO,QAAQ,iBAAA,CAAkB,IAAA,CAAK,IAAI,OAAA,CAAQ,aAAa,CAAC,CAAC,CAAA,CAAA;AAAA,wBACjE,IAAA,EAAK,OAAA;AAAA,wBACL,OAAA,EAAQ;AAAA;AAAA;AACV,mBAAA,EACF;AAAA,iBAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,8BACAJ,IAAAA,CAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,cAAA,EAAgB,YAAW,EACnE,QAAA,EAAA;AAAA,gBAAA,gBAAA,oBACCL,GAAAA;AAAA,kBAACW,MAAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,OAAA,EAAS,MAAM,gBAAA,CAAiB,OAAO,CAAA;AAAA,oBACxC,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gBAED,eAAA,IAAmB,OAAA,CAAQ,IAAA,KAAS,aAAA,oBACnCX,GAAAA;AAAA,kBAACW,MAAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,OAAA,EAAQ,WAAA;AAAA,oBACR,OAAA,EAAS,MAAM,eAAA,CAAgB,OAAO,CAAA;AAAA,oBACvC,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gBAED,eAAA,IAAmB,OAAA,CAAQ,IAAA,KAAS,aAAA,oBACnCX,GAAAA;AAAA,kBAACW,MAAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,OAAA,EAAQ,WAAA;AAAA,oBACR,OAAA,EAAS,MAAM,eAAA,CAAgB,OAAO,CAAA;AAAA,oBACvC,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EAEJ;AAAA;AAAA,WAAA;AAAA,UAnEK,OAAA,CAAQ;AAAA,SAoEf;AAAA,MAEJ,CAAC,CAAA;AAAA,MAEA,OAAA,oBACCX,GAAAA,CAACK,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,CAAA,EAAE,EACpC,QAAA,kBAAAL,GAAAA;AAAA,QAACW,MAAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,yBACEX,GAAAA;AAAA,YAACuB,UAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI;AAAA,gBACF,SAAA,EAAW,UAAU,gBAAA,GAAmB,WAAA;AAAA,gBACxC,UAAA,EAAY;AAAA;AACd;AAAA,WACF;AAAA,UAEF,OAAA,EAAS,MAAM,UAAA,CAAW,CAAC,OAAO,CAAA;AAAA,UAEjC,QAAA,EAAA,OAAA,GAAU,WAAA,GAAc,CAAA,KAAA,EAAQ,QAAA,CAAS,SAAS,mBAAmB,CAAA,KAAA;AAAA;AAAA,OACxE,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;ACrUA,IAAMC,yBAAAA,GAA2B,CAAC,KAAA,KAA0B;AAC1D,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACjB,CAAA;AAoBO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,iBAAA,GAAoBA;AACtB,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIhB,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAGtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAA;AACtD,MAAA,SAAA,CAAU,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA;AACpC,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAkB;AAC5C,IAAA,SAAA,CAAU,KAAK,CAAA;AAGf,IAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,EAAG;AACnB,MAAA,QAAA,CAAS,6BAA6B,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,YAAY,CAAA,EAAG;AACxB,MAAA,QAAA,CAAS,kCAAkC,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,WAAW,GAAA,EAAS;AAC7B,MAAA,QAAA,CAAS,qBAAqB,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI,CAAC,OAAA,IAAW,KAAA,IAAS,CAAC,MAAA,EAAQ;AAElC,IAAA,MAAM,QAAA,GAAW,WAAW,MAAM,CAAA;AAClC,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,QAAA,IAAY,CAAA,EAAG;AAEtC,IAAA,MAAM,MAAA,CAAO,SAAS,QAAQ,CAAA;AAC9B,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,SAAA,CAAU,EAAE,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAA,GAAiB,QAAQ,IAAA,KAAS,cAAA;AACxC,EAAA,MAAM,WAAA,GAAc,iBAAiB,oBAAA,GAAuB,oBAAA;AAE5D,EAAA,uBACEN,IAAAA;AAAA,IAACW,MAAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,YAAA;AAAA,MACT,QAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAS,IAAA;AAAA,MACT,aAAA,EAAY,uBAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAb,GAAAA,CAACc,WAAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,UAAA,EACX,CAAA;AAAA,wBAEAZ,IAAAA,CAACa,aAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,UAAA,cAAA,oBACCb,KAACuB,iBAAAA,EAAA,EAAkB,IAAI,EAAE,EAAA,EAAI,GAAE,EAAG,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,4BACzBzB,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,YAAS,cAAA;AAAA,YAAa,GAAA;AAAA,4BAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,OAAA,CAAQ,WAAA,EAAY,CAAA;AAAA,YAAS,oBAAA;AAAA,YAAmB,GAAA;AAAA,4BACzDA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,OAAA,CAAQ,cAAA,EAAe,CAAA;AAAA,YAAS,0BAAA;AAAA,YAAyB,GAAA;AAAA,4BAClEA,IAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,iBAAA,CAAkB,KAAK,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAC,CAAA,EAAE,CAAA;AAAA,YAAS;AAAA,WAAA,EACvE,CAAA;AAAA,UAGD,CAAC,cAAA,oBACAE,IAAAA,CAACuB,iBAAAA,EAAA,EAAkB,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA;AAAA,YAAA,cAAA;AAAA,4BACpBzB,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,YAAS,cAAA;AAAA,YAAa,GAAA;AAAA,4BAC/CA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,OAAA,CAAQ,WAAA,EAAY,CAAA;AAAA,YAAS,oBAAA;AAAA,YAAmB,GAAA;AAAA,4BACzDA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,OAAA,CAAQ,cAAA,EAAe,CAAA;AAAA,YAAS,0BAAA;AAAA,YAAyB,GAAA;AAAA,4BAClEA,IAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,iBAAA,CAAkB,KAAK,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAC,CAAA,EAAE,CAAA;AAAA,YAAS;AAAA,WAAA,EACvE,CAAA;AAAA,0BAIFA,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAS,IAAA;AAAA,cACT,SAAA,EAAS,IAAA;AAAA,cACT,QAAA,EAAQ,IAAA;AAAA,cACR,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,WAAA;AAAA,cACP,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAClD,KAAA,EAAO,CAAC,CAAC,KAAA;AAAA,cACT,YAAY,KAAA,IAAS,iDAAA;AAAA,cACrB,QAAA,EAAU,MAAA;AAAA,cACV,UAAA,EAAY;AAAA,gBACV,GAAA,EAAK,CAAA;AAAA,gBACL,IAAA,EAAM,IAAA;AAAA,gBACN,YAAA,EAAc;AAAA,eAChB;AAAA,cACA,eAAA,EAAiB;AAAA,gBACf,MAAA,EAAQ;AAAA;AACV;AAAA;AACF,SAAA,EACF,CAAA;AAAA,wBAEAP,IAAAA,CAACc,aAAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAhB,IAACW,MAAAA,EAAA,EAAO,SAAS,YAAA,EAAc,QAAA,EAAU,QAAQ,QAAA,EAAA,QAAA,EAEjD,CAAA;AAAA,0BACAX,GAAAA;AAAA,YAACW,MAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,UAAA;AAAA,cACT,OAAA,EAAQ,WAAA;AAAA,cACR,QAAA,EAAU,MAAA,IAAU,CAAC,CAAC,SAAS,CAAC,MAAA;AAAA,cAE/B,mBAAS,WAAA,GAAc;AAAA;AAAA;AAC1B,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACtJA,SAAS,cAAA,CAAe,OAAoB,KAAA,EAAY;AACtD,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAASe,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,QAC9C,IAAA,kBAAM1B,GAAAA,CAACmB,YAAAA,EAAA,EAAiB,CAAA;AAAA,QACxB,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAA;AAAA,QAC1B,SAASO,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,QAC3C,IAAA,kBAAM1B,GAAAA,CAACoB,WAAAA,EAAA,EAAgB,CAAA;AAAA,QACvB,KAAA,EAAO,UAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAASM,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,QAC9C,IAAA,kBAAM1B,GAAAA,CAACkB,OAAAA,EAAA,EAAY,CAAA;AAAA,QACnB,KAAA,EAAO,aAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAA;AAAA,QAC3B,SAASQ,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,GAAG,CAAA;AAAA,QAC5C,IAAA,kBAAM1B,GAAAA,CAAC2B,OAAA,EAAA,EAAU,CAAA;AAAA,QACjB,KAAA,EAAO,UAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA;AAEN;AAKA,SAAS,cAAc,IAAA,EAAoC;AACzD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,EAAA;AAAA,QACV,QAAA,EAAU,SAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,EAAA;AAAA,QACV,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,EAAA;AAAA,QACV,QAAA,EAAU,MAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AAAA;AAEN;AA8BO,SAAS,oBAAA,CAAqB;AAAA,EACnC,KAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,MAAA;AAAA,EACV,IAAA,GAAO,QAAA;AAAA,EACP,cAAA,GAAiB,IAAA;AAAA,EACjB,SAAA,GAAY,IAAA;AAAA,EACZ;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,QAAQC,QAAAA,EAAS;AACvB,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AAErC,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAA,CAAO,KAAA;AACpC,EAAA,MAAM,WAAA,GAAc,iBAChB,CAAA,EAAG,KAAK,KAAK,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA,GAClC,KAAA;AAGJ,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,uBACE5B,GAAAA;AAAA,MAACM,IAAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,wBAAA;AAAA,QACZ,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,KAAA,EAAO,WAAA;AAAA,QACP,OAAO,MAAA,CAAO,SAAA;AAAA,QACd,IAAA,EAAM,IAAA,KAAS,OAAA,GAAU,QAAA,GAAW,OAAA;AAAA,QACpC,EAAA,EAAI;AAAA,UACF,UAAU,UAAA,CAAW,QAAA;AAAA,UACrB,UAAA,EAAY;AAAA;AACd;AAAA,KACF;AAAA,EAEJ;AAGA,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,uBACEJ,IAAAA;AAAA,MAACG,GAAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,wBAAA;AAAA,QACZ,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,aAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,KAAK,UAAA,CAAW,OAAA;AAAA,UAChB,OAAO,MAAA,CAAO;AAAA,SAChB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAL,GAAAA;AAAA,YAACK,GAAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI;AAAA,gBACF,OAAA,EAAS,MAAA;AAAA,gBACT,UAAA,EAAY,QAAA;AAAA,gBACZ,UAAU,UAAA,CAAW;AAAA,eACvB;AAAA,cAEC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,WACV;AAAA,UACC,6BACCL,GAAAA;AAAA,YAACI,UAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,MAAA;AAAA,cACV,EAAA,EAAI;AAAA,gBACF,UAAU,UAAA,CAAW,QAAA;AAAA,gBACrB,UAAA,EAAY;AAAA,eACd;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KAEJ;AAAA,EAEJ;AAGA,EAAA,uBACEF,IAAAA;AAAA,IAACG,GAAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,wBAAA;AAAA,MACZ,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,WAAW,OAAA,GAAU,CAAA;AAAA,QAC1B,CAAA,EAAG,WAAW,OAAA,GAAU,CAAA;AAAA,QACxB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,YAAA,EAAc,CAAA;AAAA,QACd,UAAA,EAAY,CAAA,UAAA,EAAa,MAAA,CAAO,KAAK,CAAA;AAAA,OACvC;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAL,GAAAA;AAAA,UAACK,GAAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,OAAA,EAAS,MAAA;AAAA,cACT,UAAA,EAAY,QAAA;AAAA,cACZ,QAAA,EAAU,WAAW,QAAA,GAAW;AAAA,aAClC;AAAA,YAEC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,SACV;AAAA,wBACAH,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAChB,QAAA,EAAA;AAAA,UAAA,SAAA,oBACCL,GAAAA;AAAA,YAACI,UAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,WAAA;AAAA,cACR,EAAA,EAAI;AAAA,gBACF,OAAO,MAAA,CAAO,KAAA;AAAA,gBACd,UAAA,EAAY,MAAA;AAAA,gBACZ,UAAU,UAAA,CAAW;AAAA,eACvB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UAED,kCACCF,IAAAA;AAAA,YAACE,UAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cACR,KAAA,EAAM,gBAAA;AAAA,cACN,EAAA,EAAI,EAAE,QAAA,EAAU,UAAA,CAAW,QAAA,EAAS;AAAA,cAEnC,QAAA,EAAA;AAAA,gBAAA,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA;AACzB,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;ACxJA,IAAMoB,yBAAAA,GAA2B,CAAC,KAAA,KAA0B;AAC1D,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACjB,CAAA;AAKA,SAAS,cAAA,CAAe,OAA+C,KAAA,EAAY;AACjF,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAASE,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,QAC9C,KAAA,EAAO;AAAA,OACT;AAAA,IACF,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAASA,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,QAC9C,KAAA,EAAO;AAAA,OACT;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAA;AAAA,QAC1B,SAASA,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,QAC3C,KAAA,EAAO;AAAA,OACT;AAAA;AAEN;AAiBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,cAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA,GAAoBF,yBAAAA;AAAA,EACpB,UAAA,GAAa;AACf,CAAA,EAA0B;AACxB,EAAA,MAAM,QAAQI,QAAAA,EAAS;AAEvB,EAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AACpD,EAAA,MAAM,eAAA,GAAkB,SAAS,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,MAAA;AAE9D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE5B,GAAAA,CAACC,IAAAA,EAAA,EAAK,aAAA,EAAY,oBAAA,EAChB,QAAA,kBAAAD,GAAAA,CAACG,WAAAA,EAAA,EACC,QAAA,kBAAAH,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,yBAAA,EAEvF,CAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,uBACEJ,IAACC,IAAAA,EAAA,EAAK,eAAY,oBAAA,EAChB,QAAA,kBAAAD,IAACG,WAAAA,EAAA,EACC,0BAAAD,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,WAAW,QAAA,EAAU,EAAA,EAAI,GAAE,EACpC,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAAC6B,IAAA,EAAA,EAAS,EAAA,EAAI,EAAE,QAAA,EAAU,IAAI,KAAA,EAAO,eAAA,EAAiB,EAAA,EAAI,CAAA,EAAE,EAAG,CAAA;AAAA,sBAC/D7B,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,8DAAA,EAEnD;AAAA,KAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEJ,IAACC,IAAAA,EAAA,EAAK,eAAY,oBAAA,EAChB,QAAA,kBAAAC,IAAAA,CAACC,WAAAA,EAAA,EAEC,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,GAAE,EAC9D,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAAC8B,UAAA,EAAA,EAAe,KAAA,EAAM,SAAA,EAAU,CAAA;AAAA,sBAChC9B,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,MAAK,QAAA,EAAA,uBAAA,EAAqB,CAAA;AAAA,MAC7C,eAAA,GAAkB,qBACjBJ,GAAAA;AAAA,QAACM,IAAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,GAAG,eAAe,CAAA,WAAA,CAAA;AAAA,UACzB,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAM,SAAA;AAAA,UACN,EAAA,EAAI,EAAE,EAAA,EAAI,MAAA;AAAO;AAAA;AACnB,KAAA,EAEJ,CAAA;AAAA,oBAEAN,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,IAAK,QAAA,EAAA,yEAAA,EAElE,CAAA;AAAA,oBAEAJ,IAAC+B,OAAAA,EAAA,EAAQ,IAAI,EAAE,EAAA,EAAI,GAAE,EAAG,CAAA;AAAA,IAGvB,eAAA,CAAgB,GAAA,CAAI,CAAC,OAAA,KAAY;AAChC,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA;AAEvD,MAAA,uBACE7B,IAAAA;AAAA,QAACG,GAAAA;AAAA,QAAA;AAAA,UAEC,aAAA,EAAa,CAAA,YAAA,EAAe,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,UACtC,EAAA,EAAI;AAAA,YACF,CAAA,EAAG,CAAA;AAAA,YACH,EAAA,EAAI,CAAA;AAAA,YACJ,OAAA,EAAS,OAAA,CAAQ,UAAA,GACbqB,KAAAA,CAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,IAAI,IACtCA,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,YAC1C,YAAA,EAAc,CAAA;AAAA,YACd,UAAA,EAAY,OAAA,CAAQ,UAAA,GAChB,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,CAAA,GACvC,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,WAC7C;AAAA,UAGA,QAAA,EAAA;AAAA,4BAAAxB,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,GAAE,EAC9D,QAAA,EAAA;AAAA,8BAAAL,GAAAA,CAAC8B,UAAA,EAAA,EAAe,QAAA,EAAS,OAAA,EAAQ,OAAM,QAAA,EAAS,CAAA;AAAA,8BAChD9B,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,EAAA,EAAI,EAAE,UAAA,EAAY,MAAA,EAAO,EACtD,QAAA,EAAA,OAAA,CAAQ,OAAA,EACX,CAAA;AAAA,cACC,OAAA,CAAQ,UAAA,oBACPJ,GAAAA,CAACM,IAAAA,EAAA,EAAK,KAAA,EAAM,UAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAM,SAAA,EAAU,SAAQ,UAAA,EAAW,CAAA;AAAA,cAExE,CAAC,OAAA,CAAQ,UAAA,oBACRN,IAACM,IAAAA,EAAA,EAAK,KAAA,EAAM,WAAA,EAAY,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAM,SAAA,EAAU,SAAQ,UAAA,EAAW;AAAA,aAAA,EAE5E,CAAA;AAAA,4BAGAJ,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,EAAA,EAAI,GAAE,EACf,QAAA,EAAA;AAAA,8BAAAL,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAC9D,kBAAQ,cAAA,EACX,CAAA;AAAA,8BACAF,IAAAA,CAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,GAAE,EAC9D,QAAA,EAAA;AAAA,gCAAAL,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,OAAM,SAAA,EAC5B,QAAA,EAAA,iBAAA,CAAkB,OAAA,CAAQ,mBAAmB,CAAA,EAChD,CAAA;AAAA,gCACAJ,IAACI,UAAAA,EAAA,EAAW,SAAQ,SAAA,EAAU,KAAA,EAAM,kBAAiB,QAAA,EAAA,WAAA,EAErD;AAAA,eAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BAGAF,IAAAA,CAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,EAAA,EAAI,GAAE,EAC1D,QAAA,EAAA;AAAA,8BAAAL,GAAAA;AAAA,gBAACM,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,CAAA,EAAG,OAAA,CAAQ,gBAAgB,CAAA,aAAA,CAAA;AAAA,kBAClC,IAAA,EAAK,OAAA;AAAA,kBACL,OAAA,EAAQ;AAAA;AAAA,eACV;AAAA,8BACAN,GAAAA;AAAA,gBAACM,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,CAAA,EAAG,OAAA,CAAQ,cAAc,CAAA,OAAA,CAAA;AAAA,kBAChC,IAAA,EAAK,OAAA;AAAA,kBACL,OAAA,EAAQ;AAAA;AAAA,eACV;AAAA,8BACAN,GAAAA;AAAA,gBAACM,IAAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,kBAAMN,GAAAA,CAACqB,UAAAA,EAAA,EAAe,CAAA;AAAA,kBACtB,KAAA,EAAO,CAAA,EAAG,WAAA,CAAY,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,eAAe,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,kBAC3E,IAAA,EAAK,OAAA;AAAA,kBACL,EAAA,EAAI;AAAA,oBACF,SAAS,WAAA,CAAY,OAAA;AAAA,oBACrB,OAAO,WAAA,CAAY,KAAA;AAAA,oBACnB,aAAa,WAAA,CAAY;AAAA,mBAC3B;AAAA,kBACA,OAAA,EAAQ;AAAA;AAAA;AACV,aAAA,EACF,CAAA;AAAA,4BAGAnB,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,cAAA,EAAgB,UAAA,EAAW,EAC5D,QAAA,EAAA;AAAA,cAAA,SAAA,oBACCL,GAAAA,CAACW,MAAAA,EAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAS,MAAM,SAAA,CAAU,OAAO,CAAA,EAAG,QAAA,EAAA,SAAA,EAExD,CAAA;AAAA,cAED,aAAA,oBACCX,GAAAA,CAACW,MAAAA,EAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAS,MAAM,aAAA,CAAc,OAAO,CAAA,EAAG,QAAA,EAAA,cAAA,EAE5D,CAAA;AAAA,cAED,CAAC,OAAA,CAAQ,UAAA,IAAc,cAAA,oBACtBT,IAAAA;AAAA,gBAACS,MAAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,OAAA;AAAA,kBACL,OAAA,EAAQ,WAAA;AAAA,kBACR,SAAA,kBAAWX,GAAAA,CAACgC,GAAA,EAAA,EAAQ,CAAA;AAAA,kBACpB,OAAA,EAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAAA,kBACtC,QAAA,EAAA;AAAA,oBAAA,eAAA;AAAA,oBAEE,QAAQ,eAAA,IACP,CAAA,EAAA,EAAK,iBAAA,CAAkB,OAAA,CAAQ,eAAe,CAAC,CAAA,CAAA;AAAA;AAAA;AAAA;AACnD,aAAA,EAEJ;AAAA;AAAA,SAAA;AAAA,QA5FK,OAAA,CAAQ;AAAA,OA6Ff;AAAA,IAEJ,CAAC,CAAA;AAAA,IAGA,QAAA,CAAS,MAAA,GAAS,UAAA,oBACjB9B,IAAAA;AAAA,MAACE,UAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAM,gBAAA;AAAA,QACN,IAAI,EAAE,SAAA,EAAW,UAAU,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA,EAAE;AAAA,QACpD,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,UACU,UAAA;AAAA,UAAW,MAAA;AAAA,UAAK,QAAA,CAAS,MAAA;AAAA,UAAO;AAAA;AAAA;AAAA;AAC3C,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;ACpRA,IAAMoB,yBAAAA,GAA2B,CAAC,KAAA,KAA0B;AAC1D,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AAC3B,CAAA;AAKA,SAAS,kBAAA,CACP,MACA,iBAAA,EAMA;AACA,EAAA,MAAM,EAAE,YAAA,EAAc,WAAA,EAAa,gBAAgB,YAAA,EAAc,cAAA,EAAgB,qBAAoB,GAAI,IAAA;AAGzG,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,OAAA,EAAS,0FAAA;AAAA,MACT,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,KAAgB,YAAA,IAAgB,cAAA,GAAiB,CAAA,EAAG;AACtD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,wBAAA;AAAA,MACP,OAAA,EAAS,CAAA,oBAAA,EAAuB,YAAY,CAAA,OAAA,EAAU,YAAA,GAAe,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,IAAA,EAAO,iBAAA,CAAkB,cAAc,CAAC,CAAA,0DAAA,CAAA;AAAA,MACzH,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,OAAO,CAAA,EAAG,WAAW,UAAU,WAAA,GAAc,CAAA,GAAI,MAAM,EAAE,CAAA,WAAA,CAAA;AAAA,MACzD,OAAA,EAAS,yBAAyB,WAAW,CAAA,IAAA,EAAO,YAAY,CAAA,YAAA,EAAe,iBAAA,CAAkB,cAAc,CAAC,CAAA,yCAAA,CAAA;AAAA,MAChH,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,mBAAmB,YAAA,EAAc;AACnC,IAAA,MAAM,aAAA,GAAgB,mBAAA,IAAuB,mBAAA,GAAsB,CAAA,GAC/D,CAAA,UAAA,EAAa,mBAAmB,CAAA,eAAA,EAAkB,mBAAA,GAAsB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,iBAAA,CAAA,GACpF,EAAA;AACJ,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,sBAAA;AAAA,MACP,OAAA,EAAS,kBAAkB,YAAY,CAAA,OAAA,EAAU,eAAe,CAAA,GAAI,OAAA,GAAU,KAAK,CAAA,UAAA,EAAa,aAAa,CAAA,CAAA;AAAA,MAC7G,kBAAA,EAAoB,mBAAA,IAAuB,mBAAA,GAAsB,CAAA,GAAI,aAAA,GAAgB;AAAA,KACvF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,GAAe,CAAA,IAAK,WAAA,KAAgB,CAAA,EAAG;AACzC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,uBAAA;AAAA,MACP,OAAA,EAAS,CAAA,uBAAA,EAA0B,iBAAA,CAAkB,cAAc,CAAC,CAAA,cAAA,EAAiB,YAAY,CAAA,OAAA,EAAU,YAAA,GAAe,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,yBAAA,CAAA;AAAA,MACtI,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,gBAAA;AAAA,IACP,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,WAAA,EAAc,YAAY,CAAA,yDAAA,CAAA;AAAA,IACpD,kBAAA,EAAoB;AAAA,GACtB;AACF;AAuBO,SAAS,qBAAA,CAAsB;AAAA,EACpC,IAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA,GAAoBA,yBAAAA;AAAA,EACpB,UAAA,GAAa;AACf,CAAA,EAA+B;AAC7B,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAA,EAAM,iBAAiB,CAAA;AAE3D,EAAA,MAAM,WAAA,GAAqF;AAAA,IACzF,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,KAAA,EAAO,OAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,uBACEtB,IAAAA;AAAA,IAACQ,KAAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,yBAAA;AAAA,MACZ,QAAA,EAAU,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA;AAAA,MACnC,EAAA,EAAI;AAAA,QACF,qBAAA,EAAuB;AAAA,UACrB,KAAA,EAAO;AAAA;AACT,OACF;AAAA,MACA,MAAA,EACE,CAAC,UAAA,IAAc,QAAA,mBACbV,GAAAA;AAAA,QAACW,MAAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,EAAA,EAAI,EAAE,UAAA,EAAY,QAAA,EAAS;AAAA,UAE1B,yBAAe,QAAA,CAAS;AAAA;AAAA,OAC3B,GACE,MAAA;AAAA,MAGN,QAAA,EAAA;AAAA,wBAAAX,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,EAAA,EAAI,EAAE,UAAA,EAAY,MAAA,EAAQ,EAAA,EAAI,GAAA,EAAI,EAC/D,mBAAS,KAAA,EACZ,CAAA;AAAA,wBACAJ,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAS,mBAAS,OAAA,EAAQ;AAAA;AAAA;AAAA,GAChD;AAEJ;ACzIA,IAAM,KAAA,GAAQ,CAAC,mBAAA,EAAqB,aAAA,EAAe,QAAQ,CAAA;AAK3D,SAAS,iBAAA,CAAkB,MAAc,YAAA,EAAqC;AAC5E,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,IAAA,OAAO,yBAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,EAAG;AAC1B,IAAA,OAAO,2CAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,WAAW,YAAY,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA,IAAU,CAAA,EAAG;AAChC,IAAA,OAAO,yCAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAS,GAAA,EAAS;AACpB,IAAA,OAAO,wCAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,aAAa,QAAA,EAAmC;AACvD,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,8BAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,SAAS,EAAA,EAAI;AACxB,IAAA,OAAO,yBAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAmBO,SAAS,aAAA,CAAc;AAAA,EAC5B,WAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAAa,KAAA;AAAA,EACb;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAII,SAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAIA,QAAAA,CAAS,WAAA,EAAa,QAAQ,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA;AAAA,IACtC,WAAA,EAAa,YAAA,EAAc,QAAA,EAAS,IAAK;AAAA,GAC3C;AACA,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIA,SAAmB,WAAA,EAAa,QAAA,IAAY,EAAE,CAAA;AAC9E,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAE1E,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAGvB,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,MAAMyB,MAAAA,GAAQ,iBAAA,CAAkB,IAAA,EAAM,YAAY,CAAA;AAClD,MAAA,IAAIA,MAAAA,EAAO;AACT,QAAA,kBAAA,CAAmBA,MAAK,CAAA;AACxB,QAAA;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,eAAe,CAAA,EAAG;AAC3B,MAAA,MAAMA,MAAAA,GAAQ,aAAa,QAAQ,CAAA;AACnC,MAAA,IAAIA,MAAAA,EAAO;AACT,QAAA,kBAAA,CAAmBA,MAAK,CAAA;AACxB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,CAAC,QAAA,KAAa,QAAA,GAAW,CAAC,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,aAAA,CAAc,CAAC,QAAA,KAAa,QAAA,GAAW,CAAC,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,MAAM,IAAA,GAAuB;AAAA,MAC3B,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,YAAA,EAAc,WAAW,YAAY,CAAA;AAAA,MACrC,QAAA;AAAA,MACA,eAAA,EAAiB;AAAA,KACnB;AAEA,IAAA,MAAM,SAAS,IAAI,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAAiB;AAC1C,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,CAAA;AACH,QAAA,uBACE/B,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC1D,QAAA,EAAA;AAAA,0BAAAL,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,gCAAA,EAEnD,CAAA;AAAA,0BAEAJ,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,aAAA;AAAA,cACN,KAAA,EAAO,IAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AACtB,gBAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACzB,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,QAAA,EAAU,UAAA;AAAA,cACV,OAAO,CAAC,CAAC,eAAA,IAAmB,CAAC,KAAK,IAAA,EAAK;AAAA,cACvC,UAAA,EAAW,0CAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,SAAA,EAAW;AAAA;AACb;AAAA,WACF;AAAA,0BAEAT,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,eAAA;AAAA,cACN,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,YAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9B,gBAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACzB,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,QAAA,EAAU,UAAA;AAAA,cACV,KAAA,EAAO,CAAC,CAAC,eAAA,IAAmB,CAAC,YAAA;AAAA,cAC7B,UAAA,EAAW,wCAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,cAAA,kBAAgBT,GAAAA,CAACI,UAAAA,EAAA,EAAW,IAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,QAAA,EAAA,GAAA,EAAC;AAAA,eAChD;AAAA,cACA,UAAA,EAAY;AAAA,gBACV,GAAA,EAAK,CAAA;AAAA,gBACL,IAAA,EAAM;AAAA;AACR;AAAA;AACF,SAAA,EACF,CAAA;AAAA,MAGJ,KAAK,CAAA;AACH,QAAA,uBACEF,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC1D,QAAA,EAAA;AAAA,0BAAAL,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,mDAAA,EAEnD,CAAA;AAAA,0BAEAJ,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,QAAA,EAAQ,IAAA;AAAA,cACR,OAAA,EAAS,aAAA;AAAA,cACT,KAAA,EAAO,QAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,EAAG,QAAA,KAAa;AACzB,gBAAA,WAAA,CAAY,QAAQ,CAAA;AACpB,gBAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACzB,CAAA;AAAA,cACA,QAAA,EAAU,UAAA;AAAA,cACV,WAAA,EAAa,CAAC,MAAA,qBACZA,GAAAA;AAAA,gBAACS,SAAAA;AAAA,gBAAA;AAAA,kBACE,GAAG,MAAA;AAAA,kBACJ,KAAA,EAAM,MAAA;AAAA,kBACN,WAAA,EAAY,gBAAA;AAAA,kBACZ,QAAA,EAAQ,IAAA;AAAA,kBACR,KAAA,EAAO,CAAC,CAAC,eAAA,IAAmB,SAAS,MAAA,KAAW,CAAA;AAAA,kBAChD,UAAA,EAAW;AAAA;AAAA,eACb;AAAA,cAEF,UAAA,EAAY,CAAC,KAAA,EAAO,WAAA,KAClB,MAAM,GAAA,CAAI,CAAC,QAAQ,KAAA,qBACjB,aAAA;AAAA,gBAACH,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,MAAA;AAAA,kBACN,GAAG,WAAA,CAAY,EAAE,KAAA,EAAO,CAAA;AAAA,kBACzB,GAAA,EAAK;AAAA;AAAA,eAER;AAAA;AAAA,WAEL;AAAA,UAEC,QAAA,CAAS,MAAA,GAAS,CAAA,oBACjBN,IAACK,GAAAA,EAAA,EACC,QAAA,kBAAAH,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,OAAM,gBAAA,EACjC,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,MAAA;AAAA,YAAO,MAAA;AAAA,YAAK,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAA;AAAA,YAAG;AAAA,WAAA,EACvD,CAAA,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,MAGJ,KAAK,CAAA;AACH,QAAA,uBACEF,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC1D,QAAA,EAAA;AAAA,0BAAAH,KAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,gBAAA,EAAiB,QAAA,EAAA;AAAA,YAAA,4BAAA;AAAA,YACtB,WAAW,gBAAA,GAAmB;AAAA,WAAA,EAC3D,CAAA;AAAA,0BAEAF,IAAAA,CAACgC,KAAAA,EAAA,EAAM,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAG,OAAA,EAAS,oBAAA,EAAqB,EAC/C,QAAA,EAAA;AAAA,4BAAAlC,IAACI,UAAAA,EAAA,EAAW,SAAQ,WAAA,EAAY,YAAA,EAAY,MAAC,QAAA,EAAA,aAAA,EAE7C,CAAA;AAAA,4BACAJ,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,UAAA,EAAY,QAAA,IAClD,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,4BAEAJ,IAACI,UAAAA,EAAA,EAAW,SAAQ,WAAA,EAAY,YAAA,EAAY,MAAC,QAAA,EAAA,eAAA,EAE7C,CAAA;AAAA,4BACAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,KAAA,EAAM,SAAA,EAAU,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cACpD,UAAA,CAAW,YAAY,CAAA,CAAE,cAAA,CAAe,OAAA,EAAS;AAAA,gBACjD,qBAAA,EAAuB,CAAA;AAAA,gBACvB,qBAAA,EAAuB;AAAA,eACxB;AAAA,aAAA,EACH,CAAA;AAAA,4BAEAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,cAAY,IAAA,EAAC,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,cACpC,QAAA,CAAS,MAAA;AAAA,cAAO;AAAA,aAAA,EACzB,CAAA;AAAA,4BACAJ,GAAAA,CAACK,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAE,EAClD,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,qBACbL,GAAAA,CAACM,IAAAA,EAAA,EAAe,KAAA,EAAO,GAAA,EAAK,IAAA,EAAK,OAAA,EAAA,EAAtB,GAA8B,CAC1C,CAAA,EACH;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,MAGJ;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF,CAAA;AAEA,EAAA,uBACEJ,IAAAA,CAACgC,KAAAA,EAAA,EAAM,aAAA,EAAY,kBAAiB,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAE,EAC7C,QAAA,EAAA;AAAA,oBAAAlC,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,MAAK,YAAA,EAAY,IAAA,EAClC,QAAA,EAAA,QAAA,GAAW,aAAA,GAAgB,eAAA,EAC9B,CAAA;AAAA,oBAEAJ,IAAC,OAAA,EAAA,EAAQ,UAAA,EAAwB,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAC1C,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,qBACVA,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA,EAAA,EADT,KAEX,CACD,CAAA,EACH,CAAA;AAAA,oBAEAE,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EACpB,QAAA,EAAA;AAAA,MAAA,CAAA,eAAA,IAAmB,KAAA,qBACnBL,GAAAA,CAACU,KAAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EACjC,6BAAmB,KAAA,EACtB,CAAA;AAAA,MAGD,kBAAkB,UAAU;AAAA,KAAA,EAC/B,CAAA;AAAA,oBAEAR,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,CAAA,EAAE,EACjE,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAACK,GAAAA,EAAA,EACE,QAAA,EAAA,QAAA,oBACCL,GAAAA,CAACW,MAAAA,EAAA,EAAO,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,oBAEjD,CAAA,EAEJ,CAAA;AAAA,sBAEAT,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAE,EACjC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACW,QAAA,EAAO,OAAA,EAAS,YAAY,QAAA,EAAU,UAAA,KAAe,CAAA,IAAK,UAAA,EAAY,QAAA,EAAA,MAAA,EAEvE,CAAA;AAAA,QAEC,aAAa,KAAA,CAAM,MAAA,GAAS,CAAA,mBAC3BX,IAACW,MAAAA,EAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,SAAS,UAAA,EAAY,QAAA,EAAU,UAAA,EAAY,QAAA,EAAA,MAAA,EAEvE,oBAEAX,GAAAA;AAAA,UAACW,MAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,OAAA,EAAS,YAAA;AAAA,YACT,QAAA,EAAU,UAAA;AAAA,YAET,QAAA,EAAA,UAAA,GACG,QAAA,GACE,WAAA,GACA,aAAA,GACF,WACA,cAAA,GACA;AAAA;AAAA;AACN,OAAA,EAEJ;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"index.js","sourcesContent":["import { Box, Card, CardContent, List, ListItem, Typography, LinearProgress, Chip } from '@mui/material';\nimport { useBudgetProgress } from '@pfm-platform/budgets-feature';\n\nexport interface BudgetListProps {\n userId: string;\n /** Date range start */\n start_date?: string;\n /** Date range end */\n end_date?: string;\n /** Custom title for the list */\n title?: string;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Maximum number of budgets to display */\n maxItems?: number;\n}\n\n/**\n * BudgetList component displays budgets with progress bars.\n * Shows budget name, amounts, and visual progress indicator.\n */\nexport function BudgetList({\n userId,\n start_date,\n end_date,\n title = 'Budgets',\n currencySymbol = '$',\n maxItems,\n}: BudgetListProps) {\n const budgets = useBudgetProgress({ userId, start_date, end_date });\n\n if (!budgets) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading budgets...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n const displayBudgets = maxItems ? budgets.slice(0, maxItems) : budgets;\n\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n {displayBudgets.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No budgets found\n </Typography>\n ) : (\n <List disablePadding>\n {displayBudgets.map((budget, index) => (\n <ListItem\n key={budget.id}\n divider={index < displayBudgets.length - 1}\n sx={{ px: 0, display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}\n >\n <Box sx={{ width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 0.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {budget.name}\n </Typography>\n <Chip\n label={budget.state}\n size=\"small\"\n color={budget.state === 'over' ? 'error' : budget.state === 'risk' ? 'warning' : 'success'}\n variant=\"outlined\"\n />\n </Box>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {currencySymbol}{budget.spent.toFixed(2)} / {currencySymbol}{budget.budgetAmount.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ width: '100%' }}>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(budget.percentSpent, 100)}\n color={budget.state === 'over' ? 'error' : budget.state === 'risk' ? 'warning' : 'primary'}\n sx={{ height: 8, borderRadius: 1 }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {budget.percentSpent.toFixed(1)}% • {currencySymbol}{budget.remaining.toFixed(2)} remaining\n </Typography>\n </Box>\n </ListItem>\n ))}\n </List>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { Box, Card, CardContent, Grid, Typography, LinearProgress, Chip } from '@mui/material';\nimport { useBudgetSummary } from '@pfm-platform/budgets-feature';\n\nexport interface BudgetSummaryProps {\n userId: string;\n /** Date range start */\n start_date?: string;\n /** Date range end */\n end_date?: string;\n /** Custom title for the summary */\n title?: string;\n /** Currency symbol to display */\n currencySymbol?: string;\n}\n\n/**\n * BudgetSummary component displays aggregate budget statistics.\n * Shows total budgets, budget amount, spent, remaining, and overall state.\n */\nexport function BudgetSummary({\n userId,\n start_date,\n end_date,\n title = 'Budget Summary',\n currencySymbol = '$',\n}: BudgetSummaryProps) {\n const summary = useBudgetSummary({ userId, start_date, end_date });\n\n if (!summary) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading budget summary...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n if (!summary.hasBudgets) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n No budgets found\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n return (\n <Card>\n <CardContent>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}>\n <Typography variant=\"h6\">\n {title}\n </Typography>\n <Chip\n label={summary.state}\n size=\"small\"\n color={summary.state === 'over' ? 'error' : summary.state === 'risk' ? 'warning' : 'success'}\n />\n </Box>\n <Grid container spacing={2}>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Budgets\n </Typography>\n <Typography variant=\"h5\">{summary.totalBudgets}</Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Budget\n </Typography>\n <Typography variant=\"h5\">\n {currencySymbol}{summary.totalBudget.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Spent\n </Typography>\n <Typography\n variant=\"h6\"\n color={summary.state === 'over' ? 'error.main' : 'text.primary'}\n >\n {currencySymbol}{summary.totalSpent.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Remaining\n </Typography>\n <Typography\n variant=\"h6\"\n color={summary.totalRemaining >= 0 ? 'success.main' : 'error.main'}\n >\n {currencySymbol}{summary.totalRemaining.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={12}>\n <Box>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 0.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Overall Progress\n </Typography>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {summary.percentSpent.toFixed(1)}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(summary.percentSpent, 100)}\n color={summary.state === 'over' ? 'error' : summary.state === 'risk' ? 'warning' : 'primary'}\n sx={{ height: 10, borderRadius: 1 }}\n />\n </Box>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n}\n","import { useState } from 'react';\nimport {\n Box,\n Button,\n TextField,\n Alert,\n CircularProgress,\n Paper,\n Typography,\n} from '@mui/material';\nimport { useCreateBudget } from '@pfm-platform/budgets-data-access';\nimport type { BudgetCreate } from '@pfm-platform/shared';\n\nexport interface BudgetCreateFormProps {\n userId: string;\n onSuccess?: () => void;\n}\n\nexport function BudgetCreateForm({\n userId,\n onSuccess,\n}: BudgetCreateFormProps) {\n const [name, setName] = useState('');\n const [budgetAmount, setBudgetAmount] = useState('');\n const [tagNames, setTagNames] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const createBudget = useCreateBudget({\n onSuccess: () => {\n setName('');\n setBudgetAmount('');\n setTagNames('');\n setError(null);\n onSuccess?.();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to create budget');\n },\n });\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!name.trim()) {\n setError('Budget name is required');\n return;\n }\n\n const amount = parseFloat(budgetAmount);\n if (isNaN(amount) || amount <= 0) {\n setError('Budget amount must be a positive number');\n return;\n }\n\n // Parse tag names from comma-separated string\n const tags = tagNames\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0);\n\n if (tags.length === 0) {\n setError('At least one tag is required');\n return;\n }\n\n const data: BudgetCreate = {\n name: name.trim(),\n budget_amount: amount,\n tag_names: tags,\n show_on_dashboard: true,\n };\n\n createBudget.mutate({ userId, data });\n };\n\n return (\n <Paper sx={{ p: 3 }}>\n <Typography variant=\"h6\" gutterBottom>\n Create Budget\n </Typography>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}\n >\n <TextField\n label=\"Budget Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={createBudget.isPending}\n error={!!error && !name.trim()}\n helperText=\"Enter a name for your budget (e.g., 'Monthly Groceries')\"\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Budget Amount\"\n type=\"number\"\n value={budgetAmount}\n onChange={(e) => {\n setBudgetAmount(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={createBudget.isPending}\n error={!!error && (isNaN(parseFloat(budgetAmount)) || parseFloat(budgetAmount) <= 0)}\n helperText=\"Enter the total budget amount (e.g., 500.00)\"\n inputProps={{\n min: 0.01,\n step: 0.01,\n }}\n />\n\n <TextField\n label=\"Tags (comma-separated)\"\n value={tagNames}\n onChange={(e) => {\n setTagNames(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={createBudget.isPending}\n error={!!error && tagNames.split(',').filter((t) => t.trim()).length === 0}\n helperText=\"Enter tags separated by commas (e.g., 'groceries, food, essentials')\"\n multiline\n rows={2}\n />\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={createBudget.isPending || !name.trim() || !budgetAmount || !tagNames.trim()}\n startIcon={createBudget.isPending ? <CircularProgress size={20} /> : null}\n >\n {createBudget.isPending ? 'Creating...' : 'Create Budget'}\n </Button>\n </Box>\n </Box>\n </Paper>\n );\n}\n","import { useState } from 'react';\nimport {\n Box,\n Button,\n TextField,\n Alert,\n CircularProgress,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n} from '@mui/material';\nimport { useUpdateBudget } from '@pfm-platform/budgets-data-access';\nimport type { Budget, BudgetUpdate } from '@pfm-platform/shared';\n\nexport interface BudgetEditFormProps {\n userId: string;\n budget: Budget;\n open: boolean;\n onClose: () => void;\n}\n\nexport function BudgetEditForm({\n userId,\n budget,\n open,\n onClose,\n}: BudgetEditFormProps) {\n const [name, setName] = useState(budget.name);\n const [budgetAmount, setBudgetAmount] = useState(budget.budget_amount.toString());\n const [tagNames, setTagNames] = useState(budget.tag_names.join(', '));\n const [error, setError] = useState<string | null>(null);\n\n const updateBudget = useUpdateBudget({\n onSuccess: () => {\n setError(null);\n onClose();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to update budget');\n },\n });\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!name.trim()) {\n setError('Budget name is required');\n return;\n }\n\n const amount = parseFloat(budgetAmount);\n if (isNaN(amount) || amount <= 0) {\n setError('Budget amount must be a positive number');\n return;\n }\n\n // Parse tag names from comma-separated string\n const tags = tagNames\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0);\n\n if (tags.length === 0) {\n setError('At least one tag is required');\n return;\n }\n\n const data: BudgetUpdate = {\n id: budget.id,\n name: name.trim(),\n budget_amount: amount,\n tag_names: tags,\n show_on_dashboard: true,\n };\n\n updateBudget.mutate({ userId, budgetId: budget.id, data });\n };\n\n const handleClose = () => {\n if (!updateBudget.isPending) {\n onClose();\n }\n };\n\n return (\n <Dialog\n open={open}\n onClose={handleClose}\n maxWidth=\"sm\"\n fullWidth\n aria-labelledby=\"edit-budget-dialog-title\"\n >\n <form onSubmit={handleSubmit}>\n <DialogTitle id=\"edit-budget-dialog-title\">Edit Budget</DialogTitle>\n <DialogContent>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}>\n <TextField\n label=\"Budget Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={updateBudget.isPending}\n error={!!error && !name.trim()}\n helperText=\"Enter a name for your budget\"\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Budget Amount\"\n type=\"number\"\n value={budgetAmount}\n onChange={(e) => {\n setBudgetAmount(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={updateBudget.isPending}\n error={!!error && (isNaN(parseFloat(budgetAmount)) || parseFloat(budgetAmount) <= 0)}\n helperText=\"Enter the total budget amount\"\n inputProps={{\n min: 0.01,\n step: 0.01,\n }}\n />\n\n <TextField\n label=\"Tags (comma-separated)\"\n value={tagNames}\n onChange={(e) => {\n setTagNames(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={updateBudget.isPending}\n error={!!error && tagNames.split(',').filter((t) => t.trim()).length === 0}\n helperText=\"Enter tags separated by commas\"\n multiline\n rows={2}\n />\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={updateBudget.isPending}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={updateBudget.isPending || !name.trim() || !budgetAmount || !tagNames.trim()}\n startIcon={updateBudget.isPending ? <CircularProgress size={20} /> : null}\n >\n {updateBudget.isPending ? 'Saving...' : 'Save Changes'}\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n );\n}\n","import { useState } from 'react';\nimport {\n IconButton,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Button,\n Tooltip,\n} from '@mui/material';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport { useDeleteBudget } from '@pfm-platform/budgets-data-access';\n\nexport interface BudgetDeleteButtonProps {\n userId: string;\n budgetId: number;\n budgetName: string;\n}\n\nexport function BudgetDeleteButton({\n userId,\n budgetId,\n budgetName,\n}: BudgetDeleteButtonProps) {\n const [open, setOpen] = useState(false);\n\n const deleteBudget = useDeleteBudget({\n onSuccess: () => {\n setOpen(false);\n },\n });\n\n const handleDelete = () => {\n deleteBudget.mutate({ userId, budgetId });\n };\n\n return (\n <>\n <Tooltip title=\"Delete budget\">\n <IconButton\n onClick={() => setOpen(true)}\n color=\"error\"\n size=\"small\"\n aria-label={`delete budget ${budgetName}`}\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onClose={() => !deleteBudget.isPending && setOpen(false)}\n aria-labelledby=\"delete-budget-dialog-title\"\n >\n <DialogTitle id=\"delete-budget-dialog-title\">Delete Budget?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Are you sure you want to delete the budget \"{budgetName}\"? This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => setOpen(false)}\n disabled={deleteBudget.isPending}\n >\n Cancel\n </Button>\n <Button\n onClick={handleDelete}\n color=\"error\"\n variant=\"contained\"\n disabled={deleteBudget.isPending}\n autoFocus\n >\n {deleteBudget.isPending ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n","import {\n Card,\n CardContent,\n Typography,\n LinearProgress,\n Box,\n Chip,\n} from '@mui/material';\nimport { TrendingUp, TrendingDown, Warning } from '@mui/icons-material';\nimport type { Budget } from '@pfm-platform/shared';\n\nexport interface BudgetProgressCardProps {\n budget: Budget;\n /** Current spent amount */\n currentSpent: number;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Show trend indicator */\n showTrend?: boolean;\n /** Comparison to last period (optional) */\n lastPeriodSpent?: number;\n}\n\n/**\n * BudgetProgressCard component displays budget progress with visual indicators.\n * Shows spent/limit/remaining with color-coded zones (green/yellow/red).\n *\n * Color zones:\n * - Green: 0-70% of limit\n * - Yellow: 70-90% of limit\n * - Red: >90% of limit\n *\n * @example\n * ```tsx\n * <BudgetProgressCard\n * budget={budget}\n * currentSpent={450.75}\n * currencySymbol=\"$\"\n * showTrend\n * lastPeriodSpent={380.50}\n * />\n * ```\n */\nexport function BudgetProgressCard({\n budget,\n currentSpent,\n currencySymbol = '$',\n showTrend = false,\n lastPeriodSpent,\n}: BudgetProgressCardProps) {\n const limit = budget.budget_amount;\n const remaining = limit - currentSpent;\n const percentage = (currentSpent / limit) * 100;\n\n // Determine color zone\n const getColor = (): 'success' | 'warning' | 'error' => {\n if (percentage <= 70) return 'success';\n if (percentage <= 90) return 'warning';\n return 'error';\n };\n\n const color = getColor();\n\n // Calculate trend vs last period\n const trend = lastPeriodSpent !== undefined ? currentSpent - lastPeriodSpent : null;\n const trendPercentage = trend !== null && lastPeriodSpent !== undefined && lastPeriodSpent > 0\n ? ((trend / lastPeriodSpent) * 100)\n : null;\n\n return (\n <Card>\n <CardContent>\n {/* Budget Name and Category */}\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', mb: 2 }}>\n <Box>\n <Typography variant=\"h6\" gutterBottom>\n {budget.name}\n </Typography>\n {budget.tag_names.length > 0 && (\n <Chip\n label={budget.tag_names[0]}\n size=\"small\"\n variant=\"outlined\"\n sx={{ mb: 1 }}\n />\n )}\n </Box>\n {percentage > 90 && (\n <Chip\n icon={<Warning />}\n label=\"Over Budget\"\n color=\"error\"\n size=\"small\"\n />\n )}\n </Box>\n\n {/* Progress Bar */}\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Progress\n </Typography>\n <Typography variant=\"body2\" fontWeight=\"bold\" color={`${color}.main`}>\n {percentage.toFixed(1)}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(percentage, 100)}\n color={color}\n sx={{ height: 8, borderRadius: 4 }}\n />\n </Box>\n\n {/* Spent / Limit / Remaining */}\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 2 }}>\n <Box>\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\">\n Spent\n </Typography>\n <Typography variant=\"h6\" color={`${color}.main`}>\n {currencySymbol}{currentSpent.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ textAlign: 'center' }}>\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\">\n Limit\n </Typography>\n <Typography variant=\"h6\">\n {currencySymbol}{limit.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ textAlign: 'right' }}>\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\">\n Remaining\n </Typography>\n <Typography\n variant=\"h6\"\n color={remaining >= 0 ? 'success.main' : 'error.main'}\n >\n {currencySymbol}{Math.abs(remaining).toFixed(2)}\n </Typography>\n </Box>\n </Box>\n\n {/* Trend Indicator */}\n {showTrend && trend !== null && trendPercentage !== null && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {trend > 0 ? (\n <Chip\n icon={<TrendingUp />}\n label={`+${currencySymbol}${Math.abs(trend).toFixed(2)} (+${trendPercentage.toFixed(1)}%)`}\n color=\"error\"\n size=\"small\"\n variant=\"outlined\"\n />\n ) : (\n <Chip\n icon={<TrendingDown />}\n label={`-${currencySymbol}${Math.abs(trend).toFixed(2)} (${trendPercentage.toFixed(1)}%)`}\n color=\"success\"\n size=\"small\"\n variant=\"outlined\"\n />\n )}\n <Typography variant=\"caption\" color=\"text.secondary\">\n vs last period\n </Typography>\n </Box>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { useState, useMemo } from 'react';\nimport {\n Box,\n Typography,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n Grid,\n Alert,\n} from '@mui/material';\nimport { BudgetProgressCard } from './BudgetProgressCard';\nimport type { Budget } from '@pfm-platform/shared';\n\nexport interface BudgetProgressListProps {\n budgets: Budget[];\n /** Map of budget ID to current spent amount */\n spentByBudget: Map<number, number>;\n /** Map of budget ID to last period spent amount (optional) */\n lastPeriodSpentByBudget?: Map<number, number>;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Show trend indicators */\n showTrends?: boolean;\n /** Enable category filtering */\n enableCategoryFilter?: boolean;\n}\n\ntype FilterValue = 'all' | 'on-track' | 'warning' | 'over-budget';\n\n/**\n * BudgetProgressList component displays all budgets with progress indicators.\n * Supports filtering by status (on-track, warning, over-budget).\n *\n * @example\n * ```tsx\n * const spentMap = new Map([\n * [1, 450.75],\n * [2, 1200.50],\n * ]);\n *\n * <BudgetProgressList\n * budgets={budgets}\n * spentByBudget={spentMap}\n * currencySymbol=\"$\"\n * showTrends\n * enableCategoryFilter\n * />\n * ```\n */\nexport function BudgetProgressList({\n budgets,\n spentByBudget,\n lastPeriodSpentByBudget,\n currencySymbol = '$',\n showTrends = false,\n enableCategoryFilter = true,\n}: BudgetProgressListProps) {\n const [statusFilter, setStatusFilter] = useState<FilterValue>('all');\n const [categoryFilter, setCategory] = useState<string>('all');\n\n // Extract unique categories\n const categories = useMemo(() => {\n const uniqueCategories = new Set<string>();\n budgets.forEach((budget) => {\n budget.tag_names.forEach((tag) => {\n uniqueCategories.add(tag);\n });\n });\n return Array.from(uniqueCategories).sort();\n }, [budgets]);\n\n // Filter budgets\n const filteredBudgets = useMemo(() => {\n return budgets.filter((budget) => {\n const spent = spentByBudget.get(budget.id) || 0;\n const limit = budget.budget_amount;\n const percentage = (spent / limit) * 100;\n\n // Status filter\n if (statusFilter === 'on-track' && percentage > 70) return false;\n if (statusFilter === 'warning' && (percentage <= 70 || percentage > 90)) return false;\n if (statusFilter === 'over-budget' && percentage <= 90) return false;\n\n // Category filter\n if (categoryFilter !== 'all' && !budget.tag_names.includes(categoryFilter)) return false;\n\n return true;\n });\n }, [budgets, spentByBudget, statusFilter, categoryFilter]);\n\n // Calculate summary stats\n const stats = useMemo(() => {\n const onTrack = budgets.filter(b => {\n const spent = spentByBudget.get(b.id) || 0;\n const percentage = (spent / b.budget_amount) * 100;\n return percentage <= 70;\n }).length;\n\n const warning = budgets.filter(b => {\n const spent = spentByBudget.get(b.id) || 0;\n const percentage = (spent / b.budget_amount) * 100;\n return percentage > 70 && percentage <= 90;\n }).length;\n\n const overBudget = budgets.filter(b => {\n const spent = spentByBudget.get(b.id) || 0;\n const percentage = (spent / b.budget_amount) * 100;\n return percentage > 90;\n }).length;\n\n return { onTrack, warning, overBudget };\n }, [budgets, spentByBudget]);\n\n if (budgets.length === 0) {\n return (\n <Alert severity=\"info\">\n No budgets found. Create a budget to start tracking your spending.\n </Alert>\n );\n }\n\n return (\n <Box>\n {/* Header with Filters */}\n <Box sx={{ mb: 3 }}>\n <Typography variant=\"h5\" gutterBottom>\n Budget Progress\n </Typography>\n\n {/* Summary Stats */}\n <Box sx={{ display: 'flex', gap: 2, mb: 2, flexWrap: 'wrap' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n <strong>{stats.onTrack}</strong> on track\n </Typography>\n <Typography variant=\"body2\" color=\"warning.main\">\n <strong>{stats.warning}</strong> warning\n </Typography>\n <Typography variant=\"body2\" color=\"error.main\">\n <strong>{stats.overBudget}</strong> over budget\n </Typography>\n </Box>\n\n {/* Filters */}\n <Box sx={{ display: 'flex', gap: 2, flexWrap: 'wrap' }}>\n <FormControl size=\"small\" sx={{ minWidth: 150 }}>\n <InputLabel>Status</InputLabel>\n <Select\n value={statusFilter}\n label=\"Status\"\n onChange={(e) => setStatusFilter(e.target.value as FilterValue)}\n >\n <MenuItem value=\"all\">All Budgets</MenuItem>\n <MenuItem value=\"on-track\">On Track</MenuItem>\n <MenuItem value=\"warning\">Warning</MenuItem>\n <MenuItem value=\"over-budget\">Over Budget</MenuItem>\n </Select>\n </FormControl>\n\n {enableCategoryFilter && categories.length > 0 && (\n <FormControl size=\"small\" sx={{ minWidth: 150 }}>\n <InputLabel>Category</InputLabel>\n <Select\n value={categoryFilter}\n label=\"Category\"\n onChange={(e) => setCategory(e.target.value)}\n >\n <MenuItem value=\"all\">All Categories</MenuItem>\n {categories.map((cat) => (\n <MenuItem key={cat} value={cat}>\n {cat}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )}\n </Box>\n </Box>\n\n {/* Budget Cards Grid */}\n {filteredBudgets.length === 0 ? (\n <Alert severity=\"info\">\n No budgets match the selected filters.\n </Alert>\n ) : (\n <Grid container spacing={3}>\n {filteredBudgets.map((budget) => {\n const spent = spentByBudget.get(budget.id) || 0;\n const lastPeriodSpent = lastPeriodSpentByBudget?.get(budget.id);\n\n return (\n <Grid key={budget.id} size={{ xs: 12, sm: 6, lg: 4 }}>\n <BudgetProgressCard\n budget={budget}\n currentSpent={spent}\n currencySymbol={currencySymbol}\n showTrend={showTrends}\n lastPeriodSpent={lastPeriodSpent}\n />\n </Grid>\n );\n })}\n </Grid>\n )}\n </Box>\n );\n}\n","/**\n * BudgetInsightsCard\n *\n * Budget insights and recommendations component.\n * Migrated from legacy Budgets/Insights.js with modern React patterns.\n *\n * Features:\n * - Budget performance analysis\n * - Overspending/underspending identification\n * - Historical trend analysis\n * - Actionable recommendations\n * - Visual indicators (icons, colors)\n * - Expandable insights list\n *\n * Migration Notes:\n * - Legacy: MobX store with complex insight loading\n * - Modern: Controlled component with callback props\n * - Removed: MobX observables, store injection\n * - Added: TypeScript types, modern hooks, Material-UI v7\n */\n\nimport { useState } from 'react';\nimport {\n Card,\n CardContent,\n Typography,\n Box,\n Button,\n Chip,\n Divider,\n useTheme,\n alpha,\n} from '@mui/material';\nimport {\n TrendingUp as TrendingUpIcon,\n TrendingDown as TrendingDownIcon,\n Warning as WarningIcon,\n CheckCircle as CheckCircleIcon,\n ExpandMore as ExpandMoreIcon,\n} from '@mui/icons-material';\n\nexport type InsightType = 'overspending' | 'underspending' | 'on-track' | 'suggest-tag';\n\nexport interface BudgetInsight {\n /**\n * Unique insight identifier\n */\n id: string;\n\n /**\n * Type of insight\n */\n type: InsightType;\n\n /**\n * Budget identifier\n */\n budgetId: string;\n\n /**\n * Budget name\n */\n budgetName: string;\n\n /**\n * Average amount over/under budget\n */\n averageAmount: number;\n\n /**\n * Number of months analyzed\n */\n monthsAnalyzed: number;\n\n /**\n * Number of times over/under budget\n */\n occurrences: number;\n\n /**\n * Recommendation message\n */\n recommendation: string;\n\n /**\n * Optional tag name (for suggest-tag type)\n */\n tagName?: string;\n}\n\nexport interface BudgetOverallSummary {\n /**\n * Total amount over/under all budgets\n */\n totalAmount: number;\n\n /**\n * Number of months in analysis\n */\n months: number;\n\n /**\n * Budget state: 'over' | 'under' | 'on-track'\n */\n state: 'over' | 'under' | 'on-track';\n}\n\nexport interface BudgetInsightsCardProps {\n /**\n * List of budget insights\n */\n insights: BudgetInsight[];\n\n /**\n * Overall budget summary\n */\n overallSummary: BudgetOverallSummary;\n\n /**\n * Whether insights are loading\n * @default false\n */\n loading?: boolean;\n\n /**\n * Maximum insights to show initially\n * @default 2\n */\n initialVisibleCount?: number;\n\n /**\n * Callback when insight action is clicked\n */\n onInsightAction?: (insight: BudgetInsight) => void;\n\n /**\n * Callback when insight is dismissed\n */\n onInsightDismiss?: (insight: BudgetInsight) => void;\n\n /**\n * Currency formatter\n */\n currencyFormatter?: (value: number) => string;\n}\n\n/**\n * Default currency formatter\n */\nconst defaultCurrencyFormatter = (value: number): string => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n};\n\n/**\n * Get insight icon and color based on type\n */\nfunction getInsightStyle(type: InsightType, theme: any) {\n switch (type) {\n case 'overspending':\n return {\n icon: <WarningIcon />,\n color: theme.palette.error.main,\n bgColor: alpha(theme.palette.error.main, 0.1),\n };\n case 'underspending':\n return {\n icon: <TrendingDownIcon />,\n color: theme.palette.info.main,\n bgColor: alpha(theme.palette.info.main, 0.1),\n };\n case 'on-track':\n return {\n icon: <CheckCircleIcon />,\n color: theme.palette.success.main,\n bgColor: alpha(theme.palette.success.main, 0.1),\n };\n case 'suggest-tag':\n return {\n icon: <TrendingUpIcon />,\n color: theme.palette.warning.main,\n bgColor: alpha(theme.palette.warning.main, 0.1),\n };\n default:\n return {\n icon: <CheckCircleIcon />,\n color: theme.palette.text.secondary,\n bgColor: alpha(theme.palette.text.secondary, 0.1),\n };\n }\n}\n\n/**\n * Budget insights and recommendations card\n *\n * Displays budget performance analysis with actionable insights.\n * Shows overall summary and individual budget insights with recommendations.\n *\n * @example\n * ```tsx\n * <BudgetInsightsCard\n * insights={budgetInsights}\n * overallSummary={{\n * totalAmount: -150,\n * months: 6,\n * state: 'over',\n * }}\n * onInsightAction={(insight) => handleAction(insight)}\n * onInsightDismiss={(insight) => dismissInsight(insight)}\n * />\n * ```\n */\nexport function BudgetInsightsCard({\n insights,\n overallSummary,\n initialVisibleCount = 2,\n onInsightAction,\n onInsightDismiss,\n currencyFormatter = defaultCurrencyFormatter,\n}: BudgetInsightsCardProps) {\n const theme = useTheme();\n const [showAll, setShowAll] = useState(false);\n\n const visibleInsights = showAll ? insights : insights.slice(0, initialVisibleCount);\n const hasMore = insights.length > initialVisibleCount;\n\n const overallStyle = overallSummary.state === 'over'\n ? { color: theme.palette.error.main, icon: <WarningIcon /> }\n : overallSummary.state === 'under'\n ? { color: theme.palette.success.main, icon: <CheckCircleIcon /> }\n : { color: theme.palette.info.main, icon: <CheckCircleIcon /> };\n\n return (\n <Card data-testid=\"budget-insights-card\">\n <CardContent>\n {/* Header */}\n <Typography variant=\"h6\" gutterBottom>\n Budget Insights\n </Typography>\n\n {/* Overall Summary */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n p: 2,\n mb: 2,\n bgcolor: alpha(overallStyle.color, 0.1),\n borderRadius: 1,\n }}\n >\n <Box sx={{ color: overallStyle.color }}>\n {overallStyle.icon}\n </Box>\n <Box sx={{ flex: 1 }}>\n {overallSummary.totalAmount > 0 && (\n <Typography variant=\"body2\">\n You've been <strong>under budget</strong> by{' '}\n <strong>{currencyFormatter(overallSummary.totalAmount)}</strong>{' '}\n on all budgets over the last{' '}\n <strong>{overallSummary.months} months</strong>.\n </Typography>\n )}\n {overallSummary.totalAmount < 0 && (\n <Typography variant=\"body2\">\n You have <strong>overspent</strong> by{' '}\n <strong>{currencyFormatter(Math.abs(overallSummary.totalAmount))}</strong>{' '}\n on all budgets over the last{' '}\n <strong>{overallSummary.months} months</strong>.\n </Typography>\n )}\n {overallSummary.totalAmount === 0 && (\n <Typography variant=\"body2\">\n You are <strong>on track</strong> with all budgets over the last{' '}\n <strong>{overallSummary.months} months</strong>.\n </Typography>\n )}\n </Box>\n </Box>\n\n <Divider sx={{ my: 2 }} />\n\n {/* Insights List */}\n {insights.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ textAlign: 'center', py: 2 }}>\n No insights available. Keep tracking your budgets!\n </Typography>\n ) : (\n <>\n {visibleInsights.map((insight) => {\n const style = getInsightStyle(insight.type, theme);\n return (\n <Box\n key={insight.id}\n data-testid={`budget-insight-${insight.id}`}\n sx={{\n p: 2,\n mb: 1,\n bgcolor: style.bgColor,\n borderRadius: 1,\n borderLeft: `4px solid ${style.color}`,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1.5 }}>\n <Box sx={{ color: style.color, mt: 0.5 }}>\n {style.icon}\n </Box>\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n {insight.budgetName}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1 }}>\n {insight.recommendation}\n </Typography>\n <Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap' }}>\n <Chip\n label={`${insight.occurrences} times`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`${insight.monthsAnalyzed} months`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`Avg: ${currencyFormatter(Math.abs(insight.averageAmount))}`}\n size=\"small\"\n variant=\"outlined\"\n />\n </Box>\n </Box>\n </Box>\n <Box sx={{ display: 'flex', gap: 1, mt: 2, justifyContent: 'flex-end' }}>\n {onInsightDismiss && (\n <Button\n size=\"small\"\n onClick={() => onInsightDismiss(insight)}\n >\n Dismiss\n </Button>\n )}\n {onInsightAction && insight.type !== 'suggest-tag' && (\n <Button\n size=\"small\"\n variant=\"contained\"\n onClick={() => onInsightAction(insight)}\n >\n Adjust Budget\n </Button>\n )}\n {onInsightAction && insight.type === 'suggest-tag' && (\n <Button\n size=\"small\"\n variant=\"contained\"\n onClick={() => onInsightAction(insight)}\n >\n Add Tag\n </Button>\n )}\n </Box>\n </Box>\n );\n })}\n\n {hasMore && (\n <Box sx={{ textAlign: 'center', mt: 2 }}>\n <Button\n size=\"small\"\n endIcon={\n <ExpandMoreIcon\n sx={{\n transform: showAll ? 'rotate(180deg)' : 'rotate(0)',\n transition: 'transform 0.3s',\n }}\n />\n }\n onClick={() => setShowAll(!showAll)}\n >\n {showAll ? 'Show Less' : `Show ${insights.length - initialVisibleCount} More`}\n </Button>\n </Box>\n )}\n </>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * BudgetInsightDialog\n *\n * Dialog for adjusting budget amounts based on insights.\n * Migrated from legacy Budgets/InsightDialog.js with modern React patterns.\n *\n * Features:\n * - Display insight details\n * - Amount adjustment input\n * - Validation and error handling\n * - Save/cancel actions\n * - Material-UI v7 theming\n *\n * Migration Notes:\n * - Legacy: MobX form with observable fields\n * - Modern: Controlled component with React state\n * - Removed: MobX observables, store injection\n * - Added: TypeScript types, modern hooks, proper validation\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n DialogContentText,\n Button,\n TextField,\n} from '@mui/material';\nimport type { BudgetInsight } from './BudgetInsightsCard';\n\nexport interface BudgetInsightDialogProps {\n /**\n * Insight to display in dialog\n */\n insight: BudgetInsight | null;\n\n /**\n * Whether dialog is open\n */\n open: boolean;\n\n /**\n * Callback when dialog is closed\n */\n onClose: () => void;\n\n /**\n * Callback when save is clicked\n */\n onSave: (insight: BudgetInsight, adjustmentAmount: number) => Promise<void>;\n\n /**\n * Whether save operation is in progress\n * @default false\n */\n saving?: boolean;\n\n /**\n * Currency formatter\n */\n currencyFormatter?: (value: number) => string;\n}\n\n/**\n * Default currency formatter\n */\nconst defaultCurrencyFormatter = (value: number): string => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n};\n\n/**\n * Budget insight adjustment dialog\n *\n * Allows users to adjust budget amounts based on spending insights.\n * Provides context about overspending/underspending patterns.\n *\n * @example\n * ```tsx\n * <BudgetInsightDialog\n * insight={selectedInsight}\n * open={dialogOpen}\n * onClose={() => setDialogOpen(false)}\n * onSave={async (insight, amount) => {\n * await updateBudget(insight.budgetId, amount);\n * }}\n * />\n * ```\n */\nexport function BudgetInsightDialog({\n insight,\n open,\n onClose,\n onSave,\n saving = false,\n currencyFormatter = defaultCurrencyFormatter,\n}: BudgetInsightDialogProps) {\n const [amount, setAmount] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n // Reset amount when insight changes or dialog opens\n useEffect(() => {\n if (open && insight) {\n const suggestedAmount = Math.abs(insight.averageAmount);\n setAmount(suggestedAmount.toFixed(2));\n setError(null);\n }\n }, [open, insight]);\n\n const handleAmountChange = (value: string) => {\n setAmount(value);\n\n // Validate amount\n const numValue = parseFloat(value);\n if (isNaN(numValue)) {\n setError('Please enter a valid number');\n } else if (numValue <= 0) {\n setError('Amount must be greater than zero');\n } else if (numValue > 1000000) {\n setError('Amount is too large');\n } else {\n setError(null);\n }\n };\n\n const handleSave = async () => {\n if (!insight || error || !amount) return;\n\n const numValue = parseFloat(amount);\n if (isNaN(numValue) || numValue <= 0) return;\n\n await onSave(insight, numValue);\n onClose();\n };\n\n const handleCancel = () => {\n setAmount('');\n setError(null);\n onClose();\n };\n\n if (!insight) {\n return null;\n }\n\n const isOverspending = insight.type === 'overspending';\n const actionLabel = isOverspending ? 'Increase Budget By' : 'Decrease Budget By';\n\n return (\n <Dialog\n open={open}\n onClose={handleCancel}\n maxWidth=\"sm\"\n fullWidth\n data-testid=\"budget-insight-dialog\"\n >\n <DialogTitle>\n {insight.budgetName}\n </DialogTitle>\n\n <DialogContent>\n {/* Insight Message */}\n {isOverspending && (\n <DialogContentText sx={{ mb: 3 }}>\n You've <strong>exceeded</strong> this budget{' '}\n <strong>{insight.occurrences}</strong> times in the last{' '}\n <strong>{insight.monthsAnalyzed}</strong> months by an average of{' '}\n <strong>{currencyFormatter(Math.abs(insight.averageAmount))}</strong> a month.\n </DialogContentText>\n )}\n\n {!isOverspending && (\n <DialogContentText sx={{ mb: 3 }}>\n You've been <strong>under</strong> this budget{' '}\n <strong>{insight.occurrences}</strong> times in the last{' '}\n <strong>{insight.monthsAnalyzed}</strong> months by an average of{' '}\n <strong>{currencyFormatter(Math.abs(insight.averageAmount))}</strong> a month.\n </DialogContentText>\n )}\n\n {/* Amount Input */}\n <TextField\n autoFocus\n fullWidth\n required\n type=\"number\"\n label={actionLabel}\n value={amount}\n onChange={(e) => handleAmountChange(e.target.value)}\n error={!!error}\n helperText={error || 'Suggested amount based on your spending pattern'}\n disabled={saving}\n inputProps={{\n min: 0,\n step: 0.01,\n 'aria-label': actionLabel,\n }}\n InputLabelProps={{\n shrink: true,\n }}\n />\n </DialogContent>\n\n <DialogActions>\n <Button onClick={handleCancel} disabled={saving}>\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n variant=\"contained\"\n disabled={saving || !!error || !amount}\n >\n {saving ? 'Saving...' : 'Save'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","/**\n * BudgetStateIndicator\n *\n * Visual indicator for budget state (over/under/on-track).\n * Migrated from legacy Budgets/BudgetState.js with modern React patterns.\n *\n * Features:\n * - Color-coded state indicators\n * - Icon-based visual communication\n * - Percentage-based progress display\n * - Responsive design with configurable sizes\n * - Accessibility support\n *\n * Migration Notes:\n * - Legacy: Simple functional component with inline styles\n * - Modern: TypeScript with Material-UI v7 theming\n * - Added: Comprehensive type safety, accessibility, responsive sizing\n */\n\nimport { Box, Typography, Chip, useTheme, alpha } from '@mui/material';\nimport {\n CheckCircle as CheckCircleIcon,\n Warning as WarningIcon,\n TrendingDown as TrendingDownIcon,\n Error as ErrorIcon,\n} from '@mui/icons-material';\n\nexport type BudgetState = 'under' | 'on-track' | 'over' | 'critical';\n\nexport interface BudgetStateIndicatorProps {\n /**\n * Current budget state\n */\n state: BudgetState;\n\n /**\n * Percentage of budget used (0-100+)\n */\n percentage: number;\n\n /**\n * Display variant\n * @default 'chip'\n */\n variant?: 'chip' | 'inline' | 'card';\n\n /**\n * Size of the indicator\n * @default 'medium'\n */\n size?: 'small' | 'medium' | 'large';\n\n /**\n * Show percentage label\n * @default true\n */\n showPercentage?: boolean;\n\n /**\n * Show state label\n * @default true\n */\n showLabel?: boolean;\n\n /**\n * Custom label override\n */\n customLabel?: string;\n}\n\n/**\n * Get state configuration (color, icon, label)\n */\nfunction getStateConfig(state: BudgetState, theme: any) {\n switch (state) {\n case 'under':\n return {\n color: theme.palette.success.main,\n bgColor: alpha(theme.palette.success.main, 0.1),\n icon: <TrendingDownIcon />,\n label: 'Under Budget',\n chipColor: 'success' as const,\n };\n case 'on-track':\n return {\n color: theme.palette.info.main,\n bgColor: alpha(theme.palette.info.main, 0.1),\n icon: <CheckCircleIcon />,\n label: 'On Track',\n chipColor: 'info' as const,\n };\n case 'over':\n return {\n color: theme.palette.warning.main,\n bgColor: alpha(theme.palette.warning.main, 0.1),\n icon: <WarningIcon />,\n label: 'Over Budget',\n chipColor: 'warning' as const,\n };\n case 'critical':\n return {\n color: theme.palette.error.main,\n bgColor: alpha(theme.palette.error.main, 0.1),\n icon: <ErrorIcon />,\n label: 'Critical',\n chipColor: 'error' as const,\n };\n }\n}\n\n/**\n * Get size configuration\n */\nfunction getSizeConfig(size: 'small' | 'medium' | 'large') {\n switch (size) {\n case 'small':\n return {\n iconSize: 16,\n fontSize: '0.75rem',\n spacing: 0.5,\n };\n case 'medium':\n return {\n iconSize: 20,\n fontSize: '0.875rem',\n spacing: 1,\n };\n case 'large':\n return {\n iconSize: 24,\n fontSize: '1rem',\n spacing: 1.5,\n };\n }\n}\n\n/**\n * Budget state indicator component\n *\n * Displays visual indicator for budget state with color coding and icons.\n * Supports multiple display variants and sizes for different contexts.\n *\n * @example\n * ```tsx\n * // Chip variant (default)\n * <BudgetStateIndicator state=\"over\" percentage={110} />\n *\n * // Inline variant\n * <BudgetStateIndicator\n * state=\"on-track\"\n * percentage={75}\n * variant=\"inline\"\n * size=\"small\"\n * />\n *\n * // Card variant with custom label\n * <BudgetStateIndicator\n * state=\"critical\"\n * percentage={150}\n * variant=\"card\"\n * customLabel=\"Way Over Budget\"\n * />\n * ```\n */\nexport function BudgetStateIndicator({\n state,\n percentage,\n variant = 'chip',\n size = 'medium',\n showPercentage = true,\n showLabel = true,\n customLabel,\n}: BudgetStateIndicatorProps) {\n const theme = useTheme();\n const config = getStateConfig(state, theme);\n const sizeConfig = getSizeConfig(size);\n\n const label = customLabel || config.label;\n const displayText = showPercentage\n ? `${label} (${percentage.toFixed(0)}%)`\n : label;\n\n // Chip variant\n if (variant === 'chip') {\n return (\n <Chip\n data-testid=\"budget-state-indicator\"\n icon={config.icon}\n label={displayText}\n color={config.chipColor}\n size={size === 'large' ? 'medium' : 'small'}\n sx={{\n fontSize: sizeConfig.fontSize,\n fontWeight: 'medium',\n }}\n />\n );\n }\n\n // Inline variant\n if (variant === 'inline') {\n return (\n <Box\n data-testid=\"budget-state-indicator\"\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: sizeConfig.spacing,\n color: config.color,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n fontSize: sizeConfig.iconSize,\n }}\n >\n {config.icon}\n </Box>\n {showLabel && (\n <Typography\n component=\"span\"\n sx={{\n fontSize: sizeConfig.fontSize,\n fontWeight: 'medium',\n }}\n >\n {displayText}\n </Typography>\n )}\n </Box>\n );\n }\n\n // Card variant\n return (\n <Box\n data-testid=\"budget-state-indicator\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: sizeConfig.spacing * 2,\n p: sizeConfig.spacing * 2,\n bgcolor: config.bgColor,\n borderRadius: 1,\n borderLeft: `4px solid ${config.color}`,\n }}\n >\n <Box\n sx={{\n color: config.color,\n display: 'flex',\n alignItems: 'center',\n fontSize: sizeConfig.iconSize * 1.5,\n }}\n >\n {config.icon}\n </Box>\n <Box sx={{ flex: 1 }}>\n {showLabel && (\n <Typography\n variant=\"subtitle2\"\n sx={{\n color: config.color,\n fontWeight: 'bold',\n fontSize: sizeConfig.fontSize,\n }}\n >\n {label}\n </Typography>\n )}\n {showPercentage && (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ fontSize: sizeConfig.fontSize }}\n >\n {percentage.toFixed(1)}% of budget used\n </Typography>\n )}\n </Box>\n </Box>\n );\n}\n","/**\n * BudgetTagInsight\n *\n * Tag-specific spending pattern insights component.\n * Migrated from legacy Budgets/TagInsight.js with modern React patterns.\n *\n * Features:\n * - Tag spending analysis\n * - Budget assignment recommendations\n * - Trend visualization\n * - Actionable insights for unbudgeted tags\n * - Material-UI v7 theming\n *\n * Migration Notes:\n * - Legacy: MobX store-based with complex tag analysis\n * - Modern: Controlled component with callback props\n * - Removed: MobX observables, store injection\n * - Added: TypeScript types, modern hooks, comprehensive insights\n */\n\nimport {\n Box,\n Card,\n CardContent,\n Typography,\n Button,\n Chip,\n Divider,\n useTheme,\n alpha,\n} from '@mui/material';\nimport {\n LocalOffer as LocalOfferIcon,\n TrendingUp as TrendingUpIcon,\n Info as InfoIcon,\n Add as AddIcon,\n} from '@mui/icons-material';\n\nexport interface TagSpendingInsight {\n /**\n * Unique insight identifier\n */\n id: string;\n\n /**\n * Tag name\n */\n tagName: string;\n\n /**\n * Average monthly spending on this tag\n */\n averageMonthlySpend: number;\n\n /**\n * Number of months analyzed\n */\n monthsAnalyzed: number;\n\n /**\n * Number of transactions with this tag\n */\n transactionCount: number;\n\n /**\n * Whether tag is currently budgeted\n */\n isBudgeted: boolean;\n\n /**\n * Suggested budget amount (if not budgeted)\n */\n suggestedBudget?: number;\n\n /**\n * Spending trend: 'increasing' | 'decreasing' | 'stable'\n */\n trend: 'increasing' | 'decreasing' | 'stable';\n\n /**\n * Percentage change in spending (positive or negative)\n */\n trendPercentage: number;\n\n /**\n * Recommendation message\n */\n recommendation: string;\n}\n\nexport interface BudgetTagInsightProps {\n /**\n * List of tag spending insights\n */\n insights: TagSpendingInsight[];\n\n /**\n * Whether insights are loading\n * @default false\n */\n loading?: boolean;\n\n /**\n * Callback when \"Create Budget\" is clicked for a tag\n */\n onCreateBudget?: (insight: TagSpendingInsight) => void;\n\n /**\n * Callback when \"View Details\" is clicked\n */\n onViewDetails?: (insight: TagSpendingInsight) => void;\n\n /**\n * Callback when insight is dismissed\n */\n onDismiss?: (insight: TagSpendingInsight) => void;\n\n /**\n * Currency formatter\n */\n currencyFormatter?: (value: number) => string;\n\n /**\n * Maximum insights to show\n * @default 5\n */\n maxVisible?: number;\n}\n\n/**\n * Default currency formatter\n */\nconst defaultCurrencyFormatter = (value: number): string => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n};\n\n/**\n * Get trend configuration\n */\nfunction getTrendConfig(trend: 'increasing' | 'decreasing' | 'stable', theme: any) {\n switch (trend) {\n case 'increasing':\n return {\n color: theme.palette.warning.main,\n bgColor: alpha(theme.palette.warning.main, 0.1),\n label: 'Increasing',\n };\n case 'decreasing':\n return {\n color: theme.palette.success.main,\n bgColor: alpha(theme.palette.success.main, 0.1),\n label: 'Decreasing',\n };\n case 'stable':\n return {\n color: theme.palette.info.main,\n bgColor: alpha(theme.palette.info.main, 0.1),\n label: 'Stable',\n };\n }\n}\n\n/**\n * Budget tag insight component\n *\n * Displays spending insights for unbudgeted or underbudgeted tags.\n * Recommends budget creation with suggested amounts based on spending patterns.\n *\n * @example\n * ```tsx\n * <BudgetTagInsight\n * insights={tagInsights}\n * onCreateBudget={(insight) => createBudgetForTag(insight)}\n * onViewDetails={(insight) => showTagDetails(insight)}\n * />\n * ```\n */\nexport function BudgetTagInsight({\n insights,\n loading = false,\n onCreateBudget,\n onViewDetails,\n onDismiss,\n currencyFormatter = defaultCurrencyFormatter,\n maxVisible = 5,\n}: BudgetTagInsightProps) {\n const theme = useTheme();\n\n const visibleInsights = insights.slice(0, maxVisible);\n const unbudgetedCount = insights.filter((i) => !i.isBudgeted).length;\n\n if (loading) {\n return (\n <Card data-testid=\"budget-tag-insight\">\n <CardContent>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ textAlign: 'center', py: 2 }}>\n Loading tag insights...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n if (insights.length === 0) {\n return (\n <Card data-testid=\"budget-tag-insight\">\n <CardContent>\n <Box sx={{ textAlign: 'center', py: 3 }}>\n <InfoIcon sx={{ fontSize: 48, color: 'text.disabled', mb: 1 }} />\n <Typography variant=\"body2\" color=\"text.secondary\">\n No tag insights available yet. Start tracking your expenses!\n </Typography>\n </Box>\n </CardContent>\n </Card>\n );\n }\n\n return (\n <Card data-testid=\"budget-tag-insight\">\n <CardContent>\n {/* Header */}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 2 }}>\n <LocalOfferIcon color=\"primary\" />\n <Typography variant=\"h6\">Tag Spending Insights</Typography>\n {unbudgetedCount > 0 && (\n <Chip\n label={`${unbudgetedCount} unbudgeted`}\n size=\"small\"\n color=\"warning\"\n sx={{ ml: 'auto' }}\n />\n )}\n </Box>\n\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Discover spending patterns and create budgets for frequently used tags.\n </Typography>\n\n <Divider sx={{ mb: 2 }} />\n\n {/* Insights List */}\n {visibleInsights.map((insight) => {\n const trendConfig = getTrendConfig(insight.trend, theme);\n\n return (\n <Box\n key={insight.id}\n data-testid={`tag-insight-${insight.id}`}\n sx={{\n p: 2,\n mb: 2,\n bgcolor: insight.isBudgeted\n ? alpha(theme.palette.success.main, 0.05)\n : alpha(theme.palette.warning.main, 0.05),\n borderRadius: 1,\n borderLeft: insight.isBudgeted\n ? `4px solid ${theme.palette.success.main}`\n : `4px solid ${theme.palette.warning.main}`,\n }}\n >\n {/* Tag Header */}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <LocalOfferIcon fontSize=\"small\" color=\"action\" />\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 'bold' }}>\n {insight.tagName}\n </Typography>\n {insight.isBudgeted && (\n <Chip label=\"Budgeted\" size=\"small\" color=\"success\" variant=\"outlined\" />\n )}\n {!insight.isBudgeted && (\n <Chip label=\"No Budget\" size=\"small\" color=\"warning\" variant=\"outlined\" />\n )}\n </Box>\n\n {/* Spending Info */}\n <Box sx={{ mb: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 0.5 }}>\n {insight.recommendation}\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mt: 1 }}>\n <Typography variant=\"h6\" color=\"primary\">\n {currencyFormatter(insight.averageMonthlySpend)}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n avg/month\n </Typography>\n </Box>\n </Box>\n\n {/* Statistics */}\n <Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap', mb: 2 }}>\n <Chip\n label={`${insight.transactionCount} transactions`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`${insight.monthsAnalyzed} months`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n icon={<TrendingUpIcon />}\n label={`${trendConfig.label} ${Math.abs(insight.trendPercentage).toFixed(0)}%`}\n size=\"small\"\n sx={{\n bgcolor: trendConfig.bgColor,\n color: trendConfig.color,\n borderColor: trendConfig.color,\n }}\n variant=\"outlined\"\n />\n </Box>\n\n {/* Actions */}\n <Box sx={{ display: 'flex', gap: 1, justifyContent: 'flex-end' }}>\n {onDismiss && (\n <Button size=\"small\" onClick={() => onDismiss(insight)}>\n Dismiss\n </Button>\n )}\n {onViewDetails && (\n <Button size=\"small\" onClick={() => onViewDetails(insight)}>\n View Details\n </Button>\n )}\n {!insight.isBudgeted && onCreateBudget && (\n <Button\n size=\"small\"\n variant=\"contained\"\n startIcon={<AddIcon />}\n onClick={() => onCreateBudget(insight)}\n >\n Create Budget\n {insight.suggestedBudget &&\n ` (${currencyFormatter(insight.suggestedBudget)})`}\n </Button>\n )}\n </Box>\n </Box>\n );\n })}\n\n {/* Show More Indicator */}\n {insights.length > maxVisible && (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ textAlign: 'center', display: 'block', mt: 1 }}\n >\n Showing {maxVisible} of {insights.length} insights\n </Typography>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * BudgetOverviewMessage\n *\n * Summary message component for budget overview.\n * Migrated from legacy Budgets/OverviewMessage.js with modern React patterns.\n *\n * Features:\n * - Contextual budget status messages\n * - Multi-budget summary insights\n * - Actionable recommendations\n * - Visual state indicators\n * - Material-UI v7 theming\n *\n * Migration Notes:\n * - Legacy: Simple string-based message component\n * - Modern: Rich message component with TypeScript and theming\n * - Added: State-based styling, icons, action buttons\n */\n\nimport { Alert, Typography, Button } from '@mui/material';\n\nexport type OverviewMessageType = 'success' | 'warning' | 'error' | 'info';\n\nexport interface BudgetOverviewData {\n /**\n * Total number of budgets\n */\n totalBudgets: number;\n\n /**\n * Number of budgets over limit\n */\n budgetsOver: number;\n\n /**\n * Number of budgets on track\n */\n budgetsOnTrack: number;\n\n /**\n * Number of budgets under limit\n */\n budgetsUnder: number;\n\n /**\n * Total amount over all budgets (negative if over, positive if under)\n */\n totalOverUnder: number;\n\n /**\n * Number of unbudgeted tags with significant spending\n */\n unbudgetedTagsCount?: number;\n}\n\nexport interface BudgetOverviewMessageProps {\n /**\n * Budget overview data\n */\n data: BudgetOverviewData;\n\n /**\n * Callback when primary action clicked\n */\n onAction?: () => void;\n\n /**\n * Custom action button label\n */\n actionLabel?: string;\n\n /**\n * Currency formatter\n */\n currencyFormatter?: (value: number) => string;\n\n /**\n * Hide action button\n * @default false\n */\n hideAction?: boolean;\n}\n\n/**\n * Default currency formatter\n */\nconst defaultCurrencyFormatter = (value: number): string => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(Math.abs(value));\n};\n\n/**\n * Determine message type and content based on budget data\n */\nfunction getOverviewMessage(\n data: BudgetOverviewData,\n currencyFormatter: (value: number) => string\n): {\n type: OverviewMessageType;\n title: string;\n message: string;\n defaultActionLabel: string;\n} {\n const { totalBudgets, budgetsOver, budgetsOnTrack, budgetsUnder, totalOverUnder, unbudgetedTagsCount } = data;\n\n // No budgets\n if (totalBudgets === 0) {\n return {\n type: 'info',\n title: 'No Budgets Yet',\n message: 'Create your first budget to start tracking your spending and reach your financial goals.',\n defaultActionLabel: 'Create Budget',\n };\n }\n\n // All budgets critical/over\n if (budgetsOver === totalBudgets && totalOverUnder < 0) {\n return {\n type: 'error',\n title: 'All Budgets Over Limit',\n message: `You've exceeded all ${totalBudgets} budget${totalBudgets > 1 ? 's' : ''} by ${currencyFormatter(totalOverUnder)} total. Review your spending and adjust budgets as needed.`,\n defaultActionLabel: 'Review Budgets',\n };\n }\n\n // Some budgets over\n if (budgetsOver > 0) {\n return {\n type: 'warning',\n title: `${budgetsOver} Budget${budgetsOver > 1 ? 's' : ''} Over Limit`,\n message: `You're over budget on ${budgetsOver} of ${totalBudgets} budgets by ${currencyFormatter(totalOverUnder)} total. Consider adjusting these budgets.`,\n defaultActionLabel: 'View Details',\n };\n }\n\n // All budgets on track\n if (budgetsOnTrack === totalBudgets) {\n const unbudgetedMsg = unbudgetedTagsCount && unbudgetedTagsCount > 0\n ? ` You have ${unbudgetedTagsCount} unbudgeted tag${unbudgetedTagsCount > 1 ? 's' : ''} worth reviewing.`\n : '';\n return {\n type: 'success',\n title: 'All Budgets On Track',\n message: `Great job! All ${totalBudgets} budget${totalBudgets > 1 ? 's are' : ' is'} on track.${unbudgetedMsg}`,\n defaultActionLabel: unbudgetedTagsCount && unbudgetedTagsCount > 0 ? 'Review Tags' : 'View Budgets',\n };\n }\n\n // Under budget\n if (budgetsUnder > 0 && budgetsOver === 0) {\n return {\n type: 'success',\n title: 'Budgets Under Control',\n message: `You're under budget by ${currencyFormatter(totalOverUnder)} total across ${budgetsUnder} budget${budgetsUnder > 1 ? 's' : ''}. Keep up the great work!`,\n defaultActionLabel: 'View Details',\n };\n }\n\n // Mixed state (some on track, some under)\n return {\n type: 'info',\n title: 'Budgets Status',\n message: `${budgetsOnTrack} on track, ${budgetsUnder} under budget. You're managing your budgets well overall.`,\n defaultActionLabel: 'View All Budgets',\n };\n}\n\n/**\n * Budget overview message component\n *\n * Displays contextual summary message based on budget status.\n * Provides actionable insights and recommendations.\n *\n * @example\n * ```tsx\n * <BudgetOverviewMessage\n * data={{\n * totalBudgets: 5,\n * budgetsOver: 2,\n * budgetsOnTrack: 2,\n * budgetsUnder: 1,\n * totalOverUnder: -150,\n * unbudgetedTagsCount: 3,\n * }}\n * onAction={() => navigate('/budgets')}\n * />\n * ```\n */\nexport function BudgetOverviewMessage({\n data,\n onAction,\n actionLabel,\n currencyFormatter = defaultCurrencyFormatter,\n hideAction = false,\n}: BudgetOverviewMessageProps) {\n const overview = getOverviewMessage(data, currencyFormatter);\n\n const severityMap: Record<OverviewMessageType, 'success' | 'warning' | 'error' | 'info'> = {\n success: 'success',\n warning: 'warning',\n error: 'error',\n info: 'info',\n };\n\n return (\n <Alert\n data-testid=\"budget-overview-message\"\n severity={severityMap[overview.type]}\n sx={{\n '& .MuiAlert-message': {\n width: '100%',\n },\n }}\n action={\n !hideAction && onAction ? (\n <Button\n color=\"inherit\"\n size=\"small\"\n onClick={onAction}\n sx={{ whiteSpace: 'nowrap' }}\n >\n {actionLabel || overview.defaultActionLabel}\n </Button>\n ) : undefined\n }\n >\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 'bold', mb: 0.5 }}>\n {overview.title}\n </Typography>\n <Typography variant=\"body2\">{overview.message}</Typography>\n </Alert>\n );\n}\n","/**\n * BudgetStepper\n *\n * Multi-step budget creation/editing form.\n * Migrated from legacy Budgets/Stepper.js with modern React patterns.\n *\n * Features:\n * - Three-step budget creation workflow\n * - Step 1: Basic info (name, amount)\n * - Step 2: Tags selection\n * - Step 3: Review and confirm\n * - Progress indicator\n * - Validation at each step\n * - Material-UI v7 Stepper component\n *\n * Migration Notes:\n * - Legacy: MobX form state with custom stepper logic\n * - Modern: React state with Material-UI Stepper\n * - Removed: MobX observables, custom validation\n * - Added: TypeScript types, modern hooks, comprehensive validation\n */\n\nimport { useState } from 'react';\nimport {\n Box,\n Stepper,\n Step,\n StepLabel,\n Button,\n TextField,\n Typography,\n Paper,\n Chip,\n Alert,\n Autocomplete,\n} from '@mui/material';\n\nexport interface BudgetFormData {\n /**\n * Budget name\n */\n name: string;\n\n /**\n * Budget amount\n */\n budgetAmount: number;\n\n /**\n * Selected tag names\n */\n tagNames: string[];\n\n /**\n * Show on dashboard\n * @default true\n */\n showOnDashboard?: boolean;\n}\n\nexport interface BudgetStepperProps {\n /**\n * Initial form data (for editing)\n */\n initialData?: Partial<BudgetFormData>;\n\n /**\n * Available tags for selection\n */\n availableTags: string[];\n\n /**\n * Callback when form is submitted\n */\n onSubmit: (data: BudgetFormData) => Promise<void>;\n\n /**\n * Callback when form is cancelled\n */\n onCancel?: () => void;\n\n /**\n * Whether form is in edit mode\n * @default false\n */\n editMode?: boolean;\n\n /**\n * Whether submission is in progress\n * @default false\n */\n submitting?: boolean;\n\n /**\n * Error message to display\n */\n error?: string | null;\n}\n\nconst steps = ['Basic Information', 'Select Tags', 'Review'];\n\n/**\n * Validate basic info step\n */\nfunction validateBasicInfo(name: string, budgetAmount: string): string | null {\n if (!name.trim()) {\n return 'Budget name is required';\n }\n if (name.trim().length < 3) {\n return 'Budget name must be at least 3 characters';\n }\n const amount = parseFloat(budgetAmount);\n if (isNaN(amount) || amount <= 0) {\n return 'Budget amount must be a positive number';\n }\n if (amount > 1000000) {\n return 'Budget amount cannot exceed $1,000,000';\n }\n return null;\n}\n\n/**\n * Validate tags step\n */\nfunction validateTags(tagNames: string[]): string | null {\n if (tagNames.length === 0) {\n return 'At least one tag is required';\n }\n if (tagNames.length > 10) {\n return 'Maximum 10 tags allowed';\n }\n return null;\n}\n\n/**\n * Budget stepper component\n *\n * Multi-step form for creating or editing budgets with validation.\n * Guides users through basic info, tag selection, and review steps.\n *\n * @example\n * ```tsx\n * <BudgetStepper\n * availableTags={['Groceries', 'Utilities', 'Entertainment']}\n * onSubmit={async (data) => {\n * await createBudget(data);\n * }}\n * onCancel={() => navigate('/budgets')}\n * />\n * ```\n */\nexport function BudgetStepper({\n initialData,\n availableTags,\n onSubmit,\n onCancel,\n editMode = false,\n submitting = false,\n error,\n}: BudgetStepperProps) {\n const [activeStep, setActiveStep] = useState(0);\n const [name, setName] = useState(initialData?.name || '');\n const [budgetAmount, setBudgetAmount] = useState(\n initialData?.budgetAmount?.toString() || ''\n );\n const [tagNames, setTagNames] = useState<string[]>(initialData?.tagNames || []);\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const handleNext = () => {\n setValidationError(null);\n\n // Validate current step\n if (activeStep === 0) {\n const error = validateBasicInfo(name, budgetAmount);\n if (error) {\n setValidationError(error);\n return;\n }\n } else if (activeStep === 1) {\n const error = validateTags(tagNames);\n if (error) {\n setValidationError(error);\n return;\n }\n }\n\n setActiveStep((prevStep) => prevStep + 1);\n };\n\n const handleBack = () => {\n setValidationError(null);\n setActiveStep((prevStep) => prevStep - 1);\n };\n\n const handleSubmit = async () => {\n const data: BudgetFormData = {\n name: name.trim(),\n budgetAmount: parseFloat(budgetAmount),\n tagNames,\n showOnDashboard: true,\n };\n\n await onSubmit(data);\n };\n\n const renderStepContent = (step: number) => {\n switch (step) {\n case 0:\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Enter basic budget information\n </Typography>\n\n <TextField\n label=\"Budget Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setValidationError(null);\n }}\n required\n fullWidth\n disabled={submitting}\n error={!!validationError && !name.trim()}\n helperText=\"e.g., Monthly Groceries, Car Maintenance\"\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Budget Amount\"\n type=\"number\"\n value={budgetAmount}\n onChange={(e) => {\n setBudgetAmount(e.target.value);\n setValidationError(null);\n }}\n required\n fullWidth\n disabled={submitting}\n error={!!validationError && !budgetAmount}\n helperText=\"Maximum spending limit for this budget\"\n InputProps={{\n startAdornment: <Typography sx={{ mr: 0.5 }}>$</Typography>,\n }}\n inputProps={{\n min: 0,\n step: 1,\n }}\n />\n </Box>\n );\n\n case 1:\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Select tags to track spending against this budget\n </Typography>\n\n <Autocomplete\n multiple\n options={availableTags}\n value={tagNames}\n onChange={(_, newValue) => {\n setTagNames(newValue);\n setValidationError(null);\n }}\n disabled={submitting}\n renderInput={(params) => (\n <TextField\n {...params}\n label=\"Tags\"\n placeholder=\"Select tags...\"\n required\n error={!!validationError && tagNames.length === 0}\n helperText=\"Choose tags related to this budget (e.g., Groceries, Dining Out)\"\n />\n )}\n renderTags={(value, getTagProps) =>\n value.map((option, index) => (\n <Chip\n label={option}\n {...getTagProps({ index })}\n key={option}\n />\n ))\n }\n />\n\n {tagNames.length > 0 && (\n <Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {tagNames.length} tag{tagNames.length > 1 ? 's' : ''} selected\n </Typography>\n </Box>\n )}\n </Box>\n );\n\n case 2:\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Review your budget before {editMode ? 'saving changes' : 'creating'}\n </Typography>\n\n <Paper sx={{ p: 2, bgcolor: 'background.default' }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n Budget Name\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 'medium' }}>\n {name}\n </Typography>\n\n <Typography variant=\"subtitle2\" gutterBottom>\n Budget Amount\n </Typography>\n <Typography variant=\"h6\" color=\"primary\" sx={{ mb: 2 }}>\n ${parseFloat(budgetAmount).toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}\n </Typography>\n\n <Typography variant=\"subtitle2\" gutterBottom>\n Tags ({tagNames.length})\n </Typography>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {tagNames.map((tag) => (\n <Chip key={tag} label={tag} size=\"small\" />\n ))}\n </Box>\n </Paper>\n </Box>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <Paper data-testid=\"budget-stepper\" sx={{ p: 3 }}>\n <Typography variant=\"h6\" gutterBottom>\n {editMode ? 'Edit Budget' : 'Create Budget'}\n </Typography>\n\n <Stepper activeStep={activeStep} sx={{ my: 3 }}>\n {steps.map((label) => (\n <Step key={label}>\n <StepLabel>{label}</StepLabel>\n </Step>\n ))}\n </Stepper>\n\n <Box sx={{ mt: 3, mb: 2 }}>\n {(validationError || error) && (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {validationError || error}\n </Alert>\n )}\n\n {renderStepContent(activeStep)}\n </Box>\n\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mt: 3 }}>\n <Box>\n {onCancel && (\n <Button onClick={onCancel} disabled={submitting}>\n Cancel\n </Button>\n )}\n </Box>\n\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button onClick={handleBack} disabled={activeStep === 0 || submitting}>\n Back\n </Button>\n\n {activeStep < steps.length - 1 ? (\n <Button variant=\"contained\" onClick={handleNext} disabled={submitting}>\n Next\n </Button>\n ) : (\n <Button\n variant=\"contained\"\n onClick={handleSubmit}\n disabled={submitting}\n >\n {submitting\n ? editMode\n ? 'Saving...'\n : 'Creating...'\n : editMode\n ? 'Save Changes'\n : 'Create Budget'}\n </Button>\n )}\n </Box>\n </Box>\n </Paper>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/BudgetList.tsx","../src/components/BudgetSummary.tsx","../src/components/BudgetCreateForm.tsx","../src/components/BudgetEditForm.tsx","../src/components/BudgetDeleteButton.tsx","../src/components/BudgetProgressCard.tsx","../src/components/BudgetProgressList.tsx","../src/components/BudgetInsightsCard.tsx","../src/components/BudgetInsightDialog.tsx","../src/components/BudgetStateIndicator.tsx","../src/components/BudgetTagInsight.tsx","../src/components/BudgetOverviewMessage.tsx","../src/components/BudgetStepper.tsx"],"names":["jsx","Card","jsxs","CardContent","Typography","Box","Chip","LinearProgress","useState","TextField","Alert","Button","CircularProgress","Dialog","DialogTitle","DialogContent","DialogActions","Grid","WarningIcon","TrendingDownIcon","CheckCircleIcon","TrendingUpIcon","Fragment","ExpandMoreIcon","defaultCurrencyFormatter","DialogContentText","alpha","ErrorIcon","useTheme","InfoIcon","LocalOfferIcon","Divider","AddIcon","error","Paper"],"mappings":";;;;;;;;;AAqBO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA,GAAQ,SAAA;AAAA,EACR,cAAA,GAAiB,GAAA;AAAA,EACjB;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,UAAU,iBAAA,CAAkB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAEzD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,MAClC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,0BACC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,oBAAA,EAEnD;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,iBAAiB,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,OAAA;AAE/D,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,MAClC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,IACC,eAAe,MAAA,KAAW,CAAA,uBACxB,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAAiB,8BAEnD,CAAA,mBAEA,GAAA,CAAC,QAAK,cAAA,EAAc,IAAA,EACjB,yBAAe,GAAA,CAAI,CAAC,QAAQ,KAAA,qBAC3B,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAAS,KAAA,GAAQ,cAAA,CAAe,MAAA,GAAS,CAAA;AAAA,QACzC,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,SAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,UAAA,EAAY,YAAA,EAAa;AAAA,QAEhF,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,KAAI,EACxG,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EACvD,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAQ,UAAA,EAAW,QAAA,EACpC,iBAAO,IAAA,EACV,CAAA;AAAA,8BACA,GAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,OAAO,MAAA,CAAO,KAAA;AAAA,kBACd,IAAA,EAAK,OAAA;AAAA,kBACL,KAAA,EAAO,OAAO,KAAA,KAAU,MAAA,GAAS,UAAU,MAAA,CAAO,KAAA,KAAU,SAAS,SAAA,GAAY,SAAA;AAAA,kBACjF,OAAA,EAAQ;AAAA;AAAA;AACV,aAAA,EACF,CAAA;AAAA,4BACA,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,YAAW,QAAA,EACpC,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,cAAgB,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,cAAE,KAAA;AAAA,cAAI,cAAA;AAAA,cAAgB,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,CAAC;AAAA,aAAA,EAC5F;AAAA,WAAA,EACF,CAAA;AAAA,+BACC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,KAAA,EAAO,QAAO,EACvB,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,aAAA;AAAA,gBACR,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,cAAc,GAAG,CAAA;AAAA,gBACxC,KAAA,EAAO,OAAO,KAAA,KAAU,MAAA,GAAS,UAAU,MAAA,CAAO,KAAA,KAAU,SAAS,SAAA,GAAY,SAAA;AAAA,gBACjF,EAAA,EAAI,EAAE,MAAA,EAAQ,CAAA,EAAG,cAAc,CAAA;AAAE;AAAA,aACnC;AAAA,4BACA,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,OAAM,gBAAA,EACjC,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,cAAE,WAAA;AAAA,cAAK,cAAA;AAAA,cAAgB,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA;AAAA,cAAE;AAAA,aAAA,EACnF;AAAA,WAAA,EACF;AAAA;AAAA,OAAA;AAAA,MA9BK,MAAA,CAAO;AAAA,KAgCf,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;ACjFO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA,GAAQ,gBAAA;AAAA,EACR,cAAA,GAAiB;AACnB,CAAA,EAAuB;AACrB,EAAA,MAAM,UAAU,gBAAA,CAAiB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAExD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACEA,GAAAA,CAACC,IAAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAACC,aAAA,EACC,QAAA,EAAA;AAAA,sBAAAH,IAACI,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,YAAA,EAAY,MAClC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBACAJ,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,2BAAA,EAEnD;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,IAAA,uBACEJ,GAAAA,CAACC,IAAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAACC,aAAA,EACC,QAAA,EAAA;AAAA,sBAAAH,IAACI,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,YAAA,EAAY,MAClC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBACAJ,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,kBAAA,EAEnD;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEJ,GAAAA,CAACC,IAAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAACC,aAAA,EACC,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,GAAE,EACvF,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,MACjB,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBACAJ,GAAAA;AAAA,QAACM,IAAAA;AAAA,QAAA;AAAA,UACC,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,QAAQ,KAAA,KAAU,MAAA,GAAS,UAAU,OAAA,CAAQ,KAAA,KAAU,SAAS,SAAA,GAAY;AAAA;AAAA;AACrF,KAAA,EACF,CAAA;AAAA,oBACAJ,IAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACvB,QAAA,EAAA;AAAA,sBAAAF,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,GACV,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAAiB,YAAA,EAAY,IAAA,EAAC,QAAA,EAAA,eAAA,EAEhE,CAAA;AAAA,wBACAJ,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAM,kBAAQ,YAAA,EAAa;AAAA,OAAA,EACjD,CAAA,EACF,CAAA;AAAA,sBACAJ,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,GACV,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAAiB,YAAA,EAAY,IAAA,EAAC,QAAA,EAAA,cAAA,EAEhE,CAAA;AAAA,wBACAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,SAAQ,IAAA,EACjB,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,UAAgB,OAAA,CAAQ,WAAA,CAAY,OAAA,CAAQ,CAAC;AAAA,SAAA,EAChD;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAJ,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,GACV,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAAiB,YAAA,EAAY,IAAA,EAAC,QAAA,EAAA,aAAA,EAEhE,CAAA;AAAA,wBACAF,IAAAA;AAAA,UAACE,UAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,OAAA,CAAQ,KAAA,KAAU,MAAA,GAAS,YAAA,GAAe,cAAA;AAAA,YAEhD,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,cAAgB,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,CAAC;AAAA;AAAA;AAAA;AAC/C,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAJ,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,GACV,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,gBAAA,EAAiB,YAAA,EAAY,IAAA,EAAC,QAAA,EAAA,WAAA,EAEhE,CAAA;AAAA,wBACAF,IAAAA;AAAA,UAACE,UAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,OAAA,CAAQ,cAAA,IAAkB,CAAA,GAAI,cAAA,GAAiB,YAAA;AAAA,YAErD,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,cAAgB,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,CAAC;AAAA;AAAA;AAAA;AACnD,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAJ,IAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IACV,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAH,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,GAAA,EAAI,EACnE,QAAA,EAAA;AAAA,0BAAAL,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,kBAAA,EAEnD,CAAA;AAAA,0BACAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,YAAW,QAAA,EACpC,QAAA,EAAA;AAAA,YAAA,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,YAAE;AAAA,WAAA,EACnC;AAAA,SAAA,EACF,CAAA;AAAA,wBACAJ,GAAAA;AAAA,UAACO,cAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,aAAA;AAAA,YACR,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,cAAc,GAAG,CAAA;AAAA,YACzC,KAAA,EAAO,QAAQ,KAAA,KAAU,MAAA,GAAS,UAAU,OAAA,CAAQ,KAAA,KAAU,SAAS,SAAA,GAAY,SAAA;AAAA,YACnF,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,cAAc,CAAA;AAAE;AAAA;AACpC,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACxHO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,MAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAe,eAAA,CAAgB;AAAA,IACnC,WAAW,MAAM;AACf,MAAA,OAAA,CAAQ,EAAE,CAAA;AACV,MAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,SAAA,IAAY;AAAA,IACd,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,yBAAyB,CAAA;AAAA,IACzE;AAAA,GACD,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,MAAA,QAAA,CAAS,yBAAyB,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,WAAW,YAAY,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA,IAAU,CAAA,EAAG;AAChC,MAAA,QAAA,CAAS,yCAAyC,CAAA;AAClD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAO,QAAA,CACV,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,CAAA,CACvB,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,CAAC,CAAA;AAEjC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,QAAA,CAAS,8BAA8B,CAAA;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,IAAA,GAAqB;AAAA,MACzB,OAAA,EAAS,MAAA;AAAA,MACT,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,KAAA,EAAO,GAAA,CAAI,QAAA,EAAS,GAAI,CAAA;AAAA,MACxB,IAAA,EAAM,IAAI,WAAA,EAAY;AAAA,MACtB,aAAA,EAAe,MAAA;AAAA,MACf,iBAAA,EAAmB;AAAA,KACrB;AAEA,IAAA,YAAA,CAAa,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,EACtD,CAAA;AAEA,EAAA,uBACEL,IAAAA,CAAC,KAAA,EAAA,EAAM,IAAI,EAAE,CAAA,EAAG,GAAE,EAChB,QAAA,EAAA;AAAA,oBAAAF,IAACI,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,YAAA,EAAY,MAAC,QAAA,EAAA,eAAA,EAEtC,CAAA;AAAA,oBACAF,IAAAA;AAAA,MAACG,GAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,MAAA;AAAA,QACV,QAAA,EAAU,YAAA;AAAA,QACV,IAAI,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,KAAK,CAAA,EAAE;AAAA,QAEvD,QAAA,EAAA;AAAA,0BAAAL,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,aAAA;AAAA,cACN,KAAA,EAAO,IAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AACtB,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,OAAO,CAAC,CAAC,KAAA,IAAS,CAAC,KAAK,IAAA,EAAK;AAAA,cAC7B,UAAA,EAAW,0DAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,SAAA,EAAW;AAAA;AACb;AAAA,WACF;AAAA,0BAEAA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,eAAA;AAAA,cACN,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,YAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9B,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,KAAA,EAAO,CAAC,CAAC,KAAA,KAAU,KAAA,CAAM,UAAA,CAAW,YAAY,CAAC,CAAA,IAAK,UAAA,CAAW,YAAY,CAAA,IAAK,CAAA,CAAA;AAAA,cAClF,UAAA,EAAW,8CAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,GAAA,EAAK,IAAA;AAAA,gBACL,IAAA,EAAM;AAAA;AACR;AAAA,WACF;AAAA,0BAEAA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,wBAAA;AAAA,cACN,KAAA,EAAO,QAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAC1B,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,KAAA,EAAO,CAAC,CAAC,KAAA,IAAS,SAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,EAAE,MAAA,KAAW,CAAA;AAAA,cACzE,UAAA,EAAW,sEAAA;AAAA,cACX,SAAA,EAAS,IAAA;AAAA,cACT,IAAA,EAAM;AAAA;AAAA,WACR;AAAA,UAEC,KAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA,EACjD,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,0BAGFA,GAAAA,CAACK,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAE,EACjC,QAAA,kBAAAL,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,WAAA;AAAA,cACR,QAAA,EAAU,YAAA,CAAa,SAAA,IAAa,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,CAAC,YAAA,IAAgB,CAAC,QAAA,CAAS,IAAA,EAAK;AAAA,cACpF,SAAA,EAAW,aAAa,SAAA,mBAAYA,IAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,IAAI,CAAA,GAAK,IAAA;AAAA,cAEpE,QAAA,EAAA,YAAA,CAAa,YAAY,aAAA,GAAgB;AAAA;AAAA,WAC5C,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACzIO,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIQ,QAAAA,CAAS,OAAO,IAAI,CAAA;AAC5C,EAAA,MAAM,CAAC,cAAc,eAAe,CAAA,GAAIA,SAAS,MAAA,CAAO,aAAA,CAAc,UAAU,CAAA;AAChF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAA,EAAA,KAAM,EAAA,CAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC7F,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAe,eAAA,CAAgB;AAAA,IACnC,WAAW,MAAM;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,yBAAyB,CAAA;AAAA,IACzE;AAAA,GACD,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,MAAA,QAAA,CAAS,yBAAyB,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,WAAW,YAAY,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA,IAAU,CAAA,EAAG;AAChC,MAAA,QAAA,CAAS,yCAAyC,CAAA;AAClD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAO,QAAA,CACV,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,CAAA,CACvB,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,CAAC,CAAA;AAEjC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,QAAA,CAAS,8BAA8B,CAAA;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAqB;AAAA,MACzB,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,aAAA,EAAe,MAAA;AAAA,MACf,iBAAA,EAAmB;AAAA,KACrB;AAEA,IAAA,YAAA,CAAa,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAO,EAAA,EAAI,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,EAC3E,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC3B,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA;AAEA,EAAA,uBACER,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAS,IAAA;AAAA,MACT,iBAAA,EAAgB,0BAAA;AAAA,MAEhB,QAAA,kBAAAE,IAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EACd,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,WAAA,EAAA,EAAY,EAAA,EAAG,0BAAA,EAA2B,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBACtDA,GAAAA,CAAC,aAAA,EAAA,EACC,QAAA,kBAAAE,IAAAA,CAACG,KAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,KAAK,CAAA,EAAG,EAAA,EAAI,GAAE,EACjE,QAAA,EAAA;AAAA,0BAAAL,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,aAAA;AAAA,cACN,KAAA,EAAO,IAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AACtB,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,OAAO,CAAC,CAAC,KAAA,IAAS,CAAC,KAAK,IAAA,EAAK;AAAA,cAC7B,UAAA,EAAW,8BAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,SAAA,EAAW;AAAA;AACb;AAAA,WACF;AAAA,0BAEAT,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,eAAA;AAAA,cACN,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,YAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9B,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,KAAA,EAAO,CAAC,CAAC,KAAA,KAAU,KAAA,CAAM,UAAA,CAAW,YAAY,CAAC,CAAA,IAAK,UAAA,CAAW,YAAY,CAAA,IAAK,CAAA,CAAA;AAAA,cAClF,UAAA,EAAW,+BAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,GAAA,EAAK,IAAA;AAAA,gBACL,IAAA,EAAM;AAAA;AACR;AAAA,WACF;AAAA,0BAEAT,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,wBAAA;AAAA,cACN,KAAA,EAAO,QAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAC1B,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,UAAU,YAAA,CAAa,SAAA;AAAA,cACvB,KAAA,EAAO,CAAC,CAAC,KAAA,IAAS,SAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,EAAE,MAAA,KAAW,CAAA;AAAA,cACzE,UAAA,EAAW,gCAAA;AAAA,cACX,SAAA,EAAS,IAAA;AAAA,cACT,IAAA,EAAM;AAAA;AAAA,WACR;AAAA,UAEC,KAAA,oBACCT,GAAAA,CAACU,KAAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA,EACjD,QAAA,EAAA,KAAA,EACH;AAAA,SAAA,EAEJ,CAAA,EACF,CAAA;AAAA,wBACAR,KAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAACW,QAAA,EAAO,OAAA,EAAS,aAAa,QAAA,EAAU,YAAA,CAAa,WAAW,QAAA,EAAA,QAAA,EAEhE,CAAA;AAAA,0BACAX,GAAAA;AAAA,YAACW,MAAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,WAAA;AAAA,cACR,QAAA,EAAU,YAAA,CAAa,SAAA,IAAa,CAAC,IAAA,CAAK,IAAA,EAAK,IAAK,CAAC,YAAA,IAAgB,CAAC,QAAA,CAAS,IAAA,EAAK;AAAA,cACpF,SAAA,EAAW,aAAa,SAAA,mBAAYX,IAACY,gBAAAA,EAAA,EAAiB,IAAA,EAAM,EAAA,EAAI,CAAA,GAAK,IAAA;AAAA,cAEpE,QAAA,EAAA,YAAA,CAAa,YAAY,WAAA,GAAc;AAAA;AAAA;AAC1C,SAAA,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;ACvJO,SAAS,kBAAA,CAAmB;AAAA,EACjC,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,SAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,eAAe,eAAA,CAAgB;AAAA,IACnC,WAAW,MAAM;AACf,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,GACD,CAAA;AAED,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,YAAA,CAAa,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,uBACEN,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAM,eAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC3B,KAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAK,OAAA;AAAA,QACL,YAAA,EAAY,iBAAiB,UAAU,CAAA,CAAA;AAAA,QAEvC,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW;AAAA;AAAA,KACd,EACF,CAAA;AAAA,oBAEAE,IAAAA;AAAA,MAACW,MAAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAS,MAAM,CAAC,YAAA,CAAa,SAAA,IAAa,QAAQ,KAAK,CAAA;AAAA,QACvD,iBAAA,EAAgB,4BAAA;AAAA,QAEhB,QAAA,EAAA;AAAA,0BAAAb,GAAAA,CAACc,WAAAA,EAAA,EAAY,EAAA,EAAG,8BAA6B,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,0BAC3Dd,GAAAA,CAACe,aAAAA,EAAA,EACC,QAAA,kBAAAb,KAAC,iBAAA,EAAA,EAAkB,QAAA,EAAA;AAAA,YAAA,8CAAA;AAAA,YAC4B,UAAA;AAAA,YAAW;AAAA,WAAA,EAC1D,CAAA,EACF,CAAA;AAAA,0BACAA,IAAAA,CAACc,aAAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAhB,GAAAA;AAAA,cAACW,MAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,gBAC5B,UAAU,YAAA,CAAa,SAAA;AAAA,gBACxB,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACAX,GAAAA;AAAA,cAACW,MAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,YAAA;AAAA,gBACT,KAAA,EAAM,OAAA;AAAA,gBACN,OAAA,EAAQ,WAAA;AAAA,gBACR,UAAU,YAAA,CAAa,SAAA;AAAA,gBACvB,SAAA,EAAS,IAAA;AAAA,gBAER,QAAA,EAAA,YAAA,CAAa,YAAY,aAAA,GAAgB;AAAA;AAAA;AAC5C,WAAA,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACtCO,SAAS,kBAAA,CAAmB;AAAA,EACjC,MAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA,GAAiB,GAAA;AAAA,EACjB,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,QAAQ,MAAA,CAAO,aAAA;AACrB,EAAA,MAAM,YAAY,KAAA,GAAQ,YAAA;AAC1B,EAAA,MAAM,UAAA,GAAc,eAAe,KAAA,GAAS,GAAA;AAG5C,EAAA,MAAM,WAAW,MAAuC;AACtD,IAAA,IAAI,UAAA,IAAc,IAAI,OAAO,SAAA;AAC7B,IAAA,IAAI,UAAA,IAAc,IAAI,OAAO,SAAA;AAC7B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,QAAQ,QAAA,EAAS;AAGvB,EAAA,MAAM,KAAA,GAAQ,eAAA,KAAoB,MAAA,GAAY,YAAA,GAAe,eAAA,GAAkB,IAAA;AAC/E,EAAA,MAAM,eAAA,GAAkB,UAAU,IAAA,IAAQ,eAAA,KAAoB,UAAa,eAAA,GAAkB,CAAA,GACvF,KAAA,GAAQ,eAAA,GAAmB,GAAA,GAC7B,IAAA;AAEJ,EAAA,uBACEX,GAAAA,CAACC,IAAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAACC,aAAA,EAEC,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,UAAA,EAAY,YAAA,EAAc,EAAA,EAAI,GAAE,EAC3F,QAAA,EAAA;AAAA,sBAAAH,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,MAAK,YAAA,EAAY,IAAA,EAClC,iBAAO,IAAA,EACV,CAAA;AAAA,QACC,MAAA,CAAO,WAAA,CAAY,MAAA,GAAS,CAAA,oBAC3BJ,GAAAA;AAAA,UAACM,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,MAAA,CAAO,WAAA,CAAY,CAAC,CAAA,CAAE,QAAA;AAAA,YAC7B,IAAA,EAAK,OAAA;AAAA,YACL,OAAA,EAAQ,UAAA;AAAA,YACR,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA;AAAE;AAAA;AACd,OAAA,EAEJ,CAAA;AAAA,MACC,UAAA,GAAa,sBACZN,GAAAA;AAAA,QAACM,IAAAA;AAAA,QAAA;AAAA,UACC,IAAA,kBAAMN,GAAAA,CAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,UACf,KAAA,EAAM,aAAA;AAAA,UACN,KAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAK;AAAA;AAAA;AACP,KAAA,EAEJ,CAAA;AAAA,oBAGAE,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,EAAA,EAAI,GAAE,EACf,QAAA,EAAA;AAAA,sBAAAH,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,CAAA,EAAE,EACjE,QAAA,EAAA;AAAA,wBAAAL,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,UAAA,EAEnD,CAAA;AAAA,wBACAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,UAAA,EAAW,MAAA,EAAO,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,KAAA,CAAA,EAC1D,QAAA,EAAA;AAAA,UAAA,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,UAAE;AAAA,SAAA,EACzB;AAAA,OAAA,EACF,CAAA;AAAA,sBACAJ,GAAAA;AAAA,QAACO,cAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,aAAA;AAAA,UACR,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,GAAG,CAAA;AAAA,UAC/B,KAAA;AAAA,UACA,EAAA,EAAI,EAAE,MAAA,EAAQ,CAAA,EAAG,cAAc,CAAA;AAAE;AAAA;AACnC,KAAA,EACF,CAAA;AAAA,oBAGAL,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,CAAA,EAAE,EACjE,QAAA,EAAA;AAAA,sBAAAH,IAAAA,CAACG,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,WAAU,KAAA,EAAM,gBAAA,EAAiB,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA,OAAA,EAErE,CAAA;AAAA,wBACAF,KAACE,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,KAAA,CAAA,EACrC,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,UAAgB,YAAA,CAAa,QAAQ,CAAC;AAAA,SAAA,EACzC;AAAA,OAAA,EACF,CAAA;AAAA,sBACAF,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,SAAA,EAAW,UAAS,EAC7B,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,WAAU,KAAA,EAAM,gBAAA,EAAiB,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA,OAAA,EAErE,CAAA;AAAA,wBACAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,SAAQ,IAAA,EACjB,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,UAAgB,KAAA,CAAM,QAAQ,CAAC;AAAA,SAAA,EAClC;AAAA,OAAA,EACF,CAAA;AAAA,sBACAF,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,SAAA,EAAW,SAAQ,EAC5B,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,WAAU,KAAA,EAAM,gBAAA,EAAiB,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA,WAAA,EAErE,CAAA;AAAA,wBACAF,IAAAA;AAAA,UAACE,UAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,SAAA,IAAa,CAAA,GAAI,cAAA,GAAiB,YAAA;AAAA,YAExC,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,cAAgB,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,CAAE,QAAQ,CAAC;AAAA;AAAA;AAAA;AAChD,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,aAAa,KAAA,KAAU,IAAA,IAAQ,eAAA,KAAoB,IAAA,oBAClDF,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,GAAA,EAAK,GAAE,EACtD,QAAA,EAAA;AAAA,MAAA,KAAA,GAAQ,oBACPL,GAAAA;AAAA,QAACM,IAAAA;AAAA,QAAA;AAAA,UACC,IAAA,kBAAMN,GAAAA,CAAC,UAAA,EAAA,EAAW,CAAA;AAAA,UAClB,KAAA,EAAO,CAAA,CAAA,EAAI,cAAc,CAAA,EAAG,KAAK,GAAA,CAAI,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAAM,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,UACtF,KAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ;AAAA;AAAA,0BAGVA,GAAAA;AAAA,QAACM,IAAAA;AAAA,QAAA;AAAA,UACC,IAAA,kBAAMN,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,UACpB,KAAA,EAAO,CAAA,CAAA,EAAI,cAAc,CAAA,EAAG,KAAK,GAAA,CAAI,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,UACrF,KAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ;AAAA;AAAA,OACV;AAAA,sBAEFA,IAACI,UAAAA,EAAA,EAAW,SAAQ,SAAA,EAAU,KAAA,EAAM,kBAAiB,QAAA,EAAA,gBAAA,EAErD;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;AC5HO,SAAS,kBAAA,CAAmB;AAAA,EACjC,OAAA;AAAA,EACA,aAAA;AAAA,EACA,uBAAA;AAAA,EACA,cAAA,GAAiB,GAAA;AAAA,EACjB,UAAA,GAAa,KAAA;AAAA,EACb,oBAAA,GAAuB;AACzB,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAII,SAAsB,KAAK,CAAA;AACnE,EAAA,MAAM,CAAC,cAAA,EAAgB,WAAW,CAAA,GAAIA,SAAiB,KAAK,CAAA;AAG5D,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AACzC,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC1B,MAAA,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,CAAC,EAAA,KAAO;AACjC,QAAA,gBAAA,CAAiB,GAAA,CAAI,GAAG,QAAQ,CAAA;AAAA,MAClC,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAAE,IAAA,EAAK;AAAA,EAC3C,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAM;AACpC,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW;AAChC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,IAAK,CAAA;AAC9C,MAAA,MAAM,QAAQ,MAAA,CAAO,aAAA;AACrB,MAAA,MAAM,UAAA,GAAc,QAAQ,KAAA,GAAS,GAAA;AAGrC,MAAA,IAAI,YAAA,KAAiB,UAAA,IAAc,UAAA,GAAa,EAAA,EAAI,OAAO,KAAA;AAC3D,MAAA,IAAI,iBAAiB,SAAA,KAAc,UAAA,IAAc,EAAA,IAAM,UAAA,GAAa,KAAK,OAAO,KAAA;AAChF,MAAA,IAAI,YAAA,KAAiB,aAAA,IAAiB,UAAA,IAAc,EAAA,EAAI,OAAO,KAAA;AAG/D,MAAA,IAAI,cAAA,KAAmB,KAAA,IAAS,CAAC,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,CAAA,EAAA,KAAM,EAAA,CAAG,QAAA,KAAa,cAAc,CAAA,EAAG,OAAO,KAAA;AAEvG,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,OAAA,EAAS,aAAA,EAAe,YAAA,EAAc,cAAc,CAAC,CAAA;AAGzD,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM;AAC1B,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK;AAClC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAc,KAAA,GAAQ,CAAA,CAAE,aAAA,GAAiB,GAAA;AAC/C,MAAA,OAAO,UAAA,IAAc,EAAA;AAAA,IACvB,CAAC,CAAA,CAAE,MAAA;AAEH,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK;AAClC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAc,KAAA,GAAQ,CAAA,CAAE,aAAA,GAAiB,GAAA;AAC/C,MAAA,OAAO,UAAA,GAAa,MAAM,UAAA,IAAc,EAAA;AAAA,IAC1C,CAAC,CAAA,CAAE,MAAA;AAEH,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK;AACrC,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAc,KAAA,GAAQ,CAAA,CAAE,aAAA,GAAiB,GAAA;AAC/C,MAAA,OAAO,UAAA,GAAa,EAAA;AAAA,IACtB,CAAC,CAAA,CAAE,MAAA;AAEH,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,UAAA,EAAW;AAAA,EACxC,CAAA,EAAG,CAAC,OAAA,EAAS,aAAa,CAAC,CAAA;AAE3B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBACER,GAAAA,CAACU,KAAAA,EAAA,EAAM,QAAA,EAAS,QAAO,QAAA,EAAA,oEAAA,EAEvB,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACER,IAAAA,CAACG,GAAAA,EAAA,EAEC,QAAA,EAAA;AAAA,oBAAAH,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,EAAA,EAAI,GAAE,EACf,QAAA,EAAA;AAAA,sBAAAL,IAACI,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,YAAA,EAAY,MAAC,QAAA,EAAA,iBAAA,EAEtC,CAAA;AAAA,sBAGAF,IAAAA,CAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,QAAA,EAAU,QAAO,EAC1D,QAAA,EAAA;AAAA,wBAAAH,KAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,gBAAA,EAChC,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ,CAAA;AAAA,UAAS;AAAA,SAAA,EAClC,CAAA;AAAA,wBACAE,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,cAAA,EAChC,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ,CAAA;AAAA,UAAS;AAAA,SAAA,EAClC,CAAA;AAAA,wBACAE,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,YAAA,EAChC,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,UAAA,EAAW,CAAA;AAAA,UAAS;AAAA,SAAA,EACrC;AAAA,OAAA,EACF,CAAA;AAAA,sBAGAE,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,MAAA,EAAO,EACnD,QAAA,EAAA;AAAA,wBAAAH,IAAAA,CAAC,eAAY,IAAA,EAAK,OAAA,EAAQ,IAAI,EAAE,QAAA,EAAU,KAAI,EAC5C,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,cAAW,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAClBE,IAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,YAAA;AAAA,cACP,KAAA,EAAM,QAAA;AAAA,cACN,UAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAoB,CAAA;AAAA,cAE9D,QAAA,EAAA;AAAA,gCAAAF,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,gCACjCA,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,YAAW,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,gCACnCA,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,WAAU,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,gCACjCA,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,eAAc,QAAA,EAAA,aAAA,EAAW;AAAA;AAAA;AAAA;AAC3C,SAAA,EACF,CAAA;AAAA,QAEC,oBAAA,IAAwB,UAAA,CAAW,MAAA,GAAS,CAAA,oBAC3CE,IAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAK,OAAA,EAAQ,EAAA,EAAI,EAAE,QAAA,EAAU,KAAI,EAC5C,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,cAAW,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,0BACpBE,IAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,cAAA;AAAA,cACP,KAAA,EAAM,UAAA;AAAA,cACN,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAE3C,QAAA,EAAA;AAAA,gCAAAF,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,gBACnC,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,qBACfA,GAAAA,CAAC,QAAA,EAAA,EAAmB,KAAA,EAAO,GAAA,EACxB,QAAA,EAAA,GAAA,EAAA,EADY,GAEf,CACD;AAAA;AAAA;AAAA;AACH,SAAA,EACF;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,eAAA,CAAgB,WAAW,CAAA,mBAC1BA,IAACU,KAAAA,EAAA,EAAM,QAAA,EAAS,MAAA,EAAO,QAAA,EAAA,wCAAA,EAEvB,CAAA,mBAEAV,GAAAA,CAACiB,IAAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACtB,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,KAAW;AAC/B,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,IAAK,CAAA;AAC9C,MAAA,MAAM,eAAA,GAAkB,uBAAA,EAAyB,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAE9D,MAAA,uBACEjB,GAAAA,CAACiB,IAAAA,EAAA,EAAqB,IAAA,EAAM,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,IAC/C,QAAA,kBAAAjB,GAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,YAAA,EAAc,KAAA;AAAA,UACd,cAAA;AAAA,UACA,SAAA,EAAW,UAAA;AAAA,UACX;AAAA;AAAA,OACF,EAAA,EAPS,OAAO,EAQlB,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACzDA,IAAM,wBAAA,GAA2B,CAAC,KAAA,KAA0B;AAC1D,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACjB,CAAA;AAKA,SAAS,eAAA,CAAgB,MAAmB,KAAA,EAAY;AACtD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,cAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,kBAAMA,GAAAA,CAACkB,OAAA,EAAA,EAAY,CAAA;AAAA,QACnB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAA;AAAA,QAC3B,SAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,GAAG;AAAA,OAC9C;AAAA,IACF,KAAK,eAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,kBAAMlB,GAAAA,CAACmB,YAAA,EAAA,EAAiB,CAAA;AAAA,QACxB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAA;AAAA,QAC1B,SAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,GAAG;AAAA,OAC7C;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,kBAAMnB,GAAAA,CAACoB,WAAA,EAAA,EAAgB,CAAA;AAAA,QACvB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG;AAAA,OAChD;AAAA,IACF,KAAK,aAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,kBAAMpB,GAAAA,CAACqB,UAAA,EAAA,EAAe,CAAA;AAAA,QACtB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG;AAAA,OAChD;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,IAAA,kBAAMrB,GAAAA,CAACoB,WAAA,EAAA,EAAgB,CAAA;AAAA,QACvB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,QAC1B,SAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,GAAG;AAAA,OAClD;AAAA;AAEN;AAsBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA,GAAsB,CAAA;AAAA,EACtB,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA,GAAoB;AACtB,CAAA,EAA4B;AAC1B,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIZ,SAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,kBAAkB,OAAA,GAAU,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,GAAG,mBAAmB,CAAA;AAClF,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,GAAS,mBAAA;AAElC,EAAA,MAAM,eAAe,cAAA,CAAe,KAAA,KAAU,SAC1C,EAAE,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,IAAA,kBAAMR,GAAAA,CAACkB,OAAA,EAAA,EAAY,GAAG,GACzD,cAAA,CAAe,UAAU,OAAA,GACzB,EAAE,KAAA,EAAO,KAAA,CAAM,QAAQ,OAAA,CAAQ,IAAA,EAAM,sBAAMlB,GAAAA,CAACoB,eAAgB,CAAA,EAAG,GAC/D,EAAE,KAAA,EAAO,KAAA,CAAM,QAAQ,IAAA,CAAK,IAAA,EAAM,sBAAMpB,GAAAA,CAACoB,eAAgB,CAAA,EAAG;AAEhE,EAAA,uBACEpB,IAACC,IAAAA,EAAA,EAAK,eAAY,sBAAA,EAChB,QAAA,kBAAAC,IAAAA,CAACC,WAAAA,EAAA,EAEC,QAAA,EAAA;AAAA,oBAAAH,IAACI,UAAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,YAAA,EAAY,MAAC,QAAA,EAAA,iBAAA,EAEtC,CAAA;AAAA,oBAGAF,IAAAA;AAAA,MAACG,GAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,GAAA,EAAK,CAAA;AAAA,UACL,CAAA,EAAG,CAAA;AAAA,UACH,EAAA,EAAI,CAAA;AAAA,UACJ,OAAA,EAAS,KAAA,CAAM,YAAA,CAAa,KAAA,EAAO,GAAG,CAAA;AAAA,UACtC,YAAA,EAAc;AAAA,SAChB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAACK,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAO,YAAA,CAAa,KAAA,EAAM,EAClC,QAAA,EAAA,YAAA,CAAa,IAAA,EAChB,CAAA;AAAA,0BACAH,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAChB,QAAA,EAAA;AAAA,YAAA,cAAA,CAAe,cAAc,CAAA,oBAC5BH,KAACE,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,8BACdJ,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,cAAS,KAAA;AAAA,cAAI,GAAA;AAAA,8BAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,iBAAA,CAAkB,cAAA,CAAe,WAAW,CAAA,EAAE,CAAA;AAAA,cAAU,GAAA;AAAA,cAAI,8BAAA;AAAA,cACxC,GAAA;AAAA,8BAC7BE,KAAC,QAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,gBAAA,cAAA,CAAe,MAAA;AAAA,gBAAO;AAAA,eAAA,EAAO,CAAA;AAAA,cAAS;AAAA,aAAA,EACjD,CAAA;AAAA,YAED,cAAA,CAAe,cAAc,CAAA,oBAC5BA,KAACE,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,QAAA,EAAA;AAAA,cAAA,WAAA;AAAA,8BACjBJ,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,cAAS,KAAA;AAAA,cAAI,GAAA;AAAA,8BACvCA,IAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,iBAAA,CAAkB,KAAK,GAAA,CAAI,cAAA,CAAe,WAAW,CAAC,CAAA,EAAE,CAAA;AAAA,cAAU,GAAA;AAAA,cAAI,8BAAA;AAAA,cAClD,GAAA;AAAA,8BAC7BE,KAAC,QAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,gBAAA,cAAA,CAAe,MAAA;AAAA,gBAAO;AAAA,eAAA,EAAO,CAAA;AAAA,cAAS;AAAA,aAAA,EACjD,CAAA;AAAA,YAED,cAAA,CAAe,gBAAgB,CAAA,oBAC9BA,KAACE,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,QAAA,EAAA;AAAA,cAAA,UAAA;AAAA,8BAClBJ,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,cAAS,iCAAA;AAAA,cAAgC,GAAA;AAAA,8BACjEE,KAAC,QAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,gBAAA,cAAA,CAAe,MAAA;AAAA,gBAAO;AAAA,eAAA,EAAO,CAAA;AAAA,cAAS;AAAA,aAAA,EACjD;AAAA,WAAA,EAEJ;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAF,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAI,EAAE,EAAA,EAAI,GAAE,EAAG,CAAA;AAAA,IAGvB,QAAA,CAAS,WAAW,CAAA,mBACnBA,IAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,IAAI,EAAE,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,CAAA,EAAE,EAAG,gEAEvF,CAAA,mBAEAF,IAAAA,CAAAoB,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,OAAA,KAAY;AAChC,QAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AACjD,QAAA,uBACEpB,IAAAA;AAAA,UAACG,GAAAA;AAAA,UAAA;AAAA,YAEC,aAAA,EAAa,CAAA,eAAA,EAAkB,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,YACzC,EAAA,EAAI;AAAA,cACF,CAAA,EAAG,CAAA;AAAA,cACH,EAAA,EAAI,CAAA;AAAA,cACJ,SAAS,KAAA,CAAM,OAAA;AAAA,cACf,YAAA,EAAc,CAAA;AAAA,cACd,UAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,KAAK,CAAA;AAAA,aACtC;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAH,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,YAAA,EAAc,GAAA,EAAK,GAAA,EAAI,EAC7D,QAAA,EAAA;AAAA,gCAAAL,GAAAA,CAACK,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,EAAA,EAAI,GAAA,EAAI,EACpC,QAAA,EAAA,KAAA,CAAM,IAAA,EACT,CAAA;AAAA,gCACAH,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EACjB,QAAA,EAAA;AAAA,kCAAAL,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,aAAY,YAAA,EAAY,IAAA,EACzC,kBAAQ,UAAA,EACX,CAAA;AAAA,kCACAJ,GAAAA,CAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAC5D,kBAAQ,cAAA,EACX,CAAA;AAAA,kCACAF,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,MAAA,EAAO,EACnD,QAAA,EAAA;AAAA,oCAAAL,GAAAA;AAAA,sBAACM,IAAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,MAAA,CAAA;AAAA,wBAC7B,IAAA,EAAK,OAAA;AAAA,wBACL,OAAA,EAAQ;AAAA;AAAA,qBACV;AAAA,oCACAN,GAAAA;AAAA,sBAACM,IAAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO,CAAA,EAAG,OAAA,CAAQ,cAAc,CAAA,OAAA,CAAA;AAAA,wBAChC,IAAA,EAAK,OAAA;AAAA,wBACL,OAAA,EAAQ;AAAA;AAAA,qBACV;AAAA,oCACAN,GAAAA;AAAA,sBAACM,IAAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO,QAAQ,iBAAA,CAAkB,IAAA,CAAK,IAAI,OAAA,CAAQ,aAAa,CAAC,CAAC,CAAA,CAAA;AAAA,wBACjE,IAAA,EAAK,OAAA;AAAA,wBACL,OAAA,EAAQ;AAAA;AAAA;AACV,mBAAA,EACF;AAAA,iBAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,8BACAJ,IAAAA,CAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,cAAA,EAAgB,YAAW,EACnE,QAAA,EAAA;AAAA,gBAAA,gBAAA,oBACCL,GAAAA;AAAA,kBAACW,MAAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,OAAA,EAAS,MAAM,gBAAA,CAAiB,OAAO,CAAA;AAAA,oBACxC,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gBAED,eAAA,IAAmB,OAAA,CAAQ,IAAA,KAAS,aAAA,oBACnCX,GAAAA;AAAA,kBAACW,MAAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,OAAA,EAAQ,WAAA;AAAA,oBACR,OAAA,EAAS,MAAM,eAAA,CAAgB,OAAO,CAAA;AAAA,oBACvC,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gBAED,eAAA,IAAmB,OAAA,CAAQ,IAAA,KAAS,aAAA,oBACnCX,GAAAA;AAAA,kBAACW,MAAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,OAAA;AAAA,oBACL,OAAA,EAAQ,WAAA;AAAA,oBACR,OAAA,EAAS,MAAM,eAAA,CAAgB,OAAO,CAAA;AAAA,oBACvC,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EAEJ;AAAA;AAAA,WAAA;AAAA,UAnEK,OAAA,CAAQ;AAAA,SAoEf;AAAA,MAEJ,CAAC,CAAA;AAAA,MAEA,OAAA,oBACCX,GAAAA,CAACK,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,CAAA,EAAE,EACpC,QAAA,kBAAAL,GAAAA;AAAA,QAACW,MAAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,yBACEX,GAAAA;AAAA,YAACuB,UAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI;AAAA,gBACF,SAAA,EAAW,UAAU,gBAAA,GAAmB,WAAA;AAAA,gBACxC,UAAA,EAAY;AAAA;AACd;AAAA,WACF;AAAA,UAEF,OAAA,EAAS,MAAM,UAAA,CAAW,CAAC,OAAO,CAAA;AAAA,UAEjC,QAAA,EAAA,OAAA,GAAU,WAAA,GAAc,CAAA,KAAA,EAAQ,QAAA,CAAS,SAAS,mBAAmB,CAAA,KAAA;AAAA;AAAA,OACxE,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;ACrUA,IAAMC,yBAAAA,GAA2B,CAAC,KAAA,KAA0B;AAC1D,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACjB,CAAA;AAoBO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,iBAAA,GAAoBA;AACtB,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIhB,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAGtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAA;AACtD,MAAA,SAAA,CAAU,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA;AACpC,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAkB;AAC5C,IAAA,SAAA,CAAU,KAAK,CAAA;AAGf,IAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,EAAG;AACnB,MAAA,QAAA,CAAS,6BAA6B,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,YAAY,CAAA,EAAG;AACxB,MAAA,QAAA,CAAS,kCAAkC,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,WAAW,GAAA,EAAS;AAC7B,MAAA,QAAA,CAAS,qBAAqB,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI,CAAC,OAAA,IAAW,KAAA,IAAS,CAAC,MAAA,EAAQ;AAElC,IAAA,MAAM,QAAA,GAAW,WAAW,MAAM,CAAA;AAClC,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,QAAA,IAAY,CAAA,EAAG;AAEtC,IAAA,MAAM,MAAA,CAAO,SAAS,QAAQ,CAAA;AAC9B,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,SAAA,CAAU,EAAE,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAA,GAAiB,QAAQ,IAAA,KAAS,cAAA;AACxC,EAAA,MAAM,WAAA,GAAc,iBAAiB,oBAAA,GAAuB,oBAAA;AAE5D,EAAA,uBACEN,IAAAA;AAAA,IAACW,MAAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,YAAA;AAAA,MACT,QAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAS,IAAA;AAAA,MACT,aAAA,EAAY,uBAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAb,GAAAA,CAACc,WAAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,UAAA,EACX,CAAA;AAAA,wBAEAZ,IAAAA,CAACa,aAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,UAAA,cAAA,oBACCb,KAACuB,iBAAAA,EAAA,EAAkB,IAAI,EAAE,EAAA,EAAI,GAAE,EAAG,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,4BACzBzB,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,YAAS,cAAA;AAAA,YAAa,GAAA;AAAA,4BAC7CA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,OAAA,CAAQ,WAAA,EAAY,CAAA;AAAA,YAAS,oBAAA;AAAA,YAAmB,GAAA;AAAA,4BACzDA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,OAAA,CAAQ,cAAA,EAAe,CAAA;AAAA,YAAS,0BAAA;AAAA,YAAyB,GAAA;AAAA,4BAClEA,IAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,iBAAA,CAAkB,KAAK,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAC,CAAA,EAAE,CAAA;AAAA,YAAS;AAAA,WAAA,EACvE,CAAA;AAAA,UAGD,CAAC,cAAA,oBACAE,IAAAA,CAACuB,iBAAAA,EAAA,EAAkB,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA;AAAA,YAAA,cAAA;AAAA,4BACpBzB,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,YAAS,cAAA;AAAA,YAAa,GAAA;AAAA,4BAC/CA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,OAAA,CAAQ,WAAA,EAAY,CAAA;AAAA,YAAS,oBAAA;AAAA,YAAmB,GAAA;AAAA,4BACzDA,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,OAAA,CAAQ,cAAA,EAAe,CAAA;AAAA,YAAS,0BAAA;AAAA,YAAyB,GAAA;AAAA,4BAClEA,IAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,iBAAA,CAAkB,KAAK,GAAA,CAAI,OAAA,CAAQ,aAAa,CAAC,CAAA,EAAE,CAAA;AAAA,YAAS;AAAA,WAAA,EACvE,CAAA;AAAA,0BAIFA,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAS,IAAA;AAAA,cACT,SAAA,EAAS,IAAA;AAAA,cACT,QAAA,EAAQ,IAAA;AAAA,cACR,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,WAAA;AAAA,cACP,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAClD,KAAA,EAAO,CAAC,CAAC,KAAA;AAAA,cACT,YAAY,KAAA,IAAS,iDAAA;AAAA,cACrB,QAAA,EAAU,MAAA;AAAA,cACV,UAAA,EAAY;AAAA,gBACV,GAAA,EAAK,CAAA;AAAA,gBACL,IAAA,EAAM,IAAA;AAAA,gBACN,YAAA,EAAc;AAAA,eAChB;AAAA,cACA,eAAA,EAAiB;AAAA,gBACf,MAAA,EAAQ;AAAA;AACV;AAAA;AACF,SAAA,EACF,CAAA;AAAA,wBAEAP,IAAAA,CAACc,aAAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAhB,IAACW,MAAAA,EAAA,EAAO,SAAS,YAAA,EAAc,QAAA,EAAU,QAAQ,QAAA,EAAA,QAAA,EAEjD,CAAA;AAAA,0BACAX,GAAAA;AAAA,YAACW,MAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,UAAA;AAAA,cACT,OAAA,EAAQ,WAAA;AAAA,cACR,QAAA,EAAU,MAAA,IAAU,CAAC,CAAC,SAAS,CAAC,MAAA;AAAA,cAE/B,mBAAS,WAAA,GAAc;AAAA;AAAA;AAC1B,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACtJA,SAAS,cAAA,CAAe,OAAoB,KAAA,EAAY;AACtD,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAASe,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,QAC9C,IAAA,kBAAM1B,GAAAA,CAACmB,YAAAA,EAAA,EAAiB,CAAA;AAAA,QACxB,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAA;AAAA,QAC1B,SAASO,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,QAC3C,IAAA,kBAAM1B,GAAAA,CAACoB,WAAAA,EAAA,EAAgB,CAAA;AAAA,QACvB,KAAA,EAAO,UAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAASM,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,QAC9C,IAAA,kBAAM1B,GAAAA,CAACkB,OAAAA,EAAA,EAAY,CAAA;AAAA,QACnB,KAAA,EAAO,aAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAA;AAAA,QAC3B,SAASQ,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,GAAG,CAAA;AAAA,QAC5C,IAAA,kBAAM1B,GAAAA,CAAC2B,OAAA,EAAA,EAAU,CAAA;AAAA,QACjB,KAAA,EAAO,UAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA;AAEN;AAKA,SAAS,cAAc,IAAA,EAAoC;AACzD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,EAAA;AAAA,QACV,QAAA,EAAU,SAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,EAAA;AAAA,QACV,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,EAAA;AAAA,QACV,QAAA,EAAU,MAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AAAA;AAEN;AA8BO,SAAS,oBAAA,CAAqB;AAAA,EACnC,KAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,MAAA;AAAA,EACV,IAAA,GAAO,QAAA;AAAA,EACP,cAAA,GAAiB,IAAA;AAAA,EACjB,SAAA,GAAY,IAAA;AAAA,EACZ;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,QAAQC,QAAAA,EAAS;AACvB,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AAErC,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAA,CAAO,KAAA;AACpC,EAAA,MAAM,WAAA,GAAc,iBAChB,CAAA,EAAG,KAAK,KAAK,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA,GAClC,KAAA;AAGJ,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,uBACE5B,GAAAA;AAAA,MAACM,IAAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,wBAAA;AAAA,QACZ,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,KAAA,EAAO,WAAA;AAAA,QACP,OAAO,MAAA,CAAO,SAAA;AAAA,QACd,IAAA,EAAM,IAAA,KAAS,OAAA,GAAU,QAAA,GAAW,OAAA;AAAA,QACpC,EAAA,EAAI;AAAA,UACF,UAAU,UAAA,CAAW,QAAA;AAAA,UACrB,UAAA,EAAY;AAAA;AACd;AAAA,KACF;AAAA,EAEJ;AAGA,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,uBACEJ,IAAAA;AAAA,MAACG,GAAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,wBAAA;AAAA,QACZ,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,aAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,KAAK,UAAA,CAAW,OAAA;AAAA,UAChB,OAAO,MAAA,CAAO;AAAA,SAChB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAL,GAAAA;AAAA,YAACK,GAAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI;AAAA,gBACF,OAAA,EAAS,MAAA;AAAA,gBACT,UAAA,EAAY,QAAA;AAAA,gBACZ,UAAU,UAAA,CAAW;AAAA,eACvB;AAAA,cAEC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,WACV;AAAA,UACC,6BACCL,GAAAA;AAAA,YAACI,UAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,MAAA;AAAA,cACV,EAAA,EAAI;AAAA,gBACF,UAAU,UAAA,CAAW,QAAA;AAAA,gBACrB,UAAA,EAAY;AAAA,eACd;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KAEJ;AAAA,EAEJ;AAGA,EAAA,uBACEF,IAAAA;AAAA,IAACG,GAAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,wBAAA;AAAA,MACZ,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,WAAW,OAAA,GAAU,CAAA;AAAA,QAC1B,CAAA,EAAG,WAAW,OAAA,GAAU,CAAA;AAAA,QACxB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,YAAA,EAAc,CAAA;AAAA,QACd,UAAA,EAAY,CAAA,UAAA,EAAa,MAAA,CAAO,KAAK,CAAA;AAAA,OACvC;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAL,GAAAA;AAAA,UAACK,GAAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,OAAA,EAAS,MAAA;AAAA,cACT,UAAA,EAAY,QAAA;AAAA,cACZ,QAAA,EAAU,WAAW,QAAA,GAAW;AAAA,aAClC;AAAA,YAEC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,SACV;AAAA,wBACAH,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAChB,QAAA,EAAA;AAAA,UAAA,SAAA,oBACCL,GAAAA;AAAA,YAACI,UAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,WAAA;AAAA,cACR,EAAA,EAAI;AAAA,gBACF,OAAO,MAAA,CAAO,KAAA;AAAA,gBACd,UAAA,EAAY,MAAA;AAAA,gBACZ,UAAU,UAAA,CAAW;AAAA,eACvB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UAED,kCACCF,IAAAA;AAAA,YAACE,UAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cACR,KAAA,EAAM,gBAAA;AAAA,cACN,EAAA,EAAI,EAAE,QAAA,EAAU,UAAA,CAAW,QAAA,EAAS;AAAA,cAEnC,QAAA,EAAA;AAAA,gBAAA,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA;AACzB,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;ACxJA,IAAMoB,yBAAAA,GAA2B,CAAC,KAAA,KAA0B;AAC1D,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACjB,CAAA;AAKA,SAAS,cAAA,CAAe,OAA+C,KAAA,EAAY;AACjF,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAASE,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,QAC9C,KAAA,EAAO;AAAA,OACT;AAAA,IACF,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QAC7B,SAASA,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,QAC9C,KAAA,EAAO;AAAA,OACT;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAA;AAAA,QAC1B,SAASA,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,QAC3C,KAAA,EAAO;AAAA,OACT;AAAA;AAEN;AAiBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,cAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA,GAAoBF,yBAAAA;AAAA,EACpB,UAAA,GAAa;AACf,CAAA,EAA0B;AACxB,EAAA,MAAM,QAAQI,QAAAA,EAAS;AAEvB,EAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AACpD,EAAA,MAAM,eAAA,GAAkB,SAAS,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,MAAA;AAE9D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE5B,GAAAA,CAACC,IAAAA,EAAA,EAAK,aAAA,EAAY,oBAAA,EAChB,QAAA,kBAAAD,GAAAA,CAACG,WAAAA,EAAA,EACC,QAAA,kBAAAH,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,yBAAA,EAEvF,CAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,uBACEJ,IAACC,IAAAA,EAAA,EAAK,eAAY,oBAAA,EAChB,QAAA,kBAAAD,IAACG,WAAAA,EAAA,EACC,0BAAAD,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,WAAW,QAAA,EAAU,EAAA,EAAI,GAAE,EACpC,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAAC6B,IAAA,EAAA,EAAS,EAAA,EAAI,EAAE,QAAA,EAAU,IAAI,KAAA,EAAO,eAAA,EAAiB,EAAA,EAAI,CAAA,EAAE,EAAG,CAAA;AAAA,sBAC/D7B,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,8DAAA,EAEnD;AAAA,KAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEJ,IAACC,IAAAA,EAAA,EAAK,eAAY,oBAAA,EAChB,QAAA,kBAAAC,IAAAA,CAACC,WAAAA,EAAA,EAEC,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,GAAE,EAC9D,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAAC8B,UAAA,EAAA,EAAe,KAAA,EAAM,SAAA,EAAU,CAAA;AAAA,sBAChC9B,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,MAAK,QAAA,EAAA,uBAAA,EAAqB,CAAA;AAAA,MAC7C,eAAA,GAAkB,qBACjBJ,GAAAA;AAAA,QAACM,IAAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,GAAG,eAAe,CAAA,WAAA,CAAA;AAAA,UACzB,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAM,SAAA;AAAA,UACN,EAAA,EAAI,EAAE,EAAA,EAAI,MAAA;AAAO;AAAA;AACnB,KAAA,EAEJ,CAAA;AAAA,oBAEAN,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,IAAK,QAAA,EAAA,yEAAA,EAElE,CAAA;AAAA,oBAEAJ,IAAC+B,OAAAA,EAAA,EAAQ,IAAI,EAAE,EAAA,EAAI,GAAE,EAAG,CAAA;AAAA,IAGvB,eAAA,CAAgB,GAAA,CAAI,CAAC,OAAA,KAAY;AAChC,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA;AAEvD,MAAA,uBACE7B,IAAAA;AAAA,QAACG,GAAAA;AAAA,QAAA;AAAA,UAEC,aAAA,EAAa,CAAA,YAAA,EAAe,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,UACtC,EAAA,EAAI;AAAA,YACF,CAAA,EAAG,CAAA;AAAA,YACH,EAAA,EAAI,CAAA;AAAA,YACJ,OAAA,EAAS,OAAA,CAAQ,UAAA,GACbqB,KAAAA,CAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,IAAI,IACtCA,KAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,YAC1C,YAAA,EAAc,CAAA;AAAA,YACd,UAAA,EAAY,OAAA,CAAQ,UAAA,GAChB,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,CAAA,GACvC,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,WAC7C;AAAA,UAGA,QAAA,EAAA;AAAA,4BAAAxB,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,GAAE,EAC9D,QAAA,EAAA;AAAA,8BAAAL,GAAAA,CAAC8B,UAAA,EAAA,EAAe,QAAA,EAAS,OAAA,EAAQ,OAAM,QAAA,EAAS,CAAA;AAAA,8BAChD9B,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,EAAA,EAAI,EAAE,UAAA,EAAY,MAAA,EAAO,EACtD,QAAA,EAAA,OAAA,CAAQ,OAAA,EACX,CAAA;AAAA,cACC,OAAA,CAAQ,UAAA,oBACPJ,GAAAA,CAACM,IAAAA,EAAA,EAAK,KAAA,EAAM,UAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAM,SAAA,EAAU,SAAQ,UAAA,EAAW,CAAA;AAAA,cAExE,CAAC,OAAA,CAAQ,UAAA,oBACRN,IAACM,IAAAA,EAAA,EAAK,KAAA,EAAM,WAAA,EAAY,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAM,SAAA,EAAU,SAAQ,UAAA,EAAW;AAAA,aAAA,EAE5E,CAAA;AAAA,4BAGAJ,KAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,EAAA,EAAI,GAAE,EACf,QAAA,EAAA;AAAA,8BAAAL,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAC9D,kBAAQ,cAAA,EACX,CAAA;AAAA,8BACAF,IAAAA,CAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,GAAE,EAC9D,QAAA,EAAA;AAAA,gCAAAL,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,OAAM,SAAA,EAC5B,QAAA,EAAA,iBAAA,CAAkB,OAAA,CAAQ,mBAAmB,CAAA,EAChD,CAAA;AAAA,gCACAJ,IAACI,UAAAA,EAAA,EAAW,SAAQ,SAAA,EAAU,KAAA,EAAM,kBAAiB,QAAA,EAAA,WAAA,EAErD;AAAA,eAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BAGAF,IAAAA,CAACG,GAAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,EAAA,EAAI,GAAE,EAC1D,QAAA,EAAA;AAAA,8BAAAL,GAAAA;AAAA,gBAACM,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,CAAA,EAAG,OAAA,CAAQ,gBAAgB,CAAA,aAAA,CAAA;AAAA,kBAClC,IAAA,EAAK,OAAA;AAAA,kBACL,OAAA,EAAQ;AAAA;AAAA,eACV;AAAA,8BACAN,GAAAA;AAAA,gBAACM,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,CAAA,EAAG,OAAA,CAAQ,cAAc,CAAA,OAAA,CAAA;AAAA,kBAChC,IAAA,EAAK,OAAA;AAAA,kBACL,OAAA,EAAQ;AAAA;AAAA,eACV;AAAA,8BACAN,GAAAA;AAAA,gBAACM,IAAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,kBAAMN,GAAAA,CAACqB,UAAAA,EAAA,EAAe,CAAA;AAAA,kBACtB,KAAA,EAAO,CAAA,EAAG,WAAA,CAAY,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,eAAe,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,kBAC3E,IAAA,EAAK,OAAA;AAAA,kBACL,EAAA,EAAI;AAAA,oBACF,SAAS,WAAA,CAAY,OAAA;AAAA,oBACrB,OAAO,WAAA,CAAY,KAAA;AAAA,oBACnB,aAAa,WAAA,CAAY;AAAA,mBAC3B;AAAA,kBACA,OAAA,EAAQ;AAAA;AAAA;AACV,aAAA,EACF,CAAA;AAAA,4BAGAnB,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,cAAA,EAAgB,UAAA,EAAW,EAC5D,QAAA,EAAA;AAAA,cAAA,SAAA,oBACCL,GAAAA,CAACW,MAAAA,EAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAS,MAAM,SAAA,CAAU,OAAO,CAAA,EAAG,QAAA,EAAA,SAAA,EAExD,CAAA;AAAA,cAED,aAAA,oBACCX,GAAAA,CAACW,MAAAA,EAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAS,MAAM,aAAA,CAAc,OAAO,CAAA,EAAG,QAAA,EAAA,cAAA,EAE5D,CAAA;AAAA,cAED,CAAC,OAAA,CAAQ,UAAA,IAAc,cAAA,oBACtBT,IAAAA;AAAA,gBAACS,MAAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,OAAA;AAAA,kBACL,OAAA,EAAQ,WAAA;AAAA,kBACR,SAAA,kBAAWX,GAAAA,CAACgC,GAAA,EAAA,EAAQ,CAAA;AAAA,kBACpB,OAAA,EAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAAA,kBACtC,QAAA,EAAA;AAAA,oBAAA,eAAA;AAAA,oBAEE,QAAQ,eAAA,IACP,CAAA,EAAA,EAAK,iBAAA,CAAkB,OAAA,CAAQ,eAAe,CAAC,CAAA,CAAA;AAAA;AAAA;AAAA;AACnD,aAAA,EAEJ;AAAA;AAAA,SAAA;AAAA,QA5FK,OAAA,CAAQ;AAAA,OA6Ff;AAAA,IAEJ,CAAC,CAAA;AAAA,IAGA,QAAA,CAAS,MAAA,GAAS,UAAA,oBACjB9B,IAAAA;AAAA,MAACE,UAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAM,gBAAA;AAAA,QACN,IAAI,EAAE,SAAA,EAAW,UAAU,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA,EAAE;AAAA,QACpD,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,UACU,UAAA;AAAA,UAAW,MAAA;AAAA,UAAK,QAAA,CAAS,MAAA;AAAA,UAAO;AAAA;AAAA;AAAA;AAC3C,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;ACpRA,IAAMoB,yBAAAA,GAA2B,CAAC,KAAA,KAA0B;AAC1D,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,IACpC,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AAC3B,CAAA;AAKA,SAAS,kBAAA,CACP,MACA,iBAAA,EAMA;AACA,EAAA,MAAM,EAAE,YAAA,EAAc,WAAA,EAAa,gBAAgB,YAAA,EAAc,cAAA,EAAgB,qBAAoB,GAAI,IAAA;AAGzG,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,OAAA,EAAS,0FAAA;AAAA,MACT,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,KAAgB,YAAA,IAAgB,cAAA,GAAiB,CAAA,EAAG;AACtD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,wBAAA;AAAA,MACP,OAAA,EAAS,CAAA,oBAAA,EAAuB,YAAY,CAAA,OAAA,EAAU,YAAA,GAAe,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,IAAA,EAAO,iBAAA,CAAkB,cAAc,CAAC,CAAA,0DAAA,CAAA;AAAA,MACzH,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,OAAO,CAAA,EAAG,WAAW,UAAU,WAAA,GAAc,CAAA,GAAI,MAAM,EAAE,CAAA,WAAA,CAAA;AAAA,MACzD,OAAA,EAAS,yBAAyB,WAAW,CAAA,IAAA,EAAO,YAAY,CAAA,YAAA,EAAe,iBAAA,CAAkB,cAAc,CAAC,CAAA,yCAAA,CAAA;AAAA,MAChH,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,mBAAmB,YAAA,EAAc;AACnC,IAAA,MAAM,aAAA,GAAgB,mBAAA,IAAuB,mBAAA,GAAsB,CAAA,GAC/D,CAAA,UAAA,EAAa,mBAAmB,CAAA,eAAA,EAAkB,mBAAA,GAAsB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,iBAAA,CAAA,GACpF,EAAA;AACJ,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,sBAAA;AAAA,MACP,OAAA,EAAS,kBAAkB,YAAY,CAAA,OAAA,EAAU,eAAe,CAAA,GAAI,OAAA,GAAU,KAAK,CAAA,UAAA,EAAa,aAAa,CAAA,CAAA;AAAA,MAC7G,kBAAA,EAAoB,mBAAA,IAAuB,mBAAA,GAAsB,CAAA,GAAI,aAAA,GAAgB;AAAA,KACvF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,GAAe,CAAA,IAAK,WAAA,KAAgB,CAAA,EAAG;AACzC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,uBAAA;AAAA,MACP,OAAA,EAAS,CAAA,uBAAA,EAA0B,iBAAA,CAAkB,cAAc,CAAC,CAAA,cAAA,EAAiB,YAAY,CAAA,OAAA,EAAU,YAAA,GAAe,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,yBAAA,CAAA;AAAA,MACtI,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,gBAAA;AAAA,IACP,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,WAAA,EAAc,YAAY,CAAA,yDAAA,CAAA;AAAA,IACpD,kBAAA,EAAoB;AAAA,GACtB;AACF;AAuBO,SAAS,qBAAA,CAAsB;AAAA,EACpC,IAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA,GAAoBA,yBAAAA;AAAA,EACpB,UAAA,GAAa;AACf,CAAA,EAA+B;AAC7B,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAA,EAAM,iBAAiB,CAAA;AAE3D,EAAA,MAAM,WAAA,GAAqF;AAAA,IACzF,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,KAAA,EAAO,OAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,uBACEtB,IAAAA;AAAA,IAACQ,KAAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,yBAAA;AAAA,MACZ,QAAA,EAAU,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA;AAAA,MACnC,EAAA,EAAI;AAAA,QACF,qBAAA,EAAuB;AAAA,UACrB,KAAA,EAAO;AAAA;AACT,OACF;AAAA,MACA,MAAA,EACE,CAAC,UAAA,IAAc,QAAA,mBACbV,GAAAA;AAAA,QAACW,MAAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,EAAA,EAAI,EAAE,UAAA,EAAY,QAAA,EAAS;AAAA,UAE1B,yBAAe,QAAA,CAAS;AAAA;AAAA,OAC3B,GACE,MAAA;AAAA,MAGN,QAAA,EAAA;AAAA,wBAAAX,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,EAAA,EAAI,EAAE,UAAA,EAAY,MAAA,EAAQ,EAAA,EAAI,GAAA,EAAI,EAC/D,mBAAS,KAAA,EACZ,CAAA;AAAA,wBACAJ,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAS,mBAAS,OAAA,EAAQ;AAAA;AAAA;AAAA,GAChD;AAEJ;ACzIA,IAAM,KAAA,GAAQ,CAAC,mBAAA,EAAqB,aAAA,EAAe,QAAQ,CAAA;AAK3D,SAAS,iBAAA,CAAkB,MAAc,YAAA,EAAqC;AAC5E,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,IAAA,OAAO,yBAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,EAAG;AAC1B,IAAA,OAAO,2CAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,WAAW,YAAY,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA,IAAU,CAAA,EAAG;AAChC,IAAA,OAAO,yCAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAS,GAAA,EAAS;AACpB,IAAA,OAAO,wCAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,aAAa,QAAA,EAAmC;AACvD,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,8BAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,SAAS,EAAA,EAAI;AACxB,IAAA,OAAO,yBAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAmBO,SAAS,aAAA,CAAc;AAAA,EAC5B,WAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAAa,KAAA;AAAA,EACb;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAII,SAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAIA,QAAAA,CAAS,WAAA,EAAa,QAAQ,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA;AAAA,IACtC,WAAA,EAAa,YAAA,EAAc,QAAA,EAAS,IAAK;AAAA,GAC3C;AACA,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIA,SAAmB,WAAA,EAAa,QAAA,IAAY,EAAE,CAAA;AAC9E,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAE1E,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAGvB,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,MAAMyB,MAAAA,GAAQ,iBAAA,CAAkB,IAAA,EAAM,YAAY,CAAA;AAClD,MAAA,IAAIA,MAAAA,EAAO;AACT,QAAA,kBAAA,CAAmBA,MAAK,CAAA;AACxB,QAAA;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,eAAe,CAAA,EAAG;AAC3B,MAAA,MAAMA,MAAAA,GAAQ,aAAa,QAAQ,CAAA;AACnC,MAAA,IAAIA,MAAAA,EAAO;AACT,QAAA,kBAAA,CAAmBA,MAAK,CAAA;AACxB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,CAAC,QAAA,KAAa,QAAA,GAAW,CAAC,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,aAAA,CAAc,CAAC,QAAA,KAAa,QAAA,GAAW,CAAC,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,MAAM,IAAA,GAAuB;AAAA,MAC3B,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,YAAA,EAAc,WAAW,YAAY,CAAA;AAAA,MACrC,QAAA;AAAA,MACA,eAAA,EAAiB;AAAA,KACnB;AAEA,IAAA,MAAM,SAAS,IAAI,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAAiB;AAC1C,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,CAAA;AACH,QAAA,uBACE/B,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC1D,QAAA,EAAA;AAAA,0BAAAL,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,gCAAA,EAEnD,CAAA;AAAA,0BAEAJ,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,aAAA;AAAA,cACN,KAAA,EAAO,IAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AACtB,gBAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACzB,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,QAAA,EAAU,UAAA;AAAA,cACV,OAAO,CAAC,CAAC,eAAA,IAAmB,CAAC,KAAK,IAAA,EAAK;AAAA,cACvC,UAAA,EAAW,0CAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,SAAA,EAAW;AAAA;AACb;AAAA,WACF;AAAA,0BAEAT,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,eAAA;AAAA,cACN,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,YAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9B,gBAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACzB,CAAA;AAAA,cACA,QAAA,EAAQ,IAAA;AAAA,cACR,SAAA,EAAS,IAAA;AAAA,cACT,QAAA,EAAU,UAAA;AAAA,cACV,KAAA,EAAO,CAAC,CAAC,eAAA,IAAmB,CAAC,YAAA;AAAA,cAC7B,UAAA,EAAW,wCAAA;AAAA,cACX,UAAA,EAAY;AAAA,gBACV,cAAA,kBAAgBT,GAAAA,CAACI,UAAAA,EAAA,EAAW,IAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,QAAA,EAAA,GAAA,EAAC;AAAA,eAChD;AAAA,cACA,UAAA,EAAY;AAAA,gBACV,GAAA,EAAK,CAAA;AAAA,gBACL,IAAA,EAAM;AAAA;AACR;AAAA;AACF,SAAA,EACF,CAAA;AAAA,MAGJ,KAAK,CAAA;AACH,QAAA,uBACEF,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC1D,QAAA,EAAA;AAAA,0BAAAL,IAACI,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,mDAAA,EAEnD,CAAA;AAAA,0BAEAJ,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,QAAA,EAAQ,IAAA;AAAA,cACR,OAAA,EAAS,aAAA;AAAA,cACT,KAAA,EAAO,QAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,EAAG,QAAA,KAAa;AACzB,gBAAA,WAAA,CAAY,QAAQ,CAAA;AACpB,gBAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACzB,CAAA;AAAA,cACA,QAAA,EAAU,UAAA;AAAA,cACV,WAAA,EAAa,CAAC,MAAA,qBACZA,GAAAA;AAAA,gBAACS,SAAAA;AAAA,gBAAA;AAAA,kBACE,GAAG,MAAA;AAAA,kBACJ,KAAA,EAAM,MAAA;AAAA,kBACN,WAAA,EAAY,gBAAA;AAAA,kBACZ,QAAA,EAAQ,IAAA;AAAA,kBACR,KAAA,EAAO,CAAC,CAAC,eAAA,IAAmB,SAAS,MAAA,KAAW,CAAA;AAAA,kBAChD,UAAA,EAAW;AAAA;AAAA,eACb;AAAA,cAEF,UAAA,EAAY,CAAC,KAAA,EAAO,WAAA,KAClB,MAAM,GAAA,CAAI,CAAC,QAAQ,KAAA,qBACjB,aAAA;AAAA,gBAACH,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,MAAA;AAAA,kBACN,GAAG,WAAA,CAAY,EAAE,KAAA,EAAO,CAAA;AAAA,kBACzB,GAAA,EAAK;AAAA;AAAA,eAER;AAAA;AAAA,WAEL;AAAA,UAEC,QAAA,CAAS,MAAA,GAAS,CAAA,oBACjBN,IAACK,GAAAA,EAAA,EACC,QAAA,kBAAAH,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,OAAM,gBAAA,EACjC,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,MAAA;AAAA,YAAO,MAAA;AAAA,YAAK,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAA;AAAA,YAAG;AAAA,WAAA,EACvD,CAAA,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,MAGJ,KAAK,CAAA;AACH,QAAA,uBACEF,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC1D,QAAA,EAAA;AAAA,0BAAAH,KAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,gBAAA,EAAiB,QAAA,EAAA;AAAA,YAAA,4BAAA;AAAA,YACtB,WAAW,gBAAA,GAAmB;AAAA,WAAA,EAC3D,CAAA;AAAA,0BAEAF,IAAAA,CAACgC,KAAAA,EAAA,EAAM,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAG,OAAA,EAAS,oBAAA,EAAqB,EAC/C,QAAA,EAAA;AAAA,4BAAAlC,IAACI,UAAAA,EAAA,EAAW,SAAQ,WAAA,EAAY,YAAA,EAAY,MAAC,QAAA,EAAA,aAAA,EAE7C,CAAA;AAAA,4BACAJ,GAAAA,CAACI,UAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,UAAA,EAAY,QAAA,IAClD,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,4BAEAJ,IAACI,UAAAA,EAAA,EAAW,SAAQ,WAAA,EAAY,YAAA,EAAY,MAAC,QAAA,EAAA,eAAA,EAE7C,CAAA;AAAA,4BACAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,KAAA,EAAM,SAAA,EAAU,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cACpD,UAAA,CAAW,YAAY,CAAA,CAAE,cAAA,CAAe,OAAA,EAAS;AAAA,gBACjD,qBAAA,EAAuB,CAAA;AAAA,gBACvB,qBAAA,EAAuB;AAAA,eACxB;AAAA,aAAA,EACH,CAAA;AAAA,4BAEAF,IAAAA,CAACE,UAAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,cAAY,IAAA,EAAC,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,cACpC,QAAA,CAAS,MAAA;AAAA,cAAO;AAAA,aAAA,EACzB,CAAA;AAAA,4BACAJ,GAAAA,CAACK,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAE,EAClD,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,qBACbL,GAAAA,CAACM,IAAAA,EAAA,EAAe,KAAA,EAAO,GAAA,EAAK,IAAA,EAAK,OAAA,EAAA,EAAtB,GAA8B,CAC1C,CAAA,EACH;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,MAGJ;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF,CAAA;AAEA,EAAA,uBACEJ,IAAAA,CAACgC,KAAAA,EAAA,EAAM,aAAA,EAAY,kBAAiB,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAE,EAC7C,QAAA,EAAA;AAAA,oBAAAlC,GAAAA,CAACI,YAAA,EAAW,OAAA,EAAQ,MAAK,YAAA,EAAY,IAAA,EAClC,QAAA,EAAA,QAAA,GAAW,aAAA,GAAgB,eAAA,EAC9B,CAAA;AAAA,oBAEAJ,IAAC,OAAA,EAAA,EAAQ,UAAA,EAAwB,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAC1C,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,qBACVA,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA,EAAA,EADT,KAEX,CACD,CAAA,EACH,CAAA;AAAA,oBAEAE,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EACpB,QAAA,EAAA;AAAA,MAAA,CAAA,eAAA,IAAmB,KAAA,qBACnBL,GAAAA,CAACU,KAAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EACjC,6BAAmB,KAAA,EACtB,CAAA;AAAA,MAGD,kBAAkB,UAAU;AAAA,KAAA,EAC/B,CAAA;AAAA,oBAEAR,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,EAAA,EAAI,CAAA,EAAE,EACjE,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAACK,GAAAA,EAAA,EACE,QAAA,EAAA,QAAA,oBACCL,GAAAA,CAACW,MAAAA,EAAA,EAAO,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,oBAEjD,CAAA,EAEJ,CAAA;AAAA,sBAEAT,IAAAA,CAACG,GAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAE,EACjC,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAACW,QAAA,EAAO,OAAA,EAAS,YAAY,QAAA,EAAU,UAAA,KAAe,CAAA,IAAK,UAAA,EAAY,QAAA,EAAA,MAAA,EAEvE,CAAA;AAAA,QAEC,aAAa,KAAA,CAAM,MAAA,GAAS,CAAA,mBAC3BX,IAACW,MAAAA,EAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,SAAS,UAAA,EAAY,QAAA,EAAU,UAAA,EAAY,QAAA,EAAA,MAAA,EAEvE,oBAEAX,GAAAA;AAAA,UAACW,MAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,OAAA,EAAS,YAAA;AAAA,YACT,QAAA,EAAU,UAAA;AAAA,YAET,QAAA,EAAA,UAAA,GACG,QAAA,GACE,WAAA,GACA,aAAA,GACF,WACA,cAAA,GACA;AAAA;AAAA;AACN,OAAA,EAEJ;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"index.js","sourcesContent":["import { Box, Card, CardContent, List, ListItem, Typography, LinearProgress, Chip } from '@mui/material';\nimport { useBudgetProgress } from '@pfm-platform/budgets-feature';\n\nexport interface BudgetListProps {\n userId: string;\n /** Budget month (1-12) */\n month?: number;\n /** Budget year */\n year?: number;\n /** Custom title for the list */\n title?: string;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Maximum number of budgets to display */\n maxItems?: number;\n}\n\n/**\n * BudgetList component displays budgets with progress bars.\n * Shows budget name, amounts, and visual progress indicator.\n */\nexport function BudgetList({\n userId,\n month,\n year,\n title = 'Budgets',\n currencySymbol = '$',\n maxItems,\n}: BudgetListProps) {\n const budgets = useBudgetProgress({ userId, month, year });\n\n if (!budgets) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading budgets...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n const displayBudgets = maxItems ? budgets.slice(0, maxItems) : budgets;\n\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n {displayBudgets.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No budgets found\n </Typography>\n ) : (\n <List disablePadding>\n {displayBudgets.map((budget, index) => (\n <ListItem\n key={budget.id}\n divider={index < displayBudgets.length - 1}\n sx={{ px: 0, display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}\n >\n <Box sx={{ width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 0.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {budget.name}\n </Typography>\n <Chip\n label={budget.state}\n size=\"small\"\n color={budget.state === 'over' ? 'error' : budget.state === 'risk' ? 'warning' : 'success'}\n variant=\"outlined\"\n />\n </Box>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {currencySymbol}{budget.spent.toFixed(2)} / {currencySymbol}{budget.budgetAmount.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ width: '100%' }}>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(budget.percentSpent, 100)}\n color={budget.state === 'over' ? 'error' : budget.state === 'risk' ? 'warning' : 'primary'}\n sx={{ height: 8, borderRadius: 1 }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {budget.percentSpent.toFixed(1)}% • {currencySymbol}{budget.remaining.toFixed(2)} remaining\n </Typography>\n </Box>\n </ListItem>\n ))}\n </List>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { Box, Card, CardContent, Grid, Typography, LinearProgress, Chip } from '@mui/material';\nimport { useBudgetSummary } from '@pfm-platform/budgets-feature';\n\nexport interface BudgetSummaryProps {\n userId: string;\n /** Budget month (1-12) */\n month?: number;\n /** Budget year */\n year?: number;\n /** Custom title for the summary */\n title?: string;\n /** Currency symbol to display */\n currencySymbol?: string;\n}\n\n/**\n * BudgetSummary component displays aggregate budget statistics.\n * Shows total budgets, budget amount, spent, remaining, and overall state.\n */\nexport function BudgetSummary({\n userId,\n month,\n year,\n title = 'Budget Summary',\n currencySymbol = '$',\n}: BudgetSummaryProps) {\n const summary = useBudgetSummary({ userId, month, year });\n\n if (!summary) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading budget summary...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n if (!summary.hasBudgets) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n No budgets found\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n return (\n <Card>\n <CardContent>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}>\n <Typography variant=\"h6\">\n {title}\n </Typography>\n <Chip\n label={summary.state}\n size=\"small\"\n color={summary.state === 'over' ? 'error' : summary.state === 'risk' ? 'warning' : 'success'}\n />\n </Box>\n <Grid container spacing={2}>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Budgets\n </Typography>\n <Typography variant=\"h5\">{summary.totalBudgets}</Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Budget\n </Typography>\n <Typography variant=\"h5\">\n {currencySymbol}{summary.totalBudget.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Spent\n </Typography>\n <Typography\n variant=\"h6\"\n color={summary.state === 'over' ? 'error.main' : 'text.primary'}\n >\n {currencySymbol}{summary.totalSpent.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Remaining\n </Typography>\n <Typography\n variant=\"h6\"\n color={summary.totalRemaining >= 0 ? 'success.main' : 'error.main'}\n >\n {currencySymbol}{summary.totalRemaining.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={12}>\n <Box>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 0.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Overall Progress\n </Typography>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {summary.percentSpent.toFixed(1)}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(summary.percentSpent, 100)}\n color={summary.state === 'over' ? 'error' : summary.state === 'risk' ? 'warning' : 'primary'}\n sx={{ height: 10, borderRadius: 1 }}\n />\n </Box>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n}\n","import { useState } from 'react';\nimport {\n Box,\n Button,\n TextField,\n Alert,\n CircularProgress,\n Paper,\n Typography,\n} from '@mui/material';\nimport { useCreateBudget } from '@pfm-platform/budgets-data-access';\nimport type { BudgetCreate } from '@pfm-platform/shared';\n\nexport interface BudgetCreateFormProps {\n userId: string;\n onSuccess?: () => void;\n}\n\nexport function BudgetCreateForm({\n userId,\n onSuccess,\n}: BudgetCreateFormProps) {\n const [name, setName] = useState('');\n const [budgetAmount, setBudgetAmount] = useState('');\n const [tagNames, setTagNames] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const createBudget = useCreateBudget({\n onSuccess: () => {\n setName('');\n setBudgetAmount('');\n setTagNames('');\n setError(null);\n onSuccess?.();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to create budget');\n },\n });\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!name.trim()) {\n setError('Budget name is required');\n return;\n }\n\n const amount = parseFloat(budgetAmount);\n if (isNaN(amount) || amount <= 0) {\n setError('Budget amount must be a positive number');\n return;\n }\n\n // Parse tag names from comma-separated string\n const tags = tagNames\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0);\n\n if (tags.length === 0) {\n setError('At least one tag is required');\n return;\n }\n\n const now = new Date();\n const data: BudgetCreate = {\n user_id: userId,\n name: name.trim(),\n month: now.getMonth() + 1,\n year: now.getFullYear(),\n budget_amount: amount,\n show_on_dashboard: true,\n };\n\n createBudget.mutate({ userId, data, tagNames: tags });\n };\n\n return (\n <Paper sx={{ p: 3 }}>\n <Typography variant=\"h6\" gutterBottom>\n Create Budget\n </Typography>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}\n >\n <TextField\n label=\"Budget Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={createBudget.isPending}\n error={!!error && !name.trim()}\n helperText=\"Enter a name for your budget (e.g., 'Monthly Groceries')\"\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Budget Amount\"\n type=\"number\"\n value={budgetAmount}\n onChange={(e) => {\n setBudgetAmount(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={createBudget.isPending}\n error={!!error && (isNaN(parseFloat(budgetAmount)) || parseFloat(budgetAmount) <= 0)}\n helperText=\"Enter the total budget amount (e.g., 500.00)\"\n inputProps={{\n min: 0.01,\n step: 0.01,\n }}\n />\n\n <TextField\n label=\"Tags (comma-separated)\"\n value={tagNames}\n onChange={(e) => {\n setTagNames(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={createBudget.isPending}\n error={!!error && tagNames.split(',').filter((t) => t.trim()).length === 0}\n helperText=\"Enter tags separated by commas (e.g., 'groceries, food, essentials')\"\n multiline\n rows={2}\n />\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={createBudget.isPending || !name.trim() || !budgetAmount || !tagNames.trim()}\n startIcon={createBudget.isPending ? <CircularProgress size={20} /> : null}\n >\n {createBudget.isPending ? 'Creating...' : 'Create Budget'}\n </Button>\n </Box>\n </Box>\n </Paper>\n );\n}\n","import { useState } from 'react';\nimport {\n Box,\n Button,\n TextField,\n Alert,\n CircularProgress,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n} from '@mui/material';\nimport { useUpdateBudget } from '@pfm-platform/budgets-data-access';\nimport type { BudgetWithRelations, BudgetUpdate } from '@pfm-platform/shared';\n\nexport interface BudgetEditFormProps {\n userId: string;\n budget: BudgetWithRelations;\n open: boolean;\n onClose: () => void;\n}\n\nexport function BudgetEditForm({\n userId,\n budget,\n open,\n onClose,\n}: BudgetEditFormProps) {\n const [name, setName] = useState(budget.name);\n const [budgetAmount, setBudgetAmount] = useState(budget.budget_amount.toString());\n const [tagNames, setTagNames] = useState(budget.budget_tags.map(bt => bt.tag_name).join(', '));\n const [error, setError] = useState<string | null>(null);\n\n const updateBudget = useUpdateBudget({\n onSuccess: () => {\n setError(null);\n onClose();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to update budget');\n },\n });\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!name.trim()) {\n setError('Budget name is required');\n return;\n }\n\n const amount = parseFloat(budgetAmount);\n if (isNaN(amount) || amount <= 0) {\n setError('Budget amount must be a positive number');\n return;\n }\n\n // Parse tag names from comma-separated string\n const tags = tagNames\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0);\n\n if (tags.length === 0) {\n setError('At least one tag is required');\n return;\n }\n\n const data: BudgetUpdate = {\n id: budget.id,\n name: name.trim(),\n budget_amount: amount,\n show_on_dashboard: true,\n };\n\n updateBudget.mutate({ userId, budgetId: budget.id, data, tagNames: tags });\n };\n\n const handleClose = () => {\n if (!updateBudget.isPending) {\n onClose();\n }\n };\n\n return (\n <Dialog\n open={open}\n onClose={handleClose}\n maxWidth=\"sm\"\n fullWidth\n aria-labelledby=\"edit-budget-dialog-title\"\n >\n <form onSubmit={handleSubmit}>\n <DialogTitle id=\"edit-budget-dialog-title\">Edit Budget</DialogTitle>\n <DialogContent>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}>\n <TextField\n label=\"Budget Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={updateBudget.isPending}\n error={!!error && !name.trim()}\n helperText=\"Enter a name for your budget\"\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Budget Amount\"\n type=\"number\"\n value={budgetAmount}\n onChange={(e) => {\n setBudgetAmount(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={updateBudget.isPending}\n error={!!error && (isNaN(parseFloat(budgetAmount)) || parseFloat(budgetAmount) <= 0)}\n helperText=\"Enter the total budget amount\"\n inputProps={{\n min: 0.01,\n step: 0.01,\n }}\n />\n\n <TextField\n label=\"Tags (comma-separated)\"\n value={tagNames}\n onChange={(e) => {\n setTagNames(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={updateBudget.isPending}\n error={!!error && tagNames.split(',').filter((t) => t.trim()).length === 0}\n helperText=\"Enter tags separated by commas\"\n multiline\n rows={2}\n />\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={updateBudget.isPending}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={updateBudget.isPending || !name.trim() || !budgetAmount || !tagNames.trim()}\n startIcon={updateBudget.isPending ? <CircularProgress size={20} /> : null}\n >\n {updateBudget.isPending ? 'Saving...' : 'Save Changes'}\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n );\n}\n","import { useState } from 'react';\nimport {\n IconButton,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Button,\n Tooltip,\n} from '@mui/material';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport { useDeleteBudget } from '@pfm-platform/budgets-data-access';\n\nexport interface BudgetDeleteButtonProps {\n userId: string;\n budgetId: string;\n budgetName: string;\n}\n\nexport function BudgetDeleteButton({\n userId,\n budgetId,\n budgetName,\n}: BudgetDeleteButtonProps) {\n const [open, setOpen] = useState(false);\n\n const deleteBudget = useDeleteBudget({\n onSuccess: () => {\n setOpen(false);\n },\n });\n\n const handleDelete = () => {\n deleteBudget.mutate({ userId, budgetId });\n };\n\n return (\n <>\n <Tooltip title=\"Delete budget\">\n <IconButton\n onClick={() => setOpen(true)}\n color=\"error\"\n size=\"small\"\n aria-label={`delete budget ${budgetName}`}\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onClose={() => !deleteBudget.isPending && setOpen(false)}\n aria-labelledby=\"delete-budget-dialog-title\"\n >\n <DialogTitle id=\"delete-budget-dialog-title\">Delete Budget?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Are you sure you want to delete the budget \"{budgetName}\"? This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => setOpen(false)}\n disabled={deleteBudget.isPending}\n >\n Cancel\n </Button>\n <Button\n onClick={handleDelete}\n color=\"error\"\n variant=\"contained\"\n disabled={deleteBudget.isPending}\n autoFocus\n >\n {deleteBudget.isPending ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n","import {\n Card,\n CardContent,\n Typography,\n LinearProgress,\n Box,\n Chip,\n} from '@mui/material';\nimport { TrendingUp, TrendingDown, Warning } from '@mui/icons-material';\nimport type { BudgetWithRelations } from '@pfm-platform/shared';\n\nexport interface BudgetProgressCardProps {\n budget: BudgetWithRelations;\n /** Current spent amount */\n currentSpent: number;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Show trend indicator */\n showTrend?: boolean;\n /** Comparison to last period (optional) */\n lastPeriodSpent?: number;\n}\n\n/**\n * BudgetProgressCard component displays budget progress with visual indicators.\n * Shows spent/limit/remaining with color-coded zones (green/yellow/red).\n *\n * Color zones:\n * - Green: 0-70% of limit\n * - Yellow: 70-90% of limit\n * - Red: >90% of limit\n *\n * @example\n * ```tsx\n * <BudgetProgressCard\n * budget={budget}\n * currentSpent={450.75}\n * currencySymbol=\"$\"\n * showTrend\n * lastPeriodSpent={380.50}\n * />\n * ```\n */\nexport function BudgetProgressCard({\n budget,\n currentSpent,\n currencySymbol = '$',\n showTrend = false,\n lastPeriodSpent,\n}: BudgetProgressCardProps) {\n const limit = budget.budget_amount;\n const remaining = limit - currentSpent;\n const percentage = (currentSpent / limit) * 100;\n\n // Determine color zone\n const getColor = (): 'success' | 'warning' | 'error' => {\n if (percentage <= 70) return 'success';\n if (percentage <= 90) return 'warning';\n return 'error';\n };\n\n const color = getColor();\n\n // Calculate trend vs last period\n const trend = lastPeriodSpent !== undefined ? currentSpent - lastPeriodSpent : null;\n const trendPercentage = trend !== null && lastPeriodSpent !== undefined && lastPeriodSpent > 0\n ? ((trend / lastPeriodSpent) * 100)\n : null;\n\n return (\n <Card>\n <CardContent>\n {/* Budget Name and Category */}\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', mb: 2 }}>\n <Box>\n <Typography variant=\"h6\" gutterBottom>\n {budget.name}\n </Typography>\n {budget.budget_tags.length > 0 && (\n <Chip\n label={budget.budget_tags[0].tag_name}\n size=\"small\"\n variant=\"outlined\"\n sx={{ mb: 1 }}\n />\n )}\n </Box>\n {percentage > 90 && (\n <Chip\n icon={<Warning />}\n label=\"Over Budget\"\n color=\"error\"\n size=\"small\"\n />\n )}\n </Box>\n\n {/* Progress Bar */}\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Progress\n </Typography>\n <Typography variant=\"body2\" fontWeight=\"bold\" color={`${color}.main`}>\n {percentage.toFixed(1)}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(percentage, 100)}\n color={color}\n sx={{ height: 8, borderRadius: 4 }}\n />\n </Box>\n\n {/* Spent / Limit / Remaining */}\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 2 }}>\n <Box>\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\">\n Spent\n </Typography>\n <Typography variant=\"h6\" color={`${color}.main`}>\n {currencySymbol}{currentSpent.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ textAlign: 'center' }}>\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\">\n Limit\n </Typography>\n <Typography variant=\"h6\">\n {currencySymbol}{limit.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ textAlign: 'right' }}>\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\">\n Remaining\n </Typography>\n <Typography\n variant=\"h6\"\n color={remaining >= 0 ? 'success.main' : 'error.main'}\n >\n {currencySymbol}{Math.abs(remaining).toFixed(2)}\n </Typography>\n </Box>\n </Box>\n\n {/* Trend Indicator */}\n {showTrend && trend !== null && trendPercentage !== null && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {trend > 0 ? (\n <Chip\n icon={<TrendingUp />}\n label={`+${currencySymbol}${Math.abs(trend).toFixed(2)} (+${trendPercentage.toFixed(1)}%)`}\n color=\"error\"\n size=\"small\"\n variant=\"outlined\"\n />\n ) : (\n <Chip\n icon={<TrendingDown />}\n label={`-${currencySymbol}${Math.abs(trend).toFixed(2)} (${trendPercentage.toFixed(1)}%)`}\n color=\"success\"\n size=\"small\"\n variant=\"outlined\"\n />\n )}\n <Typography variant=\"caption\" color=\"text.secondary\">\n vs last period\n </Typography>\n </Box>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { useState, useMemo } from 'react';\nimport {\n Box,\n Typography,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n Grid,\n Alert,\n} from '@mui/material';\nimport { BudgetProgressCard } from './BudgetProgressCard';\nimport type { BudgetWithRelations } from '@pfm-platform/shared';\n\nexport interface BudgetProgressListProps {\n budgets: BudgetWithRelations[];\n /** Map of budget ID to current spent amount */\n spentByBudget: Map<string, number>;\n /** Map of budget ID to last period spent amount (optional) */\n lastPeriodSpentByBudget?: Map<string, number>;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Show trend indicators */\n showTrends?: boolean;\n /** Enable category filtering */\n enableCategoryFilter?: boolean;\n}\n\ntype FilterValue = 'all' | 'on-track' | 'warning' | 'over-budget';\n\n/**\n * BudgetProgressList component displays all budgets with progress indicators.\n * Supports filtering by status (on-track, warning, over-budget).\n *\n * @example\n * ```tsx\n * const spentMap = new Map([\n * [1, 450.75],\n * [2, 1200.50],\n * ]);\n *\n * <BudgetProgressList\n * budgets={budgets}\n * spentByBudget={spentMap}\n * currencySymbol=\"$\"\n * showTrends\n * enableCategoryFilter\n * />\n * ```\n */\nexport function BudgetProgressList({\n budgets,\n spentByBudget,\n lastPeriodSpentByBudget,\n currencySymbol = '$',\n showTrends = false,\n enableCategoryFilter = true,\n}: BudgetProgressListProps) {\n const [statusFilter, setStatusFilter] = useState<FilterValue>('all');\n const [categoryFilter, setCategory] = useState<string>('all');\n\n // Extract unique categories\n const categories = useMemo(() => {\n const uniqueCategories = new Set<string>();\n budgets.forEach((budget) => {\n budget.budget_tags.forEach((bt) => {\n uniqueCategories.add(bt.tag_name);\n });\n });\n return Array.from(uniqueCategories).sort();\n }, [budgets]);\n\n // Filter budgets\n const filteredBudgets = useMemo(() => {\n return budgets.filter((budget) => {\n const spent = spentByBudget.get(budget.id) || 0;\n const limit = budget.budget_amount;\n const percentage = (spent / limit) * 100;\n\n // Status filter\n if (statusFilter === 'on-track' && percentage > 70) return false;\n if (statusFilter === 'warning' && (percentage <= 70 || percentage > 90)) return false;\n if (statusFilter === 'over-budget' && percentage <= 90) return false;\n\n // Category filter\n if (categoryFilter !== 'all' && !budget.budget_tags.some(bt => bt.tag_name === categoryFilter)) return false;\n\n return true;\n });\n }, [budgets, spentByBudget, statusFilter, categoryFilter]);\n\n // Calculate summary stats\n const stats = useMemo(() => {\n const onTrack = budgets.filter(b => {\n const spent = spentByBudget.get(b.id) || 0;\n const percentage = (spent / b.budget_amount) * 100;\n return percentage <= 70;\n }).length;\n\n const warning = budgets.filter(b => {\n const spent = spentByBudget.get(b.id) || 0;\n const percentage = (spent / b.budget_amount) * 100;\n return percentage > 70 && percentage <= 90;\n }).length;\n\n const overBudget = budgets.filter(b => {\n const spent = spentByBudget.get(b.id) || 0;\n const percentage = (spent / b.budget_amount) * 100;\n return percentage > 90;\n }).length;\n\n return { onTrack, warning, overBudget };\n }, [budgets, spentByBudget]);\n\n if (budgets.length === 0) {\n return (\n <Alert severity=\"info\">\n No budgets found. Create a budget to start tracking your spending.\n </Alert>\n );\n }\n\n return (\n <Box>\n {/* Header with Filters */}\n <Box sx={{ mb: 3 }}>\n <Typography variant=\"h5\" gutterBottom>\n Budget Progress\n </Typography>\n\n {/* Summary Stats */}\n <Box sx={{ display: 'flex', gap: 2, mb: 2, flexWrap: 'wrap' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n <strong>{stats.onTrack}</strong> on track\n </Typography>\n <Typography variant=\"body2\" color=\"warning.main\">\n <strong>{stats.warning}</strong> warning\n </Typography>\n <Typography variant=\"body2\" color=\"error.main\">\n <strong>{stats.overBudget}</strong> over budget\n </Typography>\n </Box>\n\n {/* Filters */}\n <Box sx={{ display: 'flex', gap: 2, flexWrap: 'wrap' }}>\n <FormControl size=\"small\" sx={{ minWidth: 150 }}>\n <InputLabel>Status</InputLabel>\n <Select\n value={statusFilter}\n label=\"Status\"\n onChange={(e) => setStatusFilter(e.target.value as FilterValue)}\n >\n <MenuItem value=\"all\">All Budgets</MenuItem>\n <MenuItem value=\"on-track\">On Track</MenuItem>\n <MenuItem value=\"warning\">Warning</MenuItem>\n <MenuItem value=\"over-budget\">Over Budget</MenuItem>\n </Select>\n </FormControl>\n\n {enableCategoryFilter && categories.length > 0 && (\n <FormControl size=\"small\" sx={{ minWidth: 150 }}>\n <InputLabel>Category</InputLabel>\n <Select\n value={categoryFilter}\n label=\"Category\"\n onChange={(e) => setCategory(e.target.value)}\n >\n <MenuItem value=\"all\">All Categories</MenuItem>\n {categories.map((cat) => (\n <MenuItem key={cat} value={cat}>\n {cat}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )}\n </Box>\n </Box>\n\n {/* Budget Cards Grid */}\n {filteredBudgets.length === 0 ? (\n <Alert severity=\"info\">\n No budgets match the selected filters.\n </Alert>\n ) : (\n <Grid container spacing={3}>\n {filteredBudgets.map((budget) => {\n const spent = spentByBudget.get(budget.id) || 0;\n const lastPeriodSpent = lastPeriodSpentByBudget?.get(budget.id);\n\n return (\n <Grid key={budget.id} size={{ xs: 12, sm: 6, lg: 4 }}>\n <BudgetProgressCard\n budget={budget}\n currentSpent={spent}\n currencySymbol={currencySymbol}\n showTrend={showTrends}\n lastPeriodSpent={lastPeriodSpent}\n />\n </Grid>\n );\n })}\n </Grid>\n )}\n </Box>\n );\n}\n","/**\n * BudgetInsightsCard\n *\n * Budget insights and recommendations component.\n * Migrated from legacy Budgets/Insights.js with modern React patterns.\n *\n * Features:\n * - Budget performance analysis\n * - Overspending/underspending identification\n * - Historical trend analysis\n * - Actionable recommendations\n * - Visual indicators (icons, colors)\n * - Expandable insights list\n *\n * Migration Notes:\n * - Legacy: MobX store with complex insight loading\n * - Modern: Controlled component with callback props\n * - Removed: MobX observables, store injection\n * - Added: TypeScript types, modern hooks, Material-UI v7\n */\n\nimport { useState } from 'react';\nimport {\n Card,\n CardContent,\n Typography,\n Box,\n Button,\n Chip,\n Divider,\n useTheme,\n alpha,\n} from '@mui/material';\nimport {\n TrendingUp as TrendingUpIcon,\n TrendingDown as TrendingDownIcon,\n Warning as WarningIcon,\n CheckCircle as CheckCircleIcon,\n ExpandMore as ExpandMoreIcon,\n} from '@mui/icons-material';\n\nexport type InsightType = 'overspending' | 'underspending' | 'on-track' | 'suggest-tag';\n\nexport interface BudgetInsight {\n /**\n * Unique insight identifier\n */\n id: string;\n\n /**\n * Type of insight\n */\n type: InsightType;\n\n /**\n * Budget identifier\n */\n budgetId: string;\n\n /**\n * Budget name\n */\n budgetName: string;\n\n /**\n * Average amount over/under budget\n */\n averageAmount: number;\n\n /**\n * Number of months analyzed\n */\n monthsAnalyzed: number;\n\n /**\n * Number of times over/under budget\n */\n occurrences: number;\n\n /**\n * Recommendation message\n */\n recommendation: string;\n\n /**\n * Optional tag name (for suggest-tag type)\n */\n tagName?: string;\n}\n\nexport interface BudgetOverallSummary {\n /**\n * Total amount over/under all budgets\n */\n totalAmount: number;\n\n /**\n * Number of months in analysis\n */\n months: number;\n\n /**\n * Budget state: 'over' | 'under' | 'on-track'\n */\n state: 'over' | 'under' | 'on-track';\n}\n\nexport interface BudgetInsightsCardProps {\n /**\n * List of budget insights\n */\n insights: BudgetInsight[];\n\n /**\n * Overall budget summary\n */\n overallSummary: BudgetOverallSummary;\n\n /**\n * Whether insights are loading\n * @default false\n */\n loading?: boolean;\n\n /**\n * Maximum insights to show initially\n * @default 2\n */\n initialVisibleCount?: number;\n\n /**\n * Callback when insight action is clicked\n */\n onInsightAction?: (insight: BudgetInsight) => void;\n\n /**\n * Callback when insight is dismissed\n */\n onInsightDismiss?: (insight: BudgetInsight) => void;\n\n /**\n * Currency formatter\n */\n currencyFormatter?: (value: number) => string;\n}\n\n/**\n * Default currency formatter\n */\nconst defaultCurrencyFormatter = (value: number): string => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n};\n\n/**\n * Get insight icon and color based on type\n */\nfunction getInsightStyle(type: InsightType, theme: any) {\n switch (type) {\n case 'overspending':\n return {\n icon: <WarningIcon />,\n color: theme.palette.error.main,\n bgColor: alpha(theme.palette.error.main, 0.1),\n };\n case 'underspending':\n return {\n icon: <TrendingDownIcon />,\n color: theme.palette.info.main,\n bgColor: alpha(theme.palette.info.main, 0.1),\n };\n case 'on-track':\n return {\n icon: <CheckCircleIcon />,\n color: theme.palette.success.main,\n bgColor: alpha(theme.palette.success.main, 0.1),\n };\n case 'suggest-tag':\n return {\n icon: <TrendingUpIcon />,\n color: theme.palette.warning.main,\n bgColor: alpha(theme.palette.warning.main, 0.1),\n };\n default:\n return {\n icon: <CheckCircleIcon />,\n color: theme.palette.text.secondary,\n bgColor: alpha(theme.palette.text.secondary, 0.1),\n };\n }\n}\n\n/**\n * Budget insights and recommendations card\n *\n * Displays budget performance analysis with actionable insights.\n * Shows overall summary and individual budget insights with recommendations.\n *\n * @example\n * ```tsx\n * <BudgetInsightsCard\n * insights={budgetInsights}\n * overallSummary={{\n * totalAmount: -150,\n * months: 6,\n * state: 'over',\n * }}\n * onInsightAction={(insight) => handleAction(insight)}\n * onInsightDismiss={(insight) => dismissInsight(insight)}\n * />\n * ```\n */\nexport function BudgetInsightsCard({\n insights,\n overallSummary,\n initialVisibleCount = 2,\n onInsightAction,\n onInsightDismiss,\n currencyFormatter = defaultCurrencyFormatter,\n}: BudgetInsightsCardProps) {\n const theme = useTheme();\n const [showAll, setShowAll] = useState(false);\n\n const visibleInsights = showAll ? insights : insights.slice(0, initialVisibleCount);\n const hasMore = insights.length > initialVisibleCount;\n\n const overallStyle = overallSummary.state === 'over'\n ? { color: theme.palette.error.main, icon: <WarningIcon /> }\n : overallSummary.state === 'under'\n ? { color: theme.palette.success.main, icon: <CheckCircleIcon /> }\n : { color: theme.palette.info.main, icon: <CheckCircleIcon /> };\n\n return (\n <Card data-testid=\"budget-insights-card\">\n <CardContent>\n {/* Header */}\n <Typography variant=\"h6\" gutterBottom>\n Budget Insights\n </Typography>\n\n {/* Overall Summary */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n p: 2,\n mb: 2,\n bgcolor: alpha(overallStyle.color, 0.1),\n borderRadius: 1,\n }}\n >\n <Box sx={{ color: overallStyle.color }}>\n {overallStyle.icon}\n </Box>\n <Box sx={{ flex: 1 }}>\n {overallSummary.totalAmount > 0 && (\n <Typography variant=\"body2\">\n You've been <strong>under budget</strong> by{' '}\n <strong>{currencyFormatter(overallSummary.totalAmount)}</strong>{' '}\n on all budgets over the last{' '}\n <strong>{overallSummary.months} months</strong>.\n </Typography>\n )}\n {overallSummary.totalAmount < 0 && (\n <Typography variant=\"body2\">\n You have <strong>overspent</strong> by{' '}\n <strong>{currencyFormatter(Math.abs(overallSummary.totalAmount))}</strong>{' '}\n on all budgets over the last{' '}\n <strong>{overallSummary.months} months</strong>.\n </Typography>\n )}\n {overallSummary.totalAmount === 0 && (\n <Typography variant=\"body2\">\n You are <strong>on track</strong> with all budgets over the last{' '}\n <strong>{overallSummary.months} months</strong>.\n </Typography>\n )}\n </Box>\n </Box>\n\n <Divider sx={{ my: 2 }} />\n\n {/* Insights List */}\n {insights.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ textAlign: 'center', py: 2 }}>\n No insights available. Keep tracking your budgets!\n </Typography>\n ) : (\n <>\n {visibleInsights.map((insight) => {\n const style = getInsightStyle(insight.type, theme);\n return (\n <Box\n key={insight.id}\n data-testid={`budget-insight-${insight.id}`}\n sx={{\n p: 2,\n mb: 1,\n bgcolor: style.bgColor,\n borderRadius: 1,\n borderLeft: `4px solid ${style.color}`,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1.5 }}>\n <Box sx={{ color: style.color, mt: 0.5 }}>\n {style.icon}\n </Box>\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n {insight.budgetName}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1 }}>\n {insight.recommendation}\n </Typography>\n <Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap' }}>\n <Chip\n label={`${insight.occurrences} times`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`${insight.monthsAnalyzed} months`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`Avg: ${currencyFormatter(Math.abs(insight.averageAmount))}`}\n size=\"small\"\n variant=\"outlined\"\n />\n </Box>\n </Box>\n </Box>\n <Box sx={{ display: 'flex', gap: 1, mt: 2, justifyContent: 'flex-end' }}>\n {onInsightDismiss && (\n <Button\n size=\"small\"\n onClick={() => onInsightDismiss(insight)}\n >\n Dismiss\n </Button>\n )}\n {onInsightAction && insight.type !== 'suggest-tag' && (\n <Button\n size=\"small\"\n variant=\"contained\"\n onClick={() => onInsightAction(insight)}\n >\n Adjust Budget\n </Button>\n )}\n {onInsightAction && insight.type === 'suggest-tag' && (\n <Button\n size=\"small\"\n variant=\"contained\"\n onClick={() => onInsightAction(insight)}\n >\n Add Tag\n </Button>\n )}\n </Box>\n </Box>\n );\n })}\n\n {hasMore && (\n <Box sx={{ textAlign: 'center', mt: 2 }}>\n <Button\n size=\"small\"\n endIcon={\n <ExpandMoreIcon\n sx={{\n transform: showAll ? 'rotate(180deg)' : 'rotate(0)',\n transition: 'transform 0.3s',\n }}\n />\n }\n onClick={() => setShowAll(!showAll)}\n >\n {showAll ? 'Show Less' : `Show ${insights.length - initialVisibleCount} More`}\n </Button>\n </Box>\n )}\n </>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * BudgetInsightDialog\n *\n * Dialog for adjusting budget amounts based on insights.\n * Migrated from legacy Budgets/InsightDialog.js with modern React patterns.\n *\n * Features:\n * - Display insight details\n * - Amount adjustment input\n * - Validation and error handling\n * - Save/cancel actions\n * - Material-UI v7 theming\n *\n * Migration Notes:\n * - Legacy: MobX form with observable fields\n * - Modern: Controlled component with React state\n * - Removed: MobX observables, store injection\n * - Added: TypeScript types, modern hooks, proper validation\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n DialogContentText,\n Button,\n TextField,\n} from '@mui/material';\nimport type { BudgetInsight } from './BudgetInsightsCard';\n\nexport interface BudgetInsightDialogProps {\n /**\n * Insight to display in dialog\n */\n insight: BudgetInsight | null;\n\n /**\n * Whether dialog is open\n */\n open: boolean;\n\n /**\n * Callback when dialog is closed\n */\n onClose: () => void;\n\n /**\n * Callback when save is clicked\n */\n onSave: (insight: BudgetInsight, adjustmentAmount: number) => Promise<void>;\n\n /**\n * Whether save operation is in progress\n * @default false\n */\n saving?: boolean;\n\n /**\n * Currency formatter\n */\n currencyFormatter?: (value: number) => string;\n}\n\n/**\n * Default currency formatter\n */\nconst defaultCurrencyFormatter = (value: number): string => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n};\n\n/**\n * Budget insight adjustment dialog\n *\n * Allows users to adjust budget amounts based on spending insights.\n * Provides context about overspending/underspending patterns.\n *\n * @example\n * ```tsx\n * <BudgetInsightDialog\n * insight={selectedInsight}\n * open={dialogOpen}\n * onClose={() => setDialogOpen(false)}\n * onSave={async (insight, amount) => {\n * await updateBudget(insight.budgetId, amount);\n * }}\n * />\n * ```\n */\nexport function BudgetInsightDialog({\n insight,\n open,\n onClose,\n onSave,\n saving = false,\n currencyFormatter = defaultCurrencyFormatter,\n}: BudgetInsightDialogProps) {\n const [amount, setAmount] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n // Reset amount when insight changes or dialog opens\n useEffect(() => {\n if (open && insight) {\n const suggestedAmount = Math.abs(insight.averageAmount);\n setAmount(suggestedAmount.toFixed(2));\n setError(null);\n }\n }, [open, insight]);\n\n const handleAmountChange = (value: string) => {\n setAmount(value);\n\n // Validate amount\n const numValue = parseFloat(value);\n if (isNaN(numValue)) {\n setError('Please enter a valid number');\n } else if (numValue <= 0) {\n setError('Amount must be greater than zero');\n } else if (numValue > 1000000) {\n setError('Amount is too large');\n } else {\n setError(null);\n }\n };\n\n const handleSave = async () => {\n if (!insight || error || !amount) return;\n\n const numValue = parseFloat(amount);\n if (isNaN(numValue) || numValue <= 0) return;\n\n await onSave(insight, numValue);\n onClose();\n };\n\n const handleCancel = () => {\n setAmount('');\n setError(null);\n onClose();\n };\n\n if (!insight) {\n return null;\n }\n\n const isOverspending = insight.type === 'overspending';\n const actionLabel = isOverspending ? 'Increase Budget By' : 'Decrease Budget By';\n\n return (\n <Dialog\n open={open}\n onClose={handleCancel}\n maxWidth=\"sm\"\n fullWidth\n data-testid=\"budget-insight-dialog\"\n >\n <DialogTitle>\n {insight.budgetName}\n </DialogTitle>\n\n <DialogContent>\n {/* Insight Message */}\n {isOverspending && (\n <DialogContentText sx={{ mb: 3 }}>\n You've <strong>exceeded</strong> this budget{' '}\n <strong>{insight.occurrences}</strong> times in the last{' '}\n <strong>{insight.monthsAnalyzed}</strong> months by an average of{' '}\n <strong>{currencyFormatter(Math.abs(insight.averageAmount))}</strong> a month.\n </DialogContentText>\n )}\n\n {!isOverspending && (\n <DialogContentText sx={{ mb: 3 }}>\n You've been <strong>under</strong> this budget{' '}\n <strong>{insight.occurrences}</strong> times in the last{' '}\n <strong>{insight.monthsAnalyzed}</strong> months by an average of{' '}\n <strong>{currencyFormatter(Math.abs(insight.averageAmount))}</strong> a month.\n </DialogContentText>\n )}\n\n {/* Amount Input */}\n <TextField\n autoFocus\n fullWidth\n required\n type=\"number\"\n label={actionLabel}\n value={amount}\n onChange={(e) => handleAmountChange(e.target.value)}\n error={!!error}\n helperText={error || 'Suggested amount based on your spending pattern'}\n disabled={saving}\n inputProps={{\n min: 0,\n step: 0.01,\n 'aria-label': actionLabel,\n }}\n InputLabelProps={{\n shrink: true,\n }}\n />\n </DialogContent>\n\n <DialogActions>\n <Button onClick={handleCancel} disabled={saving}>\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n variant=\"contained\"\n disabled={saving || !!error || !amount}\n >\n {saving ? 'Saving...' : 'Save'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","/**\n * BudgetStateIndicator\n *\n * Visual indicator for budget state (over/under/on-track).\n * Migrated from legacy Budgets/BudgetState.js with modern React patterns.\n *\n * Features:\n * - Color-coded state indicators\n * - Icon-based visual communication\n * - Percentage-based progress display\n * - Responsive design with configurable sizes\n * - Accessibility support\n *\n * Migration Notes:\n * - Legacy: Simple functional component with inline styles\n * - Modern: TypeScript with Material-UI v7 theming\n * - Added: Comprehensive type safety, accessibility, responsive sizing\n */\n\nimport { Box, Typography, Chip, useTheme, alpha } from '@mui/material';\nimport {\n CheckCircle as CheckCircleIcon,\n Warning as WarningIcon,\n TrendingDown as TrendingDownIcon,\n Error as ErrorIcon,\n} from '@mui/icons-material';\n\nexport type BudgetState = 'under' | 'on-track' | 'over' | 'critical';\n\nexport interface BudgetStateIndicatorProps {\n /**\n * Current budget state\n */\n state: BudgetState;\n\n /**\n * Percentage of budget used (0-100+)\n */\n percentage: number;\n\n /**\n * Display variant\n * @default 'chip'\n */\n variant?: 'chip' | 'inline' | 'card';\n\n /**\n * Size of the indicator\n * @default 'medium'\n */\n size?: 'small' | 'medium' | 'large';\n\n /**\n * Show percentage label\n * @default true\n */\n showPercentage?: boolean;\n\n /**\n * Show state label\n * @default true\n */\n showLabel?: boolean;\n\n /**\n * Custom label override\n */\n customLabel?: string;\n}\n\n/**\n * Get state configuration (color, icon, label)\n */\nfunction getStateConfig(state: BudgetState, theme: any) {\n switch (state) {\n case 'under':\n return {\n color: theme.palette.success.main,\n bgColor: alpha(theme.palette.success.main, 0.1),\n icon: <TrendingDownIcon />,\n label: 'Under Budget',\n chipColor: 'success' as const,\n };\n case 'on-track':\n return {\n color: theme.palette.info.main,\n bgColor: alpha(theme.palette.info.main, 0.1),\n icon: <CheckCircleIcon />,\n label: 'On Track',\n chipColor: 'info' as const,\n };\n case 'over':\n return {\n color: theme.palette.warning.main,\n bgColor: alpha(theme.palette.warning.main, 0.1),\n icon: <WarningIcon />,\n label: 'Over Budget',\n chipColor: 'warning' as const,\n };\n case 'critical':\n return {\n color: theme.palette.error.main,\n bgColor: alpha(theme.palette.error.main, 0.1),\n icon: <ErrorIcon />,\n label: 'Critical',\n chipColor: 'error' as const,\n };\n }\n}\n\n/**\n * Get size configuration\n */\nfunction getSizeConfig(size: 'small' | 'medium' | 'large') {\n switch (size) {\n case 'small':\n return {\n iconSize: 16,\n fontSize: '0.75rem',\n spacing: 0.5,\n };\n case 'medium':\n return {\n iconSize: 20,\n fontSize: '0.875rem',\n spacing: 1,\n };\n case 'large':\n return {\n iconSize: 24,\n fontSize: '1rem',\n spacing: 1.5,\n };\n }\n}\n\n/**\n * Budget state indicator component\n *\n * Displays visual indicator for budget state with color coding and icons.\n * Supports multiple display variants and sizes for different contexts.\n *\n * @example\n * ```tsx\n * // Chip variant (default)\n * <BudgetStateIndicator state=\"over\" percentage={110} />\n *\n * // Inline variant\n * <BudgetStateIndicator\n * state=\"on-track\"\n * percentage={75}\n * variant=\"inline\"\n * size=\"small\"\n * />\n *\n * // Card variant with custom label\n * <BudgetStateIndicator\n * state=\"critical\"\n * percentage={150}\n * variant=\"card\"\n * customLabel=\"Way Over Budget\"\n * />\n * ```\n */\nexport function BudgetStateIndicator({\n state,\n percentage,\n variant = 'chip',\n size = 'medium',\n showPercentage = true,\n showLabel = true,\n customLabel,\n}: BudgetStateIndicatorProps) {\n const theme = useTheme();\n const config = getStateConfig(state, theme);\n const sizeConfig = getSizeConfig(size);\n\n const label = customLabel || config.label;\n const displayText = showPercentage\n ? `${label} (${percentage.toFixed(0)}%)`\n : label;\n\n // Chip variant\n if (variant === 'chip') {\n return (\n <Chip\n data-testid=\"budget-state-indicator\"\n icon={config.icon}\n label={displayText}\n color={config.chipColor}\n size={size === 'large' ? 'medium' : 'small'}\n sx={{\n fontSize: sizeConfig.fontSize,\n fontWeight: 'medium',\n }}\n />\n );\n }\n\n // Inline variant\n if (variant === 'inline') {\n return (\n <Box\n data-testid=\"budget-state-indicator\"\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: sizeConfig.spacing,\n color: config.color,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n fontSize: sizeConfig.iconSize,\n }}\n >\n {config.icon}\n </Box>\n {showLabel && (\n <Typography\n component=\"span\"\n sx={{\n fontSize: sizeConfig.fontSize,\n fontWeight: 'medium',\n }}\n >\n {displayText}\n </Typography>\n )}\n </Box>\n );\n }\n\n // Card variant\n return (\n <Box\n data-testid=\"budget-state-indicator\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: sizeConfig.spacing * 2,\n p: sizeConfig.spacing * 2,\n bgcolor: config.bgColor,\n borderRadius: 1,\n borderLeft: `4px solid ${config.color}`,\n }}\n >\n <Box\n sx={{\n color: config.color,\n display: 'flex',\n alignItems: 'center',\n fontSize: sizeConfig.iconSize * 1.5,\n }}\n >\n {config.icon}\n </Box>\n <Box sx={{ flex: 1 }}>\n {showLabel && (\n <Typography\n variant=\"subtitle2\"\n sx={{\n color: config.color,\n fontWeight: 'bold',\n fontSize: sizeConfig.fontSize,\n }}\n >\n {label}\n </Typography>\n )}\n {showPercentage && (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ fontSize: sizeConfig.fontSize }}\n >\n {percentage.toFixed(1)}% of budget used\n </Typography>\n )}\n </Box>\n </Box>\n );\n}\n","/**\n * BudgetTagInsight\n *\n * Tag-specific spending pattern insights component.\n * Migrated from legacy Budgets/TagInsight.js with modern React patterns.\n *\n * Features:\n * - Tag spending analysis\n * - Budget assignment recommendations\n * - Trend visualization\n * - Actionable insights for unbudgeted tags\n * - Material-UI v7 theming\n *\n * Migration Notes:\n * - Legacy: MobX store-based with complex tag analysis\n * - Modern: Controlled component with callback props\n * - Removed: MobX observables, store injection\n * - Added: TypeScript types, modern hooks, comprehensive insights\n */\n\nimport {\n Box,\n Card,\n CardContent,\n Typography,\n Button,\n Chip,\n Divider,\n useTheme,\n alpha,\n} from '@mui/material';\nimport {\n LocalOffer as LocalOfferIcon,\n TrendingUp as TrendingUpIcon,\n Info as InfoIcon,\n Add as AddIcon,\n} from '@mui/icons-material';\n\nexport interface TagSpendingInsight {\n /**\n * Unique insight identifier\n */\n id: string;\n\n /**\n * Tag name\n */\n tagName: string;\n\n /**\n * Average monthly spending on this tag\n */\n averageMonthlySpend: number;\n\n /**\n * Number of months analyzed\n */\n monthsAnalyzed: number;\n\n /**\n * Number of transactions with this tag\n */\n transactionCount: number;\n\n /**\n * Whether tag is currently budgeted\n */\n isBudgeted: boolean;\n\n /**\n * Suggested budget amount (if not budgeted)\n */\n suggestedBudget?: number;\n\n /**\n * Spending trend: 'increasing' | 'decreasing' | 'stable'\n */\n trend: 'increasing' | 'decreasing' | 'stable';\n\n /**\n * Percentage change in spending (positive or negative)\n */\n trendPercentage: number;\n\n /**\n * Recommendation message\n */\n recommendation: string;\n}\n\nexport interface BudgetTagInsightProps {\n /**\n * List of tag spending insights\n */\n insights: TagSpendingInsight[];\n\n /**\n * Whether insights are loading\n * @default false\n */\n loading?: boolean;\n\n /**\n * Callback when \"Create Budget\" is clicked for a tag\n */\n onCreateBudget?: (insight: TagSpendingInsight) => void;\n\n /**\n * Callback when \"View Details\" is clicked\n */\n onViewDetails?: (insight: TagSpendingInsight) => void;\n\n /**\n * Callback when insight is dismissed\n */\n onDismiss?: (insight: TagSpendingInsight) => void;\n\n /**\n * Currency formatter\n */\n currencyFormatter?: (value: number) => string;\n\n /**\n * Maximum insights to show\n * @default 5\n */\n maxVisible?: number;\n}\n\n/**\n * Default currency formatter\n */\nconst defaultCurrencyFormatter = (value: number): string => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n};\n\n/**\n * Get trend configuration\n */\nfunction getTrendConfig(trend: 'increasing' | 'decreasing' | 'stable', theme: any) {\n switch (trend) {\n case 'increasing':\n return {\n color: theme.palette.warning.main,\n bgColor: alpha(theme.palette.warning.main, 0.1),\n label: 'Increasing',\n };\n case 'decreasing':\n return {\n color: theme.palette.success.main,\n bgColor: alpha(theme.palette.success.main, 0.1),\n label: 'Decreasing',\n };\n case 'stable':\n return {\n color: theme.palette.info.main,\n bgColor: alpha(theme.palette.info.main, 0.1),\n label: 'Stable',\n };\n }\n}\n\n/**\n * Budget tag insight component\n *\n * Displays spending insights for unbudgeted or underbudgeted tags.\n * Recommends budget creation with suggested amounts based on spending patterns.\n *\n * @example\n * ```tsx\n * <BudgetTagInsight\n * insights={tagInsights}\n * onCreateBudget={(insight) => createBudgetForTag(insight)}\n * onViewDetails={(insight) => showTagDetails(insight)}\n * />\n * ```\n */\nexport function BudgetTagInsight({\n insights,\n loading = false,\n onCreateBudget,\n onViewDetails,\n onDismiss,\n currencyFormatter = defaultCurrencyFormatter,\n maxVisible = 5,\n}: BudgetTagInsightProps) {\n const theme = useTheme();\n\n const visibleInsights = insights.slice(0, maxVisible);\n const unbudgetedCount = insights.filter((i) => !i.isBudgeted).length;\n\n if (loading) {\n return (\n <Card data-testid=\"budget-tag-insight\">\n <CardContent>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ textAlign: 'center', py: 2 }}>\n Loading tag insights...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n if (insights.length === 0) {\n return (\n <Card data-testid=\"budget-tag-insight\">\n <CardContent>\n <Box sx={{ textAlign: 'center', py: 3 }}>\n <InfoIcon sx={{ fontSize: 48, color: 'text.disabled', mb: 1 }} />\n <Typography variant=\"body2\" color=\"text.secondary\">\n No tag insights available yet. Start tracking your expenses!\n </Typography>\n </Box>\n </CardContent>\n </Card>\n );\n }\n\n return (\n <Card data-testid=\"budget-tag-insight\">\n <CardContent>\n {/* Header */}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 2 }}>\n <LocalOfferIcon color=\"primary\" />\n <Typography variant=\"h6\">Tag Spending Insights</Typography>\n {unbudgetedCount > 0 && (\n <Chip\n label={`${unbudgetedCount} unbudgeted`}\n size=\"small\"\n color=\"warning\"\n sx={{ ml: 'auto' }}\n />\n )}\n </Box>\n\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Discover spending patterns and create budgets for frequently used tags.\n </Typography>\n\n <Divider sx={{ mb: 2 }} />\n\n {/* Insights List */}\n {visibleInsights.map((insight) => {\n const trendConfig = getTrendConfig(insight.trend, theme);\n\n return (\n <Box\n key={insight.id}\n data-testid={`tag-insight-${insight.id}`}\n sx={{\n p: 2,\n mb: 2,\n bgcolor: insight.isBudgeted\n ? alpha(theme.palette.success.main, 0.05)\n : alpha(theme.palette.warning.main, 0.05),\n borderRadius: 1,\n borderLeft: insight.isBudgeted\n ? `4px solid ${theme.palette.success.main}`\n : `4px solid ${theme.palette.warning.main}`,\n }}\n >\n {/* Tag Header */}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <LocalOfferIcon fontSize=\"small\" color=\"action\" />\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 'bold' }}>\n {insight.tagName}\n </Typography>\n {insight.isBudgeted && (\n <Chip label=\"Budgeted\" size=\"small\" color=\"success\" variant=\"outlined\" />\n )}\n {!insight.isBudgeted && (\n <Chip label=\"No Budget\" size=\"small\" color=\"warning\" variant=\"outlined\" />\n )}\n </Box>\n\n {/* Spending Info */}\n <Box sx={{ mb: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 0.5 }}>\n {insight.recommendation}\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mt: 1 }}>\n <Typography variant=\"h6\" color=\"primary\">\n {currencyFormatter(insight.averageMonthlySpend)}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n avg/month\n </Typography>\n </Box>\n </Box>\n\n {/* Statistics */}\n <Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap', mb: 2 }}>\n <Chip\n label={`${insight.transactionCount} transactions`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`${insight.monthsAnalyzed} months`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n icon={<TrendingUpIcon />}\n label={`${trendConfig.label} ${Math.abs(insight.trendPercentage).toFixed(0)}%`}\n size=\"small\"\n sx={{\n bgcolor: trendConfig.bgColor,\n color: trendConfig.color,\n borderColor: trendConfig.color,\n }}\n variant=\"outlined\"\n />\n </Box>\n\n {/* Actions */}\n <Box sx={{ display: 'flex', gap: 1, justifyContent: 'flex-end' }}>\n {onDismiss && (\n <Button size=\"small\" onClick={() => onDismiss(insight)}>\n Dismiss\n </Button>\n )}\n {onViewDetails && (\n <Button size=\"small\" onClick={() => onViewDetails(insight)}>\n View Details\n </Button>\n )}\n {!insight.isBudgeted && onCreateBudget && (\n <Button\n size=\"small\"\n variant=\"contained\"\n startIcon={<AddIcon />}\n onClick={() => onCreateBudget(insight)}\n >\n Create Budget\n {insight.suggestedBudget &&\n ` (${currencyFormatter(insight.suggestedBudget)})`}\n </Button>\n )}\n </Box>\n </Box>\n );\n })}\n\n {/* Show More Indicator */}\n {insights.length > maxVisible && (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ textAlign: 'center', display: 'block', mt: 1 }}\n >\n Showing {maxVisible} of {insights.length} insights\n </Typography>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * BudgetOverviewMessage\n *\n * Summary message component for budget overview.\n * Migrated from legacy Budgets/OverviewMessage.js with modern React patterns.\n *\n * Features:\n * - Contextual budget status messages\n * - Multi-budget summary insights\n * - Actionable recommendations\n * - Visual state indicators\n * - Material-UI v7 theming\n *\n * Migration Notes:\n * - Legacy: Simple string-based message component\n * - Modern: Rich message component with TypeScript and theming\n * - Added: State-based styling, icons, action buttons\n */\n\nimport { Alert, Typography, Button } from '@mui/material';\n\nexport type OverviewMessageType = 'success' | 'warning' | 'error' | 'info';\n\nexport interface BudgetOverviewData {\n /**\n * Total number of budgets\n */\n totalBudgets: number;\n\n /**\n * Number of budgets over limit\n */\n budgetsOver: number;\n\n /**\n * Number of budgets on track\n */\n budgetsOnTrack: number;\n\n /**\n * Number of budgets under limit\n */\n budgetsUnder: number;\n\n /**\n * Total amount over all budgets (negative if over, positive if under)\n */\n totalOverUnder: number;\n\n /**\n * Number of unbudgeted tags with significant spending\n */\n unbudgetedTagsCount?: number;\n}\n\nexport interface BudgetOverviewMessageProps {\n /**\n * Budget overview data\n */\n data: BudgetOverviewData;\n\n /**\n * Callback when primary action clicked\n */\n onAction?: () => void;\n\n /**\n * Custom action button label\n */\n actionLabel?: string;\n\n /**\n * Currency formatter\n */\n currencyFormatter?: (value: number) => string;\n\n /**\n * Hide action button\n * @default false\n */\n hideAction?: boolean;\n}\n\n/**\n * Default currency formatter\n */\nconst defaultCurrencyFormatter = (value: number): string => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(Math.abs(value));\n};\n\n/**\n * Determine message type and content based on budget data\n */\nfunction getOverviewMessage(\n data: BudgetOverviewData,\n currencyFormatter: (value: number) => string\n): {\n type: OverviewMessageType;\n title: string;\n message: string;\n defaultActionLabel: string;\n} {\n const { totalBudgets, budgetsOver, budgetsOnTrack, budgetsUnder, totalOverUnder, unbudgetedTagsCount } = data;\n\n // No budgets\n if (totalBudgets === 0) {\n return {\n type: 'info',\n title: 'No Budgets Yet',\n message: 'Create your first budget to start tracking your spending and reach your financial goals.',\n defaultActionLabel: 'Create Budget',\n };\n }\n\n // All budgets critical/over\n if (budgetsOver === totalBudgets && totalOverUnder < 0) {\n return {\n type: 'error',\n title: 'All Budgets Over Limit',\n message: `You've exceeded all ${totalBudgets} budget${totalBudgets > 1 ? 's' : ''} by ${currencyFormatter(totalOverUnder)} total. Review your spending and adjust budgets as needed.`,\n defaultActionLabel: 'Review Budgets',\n };\n }\n\n // Some budgets over\n if (budgetsOver > 0) {\n return {\n type: 'warning',\n title: `${budgetsOver} Budget${budgetsOver > 1 ? 's' : ''} Over Limit`,\n message: `You're over budget on ${budgetsOver} of ${totalBudgets} budgets by ${currencyFormatter(totalOverUnder)} total. Consider adjusting these budgets.`,\n defaultActionLabel: 'View Details',\n };\n }\n\n // All budgets on track\n if (budgetsOnTrack === totalBudgets) {\n const unbudgetedMsg = unbudgetedTagsCount && unbudgetedTagsCount > 0\n ? ` You have ${unbudgetedTagsCount} unbudgeted tag${unbudgetedTagsCount > 1 ? 's' : ''} worth reviewing.`\n : '';\n return {\n type: 'success',\n title: 'All Budgets On Track',\n message: `Great job! All ${totalBudgets} budget${totalBudgets > 1 ? 's are' : ' is'} on track.${unbudgetedMsg}`,\n defaultActionLabel: unbudgetedTagsCount && unbudgetedTagsCount > 0 ? 'Review Tags' : 'View Budgets',\n };\n }\n\n // Under budget\n if (budgetsUnder > 0 && budgetsOver === 0) {\n return {\n type: 'success',\n title: 'Budgets Under Control',\n message: `You're under budget by ${currencyFormatter(totalOverUnder)} total across ${budgetsUnder} budget${budgetsUnder > 1 ? 's' : ''}. Keep up the great work!`,\n defaultActionLabel: 'View Details',\n };\n }\n\n // Mixed state (some on track, some under)\n return {\n type: 'info',\n title: 'Budgets Status',\n message: `${budgetsOnTrack} on track, ${budgetsUnder} under budget. You're managing your budgets well overall.`,\n defaultActionLabel: 'View All Budgets',\n };\n}\n\n/**\n * Budget overview message component\n *\n * Displays contextual summary message based on budget status.\n * Provides actionable insights and recommendations.\n *\n * @example\n * ```tsx\n * <BudgetOverviewMessage\n * data={{\n * totalBudgets: 5,\n * budgetsOver: 2,\n * budgetsOnTrack: 2,\n * budgetsUnder: 1,\n * totalOverUnder: -150,\n * unbudgetedTagsCount: 3,\n * }}\n * onAction={() => navigate('/budgets')}\n * />\n * ```\n */\nexport function BudgetOverviewMessage({\n data,\n onAction,\n actionLabel,\n currencyFormatter = defaultCurrencyFormatter,\n hideAction = false,\n}: BudgetOverviewMessageProps) {\n const overview = getOverviewMessage(data, currencyFormatter);\n\n const severityMap: Record<OverviewMessageType, 'success' | 'warning' | 'error' | 'info'> = {\n success: 'success',\n warning: 'warning',\n error: 'error',\n info: 'info',\n };\n\n return (\n <Alert\n data-testid=\"budget-overview-message\"\n severity={severityMap[overview.type]}\n sx={{\n '& .MuiAlert-message': {\n width: '100%',\n },\n }}\n action={\n !hideAction && onAction ? (\n <Button\n color=\"inherit\"\n size=\"small\"\n onClick={onAction}\n sx={{ whiteSpace: 'nowrap' }}\n >\n {actionLabel || overview.defaultActionLabel}\n </Button>\n ) : undefined\n }\n >\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 'bold', mb: 0.5 }}>\n {overview.title}\n </Typography>\n <Typography variant=\"body2\">{overview.message}</Typography>\n </Alert>\n );\n}\n","/**\n * BudgetStepper\n *\n * Multi-step budget creation/editing form.\n * Migrated from legacy Budgets/Stepper.js with modern React patterns.\n *\n * Features:\n * - Three-step budget creation workflow\n * - Step 1: Basic info (name, amount)\n * - Step 2: Tags selection\n * - Step 3: Review and confirm\n * - Progress indicator\n * - Validation at each step\n * - Material-UI v7 Stepper component\n *\n * Migration Notes:\n * - Legacy: MobX form state with custom stepper logic\n * - Modern: React state with Material-UI Stepper\n * - Removed: MobX observables, custom validation\n * - Added: TypeScript types, modern hooks, comprehensive validation\n */\n\nimport { useState } from 'react';\nimport {\n Box,\n Stepper,\n Step,\n StepLabel,\n Button,\n TextField,\n Typography,\n Paper,\n Chip,\n Alert,\n Autocomplete,\n} from '@mui/material';\n\nexport interface BudgetFormData {\n /**\n * Budget name\n */\n name: string;\n\n /**\n * Budget amount\n */\n budgetAmount: number;\n\n /**\n * Selected tag names\n */\n tagNames: string[];\n\n /**\n * Show on dashboard\n * @default true\n */\n showOnDashboard?: boolean;\n}\n\nexport interface BudgetStepperProps {\n /**\n * Initial form data (for editing)\n */\n initialData?: Partial<BudgetFormData>;\n\n /**\n * Available tags for selection\n */\n availableTags: string[];\n\n /**\n * Callback when form is submitted\n */\n onSubmit: (data: BudgetFormData) => Promise<void>;\n\n /**\n * Callback when form is cancelled\n */\n onCancel?: () => void;\n\n /**\n * Whether form is in edit mode\n * @default false\n */\n editMode?: boolean;\n\n /**\n * Whether submission is in progress\n * @default false\n */\n submitting?: boolean;\n\n /**\n * Error message to display\n */\n error?: string | null;\n}\n\nconst steps = ['Basic Information', 'Select Tags', 'Review'];\n\n/**\n * Validate basic info step\n */\nfunction validateBasicInfo(name: string, budgetAmount: string): string | null {\n if (!name.trim()) {\n return 'Budget name is required';\n }\n if (name.trim().length < 3) {\n return 'Budget name must be at least 3 characters';\n }\n const amount = parseFloat(budgetAmount);\n if (isNaN(amount) || amount <= 0) {\n return 'Budget amount must be a positive number';\n }\n if (amount > 1000000) {\n return 'Budget amount cannot exceed $1,000,000';\n }\n return null;\n}\n\n/**\n * Validate tags step\n */\nfunction validateTags(tagNames: string[]): string | null {\n if (tagNames.length === 0) {\n return 'At least one tag is required';\n }\n if (tagNames.length > 10) {\n return 'Maximum 10 tags allowed';\n }\n return null;\n}\n\n/**\n * Budget stepper component\n *\n * Multi-step form for creating or editing budgets with validation.\n * Guides users through basic info, tag selection, and review steps.\n *\n * @example\n * ```tsx\n * <BudgetStepper\n * availableTags={['Groceries', 'Utilities', 'Entertainment']}\n * onSubmit={async (data) => {\n * await createBudget(data);\n * }}\n * onCancel={() => navigate('/budgets')}\n * />\n * ```\n */\nexport function BudgetStepper({\n initialData,\n availableTags,\n onSubmit,\n onCancel,\n editMode = false,\n submitting = false,\n error,\n}: BudgetStepperProps) {\n const [activeStep, setActiveStep] = useState(0);\n const [name, setName] = useState(initialData?.name || '');\n const [budgetAmount, setBudgetAmount] = useState(\n initialData?.budgetAmount?.toString() || ''\n );\n const [tagNames, setTagNames] = useState<string[]>(initialData?.tagNames || []);\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const handleNext = () => {\n setValidationError(null);\n\n // Validate current step\n if (activeStep === 0) {\n const error = validateBasicInfo(name, budgetAmount);\n if (error) {\n setValidationError(error);\n return;\n }\n } else if (activeStep === 1) {\n const error = validateTags(tagNames);\n if (error) {\n setValidationError(error);\n return;\n }\n }\n\n setActiveStep((prevStep) => prevStep + 1);\n };\n\n const handleBack = () => {\n setValidationError(null);\n setActiveStep((prevStep) => prevStep - 1);\n };\n\n const handleSubmit = async () => {\n const data: BudgetFormData = {\n name: name.trim(),\n budgetAmount: parseFloat(budgetAmount),\n tagNames,\n showOnDashboard: true,\n };\n\n await onSubmit(data);\n };\n\n const renderStepContent = (step: number) => {\n switch (step) {\n case 0:\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Enter basic budget information\n </Typography>\n\n <TextField\n label=\"Budget Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setValidationError(null);\n }}\n required\n fullWidth\n disabled={submitting}\n error={!!validationError && !name.trim()}\n helperText=\"e.g., Monthly Groceries, Car Maintenance\"\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Budget Amount\"\n type=\"number\"\n value={budgetAmount}\n onChange={(e) => {\n setBudgetAmount(e.target.value);\n setValidationError(null);\n }}\n required\n fullWidth\n disabled={submitting}\n error={!!validationError && !budgetAmount}\n helperText=\"Maximum spending limit for this budget\"\n InputProps={{\n startAdornment: <Typography sx={{ mr: 0.5 }}>$</Typography>,\n }}\n inputProps={{\n min: 0,\n step: 1,\n }}\n />\n </Box>\n );\n\n case 1:\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Select tags to track spending against this budget\n </Typography>\n\n <Autocomplete\n multiple\n options={availableTags}\n value={tagNames}\n onChange={(_, newValue) => {\n setTagNames(newValue);\n setValidationError(null);\n }}\n disabled={submitting}\n renderInput={(params) => (\n <TextField\n {...params}\n label=\"Tags\"\n placeholder=\"Select tags...\"\n required\n error={!!validationError && tagNames.length === 0}\n helperText=\"Choose tags related to this budget (e.g., Groceries, Dining Out)\"\n />\n )}\n renderTags={(value, getTagProps) =>\n value.map((option, index) => (\n <Chip\n label={option}\n {...getTagProps({ index })}\n key={option}\n />\n ))\n }\n />\n\n {tagNames.length > 0 && (\n <Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {tagNames.length} tag{tagNames.length > 1 ? 's' : ''} selected\n </Typography>\n </Box>\n )}\n </Box>\n );\n\n case 2:\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Review your budget before {editMode ? 'saving changes' : 'creating'}\n </Typography>\n\n <Paper sx={{ p: 2, bgcolor: 'background.default' }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n Budget Name\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: 2, fontWeight: 'medium' }}>\n {name}\n </Typography>\n\n <Typography variant=\"subtitle2\" gutterBottom>\n Budget Amount\n </Typography>\n <Typography variant=\"h6\" color=\"primary\" sx={{ mb: 2 }}>\n ${parseFloat(budgetAmount).toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}\n </Typography>\n\n <Typography variant=\"subtitle2\" gutterBottom>\n Tags ({tagNames.length})\n </Typography>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {tagNames.map((tag) => (\n <Chip key={tag} label={tag} size=\"small\" />\n ))}\n </Box>\n </Paper>\n </Box>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <Paper data-testid=\"budget-stepper\" sx={{ p: 3 }}>\n <Typography variant=\"h6\" gutterBottom>\n {editMode ? 'Edit Budget' : 'Create Budget'}\n </Typography>\n\n <Stepper activeStep={activeStep} sx={{ my: 3 }}>\n {steps.map((label) => (\n <Step key={label}>\n <StepLabel>{label}</StepLabel>\n </Step>\n ))}\n </Stepper>\n\n <Box sx={{ mt: 3, mb: 2 }}>\n {(validationError || error) && (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {validationError || error}\n </Alert>\n )}\n\n {renderStepContent(activeStep)}\n </Box>\n\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mt: 3 }}>\n <Box>\n {onCancel && (\n <Button onClick={onCancel} disabled={submitting}>\n Cancel\n </Button>\n )}\n </Box>\n\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button onClick={handleBack} disabled={activeStep === 0 || submitting}>\n Back\n </Button>\n\n {activeStep < steps.length - 1 ? (\n <Button variant=\"contained\" onClick={handleNext} disabled={submitting}>\n Next\n </Button>\n ) : (\n <Button\n variant=\"contained\"\n onClick={handleSubmit}\n disabled={submitting}\n >\n {submitting\n ? editMode\n ? 'Saving...'\n : 'Creating...'\n : editMode\n ? 'Save Changes'\n : 'Create Budget'}\n </Button>\n )}\n </Box>\n </Box>\n </Paper>\n );\n}\n"]}