@adrienhobbs/candlekit 0.2.2 → 0.2.4
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.d.ts +19 -2
- package/dist/index.js +84 -5
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/indicators/core/registry.ts","../src/indicators/core/calculator.ts","../src/indicators/primitives/BandsPrimitive.ts","../src/components/trade-markers.ts","../src/components/ChartComponent.tsx","../src/indicators/core/types.ts","../src/components/IndicatorBrowser.tsx","../src/components/IndicatorSettingsForm.tsx","../src/components/SettingsDialog.tsx","../src/hooks/useChartAPI.ts","../src/utils/barUtils.ts","../src/hooks/useBarsData.ts","../src/hooks/useRealtimeUpdates.ts","../src/indicators/core/persistence.ts","../src/indicators/utils/calculations.ts","../src/indicators/registry/sma.ts","../src/indicators/registry/ema.ts","../src/indicators/registry/rsi.ts","../src/indicators/registry/bollinger.ts","../src/indicators/registry/vwap.ts","../src/indicators/registry/stochastic.ts","../src/indicators/registry/obv.ts","../src/indicators/registry/mfi.ts","../src/indicators/registry/forceindex.ts","../src/indicators/registry/atr.ts","../src/indicators/registry/adx.ts","../src/indicators/registry/macd.ts","../src/indicators/registry/psar.ts","../src/indicators/registry/cci.ts","../src/indicators/registry/williamsr.ts","../src/indicators/registry/keltner.ts","../src/indicators/registry/supertrend.ts","../src/indicators/registry/ichimoku.ts","../src/indicators/registry/donchian.ts","../src/indicators/registry/roc.ts","../src/indicators/registry/stochrsi.ts","../src/indicators/registry/wma.ts","../src/indicators/registry/index.ts","../src/adapters/alpaca.ts","../src/adapters/mock.ts"],"names":["b","timeScale","IndicatorCategory","ChartSeriesType","useState","jsx","jsxs","useEffect","X","options","useRef","useCallback","appendBar","updateCurrentBar","prependBars","error","lastBar"],"mappings":";;;;;;;;;;;;;AAOA,IAAM,oBAAN,MAAwB;AAAA,EAAxB,WAAA,GAAA;AACE,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAA,sBAAmD,GAAA,EAAI,CAAA;AAC/D,IAAA,aAAA,CAAA,IAAA,EAAQ,kBAAA,sBAA4C,GAAA,EAAI,CAAA;AAAA,EAAA;AAAA,EAExD,SAAS,UAAA,EAAuC;AAC9C,IAAA,IAAI,KAAK,UAAA,CAAW,GAAA,CAAI,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA,EAAG;AAC/C,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,mBAAA,EAAsB,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA,qCAAA;AAAA,OAC9C;AAAA,IACF;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,UAAA,CAAW,QAAA,CAAS,IAAI,UAAU,CAAA;AAAA,EACxD;AAAA,EAEA,WAAW,EAAA,EAAqB;AAC9B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,CAAA;AAAA,EAClC;AAAA,EAEA,IAAI,EAAA,EAA6C;AAC/C,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAA,GAAgC;AAC9B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,EAC5C;AAAA,EAEA,cAAc,QAAA,EAAoD;AAChE,IAAA,OAAO,IAAA,CAAK,QAAO,CAAE,MAAA;AAAA,MACnB,CAAC,SAAA,KAAc,SAAA,CAAU,QAAA,CAAS,QAAA,KAAa;AAAA,KACjD;AAAA,EACF;AAAA,EAEA,OAAO,KAAA,EAAsC;AAC3C,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,IAAA,OAAO,IAAA,CAAK,QAAO,CAAE,MAAA;AAAA,MACnB,CAAC,SAAA,KACC,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,UAAU,CAAA,IACzD,UAAU,QAAA,CAAS,WAAA,CAAY,WAAA,EAAY,CAAE,SAAS,UAAU;AAAA,KACpE;AAAA,EACF;AAAA,EAEA,cAAA,CAAe,cAAsB,cAAA,EAAyD;AAC5F,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA;AACxC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,YAAY,CAAA,WAAA,CAAa,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,YAAY,CAAA,IAAK,CAAA;AAChE,IAAA,MAAM,WAAW,YAAA,GAAe,CAAA;AAChC,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,YAAA,EAAc,QAAQ,CAAA;AAEhD,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAE9C,IAAA,MAAM,kBAAuC,EAAC;AAC9C,IAAA,MAAA,CAAO,OAAA,CAAQ,WAAW,QAAQ,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC5D,MAAA,eAAA,CAAgB,GAAG,IAAI,KAAA,CAAM,YAAA;AAAA,IAC/B,CAAC,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,EAAE,GAAG,eAAA,EAAiB,GAAG,cAAA,EAAe;AAEzD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,UAAA;AAAA,MACJ,YAAA;AAAA,MACA,MAAM,CAAA,EAAG,UAAA,CAAW,QAAA,CAAS,IAAI,IAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,MAC7C;AAAA,KACF;AAAA,EACF;AAAA,EAEA,gBAAA,CAAiB,cAAsB,QAAA,EAAwC;AAC7E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA;AACxC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9D,MAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAE1B,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,QAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,IAAa,KAAA,GAAQ,KAAA,CAAM,KAAK,OAAO,KAAA;AACzD,QAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,IAAa,KAAA,GAAQ,KAAA,CAAM,KAAK,OAAO,KAAA;AAAA,MAC3D,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,SAAA,EAAW;AACnC,QAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,KAAA;AAAA,MACzC,WAAW,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,SAAS,WAAA,EAAa;AAC/D,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAAA,MACxC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,QAAA,IAAI,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAA,KAAO,GAAA,CAAI,KAAA,KAAU,KAAK,CAAA,EAAG;AACpE,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,eAAA,GAAuC;AACrC,IAAA,OAAO,KAAK,MAAA,EAAO,CAAE,IAAI,CAAC,SAAA,KAAc,UAAU,QAAQ,CAAA;AAAA,EAC5D;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAAA,EAC9B;AACF,CAAA;AAEO,IAAM,iBAAA,GAAoB,IAAI,iBAAA;;;AC1GrC,IAAM,sBAAN,MAA0B;AAAA,EAA1B,WAAA,GAAA;AACE,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,sBAAqC,GAAA,EAAI,CAAA;AAAA,EAAA;AAAA,EAEzC,aAAa,QAAA,EAAuC;AAC1D,IAAA,OAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,EAChC;AAAA,EAEA,SAAA,CACE,UACA,IAAA,EACmB;AACnB,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,CAAI,QAAA,CAAS,YAAY,CAAA;AAC9D,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,CAAA,sBAAA,EAAyB,SAAS,YAAY,CAAA,WAAA;AAAA,OAChD;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,QAAQ,CAAA;AACxD,IAAA,MAAM,WAAW,QAAA,CAAS,EAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AAEtC,IAAA,IACE,UACA,MAAA,CAAO,YAAA,KAAiB,gBACxB,MAAA,CAAO,UAAA,KAAe,KAAK,MAAA,EAC3B;AACA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,SAAA,CAAU,IAAA,EAAM,SAAS,QAAQ,CAAA;AAEzD,MAAA,IAAA,CAAK,KAAA,CAAM,IAAI,QAAA,EAAU;AAAA,QACvB,IAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAY,IAAA,CAAK;AAAA,OAClB,CAAA;AAED,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,CAAA,6BAAA,EAAgC,SAAS,YAAY,CAAA,EAAA,CAAA;AAAA,QACrD;AAAA,OACF;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,gBAAgB,UAAA,EAA2B;AACzC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,UAAU,CAAA;AAAA,IAC9B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AACF,CAAA;AAEO,IAAM,mBAAA,GAAsB,IAAI,mBAAA;;;AChDvC,IAAM,2BAAN,MAA+B;AAAA,EAI7B,YAAY,MAAA,EAAwB;AAHpC,IAAA,aAAA,CAAA,IAAA,EAAQ,SAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,EAAyB,IAAA,CAAA;AAG/B,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA,EAEA,MAAA,GAAS;AACP,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,YAAA;AAC7B,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,YAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,MAAA;AAE3B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,IAAW,CAAC,KAAA,EAAO;AAEpC,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,EAAU;AAElC,IAAA,MAAM,KAAA,GAAQ,QAAQ,IAAA,EAAK;AAC3B,IAAA,MAAM,KAAA,GAAQ,QAAQ,IAAA,EAAK;AAE3B,IAAA,MAAM,SAAsB,EAAC;AAE7B,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,IAAI,CAAA,GAAI,CAAA;AAER,IAAA,OAAO,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,CAAA,GAAI,MAAM,MAAA,EAAQ;AAC3C,MAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,MAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAElB,MAAA,IAAI,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,IAAA,EAAM;AACrB,QAAA,CAAA,EAAA;AAAA,MACF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,IAAA,EAAM;AAC5B,QAAA,CAAA,EAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,gBAAA,CAAiB,EAAA,CAAG,IAAI,CAAA;AAC5C,QAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,iBAAA,CAAkB,EAAA,CAAG,KAAK,CAAA;AAC7C,QAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,iBAAA,CAAkB,EAAA,CAAG,KAAK,CAAA;AAE7C,QAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,EAAA,KAAO,IAAA,IAAQ,OAAO,IAAA,EAAM;AAC5C,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,IAAI,CAAA;AAAA,QAC3B;AACA,QAAA,CAAA,EAAA;AACA,QAAA,CAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,MAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,SAAA,IAAa;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,OAAO,IAAI,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA;AAAA,EAChD;AACF,CAAA;AAEA,IAAM,2BAAN,MAA+B;AAAA,EAG7B,YAAY,IAAA,EAAuB;AAFnC,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,CAAA;AAGN,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA,EAEA,KAAK,MAAA,EAAa;AAChB,IAAA,MAAA,CAAO,wBAAA,CAAyB,CAAC,KAAA,KAAe;AAC9C,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,KAAK,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,EAAG;AAEnD,MAAA,MAAM,MAAM,KAAA,CAAM,OAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,oBAAA,EAAsB,KAAA,CAAM,kBAAkB,CAAA;AAE9D,MAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA;AAE1B,MAAA,GAAA,CAAI,SAAA,EAAU;AAEd,MAAA,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,GAAG,MAAA,CAAO,CAAC,EAAE,EAAE,CAAA;AAEpC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,QAAA,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,GAAG,MAAA,CAAO,CAAC,EAAE,EAAE,CAAA;AAAA,MACtC;AAEA,MAAA,KAAA,IAAS,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,QAAA,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,GAAG,MAAA,CAAO,CAAC,EAAE,EAAE,CAAA;AAAA,MACtC;AAEA,MAAA,GAAA,CAAI,SAAA,EAAU;AAEd,MAAA,GAAA,CAAI,SAAA,GAAY,KAAK,KAAA,CAAM,KAAA;AAC3B,MAAA,GAAA,CAAI,IAAA,EAAK;AAET,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IACd,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,eAAe,MAAA,EAAa;AAC1B,IAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,EAClB;AACF,CAAA;AAEO,IAAM,iBAAN,MAAuD;AAAA,EAQ5D,YAAY,OAAA,EAAgC;AAP5C,IAAA,aAAA,CAAA,IAAA,EAAA,UAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAA2B,IAAA,CAAA;AAC3B,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAqC,IAAA,CAAA;AACrC,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAA,CAAA;AAGN,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,WAAA;AAC5B,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,WAAA;AAC5B,IAAA,IAAA,CAAK,UAAA,GAAa,CAAC,IAAI,wBAAA,CAAyB,IAAI,CAAC,CAAA;AAAA,EACvD;AAAA,EAEA,SAAS,KAAA,EAA4C;AACnD,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,KAAA;AACpB,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,MAAA;AAAA,EACvB;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,CAAC,EAAA,KAAO,EAAA,CAAG,QAAQ,CAAA;AAAA,EAC7C;AACF,CAAA;;;AC1JA,IAAM,GAAA,GAAM,SAAA;AACZ,IAAM,IAAA,GAAO,SAAA;AACb,IAAM,GAAA,GAAM,SAAA;AAKL,SAAS,iBAAA,CAAkB,QAAsB,eAAA,EAAsD;AAC5G,EAAA,MAAM,UAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,QAAA,GAAW,EAAE,EAAA,KAAO,eAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,KAAY,KAAA,GAAQ,GAAA,GAAM,IAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,WAAW,GAAA,GAAM,IAAA;AAC/B,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA,EAAO,EAAE,SAAA,GAAY,GAAA;AAAA,MACrB,QAAA,EAAU,UAAA;AAAA,MAAY,KAAA,EAAO,SAAA;AAAA,MAAW,KAAA;AAAA,MACxC,IAAA,EAAM,WAAW,CAAA,EAAG,CAAA,CAAE,YAAY,KAAA,GAAQ,GAAA,GAAM,EAAE,CAAA,KAAA,CAAA,GAAU;AAAA,KAC7D,CAAA;AACD,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA,EAAO,EAAE,QAAA,GAAW,GAAA;AAAA,MACpB,QAAA,EAAU,UAAA;AAAA,MAAY,KAAA,EAAO,WAAA;AAAA,MAAa,KAAA;AAAA,MAC1C,IAAA,EAAM,WAAW,MAAA,GAAS;AAAA,KAC3B,CAAA;AAAA,EACH;AACA,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAO,CAAA,CAAE,IAAA,GAAmB,EAAE,IAAe,CAAA;AAC9D,EAAA,OAAO,OAAA;AACT;AC2Be,SAAR,cAAA,CAAgC;AAAA,EACrC,IAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,QAAQ,EAAC;AAAA,EACT,WAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA,GAAqB,IAAA;AAAA,EACrB,UAAA;AAAA,EACA,SAAS,EAAC;AAAA,EACV,eAAA,GAAkB,IAAA;AAAA,EAClB,gBAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAAwB;AACtB,EAAA,MAAM,iBAAA,GAAoB,OAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,OAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,oBAAA,GAAuB,OAAyC,IAAI,CAAA;AAC1E,EAAA,MAAM,eAAA,GAAkB,OAAuC,IAAI,CAAA;AACnE,EAAA,MAAM,kBAAA,GAAqB,MAAA,iBAAqC,IAAI,GAAA,EAAK,CAAA;AACzE,EAAA,MAAM,qBAAA,GAAwB,MAAA,iBAA4B,IAAI,GAAA,EAAK,CAAA;AACnE,EAAA,MAAM,gBAAA,GAAmB,OAAe,CAAC,CAAA;AACzC,EAAA,MAAM,aAAA,GAAgB,MAAA,iBAAgC,IAAI,GAAA,EAAK,CAAA;AAC/D,EAAA,MAAM,gBAAA,GAAmB,OAAY,IAAI,CAAA;AACzC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAyD,IAAI,CAAA;AACnG,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,IAAI,QAAA,iBAAsD,IAAI,KAAK,CAAA;AACzG,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA0B,IAAI,CAAA;AACpE,EAAA,MAAM,cAAA,GAAiB,OAAwB,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAA8C,IAAI,CAAA;AACpG,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAA+B,IAAI,CAAA;AAC7E,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAmB,EAAE,CAAA;AAC7C,EAAA,MAAM,qBAAA,GAAwB,OAAe,CAAC,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,OAAmB,IAAI,CAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,OAAO,KAAK,CAAA;AAClC,EAAA,MAAM,eAAA,GAAkB,OAAwC,IAAI,CAAA;AAGpE,EAAA,MAAM,SAAA,GAAY,OAA2B,MAAM,CAAA;AACnD,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAKpB,EAAA,MAAM,kBAAA,GAAqB,OAAO,KAAK,CAAA;AACvC,EAAA,kBAAA,CAAmB,OAAA,GAAU,OAAA,CAAQ,SAAA,IAAa,eAAe,CAAA;AAGjE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,kBAAkB,OAAA,EAAS;AAEhC,IAAA,iBAAA,CAAkB,OAAA,CAAQ,MAAM,QAAA,GAAW,UAAA;AAE3C,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,iBAAA,CAAkB,OAAA,EAAS;AAAA,MACnD,MAAA,EAAQ;AAAA,QACN,YAAY,EAAE,IAAA,EAAM,SAAA,CAAU,KAAA,EAAO,OAAO,SAAA,EAAU;AAAA,QACtD,SAAA,EAAW,SAAA;AAAA,QACX,KAAA,EAAO;AAAA,UACL,YAAA,EAAc,IAAA;AAAA,UACd,cAAA,EAAgB,SAAA;AAAA,UAChB,mBAAA,EAAqB;AAAA;AACvB,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,SAAA,EAAW,EAAE,KAAA,EAAO,SAAA,EAAU;AAAA,QAC9B,SAAA,EAAW,EAAE,KAAA,EAAO,SAAA;AAAU,OAChC;AAAA,MACA,KAAA,EAAO,kBAAkB,OAAA,CAAQ,WAAA;AAAA;AAAA;AAAA;AAAA,MAIjC,MAAA,EAAQ,MAAA,KAAW,iBAAA,CAAkB,OAAA,CAAQ,YAAA,IAAgB,GAAA,CAAA;AAAA,MAC7D,SAAA,EAAW;AAAA,QACT,WAAA,EAAa,IAAA;AAAA,QACb,cAAA,EAAgB,IAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,CAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,KAAA,EAAO,CAAA;AAAA,UACP,KAAA,EAAO,SAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AAAA,QACA,QAAA,EAAU;AAAA,UACR,KAAA,EAAO,CAAA;AAAA,UACP,KAAA,EAAO,SAAA;AAAA,UACP,KAAA,EAAO;AAAA;AACT;AACF,KACD,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,SAAA,CAAU,iBAAA,EAAmB;AAAA,MAC3D,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAW,SAAA;AAAA,MACX,aAAA,EAAe,KAAA;AAAA,MACf,WAAA,EAAa,SAAA;AAAA,MACb,aAAA,EAAe;AAAA,OACd,CAAC,CAAA;AAEJ,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,SAAA,CAAU,eAAA,EAAiB;AAAA,MACpD,KAAA,EAAO,SAAA;AAAA,MACP,WAAA,EAAa;AAAA,QACX,IAAA,EAAM;AAAA,OACR;AAAA,MACA,YAAA,EAAc;AAAA,OACb,CAAC,CAAA;AAEJ,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,IAAA,oBAAA,CAAqB,OAAA,GAAU,iBAAA;AAC/B,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAE1B,IAAA,gBAAA,CAAiB,OAAA,GAAU,mBAAA,CAAoB,iBAAA,EAAmB,EAAE,CAAA;AAEpE,IAAA,KAAA,CAAM,SAAA,EAAU,CAAE,kCAAA,CAAmC,CAAC,YAAA,KAAiB;AACrE,MAAA,IAAI,gBAAgB,YAAA,CAAa,IAAA,GAAO,KAAK,CAAC,YAAA,CAAa,WAAW,cAAA,EAAgB;AACpF,QAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,QAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,QAAA,qBAAA,CAAsB,OAAA,GAAU,QAAQ,OAAA,CAAQ,MAAA;AAChD,QAAA,MAAM,UAAA,GAAa,CAAC,GAAG,OAAA,CAAQ,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAChF,QAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,CAAC,CAAA,EAAG,SAAA;AACvC,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,cAAA,CAAe,eAAe,CAAA;AAAA,QAChC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAI,iBAAA,CAAkB,WAAW,KAAA,EAAO;AACtC,QAAA,MAAM,UAAA,GAAa,SAAA,CAAU,OAAA,IAAW,iBAAA,CAAkB,OAAA,CAAQ,YAAA;AAClE,QAAA,KAAA,CAAM,YAAA,CAAa;AAAA,UACjB,KAAA,EAAO,kBAAkB,OAAA,CAAQ,WAAA;AAAA;AAAA;AAAA,UAGjC,GAAI,SAAA,CAAU,OAAA,KAAY,MAAA,IAAa,UAAA,GAAa,IAAI,EAAE,MAAA,EAAQ,UAAA,EAAW,GAAI,EAAC;AAAA,UAClF,GAAI,UAAU,OAAA,KAAY,MAAA,GAAY,EAAE,MAAA,EAAQ,SAAA,CAAU,OAAA,EAAQ,GAAI;AAAC,SACxE,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAIA,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,YAAY,CAAA;AACtD,IAAA,cAAA,CAAe,OAAA,CAAQ,kBAAkB,OAAO,CAAA;AAEhD,IAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAkB;AAG3C,MAAA,IAAI,CAAC,mBAAmB,OAAA,EAAS;AACjC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,MAAA,IAAI,CAAC,qBAAqB,OAAA,EAAS;AACjC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,OAAA,CAAS,qBAAA,EAAsB;AAC9D,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAE3B,MAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,OAAA,CAAQ,iBAAA,CAAkB,CAAC,CAAA;AAE9D,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,cAAA,CAAe;AAAA,UACb,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAAA,UACpB,CAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACzC,MAAA,eAAA,CAAgB,UAAU,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AACvD,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACzC,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,QAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,OAAA,GAAU,eAAA,CAAgB,QAAQ,CAAC,CAAA;AACzD,QAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,OAAA,GAAU,eAAA,CAAgB,QAAQ,CAAC,CAAA;AACzD,QAAA,IAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,EAAG;AACpB,UAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,MAAA,cAAA,CAAe,IAAI,CAAA;AAEnB,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,qBAAqB,OAAA,EAAS;AACjC,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,OAAA,CAAS,qBAAA,EAAsB;AAC9D,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAE3B,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAU;AAC7C,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,gBAAA,CAAiB,CAAC,CAAA;AAE/C,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,UAAA;AAEpB,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAA,GAAA,KAAO;AAC7C,QAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAK,GAAA,CAAI,SAAA,GAAY,MAAQ,WAAW,CAAA;AAC1D,QAAA,OAAO,IAAA,GAAO,GAAA;AAAA,MAChB,CAAC,CAAA;AAED,MAAA,IAAI,UAAA,EAAY;AAEd,QAAA,IAAI,eAAe,OAAA,IAAW,cAAA,CAAe,OAAA,CAAQ,SAAA,KAAc,WAAW,SAAA,EAAW;AACvF,UAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,UAAA,cAAA,CAAe,IAAI,CAAA;AACnB,UAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,UAAA,CAAW,IAAI,CAAA;AAAA,UACjB;AAAA,QACF,CAAA,MAAO;AACL,UAAA,cAAA,CAAe,OAAA,GAAU,UAAA;AACzB,UAAA,cAAA,CAAe,UAAU,CAAA;AACzB,UAAA,MAAM,IAAA,GAAO,SAAA,CAAU,gBAAA,CAAkB,UAAA,CAAW,YAAY,GAAa,CAAA;AAC7E,UAAA,IAAI,SAAS,IAAA,EAAM;AACjB,YAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,GAAQ,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAChE,YAAA,oBAAA,CAAqB,EAAE,CAAA,EAAG,IAAA,GAAO,WAAW,CAAA,EAAG,KAAA,EAAO,UAAU,CAAA;AAAA,UAClE;AACA,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,UAAA,CAAW,UAAU,CAAA;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AACA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAC9C,IAAA,iBAAA,CAAkB,OAAA,CAAQ,gBAAA,CAAiB,aAAA,EAAe,iBAAA,EAAmB,IAAI,CAAA;AACjF,IAAA,iBAAA,CAAkB,OAAA,CAAQ,gBAAA,CAAiB,WAAA,EAAa,eAAA,EAAiB,IAAI,CAAA;AAC7E,IAAA,iBAAA,CAAkB,OAAA,CAAQ,gBAAA,CAAiB,WAAA,EAAa,eAAA,EAAiB,IAAI,CAAA;AAC7E,IAAA,iBAAA,CAAkB,OAAA,CAAQ,gBAAA,CAAiB,SAAA,EAAW,aAAA,EAAe,IAAI,CAAA;AACzE,IAAA,iBAAA,CAAkB,OAAA,CAAQ,gBAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,IAAI,CAAA;AAErE,IAAA,MAAM,YAAY,iBAAA,CAAkB,OAAA;AAEpC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,YAAY,CAAA;AACjD,MAAA,cAAA,CAAe,UAAA,EAAW;AAC1B,MAAA,SAAA,CAAU,mBAAA,CAAoB,aAAA,EAAe,iBAAA,EAAmB,IAAI,CAAA;AACpE,MAAA,SAAA,CAAU,mBAAA,CAAoB,WAAA,EAAa,eAAA,EAAiB,IAAI,CAAA;AAChE,MAAA,SAAA,CAAU,mBAAA,CAAoB,WAAA,EAAa,eAAA,EAAiB,IAAI,CAAA;AAChE,MAAA,SAAA,CAAU,mBAAA,CAAoB,SAAA,EAAW,aAAA,EAAe,IAAI,CAAA;AAC5D,MAAA,SAAA,CAAU,mBAAA,CAAoB,OAAA,EAAS,WAAA,EAAa,IAAI,CAAA;AACxD,MAAA,KAAA,CAAM,MAAA,EAAO;AAAA,IACf,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACpB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,MAAA,KAAW,MAAA,EAAW;AAC5C,MAAA,QAAA,CAAS,OAAA,CAAQ,YAAA,CAAa,EAAE,MAAA,EAAQ,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAOX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,YAAA,EAAc;AACxC,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,YAAY,CAAA;AACtD,IAAA,IAAI,CAAC,KAAA,EAAO;AAKZ,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,CAAA,IAAK,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAGA,EAAAA,KAAM,CAAA,CAAE,SAAA,GAAYA,EAAAA,CAAE,SAAS,CAAA,EAAG;AACnE,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,GAAA,CAAI,EAAE,SAAS,CAAA;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAS,CAAA;AAAA,IACzB;AACA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEzB,IAAA,MAAM,UAAA,GAAa,CAAC,EAAA,KAAe;AACjC,MAAA,IAAI,EAAA,GAAK,CAAA;AACT,MAAA,IAAI,EAAA,GAAK,OAAO,MAAA,GAAS,CAAA;AACzB,MAAA,IAAI,GAAA,GAAM,OAAO,MAAA,GAAS,CAAA;AAC1B,MAAA,OAAO,MAAM,EAAA,EAAI;AACf,QAAA,MAAM,GAAA,GAAO,KAAK,EAAA,IAAO,CAAA;AACzB,QAAA,IAAI,MAAA,CAAO,GAAG,CAAA,IAAK,EAAA,EAAI;AACrB,UAAA,GAAA,GAAM,GAAA;AACN,UAAA,EAAA,GAAK,GAAA,GAAM,CAAA;AAAA,QACb,CAAA,MAAO;AACL,UAAA,EAAA,GAAK,GAAA,GAAM,CAAA;AAAA,QACb;AAAA,MACF;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA;AAC3C,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,UAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAC,CAAA;AAC7D,IAAA,MAAM,GAAA,GAAM,EAAA;AACZ,IAAA,MAAM,GAAA,GAAM,sBAAsB,MAAM;AACtC,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,OAAA,EAAS,SAAA,EAAU,CAAE,sBAAA,CAAuB;AAAA,UACnD,MAAM,QAAA,GAAW,GAAA;AAAA,UACjB,IAAI,OAAA,GAAU;AAAA,SACf,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,qBAAqB,GAAG,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,YAAA,EAAc,MAAA,EAAQ,IAAI,CAAC,CAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,oBAAA,CAAqB,OAAA,IAAW,CAAC,gBAAgB,OAAA,EAAS;AAE/D,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AAErE,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ;AACjD,MAAA,MAAM,SAAS,GAAA,CAAI,IAAA,CAAK,OAAK,CAAA,CAAE,SAAA,KAAc,IAAI,SAAS,CAAA;AAC1D,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MACd;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,EAAG,EAAgB,CAAA;AAGnB,IAAA,MAAM,eAAe,eAAA,CAAgB,OAAA;AACrC,IAAA,MAAM,aAAA,GAAgB,aAAa,MAAA,KAAW,CAAA;AAC9C,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,MAAA,GAAS,YAAA,CAAa,MAAA;AACpD,IAAA,MAAM,iBAAiB,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,YAAA,CAAa,SAAS,CAAA,IACnE,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,CAAE,SAAA,KAAc,aAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA,CAAE,SAAA;AAGzF,IAAA,IAAI,YAAA,CAAa,OAAA,IAAW,UAAA,CAAW,MAAA,GAAS,sBAAsB,OAAA,EAAS;AAC7E,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB;AAEA,IAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,MAAA,MAAM,UAAA,GAAgC,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QAC7D,IAAA,EAAO,IAAI,SAAA,GAAY,GAAA;AAAA,QACvB,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,OAAO,GAAA,CAAI;AAAA,OACb,CAAE,CAAA;AAEF,MAAA,MAAM,UAAA,GAA8B,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QAC3D,IAAA,EAAO,IAAI,SAAA,GAAY,GAAA;AAAA,QACvB,OAAO,GAAA,CAAI,MAAA;AAAA,QACX,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,OAAO,WAAA,GAAc;AAAA,OAC/C,CAAE,CAAA;AAEF,MAAA,oBAAA,CAAqB,OAAA,CAAQ,QAAQ,UAAU,CAAA;AAC/C,MAAA,eAAA,CAAgB,OAAA,CAAQ,QAAQ,UAAU,CAAA;AAAA,IAC5C,WAAW,cAAA,IAAkB,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,CAAC,UAAA,EAAY;AACjE,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAChD,MAAA,MAAM,YAAA,GAAgC;AAAA,QACpC,IAAA,EAAO,QAAQ,SAAA,GAAY,GAAA;AAAA,QAC3B,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,OAAO,OAAA,CAAQ;AAAA,OACjB;AAEA,MAAA,MAAM,YAAA,GAA8B;AAAA,QAClC,IAAA,EAAO,QAAQ,SAAA,GAAY,GAAA;AAAA,QAC3B,OAAO,OAAA,CAAQ,MAAA;AAAA,QACf,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,OAAO,WAAA,GAAc;AAAA,OACvD;AAEA,MAAA,oBAAA,CAAqB,OAAA,CAAQ,OAAO,YAAY,CAAA;AAChD,MAAA,eAAA,CAAgB,OAAA,CAAQ,OAAO,YAAY,CAAA;AAAA,IAC7C;AAEA,IAAA,eAAA,CAAgB,OAAA,GAAU,UAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,qBAAqB,OAAA,EAAS;AAExD,IAAA,aAAA,CAAc,OAAA,CAAQ,OAAA,CAAQ,CAAC,SAAA,KAAc;AAC3C,MAAA,oBAAA,CAAqB,OAAA,EAAS,gBAAgB,SAAS,CAAA;AAAA,IACzD,CAAC,CAAA;AACD,IAAA,aAAA,CAAc,QAAQ,KAAA,EAAM;AAE5B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,OAAA,EAAS,eAAA,CAAgB;AAAA,QAC9D,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,SAAA,EAAY,KAAK,SAAA,IAAa,CAAA;AAAA,QAC9B,SAAA,EAAW,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAAA,QACtC,gBAAA,EAAkB,IAAA;AAAA,QAClB,KAAA,EAAO,KAAK,KAAA,IAAS;AAAA,OACtB,CAAA;AAED,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,aAAA,CAAc,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,SAAS,CAAA;AAAA,MAC9C;AAAA,IACF,CAAC,CAAA;AAED,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,IAAI,CAAC,oBAAA,CAAqB,OAAA,IAAW,CAAC,kBAAkB,OAAA,EAAS;AACjE,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,OAAA,CAAQ,qBAAA,EAAsB;AAC7D,MAAA,MAAM,YAAA,uBAAmB,GAAA,EAA4C;AACrE,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,QAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,OAAA,EAAS,iBAAA,CAAkB,KAAK,KAAK,CAAA;AACpE,QAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,EAAW;AACjC,UAAA,YAAA,CAAa,GAAA,CAAI,KAAK,EAAA,EAAI;AAAA,YACxB,GAAA,EAAK,KAAK,GAAA,GAAM,CAAA;AAAA,YAChB,KAAA,EAAO,OAAO,UAAA,GAAa,IAAA,CAAK,QAAQ,EAAA,GAAK,uBAAA,CAAwB,KAAK,KAAK;AAAA,WAChF,CAAA;AAAA,QACH;AAAA,MACF,CAAC,CAAA;AACD,MAAA,gBAAA,CAAiB,YAAY,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,qBAAqB,OAAA,EAAS;AAExD,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,IAAI,CAAC,oBAAA,CAAqB,OAAA,IAAW,CAAC,kBAAkB,OAAA,EAAS;AACjE,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,OAAA,CAAQ,qBAAA,EAAsB;AAC7D,MAAA,MAAM,YAAA,uBAAmB,GAAA,EAA4C;AACrE,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,QAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,OAAA,EAAS,iBAAA,CAAkB,KAAK,KAAK,CAAA;AACpE,QAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,EAAW;AACjC,UAAA,YAAA,CAAa,GAAA,CAAI,KAAK,EAAA,EAAI;AAAA,YACxB,GAAA,EAAK,KAAK,GAAA,GAAM,CAAA;AAAA,YAChB,KAAA,EAAO,OAAO,UAAA,GAAa,IAAA,CAAK,QAAQ,EAAA,GAAK,uBAAA,CAAwB,KAAK,KAAK;AAAA,WAChF,CAAA;AAAA,QACH;AAAA,MACF,CAAC,CAAA;AACD,MAAA,gBAAA,CAAiB,YAAY,CAAA;AAAA,IAC/B,CAAA;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAU,CAAE,kCAAA,CAAmC,eAAe,CAAA;AAC/E,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,eAAA,EAAiB,EAAE,OAAA,EAAS,MAAM,CAAA;AACpE,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,eAAe,CAAA;AAEjD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,OAAA,EAAS,SAAA,EAAU,CAAE,oCAAA,CAAqC,eAAe,CAAA;AAClF,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,eAAe,CAAA;AACpD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,eAAe,CAAA;AAAA,IACtD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AAEvB,IAAA,kBAAA,CAAmB,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC7C,MAAA,QAAA,CAAS,OAAA,EAAS,aAAa,MAAM,CAAA;AAAA,IACvC,CAAC,CAAA;AACD,IAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AACjC,IAAA,qBAAA,CAAsB,QAAQ,KAAA,EAAM;AACpC,IAAA,gBAAA,CAAiB,OAAA,GAAU,CAAA;AAE3B,IAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,KAAc;AAChC,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,CAAI,SAAA,CAAU,YAAY,CAAA;AAC/D,MAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,MAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,SAAA,CAAU,SAAA,EAAW,QAAQ,OAAO,CAAA;AACrE,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAEhC,MAAA,MAAM,UAAA,GAAa,WAAW,YAAA,CAAa,UAAA;AAC3C,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,YAAA,CAAa,OAAA,KAAY,KAAA;AACtD,MAAA,MAAM,SAAA,GAAY,SAAA,GAAY,CAAA,GAAI,gBAAA,CAAiB,OAAA;AAEnD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,SAAS,CAAA;AACzD,QAAA,gBAAA,CAAiB,OAAA,EAAA;AAAA,MACnB;AAEA,MAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,QAAA,IAAI,UAAA,CAAW,YAAA,CAAa,WAAA,KAAgB,CAAA,EAAG;AAC7C,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAS,SAAA,CAAU,UAAA,EAAY;AAAA,YACrD,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,KAAA,IAAS,SAAA;AAAA,YACnC,SAAA,EAAW,SAAA,CAAU,QAAA,CAAS,SAAA,IAAa,CAAA;AAAA,YAC3C,OAAO,SAAA,CAAU;AAAA,aAChB,SAAS,CAAA;AACZ,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAc,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAA;AACzE,UAAA,MAAA,CAAO,QAAQ,QAAsB,CAAA;AACrC,UAAA,kBAAA,CAAmB,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,MAAM,CAAA;AAAA,QACrD,WAAW,UAAA,CAAW,YAAA,CAAa,WAAA,IAAe,UAAA,CAAW,aAAa,SAAA,EAAW;AACnF,UAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,OAAO,UAAA,EAAW,GAAI,WAAW,YAAA,CAAa,SAAA;AAEzE,UAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAS,SAAA,CAAU,UAAA,EAAY;AAAA,YAC1D,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,UAAA,IAAc,SAAA;AAAA,YACxC,SAAA,EAAW,SAAA,CAAU,QAAA,CAAS,SAAA,IAAa,CAAA;AAAA,YAC3C,KAAA,EAAO,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,MAAA;AAAA,aACvB,SAAS,CAAA;AACZ,UAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAS,SAAA,CAAU,UAAA,EAAY;AAAA,YAC3D,OAAO,SAAA,CAAU,QAAA,CAAS,WAAA,IAAe,SAAA,CAAU,SAAS,SAAA,IAAa,SAAA;AAAA,YACzE,SAAA,EAAW,SAAA,CAAU,QAAA,CAAS,SAAA,IAAa,CAAA;AAAA,YAC3C,KAAA,EAAO,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,OAAA;AAAA,aACvB,SAAS,CAAA;AACZ,UAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAS,SAAA,CAAU,UAAA,EAAY;AAAA,YAC1D,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,UAAA,IAAc,SAAA;AAAA,YACxC,SAAA,EAAW,SAAA,CAAU,QAAA,CAAS,SAAA,IAAa,CAAA;AAAA,YAC3C,KAAA,EAAO,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,MAAA;AAAA,aACvB,SAAS,CAAA;AAEZ,UAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAc,KAAA,EAAO,CAAA,CAAE,UAAU,CAAA,EAAE,CAAE,EAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7G,UAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,QAAM,EAAE,IAAA,EAAM,EAAE,IAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAM,CAAE,EAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AACxG,UAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAc,KAAA,EAAO,CAAA,CAAE,UAAU,CAAA,EAAE,CAAE,EAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAE7G,UAAA,WAAA,CAAY,QAAQ,SAAuB,CAAA;AAC3C,UAAA,YAAA,CAAa,QAAQ,UAAwB,CAAA;AAC7C,UAAA,WAAA,CAAY,QAAQ,SAAuB,CAAA;AAE3C,UAAA,IAAI,SAAA,CAAU,QAAA,CAAS,QAAA,KAAa,KAAA,EAAO;AACzC,YAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe;AAAA,cACxC,WAAA;AAAA,cACA,WAAA;AAAA,cACA,SAAA,EAAW,SAAA,CAAU,QAAA,CAAS,SAAA,IAAa;AAAA,aAC5C,CAAA;AACD,YAAA,WAAA,CAAY,gBAAgB,cAAc,CAAA;AAAA,UAC5C;AAEA,UAAA,kBAAA,CAAmB,QAAQ,GAAA,CAAI,CAAA,EAAG,SAAA,CAAU,EAAE,UAAU,WAAW,CAAA;AACnE,UAAA,kBAAA,CAAmB,QAAQ,GAAA,CAAI,CAAA,EAAG,SAAA,CAAU,EAAE,WAAW,YAAY,CAAA;AACrE,UAAA,kBAAA,CAAmB,QAAQ,GAAA,CAAI,CAAA,EAAG,SAAA,CAAU,EAAE,UAAU,WAAW,CAAA;AAAA,QACrE;AAAA,MACF,CAAA,MAAA,IAAW,eAAe,WAAA,EAAa;AACrC,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAS,SAAA,CAAU,eAAA,EAAiB;AAAA,UAC1D,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,KAAA,IAAS,SAAA;AAAA,UACnC,OAAO,SAAA,CAAU;AAAA,WAChB,SAAS,CAAA;AACZ,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAc,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAA;AACzE,QAAA,MAAA,CAAO,QAAQ,QAA2B,CAAA;AAC1C,QAAA,kBAAA,CAAmB,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,MAAM,CAAA;AAAA,MACrD,CAAA,MAAA,IAAW,eAAe,MAAA,EAAQ;AAChC,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAS,SAAA,CAAU,UAAA,EAAY;AAAA,UACrD,QAAA,EAAU,SAAA,CAAU,QAAA,CAAS,QAAA,IAAY,WAAA;AAAA,UACzC,WAAA,EAAa,SAAA,CAAU,QAAA,CAAS,WAAA,IAAe,WAAA;AAAA,UAC/C,SAAA,EAAW,SAAA,CAAU,QAAA,CAAS,SAAA,IAAa,SAAA;AAAA,UAC3C,SAAA,EAAW,SAAA,CAAU,QAAA,CAAS,SAAA,IAAa,CAAA;AAAA,UAC3C,OAAO,SAAA,CAAU;AAAA,WAChB,SAAS,CAAA;AACZ,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAc,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAA;AACzE,QAAA,MAAA,CAAO,QAAQ,QAAsB,CAAA;AACrC,QAAA,kBAAA,CAAmB,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,MAAM,CAAA;AAAA,MACrD;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,UAAA,CAAW,WAAW,CAAA,EAAG;AAElD,IAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,KAAc;AAChC,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,CAAI,SAAA,CAAU,YAAY,CAAA;AAC/D,MAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,MAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,SAAA,CAAU,SAAA,EAAW,QAAQ,OAAO,CAAA;AACrE,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAEhC,MAAA,IAAI,UAAA,CAAW,YAAA,CAAa,WAAA,KAAgB,CAAA,EAAG;AAC7C,QAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,OAAA,CAAQ,GAAA,CAAI,UAAU,EAAE,CAAA;AAC1D,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAc,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAA;AACzE,UAAA,MAAA,CAAO,QAAQ,QAAe,CAAA;AAAA,QAChC;AAAA,MACF,WAAW,UAAA,CAAW,YAAA,CAAa,WAAA,IAAe,UAAA,CAAW,aAAa,SAAA,EAAW;AACnF,QAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,OAAO,UAAA,EAAW,GAAI,WAAW,YAAA,CAAa,SAAA;AAEzE,QAAA,MAAM,cAAc,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAA,EAAG,SAAA,CAAU,EAAE,CAAA,MAAA,CAAQ,CAAA;AAC1E,QAAA,MAAM,eAAe,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAA,EAAG,SAAA,CAAU,EAAE,CAAA,OAAA,CAAS,CAAA;AAC5E,QAAA,MAAM,cAAc,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAA,EAAG,SAAA,CAAU,EAAE,CAAA,MAAA,CAAQ,CAAA;AAE1E,QAAA,IAAI,WAAA,IAAe,gBAAgB,WAAA,EAAa;AAC9C,UAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAc,KAAA,EAAO,CAAA,CAAE,UAAU,CAAA,EAAE,CAAE,EAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7G,UAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,QAAM,EAAE,IAAA,EAAM,EAAE,IAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAM,CAAE,EAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AACxG,UAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAc,KAAA,EAAO,CAAA,CAAE,UAAU,CAAA,EAAE,CAAE,EAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAE7G,UAAA,WAAA,CAAY,QAAQ,SAAgB,CAAA;AACpC,UAAA,YAAA,CAAa,QAAQ,UAAiB,CAAA;AACtC,UAAA,WAAA,CAAY,QAAQ,SAAgB,CAAA;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,IAAA,EAAM,UAAU,CAAC,CAAA;AAErB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS;AAC/B,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,MAAA,EAAQ,eAAe,CAAA;AAC9D,IAAA,MAAM,eAAA,GACJ,sBAAsB,WAAA,GAClB;AAAA,MACE;AAAA,QACE,IAAA,EAAO,YAAY,SAAA,GAAY,GAAA;AAAA,QAC/B,QAAA,EAAU,UAAA;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM;AAAA;AACR,QAEF,EAAC;AACP,IAAA,MAAM,MAAM,CAAC,GAAG,YAAA,EAAc,GAAG,eAAe,CAAA,CAAE,IAAA;AAAA,MAChD,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,OAAmB,CAAA,CAAE;AAAA,KACpC;AACA,IAAA,gBAAA,CAAiB,OAAA,CAAQ,WAAW,GAAG,CAAA;AAAA,EACzC,GAAG,CAAC,MAAA,EAAQ,eAAA,EAAiB,WAAA,EAAa,kBAAkB,CAAC,CAAA;AAE7D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,WAAA,IAAe,CAAC,kBAAA,EAAoB;AAC5D,MAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,0BAA0B,MAAM;AACpC,MAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,WAAA,IAAe,CAAC,kBAAkB,OAAA,EAAS;AAErE,MAAA,MAAMC,UAAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAU;AAC7C,MAAA,MAAM,IAAA,GAAOA,UAAAA,CAAU,gBAAA,CAAkB,WAAA,CAAY,YAAY,GAAa,CAAA;AAE9E,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,OAAA,CAAQ,qBAAA,EAAsB;AAC7D,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,GAAQ,KAAK,MAAM,CAAA;AACrD,QAAA,oBAAA,CAAqB,EAAE,CAAA,EAAG,IAAA,GAAO,WAAW,CAAA,EAAG,KAAA,EAAO,UAAU,CAAA;AAAA,MAClE;AAAA,IACF,CAAA;AAEA,IAAA,uBAAA,EAAwB;AAExB,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAU;AAC7C,IAAA,SAAA,CAAU,mCAAmC,uBAAuB,CAAA;AAEpE,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAU,CAAE,oCAAA,CAAqC,uBAAuB,CAAA;AAAA,MAC3F;AAAA,IACF,CAAA;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,kBAAA,EAAoB,IAAA,CAAK,MAAM,CAAC,CAAA;AAEjD,EAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,eAAe,CAAA,IAAK,IAAA;AAEtE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,aAAA,EAAe;AACvC,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,aAAA,IAAiB,CAAC,kBAAkB,OAAA,EAAS;AACvE,MAAA,MAAMA,UAAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAU;AAC7C,MAAA,MAAM,CAAA,GAAIA,UAAAA,CAAU,gBAAA,CAAkB,aAAA,CAAc,YAAY,GAAa,CAAA;AAI7E,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,OAAA,CAAQ,qBAAA,EAAsB,CAAE,KAAA;AAChE,MAAA,gBAAA,CAAiB,CAAA,KAAM,QAAQ,CAAA,IAAK,CAAA,IAAK,KAAK,KAAA,GAAQ,EAAE,CAAA,EAAE,GAAI,IAAI,CAAA;AAAA,IACpE,CAAA;AAEA,IAAA,mBAAA,EAAoB;AACpB,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAU;AAC7C,IAAA,SAAA,CAAU,mCAAmC,mBAAmB,CAAA;AAChE,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAU,CAAE,oCAAA,CAAqC,mBAAmB,CAAA;AAAA,MACvF;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,aAAA,EAAe,SAAS,CAAC,CAAA;AAE5C,EAAA,MAAM,gBAAA,GAAmB,CAAC,MAAA,KAAmB;AAC3C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,MAAM,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,wBAAA,GAA2B,CAAC,IAAA,KAAyE;AACzG,IAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,MAAA,SAAA,CAAU,IAAA,EAAM,YAAY,KAAK,CAAA;AACjC,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,eAAA,EAAgB;AAChB,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,aAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oHAAA,EAAqH,QAAA,EAAA,sBAAA,EAEpI,CAAA;AAAA,oBAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,iBAAA,EAAmB,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,MAE/C,sBAAsB,iBAAA,oBACrB,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,iDAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAA,EAAA,CAAA;AAAA,YAC5B,KAAA,EAAO,CAAA,EAAG,iBAAA,CAAkB,KAAK,CAAA,EAAA,CAAA;AAAA,YACjC,UAAA,EAAY,0BAAA;AAAA,YACZ,UAAA,EAAY,mCAAA;AAAA,YACZ,WAAA,EAAa;AAAA;AACf;AAAA,OACF;AAAA,MAGD,aAAA,IAAiB,iBAAiB,gBAAA,oBACjC,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,mCAAA;AAAA,UACV,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,aAAA,CAAc,CAAC,CAAA,EAAA,CAAA,EAAM,GAAA,EAAK,CAAA,EAAG,SAAA,EAAW,kBAAA,EAAmB;AAAA,UAE5E,2BAAiB,aAAa;AAAA;AAAA;AACjC,KAAA,EAEJ,CAAA;AAAA,IAEC,gBAAgB,iBAAA,CAAkB,OAAA,IAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAChE,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACrC,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,MAAA,OAAO,YAAA;AAAA,wBACL,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,MAAM,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAA;AAAA,YACvC,SAAA,EAAU,+IAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,OAAA;AAAA,cACV,GAAA,EAAK,CAAA,EAAG,GAAA,CAAI,GAAA,GAAM,CAAC,CAAA,EAAA,CAAA;AAAA,cACnB,KAAA,EAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAA,CAAA;AAAA,cACnB,MAAA,EAAQ;AAAA,aACV;AAAA,YACA,KAAA,EAAM,aAAA;AAAA,YACP,QAAA,EAAA;AAAA,WAAA;AAAA,UAVM,IAAA,CAAK;AAAA,SAYZ;AAAA,QACA,QAAA,CAAS;AAAA,OACX;AAAA,IACF,CAAC,CAAA;AAAA,IAEA,WAAA,oBACC,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,4FAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,CAAA,EAAG,WAAA,CAAY,CAAC,CAAA,EAAA,CAAA;AAAA,UACtB,GAAA,EAAK,CAAA,EAAG,WAAA,CAAY,CAAC,CAAA,EAAA;AAAA,SACvB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4DAAA,EAA6D,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,YAClE,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,WAAA,EACrC,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,wBAAA,CAAyB,OAAO,CAAA;AAAA,cAC/C,SAAA,EAAU,wFAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,wBAAA,CAAyB,UAAU,CAAA;AAAA,cAClD,SAAA,EAAU,wFAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,wBAAA,CAAyB,YAAY,CAAA;AAAA,cACpD,SAAA,EAAU,wFAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAiC,CAAA;AAAA,0BAChD,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,wBAAA,CAAyB,SAAS,CAAA;AAAA,cACjD,SAAA,EAAU,wFAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,wBAAA,CAAyB,YAAY,CAAA;AAAA,cACpD,SAAA,EAAU,wFAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAiC,CAAA;AAAA,0BAChD,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,mBAAA;AAAA,cACT,SAAA,EAAU,sFAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AAOA,SAAS,wBAAwB,KAAA,EAAwB;AACvD,EAAA,IAAI,CAAC,OAAO,OAAO,CAAA;AACnB,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,GAAI,EAAA;AAC5B;AAEA,SAAS,aAAa,KAAA,EAAkD;AACtE,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,QAAA;AACH,MAAA,OAAO,SAAA,CAAU,MAAA;AAAA,IACnB,KAAK,QAAA;AACH,MAAA,OAAO,SAAA,CAAU,MAAA;AAAA,IACnB;AACE,MAAA,OAAO,SAAA,CAAU,KAAA;AAAA;AAEvB;ACp4BO,IAAK,iBAAA,qBAAAC,kBAAAA,KAAL;AACL,EAAAA,mBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,mBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,mBAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,mBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,mBAAA,aAAA,CAAA,GAAc,aAAA;AALJ,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAQL,IAAK,eAAA,qBAAAC,gBAAAA,KAAL;AACL,EAAAA,iBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,iBAAA,MAAA,CAAA,GAAO,MAAA;AAHG,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AAML,IAAM,sBAAA,GAAyB,EAAE,IAAA,CAAK;AAAA,EAC3C,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,kBAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAC;AAE5D,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAM,sBAAA;AAAA,EACN,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,EAChB,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAO,EAAG,CAAA,CAAE,MAAA,EAAO,EAAG,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA;AAAA,EAC3D,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,SAAS,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO,EAAE,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,EAAG,OAAO,CAAA,CAAE,MAAA,IAAU,CAAC,EAAE,QAAA;AACvE,CAAC;AAEM,IAAM,0BAA0B,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,kBAAkB;AAEvE,IAAM,uBAAA,GAA0B,EAAE,MAAA,CAAO;AAAA,EAC9C,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,EACf,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,EACtB,QAAA,EAAU,CAAA,CAAE,UAAA,CAAW,iBAAiB,CAAA;AAAA,EACxC,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,OAAO;AACrC,CAAC;AAEM,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EACzC,UAAA,EAAY,CAAA,CAAE,UAAA,CAAW,eAAe,CAAA;AAAA,EACxC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,CAAC,CAAA;AAAA,EACjC,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,EACjC,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAClC,SAAA,EAAW,EAAE,MAAA,CAAO;AAAA,IAClB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,IAChB,KAAA,EAAO,EAAE,MAAA;AAAO,GACjB,EAAE,QAAA;AACL,CAAC;AAmCM,IAAM,uBAAA,GAA0B,EAAE,MAAA,CAAO;AAAA,EAC9C,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA,EACvB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,EACf,QAAA,EAAU,EAAE,MAAA,CAAO,CAAA,CAAE,QAAO,EAAG,CAAA,CAAE,KAAK;AACxC,CAAC;ACtFc,SAAR,gBAAA,CAAkC;AAAA,EACvC,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAoC,KAAK,CAAA;AAEzF,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,OAAO,CAAC,KAAA,EAAO,GAAG,MAAA,CAAO,MAAA,CAAO,iBAAiB,CAAC,CAAA;AAAA,EACpD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,kBAAA,GAAqB,QAAQ,MAAM;AACvC,IAAA,IAAI,UAAA,GAAa,kBAAkB,MAAA,EAAO;AAE1C,IAAA,IAAI,qBAAqB,KAAA,EAAO;AAC9B,MAAA,UAAA,GAAa,UAAA,CAAW,MAAA;AAAA,QACtB,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAA,CAAS,QAAA,KAAa;AAAA,OACrC;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,MAAK,EAAG;AACtB,MAAA,UAAA,GAAa,iBAAA,CAAkB,OAAO,WAAW,CAAA;AACjD,MAAA,IAAI,qBAAqB,KAAA,EAAO;AAC9B,QAAA,UAAA,GAAa,UAAA,CAAW,MAAA;AAAA,UACtB,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAA,CAAS,QAAA,KAAa;AAAA,SACrC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAElC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,kBAAA,GAAqB,CAAC,YAAA,KAAyB;AACnD,IAAA,cAAA,CAAe,YAAY,CAAA;AAC3B,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,uBACEC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sCAAA,EAAuC,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,sBAClEA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,OAAA;AAAA,UACT,SAAA,EAAU,gDAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AACf,KAAA,EACF,CAAA;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,yDAAA;AAAA,YACV,IAAA,EAAM;AAAA;AAAA,SACR;AAAA,wBACAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,WAAA,EAAY,sBAAA;AAAA,YACZ,KAAA,EAAO,WAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC9C,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA;AAAA,sBAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,qBACfA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,OAAA,EAAS,MAAM,mBAAA,CAAoB,QAAqC,CAAA;AAAA,UACxE,SAAA,EAAW,CAAA,wEAAA,EACT,gBAAA,KAAqB,QAAA,GACjB,2BACA,gDACN,CAAA,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA,SAAA;AAAA,QARI;AAAA,OAUR,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACZ,QAAA,EAAA,kBAAA,CAAmB,MAAA,KAAW,CAAA,mBAC7BC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,OAAE,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,MACrB,+BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gBAAe,QAAA,EAAA,8CAAA,EAE5B;AAAA,KAAA,EAEJ,CAAA,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cACZ,QAAA,EAAA,kBAAA,CAAmB,GAAA,CAAI,CAAC,SAAA,qBACvBA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QAEC,SAAA;AAAA,QACA,KAAA,EAAO,MAAM,kBAAA,CAAmB,SAAA,CAAU,SAAS,EAAE;AAAA,OAAA;AAAA,MAFhD,UAAU,QAAA,CAAS;AAAA,KAI3B,GACH,CAAA,EAEJ;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAOA,SAAS,aAAA,CAAc,EAAE,SAAA,EAAW,KAAA,EAAM,EAAuB;AAC/D,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAgC;AACxD,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAA,OAAA;AACE,QAAA,OAAO,8BAAA;AAAA,MACT,KAAA,UAAA;AACE,QAAA,OAAO,kCAAA;AAAA,MACT,KAAA,YAAA;AACE,QAAA,OAAO,kCAAA;AAAA,MACT,KAAA,QAAA;AACE,QAAA,OAAO,gCAAA;AAAA,MACT,KAAA,aAAA;AACE,QAAA,OAAO,8BAAA;AAAA,MACT;AACE,QAAA,OAAO,gCAAA;AAAA;AACX,EACF,CAAA;AAEA,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,SAAA,CAAU,SAAS,IAAA,EAAK,CAAA;AAAA,wBACpEA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,WAAW,CAAA,wCAAA,EAA2C,gBAAA;AAAA,cACpD,UAAU,QAAA,CAAS;AAAA,aACpB,CAAA,CAAA;AAAA,YAEA,oBAAU,QAAA,CAAS;AAAA;AAAA;AACtB,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,wBAAA,EAA0B,QAAA,EAAA,SAAA,CAAU,SAAS,WAAA,EAAY;AAAA,KAAA,EACxE,CAAA;AAAA,oBACAC,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAU,4JAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,UAAE;AAAA;AAAA;AAAA;AAEpB,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACnKe,SAAR,qBAAA,CAAuC;AAAA,EAC5C,QAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,iBAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,qBACxCC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,+CAAA,EACd,gBAAM,KAAA,EACT,CAAA;AAAA,IACC,KAAA,CAAM,+BACLA,GAAAA,CAAC,OAAE,SAAA,EAAU,6BAAA,EAA+B,gBAAM,WAAA,EAAY,CAAA;AAAA,IAE/D,YAAY,GAAA,EAAK,KAAA,EAAO,aAAA,CAAc,GAAG,GAAG,QAAQ;AAAA,GAAA,EAAA,EAP7C,GAQV,CACD,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,WAAW,UAAA,EAAsD;AACxE,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,qDAAqD,CAAA;AAExF,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,CAAC,CAAC,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,CAAC,CAAC,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,CAAC,CAAC,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,UAAU,CAAC,CAAA,GAAI,WAAW,SAAA,CAAU,CAAC,CAAC,CAAA,GAAI,CAAA;AAEpD,IAAA,MAAM,GAAA,GAAM,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACnH,IAAA,OAAO,EAAE,GAAA,EAAK,OAAA,EAAS,KAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,EAAE;AAAA,EAC7C;AAEA,EAAA,OAAO,EAAE,GAAA,EAAK,UAAA,EAAY,OAAA,EAAS,GAAA,EAAI;AACzC;AAEA,SAAS,SAAA,CAAU,KAAa,OAAA,EAAyB;AACvD,EAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACtC,EAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACtC,EAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACtC,EAAA,MAAM,IAAI,OAAA,GAAU,GAAA;AAEpB,EAAA,OAAO,QAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA;AACpC;AAEA,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,YAAA,EAAc,UAAS,EAA4E;AAC/H,EAAA,MAAM,aAAa,KAAA,IAAS,YAAA;AAC5B,EAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,WAAW,UAAU,CAAA;AAE9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAID,SAAS,GAAG,CAAA;AAC5C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,OAAO,CAAA;AAExD,EAAA,MAAM,iBAAA,GAAoB,CAAC,MAAA,KAAmB;AAC5C,IAAA,WAAA,CAAY,MAAM,CAAA;AAClB,IAAA,QAAA,CAAS,SAAA,CAAU,MAAA,EAAQ,YAAY,CAAC,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,UAAA,KAAuB;AAClD,IAAA,eAAA,CAAgB,UAAU,CAAA;AAC1B,IAAA,QAAA,CAAS,SAAA,CAAU,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAqB;AAC7C,IAAA,MAAM,MAAA,GAAS,WAAW,QAAQ,CAAA;AAClC,IAAA,WAAA,CAAY,OAAO,GAAG,CAAA;AACtB,IAAA,eAAA,CAAgB,OAAO,OAAO,CAAA;AAC9B,IAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,QAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACjD,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,UAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAChD,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,GAAA,EAAI,GAAA;AAAA,UACJ,GAAA,EAAI,KAAA;AAAA,UACJ,KAAA,EAAO,YAAA;AAAA,UACP,QAAA,EAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,SAAS,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAC7D,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,QAAa;AAAA,OAAA,EAAC;AAAA,KAAA,EAC1E;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,CACP,GAAA,EACA,KAAA,EACA,KAAA,EACA,QAAA,EACA;AACA,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,QAAA;AACH,MAAA,uBACED,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAO,SAAS,KAAA,CAAM,YAAA;AAAA,UACtB,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,KAAK,UAAA,CAAW,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACzD,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,IAGJ,KAAK,OAAA;AACH,MAAA,uBACEA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,QAAA,EAAU,CAAC,QAAA,KAAa,QAAA,CAAS,KAAK,QAAQ;AAAA;AAAA,OAChD;AAAA,IAGJ,KAAK,SAAA;AACH,MAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,wCAAA,EACf,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,OAAA,EAAS,SAAS,KAAA,CAAM,YAAA;AAAA,YACxB,UAAU,CAAC,CAAA,KAAM,SAAS,GAAA,EAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,YAC/C,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BACb,QAAA,EAAA,KAAA,IAAS,KAAA,CAAM,YAAA,GAAe,SAAA,GAAY,UAAA,EAC7C;AAAA,OAAA,EACF,CAAA;AAAA,IAGJ,KAAK,QAAA;AACH,MAAA,uBACEA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,SAAS,KAAA,CAAM,YAAA;AAAA,UACtB,UAAU,CAAC,CAAA,KAAM,SAAS,GAAA,EAAK,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC7C,SAAA,EAAU,qIAAA;AAAA,UAET,QAAA,EAAA,KAAA,CAAM,OAAA,EAAS,GAAA,CAAI,CAAC,2BACnBA,GAAAA,CAAC,QAAA,EAAA,EAA0B,KAAA,EAAO,OAAO,KAAA,EACtC,QAAA,EAAA,MAAA,CAAO,KAAA,EAAA,EADG,MAAA,CAAO,KAEpB,CACD;AAAA;AAAA,OACH;AAAA,IAGJ,KAAK,WAAA;AACH,MAAA,uBACEC,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,SAAS,KAAA,CAAM,YAAA;AAAA,UACtB,UAAU,CAAC,CAAA,KAAM,SAAS,GAAA,EAAK,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC7C,SAAA,EAAU,qIAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BAC3BA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,UAAS,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BAC7BA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,UAAS,QAAA,EAAA,QAAA,EAAM;AAAA;AAAA;AAAA,OAC/B;AAAA,IAGJ;AACE,MAAA,uBACEA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,SAAS,KAAA,CAAM,YAAA;AAAA,UACtB,UAAU,CAAC,CAAA,KAAM,SAAS,GAAA,EAAK,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC7C,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA;AAGR;ACpLe,SAAR,cAAA,CAAgC;AAAA,EACrC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAID,QAAAA,CAA8B,EAAE,CAAA;AAEhE,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,WAAA,CAAY,EAAE,GAAG,SAAA,CAAU,QAAA,EAAU,CAAA;AAAA,IACvC;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW,OAAO,IAAA;AAElC,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,CAAI,SAAA,CAAU,YAAY,CAAA;AAC/D,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC7B,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,EAAa,KAAA,KAAe;AAChD,IAAA,WAAA,CAAY,CAAC,IAAA,MAAU;AAAA,MACrB,GAAG,IAAA;AAAA,MACH,CAAC,GAAG,GAAG;AAAA,KACT,CAAE,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,uBACEF,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sCAAA,EACX,QAAA,EAAA;AAAA,QAAA,SAAA,CAAU,IAAA;AAAA,QAAK;AAAA,OAAA,EAClB,CAAA;AAAA,sBACAD,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,OAAA;AAAA,UACT,SAAA,EAAU,gDAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAACG,CAAAA,EAAA,EAAE,MAAM,EAAA,EAAI;AAAA;AAAA;AACf,KAAA,EACF,CAAA;AAAA,oBAEAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,UAAU,UAAA,CAAW,QAAA;AAAA,QACrB,aAAA,EAAe,QAAA;AAAA,QACf,QAAA,EAAU;AAAA;AAAA,KACZ,EACF,CAAA;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,OAAA;AAAA,UACT,SAAA,EAAU,0DAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,0EAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACzEO,SAAS,YAAY,OAAA,EAA8B;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,QAAAA,CAAsB,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,QAAAA,CAA8B,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,IAAI,CAAA;AAE/C,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,MAAA,OAAA,CAAQ,kBAAA,CAAmB,cAAA,EAAe,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAC3D,QAAA,aAAA,CAAc,MAAM,CAAA;AACpB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,kBAAkB,CAAC,CAAA;AAEhC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,OAAA,EAAS,kBAAA,EAAoB;AAC7C,MAAA,OAAA,CAAQ,kBAAA,CAAmB,eAAe,UAAU,CAAA;AAAA,IACtD;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,kBAAkB,CAAC,CAAA;AAEvD,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CACE,EAAA,EACA,KAAA,EACAE,QAAAA,KAMG;AACH,MAAA,MAAM,OAAA,GAAqB;AAAA,QACzB,EAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA,EAAOA,UAAS,KAAA,IAAS,SAAA;AAAA,QACzB,SAAA,EAAWA,UAAS,SAAA,IAAa,CAAA;AAAA,QACjC,SAAA,EAAWA,UAAS,SAAA,IAAa,OAAA;AAAA,QACjC,OAAOA,QAAAA,EAAS;AAAA,OAClB;AACA,MAAA,QAAA,CAAS,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IACvC,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,EAAA,KAAe;AAC7C,IAAA,QAAA,CAAS,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,EAAA,EAAY,KAAA,KAAkB;AAC5D,IAAA,QAAA;AAAA,MAAS,CAAC,IAAA,KACR,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,CAAK,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,IAAA,EAAM,KAAA,KAAU,IAAK;AAAA,KACjE;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,EAAA,GAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAC9B,MAAA,OAAA,CAAQ,IAAI,KAAA,EAAO;AAAA,QACjB,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,EAAA,GAAK,CAAA,UAAA,EAAa,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAClC,MAAA,OAAA,CAAQ,IAAI,KAAA,EAAO;AAAA,QACjB,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,WAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,EAAA,GAAK,CAAA,YAAA,EAAe,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACpC,MAAA,OAAA,CAAQ,IAAI,KAAA,EAAO;AAAA,QACjB,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,aAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,EAAA,GAAK,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAI,KAAA,EAAO;AAAA,QACjB,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,SAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,EAAA,GAAK,CAAA,WAAA,EAAc,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACnC,MAAA,OAAA,CAAQ,IAAI,KAAA,EAAO;AAAA,QACjB,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,YAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,MAAsE,KAAA,KAAkB;AACvF,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,QAAA,WAAA,CAAY,KAAK,CAAA;AAAA,MACnB,CAAA,MAAA,IAAW,SAAS,YAAA,EAAc;AAChC,QAAA,aAAA,CAAc,KAAK,CAAA;AAAA,MACrB,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB,CAAA,MAAA,IAAW,SAAS,YAAA,EAAc;AAChC,QAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,MACzB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,WAAA,EAAa,aAAA,EAAe,gBAAgB,iBAAiB;AAAA,GAC9E;AAEA,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,YAAA,EAAsB,cAAA,KAAyC;AAC/F,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,cAAA,CAAe,YAAA,EAAc,cAAc,CAAA;AAC9E,IAAA,aAAA,CAAc,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,QAAQ,CAAC,CAAA;AAC3C,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,EAAA,KAAe;AAClD,IAAA,aAAA,CAAc,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,SAAA,KAAc,SAAA,CAAU,EAAA,KAAO,EAAE,CAAC,CAAA;AACvE,IAAA,mBAAA,CAAoB,gBAAgB,EAAE,CAAA;AAAA,EACxC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,uBAAA,GAA0B,WAAA;AAAA,IAC9B,CAAC,IAAY,QAAA,KAAkC;AAC7C,MAAA,aAAA;AAAA,QAAc,CAAC,SACb,IAAA,CAAK,GAAA;AAAA,UAAI,CAAC,cACR,SAAA,CAAU,EAAA,KAAO,KAAK,EAAE,GAAG,SAAA,EAAW,QAAA,EAAS,GAAI;AAAA;AACrD,OACF;AACA,MAAA,mBAAA,CAAoB,gBAAgB,EAAE,CAAA;AAAA,IACxC,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA;AAAA,IACA,mBAAA,EAAqB,SAAA;AAAA,IACrB,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC3LO,SAAS,YAAY,GAAA,EAA2B;AACrD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAE5C,EAAA,MAAM,WAAW,CAAC,WAAA,EAAa,QAAQ,MAAA,EAAQ,KAAA,EAAO,SAAS,QAAQ,CAAA;AACvE,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,IAAI,EAAE,KAAA,IAAS,GAAA,CAAA,EAAM,OAAO,KAAA;AAC5B,IAAA,IAAI,OAAO,GAAA,CAAI,KAAK,CAAA,KAAM,UAAU,OAAO,KAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,GAAA,CAAI,SAAA,IAAa,CAAA,EAAG,OAAO,KAAA;AAC/B,EAAA,IAAI,GAAA,CAAI,IAAA,IAAQ,CAAA,IAAK,GAAA,CAAI,IAAA,IAAQ,CAAA,IAAK,GAAA,CAAI,GAAA,IAAO,CAAA,IAAK,GAAA,CAAI,KAAA,IAAS,CAAA,EAAG,OAAO,KAAA;AAC7E,EAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAC3B,EAAA,IAAI,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,GAAA,EAAK,OAAO,KAAA;AAC/B,EAAA,IAAI,GAAA,CAAI,OAAO,GAAA,CAAI,IAAA,IAAQ,IAAI,IAAA,GAAO,GAAA,CAAI,OAAO,OAAO,KAAA;AACxD,EAAA,IAAI,GAAA,CAAI,MAAM,GAAA,CAAI,IAAA,IAAQ,IAAI,GAAA,GAAM,GAAA,CAAI,OAAO,OAAO,KAAA;AAEtD,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,WAAW,GAAA,EAA2B;AACpD,EAAA,OAAO,YAAY,GAAG,CAAA;AACxB;AAEO,SAAS,mBAAmB,SAAA,EAA2B;AAC5D,EAAA,IAAI,YAAY,IAAA,EAAa;AAC3B,IAAA,OAAO,SAAA,GAAY,GAAA;AAAA,EACrB;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,SAAS,IAAA,EAA8B;AACrD,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AAC3D;AAEO,SAAS,gBAAgB,IAAA,EAA8B;AAC5D,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AAEvC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA;AACvC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAC3E;AAEO,SAAS,SAAA,CAAU,cAA0B,OAAA,EAAiC;AACnF,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,YAAA,EAAc,GAAG,OAAO,CAAA;AAC5C,EAAA,OAAO,gBAAgB,OAAO,CAAA;AAChC;AAEO,SAAS,yBAAyB,IAAA,EAAyB;AAChE,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mCAAA,EAAsC,IAAA,CAAK,MAAM,CAAA,KAAA,CAAO,CAAA;AACpE,EAAA,MAAM,SAAA,GAAY,IAAA,CACf,MAAA,CAAO,CAAA,GAAA,KAAO;AACb,IAAA,IAAI,CAAC,WAAA,CAAY,GAAG,CAAA,EAAG;AACrB,MAAA,OAAA,CAAQ,IAAA,CAAK,qBAAqB,GAAG,CAAA;AACrC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,IACX,GAAG,GAAA;AAAA,IACH,SAAA,EAAW,kBAAA,CAAmB,GAAA,CAAI,SAAS;AAAA,GAC7C,CAAE,CAAA;AACJ,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,SAAA,CAAU,MAAM,CAAA,WAAA,CAAa,CAAA;AAChF,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,gBAAA,CAAiB,MAAkB,UAAA,EAAkC;AACnF,EAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,CAAU,OAAK,CAAA,CAAE,SAAA,KAAc,WAAW,SAAS,CAAA;AAEtE,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,OAAO,CAAC,GAAG,IAAA,EAAM,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,CAAA;AACxB,EAAA,OAAA,CAAQ,KAAK,CAAA,GAAI,UAAA;AACjB,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,SAAA,CAAU,MAAkB,MAAA,EAA8B;AACxE,EAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,OAAK,CAAA,CAAE,SAAA,KAAc,OAAO,SAAS,CAAA;AAC9D,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,CAAC,GAAG,IAAA,EAAM,MAAM,CAAA;AACzB;AAEO,SAAS,WAAA,CAAY,MAAkB,OAAA,EAAiC;AAC7E,EAAA,MAAM,kBAAA,GAAqB,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAA;AAC7D,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,kBAAA,CAAmB,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA;AAE9E,EAAA,OAAO,CAAC,GAAG,aAAA,EAAe,GAAG,IAAI,CAAA;AACnC;AAEO,SAAS,aAAa,IAAA,EAAmC;AAC9D,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,OAAO,KAAK,CAAC,CAAA;AACf;AAEO,SAAS,aAAa,IAAA,EAAmC;AAC9D,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAC7B;AAEO,SAAS,gBAAA,CACd,IAAA,EACA,UAAA,EACA,WAAA,EACY;AACZ,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,CAAA;AACxB,EAAA,MAAM,UAAU,EAAE,GAAG,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAE;AAEjD,EAAA,OAAA,CAAQ,KAAA,GAAQ,UAAA;AAChB,EAAA,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAM,UAAU,CAAA;AAChD,EAAA,OAAA,CAAQ,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,KAAK,UAAU,CAAA;AAC9C,EAAA,OAAA,CAAQ,MAAA,IAAU,WAAA;AAElB,EAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI,OAAA;AAC9B,EAAA,OAAO,OAAA;AACT;;;ACrFO,SAAS,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAsB;AAC/E,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,MAAA,GAAS,MAAA;AAAA,IACT,SAAA,GAAY,MAAA;AAAA,IACZ,SAAA,GAAY,KAAA;AAAA,IACZ,aAAA,GAAgB,KAAA;AAAA,IAChB,KAAA,GAAQ;AAAA,GACV,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,IAAA,EAAM,YAAY,CAAA,GAAIL,QAAAA,CAAqB,EAAE,CAAA;AACpD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,eAAA,GAAkBM,OAAoC,IAAI,CAAA;AAChE,EAAA,MAAM,YAAA,GAAeA,OAAO,IAAI,CAAA;AAChC,EAAA,MAAM,kBAAA,GAAqBA,OAAO,KAAK,CAAA;AACvC,EAAA,MAAM,aAAA,GAAgBA,OAAO,KAAK,CAAA;AAElC,EAAA,MAAM,OAAA,GAAUC,WAAAA,CAAY,CAAC,OAAA,KAAwB;AACnD,IAAA,MAAM,SAAA,GAAY,yBAAyB,OAAO,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,SAAS,SAAS,CAAA;AACjC,IAAA,YAAA,CAAa,MAAM,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAMC,UAAAA,GAAYD,WAAAA,CAAY,CAAC,GAAA,KAAkB;AAC/C,IAAA,YAAA,CAAa,CAAA,IAAA,KAAQ,SAAA,CAAc,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EAC/C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,WAAAA,CAAY,CAAC,GAAA,KAAkB;AACnD,IAAA,YAAA,CAAa,CAAA,IAAA,KAAQ;AACnB,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,CAAC,GAAG,CAAA;AAClC,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,CAAA;AACxB,MAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI,GAAA;AAC9B,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAME,iBAAAA,GAAmBF,WAAAA,CAAY,CAAC,UAAA,EAAoB,WAAA,KAAwB;AAChF,IAAA,YAAA,CAAa,CAAA,IAAA,KAAQ,gBAAA,CAAqB,IAAA,EAAM,UAAA,EAAY,WAAW,CAAC,CAAA;AAAA,EAC1E,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAMG,YAAAA,GAAcH,WAAAA,CAAY,CAAC,OAAA,KAAwB;AACvD,IAAA,MAAM,SAAA,GAAY,yBAAyB,OAAO,CAAA;AAClD,IAAA,YAAA,CAAa,CAAA,IAAA,KAAQ,WAAA,CAAgB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,EACvD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,YAAA,CAAa,EAAE,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,OAAO,MAAA,GAAwC,EAAC,KAAM;AACpD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,QAAA,CAAS,IAAI,KAAA,CAAM,qBAAqB,CAAC,CAAA;AACzC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AACzD,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,mCAAmC,MAAM,CAAA;AACrD,MAAA,OAAA,CAAQ,GAAA,CAAI,uBAAA,EAAyB,YAAA,CAAa,OAAO,CAAA;AACzD,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAoC;AAAA,UACxC,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,UACzB,SAAA,EAAW,OAAO,SAAA,IAAa,SAAA;AAAA,UAC/B,KAAA,EAAO,OAAO,KAAA,IAAS,KAAA;AAAA,UACvB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,OAAO,MAAA,CAAO;AAAA,SAChB;AAEA,QAAA,OAAA,CAAQ,GAAA,CAAI,6CAA6C,WAAW,CAAA;AACpE,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,mBAAA,CAAoB,WAAW,CAAA;AAC1D,QAAA,OAAA,CAAQ,GAAA,CAAI,oDAAA,EAAsD,IAAA,CAAK,MAAM,CAAA;AAE7E,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AACtD,UAAA,MAAM,SAAA,GAAY,yBAAyB,IAAI,CAAA;AAE/C,UAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,YAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,YAAA,YAAA,CAAa,CAAA,IAAA,KAAQ,WAAA,CAAgB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,UACvD,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,YAAA,MAAM,MAAA,GAAS,SAAS,SAAS,CAAA;AACjC,YAAA,YAAA,CAAa,MAAM,CAAA;AAAA,UACrB;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AAAA,QACzD;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,GAAA,CAAI,iBAAiB,GAAG,CAAA;AAChC,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,MAAMI,SAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,iCAAiC,CAAA;AACtF,UAAA,QAAA,CAASA,MAAK,CAAA;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoCA,MAAK,CAAA;AAAA,QACzD;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,gDAAA,EAAkD,YAAA,CAAa,OAAO,CAAA;AAClF,QAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AACtC,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAAA,QAChE;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,KAAK;AAAA,GACpC;AAEA,EAAA,MAAM,SAAA,GAAYJ,YAAY,MAAM;AAClC,IAAA,IAAI,CAAC,SAAS,iBAAA,EAAmB;AAC/B,MAAA,OAAA,CAAQ,KAAK,kDAAkD,CAAA;AAC/D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,OAAA,GAAU,OAAA,CAAQ,iBAAA,CAAkB,MAAA,EAAQ;AAAA,MAC1D,KAAA,EAAO,CAAC,GAAA,KAAQ;AACd,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAAC,WAAU,GAAG,CAAA;AAAA,QACf;AAAA,MACF,CAAA;AAAA,MACA,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,KAAW;AAC1B,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAAC,iBAAAA,CAAiB,OAAO,MAAM,CAAA;AAAA,QAChC;AAAA,MACF,CAAA;AAAA,MACA,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF,CAAA;AAAA,MACA,WAAW,MAAM;AACf,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,YAAA,CAAa,IAAI,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MACA,cAAc,MAAM;AAClB,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH,GAAG,CAAC,OAAA,EAAS,MAAA,EAAQD,UAAAA,EAAWC,iBAAgB,CAAC,CAAA;AAEjD,EAAA,MAAM,WAAA,GAAcF,YAAY,MAAM;AACpC,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,eAAA,CAAgB,QAAQ,WAAA,EAAY;AACpC,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,YAAY,YAAY;AACtC,IAAA,MAAM,eAAA,EAAgB;AAAA,EACxB,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAAJ,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,4CAA4C,SAAA,EAAW,UAAA,EAAY,CAAC,CAAC,OAAA,EAAS,kBAAA,EAAoB,kBAAA,CAAmB,OAAO,CAAA;AACxI,IAAA,IAAI,SAAA,IAAa,OAAA,IAAW,CAAC,kBAAA,CAAmB,OAAA,EAAS;AACvD,MAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,MAAA,eAAA,EAAgB;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,OAAA,EAAS,eAAe,CAAC,CAAA;AAExC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,aAAA,IAAiB,SAAS,iBAAA,EAAmB;AAC/C,MAAA,SAAA,EAAU;AAAA,IACZ;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,OAAA,EAAS,SAAA,EAAW,WAAW,CAAC,CAAA;AAEnD,EAAAA,UAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,QAAA,eAAA,CAAgB,QAAQ,WAAA,EAAY;AACpC,QAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,EAAAK,UAAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA,EAAAC,iBAAAA;AAAA,IACA,WAAA,EAAAC,YAAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AC3PO,SAAS,kBAAA,CACd,aACA,MAAA,EACA;AACA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIV,QAAAA,CAAqB,EAAE,CAAA;AAC/C,EAAA,MAAM,oBAAoBM,MAAAA,EAAe;AACzC,EAAA,MAAM,oBAAoBA,MAAAA,EAAe;AACzC,EAAA,MAAM,cAAA,GAAiBA,OAAe,CAAC,CAAA;AACvC,EAAA,MAAM,cAAA,GAAiBA,OAAO,KAAK,CAAA;AAEnC,EAAA,MAAMG,iBAAAA,GAAmBF,WAAAA,CAAY,CAAC,UAAA,EAAoB,WAAA,KAAwB;AAChF,IAAA,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChB,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,CAAA;AACxB,MAAA,MAAM,UAAU,EAAE,GAAG,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAE;AAEjD,MAAA,OAAA,CAAQ,KAAA,GAAQ,UAAA;AAChB,MAAA,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAM,UAAU,CAAA;AAChD,MAAA,OAAA,CAAQ,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,KAAK,UAAU,CAAA;AAC9C,MAAA,OAAA,CAAQ,MAAA,IAAU,WAAA;AAElB,MAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI,OAAA;AAC9B,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,WAAAA,CAAY,CAAC,MAAA,KAAqB;AAClD,IAAA,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChB,MAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,OAAK,CAAA,CAAE,SAAA,KAAc,OAAO,SAAS,CAAA;AAC9D,MAAA,IAAI,QAAQ,OAAO,IAAA;AACnB,MAAA,OAAO,CAAC,GAAG,IAAA,EAAM,MAAM,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAMG,YAAAA,GAAcH,WAAAA,CAAY,CAAC,OAAA,KAAwB;AACvD,IAAA,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChB,MAAA,MAAM,kBAAA,GAAqB,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAA;AAC7D,MAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,kBAAA,CAAmB,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA;AAC9E,MAAA,OAAO,CAAC,GAAG,aAAA,EAAe,GAAG,IAAI,CAAA;AAAA,IACnC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAmCA,WAAAA,CAAY,CAAC,YAAA,KAAiC;AAC/E,IAAA,MAAM,UAAA,GAAa,IAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,CAAA;AACd,IAAA,MAAM,SAAS,YAAA,IAAgB,KAAA,GAAQ,cAAc,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,CAAA,CAAA;AACzE,IAAA,OAAO,YAAA,GAAe,MAAA;AAAA,EACxB,CAAA,EAAG,EAAE;AAEL,EAAAJ,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAA,CAAe,OAAA,IAAW,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,OAAA,CAAQ,WAAW,CAAA;AACnB,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,IAAA,CAAK,WAAW,CAAA,EAAG;AAE1C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACpC,IAAA,cAAA,CAAe,UAAU,OAAA,CAAQ,SAAA;AAEjC,IAAA,iBAAA,CAAkB,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,MAAM;AACnD,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChB,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,QAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,CAAA;AACxB,QAAA,MAAM,aAAa,EAAE,GAAG,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAE;AAEpD,QAAA,MAAM,WAAW,UAAA,CAAW,KAAA,IAAS,KAAK,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,IAAA,CAAA;AACjE,QAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,GAAG,CAAA,GAAI,EAAA;AAEpD,QAAA,UAAA,CAAW,KAAA,GAAQ,QAAA;AACnB,QAAA,UAAA,CAAW,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAM,QAAQ,CAAA;AACpD,QAAA,UAAA,CAAW,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,KAAK,QAAQ,CAAA;AAClD,QAAA,UAAA,CAAW,MAAA,IAAU,SAAA;AAErB,QAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI,UAAA;AAC9B,QAAA,OAAO,OAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,OAAO,gBAAgB,CAAA;AAE1B,IAAA,iBAAA,CAAkB,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,MAAM;AACnD,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChB,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,QAAA,MAAMS,QAAAA,GAAU,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACpC,QAAA,MAAM,YAAA,GAAeA,QAAAA,CAAQ,SAAA,GAAY,MAAA,CAAO,gBAAA;AAEhD,QAAA,MAAM,WAAWA,QAAAA,CAAQ,KAAA,IAAS,KAAK,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,IAAA,CAAA;AAE9D,QAAA,MAAM,MAAA,GAAmB;AAAA,UACvB,SAAA,EAAW,YAAA;AAAA,UACX,MAAMA,QAAAA,CAAQ,KAAA;AAAA,UACd,IAAA,EAAM,QAAA;AAAA,UACN,GAAA,EAAK,IAAA,CAAK,GAAA,CAAIA,QAAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA,UACrC,KAAA,EAAO,QAAA;AAAA,UACP,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,GAAI,CAAA,GAAI;AAAA,SAC7C;AAEA,QAAA,cAAA,CAAe,OAAA,GAAU,YAAA;AACzB,QAAA,OAAO,CAAC,GAAG,IAAA,EAAM,MAAM,CAAA;AAAA,MACzB,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,OAAO,gBAAgB,CAAA;AAE1B,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,aAAA,CAAc,kBAAkB,OAAO,CAAA;AAAA,MACzC;AACA,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,aAAA,CAAc,kBAAkB,OAAO,CAAA;AAAA,MACzC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,kBAAkB,MAAA,CAAO,gBAAA,EAAkB,IAAA,CAAK,MAAM,CAAC,CAAA;AAElF,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,gBAAA,EAAAH,iBAAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA,EAAAC;AAAA,GACF;AACF;;;AC3HO,IAAM,iCAAN,MAAmE;AAAA,EAAnE,WAAA,GAAA;AACL,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAA,EAAa,kBAAA,CAAA;AAAA,EAAA;AAAA,EAErB,MAAM,eAAe,UAAA,EAAgD;AACnE,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AAC5C,MAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AAAA,IAClD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,KAAK,CAAA;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAM,cAAA,GAA+C;AACnD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AACvD,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACpC,MAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,SAAS,EAAC;AAAA,IAC3C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAClE,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,EAAA,EAA2B;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,EAAe;AAC7C,MAAA,MAAM,WAAW,UAAA,CAAW,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAO,EAAE,CAAA;AACzD,MAAA,MAAM,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAAA,IACpE;AAAA,EACF;AACF;AAEO,IAAM,yBAAN,MAA2D;AAAA,EAChE,MAAM,eAAe,UAAA,EAAgD;AAAA,EACrE;AAAA,EAEA,MAAM,cAAA,GAA+C;AACnD,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,MAAM,gBAAgB,EAAA,EAA2B;AAAA,EACjD;AACF;AAEO,SAAS,yBACd,IAAA,EACoB;AACpB,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,cAAA;AACH,MAAA,OAAO,IAAI,8BAAA,EAA+B;AAAA,IAC5C,KAAK,MAAA;AACH,MAAA,OAAO,IAAI,sBAAA,EAAuB;AAAA,IACpC;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,4BAAA,GAA+B,IAAI,CAAA;AAAA;AAEzD;;;ACnEO,SAAS,iBAAA,CAAkB,QAAkB,UAAA,EAA8B;AAChF,EAAA,MAAM,OAAA,GAAU,aAAa,MAAA,CAAO,MAAA;AACpC,EAAA,IAAI,OAAA,IAAW,GAAG,OAAO,MAAA;AACzB,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,OAAO,EAAE,IAAA,CAAK,GAAG,CAAA,EAAG,GAAG,MAAM,CAAA;AAChD;AAEO,SAAS,aAAA,CAAc,KAAe,MAAA,EAA0B;AACrE,EAAA,IAAI,MAAA,IAAU,GAAG,OAAO,GAAA;AACxB,EAAA,OAAO,CAAC,GAAG,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,GAAG,KAAA,CAAM,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAC1D;AAEO,SAAS,YAAA,CAAa,MAAkB,MAAA,EAA0B;AACvE,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,CAAA,GAAI,SAAS,CAAA,EAAG;AAClB,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,QAAA,GAAA,IAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA;AAAA,MACrB;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAAA,CAAa,MAAkB,MAAA,EAA0B;AACvE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,GAAa,KAAK,MAAA,GAAS,CAAA,CAAA;AAEjC,EAAA,IAAI,GAAA,GAAM,CAAA;AAGV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,CAAA,GAAI,SAAS,CAAA,EAAG;AAClB,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB,CAAA,MAAA,IAAW,CAAA,KAAM,MAAA,GAAS,CAAA,EAAG;AAC3B,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,QAAA,GAAA,IAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA;AAAA,MACrB;AACA,MAAA,GAAA,GAAM,GAAA,GAAM,MAAA;AACZ,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AACF,IACf,CAAA,MAAO;AACL,MAAA,GAAA,GAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,GAAQ,OAAO,UAAA,GAAa,GAAA;AAC3C,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAAA,CAAa,MAAkB,MAAA,EAA0B;AACvE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,QAAQ,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAK,CAAA;AAAA,EAChD;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,IAAI,MAAA,EAAQ;AACd,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,MAAA,GAAS,CAAA;AAEb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,MAAA,EAAQ,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACnC,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA;AAC5B,QAAA,IAAI,SAAS,CAAA,EAAG;AACd,UAAA,KAAA,IAAS,MAAA;AAAA,QACX,CAAA,MAAO;AACL,UAAA,MAAA,IAAU,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,MAAM,UAAU,KAAA,GAAQ,MAAA;AACxB,MAAA,MAAM,UAAU,MAAA,GAAS,MAAA;AAEzB,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,MAAM,KAAK,OAAA,GAAU,OAAA;AACrB,QAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,IAAO,CAAA,GAAI,EAAA,CAAA;AAC7B,QAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,0BAAA,CAA2B,QAAkB,MAAA,EAA0B;AACrF,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,IAAI,MAAA,GAAS,CAAA,IAAK,MAAM,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACxB,QAAA,IAAI,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG;AACf,UAAA,GAAA,IAAO,GAAA;AACP,UAAA,KAAA,EAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,OAAO,GAAA,GAAM,KAAA;AACnB,MAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACxB,QAAA,IAAI,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG;AACf,UAAA,cAAA,IAAkB,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,EAAM,CAAC,CAAA;AAAA,QAC1C;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,cAAA,GAAiB,KAAA;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,uBAAA,CACd,IAAA,EACA,MAAA,EACA,MAAA,EACwD;AACxD,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AACxC,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACtC,EAAA,MAAM,GAAA,GAAM,0BAAA,CAA2B,MAAA,EAAQ,MAAM,CAAA;AAErD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,KAAA,CAAM,OAAO,CAAC,CAAC,KAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AACrC,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,MAAA,CAAO,CAAC,IAAI,GAAA,CAAI,CAAC,IAAI,MAAM,CAAA;AACtC,MAAA,KAAA,CAAM,KAAK,MAAA,CAAO,CAAC,IAAI,GAAA,CAAI,CAAC,IAAI,MAAM,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM;AAChC;;;ACtJO,IAAM,YAAA,GAAoC;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,uEAAA;AAAA,IACb,QAAA,EAAA,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,2BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,EAAM,QAAA,CAAS,MAAM,CAAA;AACpD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,UAAU,CAAC;AAAA,KACpB,CAAE,CAAA;AAAA,EACJ;AACF;;;AC9CO,IAAM,YAAA,GAAoC;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,iEAAA;AAAA,IACb,QAAA,EAAA,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,oCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,EAAM,QAAA,CAAS,MAAM,CAAA;AACpD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,UAAU,CAAC;AAAA,KACpB,CAAE,CAAA;AAAA,EACJ;AACF;;;AC9CO,IAAM,YAAA,GAAoC;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,QAAA,EAAA,UAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,oCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,EAAM,QAAA,CAAS,MAAM,CAAA;AACpD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,UAAU,CAAC;AAAA,KACpB,CAAE,CAAA;AAAA,EACJ;AACF;;;AC9CO,IAAM,uBAAA,GAA+C;AAAA,EAC1D,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,4EAAA;AAAA,IACb,QAAA,EAAA,YAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,mCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,oBAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,yCAAA;AAAA,MACb,GAAA,EAAK,GAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,mBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,yBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,YAAA,EAAc,IAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,yBAAA;AAAA,MACd,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM,GAAI,uBAAA;AAAA,MAC/B,IAAA;AAAA,MACA,QAAA,CAAS,MAAA;AAAA,MACT,QAAA,CAAS;AAAA,KACX;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,MACf,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,MACd,KAAA,EAAO,MAAM,CAAC;AAAA,KAChB,CAAE,CAAA;AAAA,EACJ;AACF;;;ACzFA,SAAS,uBACP,IAAA,EACA;AAAA,EACE,KAAA,GAAQ,MAAA;AAAA,EACR,cAAA,GAAiB,CAAA;AAAA,EACjB,YAAA,GAAe;AACjB,CAAA,EAKA;AACA,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,EAAE,IAAA,EAAM,EAAC,EAAG,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAE1D,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,gBAA0B,EAAC;AAE/B,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAY;AAC3B,IAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAE,WAAA,EAAY,EAAG,CAAA,CAAE,QAAA,EAAS,EAAG,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA;AACzE,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,EAAU,IAAK,CAAA;AAClC,IAAA,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,UAAA,EAAW,GAAI,IAAI,MAAM,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAI,cAAA,EAAe,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MAAA,CAAA,CACR,IAAI,OAAA,EAAQ,GAAI,UAAU,OAAA,EAAQ,IAAK,QAAW,CAAA,IAAK;AAAA,KAC3D;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,GAAA,KAAkB;AAC7B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,CAAI,MAAA;AAClD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAA,CAAK,CAAA,GAAI,IAAA,KAAS,CAAA,EAAG,CAAC,CAAA,GAAI,IAAI,MAAM,CAAA;AAAA,EAC5E,CAAA;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,MAAM,WAAW,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,GAAA,GAAM,IAAI,KAAA,IAAS,CAAA;AAEnD,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,KAAA,KAAU,MAAA,EAAQ;AAC7B,MAAA,MAAM,OAAO,IAAI,IAAA,CAAK,KAAK,CAAA,GAAI,CAAC,EAAE,SAAS,CAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AACnC,MAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,SAAA,GACE,KAAK,OAAA,EAAQ,KAAM,IAAA,CAAK,OAAA,MACxB,IAAA,CAAK,QAAA,EAAS,KAAM,IAAA,CAAK,UAAS,IAClC,IAAA,CAAK,WAAA,EAAY,KAAM,KAAK,WAAA,EAAY;AAAA,MAC5C,CAAA,MAAA,IAAW,UAAU,QAAA,EAAU;AAC7B,QAAA,SAAA,GACE,OAAA,CAAQ,IAAI,CAAA,KAAM,OAAA,CAAQ,IAAI,KAC9B,IAAA,CAAK,WAAA,EAAY,KAAM,IAAA,CAAK,WAAA,EAAY;AAAA,MAC5C,CAAA,MAAA,IAAW,UAAU,SAAA,EAAW;AAC9B,QAAA,SAAA,GACE,IAAA,CAAK,QAAA,EAAS,KAAM,IAAA,CAAK,QAAA,MACzB,IAAA,CAAK,WAAA,EAAY,KAAM,IAAA,CAAK,WAAA,EAAY;AAAA,MAC5C;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,gBAAA,GAAmB,CAAA;AACnB,QAAA,aAAA,GAAgB,CAAA;AAChB,QAAA,aAAA,GAAgB,EAAC;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,aAAA,IAAiB,UAAU,GAAA,CAAI,MAAA;AAC/B,IAAA,gBAAA,IAAoB,GAAA,CAAI,MAAA;AACxB,IAAA,aAAA,CAAc,KAAK,OAAO,CAAA;AAE1B,IAAA,MAAM,YAAY,aAAA,GAAgB,gBAAA;AAClC,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAEnB,IAAA,IAAI,YAAA,IAAgB,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AAC5C,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAa,CAAA;AAC/B,MAAA,KAAA,CAAM,IAAA,CAAK,SAAA,GAAY,KAAA,GAAQ,cAAc,CAAA;AAC7C,MAAA,KAAA,CAAM,IAAA,CAAK,SAAA,GAAY,KAAA,GAAQ,cAAc,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAC9B;AAEO,IAAM,aAAA,GAAqC;AAAA,EAChD,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,6DAAA;AAAA,IACb,QAAA,EAAA,QAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,YAAA,EAAc,OAAA;AAAA,MACd,WAAA,EAAa,gCAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,QACjC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,QACnC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA;AAAU;AACvC,KACF;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,iBAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,yCAAA;AAAA,MACb,GAAA,EAAK,GAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,IAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,oBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,YAAA,EAAc,IAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,yBAAA;AAAA,MACd,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM,GAAI,uBAAuB,IAAA,EAAM;AAAA,MAC1D,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,gBAAgB,QAAA,CAAS,cAAA;AAAA,MACzB,cAAc,QAAA,CAAS;AAAA,KACxB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,MACb,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,MACd,KAAA,EAAO,MAAM,CAAC;AAAA,KAChB,CAAE,CAAA;AAAA,EACJ;AACF;AC9LO,IAAM,mBAAA,GAA2C;AAAA,EACtD,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,uBAAA;AAAA,IACN,WAAA,EAAa,sEAAA;AAAA,IACb,QAAA,EAAA,UAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,mCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,mBAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,mCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,EAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,eAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,eAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,8BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAEvC,IAAA,MAAM,cAAc,UAAA,CAAW;AAAA,MAC7B,IAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,cAAc,QAAA,CAAS;AAAA,KACxB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,WAAA,CAAY,CAAC,CAAA,EAAG,CAAA,IAAK,GAAA;AAAA,MAC5B,MAAA,EAAQ,WAAA,CAAY,CAAC,CAAA,EAAG,CAAA,IAAK;AAAA,KAC/B,CAAE,CAAA;AAAA,EACJ;AACF;ACzEO,IAAM,YAAA,GAAoC;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,iFAAA;AAAA,IACb,QAAA,EAAA,QAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AACvC,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,UAAU,CAAC,CAAA;AAE9C,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,EAAE,KAAA,EAAO,QAAQ,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,IAAK;AAAA,KACzB,CAAE,CAAA;AAAA,EACJ;AACF;ACzCO,IAAM,YAAA,GAAoC;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,yEAAA;AAAA,IACb,QAAA,EAAA,QAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,oCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AACvC,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,UAAU,CAAC,CAAA;AAE9C,IAAA,MAAM,YAAY,GAAA,CAAI;AAAA,MACpB,IAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,IAAK;AAAA,KACzB,CAAE,CAAA;AAAA,EACJ;AACF;AC1DO,IAAM,mBAAA,GAA2C;AAAA,EACtD,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,yDAAA;AAAA,IACb,QAAA,EAAA,QAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,kCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,+BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AACvC,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,UAAU,CAAC,CAAA;AAE9C,IAAA,MAAM,cAAc,UAAA,CAAW;AAAA,MAC7B,KAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,WAAA,CAAY,CAAC,CAAA,IAAK;AAAA,KAC3B,CAAE,CAAA;AAAA,EACJ;AACF;ACtDO,IAAM,YAAA,GAAoC;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,iDAAA;AAAA,IACb,QAAA,EAAA,YAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,oCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAEvC,IAAA,MAAM,YAAY,GAAA,CAAI;AAAA,MACpB,IAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,IAAK;AAAA,KACzB,CAAE,CAAA;AAAA,EACJ;AACF;ACxDO,IAAM,YAAA,GAAoC;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,qEAAA;AAAA,IACb,QAAA,EAAA,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,oCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAEvC,IAAA,MAAM,YAAY,GAAA,CAAI;AAAA,MACpB,IAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,EAAG,GAAA,IAAO;AAAA,KAC9B,CAAE,CAAA;AAAA,EACJ;AACF;ACxDO,IAAM,aAAA,GAAqC;AAAA,EAChD,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,4EAAA;AAAA,IACb,QAAA,EAAA,UAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,aAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,qBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,aAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,qBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,eAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,wBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,EAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,iBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,mBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,iBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,oCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAExC,IAAA,MAAM,aAAa,IAAA,CAAK;AAAA,MACtB,MAAA;AAAA,MACA,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,kBAAA,EAAoB,KAAA;AAAA,MACpB,cAAA,EAAgB;AAAA,KACjB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,UAAA,CAAW,CAAC,CAAA,EAAG,IAAA,IAAQ,GAAA;AAAA,MAC9B,MAAA,EAAQ,UAAA,CAAW,CAAC,CAAA,EAAG,MAAA,IAAU,GAAA;AAAA,MACjC,SAAA,EAAW,UAAA,CAAW,CAAC,CAAA,EAAG,SAAA,IAAa;AAAA,KACzC,CAAE,CAAA;AAAA,EACJ;AACF;ACxFO,IAAM,aAAA,GAAqC;AAAA,EAChD,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,WAAA,EAAa,sEAAA;AAAA,IACb,QAAA,EAAA,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,YAAA,EAAc,IAAA;AAAA,MACd,WAAA,EAAa,0BAAA;AAAA,MACb,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,GAAA;AAAA,MACd,WAAA,EAAa,6BAAA;AAAA,MACb,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AAEnC,IAAA,MAAM,aAAa,IAAA,CAAK;AAAA,MACtB,IAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,KAAK,QAAA,CAAS;AAAA,KACf,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,UAAA,CAAW,CAAC,CAAA,IAAK;AAAA,KAC1B,CAAE,CAAA;AAAA,EACJ;AACF;ACvDO,IAAM,YAAA,GAAoC;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,qFAAA;AAAA,IACb,QAAA,EAAA,aAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,oCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAEvC,IAAA,MAAM,YAAY,GAAA,CAAI;AAAA,MACpB,IAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,IAAK;AAAA,KACzB,CAAE,CAAA;AAAA,EACJ;AACF;ACxDO,IAAM,kBAAA,GAA0C;AAAA,EACrD,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,gFAAA;AAAA,IACb,QAAA,EAAA,UAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,4CAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,+BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAEvC,IAAA,MAAM,iBAAiB,SAAA,CAAU;AAAA,MAC/B,IAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,cAAA,CAAe,CAAC,CAAA,IAAK;AAAA,KAC9B,CAAE,CAAA;AAAA,EACJ;AACF;ACxDO,IAAM,wBAAA,GAAgD;AAAA,EAC3D,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,WAAA,EAAa,kEAAA;AAAA,IACb,QAAA,EAAA,YAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,8BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,4BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,aAAA,EAAe;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,8BAAA;AAAA,MACb,GAAA,EAAK,GAAA;AAAA,MACL,GAAA,EAAK,EAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,mBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,4BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,YAAA,EAAc,IAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,yBAAA;AAAA,MACd,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAEvC,IAAA,MAAM,gBAAgB,cAAA,CAAe;AAAA,MACnC,IAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,YAAY,QAAA,CAAS;AAAA,KACf,CAAA;AAER,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,aAAA,CAAc,CAAC,CAAA,EAAG,MAAA,IAAU,GAAA;AAAA,MACnC,KAAA,EAAO,aAAA,CAAc,CAAC,CAAA,EAAG,KAAA,IAAS,GAAA;AAAA,MAClC,KAAA,EAAO,aAAA,CAAc,CAAC,CAAA,EAAG,KAAA,IAAS;AAAA,KACpC,CAAE,CAAA;AAAA,EACJ;AACF;ACvGO,IAAM,mBAAA,GAA2C;AAAA,EACtD,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,8DAAA;AAAA,IACb,QAAA,EAAA,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,4BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,0BAAA;AAAA,MACb,GAAA,EAAK,GAAA;AAAA,MACL,GAAA,EAAK,EAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,8BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAEvC,IAAA,MAAM,mBAAmB,UAAA,CAAW;AAAA,MAClC,IAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,YAAY,QAAA,CAAS;AAAA,KACtB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,gBAAA,CAAiB,CAAC,CAAA,EAAG,UAAA,IAAc;AAAA,KAC5C,CAAE,CAAA;AAAA,EACJ;AACF;ACjEO,IAAM,iBAAA,GAAyC;AAAA,EACpD,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,kFAAA;AAAA,IACb,QAAA,EAAA,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,gBAAA,EAAkB;AAAA,MAChB,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,4BAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,4BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,qBAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,sBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,sBAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,mBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,qCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,uBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,iBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,8BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,IAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,aAAA;AAAA,MACP,YAAA,EAAc,yBAAA;AAAA,MACd,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AAEnC,IAAA,MAAM,iBAAiB,aAAA,CAAc;AAAA,MACnC,IAAA;AAAA,MACA,GAAA;AAAA,MACA,kBAAkB,QAAA,CAAS,gBAAA;AAAA,MAC3B,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,cAAA,CAAe,CAAC,CAAA,EAAG,UAAA,IAAc,GAAG,CAAA;AAC1E,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,cAAA,CAAe,CAAC,CAAA,EAAG,IAAA,IAAQ,GAAG,CAAA;AAC9D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,cAAA,CAAe,CAAC,CAAA,EAAG,KAAA,IAAS,GAAG,CAAA;AAChE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,cAAA,CAAe,CAAC,CAAA,EAAG,KAAA,IAAS,GAAG,CAAA;AAEhE,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,EAAO,QAAA,CAAS,YAAY,CAAA;AACjE,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,EAAO,QAAA,CAAS,YAAY,CAAA;AAEjE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,MACnB,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,MACZ,KAAA,EAAO,eAAe,CAAC,CAAA;AAAA,MACvB,KAAA,EAAO,eAAe,CAAC;AAAA,KACzB,CAAE,CAAA;AAAA,EACJ;AACF;ACnIO,IAAM,yBAAA,GAAiD;AAAA,EAC5D,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,mBAAA;AAAA,IACN,WAAA,EAAa,wEAAA;AAAA,IACb,QAAA,EAAA,YAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,6BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,mBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,4BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,YAAA,EAAc,IAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,yBAAA;AAAA,MACd,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAG,CAAA;AAEnC,IAAA,MAAM,iBAAiB,gBAAA,CAAiB;AAAA,MACtC,IAAA;AAAA,MACA,GAAA;AAAA,MACA,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,cAAA,CAAe,CAAC,CAAA,EAAG,MAAA,IAAU,GAAA;AAAA,MACpC,KAAA,EAAO,cAAA,CAAe,CAAC,CAAA,EAAG,KAAA,IAAS,GAAA;AAAA,MACnC,KAAA,EAAO,cAAA,CAAe,CAAC,CAAA,EAAG,KAAA,IAAS;AAAA,KACrC,CAAE,CAAA;AAAA,EACJ;AACF;ACrFO,IAAM,YAAA,GAAoC;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,oEAAA;AAAA,IACb,QAAA,EAAA,UAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,oCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAExC,IAAA,MAAM,YAAY,GAAA,CAAI;AAAA,MACpB,MAAA;AAAA,MACA,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,IAAK;AAAA,KACzB,CAAE,CAAA;AAAA,EACJ;AACF;ACpDO,IAAM,iBAAA,GAAyC;AAAA,EACpD,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,8DAAA;AAAA,IACb,QAAA,EAAA,UAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,4BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,mBAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,mCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,yBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,EAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,qCAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,EAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,eAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,eAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,8BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAExC,IAAA,MAAM,iBAAiB,aAAA,CAAc;AAAA,MACnC,MAAA;AAAA,MACA,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,kBAAkB,QAAA,CAAS,WAAA;AAAA,MAC3B,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,SAAS,QAAA,CAAS;AAAA,KACnB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,cAAA,CAAe,CAAC,CAAA,EAAG,CAAA,IAAK,GAAA;AAAA,MAC/B,MAAA,EAAQ,cAAA,CAAe,CAAC,CAAA,EAAG,CAAA,IAAK;AAAA,KAClC,CAAE,CAAA;AAAA,EACJ;AACF;ACzFO,IAAM,YAAA,GAAoC;AAAA,EAC/C,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,8DAAA;AAAA,IACb,QAAA,EAAA,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,2BAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,GAAA,EAAK,CAAA;AAAA,MACL,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAA,MAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AAExC,IAAA,MAAM,YAAY,GAAA,CAAI;AAAA,MACpB,MAAA;AAAA,MACA,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MAC3B,IAAA,EAAM,IAAI,SAAA,GAAY,GAAA;AAAA,MACtB,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,IAAK;AAAA,KACzB,CAAE,CAAA;AAAA,EACJ;AACF;;;ACnCO,SAAS,yBAAA,GAAkC;AAChD,EAAA,iBAAA,CAAkB,SAAS,YAAY,CAAA;AACvC,EAAA,iBAAA,CAAkB,SAAS,YAAY,CAAA;AACvC,EAAA,iBAAA,CAAkB,SAAS,YAAY,CAAA;AACvC,EAAA,iBAAA,CAAkB,SAAS,uBAAuB,CAAA;AAClD,EAAA,iBAAA,CAAkB,SAAS,aAAa,CAAA;AACxC,EAAA,iBAAA,CAAkB,SAAS,mBAAmB,CAAA;AAC9C,EAAA,iBAAA,CAAkB,SAAS,YAAY,CAAA;AACvC,EAAA,iBAAA,CAAkB,SAAS,YAAY,CAAA;AACvC,EAAA,iBAAA,CAAkB,SAAS,mBAAmB,CAAA;AAC9C,EAAA,iBAAA,CAAkB,SAAS,YAAY,CAAA;AACvC,EAAA,iBAAA,CAAkB,SAAS,YAAY,CAAA;AACvC,EAAA,iBAAA,CAAkB,SAAS,aAAa,CAAA;AACxC,EAAA,iBAAA,CAAkB,SAAS,aAAa,CAAA;AACxC,EAAA,iBAAA,CAAkB,SAAS,YAAY,CAAA;AACvC,EAAA,iBAAA,CAAkB,SAAS,kBAAkB,CAAA;AAC7C,EAAA,iBAAA,CAAkB,SAAS,wBAAwB,CAAA;AACnD,EAAA,iBAAA,CAAkB,SAAS,mBAAmB,CAAA;AAC9C,EAAA,iBAAA,CAAkB,SAAS,iBAAiB,CAAA;AAC5C,EAAA,iBAAA,CAAkB,SAAS,yBAAyB,CAAA;AACpD,EAAA,iBAAA,CAAkB,SAAS,YAAY,CAAA;AACvC,EAAA,iBAAA,CAAkB,SAAS,iBAAiB,CAAA;AAC5C,EAAA,iBAAA,CAAkB,SAAS,YAAY,CAAA;AACzC;;;ACEO,IAAM,mBAAN,MAAiD;AAAA,EAatD,YAAY,OAAA,EAAgC;AAZ5C,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,SAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,IAAA,EAAuB,IAAA,CAAA;AAC/B,IAAA,aAAA,CAAA,IAAA,EAAQ,mBAAA,EAAoB,CAAA,CAAA;AAC5B,IAAA,aAAA,CAAA,IAAA,EAAQ,sBAAA,EAAuB,CAAA,CAAA;AAC/B,IAAA,aAAA,CAAA,IAAA,EAAQ,gBAAA,EAAiB,GAAA,CAAA;AACzB,IAAA,aAAA,CAAA,IAAA,EAAQ,iBAAA,EAA2C,IAAA,CAAA;AACnD,IAAA,aAAA,CAAA,IAAA,EAAQ,eAAA,EAA+B,IAAA,CAAA;AACvC,IAAA,aAAA,CAAA,IAAA,EAAQ,eAAA,EAAgB,KAAA,CAAA;AAGtB,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,IAAU,CAAC,QAAQ,SAAA,EAAW;AACzC,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,6BAAA;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,yCAAA;AAAA,EAChC;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAAmD;AAC3E,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAQ,KAAA,EAAO,KAAA,GAAQ,KAAI,GAAI,MAAA;AAE1D,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,WAAA,EAAc,MAAM,CAAA,KAAA,CAAO,CAAA;AAC9D,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AAC3C,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,KAAA,CAAM,UAAU,CAAA;AAE9C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,UAAA,GAAa,IAAI,IAAA,CAAK,MAAM,EAAE,WAAA,EAAY;AAChD,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAA,EAAO,UAAU,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,KAAK,EAAE,WAAA,EAAY;AAC9C,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,SAAS,CAAA;AAAA,IACzC;AAEA,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AAElC,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,mBAAmB,IAAA,CAAK,MAAA;AAAA,MACxB,uBAAuB,IAAA,CAAK;AAAA,KAC9B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG,EAAE,SAAS,CAAA;AAExD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAAA,MACrE;AAEA,MAAA,MAAM,IAAA,GAA2B,MAAM,QAAA,CAAS,IAAA,EAAK;AACrD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAM,KAAK,EAAC;AAEnC,MAAA,OAAO,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,iBAAA,CAAkB,QAAgB,QAAA,EAAkD;AAClF,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAA;AAEvB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAEtB,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,MAAM,IAAA,CAAK,UAAA;AAAW,KACrC;AAAA,EACF;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,KAAK,EAAA,IAAM,IAAA,CAAK,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACpD,MAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AACzC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,EAAA,GAAK,IAAI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAElC,MAAA,IAAA,CAAK,EAAA,CAAG,SAAS,MAAM;AACrB,QAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACxC,QAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,SAAA,GAAY,CAAC,KAAA,KAAU;AAC7B,QAAA,IAAA,CAAK,aAAA,CAAc,MAAM,IAAI,CAAA;AAAA,MAC/B,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,GAAU,CAAC,KAAA,KAAU;AAC3B,QAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,QAAA,IAAA,CAAK,eAAA,EAAiB,OAAA,GAAU,IAAI,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAAA,MAC9D,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,UAAU,MAAM;AACtB,QAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AACrC,QAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,QAAA,IAAA,CAAK,iBAAiB,YAAA,IAAe;AACrC,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,MACxB,CAAA;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,MAAA,IAAA,CAAK,eAAA,EAAiB,OAAA;AAAA,QACpB,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,MAAM,4BAA4B;AAAA,OACzE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AAEvD,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,MAAA,EAAQ,MAAA;AAAA,MACR,KAAK,IAAA,CAAK,MAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACf;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,EAC1C;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,EAAA,CAAG,eAAe,SAAA,CAAU,IAAA,IAAQ,CAAC,IAAA,CAAK,aAAA,EAAe;AAE9E,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,CAAC,IAAA,CAAK,aAAa,CAAA;AAAA,MAC3B,IAAA,EAAM,CAAC,IAAA,CAAK,aAAa;AAAA,KAC3B;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,gBAAgB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,IAAA,CAAK,aAAa,CAAA,CAAE,CAAA;AAAA,EACnD;AAAA,EAEQ,cAAc,IAAA,EAAoB;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAEhC,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,IAAA,CAAK,8BAA8B,QAAQ,CAAA;AACnD,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,IAAI,OAAA,CAAQ,CAAA,KAAM,SAAA,IAAa,OAAA,CAAQ,QAAQ,eAAA,EAAiB;AAC9D,UAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,UAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,UAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,UAAA,IAAA,CAAK,iBAAiB,SAAA,IAAY;AAClC,UAAA,IAAA,CAAK,SAAA,EAAU;AAAA,QACjB,CAAA,MAAA,IAAW,OAAA,CAAQ,CAAA,KAAM,OAAA,EAAS;AAChC,UAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,EAAiB,OAAA,CAAQ,GAAG,CAAA;AAC1C,UAAA,IAAA,CAAK,iBAAiB,OAAA,GAAU,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,QACxD,CAAA,MAAA,IAAW,OAAA,CAAQ,CAAA,KAAM,GAAA,EAAK;AAC5B,UAAA,IAAA,CAAK,YAAY,OAAsB,CAAA;AAAA,QACzC,CAAA,MAAA,IAAW,OAAA,CAAQ,CAAA,KAAM,GAAA,EAAK;AAC5B,UAAA,IAAA,CAAK,UAAU,OAAuB,CAAA;AAAA,QACxC,CAAA,MAAA,IAAW,OAAA,CAAQ,CAAA,KAAM,cAAA,EAAgB;AACvC,UAAA,OAAA,CAAQ,GAAA,CAAI,2BAA2B,OAAO,CAAA;AAAA,QAChD;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEQ,YAAY,KAAA,EAA0B;AAC5C,IAAA,IAAI,KAAA,CAAM,CAAA,KAAM,IAAA,CAAK,aAAA,EAAe;AAEpC,IAAA,IAAA,CAAK,eAAA,EAAiB,OAAA,GAAU,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EAClD;AAAA,EAEQ,UAAU,GAAA,EAAyB;AACzC,IAAA,IAAI,GAAA,CAAI,CAAA,KAAM,IAAA,CAAK,aAAA,EAAe;AAElC,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,WAAW,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,EAAE,OAAA,EAAQ;AAAA,MACnC,MAAM,GAAA,CAAI,CAAA;AAAA,MACV,MAAM,GAAA,CAAI,CAAA;AAAA,MACV,KAAK,GAAA,CAAI,CAAA;AAAA,MACT,OAAO,GAAA,CAAI,CAAA;AAAA,MACX,QAAQ,GAAA,CAAI,CAAA;AAAA,MACZ,aAAa,GAAA,CAAI,CAAA;AAAA,MACjB,MAAM,GAAA,CAAI;AAAA,KACZ;AAEA,IAAA,IAAA,CAAK,eAAA,EAAiB,QAAQ,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,oBAAA,EAAsB;AACvD,MAAA,OAAA,CAAQ,MAAM,mCAAmC,CAAA;AACjD,MAAA,IAAA,CAAK,eAAA,EAAiB,OAAA,GAAU,IAAI,KAAA,CAAM,mCAAmC,CAAC,CAAA;AAC9E,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAA,EAAA;AACL,IAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,GAAiB,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAE1E,IAAA,OAAA,CAAQ,IAAI,CAAA,2BAAA,EAA8B,KAAK,CAAA,YAAA,EAAe,IAAA,CAAK,iBAAiB,CAAA,CAAA,CAAG,CAAA;AAEvF,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,eAAA,EAAiB;AAC9C,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,MACxB;AAAA,IACF,GAAG,KAAK,CAAA;AAAA,EACV;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACZ;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAAA,EAC3B;AAAA,EAEQ,kBAAkB,IAAA,EAA+B;AACvD,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,GAAA,MAAQ;AAAA,MACtB,WAAW,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,EAAE,OAAA,EAAQ;AAAA,MACnC,MAAM,GAAA,CAAI,CAAA;AAAA,MACV,MAAM,GAAA,CAAI,CAAA;AAAA,MACV,KAAK,GAAA,CAAI,CAAA;AAAA,MACT,OAAO,GAAA,CAAI,CAAA;AAAA,MACX,QAAQ,GAAA,CAAI,CAAA;AAAA,MACZ,aAAa,GAAA,CAAI,CAAA;AAAA,MACjB,MAAM,GAAA,CAAI;AAAA,KACZ,CAAE,CAAA;AAAA,EACJ;AACF;;;AC1RO,IAAM,cAAN,MAA4C;AAAA,EAA5C,WAAA,GAAA;AACL,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAA,EAA4B,IAAA,CAAA;AAAA,EAAA;AAAA,EAEpC,MAAM,oBAAoB,MAAA,EAAmD;AAC3E,IAAA,MAAM,EAAE,KAAA,GAAQ,GAAA,EAAK,MAAA,EAAO,GAAI,MAAA;AAEhC,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAG,CAAC,CAAA;AAErD,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAA,IAAU,IAAA,CAAK,GAAA,EAAI;AAC/B,IAAA,IAAI,KAAA,GAAQ,GAAA;AAEZ,IAAA,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,SAAA,GAAY,MAAM,CAAA,GAAI,GAAA;AAC5B,MAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,IAAO,CAAA;AACvC,MAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,MAAA,EAAQ,CAAC,CAAA;AAElC,MAAA,MAAM,IAAA,GAAO,KAAA;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,GAAA,CAAS,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,GAAA;AAC9C,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA,CAAK,QAAO,GAAI,GAAA;AACrD,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA,CAAK,QAAO,GAAI,GAAA;AAEpD,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,SAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAAA,QACzB,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAAA,QACzB,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAAA,QACvB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,CAAA;AAAA,QAC3B,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,GAAK,CAAA,GAAI;AAAA,OAC7C,CAAA;AAED,MAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAC,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAA,CAAQ,IAAI,CAAA,uBAAA,EAA0B,IAAA,CAAK,MAAM,CAAA,eAAA,EAAkB,MAAM,CAAA,CAAA,CAAG,CAAA;AAC5E,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,IAAA,CAAK,CAAC,CAAC,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AAE9C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,iBAAA,CAAkB,QAAgB,QAAA,EAAkD;AAClF,IAAA,QAAA,CAAS,SAAA,IAAY;AAErB,IAAA,IAAI,SAAA,GAAY,GAAA;AAEhB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA,CAAO,WAAA,CAAY,MAAM;AACzC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAM,CAAA,GAAI,GAAA;AAE7C,MAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,IAAO,CAAA;AACvC,MAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,MAAA,EAAQ,CAAC,CAAA;AAE1C,MAAA,MAAM,IAAA,GAAO,SAAA;AACb,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAA,CAAa,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,GAAA;AAClD,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA,CAAK,QAAO,GAAI,GAAA;AACrD,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA,CAAK,QAAO,GAAI,GAAA;AAEpD,MAAA,MAAM,GAAA,GAAgB;AAAA,QACpB,SAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,GAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,GAAK,CAAA,GAAI;AAAA,OAC9C;AAEA,MAAA,QAAA,CAAS,QAAQ,GAAG,CAAA;AACpB,MAAA,SAAA,GAAY,KAAA;AAAA,IACd,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,MAAM,IAAA,CAAK,cAAA;AAAe,KACzC;AAAA,EACF;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAAA,EACF;AACF","file":"index.js","sourcesContent":["import {\n IndicatorDefinition,\n IndicatorInstance,\n IndicatorCategory,\n IndicatorMetadata,\n} from './types';\n\nclass IndicatorRegistry {\n private indicators: Map<string, IndicatorDefinition> = new Map();\n private instanceCounters: Map<string, number> = new Map();\n\n register(definition: IndicatorDefinition): void {\n if (this.indicators.has(definition.metadata.id)) {\n console.warn(\n `Indicator with id \"${definition.metadata.id}\" is already registered. Overwriting.`\n );\n }\n this.indicators.set(definition.metadata.id, definition);\n }\n\n unregister(id: string): boolean {\n return this.indicators.delete(id);\n }\n\n get(id: string): IndicatorDefinition | undefined {\n return this.indicators.get(id);\n }\n\n getAll(): IndicatorDefinition[] {\n return Array.from(this.indicators.values());\n }\n\n getByCategory(category: IndicatorCategory): IndicatorDefinition[] {\n return this.getAll().filter(\n (indicator) => indicator.metadata.category === category\n );\n }\n\n search(query: string): IndicatorDefinition[] {\n const lowerQuery = query.toLowerCase();\n return this.getAll().filter(\n (indicator) =>\n indicator.metadata.name.toLowerCase().includes(lowerQuery) ||\n indicator.metadata.description.toLowerCase().includes(lowerQuery)\n );\n }\n\n createInstance(definitionId: string, customSettings?: Record<string, any>): IndicatorInstance {\n const definition = this.get(definitionId);\n if (!definition) {\n throw new Error(`Indicator definition \"${definitionId}\" not found`);\n }\n\n const currentCount = this.instanceCounters.get(definitionId) || 0;\n const newCount = currentCount + 1;\n this.instanceCounters.set(definitionId, newCount);\n\n const instanceId = `${definitionId}-${newCount}`;\n\n const defaultSettings: Record<string, any> = {};\n Object.entries(definition.settings).forEach(([key, field]) => {\n defaultSettings[key] = field.defaultValue;\n });\n\n const settings = { ...defaultSettings, ...customSettings };\n\n return {\n id: instanceId,\n definitionId,\n name: `${definition.metadata.name}(${newCount})`,\n settings,\n };\n }\n\n validateSettings(definitionId: string, settings: Record<string, any>): boolean {\n const definition = this.get(definitionId);\n if (!definition) {\n return false;\n }\n\n for (const [key, field] of Object.entries(definition.settings)) {\n const value = settings[key];\n\n if (value === undefined) {\n return false;\n }\n\n if (field.type === 'number') {\n if (typeof value !== 'number') return false;\n if (field.min !== undefined && value < field.min) return false;\n if (field.max !== undefined && value > field.max) return false;\n } else if (field.type === 'boolean') {\n if (typeof value !== 'boolean') return false;\n } else if (field.type === 'color' || field.type === 'lineStyle') {\n if (typeof value !== 'string') return false;\n } else if (field.type === 'select') {\n if (typeof value !== 'string') return false;\n if (field.options && !field.options.some(opt => opt.value === value)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n getMetadataList(): IndicatorMetadata[] {\n return this.getAll().map((indicator) => indicator.metadata);\n }\n\n clear(): void {\n this.indicators.clear();\n this.instanceCounters.clear();\n }\n}\n\nexport const indicatorRegistry = new IndicatorRegistry();\n","import { OHLCVBar } from '../../types/chart';\nimport { IndicatorInstance, IndicatorOutput } from './types';\nimport { indicatorRegistry } from './registry';\n\ninterface CacheEntry {\n data: IndicatorOutput[];\n settingsHash: string;\n dataLength: number;\n}\n\nclass IndicatorCalculator {\n private cache: Map<string, CacheEntry> = new Map();\n\n private hashSettings(settings: Record<string, any>): string {\n return JSON.stringify(settings);\n }\n\n calculate(\n instance: IndicatorInstance,\n bars: OHLCVBar[]\n ): IndicatorOutput[] {\n const definition = indicatorRegistry.get(instance.definitionId);\n if (!definition) {\n console.error(\n `Indicator definition \"${instance.definitionId}\" not found`\n );\n return [];\n }\n\n const settingsHash = this.hashSettings(instance.settings);\n const cacheKey = instance.id;\n const cached = this.cache.get(cacheKey);\n\n if (\n cached &&\n cached.settingsHash === settingsHash &&\n cached.dataLength === bars.length\n ) {\n return cached.data;\n }\n\n try {\n const data = definition.calculate(bars, instance.settings);\n\n this.cache.set(cacheKey, {\n data,\n settingsHash,\n dataLength: bars.length,\n });\n\n return data;\n } catch (error) {\n console.error(\n `Error calculating indicator \"${instance.definitionId}\":`,\n error\n );\n return [];\n }\n }\n\n invalidateCache(instanceId?: string): void {\n if (instanceId) {\n this.cache.delete(instanceId);\n } else {\n this.cache.clear();\n }\n }\n\n getCacheSize(): number {\n return this.cache.size;\n }\n}\n\nexport const indicatorCalculator = new IndicatorCalculator();\n","import {\n ISeriesApi,\n ISeriesPrimitive,\n SeriesAttachedParameter,\n Time,\n IChartApi,\n} from 'lightweight-charts';\n\nexport interface BandsPrimitiveOptions {\n upperSeries: ISeriesApi<'Line'>;\n lowerSeries: ISeriesApi<'Line'>;\n fillColor: string;\n}\n\ninterface BandPoint {\n x: number;\n y1: number;\n y2: number;\n}\n\ninterface BandData {\n points: BandPoint[];\n color: string;\n}\n\nclass AreaBetweenLinesPaneView {\n private _source: BandsPrimitive;\n private _data: BandData | null = null;\n\n constructor(source: BandsPrimitive) {\n this._source = source;\n }\n\n update() {\n const series1 = this._source._upperSeries;\n const series2 = this._source._lowerSeries;\n const chart = this._source._chart;\n\n if (!series1 || !series2 || !chart) return;\n\n const timeScale = chart.timeScale();\n\n const data1 = series1.data() as any[];\n const data2 = series2.data() as any[];\n\n const points: BandPoint[] = [];\n\n let i = 0;\n let j = 0;\n\n while (i < data1.length && j < data2.length) {\n const d1 = data1[i];\n const d2 = data2[j];\n\n if (d1.time < d2.time) {\n i++;\n } else if (d1.time > d2.time) {\n j++;\n } else {\n const x = timeScale.timeToCoordinate(d1.time);\n const y1 = series1.priceToCoordinate(d1.value);\n const y2 = series2.priceToCoordinate(d2.value);\n\n if (x !== null && y1 !== null && y2 !== null) {\n points.push({ x, y1, y2 });\n }\n i++;\n j++;\n }\n }\n\n this._data = {\n points,\n color: this._source._options.fillColor || 'rgba(59, 130, 246, 0.1)',\n };\n }\n\n renderer() {\n return new AreaBetweenLinesRenderer(this._data);\n }\n}\n\nclass AreaBetweenLinesRenderer {\n private _data: BandData | null;\n\n constructor(data: BandData | null) {\n this._data = data;\n }\n\n draw(target: any) {\n target.useBitmapCoordinateSpace((scope: any) => {\n if (!this._data || this._data.points.length === 0) return;\n\n const ctx = scope.context;\n ctx.save();\n ctx.scale(scope.horizontalPixelRatio, scope.verticalPixelRatio);\n\n const points = this._data.points;\n\n ctx.beginPath();\n\n ctx.moveTo(points[0].x, points[0].y1);\n\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y1);\n }\n\n for (let i = points.length - 1; i >= 0; i--) {\n ctx.lineTo(points[i].x, points[i].y2);\n }\n\n ctx.closePath();\n\n ctx.fillStyle = this._data.color;\n ctx.fill();\n\n ctx.restore();\n });\n }\n\n drawBackground(target: any) {\n this.draw(target);\n }\n}\n\nexport class BandsPrimitive implements ISeriesPrimitive<Time> {\n _options: BandsPrimitiveOptions;\n _upperSeries: ISeriesApi<'Line'>;\n _lowerSeries: ISeriesApi<'Line'>;\n _chart: IChartApi | null = null;\n _series: ISeriesApi<'Line'> | null = null;\n private _paneViews: AreaBetweenLinesPaneView[];\n\n constructor(options: BandsPrimitiveOptions) {\n this._options = options;\n this._upperSeries = options.upperSeries;\n this._lowerSeries = options.lowerSeries;\n this._paneViews = [new AreaBetweenLinesPaneView(this)];\n }\n\n attached(param: SeriesAttachedParameter<Time>): void {\n this._chart = param.chart;\n this._series = param.series as ISeriesApi<'Line'>;\n }\n\n detached(): void {\n this._chart = null;\n this._series = null;\n }\n\n paneViews() {\n return this._paneViews;\n }\n\n updateAllViews(): void {\n this._paneViews.forEach((pw) => pw.update());\n }\n}\n","import type { SeriesMarker, Time } from 'lightweight-charts';\nimport type { ChartTrade } from '../types/chart';\n\nconst WIN = '#10b981';\nconst LOSS = '#ef4444';\nconst SEL = '#3b82f6'; // selected emphasis\n\n/** Pure: build the entry+exit markers for all trades, sorted ascending by time\n * (lightweight-charts requires sorted markers). The selected trade's markers are\n * emphasized (selection color + a text label). */\nexport function buildTradeMarkers(trades: ChartTrade[], selectedTradeId: string | null): SeriesMarker<Time>[] {\n const markers: SeriesMarker<Time>[] = [];\n for (const t of trades) {\n const selected = t.id === selectedTradeId;\n const base = t.outcome === 'win' ? WIN : LOSS;\n const color = selected ? SEL : base;\n markers.push({\n time: (t.entryTime / 1000) as Time,\n position: 'belowBar', shape: 'arrowUp', color,\n text: selected ? `${t.outcome === 'win' ? '+' : ''}entry` : '',\n });\n markers.push({\n time: (t.exitTime / 1000) as Time,\n position: 'aboveBar', shape: 'arrowDown', color,\n text: selected ? 'exit' : '',\n });\n }\n markers.sort((a, b) => (a.time as number) - (b.time as number));\n return markers;\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n createChart,\n createSeriesMarkers,\n IChartApi,\n ISeriesApi,\n CandlestickData,\n Time,\n LineData,\n HistogramData,\n IPriceLine,\n LineStyle,\n LineWidth,\n ColorType,\n CandlestickSeries,\n HistogramSeries,\n LineSeries,\n AreaSeries,\n SeriesMarker,\n} from 'lightweight-charts';\nimport { OHLCVBar, ChartLine, ChartTrade } from '../types/chart';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { indicatorCalculator } from '../indicators/core/calculator';\nimport { BandsPrimitive } from '../indicators/primitives/BandsPrimitive';\nimport { buildTradeMarkers } from './trade-markers';\n\ninterface ChartComponentProps {\n bars: OHLCVBar[];\n onLoadMoreData?: (oldestTimestamp: number) => void;\n indicators?: IndicatorInstance[];\n lines?: ChartLine[];\n onBarUpdate?: (updatedBar: OHLCVBar) => void;\n onNewBar?: (newBar: OHLCVBar) => void;\n onDeleteLine?: (lineId: string) => void;\n onAddLine?: (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance', price: number) => void;\n onClearAllLines?: () => void;\n enableBarSelection?: boolean;\n onBarClick?: (bar: OHLCVBar | null) => void;\n trades?: ChartTrade[];\n selectedTradeId?: string | null;\n renderTradePopup?: (trade: ChartTrade) => ReactNode;\n /**\n * Fixed chart height in px. When omitted, the chart fills its container's\n * height (observed via ResizeObserver) instead of a fixed default — so a\n * flex/percent-sized parent gets a full-height chart.\n */\n height?: number;\n /**\n * When set, recenter the time scale on this trade (by id) so it scrolls into\n * view. Pairs with `selectedTradeId` to drive both selection and focus.\n */\n focusTradeId?: string | null;\n}\n\nexport default function ChartComponent({\n bars,\n onLoadMoreData,\n indicators = [],\n lines = [],\n onBarUpdate,\n onNewBar,\n onDeleteLine,\n onAddLine,\n onClearAllLines,\n enableBarSelection = true,\n onBarClick,\n trades = [],\n selectedTradeId = null,\n renderTradePopup,\n height,\n focusTradeId = null,\n}: ChartComponentProps) {\n const chartContainerRef = useRef<HTMLDivElement>(null);\n const chartRef = useRef<IChartApi | null>(null);\n const candlestickSeriesRef = useRef<ISeriesApi<'Candlestick'> | null>(null);\n const volumeSeriesRef = useRef<ISeriesApi<'Histogram'> | null>(null);\n const indicatorSeriesRef = useRef<Map<string, ISeriesApi<any>>>(new Map());\n const indicatorPaneIndexRef = useRef<Map<string, number>>(new Map());\n const nextPaneIndexRef = useRef<number>(2);\n const priceLineRefs = useRef<Map<string, IPriceLine>>(new Map());\n const seriesMarkersRef = useRef<any>(null);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [contextMenu, setContextMenu] = useState<{ x: number; y: number; price: number } | null>(null);\n const [linePositions, setLinePositions] = useState<Map<string, { top: number; right: number }>>(new Map());\n const [selectedBar, setSelectedBar] = useState<OHLCVBar | null>(null);\n const selectedBarRef = useRef<OHLCVBar | null>(null);\n const [spotlightPosition, setSpotlightPosition] = useState<{ x: number; width: number } | null>(null);\n const [tradePopupPos, setTradePopupPos] = useState<{ x: number } | null>(null);\n const previousBarsRef = useRef<OHLCVBar[]>([]);\n const previousBarsLengthRef = useRef<number>(0);\n const isLoadingRef = useRef(false);\n const barsRef = useRef<OHLCVBar[]>(bars);\n const isDraggingRef = useRef(false);\n const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null);\n // Latest explicit height (px) or undefined for auto-fill; read inside the\n // create-once effect's resize closure without going stale.\n const heightRef = useRef<number | undefined>(height);\n heightRef.current = height;\n // Line-editing is opt-in: the right-click \"add line\" menu only opens when a\n // consumer wires the add/clear handlers. Read via ref from the create-once\n // contextmenu closure without going stale. (Delete buttons gate on\n // `onDeleteLine` directly at render.)\n const lineEditEnabledRef = useRef(false);\n lineEditEnabledRef.current = Boolean(onAddLine || onClearAllLines);\n\n\n useEffect(() => {\n if (!chartContainerRef.current) return;\n\n chartContainerRef.current.style.position = 'relative';\n\n const chart = createChart(chartContainerRef.current, {\n layout: {\n background: { type: ColorType.Solid, color: '#0f172a' },\n textColor: '#94a3b8',\n panes: {\n enableResize: true,\n separatorColor: '#1e293b',\n separatorHoverColor: 'rgba(148,163,184,0.5)',\n },\n },\n grid: {\n vertLines: { color: '#1e293b' },\n horzLines: { color: '#1e293b' },\n },\n width: chartContainerRef.current.clientWidth,\n // Auto-fill the container's height unless an explicit `height` is given.\n // Fall back to 600 only when the container hasn't been laid out yet (a\n // ResizeObserver below corrects it on first measure).\n height: height ?? (chartContainerRef.current.clientHeight || 600),\n timeScale: {\n timeVisible: true,\n secondsVisible: true,\n borderColor: '#334155',\n },\n rightPriceScale: {\n borderColor: '#334155',\n },\n crosshair: {\n mode: 0,\n vertLine: {\n width: 1,\n color: '#475569',\n style: 3,\n },\n horzLine: {\n width: 1,\n color: '#475569',\n style: 3,\n },\n },\n });\n\n const candlestickSeries = chart.addSeries(CandlestickSeries, {\n upColor: '#10b981',\n downColor: '#ef4444',\n borderVisible: false,\n wickUpColor: '#10b981',\n wickDownColor: '#ef4444',\n }, 0);\n\n const volumeSeries = chart.addSeries(HistogramSeries, {\n color: '#64748b',\n priceFormat: {\n type: 'volume',\n },\n priceScaleId: '',\n }, 1);\n\n chartRef.current = chart;\n candlestickSeriesRef.current = candlestickSeries;\n volumeSeriesRef.current = volumeSeries;\n\n seriesMarkersRef.current = createSeriesMarkers(candlestickSeries, []);\n\n chart.timeScale().subscribeVisibleLogicalRangeChange((logicalRange) => {\n if (logicalRange && logicalRange.from < 5 && !isLoadingRef.current && onLoadMoreData) {\n isLoadingRef.current = true;\n setIsLoadingMore(true);\n previousBarsLengthRef.current = barsRef.current.length;\n const sortedBars = [...barsRef.current].sort((a, b) => a.timestamp - b.timestamp);\n const oldestTimestamp = sortedBars[0]?.timestamp;\n if (oldestTimestamp) {\n onLoadMoreData(oldestTimestamp);\n }\n }\n });\n\n const handleResize = () => {\n if (chartContainerRef.current && chart) {\n const nextHeight = heightRef.current ?? chartContainerRef.current.clientHeight;\n chart.applyOptions({\n width: chartContainerRef.current.clientWidth,\n // Only drive height when auto-filling and the container has a real\n // measured height; otherwise leave the current height untouched.\n ...(heightRef.current === undefined && nextHeight > 0 ? { height: nextHeight } : {}),\n ...(heightRef.current !== undefined ? { height: heightRef.current } : {}),\n });\n }\n };\n\n // A flex/percent-sized parent changes the container without firing window\n // 'resize'; observe the container directly so the chart tracks it.\n const resizeObserver = new ResizeObserver(handleResize);\n resizeObserver.observe(chartContainerRef.current);\n\n const handleContextMenu = (e: MouseEvent) => {\n // No line-editing handlers wired → no custom menu; leave the native\n // context menu alone (read-only charts, e.g. the trades overlay).\n if (!lineEditEnabledRef.current) return;\n e.preventDefault();\n e.stopPropagation();\n\n if (!candlestickSeriesRef.current) {\n return;\n }\n\n const rect = chartContainerRef.current!.getBoundingClientRect();\n const y = e.clientY - rect.top;\n\n const price = candlestickSeriesRef.current.coordinateToPrice(y);\n\n if (price !== null) {\n setContextMenu({\n x: e.clientX - rect.left,\n y: y,\n price: price as number,\n });\n }\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n isDraggingRef.current = false;\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (mouseDownPosRef.current) {\n const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);\n if (dx > 5 || dy > 5) {\n isDraggingRef.current = true;\n }\n }\n };\n\n const handleMouseUp = () => {\n mouseDownPosRef.current = null;\n };\n\n const handleClick = (e: MouseEvent) => {\n setContextMenu(null);\n\n if (isDraggingRef.current) {\n isDraggingRef.current = false;\n return;\n }\n\n\n if (!enableBarSelection) {\n return;\n }\n\n if (!chartRef.current) {\n return;\n }\n\n if (!candlestickSeriesRef.current) {\n return;\n }\n\n\n const rect = chartContainerRef.current!.getBoundingClientRect();\n const x = e.clientX - rect.left;\n\n const timeScale = chartRef.current.timeScale();\n const coordinate = timeScale.coordinateToTime(x);\n\n if (!coordinate) {\n return;\n }\n\n const clickedTime = coordinate as number;\n\n const clickedBar = barsRef.current.find(bar => {\n const diff = Math.abs((bar.timestamp / 1000) - clickedTime);\n return diff < 300;\n });\n\n if (clickedBar) {\n\n if (selectedBarRef.current && selectedBarRef.current.timestamp === clickedBar.timestamp) {\n selectedBarRef.current = null;\n setSelectedBar(null);\n setSpotlightPosition(null);\n if (onBarClick) {\n onBarClick(null);\n }\n } else {\n selectedBarRef.current = clickedBar;\n setSelectedBar(clickedBar);\n const barX = timeScale.timeToCoordinate((clickedBar.timestamp / 1000) as Time);\n if (barX !== null) {\n const barWidth = Math.max(8, rect.width / barsRef.current.length);\n setSpotlightPosition({ x: barX - barWidth / 2, width: barWidth });\n }\n if (onBarClick) {\n onBarClick(clickedBar);\n }\n }\n } else {\n }\n };\n\n window.addEventListener('resize', handleResize);\n chartContainerRef.current.addEventListener('contextmenu', handleContextMenu, true);\n chartContainerRef.current.addEventListener('mousedown', handleMouseDown, true);\n chartContainerRef.current.addEventListener('mousemove', handleMouseMove, true);\n chartContainerRef.current.addEventListener('mouseup', handleMouseUp, true);\n chartContainerRef.current.addEventListener('click', handleClick, true);\n\n const container = chartContainerRef.current;\n\n return () => {\n window.removeEventListener('resize', handleResize);\n resizeObserver.disconnect();\n container.removeEventListener('contextmenu', handleContextMenu, true);\n container.removeEventListener('mousedown', handleMouseDown, true);\n container.removeEventListener('mousemove', handleMouseMove, true);\n container.removeEventListener('mouseup', handleMouseUp, true);\n container.removeEventListener('click', handleClick, true);\n chart.remove();\n };\n }, []);\n\n useEffect(() => {\n barsRef.current = bars;\n }, [bars]);\n\n // Apply an explicit `height` prop change (the create-once effect can't).\n useEffect(() => {\n if (chartRef.current && height !== undefined) {\n chartRef.current.applyOptions({ height });\n }\n }, [height]);\n\n // Recenter the time scale on `focusTradeId` so the trade scrolls into view.\n // Re-runs when the focus target or the loaded bars change (the bars covering\n // the trade may arrive after selection), then frames [entry, exit] with pad.\n // The range is applied on the next animation frame so it lands AFTER the\n // sibling bars→setData effect (which would otherwise snap the view back).\n useEffect(() => {\n if (!chartRef.current || !focusTradeId) return;\n const trade = trades.find((t) => t.id === focusTradeId);\n if (!trade) return;\n // Frame by LOGICAL (bar-index) range, not time: lazy-loading a far-off trade\n // leaves a big gap between bar clusters, and a time-based setVisibleRange\n // won't reliably land on the far cluster. Build the same ascending, deduped\n // order candlekit feeds to setData so indices line up, then frame the trade.\n const seen = new Set<number>();\n const series: number[] = [];\n for (const b of [...bars].sort((a, b) => a.timestamp - b.timestamp)) {\n if (seen.has(b.timestamp)) continue;\n seen.add(b.timestamp);\n series.push(b.timestamp);\n }\n if (series.length === 0) return;\n // First bar index at/after a target ms (binary search; series is ascending).\n const nearestIdx = (ms: number) => {\n let lo = 0;\n let hi = series.length - 1;\n let idx = series.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (series[mid] >= ms) {\n idx = mid;\n hi = mid - 1;\n } else {\n lo = mid + 1;\n }\n }\n return idx;\n };\n const entryIdx = nearestIdx(trade.entryTime);\n const exitIdx = Math.max(entryIdx, nearestIdx(trade.exitTime));\n const PAD = 15;\n const raf = requestAnimationFrame(() => {\n try {\n chartRef.current?.timeScale().setVisibleLogicalRange({\n from: entryIdx - PAD,\n to: exitIdx + PAD,\n });\n } catch {\n /* bars not yet present; a later bars update re-runs this */\n }\n });\n return () => cancelAnimationFrame(raf);\n }, [focusTradeId, trades, bars]);\n\n useEffect(() => {\n if (!candlestickSeriesRef.current || !volumeSeriesRef.current) return;\n\n const sortedBars = [...bars].sort((a, b) => a.timestamp - b.timestamp);\n\n const uniqueBars = sortedBars.reduce((acc, bar) => {\n const exists = acc.find(b => b.timestamp === bar.timestamp);\n if (!exists) {\n acc.push(bar);\n }\n return acc;\n }, [] as OHLCVBar[]);\n\n\n const previousBars = previousBarsRef.current;\n const isInitialLoad = previousBars.length === 0;\n const hasNewBars = uniqueBars.length > previousBars.length;\n const lastBarChanged = uniqueBars.length > 0 && previousBars.length > 0 &&\n (uniqueBars[uniqueBars.length - 1].timestamp === previousBars[previousBars.length - 1].timestamp);\n\n\n if (isLoadingRef.current && uniqueBars.length > previousBarsLengthRef.current) {\n isLoadingRef.current = false;\n setIsLoadingMore(false);\n }\n\n if (isInitialLoad || hasNewBars) {\n const candleData: CandlestickData[] = uniqueBars.map((bar) => ({\n time: (bar.timestamp / 1000) as Time,\n open: bar.open,\n high: bar.high,\n low: bar.low,\n close: bar.close,\n }));\n\n const volumeData: HistogramData[] = uniqueBars.map((bar) => ({\n time: (bar.timestamp / 1000) as Time,\n value: bar.volume,\n color: bar.close >= bar.open ? '#10b98180' : '#ef444480',\n }));\n\n candlestickSeriesRef.current.setData(candleData);\n volumeSeriesRef.current.setData(volumeData);\n } else if (lastBarChanged && uniqueBars.length > 0 && !hasNewBars) {\n const lastBar = uniqueBars[uniqueBars.length - 1];\n const candleUpdate: CandlestickData = {\n time: (lastBar.timestamp / 1000) as Time,\n open: lastBar.open,\n high: lastBar.high,\n low: lastBar.low,\n close: lastBar.close,\n };\n\n const volumeUpdate: HistogramData = {\n time: (lastBar.timestamp / 1000) as Time,\n value: lastBar.volume,\n color: lastBar.close >= lastBar.open ? '#10b98180' : '#ef444480',\n };\n\n candlestickSeriesRef.current.update(candleUpdate);\n volumeSeriesRef.current.update(volumeUpdate);\n }\n\n previousBarsRef.current = uniqueBars;\n }, [bars]);\n\n useEffect(() => {\n if (!chartRef.current || !candlestickSeriesRef.current) return;\n\n priceLineRefs.current.forEach((priceLine) => {\n candlestickSeriesRef.current?.removePriceLine(priceLine);\n });\n priceLineRefs.current.clear();\n\n lines.forEach((line) => {\n const priceLine = candlestickSeriesRef.current?.createPriceLine({\n price: line.price,\n color: line.color,\n lineWidth: (line.lineWidth || 2) as LineWidth,\n lineStyle: getLineStyle(line.lineStyle),\n axisLabelVisible: true,\n title: line.title || '',\n });\n\n if (priceLine) {\n priceLineRefs.current.set(line.id, priceLine);\n }\n });\n\n requestAnimationFrame(() => {\n if (!candlestickSeriesRef.current || !chartContainerRef.current) return;\n const rect = chartContainerRef.current.getBoundingClientRect();\n const newPositions = new Map<string, { top: number; right: number }>();\n lines.forEach((line) => {\n const y = candlestickSeriesRef.current?.priceToCoordinate(line.price);\n if (y !== null && y !== undefined) {\n newPositions.set(line.id, {\n top: rect.top + y,\n right: window.innerWidth - rect.right + 68 + estimateLabelTitleWidth(line.title),\n });\n }\n });\n setLinePositions(newPositions);\n });\n }, [lines]);\n\n useEffect(() => {\n if (!chartRef.current || !candlestickSeriesRef.current) return;\n\n const updatePositions = () => {\n if (!candlestickSeriesRef.current || !chartContainerRef.current) return;\n const rect = chartContainerRef.current.getBoundingClientRect();\n const newPositions = new Map<string, { top: number; right: number }>();\n lines.forEach((line) => {\n const y = candlestickSeriesRef.current?.priceToCoordinate(line.price);\n if (y !== null && y !== undefined) {\n newPositions.set(line.id, {\n top: rect.top + y,\n right: window.innerWidth - rect.right + 68 + estimateLabelTitleWidth(line.title),\n });\n }\n });\n setLinePositions(newPositions);\n };\n\n chartRef.current.timeScale().subscribeVisibleLogicalRangeChange(updatePositions);\n window.addEventListener('scroll', updatePositions, { passive: true });\n window.addEventListener('resize', updatePositions);\n\n return () => {\n chartRef.current?.timeScale().unsubscribeVisibleLogicalRangeChange(updatePositions);\n window.removeEventListener('scroll', updatePositions);\n window.removeEventListener('resize', updatePositions);\n };\n }, [lines]);\n\n useEffect(() => {\n if (!chartRef.current) return;\n\n indicatorSeriesRef.current.forEach((series) => {\n chartRef.current?.removeSeries(series);\n });\n indicatorSeriesRef.current.clear();\n indicatorPaneIndexRef.current.clear();\n nextPaneIndexRef.current = 2;\n\n indicators.forEach((indicator) => {\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return;\n\n const data = indicatorCalculator.calculate(indicator, barsRef.current);\n if (!data || data.length === 0) return;\n\n const seriesType = definition.renderConfig.seriesType;\n const isOverlay = definition.renderConfig.overlay !== false;\n const paneIndex = isOverlay ? 0 : nextPaneIndexRef.current;\n\n if (!isOverlay) {\n indicatorPaneIndexRef.current.set(indicator.id, paneIndex);\n nextPaneIndexRef.current++;\n }\n\n if (seriesType === 'line') {\n if (definition.renderConfig.outputCount === 1) {\n const series = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.color || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: indicator.name,\n }, paneIndex);\n const lineData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(lineData as LineData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n } else if (definition.renderConfig.hasBandFill && definition.renderConfig.fillBands) {\n const { upper: upperField, lower: lowerField } = definition.renderConfig.fillBands;\n\n const upperSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.upperColor || '#ef4444',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Upper`,\n }, paneIndex);\n const middleSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.middleColor || indicator.settings.vwapColor || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Middle`,\n }, paneIndex);\n const lowerSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.lowerColor || '#10b981',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Lower`,\n }, paneIndex);\n\n const upperData = data.map(d => ({ time: d.time as Time, value: d[upperField] })).filter(d => !isNaN(d.value));\n const middleData = data.map(d => ({ time: d.time as Time, value: d.value })).filter(d => !isNaN(d.value));\n const lowerData = data.map(d => ({ time: d.time as Time, value: d[lowerField] })).filter(d => !isNaN(d.value));\n\n upperSeries.setData(upperData as LineData[]);\n middleSeries.setData(middleData as LineData[]);\n lowerSeries.setData(lowerData as LineData[]);\n\n if (indicator.settings.showFill !== false) {\n const bandsPrimitive = new BandsPrimitive({\n upperSeries: upperSeries,\n lowerSeries: lowerSeries,\n fillColor: indicator.settings.fillColor || 'rgba(59, 130, 246, 0.1)',\n });\n upperSeries.attachPrimitive(bandsPrimitive);\n }\n\n indicatorSeriesRef.current.set(`${indicator.id}-upper`, upperSeries);\n indicatorSeriesRef.current.set(`${indicator.id}-middle`, middleSeries);\n indicatorSeriesRef.current.set(`${indicator.id}-lower`, lowerSeries);\n }\n } else if (seriesType === 'histogram') {\n const series = chartRef.current!.addSeries(HistogramSeries, {\n color: indicator.settings.color || '#8b5cf6',\n title: indicator.name,\n }, paneIndex);\n const histData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(histData as HistogramData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n } else if (seriesType === 'area') {\n const series = chartRef.current!.addSeries(AreaSeries, {\n topColor: indicator.settings.topColor || '#3b82f680',\n bottomColor: indicator.settings.bottomColor || '#3b82f600',\n lineColor: indicator.settings.lineColor || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: indicator.name,\n }, paneIndex);\n const areaData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(areaData as LineData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n }\n });\n }, [indicators]);\n\n useEffect(() => {\n if (!chartRef.current || indicators.length === 0) return;\n\n indicators.forEach((indicator) => {\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return;\n\n const data = indicatorCalculator.calculate(indicator, barsRef.current);\n if (!data || data.length === 0) return;\n\n if (definition.renderConfig.outputCount === 1) {\n const series = indicatorSeriesRef.current.get(indicator.id);\n if (series) {\n const lineData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(lineData as any);\n }\n } else if (definition.renderConfig.hasBandFill && definition.renderConfig.fillBands) {\n const { upper: upperField, lower: lowerField } = definition.renderConfig.fillBands;\n\n const upperSeries = indicatorSeriesRef.current.get(`${indicator.id}-upper`);\n const middleSeries = indicatorSeriesRef.current.get(`${indicator.id}-middle`);\n const lowerSeries = indicatorSeriesRef.current.get(`${indicator.id}-lower`);\n\n if (upperSeries && middleSeries && lowerSeries) {\n const upperData = data.map(d => ({ time: d.time as Time, value: d[upperField] })).filter(d => !isNaN(d.value));\n const middleData = data.map(d => ({ time: d.time as Time, value: d.value })).filter(d => !isNaN(d.value));\n const lowerData = data.map(d => ({ time: d.time as Time, value: d[lowerField] })).filter(d => !isNaN(d.value));\n\n upperSeries.setData(upperData as any);\n middleSeries.setData(middleData as any);\n lowerSeries.setData(lowerData as any);\n }\n }\n });\n }, [bars, indicators]);\n\n useEffect(() => {\n if (!seriesMarkersRef.current) return;\n const tradeMarkers = buildTradeMarkers(trades, selectedTradeId);\n const selectionMarker: SeriesMarker<Time>[] =\n enableBarSelection && selectedBar\n ? [\n {\n time: (selectedBar.timestamp / 1000) as Time,\n position: 'aboveBar' as const,\n color: '#3b82f6',\n shape: 'circle' as const,\n text: '',\n },\n ]\n : [];\n const all = [...tradeMarkers, ...selectionMarker].sort(\n (a, b) => (a.time as number) - (b.time as number),\n );\n seriesMarkersRef.current.setMarkers(all);\n }, [trades, selectedTradeId, selectedBar, enableBarSelection]);\n\n useEffect(() => {\n if (!chartRef.current || !selectedBar || !enableBarSelection) {\n setSpotlightPosition(null);\n return;\n }\n\n const updateSpotlightPosition = () => {\n if (!chartRef.current || !selectedBar || !chartContainerRef.current) return;\n\n const timeScale = chartRef.current.timeScale();\n const barX = timeScale.timeToCoordinate((selectedBar.timestamp / 1000) as Time);\n\n if (barX !== null) {\n const rect = chartContainerRef.current.getBoundingClientRect();\n const barWidth = Math.max(8, rect.width / bars.length);\n setSpotlightPosition({ x: barX - barWidth / 2, width: barWidth });\n }\n };\n\n updateSpotlightPosition();\n\n const timeScale = chartRef.current.timeScale();\n timeScale.subscribeVisibleLogicalRangeChange(updateSpotlightPosition);\n\n return () => {\n if (chartRef.current) {\n chartRef.current.timeScale().unsubscribeVisibleLogicalRangeChange(updateSpotlightPosition);\n }\n };\n }, [selectedBar, enableBarSelection, bars.length]);\n\n const selectedTrade = trades.find((t) => t.id === selectedTradeId) ?? null;\n\n useEffect(() => {\n if (!chartRef.current || !selectedTrade) {\n setTradePopupPos(null);\n return;\n }\n\n const updateTradePopupPos = () => {\n if (!chartRef.current || !selectedTrade || !chartContainerRef.current) return;\n const timeScale = chartRef.current.timeScale();\n const x = timeScale.timeToCoordinate((selectedTrade.entryTime / 1000) as Time);\n // Hide when the bar is off-screen: timeToCoordinate returns null once it leaves the\n // logical range, but a bar just past the edge returns an out-of-bounds coordinate —\n // bound to [0, width] so the popup never peeks regardless of container overflow.\n const width = chartContainerRef.current.getBoundingClientRect().width;\n setTradePopupPos(x !== null && x >= 0 && x <= width ? { x } : null);\n };\n\n updateTradePopupPos();\n const timeScale = chartRef.current.timeScale();\n timeScale.subscribeVisibleLogicalRangeChange(updateTradePopupPos);\n return () => {\n if (chartRef.current) {\n chartRef.current.timeScale().unsubscribeVisibleLogicalRangeChange(updateTradePopupPos);\n }\n };\n }, [selectedTrade, selectedTrade?.entryTime]);\n\n const handleDeleteLine = (lineId: string) => {\n if (onDeleteLine) {\n onDeleteLine(lineId);\n }\n };\n\n const handleAddLineFromContext = (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance') => {\n if (onAddLine && contextMenu) {\n onAddLine(type, contextMenu.price);\n setContextMenu(null);\n }\n };\n\n const handleClearAllLines = () => {\n if (onClearAllLines) {\n onClearAllLines();\n setContextMenu(null);\n }\n };\n\n return (\n <div className=\"relative space-y-4\">\n {isLoadingMore && (\n <div className=\"absolute top-4 left-1/2 transform -translate-x-1/2 bg-slate-800 text-slate-200 px-4 py-2 rounded-lg shadow-lg z-10\">\n Loading more data...\n </div>\n )}\n <div className=\"relative\">\n <div ref={chartContainerRef} className=\"w-full\" />\n\n {enableBarSelection && spotlightPosition && (\n <div\n className=\"absolute top-0 bottom-0 pointer-events-none z-5\"\n style={{\n left: `${spotlightPosition.x}px`,\n width: `${spotlightPosition.width}px`,\n background: 'rgba(59, 130, 246, 0.15)',\n borderLeft: '1px solid rgba(59, 130, 246, 0.4)',\n borderRight: '1px solid rgba(59, 130, 246, 0.4)',\n }}\n />\n )}\n\n {selectedTrade && tradePopupPos && renderTradePopup && (\n <div\n className=\"absolute z-20 pointer-events-auto\"\n style={{ left: `${tradePopupPos.x}px`, top: 8, transform: 'translateX(-50%)' }}\n >\n {renderTradePopup(selectedTrade)}\n </div>\n )}\n </div>\n\n {onDeleteLine && chartContainerRef.current && lines.map((line) => {\n const pos = linePositions.get(line.id);\n if (!pos) return null;\n\n return createPortal(\n <button\n key={line.id}\n onClick={() => handleDeleteLine(line.id)}\n className=\"bg-red-500/70 hover:bg-red-500 text-white rounded-full w-4 h-4 flex items-center justify-center text-xs font-bold transition-colors shadow-md\"\n style={{\n position: 'fixed',\n top: `${pos.top - 8}px`,\n right: `${pos.right}px`,\n zIndex: 9999,\n }}\n title=\"Delete line\"\n >\n ×\n </button>,\n document.body\n );\n })}\n\n {contextMenu && (\n <div\n className=\"absolute bg-slate-800 border border-slate-600 rounded-lg shadow-xl z-30 py-1 min-w-[180px]\"\n style={{\n left: `${contextMenu.x}px`,\n top: `${contextMenu.y}px`,\n }}\n >\n <div className=\"px-3 py-1 text-xs text-slate-400 border-b border-slate-600\">\n Price: {contextMenu.price.toFixed(3)}\n </div>\n <button\n onClick={() => handleAddLineFromContext('entry')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Entry Line\n </button>\n <button\n onClick={() => handleAddLineFromContext('stopLoss')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Stop Loss\n </button>\n <button\n onClick={() => handleAddLineFromContext('takeProfit')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Take Profit\n </button>\n <div className=\"border-t border-slate-600 my-1\"></div>\n <button\n onClick={() => handleAddLineFromContext('support')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Support Line\n </button>\n <button\n onClick={() => handleAddLineFromContext('resistance')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Resistance Line\n </button>\n <div className=\"border-t border-slate-600 my-1\"></div>\n <button\n onClick={handleClearAllLines}\n className=\"w-full px-3 py-2 text-left text-sm text-red-400 hover:bg-slate-700 transition-colors\"\n >\n Clear All Lines\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// A price line with a `title` renders a title box to the LEFT of its on-axis\n// price value, overhanging into the plot. The floating delete button is placed\n// just left of the value box, so without this allowance it lands on top of the\n// title text. Reserve an approximate title-box width (canvas labels can't be\n// measured) so the button clears the label.\nfunction estimateLabelTitleWidth(title?: string): number {\n if (!title) return 0;\n return title.length * 7 + 18;\n}\n\nfunction getLineStyle(style?: 'solid' | 'dashed' | 'dotted'): LineStyle {\n switch (style) {\n case 'dashed':\n return LineStyle.Dashed;\n case 'dotted':\n return LineStyle.Dotted;\n default:\n return LineStyle.Solid;\n }\n}\n","import { z } from 'zod';\nimport { OHLCVBar } from '../../types/chart';\n\nexport enum IndicatorCategory {\n TREND = 'Trend',\n MOMENTUM = 'Momentum',\n VOLATILITY = 'Volatility',\n VOLUME = 'Volume',\n OSCILLATORS = 'Oscillators',\n}\n\nexport enum ChartSeriesType {\n LINE = 'line',\n HISTOGRAM = 'histogram',\n AREA = 'area',\n}\n\nexport const SettingFieldTypeSchema = z.enum([\n 'number',\n 'color',\n 'boolean',\n 'select',\n 'lineStyle',\n]);\n\nexport const LineStyleSchema = z.enum(['solid', 'dashed', 'dotted']);\n\nexport const SettingFieldSchema = z.object({\n type: SettingFieldTypeSchema,\n label: z.string(),\n defaultValue: z.union([z.string(), z.number(), z.boolean()]),\n description: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n options: z.array(z.object({ label: z.string(), value: z.string() })).optional(),\n});\n\nexport const IndicatorSettingsSchema = z.record(z.string(), SettingFieldSchema);\n\nexport const IndicatorMetadataSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string(),\n category: z.nativeEnum(IndicatorCategory),\n version: z.string().default('1.0.0'),\n});\n\nexport const RenderConfigSchema = z.object({\n seriesType: z.nativeEnum(ChartSeriesType),\n outputCount: z.number().default(1),\n overlay: z.boolean().default(true),\n hasBandFill: z.boolean().optional(),\n fillBands: z.object({\n upper: z.string(),\n lower: z.string(),\n }).optional(),\n});\n\nexport type SettingFieldType = z.infer<typeof SettingFieldTypeSchema>;\nexport type LineStyle = z.infer<typeof LineStyleSchema>;\nexport type SettingField = z.infer<typeof SettingFieldSchema>;\nexport type IndicatorSettings = z.infer<typeof IndicatorSettingsSchema>;\nexport type IndicatorMetadata = z.infer<typeof IndicatorMetadataSchema>;\nexport type RenderConfig = z.infer<typeof RenderConfigSchema>;\n\nexport interface IndicatorOutput {\n time: number;\n value: number;\n [key: string]: number;\n}\n\nexport type IndicatorCalculation = (\n bars: OHLCVBar[],\n settings: Record<string, any>\n) => IndicatorOutput[];\n\nexport interface IndicatorDefinition {\n metadata: IndicatorMetadata;\n settings: IndicatorSettings;\n renderConfig: RenderConfig;\n calculate: IndicatorCalculation;\n}\n\nexport interface IndicatorInstance {\n id: string;\n definitionId: string;\n name: string;\n settings: Record<string, any>;\n data?: IndicatorOutput[];\n}\n\nexport const IndicatorInstanceSchema = z.object({\n id: z.string(),\n definitionId: z.string(),\n name: z.string(),\n settings: z.record(z.string(), z.any()),\n});\n","import { useState, useMemo } from 'react';\nimport { Search, X, Plus } from 'lucide-react';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { IndicatorCategory, IndicatorDefinition } from '../indicators/core/types';\n\ninterface IndicatorBrowserProps {\n isOpen: boolean;\n onClose: () => void;\n onAddIndicator: (definitionId: string) => void;\n}\n\nexport default function IndicatorBrowser({\n isOpen,\n onClose,\n onAddIndicator,\n}: IndicatorBrowserProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<IndicatorCategory | 'All'>('All');\n\n const categories = useMemo(() => {\n return ['All', ...Object.values(IndicatorCategory)];\n }, []);\n\n const filteredIndicators = useMemo(() => {\n let indicators = indicatorRegistry.getAll();\n\n if (selectedCategory !== 'All') {\n indicators = indicators.filter(\n (ind) => ind.metadata.category === selectedCategory\n );\n }\n\n if (searchQuery.trim()) {\n indicators = indicatorRegistry.search(searchQuery);\n if (selectedCategory !== 'All') {\n indicators = indicators.filter(\n (ind) => ind.metadata.category === selectedCategory\n );\n }\n }\n\n return indicators;\n }, [searchQuery, selectedCategory]);\n\n if (!isOpen) return null;\n\n const handleAddIndicator = (definitionId: string) => {\n onAddIndicator(definitionId);\n onClose();\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <div className=\"bg-slate-800 rounded-lg shadow-xl w-full max-w-3xl max-h-[80vh] flex flex-col\">\n <div className=\"flex items-center justify-between p-4 border-b border-slate-700\">\n <h2 className=\"text-lg font-semibold text-slate-100\">Add Indicator</h2>\n <button\n onClick={onClose}\n className=\"text-slate-400 hover:text-slate-200 transition\"\n >\n <X size={20} />\n </button>\n </div>\n\n <div className=\"p-4 border-b border-slate-700\">\n <div className=\"relative\">\n <Search\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-slate-400\"\n size={20}\n />\n <input\n type=\"text\"\n placeholder=\"Search indicators...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-10 pr-4 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n\n <div className=\"flex gap-2 mt-3 overflow-x-auto pb-2\">\n {categories.map((category) => (\n <button\n key={category}\n onClick={() => setSelectedCategory(category as IndicatorCategory | 'All')}\n className={`px-3 py-1.5 rounded-lg text-sm font-medium whitespace-nowrap transition ${\n selectedCategory === category\n ? 'bg-blue-600 text-white'\n : 'bg-slate-700 text-slate-300 hover:bg-slate-600'\n }`}\n >\n {category}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4\">\n {filteredIndicators.length === 0 ? (\n <div className=\"text-center py-12 text-slate-400\">\n <p>No indicators found</p>\n {searchQuery && (\n <p className=\"text-sm mt-2\">\n Try adjusting your search or category filter\n </p>\n )}\n </div>\n ) : (\n <div className=\"grid gap-3\">\n {filteredIndicators.map((indicator) => (\n <IndicatorCard\n key={indicator.metadata.id}\n indicator={indicator}\n onAdd={() => handleAddIndicator(indicator.metadata.id)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface IndicatorCardProps {\n indicator: IndicatorDefinition;\n onAdd: () => void;\n}\n\nfunction IndicatorCard({ indicator, onAdd }: IndicatorCardProps) {\n const getCategoryColor = (category: IndicatorCategory) => {\n switch (category) {\n case IndicatorCategory.TREND:\n return 'bg-blue-500/20 text-blue-400';\n case IndicatorCategory.MOMENTUM:\n return 'bg-purple-500/20 text-purple-400';\n case IndicatorCategory.VOLATILITY:\n return 'bg-orange-500/20 text-orange-400';\n case IndicatorCategory.VOLUME:\n return 'bg-green-500/20 text-green-400';\n case IndicatorCategory.OSCILLATORS:\n return 'bg-pink-500/20 text-pink-400';\n default:\n return 'bg-slate-500/20 text-slate-400';\n }\n };\n\n return (\n <div className=\"bg-slate-700/50 rounded-lg p-4 hover:bg-slate-700 transition group\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2 mb-2\">\n <h3 className=\"text-slate-100 font-medium\">{indicator.metadata.name}</h3>\n <span\n className={`px-2 py-0.5 rounded text-xs font-medium ${getCategoryColor(\n indicator.metadata.category\n )}`}\n >\n {indicator.metadata.category}\n </span>\n </div>\n <p className=\"text-sm text-slate-400\">{indicator.metadata.description}</p>\n </div>\n <button\n onClick={onAdd}\n className=\"flex items-center gap-1.5 px-3 py-1.5 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition text-sm font-medium opacity-0 group-hover:opacity-100\"\n >\n <Plus size={16} />\n Add\n </button>\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { IndicatorSettings, SettingField } from '../indicators/core/types';\n\ninterface IndicatorSettingsFormProps {\n settings: IndicatorSettings;\n currentValues: Record<string, any>;\n onChange: (key: string, value: any) => void;\n}\n\nexport default function IndicatorSettingsForm({\n settings,\n currentValues,\n onChange,\n}: IndicatorSettingsFormProps) {\n return (\n <div className=\"space-y-4\">\n {Object.entries(settings).map(([key, field]) => (\n <div key={key}>\n <label className=\"block text-sm font-medium text-slate-300 mb-1\">\n {field.label}\n </label>\n {field.description && (\n <p className=\"text-xs text-slate-400 mb-2\">{field.description}</p>\n )}\n {renderField(key, field, currentValues[key], onChange)}\n </div>\n ))}\n </div>\n );\n}\n\nfunction parseColor(colorValue: string): { hex: string; opacity: number } {\n const rgbaMatch = colorValue.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)$/);\n\n if (rgbaMatch) {\n const r = parseInt(rgbaMatch[1]);\n const g = parseInt(rgbaMatch[2]);\n const b = parseInt(rgbaMatch[3]);\n const a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1;\n\n const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n return { hex, opacity: Math.round(a * 100) };\n }\n\n return { hex: colorValue, opacity: 100 };\n}\n\nfunction hexToRgba(hex: string, opacity: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n const a = opacity / 100;\n\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\nfunction ColorPicker({ value, defaultValue, onChange }: { value: any; defaultValue: string; onChange: (value: string) => void }) {\n const colorValue = value ?? defaultValue;\n const { hex, opacity } = parseColor(colorValue);\n\n const [localHex, setLocalHex] = useState(hex);\n const [localOpacity, setLocalOpacity] = useState(opacity);\n\n const handleColorChange = (newHex: string) => {\n setLocalHex(newHex);\n onChange(hexToRgba(newHex, localOpacity));\n };\n\n const handleOpacityChange = (newOpacity: number) => {\n setLocalOpacity(newOpacity);\n onChange(hexToRgba(localHex, newOpacity));\n };\n\n const handleTextChange = (newValue: string) => {\n const parsed = parseColor(newValue);\n setLocalHex(parsed.hex);\n setLocalOpacity(parsed.opacity);\n onChange(newValue);\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n value={localHex}\n onChange={(e) => handleColorChange(e.target.value)}\n className=\"w-12 h-10 rounded cursor-pointer\"\n />\n <input\n type=\"text\"\n value={colorValue}\n onChange={(e) => handleTextChange(e.target.value)}\n className=\"flex-1 px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={localOpacity}\n onChange={(e) => handleOpacityChange(parseInt(e.target.value))}\n className=\"flex-1 h-2 bg-slate-600 rounded-lg appearance-none cursor-pointer\"\n />\n <span className=\"text-sm text-slate-400 w-12 text-right\">{localOpacity}%</span>\n </div>\n </div>\n );\n}\n\nfunction renderField(\n key: string,\n field: SettingField,\n value: any,\n onChange: (key: string, value: any) => void\n) {\n switch (field.type) {\n case 'number':\n return (\n <input\n type=\"number\"\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, parseFloat(e.target.value))}\n min={field.min}\n max={field.max}\n step={field.step}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n );\n\n case 'color':\n return (\n <ColorPicker\n value={value}\n defaultValue={field.defaultValue as string}\n onChange={(newValue) => onChange(key, newValue)}\n />\n );\n\n case 'boolean':\n return (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.checked)}\n className=\"w-4 h-4 text-blue-600 bg-slate-700 border-slate-600 rounded focus:ring-blue-500\"\n />\n <span className=\"text-sm text-slate-300\">\n {value ?? field.defaultValue ? 'Enabled' : 'Disabled'}\n </span>\n </label>\n );\n\n case 'select':\n return (\n <select\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {field.options?.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n );\n\n case 'lineStyle':\n return (\n <select\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"solid\">Solid</option>\n <option value=\"dashed\">Dashed</option>\n <option value=\"dotted\">Dotted</option>\n </select>\n );\n\n default:\n return (\n <input\n type=\"text\"\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n );\n }\n}\n","import { useState, useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport IndicatorSettingsForm from './IndicatorSettingsForm';\n\ninterface SettingsDialogProps {\n isOpen: boolean;\n onClose: () => void;\n indicator: IndicatorInstance | null;\n onSave: (indicatorId: string, settings: Record<string, any>) => void;\n}\n\nexport default function SettingsDialog({\n isOpen,\n onClose,\n indicator,\n onSave,\n}: SettingsDialogProps) {\n const [settings, setSettings] = useState<Record<string, any>>({});\n\n useEffect(() => {\n if (indicator) {\n setSettings({ ...indicator.settings });\n }\n }, [indicator]);\n\n if (!isOpen || !indicator) return null;\n\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return null;\n\n const handleSave = () => {\n onSave(indicator.id, settings);\n onClose();\n };\n\n const handleChange = (key: string, value: any) => {\n setSettings((prev) => ({\n ...prev,\n [key]: value,\n }));\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <div className=\"bg-slate-800 rounded-lg shadow-xl w-full max-w-md\">\n <div className=\"flex items-center justify-between p-4 border-b border-slate-700\">\n <h2 className=\"text-lg font-semibold text-slate-100\">\n {indicator.name} Settings\n </h2>\n <button\n onClick={onClose}\n className=\"text-slate-400 hover:text-slate-200 transition\"\n >\n <X size={20} />\n </button>\n </div>\n\n <div className=\"p-4\">\n <IndicatorSettingsForm\n settings={definition.settings}\n currentValues={settings}\n onChange={handleChange}\n />\n </div>\n\n <div className=\"flex items-center justify-end gap-2 p-4 border-t border-slate-700\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-slate-300 hover:text-slate-100 transition\"\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n className=\"px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition\"\n >\n Save Changes\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { ChartLine } from '../types/chart';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { indicatorCalculator } from '../indicators/core/calculator';\nimport { PersistenceAdapter } from '../indicators/core/persistence';\n\ninterface UseChartAPIOptions {\n persistenceAdapter?: PersistenceAdapter;\n}\n\nexport function useChartAPI(options?: UseChartAPIOptions) {\n const [lines, setLines] = useState<ChartLine[]>([]);\n const [indicators, setIndicators] = useState<IndicatorInstance[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (options?.persistenceAdapter) {\n options.persistenceAdapter.loadIndicators().then((loaded) => {\n setIndicators(loaded);\n setIsLoading(false);\n });\n } else {\n setIsLoading(false);\n }\n }, [options?.persistenceAdapter]);\n\n useEffect(() => {\n if (!isLoading && options?.persistenceAdapter) {\n options.persistenceAdapter.saveIndicators(indicators);\n }\n }, [indicators, isLoading, options?.persistenceAdapter]);\n\n const addLine = useCallback(\n (\n id: string,\n price: number,\n options?: {\n color?: string;\n lineWidth?: number;\n lineStyle?: 'solid' | 'dashed' | 'dotted';\n title?: string;\n }\n ) => {\n const newLine: ChartLine = {\n id,\n price,\n color: options?.color || '#3b82f6',\n lineWidth: options?.lineWidth || 2,\n lineStyle: options?.lineStyle || 'solid',\n title: options?.title,\n };\n setLines((prev) => [...prev, newLine]);\n },\n []\n );\n\n const removeLine = useCallback((id: string) => {\n setLines((prev) => prev.filter((line) => line.id !== id));\n }, []);\n\n const updateLine = useCallback((id: string, price: number) => {\n setLines((prev) =>\n prev.map((line) => (line.id === id ? { ...line, price } : line))\n );\n }, []);\n\n const addEntryLine = useCallback(\n (price: number) => {\n const id = `entry-${Date.now()}`;\n addLine(id, price, {\n color: '#3b82f6',\n title: 'Entry',\n lineStyle: 'solid',\n });\n },\n [addLine]\n );\n\n const addStopLoss = useCallback(\n (price: number) => {\n const id = `stop-loss-${Date.now()}`;\n addLine(id, price, {\n color: '#ef4444',\n title: 'Stop Loss',\n lineStyle: 'dashed',\n });\n },\n [addLine]\n );\n\n const addTakeProfit = useCallback(\n (price: number) => {\n const id = `take-profit-${Date.now()}`;\n addLine(id, price, {\n color: '#10b981',\n title: 'Take Profit',\n lineStyle: 'dashed',\n });\n },\n [addLine]\n );\n\n const addSupportLine = useCallback(\n (price: number) => {\n const id = `support-${Date.now()}`;\n addLine(id, price, {\n color: '#10b981',\n title: 'Support',\n lineStyle: 'dotted',\n });\n },\n [addLine]\n );\n\n const addResistanceLine = useCallback(\n (price: number) => {\n const id = `resistance-${Date.now()}`;\n addLine(id, price, {\n color: '#f97316',\n title: 'Resistance',\n lineStyle: 'dotted',\n });\n },\n [addLine]\n );\n\n const clearAllLines = useCallback(() => {\n setLines([]);\n }, []);\n\n const addLineByType = useCallback(\n (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance', price: number) => {\n if (type === 'entry') {\n addEntryLine(price);\n } else if (type === 'stopLoss') {\n addStopLoss(price);\n } else if (type === 'takeProfit') {\n addTakeProfit(price);\n } else if (type === 'support') {\n addSupportLine(price);\n } else if (type === 'resistance') {\n addResistanceLine(price);\n }\n },\n [addEntryLine, addStopLoss, addTakeProfit, addSupportLine, addResistanceLine]\n );\n\n const addIndicator = useCallback((definitionId: string, customSettings?: Record<string, any>) => {\n const instance = indicatorRegistry.createInstance(definitionId, customSettings);\n setIndicators((prev) => [...prev, instance]);\n return instance;\n }, []);\n\n const removeIndicator = useCallback((id: string) => {\n setIndicators((prev) => prev.filter((indicator) => indicator.id !== id));\n indicatorCalculator.invalidateCache(id);\n }, []);\n\n const updateIndicatorSettings = useCallback(\n (id: string, settings: Record<string, any>) => {\n setIndicators((prev) =>\n prev.map((indicator) =>\n indicator.id === id ? { ...indicator, settings } : indicator\n )\n );\n indicatorCalculator.invalidateCache(id);\n },\n []\n );\n\n return {\n lines,\n indicators,\n isLoadingIndicators: isLoading,\n addLine,\n removeLine,\n updateLine,\n addEntryLine,\n addStopLoss,\n addTakeProfit,\n addSupportLine,\n addResistanceLine,\n clearAllLines,\n addLineByType,\n addIndicator,\n removeIndicator,\n updateIndicatorSettings,\n };\n}\n","import { OHLCVBar } from '../types/chart';\n\nexport function validateBar(bar: any): bar is OHLCVBar {\n if (!bar || typeof bar !== 'object') return false;\n\n const required = ['timestamp', 'open', 'high', 'low', 'close', 'volume'];\n for (const field of required) {\n if (!(field in bar)) return false;\n if (typeof bar[field] !== 'number') return false;\n }\n\n if (bar.timestamp <= 0) return false;\n if (bar.open <= 0 || bar.high <= 0 || bar.low <= 0 || bar.close <= 0) return false;\n if (bar.volume < 0) return false;\n if (bar.high < bar.low) return false;\n if (bar.high < bar.open || bar.high < bar.close) return false;\n if (bar.low > bar.open || bar.low > bar.close) return false;\n\n return true;\n}\n\nexport function isValidBar(bar: any): bar is OHLCVBar {\n return validateBar(bar);\n}\n\nexport function normalizeTimestamp(timestamp: number): number {\n if (timestamp < 10000000000) {\n return timestamp * 1000;\n }\n return timestamp;\n}\n\nexport function sortBars(bars: OHLCVBar[]): OHLCVBar[] {\n return [...bars].sort((a, b) => a.timestamp - b.timestamp);\n}\n\nexport function deduplicateBars(bars: OHLCVBar[]): OHLCVBar[] {\n const seen = new Map<number, OHLCVBar>();\n\n for (const bar of bars) {\n const existing = seen.get(bar.timestamp);\n if (!existing) {\n seen.set(bar.timestamp, bar);\n }\n }\n\n return Array.from(seen.values()).sort((a, b) => a.timestamp - b.timestamp);\n}\n\nexport function mergeBars(existingBars: OHLCVBar[], newBars: OHLCVBar[]): OHLCVBar[] {\n const allBars = [...existingBars, ...newBars];\n return deduplicateBars(allBars);\n}\n\nexport function validateAndNormalizeBars(bars: any[]): OHLCVBar[] {\n console.log(`validateAndNormalizeBars: received ${bars.length} bars`);\n const validated = bars\n .filter(bar => {\n if (!validateBar(bar)) {\n console.warn('Invalid bar data:', bar);\n return false;\n }\n return true;\n })\n .map(bar => ({\n ...bar,\n timestamp: normalizeTimestamp(bar.timestamp),\n }));\n console.log(`validateAndNormalizeBars: returning ${validated.length} valid bars`);\n return validated;\n}\n\nexport function updateBarInArray(bars: OHLCVBar[], updatedBar: OHLCVBar): OHLCVBar[] {\n const index = bars.findIndex(b => b.timestamp === updatedBar.timestamp);\n\n if (index === -1) {\n return [...bars, updatedBar].sort((a, b) => a.timestamp - b.timestamp);\n }\n\n const updated = [...bars];\n updated[index] = updatedBar;\n return updated;\n}\n\nexport function appendBar(bars: OHLCVBar[], newBar: OHLCVBar): OHLCVBar[] {\n const exists = bars.find(b => b.timestamp === newBar.timestamp);\n if (exists) {\n return bars;\n }\n\n return [...bars, newBar];\n}\n\nexport function prependBars(bars: OHLCVBar[], newBars: OHLCVBar[]): OHLCVBar[] {\n const existingTimestamps = new Set(bars.map(b => b.timestamp));\n const uniqueNewBars = newBars.filter(b => !existingTimestamps.has(b.timestamp));\n\n return [...uniqueNewBars, ...bars];\n}\n\nexport function getOldestBar(bars: OHLCVBar[]): OHLCVBar | null {\n if (bars.length === 0) return null;\n return bars[0];\n}\n\nexport function getNewestBar(bars: OHLCVBar[]): OHLCVBar | null {\n if (bars.length === 0) return null;\n return bars[bars.length - 1];\n}\n\nexport function updateCurrentBar(\n bars: OHLCVBar[],\n tradePrice: number,\n tradeVolume: number\n): OHLCVBar[] {\n if (bars.length === 0) return bars;\n\n const updated = [...bars];\n const lastBar = { ...updated[updated.length - 1] };\n\n lastBar.close = tradePrice;\n lastBar.high = Math.max(lastBar.high, tradePrice);\n lastBar.low = Math.min(lastBar.low, tradePrice);\n lastBar.volume += tradeVolume;\n\n updated[updated.length - 1] = lastBar;\n return updated;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { OHLCVBar } from '../types/chart';\nimport {\n appendBar as appendBarUtil,\n prependBars as prependBarsUtil,\n updateBarInArray,\n deduplicateBars,\n sortBars,\n validateAndNormalizeBars,\n updateCurrentBar as updateCurrentBarUtil,\n} from '../utils/barUtils';\nimport { BarDataAdapter, HistoricalDataParams, RealtimeSubscription } from '../adapters/types';\n\nexport interface UseBarsDataOptions {\n adapter?: BarDataAdapter;\n symbol?: string;\n timeframe?: string;\n autoFetch?: boolean;\n autoSubscribe?: boolean;\n limit?: number;\n}\n\nexport interface UseBarsDataReturn {\n bars: OHLCVBar[];\n loading: boolean;\n error: Error | null;\n connected: boolean;\n\n setBars: (bars: OHLCVBar[]) => void;\n appendBar: (bar: OHLCVBar) => void;\n updateLastBar: (bar: OHLCVBar) => void;\n updateCurrentBar: (tradePrice: number, tradeVolume: number) => void;\n prependBars: (bars: OHLCVBar[]) => void;\n clearBars: () => void;\n\n fetchHistorical: (params?: Partial<HistoricalDataParams>) => Promise<void>;\n subscribe: () => void;\n unsubscribe: () => void;\n\n refetch: () => Promise<void>;\n}\n\nexport function useBarsData(options: UseBarsDataOptions = {}): UseBarsDataReturn {\n const {\n adapter,\n symbol = 'AAPL',\n timeframe = '5Min',\n autoFetch = false,\n autoSubscribe = false,\n limit = 500,\n } = options;\n\n const [bars, setBarsState] = useState<OHLCVBar[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [connected, setConnected] = useState(false);\n\n const subscriptionRef = useRef<RealtimeSubscription | null>(null);\n const isMountedRef = useRef(true);\n const hasInitialFetchRef = useRef(false);\n const isFetchingRef = useRef(false);\n\n const setBars = useCallback((newBars: OHLCVBar[]) => {\n const validated = validateAndNormalizeBars(newBars);\n const sorted = sortBars(validated);\n setBarsState(sorted);\n }, []);\n\n const appendBar = useCallback((bar: OHLCVBar) => {\n setBarsState(prev => appendBarUtil(prev, bar));\n }, []);\n\n const updateLastBar = useCallback((bar: OHLCVBar) => {\n setBarsState(prev => {\n if (prev.length === 0) return [bar];\n const updated = [...prev];\n updated[updated.length - 1] = bar;\n return updated;\n });\n }, []);\n\n const updateCurrentBar = useCallback((tradePrice: number, tradeVolume: number) => {\n setBarsState(prev => updateCurrentBarUtil(prev, tradePrice, tradeVolume));\n }, []);\n\n const prependBars = useCallback((newBars: OHLCVBar[]) => {\n const validated = validateAndNormalizeBars(newBars);\n setBarsState(prev => prependBarsUtil(prev, validated));\n }, []);\n\n const clearBars = useCallback(() => {\n setBarsState([]);\n }, []);\n\n const fetchHistorical = useCallback(\n async (params: Partial<HistoricalDataParams> = {}) => {\n if (!adapter) {\n setError(new Error('No adapter provided'));\n return;\n }\n\n if (isFetchingRef.current) {\n console.log('fetchHistorical: already fetching, skipping');\n return;\n }\n\n console.log('fetchHistorical called, params:', params);\n console.log('isMountedRef.current:', isMountedRef.current);\n isFetchingRef.current = true;\n setLoading(true);\n setError(null);\n\n try {\n const fetchParams: HistoricalDataParams = {\n symbol: params.symbol || symbol,\n timeframe: params.timeframe || timeframe,\n limit: params.limit || limit,\n before: params.before,\n after: params.after,\n };\n\n console.log('Calling adapter.fetchHistoricalBars with:', fetchParams);\n const data = await adapter.fetchHistoricalBars(fetchParams);\n console.log('adapter.fetchHistoricalBars returned, data.length:', data.length);\n\n if (isMountedRef.current) {\n console.log('Component still mounted, processing data');\n const validated = validateAndNormalizeBars(data);\n\n if (params.before) {\n console.log('Prepending bars (before param present)');\n setBarsState(prev => prependBarsUtil(prev, validated));\n } else {\n console.log('Setting initial bars (no before param)');\n const sorted = sortBars(validated);\n setBarsState(sorted);\n }\n } else {\n console.log('Component unmounted, skipping data update');\n }\n } catch (err) {\n console.log('Error caught:', err);\n if (isMountedRef.current) {\n const error = err instanceof Error ? err : new Error('Failed to fetch historical data');\n setError(error);\n console.error('Failed to fetch historical data:', error);\n }\n } finally {\n console.log('Finally block executing, isMountedRef.current:', isMountedRef.current);\n isFetchingRef.current = false;\n if (isMountedRef.current) {\n console.log('Setting loading to false');\n setLoading(false);\n } else {\n console.log('Skipping setLoading(false) - component unmounted');\n }\n }\n },\n [adapter, symbol, timeframe, limit]\n );\n\n const subscribe = useCallback(() => {\n if (!adapter?.subscribeRealtime) {\n console.warn('Adapter does not support real-time subscriptions');\n return;\n }\n\n if (subscriptionRef.current) {\n console.warn('Already subscribed');\n return;\n }\n\n subscriptionRef.current = adapter.subscribeRealtime(symbol, {\n onBar: (bar) => {\n if (isMountedRef.current) {\n appendBar(bar);\n }\n },\n onTrade: (price, volume) => {\n if (isMountedRef.current) {\n updateCurrentBar(price, volume);\n }\n },\n onError: (err) => {\n if (isMountedRef.current) {\n setError(err);\n setConnected(false);\n }\n },\n onConnect: () => {\n if (isMountedRef.current) {\n setConnected(true);\n }\n },\n onDisconnect: () => {\n if (isMountedRef.current) {\n setConnected(false);\n }\n },\n });\n }, [adapter, symbol, appendBar, updateCurrentBar]);\n\n const unsubscribe = useCallback(() => {\n if (subscriptionRef.current) {\n subscriptionRef.current.unsubscribe();\n subscriptionRef.current = null;\n setConnected(false);\n }\n }, []);\n\n const refetch = useCallback(async () => {\n await fetchHistorical();\n }, [fetchHistorical]);\n\n useEffect(() => {\n console.log('useEffect[autoFetch] running, autoFetch:', autoFetch, 'adapter:', !!adapter, 'hasInitialFetch:', hasInitialFetchRef.current);\n if (autoFetch && adapter && !hasInitialFetchRef.current) {\n console.log('Calling fetchHistorical from useEffect (initial fetch)');\n hasInitialFetchRef.current = true;\n fetchHistorical();\n }\n }, [autoFetch, adapter, fetchHistorical]);\n\n useEffect(() => {\n if (autoSubscribe && adapter?.subscribeRealtime) {\n subscribe();\n }\n\n return () => {\n unsubscribe();\n };\n }, [autoSubscribe, adapter, subscribe, unsubscribe]);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n if (subscriptionRef.current) {\n subscriptionRef.current.unsubscribe();\n subscriptionRef.current = null;\n }\n };\n }, []);\n\n return {\n bars,\n loading,\n error,\n connected,\n setBars,\n appendBar,\n updateLastBar,\n updateCurrentBar,\n prependBars,\n clearBars,\n fetchHistorical,\n subscribe,\n unsubscribe,\n refetch,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { OHLCVBar } from '../types/chart';\n\ninterface RealtimeUpdateConfig {\n enabled: boolean;\n updateIntervalMs: number;\n newBarIntervalMs: number;\n}\n\nexport function useRealtimeUpdates(\n initialBars: OHLCVBar[],\n config: RealtimeUpdateConfig\n) {\n const [bars, setBars] = useState<OHLCVBar[]>([]);\n const updateIntervalRef = useRef<number>();\n const newBarIntervalRef = useRef<number>();\n const lastBarTimeRef = useRef<number>(0);\n const initializedRef = useRef(false);\n\n const updateCurrentBar = useCallback((tradePrice: number, tradeVolume: number) => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const updated = [...prev];\n const lastBar = { ...updated[updated.length - 1] };\n\n lastBar.close = tradePrice;\n lastBar.high = Math.max(lastBar.high, tradePrice);\n lastBar.low = Math.min(lastBar.low, tradePrice);\n lastBar.volume += tradeVolume;\n\n updated[updated.length - 1] = lastBar;\n return updated;\n });\n }, []);\n\n const addNewBar = useCallback((newBar: OHLCVBar) => {\n setBars((prev) => {\n const exists = prev.find(b => b.timestamp === newBar.timestamp);\n if (exists) return prev;\n return [...prev, newBar];\n });\n }, []);\n\n const prependBars = useCallback((newBars: OHLCVBar[]) => {\n setBars((prev) => {\n const existingTimestamps = new Set(prev.map(b => b.timestamp));\n const uniqueNewBars = newBars.filter(b => !existingTimestamps.has(b.timestamp));\n return [...uniqueNewBars, ...prev];\n });\n }, []);\n\n const generateRealisticPriceMove = useCallback((currentPrice: number): number => {\n const volatility = 0.0005;\n const drift = 0;\n const change = currentPrice * (drift + volatility * (Math.random() * 2 - 1));\n return currentPrice + change;\n }, []);\n\n useEffect(() => {\n if (!initializedRef.current && initialBars.length > 0) {\n setBars(initialBars);\n initializedRef.current = true;\n }\n }, [initialBars]);\n\n useEffect(() => {\n if (!config.enabled || bars.length === 0) return;\n\n const lastBar = bars[bars.length - 1];\n lastBarTimeRef.current = lastBar.timestamp;\n\n updateIntervalRef.current = window.setInterval(() => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const updated = [...prev];\n const currentBar = { ...updated[updated.length - 1] };\n\n const newPrice = currentBar.close * (1 + (Math.random() - 0.5) * 0.001);\n const newVolume = Math.floor(Math.random() * 100) + 10;\n\n currentBar.close = newPrice;\n currentBar.high = Math.max(currentBar.high, newPrice);\n currentBar.low = Math.min(currentBar.low, newPrice);\n currentBar.volume += newVolume;\n\n updated[updated.length - 1] = currentBar;\n return updated;\n });\n }, config.updateIntervalMs);\n\n newBarIntervalRef.current = window.setInterval(() => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const lastBar = prev[prev.length - 1];\n const newTimestamp = lastBar.timestamp + config.newBarIntervalMs;\n\n const newPrice = lastBar.close * (1 + (Math.random() - 0.5) * 0.002);\n\n const newBar: OHLCVBar = {\n timestamp: newTimestamp,\n open: lastBar.close,\n high: newPrice,\n low: Math.min(lastBar.close, newPrice),\n close: newPrice,\n volume: Math.floor(Math.random() * 1000) + 100,\n };\n\n lastBarTimeRef.current = newTimestamp;\n return [...prev, newBar];\n });\n }, config.newBarIntervalMs);\n\n return () => {\n if (updateIntervalRef.current) {\n clearInterval(updateIntervalRef.current);\n }\n if (newBarIntervalRef.current) {\n clearInterval(newBarIntervalRef.current);\n }\n };\n }, [config.enabled, config.updateIntervalMs, config.newBarIntervalMs, bars.length]);\n\n return {\n bars,\n updateCurrentBar,\n addNewBar,\n prependBars,\n };\n}\n","import { IndicatorInstance } from './types';\n\nexport interface PersistenceAdapter {\n saveIndicators(indicators: IndicatorInstance[]): Promise<void>;\n loadIndicators(): Promise<IndicatorInstance[]>;\n deleteIndicator(id: string): Promise<void>;\n}\n\nexport class LocalStoragePersistenceAdapter implements PersistenceAdapter {\n private storageKey = 'chart_indicators';\n\n async saveIndicators(indicators: IndicatorInstance[]): Promise<void> {\n try {\n const serialized = JSON.stringify(indicators);\n localStorage.setItem(this.storageKey, serialized);\n } catch (error) {\n console.error('Error saving indicators to localStorage:', error);\n }\n }\n\n async loadIndicators(): Promise<IndicatorInstance[]> {\n try {\n const serialized = localStorage.getItem(this.storageKey);\n if (!serialized) {\n return [];\n }\n\n const parsed = JSON.parse(serialized);\n return Array.isArray(parsed) ? parsed : [];\n } catch (error) {\n console.error('Error loading indicators from localStorage:', error);\n return [];\n }\n }\n\n async deleteIndicator(id: string): Promise<void> {\n try {\n const indicators = await this.loadIndicators();\n const filtered = indicators.filter((ind) => ind.id !== id);\n await this.saveIndicators(filtered);\n } catch (error) {\n console.error('Error deleting indicator from localStorage:', error);\n }\n }\n}\n\nexport class NoOpPersistenceAdapter implements PersistenceAdapter {\n async saveIndicators(indicators: IndicatorInstance[]): Promise<void> {\n }\n\n async loadIndicators(): Promise<IndicatorInstance[]> {\n return [];\n }\n\n async deleteIndicator(id: string): Promise<void> {\n }\n}\n\nexport function createPersistenceAdapter(\n kind: 'noop' | 'localStorage'\n): PersistenceAdapter {\n switch (kind) {\n case 'localStorage':\n return new LocalStoragePersistenceAdapter();\n case 'noop':\n return new NoOpPersistenceAdapter();\n default:\n throw new Error('Unknown persistence kind: ' + kind);\n }\n}\n","import { OHLCVBar } from '../../types/chart';\n\nexport function padIndicatorArray(result: number[], barsLength: number): number[] {\n const missing = barsLength - result.length;\n if (missing <= 0) return result;\n return [...Array(missing).fill(NaN), ...result];\n}\n\nexport function displaceArray(arr: number[], offset: number): number[] {\n if (offset <= 0) return arr;\n return [...arr.slice(offset), ...Array(offset).fill(NaN)];\n}\n\nexport function calculateSMA(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period - 1) {\n result.push(NaN);\n } else {\n let sum = 0;\n for (let j = 0; j < period; j++) {\n sum += bars[i - j].close;\n }\n result.push(sum / period);\n }\n }\n\n return result;\n}\n\nexport function calculateEMA(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n const multiplier = 2 / (period + 1);\n\n let ema = 0;\n let hasStarted = false;\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period - 1) {\n result.push(NaN);\n } else if (i === period - 1) {\n let sum = 0;\n for (let j = 0; j < period; j++) {\n sum += bars[i - j].close;\n }\n ema = sum / period;\n result.push(ema);\n hasStarted = true;\n } else {\n ema = (bars[i].close - ema) * multiplier + ema;\n result.push(ema);\n }\n }\n\n return result;\n}\n\nexport function calculateRSI(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n const changes: number[] = [];\n\n for (let i = 1; i < bars.length; i++) {\n changes.push(bars[i].close - bars[i - 1].close);\n }\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period) {\n result.push(NaN);\n } else {\n let gains = 0;\n let losses = 0;\n\n for (let j = i - period; j < i; j++) {\n const change = changes[j - 1];\n if (change > 0) {\n gains += change;\n } else {\n losses += Math.abs(change);\n }\n }\n\n const avgGain = gains / period;\n const avgLoss = losses / period;\n\n if (avgLoss === 0) {\n result.push(100);\n } else {\n const rs = avgGain / avgLoss;\n const rsi = 100 - 100 / (1 + rs);\n result.push(rsi);\n }\n }\n }\n\n return result;\n}\n\nexport function calculateStandardDeviation(values: number[], period: number): number[] {\n const result: number[] = [];\n\n for (let i = 0; i < values.length; i++) {\n if (i < period - 1 || isNaN(values[i])) {\n result.push(NaN);\n } else {\n let sum = 0;\n let count = 0;\n\n for (let j = 0; j < period; j++) {\n const val = values[i - j];\n if (!isNaN(val)) {\n sum += val;\n count++;\n }\n }\n\n const mean = sum / count;\n let squaredDiffSum = 0;\n\n for (let j = 0; j < period; j++) {\n const val = values[i - j];\n if (!isNaN(val)) {\n squaredDiffSum += Math.pow(val - mean, 2);\n }\n }\n\n const variance = squaredDiffSum / count;\n result.push(Math.sqrt(variance));\n }\n }\n\n return result;\n}\n\nexport function calculateBollingerBands(\n bars: OHLCVBar[],\n period: number,\n stdDev: number\n): { upper: number[]; middle: number[]; lower: number[] } {\n const middle = calculateSMA(bars, period);\n const closes = bars.map((b) => b.close);\n const std = calculateStandardDeviation(closes, period);\n\n const upper: number[] = [];\n const lower: number[] = [];\n\n for (let i = 0; i < middle.length; i++) {\n if (isNaN(middle[i]) || isNaN(std[i])) {\n upper.push(NaN);\n lower.push(NaN);\n } else {\n upper.push(middle[i] + std[i] * stdDev);\n lower.push(middle[i] - std[i] * stdDev);\n }\n }\n\n return { upper, middle, lower };\n}\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateSMA } from '../utils/calculations';\n\nexport const SMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'sma',\n name: 'SMA',\n description: 'Simple Moving Average - smooths price data by averaging over a period',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to average',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the SMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the SMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const smaValues = calculateSMA(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: smaValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateEMA } from '../utils/calculations';\n\nexport const EMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'ema',\n name: 'EMA',\n description: 'Exponential Moving Average - gives more weight to recent prices',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 12,\n description: 'Number of bars for EMA calculation',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#10b981',\n description: 'Color of the EMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the EMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const emaValues = calculateEMA(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: emaValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateRSI } from '../utils/calculations';\n\nexport const RSIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'rsi',\n name: 'RSI',\n description: 'Relative Strength Index - momentum oscillator measuring speed and magnitude of price changes',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for RSI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#8b5cf6',\n description: 'Color of the RSI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the RSI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const rsiValues = calculateRSI(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: rsiValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateBollingerBands } from '../utils/calculations';\n\nexport const BollingerBandsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'bollinger',\n name: 'Bollinger Bands',\n description: 'Bollinger Bands - volatility bands placed above and below a moving average',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars for moving average',\n min: 2,\n max: 200,\n step: 1,\n },\n stdDev: {\n type: 'number',\n label: 'Standard Deviation',\n defaultValue: 2,\n description: 'Number of standard deviations for bands',\n min: 0.5,\n max: 5,\n step: 0.1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Band Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle band',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the band lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Show shaded area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the shaded area between bands',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const { upper, middle, lower } = calculateBollingerBands(\n bars,\n settings.period,\n settings.stdDev\n );\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: middle[i],\n upper: upper[i],\n lower: lower[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { OHLCVBar } from '../../types/chart';\n\ntype ResetPeriod = 'none' | 'daily' | 'weekly' | 'monthly';\n\nfunction calculateVWAPWithBands(\n bars: OHLCVBar[],\n {\n reset = 'none' as ResetPeriod,\n bandMultiplier = 1,\n includeBands = true,\n }: {\n reset?: ResetPeriod;\n bandMultiplier?: number;\n includeBands?: boolean;\n }\n) {\n if (!bars.length) return { vwap: [], upper: [], lower: [] };\n\n let cumulativeVolume = 0;\n let cumulativeTPV = 0;\n let sessionPrices: number[] = [];\n\n const vwap: number[] = [];\n const upper: number[] = [];\n const lower: number[] = [];\n\n const getWeek = (d: Date) => {\n const day = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));\n const dayNum = day.getUTCDay() || 7;\n day.setUTCDate(day.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(day.getUTCFullYear(), 0, 1));\n return Math.ceil(\n ((day.getTime() - yearStart.getTime()) / 86400000 + 1) / 7,\n );\n };\n\n const std = (arr: number[]) => {\n const mean = arr.reduce((a, b) => a + b, 0) / arr.length;\n return Math.sqrt(arr.reduce((a, b) => a + (b - mean) ** 2, 0) / arr.length);\n };\n\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i];\n const typical = (bar.high + bar.low + bar.close) / 3;\n\n if (i > 0 && reset !== 'none') {\n const prev = new Date(bars[i - 1].timestamp);\n const curr = new Date(bar.timestamp);\n let resetFlag = false;\n\n if (reset === 'daily') {\n resetFlag =\n curr.getDate() !== prev.getDate() ||\n curr.getMonth() !== prev.getMonth() ||\n curr.getFullYear() !== prev.getFullYear();\n } else if (reset === 'weekly') {\n resetFlag =\n getWeek(curr) !== getWeek(prev) ||\n curr.getFullYear() !== prev.getFullYear();\n } else if (reset === 'monthly') {\n resetFlag =\n curr.getMonth() !== prev.getMonth() ||\n curr.getFullYear() !== prev.getFullYear();\n }\n\n if (resetFlag) {\n cumulativeVolume = 0;\n cumulativeTPV = 0;\n sessionPrices = [];\n }\n }\n\n cumulativeTPV += typical * bar.volume;\n cumulativeVolume += bar.volume;\n sessionPrices.push(typical);\n\n const vwapValue = cumulativeTPV / cumulativeVolume;\n vwap.push(vwapValue);\n\n if (includeBands && sessionPrices.length > 1) {\n const sigma = std(sessionPrices);\n upper.push(vwapValue + sigma * bandMultiplier);\n lower.push(vwapValue - sigma * bandMultiplier);\n } else {\n upper.push(NaN);\n lower.push(NaN);\n }\n }\n\n return { vwap, upper, lower };\n}\n\nexport const VWAPIndicator: IndicatorDefinition = {\n metadata: {\n id: 'vwap',\n name: 'VWAP',\n description: 'Volume Weighted Average Price with standard deviation bands',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n reset: {\n type: 'select',\n label: 'Reset Period',\n defaultValue: 'daily',\n description: 'When to reset VWAP calculation',\n options: [\n { label: 'None', value: 'none' },\n { label: 'Daily', value: 'daily' },\n { label: 'Weekly', value: 'weekly' },\n { label: 'Monthly', value: 'monthly' },\n ],\n },\n bandMultiplier: {\n type: 'number',\n label: 'Band Multiplier',\n defaultValue: 1,\n description: 'Standard deviation multiplier for bands',\n min: 0.5,\n max: 5,\n step: 0.1,\n },\n showBands: {\n type: 'boolean',\n label: 'Show Bands',\n defaultValue: true,\n description: 'Show standard deviation bands',\n },\n vwapColor: {\n type: 'color',\n label: 'VWAP Color',\n defaultValue: '#f59e0b',\n description: 'Color of the VWAP line',\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Show shaded area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(245, 158, 11, 0.1)',\n description: 'Color of the shaded area between bands',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const { vwap, upper, lower } = calculateVWAPWithBands(bars, {\n reset: settings.reset as ResetPeriod,\n bandMultiplier: settings.bandMultiplier,\n includeBands: settings.showBands,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: vwap[i],\n upper: upper[i],\n lower: lower[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { stochastic } from 'fast-technical-indicators';\n\nexport const StochasticIndicator: IndicatorDefinition = {\n metadata: {\n id: 'stochastic',\n name: 'Stochastic Oscillator',\n description: 'Compares closing price to price range over time - momentum indicator',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period (K)',\n defaultValue: 14,\n description: 'Number of bars for %K calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n signalPeriod: {\n type: 'number',\n label: 'Signal Period (D)',\n defaultValue: 3,\n description: 'Number of bars for %D signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n kColor: {\n type: 'color',\n label: '%K Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the %K line',\n },\n dColor: {\n type: 'color',\n label: '%D Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the %D signal line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 2,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const stochValues = stochastic({\n high,\n low,\n close,\n period: settings.period,\n signalPeriod: settings.signalPeriod,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: stochValues[i]?.k ?? NaN,\n signal: stochValues[i]?.d ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { obv } from 'fast-technical-indicators';\n\nexport const OBVIndicator: IndicatorDefinition = {\n metadata: {\n id: 'obv',\n name: 'OBV',\n description: 'On-Balance Volume - cumulative volume indicator showing buying/selling pressure',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#10b981',\n description: 'Color of the OBV line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the OBV line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars) => {\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const obvValues = obv({ close, volume });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: obvValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { mfi } from 'fast-technical-indicators';\n\nexport const MFIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'mfi',\n name: 'MFI',\n description: 'Money Flow Index - volume-weighted momentum indicator (RSI with volume)',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for MFI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#f59e0b',\n description: 'Color of the MFI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the MFI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const mfiValues = mfi({\n high,\n low,\n close,\n volume,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: mfiValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { forceindex } from 'fast-technical-indicators';\n\nexport const ForceIndexIndicator: IndicatorDefinition = {\n metadata: {\n id: 'forceindex',\n name: 'Force Index',\n description: 'Measures buying/selling pressure using price and volume',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 13,\n description: 'Smoothing period for force index',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#8b5cf6',\n description: 'Color of the Force Index line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the Force Index line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const forceValues = forceindex({\n close,\n volume,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: forceValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { atr } from 'fast-technical-indicators';\n\nexport const ATRIndicator: IndicatorDefinition = {\n metadata: {\n id: 'atr',\n name: 'ATR',\n description: 'Average True Range - measures market volatility',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#14b8a6',\n description: 'Color of the ATR line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ATR line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const atrValues = atr({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: atrValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { adx } from 'fast-technical-indicators';\n\nexport const ADXIndicator: IndicatorDefinition = {\n metadata: {\n id: 'adx',\n name: 'ADX',\n description: 'Average Directional Index - measures trend strength (not direction)',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for ADX calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the ADX line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ADX line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const adxValues = adx({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: adxValues[i]?.adx ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { macd } from 'fast-technical-indicators';\n\nexport const MACDIndicator: IndicatorDefinition = {\n metadata: {\n id: 'macd',\n name: 'MACD',\n description: 'Moving Average Convergence Divergence - trend-following momentum indicator',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n fastPeriod: {\n type: 'number',\n label: 'Fast Period',\n defaultValue: 12,\n description: 'Period for fast EMA',\n min: 2,\n max: 100,\n step: 1,\n },\n slowPeriod: {\n type: 'number',\n label: 'Slow Period',\n defaultValue: 26,\n description: 'Period for slow EMA',\n min: 2,\n max: 100,\n step: 1,\n },\n signalPeriod: {\n type: 'number',\n label: 'Signal Period',\n defaultValue: 9,\n description: 'Period for signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n macdColor: {\n type: 'color',\n label: 'MACD Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the MACD line',\n },\n signalColor: {\n type: 'color',\n label: 'Signal Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the signal line',\n },\n histogramColor: {\n type: 'color',\n label: 'Histogram Color',\n defaultValue: '#10b981',\n description: 'Color of the histogram',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the MACD and signal lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const macdValues = macd({\n values,\n fastPeriod: settings.fastPeriod,\n slowPeriod: settings.slowPeriod,\n signalPeriod: settings.signalPeriod,\n SimpleMAOscillator: false,\n SimpleMASignal: false,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: macdValues[i]?.MACD ?? NaN,\n signal: macdValues[i]?.signal ?? NaN,\n histogram: macdValues[i]?.histogram ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { psar } from 'fast-technical-indicators';\n\nexport const PSARIndicator: IndicatorDefinition = {\n metadata: {\n id: 'psar',\n name: 'Parabolic SAR',\n description: 'Parabolic Stop and Reverse - shows potential reversal points as dots',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n step: {\n type: 'number',\n label: 'Step (AF)',\n defaultValue: 0.02,\n description: 'Acceleration Factor step',\n min: 0.001,\n max: 1,\n step: 0.001,\n },\n max: {\n type: 'number',\n label: 'Max AF',\n defaultValue: 0.2,\n description: 'Maximum Acceleration Factor',\n min: 0.01,\n max: 1,\n step: 0.01,\n },\n color: {\n type: 'color',\n label: 'Color',\n defaultValue: '#f59e0b',\n description: 'Color of the SAR dots',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const psarValues = psar({\n high,\n low,\n step: settings.step,\n max: settings.max,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: psarValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { cci } from 'fast-technical-indicators';\n\nexport const CCIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'cci',\n name: 'CCI',\n description: 'Commodity Channel Index - identifies cyclical trends and overbought/oversold levels',\n category: IndicatorCategory.OSCILLATORS,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars for CCI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#ec4899',\n description: 'Color of the CCI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the CCI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const cciValues = cci({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: cciValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { williamsr } from 'fast-technical-indicators';\n\nexport const WilliamsRIndicator: IndicatorDefinition = {\n metadata: {\n id: 'williamsr',\n name: 'Williams %R',\n description: 'Williams Percent Range - momentum indicator showing overbought/oversold levels',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for Williams %R calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#a855f7',\n description: 'Color of the Williams %R line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the Williams %R line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const williamsValues = williamsr({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: williamsValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { keltnerchannel } from 'fast-technical-indicators';\n\nexport const KeltnerChannelsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'keltner',\n name: 'Keltner Channels',\n description: 'Volatility-based channels using ATR - similar to Bollinger Bands',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Period for middle line (EMA)',\n min: 2,\n max: 200,\n step: 1,\n },\n atrPeriod: {\n type: 'number',\n label: 'ATR Period',\n defaultValue: 10,\n description: 'Period for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n atrMultiplier: {\n type: 'number',\n label: 'ATR Multiplier',\n defaultValue: 2,\n description: 'Multiplier for channel width',\n min: 0.1,\n max: 10,\n step: 0.1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle line',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the channel lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Fill area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the channel fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const keltnerValues = keltnerchannel({\n high,\n low,\n close,\n period: settings.period,\n atrPeriod: settings.atrPeriod,\n multiplier: settings.atrMultiplier,\n } as any);\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: keltnerValues[i]?.middle ?? NaN,\n upper: keltnerValues[i]?.upper ?? NaN,\n lower: keltnerValues[i]?.lower ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { supertrend } from 'fast-technical-indicators';\n\nexport const SuperTrendIndicator: IndicatorDefinition = {\n metadata: {\n id: 'supertrend',\n name: 'SuperTrend',\n description: 'Modern trend-following indicator with clear buy/sell signals',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 10,\n description: 'Period for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n multiplier: {\n type: 'number',\n label: 'Multiplier',\n defaultValue: 3,\n description: 'ATR multiplier for bands',\n min: 0.1,\n max: 10,\n step: 0.1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the SuperTrend line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the SuperTrend line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const supertrendValues = supertrend({\n high,\n low,\n close,\n period: settings.period,\n multiplier: settings.multiplier,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: supertrendValues[i]?.supertrend ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { ichimokucloud } from 'fast-technical-indicators';\nimport { displaceArray } from '../utils/calculations';\n\nexport const IchimokuIndicator: IndicatorDefinition = {\n metadata: {\n id: 'ichimoku',\n name: 'Ichimoku Cloud',\n description: 'Comprehensive trend system with conversion, base, and span lines forming a cloud',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n conversionPeriod: {\n type: 'number',\n label: 'Conversion Period (Tenkan)',\n defaultValue: 9,\n description: 'Period for conversion line',\n min: 1,\n max: 100,\n step: 1,\n },\n basePeriod: {\n type: 'number',\n label: 'Base Period (Kijun)',\n defaultValue: 26,\n description: 'Period for base line',\n min: 1,\n max: 100,\n step: 1,\n },\n spanPeriod: {\n type: 'number',\n label: 'Span Period (Senkou)',\n defaultValue: 52,\n description: 'Period for span B',\n min: 1,\n max: 200,\n step: 1,\n },\n displacement: {\n type: 'number',\n label: 'Displacement',\n defaultValue: 26,\n description: 'Forward displacement for span lines',\n min: 0,\n max: 100,\n step: 1,\n },\n conversionColor: {\n type: 'color',\n label: 'Conversion Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the conversion line',\n },\n baseColor: {\n type: 'color',\n label: 'Base Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the base line',\n },\n spanAColor: {\n type: 'color',\n label: 'Span A Color',\n defaultValue: '#10b981',\n description: 'Color of span A (cloud edge)',\n },\n spanBColor: {\n type: 'color',\n label: 'Span B Color',\n defaultValue: '#f59e0b',\n description: 'Color of span B (cloud edge)',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showCloud: {\n type: 'boolean',\n label: 'Show Cloud',\n defaultValue: true,\n description: 'Fill area between span A and span B',\n },\n cloudColor: {\n type: 'color',\n label: 'Cloud Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the cloud fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 5,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'spanA',\n lower: 'spanB',\n },\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const ichimokuValues = ichimokucloud({\n high,\n low,\n conversionPeriod: settings.conversionPeriod,\n basePeriod: settings.basePeriod,\n spanPeriod: settings.spanPeriod,\n displacement: 0,\n });\n\n const conversion = bars.map((_, i) => ichimokuValues[i]?.conversion ?? NaN);\n const base = bars.map((_, i) => ichimokuValues[i]?.base ?? NaN);\n const spanA = bars.map((_, i) => ichimokuValues[i]?.spanA ?? NaN);\n const spanB = bars.map((_, i) => ichimokuValues[i]?.spanB ?? NaN);\n\n const displacedSpanA = displaceArray(spanA, settings.displacement);\n const displacedSpanB = displaceArray(spanB, settings.displacement);\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: conversion[i],\n base: base[i],\n spanA: displacedSpanA[i],\n spanB: displacedSpanB[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { donchianchannels } from 'fast-technical-indicators';\n\nexport const DonchianChannelsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'donchian',\n name: 'Donchian Channels',\n description: 'Highest high and lowest low over a period - classic breakout indicator',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to look back',\n min: 2,\n max: 200,\n step: 1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle line',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the channel lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Fill area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the channel fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const donchianValues = donchianchannels({\n high,\n low,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: donchianValues[i]?.middle ?? NaN,\n upper: donchianValues[i]?.upper ?? NaN,\n lower: donchianValues[i]?.lower ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { roc } from 'fast-technical-indicators';\n\nexport const ROCIndicator: IndicatorDefinition = {\n metadata: {\n id: 'roc',\n name: 'ROC',\n description: 'Rate of Change - measures percentage change in price over a period',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 12,\n description: 'Number of bars for ROC calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the ROC line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ROC line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const rocValues = roc({\n values,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: rocValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { stochasticrsi } from 'fast-technical-indicators';\n\nexport const StochRSIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'stochrsi',\n name: 'Stochastic RSI',\n description: 'Stochastic RSI - applies Stochastic oscillator to RSI values',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n rsiPeriod: {\n type: 'number',\n label: 'RSI Period',\n defaultValue: 14,\n description: 'Period for RSI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n stochPeriod: {\n type: 'number',\n label: 'Stochastic Period',\n defaultValue: 14,\n description: 'Period for Stochastic calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n kPeriod: {\n type: 'number',\n label: '%K Period',\n defaultValue: 3,\n description: 'Smoothing period for %K',\n min: 1,\n max: 50,\n step: 1,\n },\n dPeriod: {\n type: 'number',\n label: '%D Period',\n defaultValue: 3,\n description: 'Smoothing period for %D signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n kColor: {\n type: 'color',\n label: '%K Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the %K line',\n },\n dColor: {\n type: 'color',\n label: '%D Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the %D signal line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 2,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const stochRSIValues = stochasticrsi({\n values,\n rsiPeriod: settings.rsiPeriod,\n stochasticPeriod: settings.stochPeriod,\n kPeriod: settings.kPeriod,\n dPeriod: settings.dPeriod,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: stochRSIValues[i]?.k ?? NaN,\n signal: stochRSIValues[i]?.d ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { wma } from 'fast-technical-indicators';\n\nexport const WMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'wma',\n name: 'WMA',\n description: 'Weighted Moving Average - gives more weight to recent prices',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to average',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#f59e0b',\n description: 'Color of the WMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the WMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const wmaValues = wma({\n values,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: wmaValues[i] ?? NaN,\n }));\n },\n};\n","import { indicatorRegistry } from '../core/registry';\nimport { SMAIndicator } from './sma';\nimport { EMAIndicator } from './ema';\nimport { RSIIndicator } from './rsi';\nimport { BollingerBandsIndicator } from './bollinger';\nimport { VWAPIndicator } from './vwap';\nimport { StochasticIndicator } from './stochastic';\nimport { OBVIndicator } from './obv';\nimport { MFIIndicator } from './mfi';\nimport { ForceIndexIndicator } from './forceindex';\nimport { ATRIndicator } from './atr';\nimport { ADXIndicator } from './adx';\nimport { MACDIndicator } from './macd';\nimport { PSARIndicator } from './psar';\nimport { CCIIndicator } from './cci';\nimport { WilliamsRIndicator } from './williamsr';\nimport { KeltnerChannelsIndicator } from './keltner';\nimport { SuperTrendIndicator } from './supertrend';\nimport { IchimokuIndicator } from './ichimoku';\nimport { DonchianChannelsIndicator } from './donchian';\nimport { ROCIndicator } from './roc';\nimport { StochRSIIndicator } from './stochrsi';\nimport { WMAIndicator } from './wma';\n\nexport function registerBuiltInIndicators(): void {\n indicatorRegistry.register(SMAIndicator);\n indicatorRegistry.register(EMAIndicator);\n indicatorRegistry.register(RSIIndicator);\n indicatorRegistry.register(BollingerBandsIndicator);\n indicatorRegistry.register(VWAPIndicator);\n indicatorRegistry.register(StochasticIndicator);\n indicatorRegistry.register(OBVIndicator);\n indicatorRegistry.register(MFIIndicator);\n indicatorRegistry.register(ForceIndexIndicator);\n indicatorRegistry.register(ATRIndicator);\n indicatorRegistry.register(ADXIndicator);\n indicatorRegistry.register(MACDIndicator);\n indicatorRegistry.register(PSARIndicator);\n indicatorRegistry.register(CCIIndicator);\n indicatorRegistry.register(WilliamsRIndicator);\n indicatorRegistry.register(KeltnerChannelsIndicator);\n indicatorRegistry.register(SuperTrendIndicator);\n indicatorRegistry.register(IchimokuIndicator);\n indicatorRegistry.register(DonchianChannelsIndicator);\n indicatorRegistry.register(ROCIndicator);\n indicatorRegistry.register(StochRSIIndicator);\n indicatorRegistry.register(WMAIndicator);\n}\n\nexport {\n SMAIndicator,\n EMAIndicator,\n RSIIndicator,\n BollingerBandsIndicator,\n VWAPIndicator,\n StochasticIndicator,\n OBVIndicator,\n MFIIndicator,\n ForceIndexIndicator,\n ATRIndicator,\n ADXIndicator,\n MACDIndicator,\n PSARIndicator,\n CCIIndicator,\n WilliamsRIndicator,\n KeltnerChannelsIndicator,\n SuperTrendIndicator,\n IchimokuIndicator,\n DonchianChannelsIndicator,\n ROCIndicator,\n StochRSIIndicator,\n WMAIndicator,\n};\n","import { OHLCVBar } from '../types/chart';\nimport {\n BarDataAdapter,\n BarDataAdapterOptions,\n HistoricalDataParams,\n RealtimeHandlers,\n RealtimeSubscription,\n} from './types';\nimport { normalizeTimestamp, validateAndNormalizeBars } from '../utils/barUtils';\n\ninterface AlpacaBar {\n t: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n n?: number;\n vw?: number;\n}\n\ninterface AlpacaBarsResponse {\n bars: {\n [symbol: string]: AlpacaBar[];\n };\n next_page_token?: string;\n}\n\ninterface AlpacaTrade {\n T: string;\n S: string;\n p: number;\n s: number;\n t: string;\n}\n\ninterface AlpacaBar_WS {\n T: string;\n S: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n t: string;\n n?: number;\n vw?: number;\n}\n\nexport class AlpacaBarAdapter implements BarDataAdapter {\n private apiKey: string;\n private secretKey: string;\n private baseUrl: string;\n private wsUrl: string;\n private ws: WebSocket | null = null;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 5;\n private reconnectDelay = 1000;\n private currentHandlers: RealtimeHandlers | null = null;\n private currentSymbol: string | null = null;\n private authenticated = false;\n\n constructor(options: BarDataAdapterOptions) {\n if (!options.apiKey || !options.secretKey) {\n throw new Error('Alpaca API key and secret key are required');\n }\n\n this.apiKey = options.apiKey;\n this.secretKey = options.secretKey;\n this.baseUrl = options.baseUrl || 'https://data.alpaca.markets';\n this.wsUrl = options.wsUrl || 'wss://stream.data.alpaca.markets/v2/iex';\n }\n\n async fetchHistoricalBars(params: HistoricalDataParams): Promise<OHLCVBar[]> {\n const { symbol, timeframe, before, after, limit = 500 } = params;\n\n const url = new URL(`${this.baseUrl}/v2/stocks/${symbol}/bars`);\n url.searchParams.set('timeframe', timeframe);\n url.searchParams.set('limit', limit.toString());\n\n if (before) {\n const beforeDate = new Date(before).toISOString();\n url.searchParams.set('end', beforeDate);\n }\n\n if (after) {\n const afterDate = new Date(after).toISOString();\n url.searchParams.set('start', afterDate);\n }\n\n url.searchParams.set('feed', 'iex');\n\n const headers = {\n 'APCA-API-KEY-ID': this.apiKey,\n 'APCA-API-SECRET-KEY': this.secretKey,\n };\n\n try {\n const response = await fetch(url.toString(), { headers });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Alpaca API error: ${response.status} ${errorText}`);\n }\n\n const data: AlpacaBarsResponse = await response.json();\n const bars = data.bars[symbol] || [];\n\n return this.convertAlpacaBars(bars);\n } catch (error) {\n console.error('Failed to fetch Alpaca bars:', error);\n throw error;\n }\n }\n\n subscribeRealtime(symbol: string, handlers: RealtimeHandlers): RealtimeSubscription {\n this.currentSymbol = symbol;\n this.currentHandlers = handlers;\n\n this.connectWebSocket();\n\n return {\n unsubscribe: () => this.disconnect(),\n };\n }\n\n unsubscribeAll(): void {\n this.disconnect();\n }\n\n private connectWebSocket(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n console.log('WebSocket already connected');\n return;\n }\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n console.log('Alpaca WebSocket connected');\n this.authenticated = false;\n this.authenticate();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n console.error('Alpaca WebSocket error:', event);\n this.currentHandlers?.onError?.(new Error('WebSocket error'));\n };\n\n this.ws.onclose = () => {\n console.log('Alpaca WebSocket closed');\n this.authenticated = false;\n this.currentHandlers?.onDisconnect?.();\n this.attemptReconnect();\n };\n } catch (error) {\n console.error('Failed to create WebSocket:', error);\n this.currentHandlers?.onError?.(\n error instanceof Error ? error : new Error('Failed to create WebSocket')\n );\n }\n }\n\n private authenticate(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n const authMessage = {\n action: 'auth',\n key: this.apiKey,\n secret: this.secretKey,\n };\n\n this.ws.send(JSON.stringify(authMessage));\n }\n\n private subscribe(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN || !this.currentSymbol) return;\n\n const subscribeMessage = {\n action: 'subscribe',\n trades: [this.currentSymbol],\n bars: [this.currentSymbol],\n };\n\n this.ws.send(JSON.stringify(subscribeMessage));\n console.log(`Subscribed to ${this.currentSymbol}`);\n }\n\n private handleMessage(data: string): void {\n try {\n const messages = JSON.parse(data);\n\n if (!Array.isArray(messages)) {\n console.warn('Unexpected message format:', messages);\n return;\n }\n\n for (const message of messages) {\n if (message.T === 'success' && message.msg === 'authenticated') {\n console.log('Alpaca WebSocket authenticated');\n this.authenticated = true;\n this.reconnectAttempts = 0;\n this.currentHandlers?.onConnect?.();\n this.subscribe();\n } else if (message.T === 'error') {\n console.error('Alpaca error:', message.msg);\n this.currentHandlers?.onError?.(new Error(message.msg));\n } else if (message.T === 't') {\n this.handleTrade(message as AlpacaTrade);\n } else if (message.T === 'b') {\n this.handleBar(message as AlpacaBar_WS);\n } else if (message.T === 'subscription') {\n console.log('Subscription confirmed:', message);\n }\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n }\n\n private handleTrade(trade: AlpacaTrade): void {\n if (trade.S !== this.currentSymbol) return;\n\n this.currentHandlers?.onTrade?.(trade.p, trade.s);\n }\n\n private handleBar(bar: AlpacaBar_WS): void {\n if (bar.S !== this.currentSymbol) return;\n\n const ohlcvBar: OHLCVBar = {\n timestamp: new Date(bar.t).getTime(),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n trade_count: bar.n,\n vwap: bar.vw,\n };\n\n this.currentHandlers?.onBar?.(ohlcvBar);\n }\n\n private attemptReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error('Max reconnection attempts reached');\n this.currentHandlers?.onError?.(new Error('Max reconnection attempts reached'));\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(`Attempting to reconnect in ${delay}ms (attempt ${this.reconnectAttempts})`);\n\n setTimeout(() => {\n if (this.currentSymbol && this.currentHandlers) {\n this.connectWebSocket();\n }\n }, delay);\n }\n\n private disconnect(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.authenticated = false;\n this.currentSymbol = null;\n this.currentHandlers = null;\n this.reconnectAttempts = 0;\n }\n\n private convertAlpacaBars(bars: AlpacaBar[]): OHLCVBar[] {\n return bars.map(bar => ({\n timestamp: new Date(bar.t).getTime(),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n trade_count: bar.n,\n vwap: bar.vw,\n }));\n }\n}\n","import { OHLCVBar } from '../types/chart';\nimport {\n BarDataAdapter,\n HistoricalDataParams,\n RealtimeHandlers,\n RealtimeSubscription,\n} from './types';\n\nexport class MockAdapter implements BarDataAdapter {\n private intervalId: number | null = null;\n\n async fetchHistoricalBars(params: HistoricalDataParams): Promise<OHLCVBar[]> {\n const { limit = 100, before } = params;\n\n await new Promise(resolve => setTimeout(resolve, 800));\n\n const bars: OHLCVBar[] = [];\n const now = before || Date.now();\n let price = 100;\n\n for (let i = limit - 1; i >= 0; i--) {\n const timestamp = now - i * 300000;\n const change = (Math.random() - 0.5) * 2;\n price = Math.max(price + change, 1);\n\n const open = price;\n const close = price + (Math.random() - 0.5) * 1.5;\n const high = Math.max(open, close) + Math.random() * 0.5;\n const low = Math.min(open, close) - Math.random() * 0.5;\n\n bars.push({\n timestamp,\n open: Math.max(open, 0.01),\n high: Math.max(high, 0.01),\n low: Math.max(low, 0.01),\n close: Math.max(close, 0.01),\n volume: Math.floor(Math.random() * 10000) + 1000,\n });\n\n price = Math.max(close, 1);\n }\n\n console.log(`MockAdapter: Generated ${bars.length} bars (before: ${before})`);\n console.log('First bar:', bars[0]);\n console.log('Last bar:', bars[bars.length - 1]);\n\n return bars;\n }\n\n subscribeRealtime(symbol: string, handlers: RealtimeHandlers): RealtimeSubscription {\n handlers.onConnect?.();\n\n let lastPrice = 100;\n\n this.intervalId = window.setInterval(() => {\n const now = Date.now();\n const timestamp = Math.floor(now / 300000) * 300000;\n\n const change = (Math.random() - 0.5) * 2;\n lastPrice = Math.max(lastPrice + change, 1);\n\n const open = lastPrice;\n const close = lastPrice + (Math.random() - 0.5) * 1.5;\n const high = Math.max(open, close) + Math.random() * 0.5;\n const low = Math.min(open, close) - Math.random() * 0.5;\n\n const bar: OHLCVBar = {\n timestamp,\n open,\n high,\n low,\n close,\n volume: Math.floor(Math.random() * 10000) + 1000,\n };\n\n handlers.onBar?.(bar);\n lastPrice = close;\n }, 5000);\n\n return {\n unsubscribe: () => this.unsubscribeAll(),\n };\n }\n\n unsubscribeAll(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/indicators/core/registry.ts","../src/indicators/core/calculator.ts","../src/indicators/primitives/BandsPrimitive.ts","../src/components/trade-markers.ts","../src/components/ChartComponent.tsx","../src/indicators/core/types.ts","../src/components/IndicatorBrowser.tsx","../src/components/IndicatorSettingsForm.tsx","../src/components/SettingsDialog.tsx","../src/hooks/useChartAPI.ts","../src/utils/barUtils.ts","../src/hooks/useBarsData.ts","../src/hooks/useRealtimeUpdates.ts","../src/indicators/core/persistence.ts","../src/indicators/utils/calculations.ts","../src/indicators/registry/sma.ts","../src/indicators/registry/ema.ts","../src/indicators/registry/rsi.ts","../src/indicators/registry/bollinger.ts","../src/indicators/registry/vwap.ts","../src/indicators/registry/stochastic.ts","../src/indicators/registry/obv.ts","../src/indicators/registry/mfi.ts","../src/indicators/registry/forceindex.ts","../src/indicators/registry/atr.ts","../src/indicators/registry/adx.ts","../src/indicators/registry/macd.ts","../src/indicators/registry/psar.ts","../src/indicators/registry/cci.ts","../src/indicators/registry/williamsr.ts","../src/indicators/registry/keltner.ts","../src/indicators/registry/supertrend.ts","../src/indicators/registry/ichimoku.ts","../src/indicators/registry/donchian.ts","../src/indicators/registry/roc.ts","../src/indicators/registry/stochrsi.ts","../src/indicators/registry/wma.ts","../src/indicators/registry/index.ts","../src/adapters/alpaca.ts","../src/adapters/mock.ts"],"names":["b","height","timeScale","IndicatorCategory","ChartSeriesType","useState","jsx","jsxs","useEffect","X","options","useRef","useCallback","appendBar","updateCurrentBar","prependBars","error","lastBar"],"mappings":"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","file":"index.js","sourcesContent":["import {\n IndicatorDefinition,\n IndicatorInstance,\n IndicatorCategory,\n IndicatorMetadata,\n} from './types';\n\nclass IndicatorRegistry {\n private indicators: Map<string, IndicatorDefinition> = new Map();\n private instanceCounters: Map<string, number> = new Map();\n\n register(definition: IndicatorDefinition): void {\n if (this.indicators.has(definition.metadata.id)) {\n console.warn(\n `Indicator with id \"${definition.metadata.id}\" is already registered. Overwriting.`\n );\n }\n this.indicators.set(definition.metadata.id, definition);\n }\n\n unregister(id: string): boolean {\n return this.indicators.delete(id);\n }\n\n get(id: string): IndicatorDefinition | undefined {\n return this.indicators.get(id);\n }\n\n getAll(): IndicatorDefinition[] {\n return Array.from(this.indicators.values());\n }\n\n getByCategory(category: IndicatorCategory): IndicatorDefinition[] {\n return this.getAll().filter(\n (indicator) => indicator.metadata.category === category\n );\n }\n\n search(query: string): IndicatorDefinition[] {\n const lowerQuery = query.toLowerCase();\n return this.getAll().filter(\n (indicator) =>\n indicator.metadata.name.toLowerCase().includes(lowerQuery) ||\n indicator.metadata.description.toLowerCase().includes(lowerQuery)\n );\n }\n\n createInstance(definitionId: string, customSettings?: Record<string, any>): IndicatorInstance {\n const definition = this.get(definitionId);\n if (!definition) {\n throw new Error(`Indicator definition \"${definitionId}\" not found`);\n }\n\n const currentCount = this.instanceCounters.get(definitionId) || 0;\n const newCount = currentCount + 1;\n this.instanceCounters.set(definitionId, newCount);\n\n const instanceId = `${definitionId}-${newCount}`;\n\n const defaultSettings: Record<string, any> = {};\n Object.entries(definition.settings).forEach(([key, field]) => {\n defaultSettings[key] = field.defaultValue;\n });\n\n const settings = { ...defaultSettings, ...customSettings };\n\n return {\n id: instanceId,\n definitionId,\n name: `${definition.metadata.name}(${newCount})`,\n settings,\n };\n }\n\n validateSettings(definitionId: string, settings: Record<string, any>): boolean {\n const definition = this.get(definitionId);\n if (!definition) {\n return false;\n }\n\n for (const [key, field] of Object.entries(definition.settings)) {\n const value = settings[key];\n\n if (value === undefined) {\n return false;\n }\n\n if (field.type === 'number') {\n if (typeof value !== 'number') return false;\n if (field.min !== undefined && value < field.min) return false;\n if (field.max !== undefined && value > field.max) return false;\n } else if (field.type === 'boolean') {\n if (typeof value !== 'boolean') return false;\n } else if (field.type === 'color' || field.type === 'lineStyle') {\n if (typeof value !== 'string') return false;\n } else if (field.type === 'select') {\n if (typeof value !== 'string') return false;\n if (field.options && !field.options.some(opt => opt.value === value)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n getMetadataList(): IndicatorMetadata[] {\n return this.getAll().map((indicator) => indicator.metadata);\n }\n\n clear(): void {\n this.indicators.clear();\n this.instanceCounters.clear();\n }\n}\n\nexport const indicatorRegistry = new IndicatorRegistry();\n","import { OHLCVBar } from '../../types/chart';\nimport { IndicatorInstance, IndicatorOutput } from './types';\nimport { indicatorRegistry } from './registry';\n\ninterface CacheEntry {\n data: IndicatorOutput[];\n settingsHash: string;\n dataLength: number;\n}\n\nclass IndicatorCalculator {\n private cache: Map<string, CacheEntry> = new Map();\n\n private hashSettings(settings: Record<string, any>): string {\n return JSON.stringify(settings);\n }\n\n calculate(\n instance: IndicatorInstance,\n bars: OHLCVBar[]\n ): IndicatorOutput[] {\n const definition = indicatorRegistry.get(instance.definitionId);\n if (!definition) {\n console.error(\n `Indicator definition \"${instance.definitionId}\" not found`\n );\n return [];\n }\n\n const settingsHash = this.hashSettings(instance.settings);\n const cacheKey = instance.id;\n const cached = this.cache.get(cacheKey);\n\n if (\n cached &&\n cached.settingsHash === settingsHash &&\n cached.dataLength === bars.length\n ) {\n return cached.data;\n }\n\n try {\n const data = definition.calculate(bars, instance.settings);\n\n this.cache.set(cacheKey, {\n data,\n settingsHash,\n dataLength: bars.length,\n });\n\n return data;\n } catch (error) {\n console.error(\n `Error calculating indicator \"${instance.definitionId}\":`,\n error\n );\n return [];\n }\n }\n\n invalidateCache(instanceId?: string): void {\n if (instanceId) {\n this.cache.delete(instanceId);\n } else {\n this.cache.clear();\n }\n }\n\n getCacheSize(): number {\n return this.cache.size;\n }\n}\n\nexport const indicatorCalculator = new IndicatorCalculator();\n","import {\n ISeriesApi,\n ISeriesPrimitive,\n SeriesAttachedParameter,\n Time,\n IChartApi,\n} from 'lightweight-charts';\n\nexport interface BandsPrimitiveOptions {\n upperSeries: ISeriesApi<'Line'>;\n lowerSeries: ISeriesApi<'Line'>;\n fillColor: string;\n}\n\ninterface BandPoint {\n x: number;\n y1: number;\n y2: number;\n}\n\ninterface BandData {\n points: BandPoint[];\n color: string;\n}\n\nclass AreaBetweenLinesPaneView {\n private _source: BandsPrimitive;\n private _data: BandData | null = null;\n\n constructor(source: BandsPrimitive) {\n this._source = source;\n }\n\n update() {\n const series1 = this._source._upperSeries;\n const series2 = this._source._lowerSeries;\n const chart = this._source._chart;\n\n if (!series1 || !series2 || !chart) return;\n\n const timeScale = chart.timeScale();\n\n const data1 = series1.data() as any[];\n const data2 = series2.data() as any[];\n\n const points: BandPoint[] = [];\n\n let i = 0;\n let j = 0;\n\n while (i < data1.length && j < data2.length) {\n const d1 = data1[i];\n const d2 = data2[j];\n\n if (d1.time < d2.time) {\n i++;\n } else if (d1.time > d2.time) {\n j++;\n } else {\n const x = timeScale.timeToCoordinate(d1.time);\n const y1 = series1.priceToCoordinate(d1.value);\n const y2 = series2.priceToCoordinate(d2.value);\n\n if (x !== null && y1 !== null && y2 !== null) {\n points.push({ x, y1, y2 });\n }\n i++;\n j++;\n }\n }\n\n this._data = {\n points,\n color: this._source._options.fillColor || 'rgba(59, 130, 246, 0.1)',\n };\n }\n\n renderer() {\n return new AreaBetweenLinesRenderer(this._data);\n }\n}\n\nclass AreaBetweenLinesRenderer {\n private _data: BandData | null;\n\n constructor(data: BandData | null) {\n this._data = data;\n }\n\n draw(target: any) {\n target.useBitmapCoordinateSpace((scope: any) => {\n if (!this._data || this._data.points.length === 0) return;\n\n const ctx = scope.context;\n ctx.save();\n ctx.scale(scope.horizontalPixelRatio, scope.verticalPixelRatio);\n\n const points = this._data.points;\n\n ctx.beginPath();\n\n ctx.moveTo(points[0].x, points[0].y1);\n\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y1);\n }\n\n for (let i = points.length - 1; i >= 0; i--) {\n ctx.lineTo(points[i].x, points[i].y2);\n }\n\n ctx.closePath();\n\n ctx.fillStyle = this._data.color;\n ctx.fill();\n\n ctx.restore();\n });\n }\n\n drawBackground(target: any) {\n this.draw(target);\n }\n}\n\nexport class BandsPrimitive implements ISeriesPrimitive<Time> {\n _options: BandsPrimitiveOptions;\n _upperSeries: ISeriesApi<'Line'>;\n _lowerSeries: ISeriesApi<'Line'>;\n _chart: IChartApi | null = null;\n _series: ISeriesApi<'Line'> | null = null;\n private _paneViews: AreaBetweenLinesPaneView[];\n\n constructor(options: BandsPrimitiveOptions) {\n this._options = options;\n this._upperSeries = options.upperSeries;\n this._lowerSeries = options.lowerSeries;\n this._paneViews = [new AreaBetweenLinesPaneView(this)];\n }\n\n attached(param: SeriesAttachedParameter<Time>): void {\n this._chart = param.chart;\n this._series = param.series as ISeriesApi<'Line'>;\n }\n\n detached(): void {\n this._chart = null;\n this._series = null;\n }\n\n paneViews() {\n return this._paneViews;\n }\n\n updateAllViews(): void {\n this._paneViews.forEach((pw) => pw.update());\n }\n}\n","import type { SeriesMarker, Time } from 'lightweight-charts';\nimport type { ChartTrade } from '../types/chart';\n\nconst WIN = '#10b981';\nconst LOSS = '#ef4444';\n\n/** Pure: build the entry+exit markers for all trades, sorted ascending by time\n * (lightweight-charts requires sorted markers). Markers are colored by outcome\n * (win/loss); the selected trade's markers are emphasized with a text label. */\nexport function buildTradeMarkers(trades: ChartTrade[], selectedTradeId: string | null): SeriesMarker<Time>[] {\n const markers: SeriesMarker<Time>[] = [];\n for (const t of trades) {\n const selected = t.id === selectedTradeId;\n const color = t.outcome === 'win' ? WIN : LOSS;\n markers.push({\n time: (t.entryTime / 1000) as Time,\n position: 'belowBar', shape: 'arrowUp', color,\n text: selected ? `${t.outcome === 'win' ? '+' : ''}entry` : '',\n });\n markers.push({\n time: (t.exitTime / 1000) as Time,\n position: 'aboveBar', shape: 'arrowDown', color,\n text: selected ? 'exit' : '',\n });\n }\n markers.sort((a, b) => (a.time as number) - (b.time as number));\n return markers;\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n createChart,\n createSeriesMarkers,\n IChartApi,\n ISeriesApi,\n CandlestickData,\n Time,\n LineData,\n HistogramData,\n IPriceLine,\n LineStyle,\n LineWidth,\n ColorType,\n CandlestickSeries,\n HistogramSeries,\n LineSeries,\n AreaSeries,\n SeriesMarker,\n} from 'lightweight-charts';\nimport { OHLCVBar, ChartLine, ChartTrade, PriceBand } from '../types/chart';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { indicatorCalculator } from '../indicators/core/calculator';\nimport { BandsPrimitive } from '../indicators/primitives/BandsPrimitive';\nimport { buildTradeMarkers } from './trade-markers';\n\ninterface ChartComponentProps {\n bars: OHLCVBar[];\n onLoadMoreData?: (oldestTimestamp: number) => void;\n indicators?: IndicatorInstance[];\n lines?: ChartLine[];\n onBarUpdate?: (updatedBar: OHLCVBar) => void;\n onNewBar?: (newBar: OHLCVBar) => void;\n onDeleteLine?: (lineId: string) => void;\n onAddLine?: (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance', price: number) => void;\n onClearAllLines?: () => void;\n enableBarSelection?: boolean;\n onBarClick?: (bar: OHLCVBar | null) => void;\n trades?: ChartTrade[];\n selectedTradeId?: string | null;\n renderTradePopup?: (trade: ChartTrade) => ReactNode;\n /**\n * Fixed chart height in px. When omitted, the chart fills its container's\n * height (observed via ResizeObserver) instead of a fixed default — so a\n * flex/percent-sized parent gets a full-height chart.\n */\n height?: number;\n /**\n * When set, recenter the time scale on this trade (by id) so it scrolls into\n * view. Pairs with `selectedTradeId` to drive both selection and focus.\n */\n focusTradeId?: string | null;\n /**\n * IANA timezone (e.g. \"America/New_York\") for the axis ticks + crosshair\n * labels. Omit to use the viewer's local timezone.\n */\n timeZone?: string;\n /** Shaded horizontal price bands (e.g. an MFE↔MAE excursion zone). */\n priceBands?: PriceBand[];\n}\n\nexport default function ChartComponent({\n bars,\n onLoadMoreData,\n indicators = [],\n lines = [],\n onBarUpdate,\n onNewBar,\n onDeleteLine,\n onAddLine,\n onClearAllLines,\n enableBarSelection = true,\n onBarClick,\n trades = [],\n selectedTradeId = null,\n renderTradePopup,\n height,\n focusTradeId = null,\n timeZone,\n priceBands = [],\n}: ChartComponentProps) {\n const chartContainerRef = useRef<HTMLDivElement>(null);\n const chartRef = useRef<IChartApi | null>(null);\n const candlestickSeriesRef = useRef<ISeriesApi<'Candlestick'> | null>(null);\n const volumeSeriesRef = useRef<ISeriesApi<'Histogram'> | null>(null);\n const indicatorSeriesRef = useRef<Map<string, ISeriesApi<any>>>(new Map());\n const indicatorPaneIndexRef = useRef<Map<string, number>>(new Map());\n const nextPaneIndexRef = useRef<number>(2);\n const priceLineRefs = useRef<Map<string, IPriceLine>>(new Map());\n const seriesMarkersRef = useRef<any>(null);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [contextMenu, setContextMenu] = useState<{ x: number; y: number; price: number } | null>(null);\n const [linePositions, setLinePositions] = useState<Map<string, { top: number; right: number }>>(new Map());\n // Shaded price-band rects (container-relative px), recomputed as the price scale moves.\n const [bandRects, setBandRects] = useState<Array<{ id: string; top: number; height: number; color: string }>>([]);\n const [selectedBar, setSelectedBar] = useState<OHLCVBar | null>(null);\n const selectedBarRef = useRef<OHLCVBar | null>(null);\n const [spotlightPosition, setSpotlightPosition] = useState<{ x: number; width: number } | null>(null);\n const [tradePopupPos, setTradePopupPos] = useState<{ x: number } | null>(null);\n const previousBarsRef = useRef<OHLCVBar[]>([]);\n const previousBarsLengthRef = useRef<number>(0);\n const isLoadingRef = useRef(false);\n const barsRef = useRef<OHLCVBar[]>(bars);\n const isDraggingRef = useRef(false);\n const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null);\n // Latest explicit height (px) or undefined for auto-fill; read inside the\n // create-once effect's resize closure without going stale.\n const heightRef = useRef<number | undefined>(height);\n heightRef.current = height;\n // Line-editing is opt-in: the right-click \"add line\" menu only opens when a\n // consumer wires the add/clear handlers. Read via ref from the create-once\n // contextmenu closure without going stale. (Delete buttons gate on\n // `onDeleteLine` directly at render.)\n const lineEditEnabledRef = useRef(false);\n lineEditEnabledRef.current = Boolean(onAddLine || onClearAllLines);\n\n\n useEffect(() => {\n if (!chartContainerRef.current) return;\n\n chartContainerRef.current.style.position = 'relative';\n\n const chart = createChart(chartContainerRef.current, {\n layout: {\n background: { type: ColorType.Solid, color: '#0f172a' },\n textColor: '#94a3b8',\n panes: {\n enableResize: true,\n separatorColor: '#1e293b',\n separatorHoverColor: 'rgba(148,163,184,0.5)',\n },\n },\n grid: {\n vertLines: { color: '#1e293b' },\n horzLines: { color: '#1e293b' },\n },\n // Render axis ticks + crosshair in `timeZone` (default: the viewer's local\n // timezone). lightweight-charts otherwise renders numeric times as UTC,\n // which mismatches local/exchange-time labels alongside the chart.\n localization: {\n timeFormatter: makeCrosshairTimeFormatter(timeZone),\n },\n width: chartContainerRef.current.clientWidth,\n // Auto-fill the container's height unless an explicit `height` is given.\n // Fall back to 600 only when the container hasn't been laid out yet (a\n // ResizeObserver below corrects it on first measure).\n height: height ?? (chartContainerRef.current.clientHeight || 600),\n timeScale: {\n timeVisible: true,\n secondsVisible: true,\n borderColor: '#334155',\n tickMarkFormatter: makeTickMarkFormatter(timeZone),\n },\n rightPriceScale: {\n borderColor: '#334155',\n },\n crosshair: {\n mode: 0,\n vertLine: {\n width: 1,\n color: '#475569',\n style: 3,\n },\n horzLine: {\n width: 1,\n color: '#475569',\n style: 3,\n },\n },\n });\n\n const candlestickSeries = chart.addSeries(CandlestickSeries, {\n upColor: '#10b981',\n downColor: '#ef4444',\n borderVisible: false,\n wickUpColor: '#10b981',\n wickDownColor: '#ef4444',\n }, 0);\n\n const volumeSeries = chart.addSeries(HistogramSeries, {\n color: '#64748b',\n priceFormat: {\n type: 'volume',\n },\n priceScaleId: '',\n }, 1);\n\n chartRef.current = chart;\n candlestickSeriesRef.current = candlestickSeries;\n volumeSeriesRef.current = volumeSeries;\n\n seriesMarkersRef.current = createSeriesMarkers(candlestickSeries, []);\n\n chart.timeScale().subscribeVisibleLogicalRangeChange((logicalRange) => {\n if (logicalRange && logicalRange.from < 5 && !isLoadingRef.current && onLoadMoreData) {\n isLoadingRef.current = true;\n setIsLoadingMore(true);\n previousBarsLengthRef.current = barsRef.current.length;\n const sortedBars = [...barsRef.current].sort((a, b) => a.timestamp - b.timestamp);\n const oldestTimestamp = sortedBars[0]?.timestamp;\n if (oldestTimestamp) {\n onLoadMoreData(oldestTimestamp);\n }\n }\n });\n\n const handleResize = () => {\n if (chartContainerRef.current && chart) {\n const nextHeight = heightRef.current ?? chartContainerRef.current.clientHeight;\n chart.applyOptions({\n width: chartContainerRef.current.clientWidth,\n // Only drive height when auto-filling and the container has a real\n // measured height; otherwise leave the current height untouched.\n ...(heightRef.current === undefined && nextHeight > 0 ? { height: nextHeight } : {}),\n ...(heightRef.current !== undefined ? { height: heightRef.current } : {}),\n });\n }\n };\n\n // A flex/percent-sized parent changes the container without firing window\n // 'resize'; observe the container directly so the chart tracks it.\n const resizeObserver = new ResizeObserver(handleResize);\n resizeObserver.observe(chartContainerRef.current);\n\n const handleContextMenu = (e: MouseEvent) => {\n // No line-editing handlers wired → no custom menu; leave the native\n // context menu alone (read-only charts, e.g. the trades overlay).\n if (!lineEditEnabledRef.current) return;\n e.preventDefault();\n e.stopPropagation();\n\n if (!candlestickSeriesRef.current) {\n return;\n }\n\n const rect = chartContainerRef.current!.getBoundingClientRect();\n const y = e.clientY - rect.top;\n\n const price = candlestickSeriesRef.current.coordinateToPrice(y);\n\n if (price !== null) {\n setContextMenu({\n x: e.clientX - rect.left,\n y: y,\n price: price as number,\n });\n }\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n isDraggingRef.current = false;\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (mouseDownPosRef.current) {\n const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);\n if (dx > 5 || dy > 5) {\n isDraggingRef.current = true;\n }\n }\n };\n\n const handleMouseUp = () => {\n mouseDownPosRef.current = null;\n };\n\n const handleClick = (e: MouseEvent) => {\n setContextMenu(null);\n\n if (isDraggingRef.current) {\n isDraggingRef.current = false;\n return;\n }\n\n\n if (!enableBarSelection) {\n return;\n }\n\n if (!chartRef.current) {\n return;\n }\n\n if (!candlestickSeriesRef.current) {\n return;\n }\n\n\n const rect = chartContainerRef.current!.getBoundingClientRect();\n const x = e.clientX - rect.left;\n\n const timeScale = chartRef.current.timeScale();\n const coordinate = timeScale.coordinateToTime(x);\n\n if (!coordinate) {\n return;\n }\n\n const clickedTime = coordinate as number;\n\n const clickedBar = barsRef.current.find(bar => {\n const diff = Math.abs((bar.timestamp / 1000) - clickedTime);\n return diff < 300;\n });\n\n if (clickedBar) {\n\n if (selectedBarRef.current && selectedBarRef.current.timestamp === clickedBar.timestamp) {\n selectedBarRef.current = null;\n setSelectedBar(null);\n setSpotlightPosition(null);\n if (onBarClick) {\n onBarClick(null);\n }\n } else {\n selectedBarRef.current = clickedBar;\n setSelectedBar(clickedBar);\n const barX = timeScale.timeToCoordinate((clickedBar.timestamp / 1000) as Time);\n if (barX !== null) {\n const barWidth = Math.max(8, rect.width / barsRef.current.length);\n setSpotlightPosition({ x: barX - barWidth / 2, width: barWidth });\n }\n if (onBarClick) {\n onBarClick(clickedBar);\n }\n }\n } else {\n }\n };\n\n window.addEventListener('resize', handleResize);\n chartContainerRef.current.addEventListener('contextmenu', handleContextMenu, true);\n chartContainerRef.current.addEventListener('mousedown', handleMouseDown, true);\n chartContainerRef.current.addEventListener('mousemove', handleMouseMove, true);\n chartContainerRef.current.addEventListener('mouseup', handleMouseUp, true);\n chartContainerRef.current.addEventListener('click', handleClick, true);\n\n const container = chartContainerRef.current;\n\n return () => {\n window.removeEventListener('resize', handleResize);\n resizeObserver.disconnect();\n container.removeEventListener('contextmenu', handleContextMenu, true);\n container.removeEventListener('mousedown', handleMouseDown, true);\n container.removeEventListener('mousemove', handleMouseMove, true);\n container.removeEventListener('mouseup', handleMouseUp, true);\n container.removeEventListener('click', handleClick, true);\n chart.remove();\n };\n }, []);\n\n useEffect(() => {\n barsRef.current = bars;\n }, [bars]);\n\n // Apply an explicit `height` prop change (the create-once effect can't).\n useEffect(() => {\n if (chartRef.current && height !== undefined) {\n chartRef.current.applyOptions({ height });\n }\n }, [height]);\n\n // Recenter the time scale on `focusTradeId` so the trade scrolls into view.\n // Re-runs when the focus target or the loaded bars change (the bars covering\n // the trade may arrive after selection), then frames [entry, exit] with pad.\n // The range is applied on the next animation frame so it lands AFTER the\n // sibling bars→setData effect (which would otherwise snap the view back).\n useEffect(() => {\n if (!chartRef.current || !focusTradeId) return;\n const trade = trades.find((t) => t.id === focusTradeId);\n if (!trade) return;\n // Frame by LOGICAL (bar-index) range, not time: lazy-loading a far-off trade\n // leaves a big gap between bar clusters, and a time-based setVisibleRange\n // won't reliably land on the far cluster. Build the same ascending, deduped\n // order candlekit feeds to setData so indices line up, then frame the trade.\n const seen = new Set<number>();\n const series: number[] = [];\n for (const b of [...bars].sort((a, b) => a.timestamp - b.timestamp)) {\n if (seen.has(b.timestamp)) continue;\n seen.add(b.timestamp);\n series.push(b.timestamp);\n }\n if (series.length === 0) return;\n // First bar index at/after a target ms (binary search; series is ascending).\n const nearestIdx = (ms: number) => {\n let lo = 0;\n let hi = series.length - 1;\n let idx = series.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (series[mid] >= ms) {\n idx = mid;\n hi = mid - 1;\n } else {\n lo = mid + 1;\n }\n }\n return idx;\n };\n const entryIdx = nearestIdx(trade.entryTime);\n const exitIdx = Math.max(entryIdx, nearestIdx(trade.exitTime));\n const PAD = 15;\n const raf = requestAnimationFrame(() => {\n try {\n chartRef.current?.timeScale().setVisibleLogicalRange({\n from: entryIdx - PAD,\n to: exitIdx + PAD,\n });\n } catch {\n /* bars not yet present; a later bars update re-runs this */\n }\n });\n return () => cancelAnimationFrame(raf);\n }, [focusTradeId, trades, bars]);\n\n useEffect(() => {\n if (!candlestickSeriesRef.current || !volumeSeriesRef.current) return;\n\n const sortedBars = [...bars].sort((a, b) => a.timestamp - b.timestamp);\n\n const uniqueBars = sortedBars.reduce((acc, bar) => {\n const exists = acc.find(b => b.timestamp === bar.timestamp);\n if (!exists) {\n acc.push(bar);\n }\n return acc;\n }, [] as OHLCVBar[]);\n\n\n const previousBars = previousBarsRef.current;\n const isInitialLoad = previousBars.length === 0;\n const hasNewBars = uniqueBars.length > previousBars.length;\n const lastBarChanged = uniqueBars.length > 0 && previousBars.length > 0 &&\n (uniqueBars[uniqueBars.length - 1].timestamp === previousBars[previousBars.length - 1].timestamp);\n\n\n if (isLoadingRef.current && uniqueBars.length > previousBarsLengthRef.current) {\n isLoadingRef.current = false;\n setIsLoadingMore(false);\n }\n\n if (isInitialLoad || hasNewBars) {\n const candleData: CandlestickData[] = uniqueBars.map((bar) => ({\n time: (bar.timestamp / 1000) as Time,\n open: bar.open,\n high: bar.high,\n low: bar.low,\n close: bar.close,\n }));\n\n const volumeData: HistogramData[] = uniqueBars.map((bar) => ({\n time: (bar.timestamp / 1000) as Time,\n value: bar.volume,\n color: bar.close >= bar.open ? '#10b98180' : '#ef444480',\n }));\n\n candlestickSeriesRef.current.setData(candleData);\n volumeSeriesRef.current.setData(volumeData);\n } else if (lastBarChanged && uniqueBars.length > 0 && !hasNewBars) {\n const lastBar = uniqueBars[uniqueBars.length - 1];\n const candleUpdate: CandlestickData = {\n time: (lastBar.timestamp / 1000) as Time,\n open: lastBar.open,\n high: lastBar.high,\n low: lastBar.low,\n close: lastBar.close,\n };\n\n const volumeUpdate: HistogramData = {\n time: (lastBar.timestamp / 1000) as Time,\n value: lastBar.volume,\n color: lastBar.close >= lastBar.open ? '#10b98180' : '#ef444480',\n };\n\n candlestickSeriesRef.current.update(candleUpdate);\n volumeSeriesRef.current.update(volumeUpdate);\n }\n\n previousBarsRef.current = uniqueBars;\n }, [bars]);\n\n useEffect(() => {\n if (!chartRef.current || !candlestickSeriesRef.current) return;\n\n priceLineRefs.current.forEach((priceLine) => {\n candlestickSeriesRef.current?.removePriceLine(priceLine);\n });\n priceLineRefs.current.clear();\n\n lines.forEach((line) => {\n const priceLine = candlestickSeriesRef.current?.createPriceLine({\n price: line.price,\n color: line.color,\n lineWidth: (line.lineWidth || 2) as LineWidth,\n lineStyle: getLineStyle(line.lineStyle),\n axisLabelVisible: true,\n title: line.title || '',\n });\n\n if (priceLine) {\n priceLineRefs.current.set(line.id, priceLine);\n }\n });\n\n requestAnimationFrame(() => {\n if (!candlestickSeriesRef.current || !chartContainerRef.current) return;\n const rect = chartContainerRef.current.getBoundingClientRect();\n const newPositions = new Map<string, { top: number; right: number }>();\n lines.forEach((line) => {\n const y = candlestickSeriesRef.current?.priceToCoordinate(line.price);\n if (y !== null && y !== undefined) {\n newPositions.set(line.id, {\n top: rect.top + y,\n right: window.innerWidth - rect.right + 68 + estimateLabelTitleWidth(line.title),\n });\n }\n });\n setLinePositions(newPositions);\n });\n }, [lines]);\n\n useEffect(() => {\n if (!chartRef.current || !candlestickSeriesRef.current) return;\n\n const updatePositions = () => {\n if (!candlestickSeriesRef.current || !chartContainerRef.current) return;\n const rect = chartContainerRef.current.getBoundingClientRect();\n const newPositions = new Map<string, { top: number; right: number }>();\n lines.forEach((line) => {\n const y = candlestickSeriesRef.current?.priceToCoordinate(line.price);\n if (y !== null && y !== undefined) {\n newPositions.set(line.id, {\n top: rect.top + y,\n right: window.innerWidth - rect.right + 68 + estimateLabelTitleWidth(line.title),\n });\n }\n });\n setLinePositions(newPositions);\n };\n\n chartRef.current.timeScale().subscribeVisibleLogicalRangeChange(updatePositions);\n window.addEventListener('scroll', updatePositions, { passive: true });\n window.addEventListener('resize', updatePositions);\n\n return () => {\n chartRef.current?.timeScale().unsubscribeVisibleLogicalRangeChange(updatePositions);\n window.removeEventListener('scroll', updatePositions);\n window.removeEventListener('resize', updatePositions);\n };\n }, [lines]);\n\n // Shaded price bands: project top/bottom prices to container-relative px and\n // keep them in sync as the price scale auto-rescales (scroll/zoom/resize).\n useEffect(() => {\n const series = candlestickSeriesRef.current;\n if (!chartRef.current || !series) return;\n if (priceBands.length === 0) {\n setBandRects([]);\n return;\n }\n const recompute = () => {\n if (!candlestickSeriesRef.current) return;\n const rects: Array<{ id: string; top: number; height: number; color: string }> = [];\n for (const band of priceBands) {\n const yTop = candlestickSeriesRef.current.priceToCoordinate(band.top);\n const yBottom = candlestickSeriesRef.current.priceToCoordinate(band.bottom);\n if (yTop == null || yBottom == null) continue;\n const top = Math.min(yTop, yBottom);\n const height = Math.abs(yBottom - yTop);\n rects.push({ id: band.id, top, height, color: band.color });\n }\n setBandRects(rects);\n };\n const raf = requestAnimationFrame(recompute);\n const timeScale = chartRef.current.timeScale();\n timeScale.subscribeVisibleLogicalRangeChange(recompute);\n window.addEventListener('resize', recompute);\n return () => {\n cancelAnimationFrame(raf);\n chartRef.current?.timeScale().unsubscribeVisibleLogicalRangeChange(recompute);\n window.removeEventListener('resize', recompute);\n };\n }, [priceBands]);\n\n useEffect(() => {\n if (!chartRef.current) return;\n\n indicatorSeriesRef.current.forEach((series) => {\n chartRef.current?.removeSeries(series);\n });\n indicatorSeriesRef.current.clear();\n indicatorPaneIndexRef.current.clear();\n nextPaneIndexRef.current = 2;\n\n indicators.forEach((indicator) => {\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return;\n\n const data = indicatorCalculator.calculate(indicator, barsRef.current);\n if (!data || data.length === 0) return;\n\n const seriesType = definition.renderConfig.seriesType;\n const isOverlay = definition.renderConfig.overlay !== false;\n const paneIndex = isOverlay ? 0 : nextPaneIndexRef.current;\n\n if (!isOverlay) {\n indicatorPaneIndexRef.current.set(indicator.id, paneIndex);\n nextPaneIndexRef.current++;\n }\n\n if (seriesType === 'line') {\n if (definition.renderConfig.outputCount === 1) {\n const series = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.color || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: indicator.name,\n }, paneIndex);\n const lineData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(lineData as LineData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n } else if (definition.renderConfig.hasBandFill && definition.renderConfig.fillBands) {\n const { upper: upperField, lower: lowerField } = definition.renderConfig.fillBands;\n\n const upperSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.upperColor || '#ef4444',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Upper`,\n }, paneIndex);\n const middleSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.middleColor || indicator.settings.vwapColor || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Middle`,\n }, paneIndex);\n const lowerSeries = chartRef.current!.addSeries(LineSeries, {\n color: indicator.settings.lowerColor || '#10b981',\n lineWidth: indicator.settings.lineWidth || 2,\n title: `${indicator.name} Lower`,\n }, paneIndex);\n\n const upperData = data.map(d => ({ time: d.time as Time, value: d[upperField] })).filter(d => !isNaN(d.value));\n const middleData = data.map(d => ({ time: d.time as Time, value: d.value })).filter(d => !isNaN(d.value));\n const lowerData = data.map(d => ({ time: d.time as Time, value: d[lowerField] })).filter(d => !isNaN(d.value));\n\n upperSeries.setData(upperData as LineData[]);\n middleSeries.setData(middleData as LineData[]);\n lowerSeries.setData(lowerData as LineData[]);\n\n if (indicator.settings.showFill !== false) {\n const bandsPrimitive = new BandsPrimitive({\n upperSeries: upperSeries,\n lowerSeries: lowerSeries,\n fillColor: indicator.settings.fillColor || 'rgba(59, 130, 246, 0.1)',\n });\n upperSeries.attachPrimitive(bandsPrimitive);\n }\n\n indicatorSeriesRef.current.set(`${indicator.id}-upper`, upperSeries);\n indicatorSeriesRef.current.set(`${indicator.id}-middle`, middleSeries);\n indicatorSeriesRef.current.set(`${indicator.id}-lower`, lowerSeries);\n }\n } else if (seriesType === 'histogram') {\n const series = chartRef.current!.addSeries(HistogramSeries, {\n color: indicator.settings.color || '#8b5cf6',\n title: indicator.name,\n }, paneIndex);\n const histData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(histData as HistogramData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n } else if (seriesType === 'area') {\n const series = chartRef.current!.addSeries(AreaSeries, {\n topColor: indicator.settings.topColor || '#3b82f680',\n bottomColor: indicator.settings.bottomColor || '#3b82f600',\n lineColor: indicator.settings.lineColor || '#3b82f6',\n lineWidth: indicator.settings.lineWidth || 2,\n title: indicator.name,\n }, paneIndex);\n const areaData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(areaData as LineData[]);\n indicatorSeriesRef.current.set(indicator.id, series);\n }\n });\n }, [indicators]);\n\n useEffect(() => {\n if (!chartRef.current || indicators.length === 0) return;\n\n indicators.forEach((indicator) => {\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return;\n\n const data = indicatorCalculator.calculate(indicator, barsRef.current);\n if (!data || data.length === 0) return;\n\n if (definition.renderConfig.outputCount === 1) {\n const series = indicatorSeriesRef.current.get(indicator.id);\n if (series) {\n const lineData = data.map(d => ({ time: d.time as Time, value: d.value }));\n series.setData(lineData as any);\n }\n } else if (definition.renderConfig.hasBandFill && definition.renderConfig.fillBands) {\n const { upper: upperField, lower: lowerField } = definition.renderConfig.fillBands;\n\n const upperSeries = indicatorSeriesRef.current.get(`${indicator.id}-upper`);\n const middleSeries = indicatorSeriesRef.current.get(`${indicator.id}-middle`);\n const lowerSeries = indicatorSeriesRef.current.get(`${indicator.id}-lower`);\n\n if (upperSeries && middleSeries && lowerSeries) {\n const upperData = data.map(d => ({ time: d.time as Time, value: d[upperField] })).filter(d => !isNaN(d.value));\n const middleData = data.map(d => ({ time: d.time as Time, value: d.value })).filter(d => !isNaN(d.value));\n const lowerData = data.map(d => ({ time: d.time as Time, value: d[lowerField] })).filter(d => !isNaN(d.value));\n\n upperSeries.setData(upperData as any);\n middleSeries.setData(middleData as any);\n lowerSeries.setData(lowerData as any);\n }\n }\n });\n }, [bars, indicators]);\n\n useEffect(() => {\n if (!seriesMarkersRef.current) return;\n const tradeMarkers = buildTradeMarkers(trades, selectedTradeId);\n const selectionMarker: SeriesMarker<Time>[] =\n enableBarSelection && selectedBar\n ? [\n {\n time: (selectedBar.timestamp / 1000) as Time,\n position: 'aboveBar' as const,\n color: '#3b82f6',\n shape: 'circle' as const,\n text: '',\n },\n ]\n : [];\n const all = [...tradeMarkers, ...selectionMarker].sort(\n (a, b) => (a.time as number) - (b.time as number),\n );\n seriesMarkersRef.current.setMarkers(all);\n }, [trades, selectedTradeId, selectedBar, enableBarSelection]);\n\n useEffect(() => {\n if (!chartRef.current || !selectedBar || !enableBarSelection) {\n setSpotlightPosition(null);\n return;\n }\n\n const updateSpotlightPosition = () => {\n if (!chartRef.current || !selectedBar || !chartContainerRef.current) return;\n\n const timeScale = chartRef.current.timeScale();\n const barX = timeScale.timeToCoordinate((selectedBar.timestamp / 1000) as Time);\n\n if (barX !== null) {\n const rect = chartContainerRef.current.getBoundingClientRect();\n const barWidth = Math.max(8, rect.width / bars.length);\n setSpotlightPosition({ x: barX - barWidth / 2, width: barWidth });\n }\n };\n\n updateSpotlightPosition();\n\n const timeScale = chartRef.current.timeScale();\n timeScale.subscribeVisibleLogicalRangeChange(updateSpotlightPosition);\n\n return () => {\n if (chartRef.current) {\n chartRef.current.timeScale().unsubscribeVisibleLogicalRangeChange(updateSpotlightPosition);\n }\n };\n }, [selectedBar, enableBarSelection, bars.length]);\n\n const selectedTrade = trades.find((t) => t.id === selectedTradeId) ?? null;\n\n useEffect(() => {\n if (!chartRef.current || !selectedTrade) {\n setTradePopupPos(null);\n return;\n }\n\n const updateTradePopupPos = () => {\n if (!chartRef.current || !selectedTrade || !chartContainerRef.current) return;\n const timeScale = chartRef.current.timeScale();\n const x = timeScale.timeToCoordinate((selectedTrade.entryTime / 1000) as Time);\n // Hide when the bar is off-screen: timeToCoordinate returns null once it leaves the\n // logical range, but a bar just past the edge returns an out-of-bounds coordinate —\n // bound to [0, width] so the popup never peeks regardless of container overflow.\n const width = chartContainerRef.current.getBoundingClientRect().width;\n setTradePopupPos(x !== null && x >= 0 && x <= width ? { x } : null);\n };\n\n updateTradePopupPos();\n const timeScale = chartRef.current.timeScale();\n timeScale.subscribeVisibleLogicalRangeChange(updateTradePopupPos);\n return () => {\n if (chartRef.current) {\n chartRef.current.timeScale().unsubscribeVisibleLogicalRangeChange(updateTradePopupPos);\n }\n };\n }, [selectedTrade, selectedTrade?.entryTime]);\n\n const handleDeleteLine = (lineId: string) => {\n if (onDeleteLine) {\n onDeleteLine(lineId);\n }\n };\n\n const handleAddLineFromContext = (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance') => {\n if (onAddLine && contextMenu) {\n onAddLine(type, contextMenu.price);\n setContextMenu(null);\n }\n };\n\n const handleClearAllLines = () => {\n if (onClearAllLines) {\n onClearAllLines();\n setContextMenu(null);\n }\n };\n\n return (\n <div className=\"relative space-y-4\">\n {isLoadingMore && (\n <div className=\"absolute top-4 left-1/2 transform -translate-x-1/2 bg-slate-800 text-slate-200 px-4 py-2 rounded-lg shadow-lg z-10\">\n Loading more data...\n </div>\n )}\n <div className=\"relative\">\n <div ref={chartContainerRef} className=\"w-full\" />\n\n {bandRects.map((b) => (\n <div\n key={b.id}\n className=\"absolute left-0 right-0 pointer-events-none z-4\"\n style={{ top: `${b.top}px`, height: `${b.height}px`, background: b.color }}\n />\n ))}\n\n {enableBarSelection && spotlightPosition && (\n <div\n className=\"absolute top-0 bottom-0 pointer-events-none z-5\"\n style={{\n left: `${spotlightPosition.x}px`,\n width: `${spotlightPosition.width}px`,\n background: 'rgba(59, 130, 246, 0.15)',\n borderLeft: '1px solid rgba(59, 130, 246, 0.4)',\n borderRight: '1px solid rgba(59, 130, 246, 0.4)',\n }}\n />\n )}\n\n {selectedTrade && tradePopupPos && renderTradePopup && (\n <div\n className=\"absolute z-20 pointer-events-auto\"\n style={{ left: `${tradePopupPos.x}px`, top: 8, transform: 'translateX(-50%)' }}\n >\n {renderTradePopup(selectedTrade)}\n </div>\n )}\n </div>\n\n {onDeleteLine && chartContainerRef.current && lines.map((line) => {\n const pos = linePositions.get(line.id);\n if (!pos) return null;\n\n return createPortal(\n <button\n key={line.id}\n onClick={() => handleDeleteLine(line.id)}\n className=\"bg-red-500/70 hover:bg-red-500 text-white rounded-full w-4 h-4 flex items-center justify-center text-xs font-bold transition-colors shadow-md\"\n style={{\n position: 'fixed',\n top: `${pos.top - 8}px`,\n right: `${pos.right}px`,\n zIndex: 9999,\n }}\n title=\"Delete line\"\n >\n ×\n </button>,\n document.body\n );\n })}\n\n {contextMenu && (\n <div\n className=\"absolute bg-slate-800 border border-slate-600 rounded-lg shadow-xl z-30 py-1 min-w-[180px]\"\n style={{\n left: `${contextMenu.x}px`,\n top: `${contextMenu.y}px`,\n }}\n >\n <div className=\"px-3 py-1 text-xs text-slate-400 border-b border-slate-600\">\n Price: {contextMenu.price.toFixed(3)}\n </div>\n <button\n onClick={() => handleAddLineFromContext('entry')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Entry Line\n </button>\n <button\n onClick={() => handleAddLineFromContext('stopLoss')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Stop Loss\n </button>\n <button\n onClick={() => handleAddLineFromContext('takeProfit')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Take Profit\n </button>\n <div className=\"border-t border-slate-600 my-1\"></div>\n <button\n onClick={() => handleAddLineFromContext('support')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Support Line\n </button>\n <button\n onClick={() => handleAddLineFromContext('resistance')}\n className=\"w-full px-3 py-2 text-left text-sm text-slate-200 hover:bg-slate-700 transition-colors\"\n >\n Add Resistance Line\n </button>\n <div className=\"border-t border-slate-600 my-1\"></div>\n <button\n onClick={handleClearAllLines}\n className=\"w-full px-3 py-2 text-left text-sm text-red-400 hover:bg-slate-700 transition-colors\"\n >\n Clear All Lines\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// A price line with a `title` renders a title box to the LEFT of its on-axis\n// price value, overhanging into the plot. The floating delete button is placed\n// just left of the value box, so without this allowance it lands on top of the\n// title text. Reserve an approximate title-box width (canvas labels can't be\n// measured) so the button clears the label.\nfunction estimateLabelTitleWidth(title?: string): number {\n if (!title) return 0;\n return title.length * 7 + 18;\n}\n\nfunction getLineStyle(style?: 'solid' | 'dashed' | 'dotted'): LineStyle {\n switch (style) {\n case 'dashed':\n return LineStyle.Dashed;\n case 'dotted':\n return LineStyle.Dotted;\n default:\n return LineStyle.Solid;\n }\n}\n\n// Axis tick labels in `timeZone` (undefined = the viewer's local timezone).\n// `tickMarkType`: 0=Year, 1=Month, 2=DayOfMonth, 3=Time, 4=TimeWithSeconds.\nfunction makeTickMarkFormatter(timeZone?: string) {\n const time = new Intl.DateTimeFormat('en-US', { timeZone, hour: '2-digit', minute: '2-digit', hourCycle: 'h23' });\n const timeSec = new Intl.DateTimeFormat('en-US', { timeZone, hour: '2-digit', minute: '2-digit', second: '2-digit', hourCycle: 'h23' });\n const month = new Intl.DateTimeFormat('en-US', { timeZone, month: 'short' });\n const day = new Intl.DateTimeFormat('en-US', { timeZone, month: 'short', day: 'numeric' });\n const year = new Intl.DateTimeFormat('en-US', { timeZone, year: 'numeric' });\n return (t: Time, tickMarkType: number): string => {\n const d = new Date((t as number) * 1000);\n switch (tickMarkType) {\n case 0:\n return year.format(d);\n case 1:\n return month.format(d);\n case 2:\n return day.format(d);\n case 4:\n return timeSec.format(d);\n default:\n return time.format(d);\n }\n };\n}\n\n// Crosshair time label in `timeZone` (undefined = the viewer's local timezone).\nfunction makeCrosshairTimeFormatter(timeZone?: string) {\n const fmt = new Intl.DateTimeFormat('en-US', {\n timeZone,\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n });\n return (t: Time): string => fmt.format(new Date((t as number) * 1000));\n}\n","import { z } from 'zod';\nimport { OHLCVBar } from '../../types/chart';\n\nexport enum IndicatorCategory {\n TREND = 'Trend',\n MOMENTUM = 'Momentum',\n VOLATILITY = 'Volatility',\n VOLUME = 'Volume',\n OSCILLATORS = 'Oscillators',\n}\n\nexport enum ChartSeriesType {\n LINE = 'line',\n HISTOGRAM = 'histogram',\n AREA = 'area',\n}\n\nexport const SettingFieldTypeSchema = z.enum([\n 'number',\n 'color',\n 'boolean',\n 'select',\n 'lineStyle',\n]);\n\nexport const LineStyleSchema = z.enum(['solid', 'dashed', 'dotted']);\n\nexport const SettingFieldSchema = z.object({\n type: SettingFieldTypeSchema,\n label: z.string(),\n defaultValue: z.union([z.string(), z.number(), z.boolean()]),\n description: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n options: z.array(z.object({ label: z.string(), value: z.string() })).optional(),\n});\n\nexport const IndicatorSettingsSchema = z.record(z.string(), SettingFieldSchema);\n\nexport const IndicatorMetadataSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string(),\n category: z.nativeEnum(IndicatorCategory),\n version: z.string().default('1.0.0'),\n});\n\nexport const RenderConfigSchema = z.object({\n seriesType: z.nativeEnum(ChartSeriesType),\n outputCount: z.number().default(1),\n overlay: z.boolean().default(true),\n hasBandFill: z.boolean().optional(),\n fillBands: z.object({\n upper: z.string(),\n lower: z.string(),\n }).optional(),\n});\n\nexport type SettingFieldType = z.infer<typeof SettingFieldTypeSchema>;\nexport type LineStyle = z.infer<typeof LineStyleSchema>;\nexport type SettingField = z.infer<typeof SettingFieldSchema>;\nexport type IndicatorSettings = z.infer<typeof IndicatorSettingsSchema>;\nexport type IndicatorMetadata = z.infer<typeof IndicatorMetadataSchema>;\nexport type RenderConfig = z.infer<typeof RenderConfigSchema>;\n\nexport interface IndicatorOutput {\n time: number;\n value: number;\n [key: string]: number;\n}\n\nexport type IndicatorCalculation = (\n bars: OHLCVBar[],\n settings: Record<string, any>\n) => IndicatorOutput[];\n\nexport interface IndicatorDefinition {\n metadata: IndicatorMetadata;\n settings: IndicatorSettings;\n renderConfig: RenderConfig;\n calculate: IndicatorCalculation;\n}\n\nexport interface IndicatorInstance {\n id: string;\n definitionId: string;\n name: string;\n settings: Record<string, any>;\n data?: IndicatorOutput[];\n}\n\nexport const IndicatorInstanceSchema = z.object({\n id: z.string(),\n definitionId: z.string(),\n name: z.string(),\n settings: z.record(z.string(), z.any()),\n});\n","import { useState, useMemo } from 'react';\nimport { Search, X, Plus } from 'lucide-react';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { IndicatorCategory, IndicatorDefinition } from '../indicators/core/types';\n\ninterface IndicatorBrowserProps {\n isOpen: boolean;\n onClose: () => void;\n onAddIndicator: (definitionId: string) => void;\n}\n\nexport default function IndicatorBrowser({\n isOpen,\n onClose,\n onAddIndicator,\n}: IndicatorBrowserProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<IndicatorCategory | 'All'>('All');\n\n const categories = useMemo(() => {\n return ['All', ...Object.values(IndicatorCategory)];\n }, []);\n\n const filteredIndicators = useMemo(() => {\n let indicators = indicatorRegistry.getAll();\n\n if (selectedCategory !== 'All') {\n indicators = indicators.filter(\n (ind) => ind.metadata.category === selectedCategory\n );\n }\n\n if (searchQuery.trim()) {\n indicators = indicatorRegistry.search(searchQuery);\n if (selectedCategory !== 'All') {\n indicators = indicators.filter(\n (ind) => ind.metadata.category === selectedCategory\n );\n }\n }\n\n return indicators;\n }, [searchQuery, selectedCategory]);\n\n if (!isOpen) return null;\n\n const handleAddIndicator = (definitionId: string) => {\n onAddIndicator(definitionId);\n onClose();\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <div className=\"bg-slate-800 rounded-lg shadow-xl w-full max-w-3xl max-h-[80vh] flex flex-col\">\n <div className=\"flex items-center justify-between p-4 border-b border-slate-700\">\n <h2 className=\"text-lg font-semibold text-slate-100\">Add Indicator</h2>\n <button\n onClick={onClose}\n className=\"text-slate-400 hover:text-slate-200 transition\"\n >\n <X size={20} />\n </button>\n </div>\n\n <div className=\"p-4 border-b border-slate-700\">\n <div className=\"relative\">\n <Search\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-slate-400\"\n size={20}\n />\n <input\n type=\"text\"\n placeholder=\"Search indicators...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-10 pr-4 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n\n <div className=\"flex gap-2 mt-3 overflow-x-auto pb-2\">\n {categories.map((category) => (\n <button\n key={category}\n onClick={() => setSelectedCategory(category as IndicatorCategory | 'All')}\n className={`px-3 py-1.5 rounded-lg text-sm font-medium whitespace-nowrap transition ${\n selectedCategory === category\n ? 'bg-blue-600 text-white'\n : 'bg-slate-700 text-slate-300 hover:bg-slate-600'\n }`}\n >\n {category}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4\">\n {filteredIndicators.length === 0 ? (\n <div className=\"text-center py-12 text-slate-400\">\n <p>No indicators found</p>\n {searchQuery && (\n <p className=\"text-sm mt-2\">\n Try adjusting your search or category filter\n </p>\n )}\n </div>\n ) : (\n <div className=\"grid gap-3\">\n {filteredIndicators.map((indicator) => (\n <IndicatorCard\n key={indicator.metadata.id}\n indicator={indicator}\n onAdd={() => handleAddIndicator(indicator.metadata.id)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ninterface IndicatorCardProps {\n indicator: IndicatorDefinition;\n onAdd: () => void;\n}\n\nfunction IndicatorCard({ indicator, onAdd }: IndicatorCardProps) {\n const getCategoryColor = (category: IndicatorCategory) => {\n switch (category) {\n case IndicatorCategory.TREND:\n return 'bg-blue-500/20 text-blue-400';\n case IndicatorCategory.MOMENTUM:\n return 'bg-purple-500/20 text-purple-400';\n case IndicatorCategory.VOLATILITY:\n return 'bg-orange-500/20 text-orange-400';\n case IndicatorCategory.VOLUME:\n return 'bg-green-500/20 text-green-400';\n case IndicatorCategory.OSCILLATORS:\n return 'bg-pink-500/20 text-pink-400';\n default:\n return 'bg-slate-500/20 text-slate-400';\n }\n };\n\n return (\n <div className=\"bg-slate-700/50 rounded-lg p-4 hover:bg-slate-700 transition group\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2 mb-2\">\n <h3 className=\"text-slate-100 font-medium\">{indicator.metadata.name}</h3>\n <span\n className={`px-2 py-0.5 rounded text-xs font-medium ${getCategoryColor(\n indicator.metadata.category\n )}`}\n >\n {indicator.metadata.category}\n </span>\n </div>\n <p className=\"text-sm text-slate-400\">{indicator.metadata.description}</p>\n </div>\n <button\n onClick={onAdd}\n className=\"flex items-center gap-1.5 px-3 py-1.5 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition text-sm font-medium opacity-0 group-hover:opacity-100\"\n >\n <Plus size={16} />\n Add\n </button>\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { IndicatorSettings, SettingField } from '../indicators/core/types';\n\ninterface IndicatorSettingsFormProps {\n settings: IndicatorSettings;\n currentValues: Record<string, any>;\n onChange: (key: string, value: any) => void;\n}\n\nexport default function IndicatorSettingsForm({\n settings,\n currentValues,\n onChange,\n}: IndicatorSettingsFormProps) {\n return (\n <div className=\"space-y-4\">\n {Object.entries(settings).map(([key, field]) => (\n <div key={key}>\n <label className=\"block text-sm font-medium text-slate-300 mb-1\">\n {field.label}\n </label>\n {field.description && (\n <p className=\"text-xs text-slate-400 mb-2\">{field.description}</p>\n )}\n {renderField(key, field, currentValues[key], onChange)}\n </div>\n ))}\n </div>\n );\n}\n\nfunction parseColor(colorValue: string): { hex: string; opacity: number } {\n const rgbaMatch = colorValue.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)$/);\n\n if (rgbaMatch) {\n const r = parseInt(rgbaMatch[1]);\n const g = parseInt(rgbaMatch[2]);\n const b = parseInt(rgbaMatch[3]);\n const a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1;\n\n const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n return { hex, opacity: Math.round(a * 100) };\n }\n\n return { hex: colorValue, opacity: 100 };\n}\n\nfunction hexToRgba(hex: string, opacity: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n const a = opacity / 100;\n\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\nfunction ColorPicker({ value, defaultValue, onChange }: { value: any; defaultValue: string; onChange: (value: string) => void }) {\n const colorValue = value ?? defaultValue;\n const { hex, opacity } = parseColor(colorValue);\n\n const [localHex, setLocalHex] = useState(hex);\n const [localOpacity, setLocalOpacity] = useState(opacity);\n\n const handleColorChange = (newHex: string) => {\n setLocalHex(newHex);\n onChange(hexToRgba(newHex, localOpacity));\n };\n\n const handleOpacityChange = (newOpacity: number) => {\n setLocalOpacity(newOpacity);\n onChange(hexToRgba(localHex, newOpacity));\n };\n\n const handleTextChange = (newValue: string) => {\n const parsed = parseColor(newValue);\n setLocalHex(parsed.hex);\n setLocalOpacity(parsed.opacity);\n onChange(newValue);\n };\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n value={localHex}\n onChange={(e) => handleColorChange(e.target.value)}\n className=\"w-12 h-10 rounded cursor-pointer\"\n />\n <input\n type=\"text\"\n value={colorValue}\n onChange={(e) => handleTextChange(e.target.value)}\n className=\"flex-1 px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={localOpacity}\n onChange={(e) => handleOpacityChange(parseInt(e.target.value))}\n className=\"flex-1 h-2 bg-slate-600 rounded-lg appearance-none cursor-pointer\"\n />\n <span className=\"text-sm text-slate-400 w-12 text-right\">{localOpacity}%</span>\n </div>\n </div>\n );\n}\n\nfunction renderField(\n key: string,\n field: SettingField,\n value: any,\n onChange: (key: string, value: any) => void\n) {\n switch (field.type) {\n case 'number':\n return (\n <input\n type=\"number\"\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, parseFloat(e.target.value))}\n min={field.min}\n max={field.max}\n step={field.step}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n );\n\n case 'color':\n return (\n <ColorPicker\n value={value}\n defaultValue={field.defaultValue as string}\n onChange={(newValue) => onChange(key, newValue)}\n />\n );\n\n case 'boolean':\n return (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.checked)}\n className=\"w-4 h-4 text-blue-600 bg-slate-700 border-slate-600 rounded focus:ring-blue-500\"\n />\n <span className=\"text-sm text-slate-300\">\n {value ?? field.defaultValue ? 'Enabled' : 'Disabled'}\n </span>\n </label>\n );\n\n case 'select':\n return (\n <select\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {field.options?.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n );\n\n case 'lineStyle':\n return (\n <select\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <option value=\"solid\">Solid</option>\n <option value=\"dashed\">Dashed</option>\n <option value=\"dotted\">Dotted</option>\n </select>\n );\n\n default:\n return (\n <input\n type=\"text\"\n value={value ?? field.defaultValue}\n onChange={(e) => onChange(key, e.target.value)}\n className=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-slate-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n );\n }\n}\n","import { useState, useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport IndicatorSettingsForm from './IndicatorSettingsForm';\n\ninterface SettingsDialogProps {\n isOpen: boolean;\n onClose: () => void;\n indicator: IndicatorInstance | null;\n onSave: (indicatorId: string, settings: Record<string, any>) => void;\n}\n\nexport default function SettingsDialog({\n isOpen,\n onClose,\n indicator,\n onSave,\n}: SettingsDialogProps) {\n const [settings, setSettings] = useState<Record<string, any>>({});\n\n useEffect(() => {\n if (indicator) {\n setSettings({ ...indicator.settings });\n }\n }, [indicator]);\n\n if (!isOpen || !indicator) return null;\n\n const definition = indicatorRegistry.get(indicator.definitionId);\n if (!definition) return null;\n\n const handleSave = () => {\n onSave(indicator.id, settings);\n onClose();\n };\n\n const handleChange = (key: string, value: any) => {\n setSettings((prev) => ({\n ...prev,\n [key]: value,\n }));\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <div className=\"bg-slate-800 rounded-lg shadow-xl w-full max-w-md\">\n <div className=\"flex items-center justify-between p-4 border-b border-slate-700\">\n <h2 className=\"text-lg font-semibold text-slate-100\">\n {indicator.name} Settings\n </h2>\n <button\n onClick={onClose}\n className=\"text-slate-400 hover:text-slate-200 transition\"\n >\n <X size={20} />\n </button>\n </div>\n\n <div className=\"p-4\">\n <IndicatorSettingsForm\n settings={definition.settings}\n currentValues={settings}\n onChange={handleChange}\n />\n </div>\n\n <div className=\"flex items-center justify-end gap-2 p-4 border-t border-slate-700\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-slate-300 hover:text-slate-100 transition\"\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n className=\"px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition\"\n >\n Save Changes\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { ChartLine } from '../types/chart';\nimport { IndicatorInstance } from '../indicators/core/types';\nimport { indicatorRegistry } from '../indicators/core/registry';\nimport { indicatorCalculator } from '../indicators/core/calculator';\nimport { PersistenceAdapter } from '../indicators/core/persistence';\n\ninterface UseChartAPIOptions {\n persistenceAdapter?: PersistenceAdapter;\n}\n\nexport function useChartAPI(options?: UseChartAPIOptions) {\n const [lines, setLines] = useState<ChartLine[]>([]);\n const [indicators, setIndicators] = useState<IndicatorInstance[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (options?.persistenceAdapter) {\n options.persistenceAdapter.loadIndicators().then((loaded) => {\n setIndicators(loaded);\n setIsLoading(false);\n });\n } else {\n setIsLoading(false);\n }\n }, [options?.persistenceAdapter]);\n\n useEffect(() => {\n if (!isLoading && options?.persistenceAdapter) {\n options.persistenceAdapter.saveIndicators(indicators);\n }\n }, [indicators, isLoading, options?.persistenceAdapter]);\n\n const addLine = useCallback(\n (\n id: string,\n price: number,\n options?: {\n color?: string;\n lineWidth?: number;\n lineStyle?: 'solid' | 'dashed' | 'dotted';\n title?: string;\n }\n ) => {\n const newLine: ChartLine = {\n id,\n price,\n color: options?.color || '#3b82f6',\n lineWidth: options?.lineWidth || 2,\n lineStyle: options?.lineStyle || 'solid',\n title: options?.title,\n };\n setLines((prev) => [...prev, newLine]);\n },\n []\n );\n\n const removeLine = useCallback((id: string) => {\n setLines((prev) => prev.filter((line) => line.id !== id));\n }, []);\n\n const updateLine = useCallback((id: string, price: number) => {\n setLines((prev) =>\n prev.map((line) => (line.id === id ? { ...line, price } : line))\n );\n }, []);\n\n const addEntryLine = useCallback(\n (price: number) => {\n const id = `entry-${Date.now()}`;\n addLine(id, price, {\n color: '#3b82f6',\n title: 'Entry',\n lineStyle: 'solid',\n });\n },\n [addLine]\n );\n\n const addStopLoss = useCallback(\n (price: number) => {\n const id = `stop-loss-${Date.now()}`;\n addLine(id, price, {\n color: '#ef4444',\n title: 'Stop Loss',\n lineStyle: 'dashed',\n });\n },\n [addLine]\n );\n\n const addTakeProfit = useCallback(\n (price: number) => {\n const id = `take-profit-${Date.now()}`;\n addLine(id, price, {\n color: '#10b981',\n title: 'Take Profit',\n lineStyle: 'dashed',\n });\n },\n [addLine]\n );\n\n const addSupportLine = useCallback(\n (price: number) => {\n const id = `support-${Date.now()}`;\n addLine(id, price, {\n color: '#10b981',\n title: 'Support',\n lineStyle: 'dotted',\n });\n },\n [addLine]\n );\n\n const addResistanceLine = useCallback(\n (price: number) => {\n const id = `resistance-${Date.now()}`;\n addLine(id, price, {\n color: '#f97316',\n title: 'Resistance',\n lineStyle: 'dotted',\n });\n },\n [addLine]\n );\n\n const clearAllLines = useCallback(() => {\n setLines([]);\n }, []);\n\n const addLineByType = useCallback(\n (type: 'entry' | 'stopLoss' | 'takeProfit' | 'support' | 'resistance', price: number) => {\n if (type === 'entry') {\n addEntryLine(price);\n } else if (type === 'stopLoss') {\n addStopLoss(price);\n } else if (type === 'takeProfit') {\n addTakeProfit(price);\n } else if (type === 'support') {\n addSupportLine(price);\n } else if (type === 'resistance') {\n addResistanceLine(price);\n }\n },\n [addEntryLine, addStopLoss, addTakeProfit, addSupportLine, addResistanceLine]\n );\n\n const addIndicator = useCallback((definitionId: string, customSettings?: Record<string, any>) => {\n const instance = indicatorRegistry.createInstance(definitionId, customSettings);\n setIndicators((prev) => [...prev, instance]);\n return instance;\n }, []);\n\n const removeIndicator = useCallback((id: string) => {\n setIndicators((prev) => prev.filter((indicator) => indicator.id !== id));\n indicatorCalculator.invalidateCache(id);\n }, []);\n\n const updateIndicatorSettings = useCallback(\n (id: string, settings: Record<string, any>) => {\n setIndicators((prev) =>\n prev.map((indicator) =>\n indicator.id === id ? { ...indicator, settings } : indicator\n )\n );\n indicatorCalculator.invalidateCache(id);\n },\n []\n );\n\n return {\n lines,\n indicators,\n isLoadingIndicators: isLoading,\n addLine,\n removeLine,\n updateLine,\n addEntryLine,\n addStopLoss,\n addTakeProfit,\n addSupportLine,\n addResistanceLine,\n clearAllLines,\n addLineByType,\n addIndicator,\n removeIndicator,\n updateIndicatorSettings,\n };\n}\n","import { OHLCVBar } from '../types/chart';\n\nexport function validateBar(bar: any): bar is OHLCVBar {\n if (!bar || typeof bar !== 'object') return false;\n\n const required = ['timestamp', 'open', 'high', 'low', 'close', 'volume'];\n for (const field of required) {\n if (!(field in bar)) return false;\n if (typeof bar[field] !== 'number') return false;\n }\n\n if (bar.timestamp <= 0) return false;\n if (bar.open <= 0 || bar.high <= 0 || bar.low <= 0 || bar.close <= 0) return false;\n if (bar.volume < 0) return false;\n if (bar.high < bar.low) return false;\n if (bar.high < bar.open || bar.high < bar.close) return false;\n if (bar.low > bar.open || bar.low > bar.close) return false;\n\n return true;\n}\n\nexport function isValidBar(bar: any): bar is OHLCVBar {\n return validateBar(bar);\n}\n\nexport function normalizeTimestamp(timestamp: number): number {\n if (timestamp < 10000000000) {\n return timestamp * 1000;\n }\n return timestamp;\n}\n\nexport function sortBars(bars: OHLCVBar[]): OHLCVBar[] {\n return [...bars].sort((a, b) => a.timestamp - b.timestamp);\n}\n\nexport function deduplicateBars(bars: OHLCVBar[]): OHLCVBar[] {\n const seen = new Map<number, OHLCVBar>();\n\n for (const bar of bars) {\n const existing = seen.get(bar.timestamp);\n if (!existing) {\n seen.set(bar.timestamp, bar);\n }\n }\n\n return Array.from(seen.values()).sort((a, b) => a.timestamp - b.timestamp);\n}\n\nexport function mergeBars(existingBars: OHLCVBar[], newBars: OHLCVBar[]): OHLCVBar[] {\n const allBars = [...existingBars, ...newBars];\n return deduplicateBars(allBars);\n}\n\nexport function validateAndNormalizeBars(bars: any[]): OHLCVBar[] {\n console.log(`validateAndNormalizeBars: received ${bars.length} bars`);\n const validated = bars\n .filter(bar => {\n if (!validateBar(bar)) {\n console.warn('Invalid bar data:', bar);\n return false;\n }\n return true;\n })\n .map(bar => ({\n ...bar,\n timestamp: normalizeTimestamp(bar.timestamp),\n }));\n console.log(`validateAndNormalizeBars: returning ${validated.length} valid bars`);\n return validated;\n}\n\nexport function updateBarInArray(bars: OHLCVBar[], updatedBar: OHLCVBar): OHLCVBar[] {\n const index = bars.findIndex(b => b.timestamp === updatedBar.timestamp);\n\n if (index === -1) {\n return [...bars, updatedBar].sort((a, b) => a.timestamp - b.timestamp);\n }\n\n const updated = [...bars];\n updated[index] = updatedBar;\n return updated;\n}\n\nexport function appendBar(bars: OHLCVBar[], newBar: OHLCVBar): OHLCVBar[] {\n const exists = bars.find(b => b.timestamp === newBar.timestamp);\n if (exists) {\n return bars;\n }\n\n return [...bars, newBar];\n}\n\nexport function prependBars(bars: OHLCVBar[], newBars: OHLCVBar[]): OHLCVBar[] {\n const existingTimestamps = new Set(bars.map(b => b.timestamp));\n const uniqueNewBars = newBars.filter(b => !existingTimestamps.has(b.timestamp));\n\n return [...uniqueNewBars, ...bars];\n}\n\nexport function getOldestBar(bars: OHLCVBar[]): OHLCVBar | null {\n if (bars.length === 0) return null;\n return bars[0];\n}\n\nexport function getNewestBar(bars: OHLCVBar[]): OHLCVBar | null {\n if (bars.length === 0) return null;\n return bars[bars.length - 1];\n}\n\nexport function updateCurrentBar(\n bars: OHLCVBar[],\n tradePrice: number,\n tradeVolume: number\n): OHLCVBar[] {\n if (bars.length === 0) return bars;\n\n const updated = [...bars];\n const lastBar = { ...updated[updated.length - 1] };\n\n lastBar.close = tradePrice;\n lastBar.high = Math.max(lastBar.high, tradePrice);\n lastBar.low = Math.min(lastBar.low, tradePrice);\n lastBar.volume += tradeVolume;\n\n updated[updated.length - 1] = lastBar;\n return updated;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { OHLCVBar } from '../types/chart';\nimport {\n appendBar as appendBarUtil,\n prependBars as prependBarsUtil,\n updateBarInArray,\n deduplicateBars,\n sortBars,\n validateAndNormalizeBars,\n updateCurrentBar as updateCurrentBarUtil,\n} from '../utils/barUtils';\nimport { BarDataAdapter, HistoricalDataParams, RealtimeSubscription } from '../adapters/types';\n\nexport interface UseBarsDataOptions {\n adapter?: BarDataAdapter;\n symbol?: string;\n timeframe?: string;\n autoFetch?: boolean;\n autoSubscribe?: boolean;\n limit?: number;\n}\n\nexport interface UseBarsDataReturn {\n bars: OHLCVBar[];\n loading: boolean;\n error: Error | null;\n connected: boolean;\n\n setBars: (bars: OHLCVBar[]) => void;\n appendBar: (bar: OHLCVBar) => void;\n updateLastBar: (bar: OHLCVBar) => void;\n updateCurrentBar: (tradePrice: number, tradeVolume: number) => void;\n prependBars: (bars: OHLCVBar[]) => void;\n clearBars: () => void;\n\n fetchHistorical: (params?: Partial<HistoricalDataParams>) => Promise<void>;\n subscribe: () => void;\n unsubscribe: () => void;\n\n refetch: () => Promise<void>;\n}\n\nexport function useBarsData(options: UseBarsDataOptions = {}): UseBarsDataReturn {\n const {\n adapter,\n symbol = 'AAPL',\n timeframe = '5Min',\n autoFetch = false,\n autoSubscribe = false,\n limit = 500,\n } = options;\n\n const [bars, setBarsState] = useState<OHLCVBar[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [connected, setConnected] = useState(false);\n\n const subscriptionRef = useRef<RealtimeSubscription | null>(null);\n const isMountedRef = useRef(true);\n const hasInitialFetchRef = useRef(false);\n const isFetchingRef = useRef(false);\n\n const setBars = useCallback((newBars: OHLCVBar[]) => {\n const validated = validateAndNormalizeBars(newBars);\n const sorted = sortBars(validated);\n setBarsState(sorted);\n }, []);\n\n const appendBar = useCallback((bar: OHLCVBar) => {\n setBarsState(prev => appendBarUtil(prev, bar));\n }, []);\n\n const updateLastBar = useCallback((bar: OHLCVBar) => {\n setBarsState(prev => {\n if (prev.length === 0) return [bar];\n const updated = [...prev];\n updated[updated.length - 1] = bar;\n return updated;\n });\n }, []);\n\n const updateCurrentBar = useCallback((tradePrice: number, tradeVolume: number) => {\n setBarsState(prev => updateCurrentBarUtil(prev, tradePrice, tradeVolume));\n }, []);\n\n const prependBars = useCallback((newBars: OHLCVBar[]) => {\n const validated = validateAndNormalizeBars(newBars);\n setBarsState(prev => prependBarsUtil(prev, validated));\n }, []);\n\n const clearBars = useCallback(() => {\n setBarsState([]);\n }, []);\n\n const fetchHistorical = useCallback(\n async (params: Partial<HistoricalDataParams> = {}) => {\n if (!adapter) {\n setError(new Error('No adapter provided'));\n return;\n }\n\n if (isFetchingRef.current) {\n console.log('fetchHistorical: already fetching, skipping');\n return;\n }\n\n console.log('fetchHistorical called, params:', params);\n console.log('isMountedRef.current:', isMountedRef.current);\n isFetchingRef.current = true;\n setLoading(true);\n setError(null);\n\n try {\n const fetchParams: HistoricalDataParams = {\n symbol: params.symbol || symbol,\n timeframe: params.timeframe || timeframe,\n limit: params.limit || limit,\n before: params.before,\n after: params.after,\n };\n\n console.log('Calling adapter.fetchHistoricalBars with:', fetchParams);\n const data = await adapter.fetchHistoricalBars(fetchParams);\n console.log('adapter.fetchHistoricalBars returned, data.length:', data.length);\n\n if (isMountedRef.current) {\n console.log('Component still mounted, processing data');\n const validated = validateAndNormalizeBars(data);\n\n if (params.before) {\n console.log('Prepending bars (before param present)');\n setBarsState(prev => prependBarsUtil(prev, validated));\n } else {\n console.log('Setting initial bars (no before param)');\n const sorted = sortBars(validated);\n setBarsState(sorted);\n }\n } else {\n console.log('Component unmounted, skipping data update');\n }\n } catch (err) {\n console.log('Error caught:', err);\n if (isMountedRef.current) {\n const error = err instanceof Error ? err : new Error('Failed to fetch historical data');\n setError(error);\n console.error('Failed to fetch historical data:', error);\n }\n } finally {\n console.log('Finally block executing, isMountedRef.current:', isMountedRef.current);\n isFetchingRef.current = false;\n if (isMountedRef.current) {\n console.log('Setting loading to false');\n setLoading(false);\n } else {\n console.log('Skipping setLoading(false) - component unmounted');\n }\n }\n },\n [adapter, symbol, timeframe, limit]\n );\n\n const subscribe = useCallback(() => {\n if (!adapter?.subscribeRealtime) {\n console.warn('Adapter does not support real-time subscriptions');\n return;\n }\n\n if (subscriptionRef.current) {\n console.warn('Already subscribed');\n return;\n }\n\n subscriptionRef.current = adapter.subscribeRealtime(symbol, {\n onBar: (bar) => {\n if (isMountedRef.current) {\n appendBar(bar);\n }\n },\n onTrade: (price, volume) => {\n if (isMountedRef.current) {\n updateCurrentBar(price, volume);\n }\n },\n onError: (err) => {\n if (isMountedRef.current) {\n setError(err);\n setConnected(false);\n }\n },\n onConnect: () => {\n if (isMountedRef.current) {\n setConnected(true);\n }\n },\n onDisconnect: () => {\n if (isMountedRef.current) {\n setConnected(false);\n }\n },\n });\n }, [adapter, symbol, appendBar, updateCurrentBar]);\n\n const unsubscribe = useCallback(() => {\n if (subscriptionRef.current) {\n subscriptionRef.current.unsubscribe();\n subscriptionRef.current = null;\n setConnected(false);\n }\n }, []);\n\n const refetch = useCallback(async () => {\n await fetchHistorical();\n }, [fetchHistorical]);\n\n useEffect(() => {\n console.log('useEffect[autoFetch] running, autoFetch:', autoFetch, 'adapter:', !!adapter, 'hasInitialFetch:', hasInitialFetchRef.current);\n if (autoFetch && adapter && !hasInitialFetchRef.current) {\n console.log('Calling fetchHistorical from useEffect (initial fetch)');\n hasInitialFetchRef.current = true;\n fetchHistorical();\n }\n }, [autoFetch, adapter, fetchHistorical]);\n\n useEffect(() => {\n if (autoSubscribe && adapter?.subscribeRealtime) {\n subscribe();\n }\n\n return () => {\n unsubscribe();\n };\n }, [autoSubscribe, adapter, subscribe, unsubscribe]);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n if (subscriptionRef.current) {\n subscriptionRef.current.unsubscribe();\n subscriptionRef.current = null;\n }\n };\n }, []);\n\n return {\n bars,\n loading,\n error,\n connected,\n setBars,\n appendBar,\n updateLastBar,\n updateCurrentBar,\n prependBars,\n clearBars,\n fetchHistorical,\n subscribe,\n unsubscribe,\n refetch,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { OHLCVBar } from '../types/chart';\n\ninterface RealtimeUpdateConfig {\n enabled: boolean;\n updateIntervalMs: number;\n newBarIntervalMs: number;\n}\n\nexport function useRealtimeUpdates(\n initialBars: OHLCVBar[],\n config: RealtimeUpdateConfig\n) {\n const [bars, setBars] = useState<OHLCVBar[]>([]);\n const updateIntervalRef = useRef<number>();\n const newBarIntervalRef = useRef<number>();\n const lastBarTimeRef = useRef<number>(0);\n const initializedRef = useRef(false);\n\n const updateCurrentBar = useCallback((tradePrice: number, tradeVolume: number) => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const updated = [...prev];\n const lastBar = { ...updated[updated.length - 1] };\n\n lastBar.close = tradePrice;\n lastBar.high = Math.max(lastBar.high, tradePrice);\n lastBar.low = Math.min(lastBar.low, tradePrice);\n lastBar.volume += tradeVolume;\n\n updated[updated.length - 1] = lastBar;\n return updated;\n });\n }, []);\n\n const addNewBar = useCallback((newBar: OHLCVBar) => {\n setBars((prev) => {\n const exists = prev.find(b => b.timestamp === newBar.timestamp);\n if (exists) return prev;\n return [...prev, newBar];\n });\n }, []);\n\n const prependBars = useCallback((newBars: OHLCVBar[]) => {\n setBars((prev) => {\n const existingTimestamps = new Set(prev.map(b => b.timestamp));\n const uniqueNewBars = newBars.filter(b => !existingTimestamps.has(b.timestamp));\n return [...uniqueNewBars, ...prev];\n });\n }, []);\n\n const generateRealisticPriceMove = useCallback((currentPrice: number): number => {\n const volatility = 0.0005;\n const drift = 0;\n const change = currentPrice * (drift + volatility * (Math.random() * 2 - 1));\n return currentPrice + change;\n }, []);\n\n useEffect(() => {\n if (!initializedRef.current && initialBars.length > 0) {\n setBars(initialBars);\n initializedRef.current = true;\n }\n }, [initialBars]);\n\n useEffect(() => {\n if (!config.enabled || bars.length === 0) return;\n\n const lastBar = bars[bars.length - 1];\n lastBarTimeRef.current = lastBar.timestamp;\n\n updateIntervalRef.current = window.setInterval(() => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const updated = [...prev];\n const currentBar = { ...updated[updated.length - 1] };\n\n const newPrice = currentBar.close * (1 + (Math.random() - 0.5) * 0.001);\n const newVolume = Math.floor(Math.random() * 100) + 10;\n\n currentBar.close = newPrice;\n currentBar.high = Math.max(currentBar.high, newPrice);\n currentBar.low = Math.min(currentBar.low, newPrice);\n currentBar.volume += newVolume;\n\n updated[updated.length - 1] = currentBar;\n return updated;\n });\n }, config.updateIntervalMs);\n\n newBarIntervalRef.current = window.setInterval(() => {\n setBars((prev) => {\n if (prev.length === 0) return prev;\n\n const lastBar = prev[prev.length - 1];\n const newTimestamp = lastBar.timestamp + config.newBarIntervalMs;\n\n const newPrice = lastBar.close * (1 + (Math.random() - 0.5) * 0.002);\n\n const newBar: OHLCVBar = {\n timestamp: newTimestamp,\n open: lastBar.close,\n high: newPrice,\n low: Math.min(lastBar.close, newPrice),\n close: newPrice,\n volume: Math.floor(Math.random() * 1000) + 100,\n };\n\n lastBarTimeRef.current = newTimestamp;\n return [...prev, newBar];\n });\n }, config.newBarIntervalMs);\n\n return () => {\n if (updateIntervalRef.current) {\n clearInterval(updateIntervalRef.current);\n }\n if (newBarIntervalRef.current) {\n clearInterval(newBarIntervalRef.current);\n }\n };\n }, [config.enabled, config.updateIntervalMs, config.newBarIntervalMs, bars.length]);\n\n return {\n bars,\n updateCurrentBar,\n addNewBar,\n prependBars,\n };\n}\n","import { IndicatorInstance } from './types';\n\nexport interface PersistenceAdapter {\n saveIndicators(indicators: IndicatorInstance[]): Promise<void>;\n loadIndicators(): Promise<IndicatorInstance[]>;\n deleteIndicator(id: string): Promise<void>;\n}\n\nexport class LocalStoragePersistenceAdapter implements PersistenceAdapter {\n private storageKey = 'chart_indicators';\n\n async saveIndicators(indicators: IndicatorInstance[]): Promise<void> {\n try {\n const serialized = JSON.stringify(indicators);\n localStorage.setItem(this.storageKey, serialized);\n } catch (error) {\n console.error('Error saving indicators to localStorage:', error);\n }\n }\n\n async loadIndicators(): Promise<IndicatorInstance[]> {\n try {\n const serialized = localStorage.getItem(this.storageKey);\n if (!serialized) {\n return [];\n }\n\n const parsed = JSON.parse(serialized);\n return Array.isArray(parsed) ? parsed : [];\n } catch (error) {\n console.error('Error loading indicators from localStorage:', error);\n return [];\n }\n }\n\n async deleteIndicator(id: string): Promise<void> {\n try {\n const indicators = await this.loadIndicators();\n const filtered = indicators.filter((ind) => ind.id !== id);\n await this.saveIndicators(filtered);\n } catch (error) {\n console.error('Error deleting indicator from localStorage:', error);\n }\n }\n}\n\nexport class NoOpPersistenceAdapter implements PersistenceAdapter {\n async saveIndicators(indicators: IndicatorInstance[]): Promise<void> {\n }\n\n async loadIndicators(): Promise<IndicatorInstance[]> {\n return [];\n }\n\n async deleteIndicator(id: string): Promise<void> {\n }\n}\n\nexport function createPersistenceAdapter(\n kind: 'noop' | 'localStorage'\n): PersistenceAdapter {\n switch (kind) {\n case 'localStorage':\n return new LocalStoragePersistenceAdapter();\n case 'noop':\n return new NoOpPersistenceAdapter();\n default:\n throw new Error('Unknown persistence kind: ' + kind);\n }\n}\n","import { OHLCVBar } from '../../types/chart';\n\nexport function padIndicatorArray(result: number[], barsLength: number): number[] {\n const missing = barsLength - result.length;\n if (missing <= 0) return result;\n return [...Array(missing).fill(NaN), ...result];\n}\n\nexport function displaceArray(arr: number[], offset: number): number[] {\n if (offset <= 0) return arr;\n return [...arr.slice(offset), ...Array(offset).fill(NaN)];\n}\n\nexport function calculateSMA(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period - 1) {\n result.push(NaN);\n } else {\n let sum = 0;\n for (let j = 0; j < period; j++) {\n sum += bars[i - j].close;\n }\n result.push(sum / period);\n }\n }\n\n return result;\n}\n\nexport function calculateEMA(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n const multiplier = 2 / (period + 1);\n\n let ema = 0;\n let hasStarted = false;\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period - 1) {\n result.push(NaN);\n } else if (i === period - 1) {\n let sum = 0;\n for (let j = 0; j < period; j++) {\n sum += bars[i - j].close;\n }\n ema = sum / period;\n result.push(ema);\n hasStarted = true;\n } else {\n ema = (bars[i].close - ema) * multiplier + ema;\n result.push(ema);\n }\n }\n\n return result;\n}\n\nexport function calculateRSI(bars: OHLCVBar[], period: number): number[] {\n const result: number[] = [];\n const changes: number[] = [];\n\n for (let i = 1; i < bars.length; i++) {\n changes.push(bars[i].close - bars[i - 1].close);\n }\n\n for (let i = 0; i < bars.length; i++) {\n if (i < period) {\n result.push(NaN);\n } else {\n let gains = 0;\n let losses = 0;\n\n for (let j = i - period; j < i; j++) {\n const change = changes[j - 1];\n if (change > 0) {\n gains += change;\n } else {\n losses += Math.abs(change);\n }\n }\n\n const avgGain = gains / period;\n const avgLoss = losses / period;\n\n if (avgLoss === 0) {\n result.push(100);\n } else {\n const rs = avgGain / avgLoss;\n const rsi = 100 - 100 / (1 + rs);\n result.push(rsi);\n }\n }\n }\n\n return result;\n}\n\nexport function calculateStandardDeviation(values: number[], period: number): number[] {\n const result: number[] = [];\n\n for (let i = 0; i < values.length; i++) {\n if (i < period - 1 || isNaN(values[i])) {\n result.push(NaN);\n } else {\n let sum = 0;\n let count = 0;\n\n for (let j = 0; j < period; j++) {\n const val = values[i - j];\n if (!isNaN(val)) {\n sum += val;\n count++;\n }\n }\n\n const mean = sum / count;\n let squaredDiffSum = 0;\n\n for (let j = 0; j < period; j++) {\n const val = values[i - j];\n if (!isNaN(val)) {\n squaredDiffSum += Math.pow(val - mean, 2);\n }\n }\n\n const variance = squaredDiffSum / count;\n result.push(Math.sqrt(variance));\n }\n }\n\n return result;\n}\n\nexport function calculateBollingerBands(\n bars: OHLCVBar[],\n period: number,\n stdDev: number\n): { upper: number[]; middle: number[]; lower: number[] } {\n const middle = calculateSMA(bars, period);\n const closes = bars.map((b) => b.close);\n const std = calculateStandardDeviation(closes, period);\n\n const upper: number[] = [];\n const lower: number[] = [];\n\n for (let i = 0; i < middle.length; i++) {\n if (isNaN(middle[i]) || isNaN(std[i])) {\n upper.push(NaN);\n lower.push(NaN);\n } else {\n upper.push(middle[i] + std[i] * stdDev);\n lower.push(middle[i] - std[i] * stdDev);\n }\n }\n\n return { upper, middle, lower };\n}\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateSMA } from '../utils/calculations';\n\nexport const SMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'sma',\n name: 'SMA',\n description: 'Simple Moving Average - smooths price data by averaging over a period',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to average',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the SMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the SMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const smaValues = calculateSMA(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: smaValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateEMA } from '../utils/calculations';\n\nexport const EMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'ema',\n name: 'EMA',\n description: 'Exponential Moving Average - gives more weight to recent prices',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 12,\n description: 'Number of bars for EMA calculation',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#10b981',\n description: 'Color of the EMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the EMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const emaValues = calculateEMA(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: emaValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateRSI } from '../utils/calculations';\n\nexport const RSIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'rsi',\n name: 'RSI',\n description: 'Relative Strength Index - momentum oscillator measuring speed and magnitude of price changes',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for RSI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#8b5cf6',\n description: 'Color of the RSI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the RSI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const rsiValues = calculateRSI(bars, settings.period);\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: rsiValues[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { calculateBollingerBands } from '../utils/calculations';\n\nexport const BollingerBandsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'bollinger',\n name: 'Bollinger Bands',\n description: 'Bollinger Bands - volatility bands placed above and below a moving average',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars for moving average',\n min: 2,\n max: 200,\n step: 1,\n },\n stdDev: {\n type: 'number',\n label: 'Standard Deviation',\n defaultValue: 2,\n description: 'Number of standard deviations for bands',\n min: 0.5,\n max: 5,\n step: 0.1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Band Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle band',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the band lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Show shaded area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the shaded area between bands',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const { upper, middle, lower } = calculateBollingerBands(\n bars,\n settings.period,\n settings.stdDev\n );\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: middle[i],\n upper: upper[i],\n lower: lower[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { OHLCVBar } from '../../types/chart';\n\ntype ResetPeriod = 'none' | 'daily' | 'weekly' | 'monthly';\n\nfunction calculateVWAPWithBands(\n bars: OHLCVBar[],\n {\n reset = 'none' as ResetPeriod,\n bandMultiplier = 1,\n includeBands = true,\n }: {\n reset?: ResetPeriod;\n bandMultiplier?: number;\n includeBands?: boolean;\n }\n) {\n if (!bars.length) return { vwap: [], upper: [], lower: [] };\n\n let cumulativeVolume = 0;\n let cumulativeTPV = 0;\n let sessionPrices: number[] = [];\n\n const vwap: number[] = [];\n const upper: number[] = [];\n const lower: number[] = [];\n\n const getWeek = (d: Date) => {\n const day = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));\n const dayNum = day.getUTCDay() || 7;\n day.setUTCDate(day.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(day.getUTCFullYear(), 0, 1));\n return Math.ceil(\n ((day.getTime() - yearStart.getTime()) / 86400000 + 1) / 7,\n );\n };\n\n const std = (arr: number[]) => {\n const mean = arr.reduce((a, b) => a + b, 0) / arr.length;\n return Math.sqrt(arr.reduce((a, b) => a + (b - mean) ** 2, 0) / arr.length);\n };\n\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i];\n const typical = (bar.high + bar.low + bar.close) / 3;\n\n if (i > 0 && reset !== 'none') {\n const prev = new Date(bars[i - 1].timestamp);\n const curr = new Date(bar.timestamp);\n let resetFlag = false;\n\n if (reset === 'daily') {\n resetFlag =\n curr.getDate() !== prev.getDate() ||\n curr.getMonth() !== prev.getMonth() ||\n curr.getFullYear() !== prev.getFullYear();\n } else if (reset === 'weekly') {\n resetFlag =\n getWeek(curr) !== getWeek(prev) ||\n curr.getFullYear() !== prev.getFullYear();\n } else if (reset === 'monthly') {\n resetFlag =\n curr.getMonth() !== prev.getMonth() ||\n curr.getFullYear() !== prev.getFullYear();\n }\n\n if (resetFlag) {\n cumulativeVolume = 0;\n cumulativeTPV = 0;\n sessionPrices = [];\n }\n }\n\n cumulativeTPV += typical * bar.volume;\n cumulativeVolume += bar.volume;\n sessionPrices.push(typical);\n\n const vwapValue = cumulativeTPV / cumulativeVolume;\n vwap.push(vwapValue);\n\n if (includeBands && sessionPrices.length > 1) {\n const sigma = std(sessionPrices);\n upper.push(vwapValue + sigma * bandMultiplier);\n lower.push(vwapValue - sigma * bandMultiplier);\n } else {\n upper.push(NaN);\n lower.push(NaN);\n }\n }\n\n return { vwap, upper, lower };\n}\n\nexport const VWAPIndicator: IndicatorDefinition = {\n metadata: {\n id: 'vwap',\n name: 'VWAP',\n description: 'Volume Weighted Average Price with standard deviation bands',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n reset: {\n type: 'select',\n label: 'Reset Period',\n defaultValue: 'daily',\n description: 'When to reset VWAP calculation',\n options: [\n { label: 'None', value: 'none' },\n { label: 'Daily', value: 'daily' },\n { label: 'Weekly', value: 'weekly' },\n { label: 'Monthly', value: 'monthly' },\n ],\n },\n bandMultiplier: {\n type: 'number',\n label: 'Band Multiplier',\n defaultValue: 1,\n description: 'Standard deviation multiplier for bands',\n min: 0.5,\n max: 5,\n step: 0.1,\n },\n showBands: {\n type: 'boolean',\n label: 'Show Bands',\n defaultValue: true,\n description: 'Show standard deviation bands',\n },\n vwapColor: {\n type: 'color',\n label: 'VWAP Color',\n defaultValue: '#f59e0b',\n description: 'Color of the VWAP line',\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Show shaded area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(245, 158, 11, 0.1)',\n description: 'Color of the shaded area between bands',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const { vwap, upper, lower } = calculateVWAPWithBands(bars, {\n reset: settings.reset as ResetPeriod,\n bandMultiplier: settings.bandMultiplier,\n includeBands: settings.showBands,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: vwap[i],\n upper: upper[i],\n lower: lower[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { stochastic } from 'fast-technical-indicators';\n\nexport const StochasticIndicator: IndicatorDefinition = {\n metadata: {\n id: 'stochastic',\n name: 'Stochastic Oscillator',\n description: 'Compares closing price to price range over time - momentum indicator',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period (K)',\n defaultValue: 14,\n description: 'Number of bars for %K calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n signalPeriod: {\n type: 'number',\n label: 'Signal Period (D)',\n defaultValue: 3,\n description: 'Number of bars for %D signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n kColor: {\n type: 'color',\n label: '%K Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the %K line',\n },\n dColor: {\n type: 'color',\n label: '%D Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the %D signal line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 2,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const stochValues = stochastic({\n high,\n low,\n close,\n period: settings.period,\n signalPeriod: settings.signalPeriod,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: stochValues[i]?.k ?? NaN,\n signal: stochValues[i]?.d ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { obv } from 'fast-technical-indicators';\n\nexport const OBVIndicator: IndicatorDefinition = {\n metadata: {\n id: 'obv',\n name: 'OBV',\n description: 'On-Balance Volume - cumulative volume indicator showing buying/selling pressure',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#10b981',\n description: 'Color of the OBV line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the OBV line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars) => {\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const obvValues = obv({ close, volume });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: obvValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { mfi } from 'fast-technical-indicators';\n\nexport const MFIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'mfi',\n name: 'MFI',\n description: 'Money Flow Index - volume-weighted momentum indicator (RSI with volume)',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for MFI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#f59e0b',\n description: 'Color of the MFI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the MFI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const mfiValues = mfi({\n high,\n low,\n close,\n volume,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: mfiValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { forceindex } from 'fast-technical-indicators';\n\nexport const ForceIndexIndicator: IndicatorDefinition = {\n metadata: {\n id: 'forceindex',\n name: 'Force Index',\n description: 'Measures buying/selling pressure using price and volume',\n category: IndicatorCategory.VOLUME,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 13,\n description: 'Smoothing period for force index',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#8b5cf6',\n description: 'Color of the Force Index line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the Force Index line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const close = bars.map(bar => bar.close);\n const volume = bars.map(bar => bar.volume || 0);\n\n const forceValues = forceindex({\n close,\n volume,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: forceValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { atr } from 'fast-technical-indicators';\n\nexport const ATRIndicator: IndicatorDefinition = {\n metadata: {\n id: 'atr',\n name: 'ATR',\n description: 'Average True Range - measures market volatility',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#14b8a6',\n description: 'Color of the ATR line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ATR line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const atrValues = atr({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: atrValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { adx } from 'fast-technical-indicators';\n\nexport const ADXIndicator: IndicatorDefinition = {\n metadata: {\n id: 'adx',\n name: 'ADX',\n description: 'Average Directional Index - measures trend strength (not direction)',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for ADX calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the ADX line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ADX line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const adxValues = adx({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: adxValues[i]?.adx ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { macd } from 'fast-technical-indicators';\n\nexport const MACDIndicator: IndicatorDefinition = {\n metadata: {\n id: 'macd',\n name: 'MACD',\n description: 'Moving Average Convergence Divergence - trend-following momentum indicator',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n fastPeriod: {\n type: 'number',\n label: 'Fast Period',\n defaultValue: 12,\n description: 'Period for fast EMA',\n min: 2,\n max: 100,\n step: 1,\n },\n slowPeriod: {\n type: 'number',\n label: 'Slow Period',\n defaultValue: 26,\n description: 'Period for slow EMA',\n min: 2,\n max: 100,\n step: 1,\n },\n signalPeriod: {\n type: 'number',\n label: 'Signal Period',\n defaultValue: 9,\n description: 'Period for signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n macdColor: {\n type: 'color',\n label: 'MACD Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the MACD line',\n },\n signalColor: {\n type: 'color',\n label: 'Signal Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the signal line',\n },\n histogramColor: {\n type: 'color',\n label: 'Histogram Color',\n defaultValue: '#10b981',\n description: 'Color of the histogram',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the MACD and signal lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const macdValues = macd({\n values,\n fastPeriod: settings.fastPeriod,\n slowPeriod: settings.slowPeriod,\n signalPeriod: settings.signalPeriod,\n SimpleMAOscillator: false,\n SimpleMASignal: false,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: macdValues[i]?.MACD ?? NaN,\n signal: macdValues[i]?.signal ?? NaN,\n histogram: macdValues[i]?.histogram ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { psar } from 'fast-technical-indicators';\n\nexport const PSARIndicator: IndicatorDefinition = {\n metadata: {\n id: 'psar',\n name: 'Parabolic SAR',\n description: 'Parabolic Stop and Reverse - shows potential reversal points as dots',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n step: {\n type: 'number',\n label: 'Step (AF)',\n defaultValue: 0.02,\n description: 'Acceleration Factor step',\n min: 0.001,\n max: 1,\n step: 0.001,\n },\n max: {\n type: 'number',\n label: 'Max AF',\n defaultValue: 0.2,\n description: 'Maximum Acceleration Factor',\n min: 0.01,\n max: 1,\n step: 0.01,\n },\n color: {\n type: 'color',\n label: 'Color',\n defaultValue: '#f59e0b',\n description: 'Color of the SAR dots',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const psarValues = psar({\n high,\n low,\n step: settings.step,\n max: settings.max,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: psarValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { cci } from 'fast-technical-indicators';\n\nexport const CCIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'cci',\n name: 'CCI',\n description: 'Commodity Channel Index - identifies cyclical trends and overbought/oversold levels',\n category: IndicatorCategory.OSCILLATORS,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars for CCI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#ec4899',\n description: 'Color of the CCI line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the CCI line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const cciValues = cci({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: cciValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { williamsr } from 'fast-technical-indicators';\n\nexport const WilliamsRIndicator: IndicatorDefinition = {\n metadata: {\n id: 'williamsr',\n name: 'Williams %R',\n description: 'Williams Percent Range - momentum indicator showing overbought/oversold levels',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 14,\n description: 'Number of bars for Williams %R calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#a855f7',\n description: 'Color of the Williams %R line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the Williams %R line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const williamsValues = williamsr({\n high,\n low,\n close,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: williamsValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { keltnerchannel } from 'fast-technical-indicators';\n\nexport const KeltnerChannelsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'keltner',\n name: 'Keltner Channels',\n description: 'Volatility-based channels using ATR - similar to Bollinger Bands',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Period for middle line (EMA)',\n min: 2,\n max: 200,\n step: 1,\n },\n atrPeriod: {\n type: 'number',\n label: 'ATR Period',\n defaultValue: 10,\n description: 'Period for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n atrMultiplier: {\n type: 'number',\n label: 'ATR Multiplier',\n defaultValue: 2,\n description: 'Multiplier for channel width',\n min: 0.1,\n max: 10,\n step: 0.1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle line',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the channel lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Fill area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the channel fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const keltnerValues = keltnerchannel({\n high,\n low,\n close,\n period: settings.period,\n atrPeriod: settings.atrPeriod,\n multiplier: settings.atrMultiplier,\n } as any);\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: keltnerValues[i]?.middle ?? NaN,\n upper: keltnerValues[i]?.upper ?? NaN,\n lower: keltnerValues[i]?.lower ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { supertrend } from 'fast-technical-indicators';\n\nexport const SuperTrendIndicator: IndicatorDefinition = {\n metadata: {\n id: 'supertrend',\n name: 'SuperTrend',\n description: 'Modern trend-following indicator with clear buy/sell signals',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 10,\n description: 'Period for ATR calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n multiplier: {\n type: 'number',\n label: 'Multiplier',\n defaultValue: 3,\n description: 'ATR multiplier for bands',\n min: 0.1,\n max: 10,\n step: 0.1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the SuperTrend line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the SuperTrend line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n const close = bars.map(bar => bar.close);\n\n const supertrendValues = supertrend({\n high,\n low,\n close,\n period: settings.period,\n multiplier: settings.multiplier,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: supertrendValues[i]?.supertrend ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { ichimokucloud } from 'fast-technical-indicators';\nimport { displaceArray } from '../utils/calculations';\n\nexport const IchimokuIndicator: IndicatorDefinition = {\n metadata: {\n id: 'ichimoku',\n name: 'Ichimoku Cloud',\n description: 'Comprehensive trend system with conversion, base, and span lines forming a cloud',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n conversionPeriod: {\n type: 'number',\n label: 'Conversion Period (Tenkan)',\n defaultValue: 9,\n description: 'Period for conversion line',\n min: 1,\n max: 100,\n step: 1,\n },\n basePeriod: {\n type: 'number',\n label: 'Base Period (Kijun)',\n defaultValue: 26,\n description: 'Period for base line',\n min: 1,\n max: 100,\n step: 1,\n },\n spanPeriod: {\n type: 'number',\n label: 'Span Period (Senkou)',\n defaultValue: 52,\n description: 'Period for span B',\n min: 1,\n max: 200,\n step: 1,\n },\n displacement: {\n type: 'number',\n label: 'Displacement',\n defaultValue: 26,\n description: 'Forward displacement for span lines',\n min: 0,\n max: 100,\n step: 1,\n },\n conversionColor: {\n type: 'color',\n label: 'Conversion Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the conversion line',\n },\n baseColor: {\n type: 'color',\n label: 'Base Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the base line',\n },\n spanAColor: {\n type: 'color',\n label: 'Span A Color',\n defaultValue: '#10b981',\n description: 'Color of span A (cloud edge)',\n },\n spanBColor: {\n type: 'color',\n label: 'Span B Color',\n defaultValue: '#f59e0b',\n description: 'Color of span B (cloud edge)',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showCloud: {\n type: 'boolean',\n label: 'Show Cloud',\n defaultValue: true,\n description: 'Fill area between span A and span B',\n },\n cloudColor: {\n type: 'color',\n label: 'Cloud Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the cloud fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 5,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'spanA',\n lower: 'spanB',\n },\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const ichimokuValues = ichimokucloud({\n high,\n low,\n conversionPeriod: settings.conversionPeriod,\n basePeriod: settings.basePeriod,\n spanPeriod: settings.spanPeriod,\n displacement: 0,\n });\n\n const conversion = bars.map((_, i) => ichimokuValues[i]?.conversion ?? NaN);\n const base = bars.map((_, i) => ichimokuValues[i]?.base ?? NaN);\n const spanA = bars.map((_, i) => ichimokuValues[i]?.spanA ?? NaN);\n const spanB = bars.map((_, i) => ichimokuValues[i]?.spanB ?? NaN);\n\n const displacedSpanA = displaceArray(spanA, settings.displacement);\n const displacedSpanB = displaceArray(spanB, settings.displacement);\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: conversion[i],\n base: base[i],\n spanA: displacedSpanA[i],\n spanB: displacedSpanB[i],\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { donchianchannels } from 'fast-technical-indicators';\n\nexport const DonchianChannelsIndicator: IndicatorDefinition = {\n metadata: {\n id: 'donchian',\n name: 'Donchian Channels',\n description: 'Highest high and lowest low over a period - classic breakout indicator',\n category: IndicatorCategory.VOLATILITY,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to look back',\n min: 2,\n max: 200,\n step: 1,\n },\n upperColor: {\n type: 'color',\n label: 'Upper Band Color',\n defaultValue: '#ef4444',\n description: 'Color of the upper band',\n },\n middleColor: {\n type: 'color',\n label: 'Middle Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the middle line',\n },\n lowerColor: {\n type: 'color',\n label: 'Lower Band Color',\n defaultValue: '#10b981',\n description: 'Color of the lower band',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the channel lines',\n min: 1,\n max: 5,\n step: 1,\n },\n showFill: {\n type: 'boolean',\n label: 'Show Fill',\n defaultValue: true,\n description: 'Fill area between bands',\n },\n fillColor: {\n type: 'color',\n label: 'Fill Color',\n defaultValue: 'rgba(59, 130, 246, 0.1)',\n description: 'Color of the channel fill',\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 3,\n overlay: true,\n hasBandFill: true,\n fillBands: {\n upper: 'upper',\n lower: 'lower',\n },\n },\n calculate: (bars, settings) => {\n const high = bars.map(bar => bar.high);\n const low = bars.map(bar => bar.low);\n\n const donchianValues = donchianchannels({\n high,\n low,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: donchianValues[i]?.middle ?? NaN,\n upper: donchianValues[i]?.upper ?? NaN,\n lower: donchianValues[i]?.lower ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { roc } from 'fast-technical-indicators';\n\nexport const ROCIndicator: IndicatorDefinition = {\n metadata: {\n id: 'roc',\n name: 'ROC',\n description: 'Rate of Change - measures percentage change in price over a period',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 12,\n description: 'Number of bars for ROC calculation',\n min: 1,\n max: 100,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#06b6d4',\n description: 'Color of the ROC line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the ROC line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const rocValues = roc({\n values,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: rocValues[i] ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { stochasticrsi } from 'fast-technical-indicators';\n\nexport const StochRSIIndicator: IndicatorDefinition = {\n metadata: {\n id: 'stochrsi',\n name: 'Stochastic RSI',\n description: 'Stochastic RSI - applies Stochastic oscillator to RSI values',\n category: IndicatorCategory.MOMENTUM,\n version: '1.0.0',\n },\n settings: {\n rsiPeriod: {\n type: 'number',\n label: 'RSI Period',\n defaultValue: 14,\n description: 'Period for RSI calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n stochPeriod: {\n type: 'number',\n label: 'Stochastic Period',\n defaultValue: 14,\n description: 'Period for Stochastic calculation',\n min: 2,\n max: 100,\n step: 1,\n },\n kPeriod: {\n type: 'number',\n label: '%K Period',\n defaultValue: 3,\n description: 'Smoothing period for %K',\n min: 1,\n max: 50,\n step: 1,\n },\n dPeriod: {\n type: 'number',\n label: '%D Period',\n defaultValue: 3,\n description: 'Smoothing period for %D signal line',\n min: 1,\n max: 50,\n step: 1,\n },\n kColor: {\n type: 'color',\n label: '%K Line Color',\n defaultValue: '#3b82f6',\n description: 'Color of the %K line',\n },\n dColor: {\n type: 'color',\n label: '%D Line Color',\n defaultValue: '#ef4444',\n description: 'Color of the %D signal line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the indicator lines',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 2,\n overlay: false,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const stochRSIValues = stochasticrsi({\n values,\n rsiPeriod: settings.rsiPeriod,\n stochasticPeriod: settings.stochPeriod,\n kPeriod: settings.kPeriod,\n dPeriod: settings.dPeriod,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: stochRSIValues[i]?.k ?? NaN,\n signal: stochRSIValues[i]?.d ?? NaN,\n }));\n },\n};\n","import {\n IndicatorDefinition,\n IndicatorCategory,\n ChartSeriesType,\n} from '../core/types';\nimport { wma } from 'fast-technical-indicators';\n\nexport const WMAIndicator: IndicatorDefinition = {\n metadata: {\n id: 'wma',\n name: 'WMA',\n description: 'Weighted Moving Average - gives more weight to recent prices',\n category: IndicatorCategory.TREND,\n version: '1.0.0',\n },\n settings: {\n period: {\n type: 'number',\n label: 'Period',\n defaultValue: 20,\n description: 'Number of bars to average',\n min: 1,\n max: 500,\n step: 1,\n },\n color: {\n type: 'color',\n label: 'Line Color',\n defaultValue: '#f59e0b',\n description: 'Color of the WMA line',\n },\n lineWidth: {\n type: 'number',\n label: 'Line Width',\n defaultValue: 2,\n description: 'Width of the WMA line',\n min: 1,\n max: 5,\n step: 1,\n },\n },\n renderConfig: {\n seriesType: ChartSeriesType.LINE,\n outputCount: 1,\n overlay: true,\n },\n calculate: (bars, settings) => {\n const values = bars.map(bar => bar.close);\n\n const wmaValues = wma({\n values,\n period: settings.period,\n });\n\n return bars.map((bar, i) => ({\n time: bar.timestamp / 1000,\n value: wmaValues[i] ?? NaN,\n }));\n },\n};\n","import { indicatorRegistry } from '../core/registry';\nimport { SMAIndicator } from './sma';\nimport { EMAIndicator } from './ema';\nimport { RSIIndicator } from './rsi';\nimport { BollingerBandsIndicator } from './bollinger';\nimport { VWAPIndicator } from './vwap';\nimport { StochasticIndicator } from './stochastic';\nimport { OBVIndicator } from './obv';\nimport { MFIIndicator } from './mfi';\nimport { ForceIndexIndicator } from './forceindex';\nimport { ATRIndicator } from './atr';\nimport { ADXIndicator } from './adx';\nimport { MACDIndicator } from './macd';\nimport { PSARIndicator } from './psar';\nimport { CCIIndicator } from './cci';\nimport { WilliamsRIndicator } from './williamsr';\nimport { KeltnerChannelsIndicator } from './keltner';\nimport { SuperTrendIndicator } from './supertrend';\nimport { IchimokuIndicator } from './ichimoku';\nimport { DonchianChannelsIndicator } from './donchian';\nimport { ROCIndicator } from './roc';\nimport { StochRSIIndicator } from './stochrsi';\nimport { WMAIndicator } from './wma';\n\nexport function registerBuiltInIndicators(): void {\n indicatorRegistry.register(SMAIndicator);\n indicatorRegistry.register(EMAIndicator);\n indicatorRegistry.register(RSIIndicator);\n indicatorRegistry.register(BollingerBandsIndicator);\n indicatorRegistry.register(VWAPIndicator);\n indicatorRegistry.register(StochasticIndicator);\n indicatorRegistry.register(OBVIndicator);\n indicatorRegistry.register(MFIIndicator);\n indicatorRegistry.register(ForceIndexIndicator);\n indicatorRegistry.register(ATRIndicator);\n indicatorRegistry.register(ADXIndicator);\n indicatorRegistry.register(MACDIndicator);\n indicatorRegistry.register(PSARIndicator);\n indicatorRegistry.register(CCIIndicator);\n indicatorRegistry.register(WilliamsRIndicator);\n indicatorRegistry.register(KeltnerChannelsIndicator);\n indicatorRegistry.register(SuperTrendIndicator);\n indicatorRegistry.register(IchimokuIndicator);\n indicatorRegistry.register(DonchianChannelsIndicator);\n indicatorRegistry.register(ROCIndicator);\n indicatorRegistry.register(StochRSIIndicator);\n indicatorRegistry.register(WMAIndicator);\n}\n\nexport {\n SMAIndicator,\n EMAIndicator,\n RSIIndicator,\n BollingerBandsIndicator,\n VWAPIndicator,\n StochasticIndicator,\n OBVIndicator,\n MFIIndicator,\n ForceIndexIndicator,\n ATRIndicator,\n ADXIndicator,\n MACDIndicator,\n PSARIndicator,\n CCIIndicator,\n WilliamsRIndicator,\n KeltnerChannelsIndicator,\n SuperTrendIndicator,\n IchimokuIndicator,\n DonchianChannelsIndicator,\n ROCIndicator,\n StochRSIIndicator,\n WMAIndicator,\n};\n","import { OHLCVBar } from '../types/chart';\nimport {\n BarDataAdapter,\n BarDataAdapterOptions,\n HistoricalDataParams,\n RealtimeHandlers,\n RealtimeSubscription,\n} from './types';\nimport { normalizeTimestamp, validateAndNormalizeBars } from '../utils/barUtils';\n\ninterface AlpacaBar {\n t: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n n?: number;\n vw?: number;\n}\n\ninterface AlpacaBarsResponse {\n bars: {\n [symbol: string]: AlpacaBar[];\n };\n next_page_token?: string;\n}\n\ninterface AlpacaTrade {\n T: string;\n S: string;\n p: number;\n s: number;\n t: string;\n}\n\ninterface AlpacaBar_WS {\n T: string;\n S: string;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n t: string;\n n?: number;\n vw?: number;\n}\n\nexport class AlpacaBarAdapter implements BarDataAdapter {\n private apiKey: string;\n private secretKey: string;\n private baseUrl: string;\n private wsUrl: string;\n private ws: WebSocket | null = null;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 5;\n private reconnectDelay = 1000;\n private currentHandlers: RealtimeHandlers | null = null;\n private currentSymbol: string | null = null;\n private authenticated = false;\n\n constructor(options: BarDataAdapterOptions) {\n if (!options.apiKey || !options.secretKey) {\n throw new Error('Alpaca API key and secret key are required');\n }\n\n this.apiKey = options.apiKey;\n this.secretKey = options.secretKey;\n this.baseUrl = options.baseUrl || 'https://data.alpaca.markets';\n this.wsUrl = options.wsUrl || 'wss://stream.data.alpaca.markets/v2/iex';\n }\n\n async fetchHistoricalBars(params: HistoricalDataParams): Promise<OHLCVBar[]> {\n const { symbol, timeframe, before, after, limit = 500 } = params;\n\n const url = new URL(`${this.baseUrl}/v2/stocks/${symbol}/bars`);\n url.searchParams.set('timeframe', timeframe);\n url.searchParams.set('limit', limit.toString());\n\n if (before) {\n const beforeDate = new Date(before).toISOString();\n url.searchParams.set('end', beforeDate);\n }\n\n if (after) {\n const afterDate = new Date(after).toISOString();\n url.searchParams.set('start', afterDate);\n }\n\n url.searchParams.set('feed', 'iex');\n\n const headers = {\n 'APCA-API-KEY-ID': this.apiKey,\n 'APCA-API-SECRET-KEY': this.secretKey,\n };\n\n try {\n const response = await fetch(url.toString(), { headers });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Alpaca API error: ${response.status} ${errorText}`);\n }\n\n const data: AlpacaBarsResponse = await response.json();\n const bars = data.bars[symbol] || [];\n\n return this.convertAlpacaBars(bars);\n } catch (error) {\n console.error('Failed to fetch Alpaca bars:', error);\n throw error;\n }\n }\n\n subscribeRealtime(symbol: string, handlers: RealtimeHandlers): RealtimeSubscription {\n this.currentSymbol = symbol;\n this.currentHandlers = handlers;\n\n this.connectWebSocket();\n\n return {\n unsubscribe: () => this.disconnect(),\n };\n }\n\n unsubscribeAll(): void {\n this.disconnect();\n }\n\n private connectWebSocket(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n console.log('WebSocket already connected');\n return;\n }\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n console.log('Alpaca WebSocket connected');\n this.authenticated = false;\n this.authenticate();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n console.error('Alpaca WebSocket error:', event);\n this.currentHandlers?.onError?.(new Error('WebSocket error'));\n };\n\n this.ws.onclose = () => {\n console.log('Alpaca WebSocket closed');\n this.authenticated = false;\n this.currentHandlers?.onDisconnect?.();\n this.attemptReconnect();\n };\n } catch (error) {\n console.error('Failed to create WebSocket:', error);\n this.currentHandlers?.onError?.(\n error instanceof Error ? error : new Error('Failed to create WebSocket')\n );\n }\n }\n\n private authenticate(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n const authMessage = {\n action: 'auth',\n key: this.apiKey,\n secret: this.secretKey,\n };\n\n this.ws.send(JSON.stringify(authMessage));\n }\n\n private subscribe(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN || !this.currentSymbol) return;\n\n const subscribeMessage = {\n action: 'subscribe',\n trades: [this.currentSymbol],\n bars: [this.currentSymbol],\n };\n\n this.ws.send(JSON.stringify(subscribeMessage));\n console.log(`Subscribed to ${this.currentSymbol}`);\n }\n\n private handleMessage(data: string): void {\n try {\n const messages = JSON.parse(data);\n\n if (!Array.isArray(messages)) {\n console.warn('Unexpected message format:', messages);\n return;\n }\n\n for (const message of messages) {\n if (message.T === 'success' && message.msg === 'authenticated') {\n console.log('Alpaca WebSocket authenticated');\n this.authenticated = true;\n this.reconnectAttempts = 0;\n this.currentHandlers?.onConnect?.();\n this.subscribe();\n } else if (message.T === 'error') {\n console.error('Alpaca error:', message.msg);\n this.currentHandlers?.onError?.(new Error(message.msg));\n } else if (message.T === 't') {\n this.handleTrade(message as AlpacaTrade);\n } else if (message.T === 'b') {\n this.handleBar(message as AlpacaBar_WS);\n } else if (message.T === 'subscription') {\n console.log('Subscription confirmed:', message);\n }\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n }\n\n private handleTrade(trade: AlpacaTrade): void {\n if (trade.S !== this.currentSymbol) return;\n\n this.currentHandlers?.onTrade?.(trade.p, trade.s);\n }\n\n private handleBar(bar: AlpacaBar_WS): void {\n if (bar.S !== this.currentSymbol) return;\n\n const ohlcvBar: OHLCVBar = {\n timestamp: new Date(bar.t).getTime(),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n trade_count: bar.n,\n vwap: bar.vw,\n };\n\n this.currentHandlers?.onBar?.(ohlcvBar);\n }\n\n private attemptReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error('Max reconnection attempts reached');\n this.currentHandlers?.onError?.(new Error('Max reconnection attempts reached'));\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(`Attempting to reconnect in ${delay}ms (attempt ${this.reconnectAttempts})`);\n\n setTimeout(() => {\n if (this.currentSymbol && this.currentHandlers) {\n this.connectWebSocket();\n }\n }, delay);\n }\n\n private disconnect(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.authenticated = false;\n this.currentSymbol = null;\n this.currentHandlers = null;\n this.reconnectAttempts = 0;\n }\n\n private convertAlpacaBars(bars: AlpacaBar[]): OHLCVBar[] {\n return bars.map(bar => ({\n timestamp: new Date(bar.t).getTime(),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n trade_count: bar.n,\n vwap: bar.vw,\n }));\n }\n}\n","import { OHLCVBar } from '../types/chart';\nimport {\n BarDataAdapter,\n HistoricalDataParams,\n RealtimeHandlers,\n RealtimeSubscription,\n} from './types';\n\nexport class MockAdapter implements BarDataAdapter {\n private intervalId: number | null = null;\n\n async fetchHistoricalBars(params: HistoricalDataParams): Promise<OHLCVBar[]> {\n const { limit = 100, before } = params;\n\n await new Promise(resolve => setTimeout(resolve, 800));\n\n const bars: OHLCVBar[] = [];\n const now = before || Date.now();\n let price = 100;\n\n for (let i = limit - 1; i >= 0; i--) {\n const timestamp = now - i * 300000;\n const change = (Math.random() - 0.5) * 2;\n price = Math.max(price + change, 1);\n\n const open = price;\n const close = price + (Math.random() - 0.5) * 1.5;\n const high = Math.max(open, close) + Math.random() * 0.5;\n const low = Math.min(open, close) - Math.random() * 0.5;\n\n bars.push({\n timestamp,\n open: Math.max(open, 0.01),\n high: Math.max(high, 0.01),\n low: Math.max(low, 0.01),\n close: Math.max(close, 0.01),\n volume: Math.floor(Math.random() * 10000) + 1000,\n });\n\n price = Math.max(close, 1);\n }\n\n console.log(`MockAdapter: Generated ${bars.length} bars (before: ${before})`);\n console.log('First bar:', bars[0]);\n console.log('Last bar:', bars[bars.length - 1]);\n\n return bars;\n }\n\n subscribeRealtime(symbol: string, handlers: RealtimeHandlers): RealtimeSubscription {\n handlers.onConnect?.();\n\n let lastPrice = 100;\n\n this.intervalId = window.setInterval(() => {\n const now = Date.now();\n const timestamp = Math.floor(now / 300000) * 300000;\n\n const change = (Math.random() - 0.5) * 2;\n lastPrice = Math.max(lastPrice + change, 1);\n\n const open = lastPrice;\n const close = lastPrice + (Math.random() - 0.5) * 1.5;\n const high = Math.max(open, close) + Math.random() * 0.5;\n const low = Math.min(open, close) - Math.random() * 0.5;\n\n const bar: OHLCVBar = {\n timestamp,\n open,\n high,\n low,\n close,\n volume: Math.floor(Math.random() * 10000) + 1000,\n };\n\n handlers.onBar?.(bar);\n lastPrice = close;\n }, 5000);\n\n return {\n unsubscribe: () => this.unsubscribeAll(),\n };\n }\n\n unsubscribeAll(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n}\n"]}
|