clintplay-react-native 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/android/src/main/java/digital/clint/clintplay/ClintplayRNModule.kt +1 -1
- package/dist/index.d.mts +154 -6
- package/dist/index.d.ts +154 -6
- package/dist/index.js +26 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +26 -12
- package/dist/index.mjs.map +1 -1
- package/ios/ClintplayRN.mm +6 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/buffer.ts","../src/session.ts","../src/transport.ts","../src/recorder.ts","../src/modules/network-interceptor.ts","../src/modules/console-interceptor.ts","../src/modules/offline-queue.ts","../src/runtime-bridge.ts","../src/native.ts","../package.json","../src/components/ClintplayMaskView.tsx","../src/components/ClintplayMaskTextInput.tsx","../src/components/ClintplayMaskImage.tsx","../src/components/ClintplayCaptureProvider.tsx","../src/hooks/useClintplayNavigation.ts","../src/components/ClintplayNavigationTracker.tsx","../src/index.ts"],"names":["state","init","React","ClintplayMaskView","ClintplayMaskTextInput","jsx","ClintplayMaskImage","View","trackScreen","useCallback","useRef","Fragment"],"mappings":";;;;;;;AAMO,IAAM,cAAN,MAAkB;AAAA,EAGvB,YAA6B,OAAA,EAAiB;AAAjB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAF7B,IAAA,IAAA,CAAQ,SAAwB,EAAC;AAAA,EAEc;AAAA,EAE/C,KAAK,KAAA,EAA0B;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AACtB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,OAAA;AACzC,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA,EAEA,KAAA,GAAuB;AACrB,IAAA,MAAM,MAAM,IAAA,CAAK,MAAA;AACjB,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACF,CAAA;;;AC9BA,SAAS,IAAA,GAAe;AACtB,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,eAAe,UAAA,EAAY;AAC5E,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC3B;AAKA,EAAA,OAAO,sCAAA,CAAuC,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM;AACpE,IAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,KAAM,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACtC,IAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACtB,CAAC,CAAA;AACH;AAEO,IAAM,eAAA,GAAkB,KAAK,EAAA,GAAK,GAAA;AASlC,IAAM,iBAAN,MAAqB;AAAA,EAI1B,WAAA,CAAY,GAAA,GAAoB,IAAA,CAAK,GAAA,EAAK;AACxC,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,MAAA,EAAO;AAAA,EAC3B;AAAA,EAEQ,MAAA,GAAuB;AAC7B,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI;AACpB,IAAA,OAAO,EAAE,WAAW,IAAA,EAAK,EAAG,WAAW,EAAA,EAAI,YAAA,EAAc,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAK;AAAA,EAC5E;AAAA,EAEA,OAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI;AAAA,EACrC;AAAA,EAEA,QAAQ,MAAA,EAAgC;AACtC,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AACxB,IAAA,IAAI,IAAA,KAAS,IAAA,KAAS,MAAA,KAAW,IAAA,IAAQ,SAAS,MAAA,CAAA,EAAS;AACzD,MAAA,MAAM,IAAA,GAAO,KAAK,MAAA,EAAO;AACzB,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,MAAM,MAAA,GAAS,MAAA;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,MAAM,YAAA,GAAe,eAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,IAAI,IAAA,CAAK,SAAQ,EAAG;AAClB,MAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,MAAA;AAC5B,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,MAAA,EAAO;AACzB,MAAA,IAAA,CAAK,MAAM,MAAA,GAAS,QAAA;AACpB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,MAAA,EAAO;AAAA,EAC3B;AACF,CAAA;;;AC/DA,IAAM,eAAA,GAAkB,CAAC,OAAA,KAAoB,GAAA,IAAO,OAAA,GAAU,CAAA,CAAA;AAI9D,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,cAAA,GAAiB,GAAA;AAEhB,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,GAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAuB;AAAA;AAAA;AAAA;AAAA,EAKpD,MAAM,aAAa,KAAA,EAA8C;AAC/D,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,UAAA,IAAc,GAAG,eAAe,CAAA;AACrE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,IAAa,GAAA;AACxC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,SAAA,IAAa,eAAA;AACzC,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,KACf,IAAA,CAAK,IAAI,UAAA,CAAW,OAAO,GAAG,cAAc,CAAA;AAE9C,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,QAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAC5D,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ;AAAA,YACjC,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,KAAK,OAAA,EAAQ;AAAA,YACtB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAAA,YAC1B,QAAQ,UAAA,CAAW;AAAA,WACpB,CAAA;AAAA,QACH,CAAA,SAAE;AACA,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AACA,QAAA,IAAI,GAAA,CAAI,IAAI,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,IAAI,MAAA,EAAO;AAClD,QAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,IAAO,GAAA,CAAI,SAAS,GAAA,EAAK;AACzC,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,GAAA,CAAI,MAAA,EAAQ,WAAW,KAAA,EAAM;AAAA,QAC3D;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAI,UAAU,UAAA,EAAY;AACxB,QAAA,MAAM,IAAI,OAAA,CAAc,CAAC,CAAA,KAAM,UAAA,CAAW,MAAM,CAAA,EAAE,EAAG,OAAA,CAAQ,OAAO,CAAC,CAAC,CAAA;AAAA,MACxE;AAAA,IACF;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,IAAA,EAAK;AAAA,EACtC;AAAA,EAEA,MAAM,KAAK,KAAA,EAAsC;AAC/C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACzC,IAAA,OAAO,GAAA,CAAI,EAAA;AAAA,EACb;AAAA,EAEQ,OAAA,GAAkC;AACxC,IAAA,MAAM,CAAA,GAA4B,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AACvE,IAAA,IAAI,IAAA,CAAK,IAAI,MAAA,EAAQ;AACnB,MAAA,CAAA,CAAE,aAAA,GAAgB,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,CAAA;AAC3C,MAAA,CAAA,CAAE,WAAW,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,MAAA;AAAA,IAC5B;AACA,IAAA,IAAI,IAAA,CAAK,IAAI,SAAA,EAAW;AACtB,MAAA,CAAA,CAAE,cAAc,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,SAAA;AAAA,IAC/B;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACF,CAAA;ACzDA,SAAS,YAAYA,MAAAA,EAA6D;AAChF,EAAA,IAAIA,MAAAA,KAAU,UAAU,OAAO,QAAA;AAC/B,EAAA,IAAIA,MAAAA,KAAU,cAAc,OAAO,YAAA;AACnC,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,cAAA,CAAe,OAAe,MAAA,EAA0C;AAC/E,EAAA,OAAO,KAAA,GAAQ,SAAS,WAAA,GAAc,UAAA;AACxC;AAQO,SAAS,eAAe,IAAA,EAA8B;AAC3D,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,cAAA,GAAwD,IAAA;AAE5D,EAAA,SAAS,qBAAA,GAA8B;AACrC,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,KAAK,oBAAA,EAAqB;AACtC,MAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACrC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC9B,MAAA,IAAI,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC3C,QAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,UACX,IAAA,EAAM,WAAA;AAAA,UACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,UACb,SAAS,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GAAW,QAAQ,OAAA,GAAU,CAAA;AAAA,UACjE,OAAO,OAAA,CAAQ;AAAA,SAChB,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,SAAS,mBAAA,GAA4B;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,CAAC,KAAK,oBAAA,EAAsB;AAC1D,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,qBAAA,EAAsB;AACtB,IAAA,MAAM,cAAc,IAAA,CAAK,mBAAA;AACzB,IAAA,MAAM,UAAA,GACJ,OAAO,WAAA,KAAgB,QAAA,IACvB,OAAO,QAAA,CAAS,WAAW,CAAA,IAC3B,WAAA,GAAc,CAAA,GACV,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,WAAW,CAAA,GACzB,GAAA;AACN,IAAA,cAAA,GAAiB,YAAY,MAAM;AACjC,MAAA,qBAAA,EAAsB;AAAA,IACxB,GAAG,UAAU,CAAA;AAAA,EACf;AAEA,EAAA,SAAS,kBAAA,GAA2B;AAClC,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,aAAA,CAAc,cAAc,CAAA;AAC5B,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,qBAAA;AAAA,IACA,KAAA,GAAQ;AACN,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AAEV,MAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAM,GAAI,UAAA,CAAW,IAAI,QAAQ,CAAA;AACxD,MAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,KAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA,EAAa,cAAA,CAAe,KAAA,EAAO,MAAM;AAAA,OAC1C,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,gBAAA,CAAiB,QAAA,EAAU,CAACA,MAAAA,KAAU;AACjE,QAAA,MAAM,MAAA,GAAS,YAAYA,MAAK,CAAA;AAChC,QAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,UACX,IAAA,EAAM,WAAA;AAAA,UACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,UACb,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,IAAI,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,oBAAA,EAAsB;AACtD,UAAA,IAAI,WAAW,QAAA,EAAU;AACvB,YAAA,mBAAA,EAAoB;AAAA,UACtB,CAAA,MAAO;AACL,YAAA,kBAAA,EAAmB;AAAA,UACrB;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,WAAA,CAAY,MAAA,EAAQ,CAAA;AAExC,MAAA,MAAM,SAAS,UAAA,CAAW,gBAAA,CAAiB,UAAU,CAAC,EAAE,QAAO,KAAM;AACnE,QAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,UACb,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,WAAA,EAAa,cAAA,CAAe,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM;AAAA,SACxD,CAAA;AAAA,MACH,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,CAAO,MAAA,EAAQ,CAAA;AAEnC,MAAA,IAAI,KAAK,mBAAA,EAAqB;AAC5B,QAAA,MAAM,CAAA,GAAI,UAAA;AACV,QAAA,MAAM,KAAK,CAAA,CAAE,UAAA;AACb,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,IAAI,aAAA,GAAgB,IAAA;AACpB,UAAA,MAAM,QAAA,GAAW,GAAG,gBAAA,EAAiB;AACrC,UAAA,MAAM,UAAA,GAAa,CAAC,KAAA,EAAc,OAAA,KAAsB;AACtD,YAAA,IAAI,aAAA,EAAe;AACjB,cAAA,IAAI;AACF,gBAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,kBACX,IAAA,EAAM,OAAA;AAAA,kBACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,kBACb,OAAA,EAAS,KAAA,EAAO,OAAA,IAAW,MAAA,CAAO,KAAK,CAAA;AAAA,kBACvC,OAAO,KAAA,EAAO,KAAA;AAAA,kBACd,MAAM,KAAA,EAAO,IAAA;AAAA,kBACb,KAAA,EAAO,CAAC,CAAC;AAAA,iBACV,CAAA;AAAA,cACH,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF;AAEA,YAAA,IAAI,QAAA,EAAU,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AAAA,UACvC,CAAA;AACA,UAAA,EAAA,CAAG,iBAAiB,UAAU,CAAA;AAC9B,UAAA,QAAA,CAAS,KAAK,MAAM;AAClB,YAAA,aAAA,GAAgB,KAAA;AAMhB,YAAA,IAAI,EAAA,CAAG,gBAAA,EAAiB,KAAM,UAAA,EAAY;AACxC,cAAA,EAAA,CAAG,iBAAiB,QAAe,CAAA;AAAA,YACrC;AAAA,UACF,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,oBAAA,EAAsB;AACtD,QAAA,IAAI,QAAA,CAAS,YAAA,KAAiB,QAAA,IAAY,CAAC,SAAS,YAAA,EAAc;AAChE,UAAA,mBAAA,EAAoB;AAAA,QACtB;AACA,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,kBAAA,EAAoB,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA;AAAA,IACA,IAAA,GAAO;AACL,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,kBAAA,EAAmB;AACnB,MAAA,KAAA,MAAW,EAAA,IAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG;AACnC,QAAA,IAAI;AACF,UAAA,EAAA,EAAG;AAAA,QACL,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;;;ACxLA,IAAM,cAAA,GAAiB,IAAA;AAEvB,IAAM,UAAA,GAAa,CAAC,GAAA,KAAwB;AAC1C,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,EAAA;AACpC,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AAC3B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAChC,IAAA,IAAI,aAAa,EAAA,EAAI;AACnB,MAAA,OAAO,GAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,QAAA,GAAW,CAAC,CAAC,CAAA,UAAA,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,iBAAA;AAAA,EACT;AAEA,EAAA,MAAM,sBAAsB,GAAA,CAAI,OAAA;AAAA,IAC9B,6CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,MAAA,CAAO,MAAM,CAAA;AAChD,EAAA,MAAM,UACJ,MAAA,KAAW,EAAA,GAAK,sBAAsB,mBAAA,CAAoB,SAAA,CAAU,GAAG,MAAM,CAAA;AAC/E,EAAA,OAAO,OAAA,CAAQ,SAAS,cAAA,GACpB,OAAA,CAAQ,MAAM,CAAA,EAAG,cAAc,IAAI,QAAA,GACnC,OAAA;AACN,CAAA;AAUA,IAAM,cAAA,uBAAqB,OAAA,EAA6B;AAMjD,IAAM,qBAAN,MAAyB;AAAA,EAgB9B,YAA6B,IAAA,EAA8B;AAA9B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAf7B,IAAA,IAAA,CAAQ,aAAA,GAAqC,IAAA;AAC7C,IAAA,IAAA,CAAQ,YAAA,GAAoC,IAAA;AAE5C,IAAA,IAAA,CAAQ,eAAA,GAAoD,IAAA;AAC5D,IAAA,IAAA,CAAQ,cAAA,GAAmD,IAAA;AAE3D,IAAA,IAAA,CAAQ,eAAA,GAAoD,IAAA;AAC5D,IAAA,IAAA,CAAQ,cAAA,GAAmD,IAAA;AAE3D,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,IAAA,IAAA,CAAQ,kBAAA,GAAqB,KAAA;AAE7B,IAAA,IAAA,CAAiB,YAAA,GAA8B,IAAA;AAC/C,IAAA,IAAA,CAAiB,UAAA,GAA4B,IAAA;AAG3C,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,WAAA,IAAe,UAAA;AACpC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAc,OAAO,GAAA,KAAQ,WAAA,GAAc,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AACxE,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,eAAe,MAAA,CAAO,MAAA;AAC3B,UAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACpD,UAAA,IAAA,CAAK,aAAa,SAAA,IAAa,GAAA;AAAA,QACjC;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAgB,GAAA,EAAsB;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GACJ,OAAO,GAAA,KAAQ,WAAA,GAAc,IAAI,GAAA,CAAI,GAAA,EAAK,kBAAkB,CAAA,GAAI,IAAA;AAClE,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,MAAA,CAAO,MAAA,KAAW,KAAK,YAAA,EAAc;AAC5D,UAAA,IAAI,IAAA,CAAK,UAAA,KAAe,GAAA,IAAO,CAAC,KAAK,UAAA,EAAY;AAC/C,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,MAAM,UAAU,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,GAAA;AACvD,UAAA,IACE,OAAA,KAAY,KAAK,UAAA,IACjB,OAAA,CAAQ,WAAW,IAAA,CAAK,UAAA,GAAa,GAAG,CAAA,EACxC;AACA,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,IAAI,qBAAqB,IAAA,CAAK,MAAA,CAAO,YAAY,MAAA,CAAO,IAAA,IAAQ,EAAE,CAAA,EAAG;AACnE,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AACT,IAAA,OAAO,oBAAA,CAAqB,KAAK,GAAG,CAAA;AAAA,EACtC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAGf,IAAA,IAAI,OAAO,UAAA,CAAW,KAAA,KAAU,UAAA,EAAY;AAC1C,MAAA,IAAI,UAAA,CAAW,KAAA,KAAU,IAAA,CAAK,YAAA,EAAc;AAC1C,QAAA,IAAA,CAAK,gBAAgB,UAAA,CAAW,KAAA;AAAA,MAClC;AACA,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,MAAM,OAAA,GAAU,OACd,KAAA,EACAC,KAAAA,KACsB;AACtB,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,KAAK,aAAA,EAAe;AACxC,UAAA,OAAA,CAAQ,IAAA,CAAK,aAAA,IAAiB,UAAA,CAAW,KAAA,EAAO,OAAsBA,KAAI,CAAA;AAAA,QAC5E;AAEA,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI;AAChC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACjC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAOA,KAAI,CAAA;AAC7C,QAAA,MAAM,gBAAgB,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAE/D,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,QAAA,IAAI,OAAA;AACJ,QAAA,IAAI;AACF,UAAA,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,KAAA,EAAsBA,KAAI,CAAA;AAAA,QACzD,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAAA,QAC5B;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,MAAM,MAAM,OAAA;AAClB,UAAA,IAAI,CAAC,aAAA,IAAiB,IAAA,CAAK,OAAA,EAAS;AAClC,YAAA,IAAI;AACF,cAAA,IAAA,CAAK,KAAK,OAAA,CAAQ;AAAA,gBAChB,IAAA,EAAM,SAAA;AAAA,gBACN,EAAA,EAAI,SAAA;AAAA,gBACJ,MAAA;AAAA,gBACA,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAAA,gBACtB,QAAQ,GAAA,CAAI,MAAA;AAAA,gBACZ,UAAA,EAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,GAAA,KAAQ,SAAS;AAAA,eACpD,CAAA;AAAA,YACH,CAAA,CAAA,MAAQ;AAAA,YAAC;AAAA,UACX;AACA,UAAA,OAAO,GAAA;AAAA,QACT,SAAS,GAAA,EAAK;AACZ,UAAA,IAAI,CAAC,aAAA,IAAiB,IAAA,CAAK,OAAA,EAAS;AAClC,YAAA,IAAI;AACF,cAAA,IAAA,CAAK,KAAK,OAAA,CAAQ;AAAA,gBAChB,IAAA,EAAM,SAAA;AAAA,gBACN,EAAA,EAAI,SAAA;AAAA,gBACJ,MAAA;AAAA,gBACA,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAAA,gBACtB,UAAA,EAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,GAAA,KAAQ,SAAS,CAAA;AAAA,gBACnD,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,eACvD,CAAA;AAAA,YACH,CAAA,CAAA,MAAQ;AAAA,YAAC;AAAA,UACX;AACA,UAAA,MAAM,GAAA;AAAA,QACR;AAAA,MACF,CAAA;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,MAAA,UAAA,CAAW,QAAQ,IAAA,CAAK,YAAA;AAAA,IAC1B;AAGA,IAAA,MAAM,CAAA,GAAI,UAAA;AACV,IAAA,IAAI,CAAA,CAAE,cAAA,IAAkB,CAAA,CAAE,cAAA,CAAe,SAAA,EAAW;AAClD,MAAA,MAAM,QAAA,GAAW,EAAE,cAAA,CAAe,SAAA;AAClC,MAAA,IAAI,QAAA,CAAS,IAAA,KAAS,IAAA,CAAK,cAAA,EAAgB;AACzC,QAAA,IAAA,CAAK,kBAAkB,QAAA,CAAS,IAAA;AAAA,MAClC;AACA,MAAA,IAAI,QAAA,CAAS,IAAA,KAAS,IAAA,CAAK,cAAA,EAAgB;AACzC,QAAA,IAAA,CAAK,kBAAkB,QAAA,CAAS,IAAA;AAAA,MAClC;AAEA,MAAA,MAAM,IAAA,GAAO,IAAA;AAEb,MAAA,MAAM,WAAA,GAAc,SAElB,MAAA,EACA,GAAA,EAAA,GACG,IAAA,EACH;AACA,QAAA,IAAI,KAAK,OAAA,EAAS;AAChB,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAU,CAAA;AACzC,YAAA,MAAM,mBACJ,OAAO,MAAA,KAAW,QAAA,GAAW,MAAA,CAAO,aAAY,GAAI,KAAA;AACtD,YAAA,MAAM,cAAc,IAAA,CAAK,kBAAA;AAEzB,YAAA,MAAM,IAAA,GAAoB;AAAA,cACxB,MAAA,EAAQ,gBAAA;AAAA,cACR,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,cACzB,MAAA,EAAQ,MAAA;AAAA,cACR,SAAA,EAAW,CAAA;AAAA,cACX;AAAA,aACF;AAEA,YAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,cAAA,cAAA,CAAe,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,YAC/B;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,UAAA,OAAO,IAAA,CAAK,gBAAgB,KAAA,CAAM,IAAA,EAAM,CAAC,MAAA,EAAQ,GAAA,EAAK,GAAG,IAAI,CAAC,CAAA;AAAA,QAChE;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,WAAA,GAAc,SAAqB,IAAA,EAAY;AACnD,QAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,IAAQ,OAAO,SAAS,QAAA,EAAU;AACpD,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,GAAgC,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AAC7D,YAAA,IACE,IAAA,IACA,CAAC,IAAA,CAAK,WAAA,IACN,CAAC,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,GAAG,CAAA,EAC7C;AAEA,cAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI;AAE/B,cAAA,IAAI,OAAA,GAAU,KAAA;AAEd,cAAA,MAAM,mBAAmB,MAAM;AAC7B,gBAAA,IAAI,OAAO,IAAA,CAAK,mBAAA,KAAwB,UAAA,EAAY;AAClD,kBAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,UAAU,CAAA;AAC3C,kBAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,WAAW,CAAA;AAC7C,kBAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,WAAW,CAAA;AAC7C,kBAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,gBACnD;AAAA,cACF,CAAA;AAEA,cAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAuB;AACvC,gBAAA,gBAAA,EAAiB;AACjB,gBAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,kBAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAAA,gBAC5B;AACA,gBAAA,IAAI,OAAA,IAAW,CAAC,IAAA,CAAK,OAAA,EAAS;AAC9B,gBAAA,OAAA,GAAU,IAAA;AACV,gBAAA,IAAI;AACF,kBAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,gBACzB,CAAA,CAAA,MAAQ;AAAA,gBAAC;AAAA,cACX,CAAA;AAEA,cAAA,MAAM,aAAa,MAAM;AACvB,gBAAA,QAAA,CAAS;AAAA,kBACP,IAAA,EAAM,SAAA;AAAA,kBACN,IAAI,IAAA,CAAK,SAAA;AAAA,kBACT,QAAQ,IAAA,CAAK,MAAA;AAAA,kBACb,KAAK,IAAA,CAAK,GAAA;AAAA,kBACV,QAAQ,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,KAAK,MAAA,GAAS,GAAA;AAAA,kBACxD,UAAA,EAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAS;AAAA,iBACzD,CAAA;AAAA,cACH,CAAA;AAEA,cAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAY;AAC/B,gBAAA,QAAA,CAAS;AAAA,kBACP,IAAA,EAAM,SAAA;AAAA,kBACN,IAAI,IAAA,CAAK,SAAA;AAAA,kBACT,QAAQ,IAAA,CAAK,MAAA;AAAA,kBACb,KAAK,IAAA,CAAK,GAAA;AAAA,kBACV,UAAA,EAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAS,CAAA;AAAA,kBACxD,KAAA,EAAQ,CAAA,IAAK,CAAA,CAAE,OAAA,IAAY;AAAA,iBAC5B,CAAA;AAAA,cACH,CAAA;AAEA,cAAA,MAAM,cAAc,MAAM;AACxB,gBAAA,QAAA,CAAS;AAAA,kBACP,IAAA,EAAM,SAAA;AAAA,kBACN,IAAI,IAAA,CAAK,SAAA;AAAA,kBACT,QAAQ,IAAA,CAAK,MAAA;AAAA,kBACb,KAAK,IAAA,CAAK,GAAA;AAAA,kBACV,UAAA,EAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAS,CAAA;AAAA,kBACxD,KAAA,EAAO;AAAA,iBACR,CAAA;AAAA,cACH,CAAA;AAEA,cAAA,MAAM,gBAAgB,MAAM;AAC1B,gBAAA,QAAA,CAAS;AAAA,kBACP,IAAA,EAAM,SAAA;AAAA,kBACN,IAAI,IAAA,CAAK,SAAA;AAAA,kBACT,QAAQ,IAAA,CAAK,MAAA;AAAA,kBACb,KAAK,IAAA,CAAK,GAAA;AAAA,kBACV,UAAA,EAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAS,CAAA;AAAA,kBACxD,KAAA,EAAO;AAAA,iBACR,CAAA;AAAA,cACH,CAAA;AAEA,cAAA,IAAI,OAAO,IAAA,CAAK,gBAAA,KAAqB,UAAA,EAAY;AAC/C,gBAAA,IAAA,CAAK,gBAAA,CAAiB,QAAQ,UAAU,CAAA;AACxC,gBAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAC1C,gBAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAC1C,gBAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAAA,cAChD;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,UAAA,OAAO,KAAK,eAAA,CAAgB,KAAA,CAAM,IAAA,EAAM,CAAC,IAAI,CAAC,CAAA;AAAA,QAChD;AAAA,MACF,CAAA;AAEA,MAAA,IAAA,CAAK,cAAA,GAAiB,WAAA;AACtB,MAAA,IAAA,CAAK,cAAA,GAAiB,WAAA;AAEtB,MAAA,QAAA,CAAS,IAAA,GAAO,WAAA;AAChB,MAAA,QAAA,CAAS,IAAA,GAAO,WAAA;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAEf,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,YAAA,EAAc;AAC3C,MAAA,IAAI,UAAA,CAAW,KAAA,KAAU,IAAA,CAAK,YAAA,EAAc;AAC1C,QAAA,UAAA,CAAW,QAAQ,IAAA,CAAK,aAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,UAAA;AACV,IAAA,IAAI,CAAA,CAAE,cAAA,IAAkB,CAAA,CAAE,cAAA,CAAe,SAAA,EAAW;AAClD,MAAA,MAAM,QAAA,GAAW,EAAE,cAAA,CAAe,SAAA;AAClC,MAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,QAAA,CAAS,IAAA,KAAS,KAAK,cAAA,EAAgB;AACjE,QAAA,QAAA,CAAS,OAAO,IAAA,CAAK,eAAA;AAAA,MACvB;AACA,MAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,QAAA,CAAS,IAAA,KAAS,KAAK,cAAA,EAAgB;AACjE,QAAA,QAAA,CAAS,OAAO,IAAA,CAAK,eAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,KAAA,EAAkC;AACnD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,IAAA,IAAI,OAAO,GAAA,KAAQ,WAAA,IAAe,iBAAiB,GAAA,EAAK,OAAO,MAAM,QAAA,EAAS;AAC9E,IAAA,IACE,KAAA,IACA,OAAO,KAAA,KAAU,QAAA,IACjB,SAAS,KAAA,IACT,OAAQ,KAAA,CAAc,GAAA,KAAQ,QAAA,EAC9B;AACA,MAAA,OAAQ,KAAA,CAAc,GAAA;AAAA,IACxB;AACA,IAAA,OAAO,MAAA,CAAO,SAAS,EAAE,CAAA;AAAA,EAC3B;AAAA,EAEQ,aAAA,CAAc,OAA0BA,KAAAA,EAA4B;AAC1E,IAAA,MAAM,WAAWA,KAAAA,EAAM,MAAA;AACvB,IAAA,IAAI,QAAA,EAAU,OAAO,QAAA,CAAS,WAAA,EAAY;AAC1C,IAAA,IACE,KAAA,IACA,OAAO,KAAA,KAAU,QAAA,IACjB,YAAY,KAAA,IACZ,OAAQ,KAAA,CAAc,MAAA,KAAW,QAAA,EACjC;AACA,MAAA,OAAQ,KAAA,CAAc,OAAO,WAAA,EAAY;AAAA,IAC3C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;;;AC1WA,IAAM,kBAAA,GAAqB,GAAA;AAMpB,IAAM,qBAAN,MAAyB;AAAA,EAa9B,YAA6B,IAAA,EAA8B;AAA9B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAZ7B,IAAA,IAAA,CAAiB,SAAA,uBAAgB,GAAA,EAG/B;AACF,IAAA,IAAA,CAAiB,OAAA,uBAAc,GAAA,EAG7B;AACF,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AAInB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,gBAAA,IAAoB,kBAAA;AAAA,EAC5C;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAEf,IAAA,MAAM,OAAA,GAA2B,IAAA,CAAK,IAAA,CAAK,iBAAA,GACvC,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA,GACvB,CAAC,MAAA,EAAQ,OAAO,CAAA;AAEpB,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,WAAW,MAAA,EAA6B;AAC9C,IAAA,MAAM,CAAA,GAAI,OAAA;AAIV,IAAA,MAAM,QAAA,GAAW,EAAE,MAAM,CAAA;AACzB,IAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AACpC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAEnC,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,KAAoB;AACxC,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,UAAA,EAAY;AACpC,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,KAAK,OAAA,CAAQ;AAAA,YAChB,IAAA,EAAM,KAAA;AAAA,YACN,EAAA,EAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI;AAAA,YAClB,KAAA,EAAO,MAAA,KAAW,KAAA,GAAQ,MAAA,GAAS,MAAA;AAAA,YACnC,OAAA,EAAS,IAAA,CAAK,aAAA,CAAc,IAAI;AAAA,WACjC,CAAA;AAAA,QACH,CAAA,CAAA,MAAQ;AAAA,QAER,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,QACpB;AAAA,MACF;AACA,MAAA,QAAA,CAAS,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,IAC9B,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,SAAS,CAAA;AAClC,IAAA,CAAA,CAAE,MAAM,CAAA,GAAI,SAAA;AAAA,EACd;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,MAAM,CAAA,GAAI,OAAA;AAIV,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,QAAQ,CAAA,IAAK,KAAK,SAAA,EAAW;AAG/C,MAAA,IAAI,EAAE,MAAM,CAAA,KAAM,KAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1C,QAAA,CAAA,CAAE,MAAM,CAAA,GAAI,QAAA;AAAA,MACd;AAAA,IACF;AACA,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA,EAEQ,cAAc,IAAA,EAAyB;AAC7C,IAAA,MAAM,IAAA,GAAO,IAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,IAAI,CAAA,KAAM,QAAW,OAAO,WAAA;AAC5B,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,OAAO,CAAC,CAAA;AAC1C,MAAA,IAAI,OAAO,CAAA,KAAM,SAAA,EAAW,OAAO,OAAO,CAAC,CAAA;AAC3C,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,EAAE,QAAA,EAAS;AAC7C,MAAA,IAAI,OAAO,MAAM,UAAA,EAAY;AAC3B,QAAA,OAAO,CAAA,CAAE,IAAA,GAAO,CAAA,WAAA,EAAc,CAAA,CAAE,IAAI,CAAA,CAAA,CAAA,GAAM,YAAA;AAAA,MAC5C;AACA,MAAA,IAAI,CAAA,YAAa,KAAA,EAAO,OAAO,CAAA,CAAE,KAAA,IAAS,GAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAA;AACjE,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AAC7B,QAAA,OAAO,IAAA,KAAS,KAAA,CAAA,GAAY,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA;AAAA,MAC7C,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,OAAO,CAAC,CAAA;AAAA,MACjB;AAAA,IACF,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AACX,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,SAAA,GACtB,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,GAAI,QAAA,GAChC,IAAA;AAAA,EACN;AACF,CAAA;;;AChGA,IAAM,iBAAA,GAAoB,IAAI,IAAA,GAAO,IAAA;AACrC,IAAM,cAAA,GAAiB,kBAAA;AAEhB,IAAM,eAAN,MAAmB;AAAA,EAWxB,YAA6B,IAAA,EAAwB;AAAxB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAV7B,IAAA,IAAA,CAAQ,YAAA,GAAe,CAAA;AAKvB;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,GAAA,GAAM,CAAA;AAGd,IAAA,IAAA,CAAQ,gBAAA,GAAyC,IAAA;AAG/C,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,SAAA,IAAa,cAAA;AAChC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,IAAY,iBAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CAAQ,QAAQ,KAAA,EAAsB;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AACA,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,oBAAoB,YAAY;AACnC,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI;AACF,UAAA,IAAA,GAAA,CAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,YAAW,EAAG,MAAA;AAAA,YAAO,CAAC,CAAA,KACpD,CAAA,CAAE,UAAA,CAAW,KAAK,MAAM;AAAA,WAC1B;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,YACR,CAAA,yCAAA,EAA4C,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,WACzD;AACA,UAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,QAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,UAAA,IAAI;AACF,YAAA,MAAM,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC7C,YAAA,IAAI,GAAA,WAAc,GAAA,CAAI,MAAA;AAAA,UACxB,SAAS,GAAA,EAAK;AACZ,YAAA,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,cACR,CAAA,8BAAA,EAAiC,CAAC,CAAA,SAAA,EAAY,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,aAC3D;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,MACtB,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAClB,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,QAAA,MAAM,GAAA;AAAA,MACR,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,KAAA,EAAmC;AAC/C,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,MAAM,IAAA,CAAK,gBAAA;AAAA,IACb;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACjC,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,IAAA,IAAI,KAAA,GAAQ,KAAK,QAAA,EAAU;AACzB,MAAA,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,QACR,CAAA,+BAAA,EAAkC,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,OAC5D;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,eAAe,KAAK,CAAA;AAI/B,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI,CAAE,UAAS,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA;AACjD,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,EAAA,EAAO,UAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACtD,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,EAAE,IAAI,MAAM,CAAA,CAAA;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,IAAI,CAAA;AACzC,MAAA,IAAA,CAAK,YAAA,IAAgB,KAAA;AAAA,IACvB,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,KAAK,KAAA,GAAQ,CAAA,8BAAA,EAAiC,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,MAAM,IAAA,CAAK,gBAAA;AAAA,IACb;AACA,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,YAAW,EAC9C,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,EACvC,IAAA,EAAK;AACR,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAC/C,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA;AACtC,UAAA;AAAA,QACF;AACA,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,KAAK,CAAA;AACzC,UAAA,MAAM,KAAK,OAAO,MAAA,KAAW,YAAY,MAAA,GAAS,CAAC,CAAC,MAAA,EAAQ,EAAA;AAC5D,UAAA,MAAM,iBACJ,OAAO,MAAA,KAAW,QAAA,IAClB,MAAA,KAAW,SACT,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,IACzB,OAAO,MAAA,IAAU,GAAA,IACjB,OAAO,MAAA,GAAS,GAAA,IAChB,OAAO,SAAA,KAAc,KAAA,CAAA;AAEzB,UAAA,IAAI,CAAC,EAAA,EAAI;AACP,YAAA,IAAI,cAAA,EAAgB;AAClB,cAAA,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,gBACR,uDAAuD,GAAG,CAAA;AAAA,eAC5D;AACA,cAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA;AACtC,cAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,YAAA,GAAe,IAAI,MAAM,CAAA;AAC9D,cAAA;AAAA,YACF;AACA,YAAA;AAAA,UACF;AACA,UAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA;AACtC,UAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,YAAA,GAAe,IAAI,MAAM,CAAA;AAC9D,UAAA,IAAA,EAAA;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,IAAA,CAAK,KAAK,KAAA,GAAQ,CAAA,8BAAA,EAAiC,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAChE,UAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA;AACtC,UAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,YAAA,GAAe,IAAI,MAAM,CAAA;AAAA,QAChE;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,KAAK,KAAA,GAAQ,CAAA,4BAAA,EAA+B,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAChE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,YAAW,EAAG,MAAA;AAAA,QAAO,CAAC,CAAA,KAC1D,CAAA,CAAE,UAAA,CAAW,KAAK,MAAM;AAAA,OAC1B;AACA,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAI,CAAA;AAAA,MAC1C;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,KAAK,KAAA,GAAQ,CAAA,4BAAA,EAA+B,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,WAAA,EAAoC;AAC/D,IAAA,IAAI,IAAA,CAAK,YAAA,GAAe,WAAA,IAAe,IAAA,CAAK,QAAA,EAAU;AACtD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,GAAe,WAAA,GAAc,IAAA,CAAK,QAAA;AAEtD,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAA,CAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,YAAW,EACxC,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,EACvC,IAAA,EAAK;AAAA,IACV,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,KAAK,KAAA,GAAQ,CAAA,yBAAA,EAA4B,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,SAAS,MAAA,EAAQ;AACrB,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,MAC3C,SAAS,GAAA,EAAK;AAKZ,QAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,cAAA,EAAiB,GAAG,YAAY,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAC/D,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,GAAA,IAAO,IAAA,EAAM,KAAA,IAAS,GAAA,CAAI,MAAA;AAC9B,MAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,IACnB;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,QAAQ,CAAA;AAC5C,MAAA,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,IAC3D,SAAS,GAAA,EAAK;AAIZ,MAAA,IAAA,CAAK,KAAK,KAAA,GAAQ,CAAA,0BAAA,EAA6B,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAC5D,MAAA,MAAM,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,IACzB;AAAA,EACF;AACF,CAAA;;;ACpOA,IAAI,IAAA,GAAoB,IAAA;AAEjB,SAAS,SAAS,IAAA,EAAyB;AAChD,EAAA,IAAA,GAAO,IAAA;AACT;AAEO,SAAS,KAAK,KAAA,EAA0B;AAC7C,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,KAAK,CAAA;AAAA,IACZ,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AACF;ACZA,IAAI,YAAA,GAA4B,IAAA;AAEzB,SAAS,mBAAA,GAAmC;AACjD,EAAA,IAAI,cAAc,OAAO,YAAA;AAEzB,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,GAAA,CAAU,aAAa,CAAA;AACzD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,YAAA,GAAe,KAAA;AACf,MAAA,OAAO,YAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAS,cAAc,WAAA,IAAoC,IAAA;AACjE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,YAAA,GAAe,KAAA;AACf,MAAA,OAAO,YAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAIA,EAAA,OAAO,IAAA;AACT;AAwBO,SAAS,oBAAA,GAAsC;AACpD,EAAA,MAAM,IAAI,mBAAA,EAAoB;AAC9B,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,oBAAA,EAAqB;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACvEE,IAAA,OAAA,GAAW,OAAA;ACQN,IAAM,iBAAA,GAAoB;AAM1B,IAAM,iBAAA,GAAoBC,MAAA,CAAM,UAAA,CAGrC,SAASC,kBAAAA,CACT,EAAE,QAAA,EAAU,MAAA,EAAQ,GAAG,IAAA,EAAK,EAC5B,GAAA,EACA;AACA,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,QAAQ,MAAA,IAAU,iBAAA;AAAA,MACjB,GAAG,IAAA;AAAA,MACJ,WAAA,EAAa,KAAA;AAAA,MACb,QAAA,EAAU,iBAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ,CAAC;ACjBM,IAAM,sBAAA,GAAyBD,MAAAA,CAAM,UAAA,CAG1C,SAASE,uBAAAA,CAAuB,EAAE,MAAA,EAAQ,kBAAA,EAAoB,GAAG,KAAA,EAAM,EAAG,GAAA,EAAK;AAM/E,EAAA,uBACEC,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,QAAQ,MAAA,IAAU,iBAAA;AAAA,MAClB,kBAAA;AAAA,MACC,GAAG,KAAA;AAAA,MACJ,QAAA,EAAU;AAAA;AAAA,GACZ;AAEJ,CAAC;ACnBM,IAAM,kBAAA,GAAqBH,MAAAA,CAAM,UAAA,CAGtC,SAASI,mBAAAA,CAAmB,EAAE,MAAA,EAAQ,kBAAA,EAAoB,GAAG,KAAA,EAAM,EAAG,GAAA,EAAK;AAM3E,EAAA,uBACED,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,QAAQ,MAAA,IAAU,iBAAA;AAAA,MAClB,kBAAA;AAAA,MACC,GAAG,KAAA;AAAA,MACJ,QAAA,EAAU;AAAA;AAAA,GACZ;AAEJ,CAAC;ACIM,SAAS,wBAAA,CAAyB;AAAA,EACvC,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,YAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAkC;AAChC,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAAC,CAAA,KAA6B;AAC5B,MAAA,MAAM,cAAc,CAAA,EAAG,WAAA;AACvB,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,EAAE,SAAA,GAAY,CAAA,EAAG,YAAY,CAAA,EAAG,KAAA,EAAO,OAAM,GAAI,WAAA;AACvD,MAAA,IAAA,CAAK;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,CAAA,EAAG,SAAA;AAAA,QACH,CAAA,EAAG,SAAA;AAAA,QACH,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,YAAA,GAAe,CAAC,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,KAAA,GAAQ,WAAA;AAAA,IACZ,CAAC,CAAA,KAA6B;AAC5B,MAAA,MAAM,cAAc,CAAA,EAAG,WAAA;AACvB,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,EAAE,SAAA,GAAY,CAAA,EAAG,YAAY,CAAA,EAAG,KAAA,EAAO,OAAM,GAAI,WAAA;AACvD,MAAA,IAAA,CAAK;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,CAAA,EAAG,SAAA;AAAA,QACH,CAAA,EAAG,SAAA;AAAA,QACH,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,UAAA,GAAa,CAAC,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,CAAA,KAA6B;AAC5B,MAAA,MAAM,cAAc,CAAA,EAAG,WAAA;AACvB,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,EAAE,SAAA,GAAY,CAAA,EAAG,YAAY,CAAA,EAAG,KAAA,EAAO,OAAM,GAAI,WAAA;AACvD,MAAA,IAAA,CAAK;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,CAAA,EAAG,SAAA;AAAA,QACH,CAAA,EAAG,SAAA;AAAA,QACH,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,aAAA,GAAgB,CAAC,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS,uBAAOA,GAAAA,CAAA,YAAG,QAAA,EAAS,CAAA;AAEjC,EAAA,uBACEA,GAAAA;AAAA,IAACE,IAAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,OAAO,CAAC,EAAE,IAAA,EAAM,CAAA,IAAK,KAAK,CAAA;AAAA,MAC1B,YAAA,EAAc,OAAA;AAAA,MACd,UAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAe,QAAA;AAAA,MAEd;AAAA;AAAA,GACH;AAEJ;AC1FA,IAAI,sBAAA,GAA6C,MAAA;AAK1C,SAAS,sBAAA,GAA+B;AAC7C,EAAA,sBAAA,GAAyB,MAAA;AAC3B;AAmBO,SAAS,8BAAA,CACd,iBACA,OAAA,EAC8B;AAC9B,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,EAAA,MAAMC,YAAAA,GAAcC,WAAAA,CAAY,CAAC,EAAA,EAAY,IAAA,KAAkB;AAC7D,IAAA,MAAM,OAAA,GAAU,cAAc,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,sBAAA,EAAwB;AAEpD,IAAA,MAAM,SAAA,GAAY,cAAc,IAAI,CAAA;AACpC,IAAA,MAAM,WAAA,GAAc,aAAA,CAAc,UAAA,CAAW,OAAA,EAAS,IAAI,CAAA;AAI1D,IAAA,MAAM,gBACJ,SAAA,IACA,sBAAA,KACC,WAAA,IAAe,WAAA,KAAgB,UAAU,WAAA,GAAc,MAAA,CAAA;AAE1D,IAAA,sBAAA,GAAyB,OAAA;AAEzB,IAAA,IAAA,CAAK;AAAA,MACH,IAAA,EAAM,YAAA;AAAA,MACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,MACb,EAAA,EAAI,OAAA;AAAA,MACJ,GAAI,aAAA,GAAgB,EAAE,IAAA,EAAM,aAAA,KAAkB;AAAC,KAChD,CAAA;AAED,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,OAAA,EAAS,cAAA,GAAiB,OAAA,EAAS,aAAa,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,cAAc,eAAe,CAAA;AAC3C,IAAA,IAAI,KAAA,IAAS,UAAU,sBAAA,EAAwB;AAC7C,MAAAD,aAAY,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiBA,YAAW,CAAC,CAAA;AAEjC,EAAA,MAAM,iBAAA,GAAoBC,WAAAA;AAAA,IACxB,CAACT,MAAAA,KAAmB;AAClB,MAAA,MAAM,SAAA,GAAY,mBAAmBA,MAAK,CAAA;AAC1C,MAAA,IAAI,SAAA,EAAW;AACb,QAAAQ,aAAY,SAAS,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAACA,YAAW;AAAA,GACd;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,iBAAA,EAAmB;AAAA,IAC9C,aAAA,EAAe,iBAAA;AAAA,IACf,WAAA,EAAAA;AAAA,GACD,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AC1EO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,MAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,MAAM,EAAE,CAAC,CAAA;AACnC,EAAA,OAAO,KAAA,IAAS,MAAA;AAClB;AAKO,SAAS,kBAAA,CAAmBR,MAAAA,EAAgB,KAAA,GAAQ,CAAA,EAAuB;AAChF,EAAA,IAAI,KAAA,GAAQ,IAAI,OAAO,MAAA;AAEvB,EAAA,IAAI,CAACA,MAAAA,IAAS,OAAOA,MAAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAIA,MAAAA;AACV,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,IAAK,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACrD,IAAA,IAAI,OAAQ,CAAA,CAAU,IAAA,KAAS,QAAA,EAAU;AACvC,MAAA,OAAQ,CAAA,CAAU,IAAA;AAAA,IACpB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QACJ,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,EAAE,KAAA,IAAS,CAAA,IAAK,CAAA,CAAE,KAAA,GAAQ,EAAE,MAAA,CAAO,MAAA,GAC9D,EAAE,KAAA,GACF,CAAA,CAAE,OAAO,MAAA,GAAS,CAAA;AAExB,EAAA,MAAM,YAAA,GAAe,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACnC,EAAA,IAAI,CAAC,cAAc,OAAO,MAAA;AAE1B,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,IAAI,KAAA,IAAS,IAAI,OAAO,MAAA;AACxB,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,YAAA,CAAa,KAAA,EAAO,QAAQ,CAAC,CAAA;AACnE,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,MAAM,aAAa,YAAA,CAAa,KAAA;AAChC,IAAA,IACE,UAAA,IACA,OAAO,UAAA,KAAe,QAAA,KACrB,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,IAAK,UAAA,CAAW,MAAA,CAAO,WAAW,CAAA,CAAA,EACnE;AACA,MAAA,OAAO,YAAA,CAAa,IAAA;AAAA,IACtB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,YAAA,CAAa,IAAA;AACtB;AAOO,SAAS,uCACd,OAAA,EAC0B;AAC1B,EAAA,MAAM,IAAA,GACJ,OAAO,OAAA,KAAY,UAAA,GAAa,EAAE,cAAA,EAAgB,OAAA,EAAQ,GAAI,OAAA,IAAW,EAAC;AAE5E,EAAA,IAAI,YAAA,GAAmC,MAAA;AACvC,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,IAAA,CAAK,gBAAgB,CAAA;AACxD,EAAA,IAAI,OAAA,GAAU,IAAA;AAEd,EAAA,OAAO,SAAS,cAAcA,MAAAA,EAAgB;AAC5C,IAAA,MAAM,QAAA,GAAW,mBAAmBA,MAAK,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,cAAc,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,MAAM,IAAA,GAAO,YAAA,IAAgB,YAAA,KAAiB,SAAA,GAAY,YAAA,GAAe,MAAA;AACzE,MAAA,YAAA,GAAe,SAAA;AAEf,MAAA,IAAA,CAAK;AAAA,QACH,IAAA,EAAM,YAAA;AAAA,QACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,EAAA,EAAI,SAAA;AAAA,QACJ,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS;AAAC,OACxB,CAAA;AAED,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,IAAI,CAAA;AAAA,MACvC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAc,YAAA,EAAc;AAEhC,IAAA,MAAM,aAAA,GAAgB,YAAA;AACtB,IAAA,YAAA,GAAe,SAAA;AAEf,IAAA,IAAA,CAAK;AAAA,MACH,IAAA,EAAM,YAAA;AAAA,MACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,MACb,EAAA,EAAI,SAAA;AAAA,MACJ,GAAI,aAAA,GAAgB,EAAE,IAAA,EAAM,aAAA,KAAkB;AAAC,KAChD,CAAA;AAED,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,aAAa,CAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AACF;AAiBO,SAAS,0BAAA,CAA2B;AAAA,EACzC,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,QAAA,GAAW,+BAA+B,QAAA,EAAU;AAAA,IACxD,IAAA,EAAM,gBAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoBS,WAAAA;AAAA,IACxB,CAACT,MAAAA,KAAmB;AAClB,MAAA,QAAA,CAAS,cAAcA,MAAK,CAAA;AAC5B,MAAA,IAAI;AACF,QAAA,aAAA,GAAgBA,MAAK,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAU,aAAa;AAAA,GAC1B;AAEA,EAAA,MAAM,qBAAA,GAAwBU,OAA+C,MAAS,CAAA;AAEtF,EAAA,MAAM,mBAAA,GAAsBD,WAAAA;AAAA,IAC1B,CAACT,MAAAA,KAAmB;AAClB,MAAA,iBAAA,CAAkBA,MAAK,CAAA;AACvB,MAAA,IAAI;AACF,QAAA,qBAAA,CAAsB,UAAUA,MAAK,CAAA;AAAA,MACvC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAEA,EAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,IAAA,uBAAOK,IAAAM,QAAAA,EAAA,EAAG,mBAAS,EAAE,aAAA,EAAe,iBAAA,EAAmB,CAAA,EAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAIT,MAAAA,CAAM,cAAA,CAAe,QAAQ,CAAA,EAAG;AAClC,IAAA,qBAAA,CAAsB,OAAA,GAAW,SAAS,KAAA,EAAe,aAAA;AACzD,IAAA,OAAOA,MAAAA,CAAM,aAAa,QAAA,EAAqC;AAAA,MAC7D,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAM,QAAA,IAAYA,OAAM,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,GAAI,CAAA,EAAI;AAC/E,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAAA,MAAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,CAAC,KAAA,KAAU;AAC1C,MAAA,IAAIA,MAAAA,CAAM,cAAA,CAAe,KAAK,CAAA,EAAG;AAC/B,QAAA,IAAI,oBAAoB,EAAA,EAAI;AAC1B,UAAA,eAAA,GAAkB,SAAA;AAAA,QACpB;AACA,QAAA,IACE,OAAQ,KAAA,CAAM,KAAA,EAAe,aAAA,KAAkB,UAAA,IAC/C,gBAAgB,EAAA,EAChB;AACA,UAAA,WAAA,GAAc,SAAA;AAAA,QAChB;AAAA,MACF;AACA,MAAA,SAAA,EAAA;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,WAAA,KAAgB,EAAA,GAAK,WAAA,GAAc,eAAA;AACvD,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,MAAM,iBAAiBA,MAAAA,CAAM,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,CAAC,KAAA,KAAU;AAC7D,MAAA,MAAM,UAAA,GAAa,QAAA,EAAA;AACnB,MAAA,IAAI,CAACA,MAAAA,CAAM,cAAA,CAAe,KAAK,GAAG,OAAO,KAAA;AAEzC,MAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,QAAA,qBAAA,CAAsB,OAAA,GAAW,MAAM,KAAA,EAAe,aAAA;AACtD,QAAA,OAAOA,MAAAA,CAAM,aAAa,KAAA,EAAkC;AAAA,UAC1D,aAAA,EAAe;AAAA,SAChB,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,uBAAOG,GAAAA,CAAAM,QAAAA,EAAA,EAAG,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,EAC3B;AAEA,EAAA,uBAAON,GAAAA,CAAAM,QAAAA,EAAA,EAAG,sBAAY,IAAA,EAAK,CAAA;AAC7B;;;ACvOO,IAAM,WAAA,GAAc;AA4B3B,IAAI,KAAA,GAA6B,IAAA;AAEjC,SAAS,UAAA,GAAyB;AAChC,EAAA,MAAM,KAAK,QAAA,CAAS,EAAA;AACpB,EAAA,MAAM,WACJ,EAAA,KAAO,KAAA,GAAQ,KAAA,GAAQ,EAAA,KAAO,YAAY,SAAA,GAAY,KAAA;AACxD,EAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,OAAO,QAAA,CAAS,OAAA,IAAW,EAAE,CAAA,EAAE;AAC/D;AAEA,SAAS,QAAA,CAAS,QAAwB,IAAA,EAAuB;AAC/D,EAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AAChB,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AACjD,IAAA,OAAA,CAAQ,GAAA,CAAI,gBAAA,EAAkB,GAAG,IAAI,CAAA;AAAA,EACvC;AACF;AAEO,SAAS,mBAAA,CACd,OACA,gBAAA,EACc;AACd,EAAA,MAAM,EAAA,GAAK,KAAA;AACX,EAAA,MAAM,SAAA,GACJ,OAAO,EAAA,CAAG,SAAA,KAAc,WACpB,EAAA,CAAG,SAAA,GACH,OAAO,EAAA,CAAG,EAAA,KAAO,QAAA,GACf,EAAA,CAAG,EAAA,GACH,KAAK,GAAA,EAAI;AACjB,EAAA,MAAM,SAAA,GAAY,GAAG,SAAA,IAAa,gBAAA;AAClC,EAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAEhB,EAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAW;AACzB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAM,EAAA,CAAG;AAAA,KACX;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,GAAG,IAAA,EAAK,GAAI,EAAA;AACvE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACR;AACF;AAEA,eAAe,UAAU,CAAA,EAAgC;AACvD,EAAA,IAAI;AACF,IAAA,IAAI,CAAA,CAAE,MAAA,CAAO,IAAA,EAAK,KAAM,CAAA,EAAG;AAC3B,IAAA,MAAM,gBAAA,GAAmB,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAQ,CAAE,SAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM;AACjC,IAAA,MAAM,SAAyB,SAAA,CAAU,GAAA;AAAA,MAAI,CAAC,CAAA,KAC5C,mBAAA,CAAoB,CAAA,EAAG,gBAAgB;AAAA,KACzC;AACA,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,SAAA,EAAW,EAAE,MAAA,CAAO,SAAA;AAAA,MACpB,SAAA,EAAW,gBAAA;AAAA,MACX,UAAA,EAAY,WAAA;AAAA,MACZ,MAAA;AAAA,MACA,MAAA,EAAQ,KAAK,GAAA,EAAI;AAAA,MACjB,GAAI,CAAA,CAAE,MAAA,CAAO,MAAA,GAAS,EAAE,QAAQ,CAAA,CAAE,MAAA,CAAO,MAAA,EAAO,GAAI;AAAC,KACvD;AACA,IAAA,MAAM,EAAA,GAAK,MAAM,CAAA,CAAE,SAAA,CAAU,KAAK,KAAK,CAAA;AACvC,IAAA,IAAI,CAAC,EAAA,IAAM,CAAA,CAAE,YAAA,EAAc;AAIzB,MAAA,MAAM,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,IACpC;AACA,IAAA,QAAA,CAAS,EAAE,MAAA,EAAQ,EAAA,GAAK,SAAA,GAAY,cAAA,EAAgB,OAAO,MAAM,CAAA;AAAA,EACnE,SAAS,GAAA,EAAK;AACZ,IAAA,QAAA,CAAS,CAAA,CAAE,MAAA,EAAQ,yBAAA,EAA2B,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EAC3D;AACF;AAEA,SAAS,KAAK,SAAA,EAA6C;AACzD,EAAA,IAAI,OAAO,MAAA,EAAQ;AACnB,EAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACvB,EAAA,IAAI,SAAA,CAAU,YAAY,KAAA,EAAO;AAEjC,EAAA,MAAM,UAAA,GAAa,UAAU,UAAA,IAAc,CAAA;AAC3C,EAAA,IAAI,UAAA,GAAa,CAAA,IAAO,IAAA,CAAK,MAAA,KAAW,UAAA,EAAY;AAEpD,EAAA,MAAM,MAAA,GAAyB;AAAA,IAC7B,QAAQ,SAAA,CAAU,MAAA;AAAA,IAClB,QAAQ,SAAA,CAAU,MAAA;AAAA,IAClB,SAAA,EAAW,SAAA,CAAU,SAAA,IAAa,SAAA,CAAU,MAAA,IAAU,EAAA;AAAA,IACtD,QAAQ,SAAA,CAAU,MAAA;AAAA,IAClB,eAAA,EAAiB,UAAU,eAAA,IAAmB,GAAA;AAAA,IAC9C,SAAA,EAAW,UAAU,SAAA,IAAa,EAAA;AAAA,IAClC,aAAA,EAAe,UAAU,aAAA,IAAiB,GAAA;AAAA,IAC1C,KAAA,EAAO,UAAU,KAAA,IAAS,KAAA;AAAA,IAC1B,gBAAA,EAAkB,UAAU,gBAAA,IAAoB;AAAA,GAClD;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,MAAA,CAAO,aAAa,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,IAAI,cAAA,EAAe;AACnC,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,IAC9B,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,WAAW,MAAA,CAAO;AAAA,GACnB,CAAA;AAED,EAAA,MAAM,WAAW,IAAI,GAAA,CAAe,SAAA,CAAU,iBAAA,IAAqB,EAAE,CAAA;AAIrE,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA,EAAU,EAAE,KAAA,EAAO,MAAM;AAAA,IAAC,CAAA,EAAG,MAAM,MAAM;AAAA,IAAC,CAAA,EAAG,uBAAuB,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,IAC7E,kBAAA,EAAoB,IAAA;AAAA,IACpB,kBAAA,EAAoB,IAAA;AAAA,IACpB,YAAA,EAAc,SAAA,CAAU,YAAA,GACpB,IAAI,YAAA,CAAa;AAAA,MACf,SAAS,SAAA,CAAU,YAAA;AAAA,MACnB,IAAA,EAAM,CAAC,CAAA,KAAM,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,MACrC,KAAA,EAAO,CAAC,GAAA,KAAQ,QAAA,CAAS,QAAQ,GAAG;AAAA,KACrC,CAAA,GACD,IAAA;AAAA,IACJ,UAAA,EAAY,IAAA;AAAA,IACZ,QAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AAOA,EAAA,KAAA,GAAQ,KAAA;AAER,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAuB;AACtC,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAC9B,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,KAAA,EAAM;AACd,IAAA,IAAI,MAAA,CAAO,IAAA,EAAK,IAAK,MAAA,CAAO,SAAA,EAAW;AACrC,MAAA,KAAK,UAAU,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAW,cAAA,CAAe;AAAA,IAC9B,OAAA;AAAA,IACA,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,mBAAA,EAAqB,IAAA;AAAA,IACrB,kBAAkB,SAAA,CAAU,gBAAA;AAAA,IAC5B,qBAAqB,SAAA,CAAU,mBAAA;AAAA,IAC/B;AAAA,GACD,CAAA;AACD,EAAA,KAAA,CAAM,QAAA,GAAW,QAAA;AAKjB,EAAA,IAAI,SAAA,CAAU,mBAAmB,KAAA,EAAO;AACtC,IAAA,KAAA,CAAM,kBAAA,GAAqB,IAAI,kBAAA,CAAmB;AAAA,MAChD,OAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,aAAa,SAAA,CAAU,WAAA;AAAA,MACvB,QAAQ,MAAA,CAAO;AAAA,KAChB,CAAA;AAAA,EACH;AACA,EAAA,IAAI,SAAA,CAAU,mBAAmB,IAAA,EAAM;AACrC,IAAA,KAAA,CAAM,kBAAA,GAAqB,IAAI,kBAAA,CAAmB;AAAA,MAChD,OAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,mBAAmB,SAAA,CAAU;AAAA,KAC9B,CAAA;AAAA,EACH;AAEA,EAAA,MAAA,CAAO,IAAA,CAAK;AAAA,IACV,IAAA,EAAM,MAAA;AAAA,IACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,IACb,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,CAAE,SAAA;AAAA,IAC7B,UAAA,EAAY,WAAA;AAAA,IACZ,QAAQ,UAAA;AAAW,GACpB,CAAA;AAED,EAAA,QAAA,CAAS,KAAA,EAAM;AACf,EAAA,KAAA,CAAM,oBAAoB,KAAA,EAAM;AAChC,EAAA,KAAA,CAAM,oBAAoB,KAAA,EAAM;AAGhC,EAAA,QAAA,CAAS,OAAO,CAAA;AAQhB,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,YAAA;AAChB,IAAA,KAAK,CAAA,CACF,SAAQ,CACR,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,EAAO,CAAA,CACpB,KAAA;AAAA,MAAM,CAAC,GAAA,KACN,QAAA,CAAS,QAAQ,2BAAA,EAA6B,MAAA,CAAO,GAAG,CAAC;AAAA,KAC3D;AAAA,EACJ;AAEA,EAAA,KAAA,CAAM,UAAA,GAAa,YAAY,YAAY;AAIzC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAQ,EAAG;AAC3B,MAAA,MAAM,UAAU,KAAK,CAAA;AACrB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAc,EAAG;AACjC,QAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,UAChB,IAAA,EAAM,MAAA;AAAA,UACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,UACb,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAQ,CAAE,SAAA;AAAA,UACnC,UAAA,EAAY,WAAA;AAAA,UACZ,QAAQ,UAAA;AAAW,SACpB,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,KAAK,UAAU,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,OAAO,eAAe,CAAA;AAEzB,EAAA,QAAA,CAAS,MAAA,EAAQ,QAAQ,EAAE,SAAA,EAAW,QAAQ,OAAA,EAAQ,CAAE,WAAW,CAAA;AACrE;AAEA,SAAS,QAAA,CACP,QACA,MAAA,EACM;AACN,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAQ,CAAE,MAAA;AACzC,EAAA,MAAM,YAAA,GACJ,QAAA,KAAa,IAAA,KAAS,MAAA,KAAW,QAAQ,QAAA,KAAa,MAAA,CAAA;AACxD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,KAAK,UAAU,KAAK,CAAA;AAAA,EACtB;AACA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAC5C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,MAChB,IAAA,EAAM,MAAA;AAAA,MACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,MACb,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAQ,CAAE,SAAA;AAAA,MACnC,UAAA,EAAY,WAAA;AAAA,MACZ,QAAQ,UAAA;AAAW,KACpB,CAAA;AAAA,EACH;AACA,EAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,IAChB,IAAA,EAAM,UAAA;AAAA,IACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,IACb,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAEA,SAAS,MAAM,OAAA,EAAiD;AAC9D,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,EAAA,KAAK,UAAU,KAAK,CAAA;AACpB,EAAA,KAAA,CAAM,QAAQ,KAAA,EAAM;AACpB,EAAA,IAAI,OAAA,EAAS,iBAAA,IAAqB,KAAA,CAAM,YAAA,EAAc;AACpD,IAAA,KAAK,KAAA,CAAM,aAAa,KAAA,EAAM;AAAA,EAChC;AACA,EAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,IAChB,IAAA,EAAM,MAAA;AAAA,IACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,IACb,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAQ,CAAE,SAAA;AAAA,IACnC,UAAA,EAAY,WAAA;AAAA,IACZ,QAAQ,UAAA;AAAW,GACpB,CAAA;AACH;AAEA,SAAS,WAAA,CAAY,MAAc,IAAA,EAAqB;AACtD,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,EAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,IAChB,IAAA,EAAM,YAAA;AAAA,IACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,IACb,EAAA,EAAI,IAAA;AAAA,IACJ,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS;AAAC,GACxB,CAAA;AACD,EAAA,KAAA,CAAM,QAAQ,KAAA,EAAM;AACpB,EAAA,IAAI,KAAA,CAAM,OAAO,gBAAA,EAAkB;AACjC,IAAA,KAAA,CAAM,SAAS,qBAAA,EAAsB;AAAA,EACvC;AACF;AAEA,SAAS,YAAY,GAAA,EAAoB;AACvC,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,EAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,EAAA,KAAA,CAAM,OAAO,IAAA,CAAK;AAAA,IAChB,IAAA,EAAM,OAAA;AAAA,IACN,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,IACb,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAEA,eAAe,KAAA,GAAuB;AACpC,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,EAAA,MAAM,UAAU,KAAK,CAAA;AACvB;AAEA,eAAe,IAAA,GAAsB;AACnC,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,CAAA,CAAE,MAAA,GAAS,KAAA;AACX,EAAA,KAAA,GAAQ,IAAA;AACR,EAAA,QAAA,CAAS,IAAI,CAAA;AACb,EAAA,IAAI,CAAA,CAAE,UAAA,EAAY,aAAA,CAAc,CAAA,CAAE,UAAU,CAAA;AAC5C,EAAA,CAAA,CAAE,oBAAoB,IAAA,EAAK;AAC3B,EAAA,CAAA,CAAE,oBAAoB,IAAA,EAAK;AAC3B,EAAA,CAAA,CAAE,SAAS,IAAA,EAAK;AAChB,EAAA,MAAM,UAAU,CAAC,CAAA;AACnB;AAEA,SAAS,OAAA,GAA+D;AACtE,EAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,IAAA;AAC3B,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAQ;AAChC,EAAA,OAAO,EAAE,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,MAAA,EAAQ,EAAE,MAAA,EAAO;AACpD;AAEO,IAAM,SAAA,GAAY;AAAA,EACvB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF","file":"index.mjs","sourcesContent":["import type { ReplayEvent } from './types';\n\n// FIFO queue with a hard cap. When the cap is hit we drop the oldest\n// events so memory stays bounded even if the network is down for a\n// long time — the player sees a gap, which is preferable to running\n// the app out of memory.\nexport class EventBuffer {\n private events: ReplayEvent[] = [];\n\n constructor(private readonly maxSize: number) {}\n\n push(event: ReplayEvent): void {\n this.events.push(event);\n const excess = this.events.length - this.maxSize;\n if (excess > 0) {\n this.events.splice(0, excess);\n }\n }\n\n size(): number {\n return this.events.length;\n }\n\n drain(): ReplayEvent[] {\n const out = this.events;\n this.events = [];\n return out;\n }\n\n peek(): readonly ReplayEvent[] {\n return this.events;\n }\n}\n","declare const crypto: { randomUUID?: () => string } | undefined;\n\nfunction uuid(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n // RFC 4122 v4 fallback. Hit when the host hasn't loaded\n // `react-native-get-random-values` (apps polyfill at boot). Random\n // source quality is good enough for a correlation id, not for any\n // security purpose.\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport const IDLE_TIMEOUT_MS = 30 * 60 * 1000;\n\nexport interface SessionState {\n sessionId: string;\n startedAt: number;\n lastActivity: number;\n userId: string | null;\n}\n\nexport class SessionManager {\n private state: SessionState;\n private readonly now: () => number;\n\n constructor(now: () => number = Date.now) {\n this.now = now;\n this.state = this.create();\n }\n\n private create(): SessionState {\n const ts = this.now();\n return { sessionId: uuid(), startedAt: ts, lastActivity: ts, userId: null };\n }\n\n current(): SessionState {\n return this.state;\n }\n\n touch(): void {\n this.state.lastActivity = this.now();\n }\n\n setUser(userId: string | null): boolean {\n const prev = this.state.userId;\n if (prev !== null && (userId === null || prev !== userId)) {\n const next = this.create();\n next.userId = userId;\n this.state = next;\n return true;\n }\n this.state.userId = userId;\n return false;\n }\n\n isStale(): boolean {\n return this.now() - this.state.lastActivity > IDLE_TIMEOUT_MS;\n }\n\n // Rotates the session id if the gap since last activity exceeds the\n // idle window. Caller should emit a fresh meta event under the new\n // id when this returns true.\n rotateIfStale(): boolean {\n if (this.isStale()) {\n const prevUser = this.state.userId;\n this.state = this.create();\n this.state.userId = prevUser;\n return true;\n }\n return false;\n }\n\n reset(): void {\n this.state = this.create();\n }\n}\n","import type { ReplayBatch } from './types';\n\nexport interface TransportConfig {\n apiUrl: string;\n apiKey?: string;\n projectId?: string;\n maxRetries?: number;\n timeoutMs?: number;\n backoffMs?: (attempt: number) => number;\n}\n\nexport interface TransportResult {\n ok: boolean;\n status?: number;\n retryable?: boolean;\n}\n\nconst DEFAULT_BACKOFF = (attempt: number) => 500 * (attempt + 1);\n// Hard caps that survive a misconfigured consumer. 10 retries with the\n// default backoff is already ~30s; anything beyond becomes a memory\n// pressure problem since we hold the drained batch the whole time.\nconst MAX_RETRIES_CAP = 10;\nconst MAX_BACKOFF_MS = 30_000;\n\nexport class Transport {\n constructor(private readonly cfg: TransportConfig) {}\n\n // Returns true on a 2xx. Drops the batch on 4xx (caller-side error,\n // no point retrying), retries on 5xx up to maxRetries, and returns\n // false on network errors / timeout after exhausting retries.\n async sendDetailed(batch: ReplayBatch): Promise<TransportResult> {\n const maxRetries = Math.min(this.cfg.maxRetries ?? 2, MAX_RETRIES_CAP);\n const timeoutMs = this.cfg.timeoutMs ?? 8000;\n const rawBackoff = this.cfg.backoffMs ?? DEFAULT_BACKOFF;\n const backoff = (attempt: number) =>\n Math.min(rawBackoff(attempt), MAX_BACKOFF_MS);\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n let res: Response;\n try {\n res = await fetch(this.cfg.apiUrl, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(batch),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n if (res.ok) return { ok: true, status: res.status };\n if (res.status >= 400 && res.status < 500) {\n return { ok: false, status: res.status, retryable: false };\n }\n } catch {\n // network/abort — fall through to retry path\n }\n if (attempt < maxRetries) {\n await new Promise<void>((r) => setTimeout(() => r(), backoff(attempt)));\n }\n }\n return { ok: false, retryable: true };\n }\n\n async send(batch: ReplayBatch): Promise<boolean> {\n const res = await this.sendDetailed(batch);\n return res.ok;\n }\n\n private headers(): Record<string, string> {\n const h: Record<string, string> = { 'content-type': 'application/json' };\n if (this.cfg.apiKey) {\n h.authorization = `Bearer ${this.cfg.apiKey}`;\n h['x-api-key'] = this.cfg.apiKey;\n }\n if (this.cfg.projectId) {\n h['x-project-id'] = this.cfg.projectId;\n }\n return h;\n }\n}\n","import { AppState, Dimensions, type AppStateStatus } from 'react-native';\nimport type { ReplayEvent } from './types';\n\nexport interface RecorderDeps {\n onEvent: (event: ReplayEvent) => void;\n now: () => number;\n installErrorHandler: boolean;\n captureWireframe?: boolean;\n wireframeIntervalMs?: number;\n captureViewHierarchy?: () => string | null;\n}\n\nexport interface Recorder {\n start(): void;\n stop(): void;\n takeWireframeSnapshot(): void;\n}\n\ninterface GlobalWithErrorUtils {\n ErrorUtils?: {\n getGlobalHandler: () => ((error: Error, isFatal?: boolean) => void) | undefined;\n setGlobalHandler: (h: (error: Error, isFatal?: boolean) => void) => void;\n };\n}\n\nfunction mapAppState(state: AppStateStatus): 'active' | 'background' | 'inactive' {\n if (state === 'active') return 'active';\n if (state === 'background') return 'background';\n return 'inactive';\n}\n\nfunction orientationFor(width: number, height: number): 'portrait' | 'landscape' {\n return width > height ? 'landscape' : 'portrait';\n}\n\n// Recorder subscribes to RN-level signals and emits ReplayEvents.\n// Covers:\n// - screen meta (Dimensions)\n// - lifecycle (AppState)\n// - JS-side errors (ErrorUtils global handler)\n// - view hierarchy wireframe snapshots (TurboModule via captureViewHierarchy)\nexport function createRecorder(deps: RecorderDeps): Recorder {\n const cleanups: Array<() => void> = [];\n let started = false;\n let wireframeTimer: ReturnType<typeof setInterval> | null = null;\n\n function takeWireframeSnapshot(): void {\n if (!deps.captureViewHierarchy) return;\n try {\n const raw = deps.captureViewHierarchy();\n if (!raw || typeof raw !== 'string') return;\n const payload = JSON.parse(raw);\n if (payload && Array.isArray(payload.nodes)) {\n deps.onEvent({\n type: 'wireframe',\n ts: deps.now(),\n version: typeof payload.version === 'number' ? payload.version : 1,\n nodes: payload.nodes,\n });\n }\n } catch {\n // Replay must never crash the host application.\n }\n }\n\n function startWireframeTimer(): void {\n if (!deps.captureWireframe || !deps.captureViewHierarchy) return;\n if (wireframeTimer) return;\n takeWireframeSnapshot();\n const rawInterval = deps.wireframeIntervalMs;\n const intervalMs =\n typeof rawInterval === 'number' &&\n Number.isFinite(rawInterval) &&\n rawInterval > 0\n ? Math.max(500, rawInterval)\n : 1000;\n wireframeTimer = setInterval(() => {\n takeWireframeSnapshot();\n }, intervalMs);\n }\n\n function stopWireframeTimer(): void {\n if (wireframeTimer) {\n clearInterval(wireframeTimer);\n wireframeTimer = null;\n }\n }\n\n return {\n takeWireframeSnapshot,\n start() {\n if (started) return;\n started = true;\n\n const { width, height, scale } = Dimensions.get('window');\n deps.onEvent({\n type: 'screen',\n ts: deps.now(),\n width,\n height,\n scale,\n orientation: orientationFor(width, height),\n });\n\n const appStateSub = AppState.addEventListener('change', (state) => {\n const mapped = mapAppState(state);\n deps.onEvent({\n type: 'lifecycle',\n ts: deps.now(),\n state: mapped,\n });\n\n if (deps.captureWireframe && deps.captureViewHierarchy) {\n if (mapped === 'active') {\n startWireframeTimer();\n } else {\n stopWireframeTimer();\n }\n }\n });\n cleanups.push(() => appStateSub.remove());\n\n const dimSub = Dimensions.addEventListener('change', ({ window }) => {\n deps.onEvent({\n type: 'screen',\n ts: deps.now(),\n width: window.width,\n height: window.height,\n scale: window.scale,\n orientation: orientationFor(window.width, window.height),\n });\n });\n cleanups.push(() => dimSub.remove());\n\n if (deps.installErrorHandler) {\n const g = globalThis as unknown as GlobalWithErrorUtils;\n const eu = g.ErrorUtils;\n if (eu) {\n let handlerActive = true;\n const original = eu.getGlobalHandler();\n const ourHandler = (error: Error, isFatal?: boolean) => {\n if (handlerActive) {\n try {\n deps.onEvent({\n type: 'error',\n ts: deps.now(),\n message: error?.message ?? String(error),\n stack: error?.stack,\n name: error?.name,\n fatal: !!isFatal,\n });\n } catch {\n // Replay must never block crash propagation downstream.\n }\n }\n // Chain so Sentry + dev red-box still see the error.\n if (original) original(error, isFatal);\n };\n eu.setGlobalHandler(ourHandler);\n cleanups.push(() => {\n handlerActive = false;\n // Only restore the previous handler if WE are still the\n // current global. If a downstream consumer (Sentry, dev\n // red-box) wrapped our handler after start(), restoring\n // `original` would silently disable theirs — leave the\n // chain alone instead.\n if (eu.getGlobalHandler() === ourHandler) {\n eu.setGlobalHandler(original as any);\n }\n });\n }\n }\n\n if (deps.captureWireframe && deps.captureViewHierarchy) {\n if (AppState.currentState === 'active' || !AppState.currentState) {\n startWireframeTimer();\n }\n cleanups.push(() => stopWireframeTimer());\n }\n },\n stop() {\n if (!started) return;\n started = false;\n stopWireframeTimer();\n for (const fn of cleanups.splice(0)) {\n try {\n fn();\n } catch {\n // ignore — teardown errors are unrecoverable noise.\n }\n }\n },\n };\n}\n","import type { ReplayEvent } from '../types';\n\nexport interface NetworkInterceptorDeps {\n onEvent: (event: ReplayEvent) => void;\n now: () => number;\n sanitizeUrl?: (url: string) => string;\n apiUrl?: string;\n}\n\nconst MAX_URL_LENGTH = 2048;\n\nconst stripQuery = (raw: string): string => {\n if (typeof raw !== 'string') return '';\n if (raw.startsWith('data:')) {\n const commaIdx = raw.indexOf(',');\n if (commaIdx !== -1) {\n return `${raw.slice(0, commaIdx + 1)}[data-url]`;\n }\n return 'data:[data-url]';\n }\n // Strip authority userinfo (e.g. https://user:password@host -> https://host)\n const strippedCredentials = raw.replace(\n /^((?:[a-zA-Z][a-zA-Z\\d+.-]*:)?\\/\\/)[^/?#]+@/,\n '$1',\n );\n // Strip query strings and hash fragments (e.g. #access_token=...)\n const cutIdx = strippedCredentials.search(/[?#]/);\n const cleaned =\n cutIdx === -1 ? strippedCredentials : strippedCredentials.substring(0, cutIdx);\n return cleaned.length > MAX_URL_LENGTH\n ? cleaned.slice(0, MAX_URL_LENGTH) + '…'\n : cleaned;\n};\n\ninterface XHRMetadata {\n method: string;\n url: string;\n rawUrl: string;\n startTime: number;\n isFromFetch: boolean;\n}\n\nconst xhrMetadataMap = new WeakMap<object, XHRMetadata>();\n\n// Wraps both `globalThis.fetch` and `globalThis.XMLHttpRequest` so network requests\n// emit telemetry events with method/url/status/durationMs/error.\n// Includes double-counting protection for React Native environments where `fetch`\n// is implemented on top of `XMLHttpRequest` (whatwg-fetch polyfill).\nexport class NetworkInterceptor {\n private originalFetch: typeof fetch | null = null;\n private wrappedFetch: typeof fetch | null = null;\n\n private originalXHROpen: ((...args: any[]) => any) | null = null;\n private wrappedXHROpen: ((...args: any[]) => any) | null = null;\n\n private originalXHRSend: ((...args: any[]) => any) | null = null;\n private wrappedXHRSend: ((...args: any[]) => any) | null = null;\n\n private started = false;\n private isCallingFetchSync = false;\n private readonly sanitize: (url: string) => string;\n private readonly ingestOrigin: string | null = null;\n private readonly ingestPath: string | null = null;\n\n constructor(private readonly deps: NetworkInterceptorDeps) {\n this.sanitize = deps.sanitizeUrl ?? stripQuery;\n if (deps.apiUrl) {\n try {\n const parsed: any = typeof URL !== 'undefined' ? new URL(deps.apiUrl) : null;\n if (parsed) {\n this.ingestOrigin = parsed.origin;\n const cleanPath = parsed.pathname.replace(/\\/+$/, '');\n this.ingestPath = cleanPath || '/';\n }\n } catch {\n this.ingestOrigin = null;\n this.ingestPath = null;\n }\n }\n }\n\n private isSelfIngestUrl(url: string): boolean {\n if (!url) return false;\n try {\n const parsed: any =\n typeof URL !== 'undefined' ? new URL(url, 'http://localhost') : null;\n if (parsed) {\n if (this.ingestOrigin && parsed.origin === this.ingestOrigin) {\n if (this.ingestPath === '/' || !this.ingestPath) {\n return true;\n }\n const reqPath = parsed.pathname.replace(/\\/+$/, '') || '/';\n if (\n reqPath === this.ingestPath ||\n reqPath.startsWith(this.ingestPath + '/')\n ) {\n return true;\n }\n return false;\n }\n if (/(^|\\.)clintplay\\./i.test(parsed.hostname || parsed.host || '')) {\n return true;\n }\n return false;\n }\n } catch {}\n return /(^|\\.)clintplay\\./i.test(url);\n }\n\n start(): void {\n if (this.started) return;\n this.started = true;\n\n // 1. Intercept fetch if available\n if (typeof globalThis.fetch === 'function') {\n if (globalThis.fetch !== this.wrappedFetch) {\n this.originalFetch = globalThis.fetch;\n }\n const self = this;\n const wrapped = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n if (!self.started || !self.originalFetch) {\n return (self.originalFetch ?? globalThis.fetch)(input as RequestInfo, init);\n }\n\n const startedAt = self.deps.now();\n const url = self.extractUrl(input);\n const method = self.extractMethod(input, init);\n const skipTelemetry = !self.started || self.isSelfIngestUrl(url);\n\n self.isCallingFetchSync = true;\n let promise: Promise<Response>;\n try {\n promise = self.originalFetch(input as RequestInfo, init);\n } finally {\n self.isCallingFetchSync = false;\n }\n\n try {\n const res = await promise;\n if (!skipTelemetry && self.started) {\n try {\n self.deps.onEvent({\n type: 'network',\n ts: startedAt,\n method,\n url: self.sanitize(url),\n status: res.status,\n durationMs: Math.max(0, self.deps.now() - startedAt),\n });\n } catch {}\n }\n return res;\n } catch (err) {\n if (!skipTelemetry && self.started) {\n try {\n self.deps.onEvent({\n type: 'network',\n ts: startedAt,\n method,\n url: self.sanitize(url),\n durationMs: Math.max(0, self.deps.now() - startedAt),\n error: err instanceof Error ? err.message : String(err),\n });\n } catch {}\n }\n throw err;\n }\n };\n this.wrappedFetch = wrapped as typeof fetch;\n globalThis.fetch = this.wrappedFetch;\n }\n\n // 2. Intercept XMLHttpRequest if available (e.g. for Axios or direct XHR usage)\n const g = globalThis as any;\n if (g.XMLHttpRequest && g.XMLHttpRequest.prototype) {\n const xhrProto = g.XMLHttpRequest.prototype;\n if (xhrProto.open !== this.wrappedXHROpen) {\n this.originalXHROpen = xhrProto.open;\n }\n if (xhrProto.send !== this.wrappedXHRSend) {\n this.originalXHRSend = xhrProto.send;\n }\n\n const self = this;\n\n const wrappedOpen = function (\n this: any,\n method: string,\n url: string | URL,\n ...rest: any[]\n ) {\n if (self.started) {\n try {\n const urlStr = self.extractUrl(url as any);\n const normalizedMethod =\n typeof method === 'string' ? method.toUpperCase() : 'GET';\n const isFromFetch = self.isCallingFetchSync;\n\n const meta: XHRMetadata = {\n method: normalizedMethod,\n url: self.sanitize(urlStr),\n rawUrl: urlStr,\n startTime: 0,\n isFromFetch,\n };\n\n if (this && typeof this === 'object') {\n xhrMetadataMap.set(this, meta);\n }\n } catch {\n // Never abort host app's originalXHROpen if metadata extraction fails (CAND-30)\n }\n }\n\n if (self.originalXHROpen) {\n return self.originalXHROpen.apply(this, [method, url, ...rest]);\n }\n };\n\n const wrappedSend = function (this: any, body?: any) {\n if (self.started && this && typeof this === 'object') {\n try {\n const meta: XHRMetadata | undefined = xhrMetadataMap.get(this);\n if (\n meta &&\n !meta.isFromFetch &&\n !self.isSelfIngestUrl(meta.rawUrl || meta.url)\n ) {\n // CAND-37: Record startTime in wrappedSend, NOT in wrappedOpen\n meta.startTime = self.deps.now();\n\n let emitted = false;\n\n const cleanupListeners = () => {\n if (typeof this.removeEventListener === 'function') {\n this.removeEventListener('load', handleLoad);\n this.removeEventListener('error', handleError);\n this.removeEventListener('abort', handleAbort);\n this.removeEventListener('timeout', handleTimeout);\n }\n };\n\n const emitOnce = (event: ReplayEvent) => {\n cleanupListeners();\n if (this && typeof this === 'object') {\n xhrMetadataMap.delete(this);\n }\n if (emitted || !self.started) return;\n emitted = true;\n try {\n self.deps.onEvent(event);\n } catch {}\n };\n\n const handleLoad = () => {\n emitOnce({\n type: 'network',\n ts: meta.startTime,\n method: meta.method,\n url: meta.url,\n status: typeof this.status === 'number' ? this.status : 200,\n durationMs: Math.max(0, self.deps.now() - meta.startTime),\n });\n };\n\n const handleError = (e?: any) => {\n emitOnce({\n type: 'network',\n ts: meta.startTime,\n method: meta.method,\n url: meta.url,\n durationMs: Math.max(0, self.deps.now() - meta.startTime),\n error: (e && e.message) || 'Network request failed',\n });\n };\n\n const handleAbort = () => {\n emitOnce({\n type: 'network',\n ts: meta.startTime,\n method: meta.method,\n url: meta.url,\n durationMs: Math.max(0, self.deps.now() - meta.startTime),\n error: 'Request aborted',\n });\n };\n\n const handleTimeout = () => {\n emitOnce({\n type: 'network',\n ts: meta.startTime,\n method: meta.method,\n url: meta.url,\n durationMs: Math.max(0, self.deps.now() - meta.startTime),\n error: 'Request timed out',\n });\n };\n\n if (typeof this.addEventListener === 'function') {\n this.addEventListener('load', handleLoad);\n this.addEventListener('error', handleError);\n this.addEventListener('abort', handleAbort);\n this.addEventListener('timeout', handleTimeout);\n }\n }\n } catch {\n // Never abort host app's originalXHRSend on telemetry setup error\n }\n }\n\n if (self.originalXHRSend) {\n return self.originalXHRSend.apply(this, [body]);\n }\n };\n\n this.wrappedXHROpen = wrappedOpen;\n this.wrappedXHRSend = wrappedSend;\n\n xhrProto.open = wrappedOpen;\n xhrProto.send = wrappedSend;\n }\n }\n\n stop(): void {\n if (!this.started) return;\n this.started = false;\n\n if (this.originalFetch && this.wrappedFetch) {\n if (globalThis.fetch === this.wrappedFetch) {\n globalThis.fetch = this.originalFetch;\n }\n }\n\n const g = globalThis as any;\n if (g.XMLHttpRequest && g.XMLHttpRequest.prototype) {\n const xhrProto = g.XMLHttpRequest.prototype;\n if (this.originalXHROpen && xhrProto.open === this.wrappedXHROpen) {\n xhrProto.open = this.originalXHROpen;\n }\n if (this.originalXHRSend && xhrProto.send === this.wrappedXHRSend) {\n xhrProto.send = this.originalXHRSend;\n }\n }\n }\n\n private extractUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input;\n if (typeof URL !== 'undefined' && input instanceof URL) return input.toString();\n if (\n input &&\n typeof input === 'object' &&\n 'url' in input &&\n typeof (input as any).url === 'string'\n ) {\n return (input as any).url;\n }\n return String(input ?? '');\n }\n\n private extractMethod(input: RequestInfo | URL, init?: RequestInit): string {\n const fromInit = init?.method;\n if (fromInit) return fromInit.toUpperCase();\n if (\n input &&\n typeof input === 'object' &&\n 'method' in input &&\n typeof (input as any).method === 'string'\n ) {\n return (input as any).method.toUpperCase();\n }\n return 'GET';\n }\n}\n","import type { ReplayEvent } from '../types';\n\nexport interface ConsoleInterceptorDeps {\n onEvent: (event: ReplayEvent) => void;\n now: () => number;\n // Hard cap on the serialized message length. Messages with embedded\n // objects/stacks can easily be tens of KB — clipping keeps a single\n // log from dominating the batch. Trailing ellipsis marks truncation.\n maxMessageLength?: number;\n // Opt-in capture of `console.log`. Off by default to avoid noisy logs.\n captureConsoleLog?: boolean;\n}\n\nconst DEFAULT_MAX_LENGTH = 1000;\ntype ConsoleMethod = 'log' | 'warn' | 'error';\n\n// Wraps `console.warn`, `console.error`, and optionally `console.log` (when `captureConsoleLog` is enabled).\n// `console.log` is off by default because it's the hot path for app-side debug logging and shipping\n// every log line off-device is both noisy and a perf hit.\nexport class ConsoleInterceptor {\n private readonly originals = new Map<\n ConsoleMethod,\n (...args: unknown[]) => void\n >();\n private readonly wrapped = new Map<\n ConsoleMethod,\n (...args: unknown[]) => void\n >();\n private started = false;\n private isEmitting = false;\n private readonly maxLength: number;\n\n constructor(private readonly deps: ConsoleInterceptorDeps) {\n this.maxLength = deps.maxMessageLength ?? DEFAULT_MAX_LENGTH;\n }\n\n start(): void {\n if (this.started) return;\n if (typeof console === 'undefined') return;\n this.started = true;\n\n const methods: ConsoleMethod[] = this.deps.captureConsoleLog\n ? ['log', 'warn', 'error']\n : ['warn', 'error'];\n\n for (const method of methods) {\n this.wrapMethod(method);\n }\n }\n\n private wrapMethod(method: ConsoleMethod): void {\n const c = console as unknown as Record<\n ConsoleMethod,\n (...a: unknown[]) => void\n >;\n const original = c[method];\n if (typeof original !== 'function') return;\n this.originals.set(method, original);\n\n const wrappedFn = (...args: unknown[]) => {\n if (this.started && !this.isEmitting) {\n this.isEmitting = true;\n try {\n this.deps.onEvent({\n type: 'log',\n ts: this.deps.now(),\n level: method === 'log' ? 'info' : method,\n message: this.formatMessage(args),\n });\n } catch {\n // Never block console output on our own bookkeeping.\n } finally {\n this.isEmitting = false;\n }\n }\n original.apply(console, args);\n };\n\n this.wrapped.set(method, wrappedFn);\n c[method] = wrappedFn;\n }\n\n stop(): void {\n if (!this.started) return;\n this.started = false;\n this.isEmitting = false;\n const c = console as unknown as Record<\n ConsoleMethod,\n (...a: unknown[]) => void\n >;\n for (const [method, original] of this.originals) {\n // Chain safety: Only restore original if console[method] is still pointing to our wrapper.\n // If downstream wrappers (e.g. Sentry, Reactotron) were installed after us, leave them intact.\n if (c[method] === this.wrapped.get(method)) {\n c[method] = original;\n }\n }\n this.originals.clear();\n this.wrapped.clear();\n }\n\n private formatMessage(args: unknown[]): string {\n const text = args\n .map((a) => {\n if (a === undefined) return 'undefined';\n if (typeof a === 'string') return a;\n if (typeof a === 'number') return String(a);\n if (typeof a === 'boolean') return String(a);\n if (typeof a === 'symbol') return a.toString();\n if (typeof a === 'function') {\n return a.name ? `[Function: ${a.name}]` : '[Function]';\n }\n if (a instanceof Error) return a.stack || `${a.name}: ${a.message}`;\n try {\n const json = JSON.stringify(a);\n return json !== undefined ? json : String(a);\n } catch {\n return String(a);\n }\n })\n .join(' ');\n return text.length > this.maxLength\n ? text.slice(0, this.maxLength) + '…'\n : text;\n }\n}\n","import type { AsyncStorageLike, ReplayBatch } from '../types';\n\n// The duck-typed surface lives in types.ts so consumers can import it\n// from the public entry; the offline queue uses it via the structural\n// peer-dep contract. AsyncStorage is OPTIONAL — the queue is silently\n// disabled when the consumer doesn't pass one to `init()`.\nexport type { AsyncStorageLike };\n\nexport type SendBatchResult =\n | boolean\n | { ok: boolean; status?: number; retryable?: boolean };\n\nexport interface OfflineQueueDeps {\n storage: AsyncStorageLike;\n // Called when replaying a persisted batch — typically the same\n // `Transport.send` the live path uses. Returns `true` or `{ ok: true }` if the batch\n // was accepted upstream.\n send: (batch: ReplayBatch) => Promise<SendBatchResult>;\n // Total persisted footprint in characters (≈ bytes for ASCII).\n // Default 5 MiB matches AsyncStorage's per-key practical ceiling\n // and leaves room for the consumer's own keys.\n maxBytes?: number;\n // Override for tests. Production should use the default — keys with\n // the timestamp prefix sort lexicographically by enqueue time, which\n // is what `drain()` relies on for \"oldest first\" replay order.\n keyPrefix?: string;\n debug?: (msg: string) => void;\n}\n\nconst DEFAULT_MAX_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_PREFIX = 'clintplay:batch:';\n\nexport class OfflineQueue {\n private currentBytes = 0;\n // Monotonic sequence number appended to the storage key. Two batches\n // enqueued in the same millisecond would otherwise tie on the\n // timestamp prefix and sort non-deterministically. The padded seq\n // resolves ties while preserving lex order = enqueue order.\n private seq = 0;\n private readonly prefix: string;\n private readonly maxBytes: number;\n private hydrationPromise: Promise<void> | null = null;\n\n constructor(private readonly deps: OfflineQueueDeps) {\n this.prefix = deps.keyPrefix ?? DEFAULT_PREFIX;\n this.maxBytes = deps.maxBytes ?? DEFAULT_MAX_BYTES;\n }\n\n // Compute the on-disk footprint from existing keys. Cheap on first\n // boot, marginal on subsequent boots — called once from `init()`.\n // Per-key getItem errors are isolated so a single flaky entry can't\n // wedge accounting for the entire queue. `getAllKeys` failure is\n // the only hard stop (no keys → no work).\n hydrate(force = false): Promise<void> {\n if (force) {\n this.hydrationPromise = null;\n }\n if (!this.hydrationPromise) {\n this.hydrationPromise = (async () => {\n let keys: readonly string[];\n try {\n keys = (await this.deps.storage.getAllKeys()).filter((k) =>\n k.startsWith(this.prefix),\n );\n } catch (err) {\n this.deps.debug?.(\n `offline-queue hydrate getAllKeys failed: ${String(err)}`,\n );\n this.hydrationPromise = null;\n return;\n }\n let total = 0;\n for (const k of keys) {\n try {\n const raw = await this.deps.storage.getItem(k);\n if (raw) total += raw.length;\n } catch (err) {\n this.deps.debug?.(\n `offline-queue hydrate getItem ${k} failed: ${String(err)}`,\n );\n }\n }\n this.currentBytes = total;\n })().catch((err) => {\n this.hydrationPromise = null;\n throw err;\n });\n }\n return this.hydrationPromise;\n }\n\n // Persist a single batch. Caller invokes after a live send fails.\n // Silently drops batches that exceed the per-batch ceiling — those\n // are unrecoverable even with retries, and keeping them around would\n // wedge the queue.\n async persist(batch: ReplayBatch): Promise<void> {\n if (this.hydrationPromise) {\n await this.hydrationPromise;\n }\n const json = JSON.stringify(batch);\n const bytes = json.length;\n if (bytes > this.maxBytes) {\n this.deps.debug?.(\n `offline-queue batch too large (${bytes} > ${this.maxBytes})`,\n );\n return;\n }\n await this.evictUntilFits(bytes);\n // Padded timestamp + monotonic seq → lex order matches enqueue\n // order. 13 chars covers ms timestamps until year 2286; 6 chars of\n // seq cover a million batches per session before rollover.\n const ts = Date.now().toString().padStart(13, '0');\n const seqStr = (this.seq++).toString().padStart(6, '0');\n const key = `${this.prefix}${ts}-${seqStr}`;\n try {\n await this.deps.storage.setItem(key, json);\n this.currentBytes += bytes;\n } catch (err) {\n this.deps.debug?.(`offline-queue setItem failed: ${String(err)}`);\n }\n }\n\n // Replay all persisted batches in enqueue order. Stops at the first\n // failed send — a network outage that caused the queue to fill up is\n // typically still ongoing on the next boot; pushing more batches at\n // a dead endpoint just burns retries and drops events on the floor.\n async drain(): Promise<number> {\n if (this.hydrationPromise) {\n await this.hydrationPromise;\n }\n let sent = 0;\n try {\n const keys = (await this.deps.storage.getAllKeys())\n .filter((k) => k.startsWith(this.prefix))\n .sort();\n for (const key of keys) {\n const raw = await this.deps.storage.getItem(key);\n if (!raw) {\n await this.deps.storage.removeItem(key);\n continue;\n }\n try {\n const batch = JSON.parse(raw) as ReplayBatch;\n const result = await this.deps.send(batch);\n const ok = typeof result === 'boolean' ? result : !!result?.ok;\n const isNonRetryable =\n typeof result === 'object' &&\n result !== null &&\n ((typeof result.status === 'number' &&\n result.status >= 400 &&\n result.status < 500) ||\n result.retryable === false);\n\n if (!ok) {\n if (isNonRetryable) {\n this.deps.debug?.(\n `offline-queue drop 4xx non-retryable batch for key: ${key}`,\n );\n await this.deps.storage.removeItem(key);\n this.currentBytes = Math.max(0, this.currentBytes - raw.length);\n continue;\n }\n break;\n }\n await this.deps.storage.removeItem(key);\n this.currentBytes = Math.max(0, this.currentBytes - raw.length);\n sent++;\n } catch (err) {\n this.deps.debug?.(`offline-queue drop bad batch: ${String(err)}`);\n await this.deps.storage.removeItem(key);\n this.currentBytes = Math.max(0, this.currentBytes - raw.length);\n }\n }\n } catch (err) {\n this.deps.debug?.(`offline-queue drain failed: ${String(err)}`);\n }\n return sent;\n }\n\n async clear(): Promise<void> {\n try {\n const keys = (await this.deps.storage.getAllKeys()).filter((k) =>\n k.startsWith(this.prefix),\n );\n if (keys.length > 0) {\n await this.deps.storage.multiRemove(keys);\n }\n this.currentBytes = 0;\n this.hydrationPromise = null;\n } catch (err) {\n this.deps.debug?.(`offline-queue clear failed: ${String(err)}`);\n }\n }\n\n private async evictUntilFits(bytesNeeded: number): Promise<void> {\n if (this.currentBytes + bytesNeeded <= this.maxBytes) return;\n const toFree = this.currentBytes + bytesNeeded - this.maxBytes;\n\n let keys: readonly string[];\n try {\n keys = (await this.deps.storage.getAllKeys())\n .filter((k) => k.startsWith(this.prefix))\n .sort();\n } catch (err) {\n this.deps.debug?.(`evict getAllKeys failed: ${String(err)}`);\n return;\n }\n\n let freed = 0;\n const toRemove: string[] = [];\n for (const key of keys) {\n if (freed >= toFree) break;\n let raw: string | null;\n try {\n raw = await this.deps.storage.getItem(key);\n } catch (err) {\n // Skip the flaky key — don't push to toRemove either, because\n // we don't actually know its size to subtract. A subsequent\n // eviction pass can try again. Continuing the loop also lets\n // the next viable key actually free space.\n this.deps.debug?.(`evict getItem ${key} failed: ${String(err)}`);\n continue;\n }\n // A missing entry (`raw == null`) is dead weight — schedule for\n // removal but don't credit `freed`, otherwise we'd undercount.\n if (raw != null) freed += raw.length;\n toRemove.push(key);\n }\n\n if (toRemove.length === 0) return;\n try {\n await this.deps.storage.multiRemove(toRemove);\n this.currentBytes = Math.max(0, this.currentBytes - freed);\n } catch (err) {\n // Partial-remove on the storage side leaves an inconsistent\n // `currentBytes`. Re-hydrate so accounting matches reality on\n // the next persist instead of silently growing past maxBytes.\n this.deps.debug?.(`evict multiRemove failed: ${String(err)}`);\n await this.hydrate(true);\n }\n }\n}\n","import type { ReplayEvent } from './types';\n\n// Module-level bridge for code that can't take an `onEvent` callback\n// via constructor injection — primarily React components that don't\n// know about the SDK's runtime state. Index.ts registers `_setSink`\n// on `init()` and clears it on `stop()`. Components import `emit()`\n// and use it directly; if the SDK is uninitialized, the call no-ops.\n//\n// Kept in its own file (not in index.ts) to avoid circular imports\n// between the public entry and the component subtree.\n\ntype Sink = (event: ReplayEvent) => void;\n\nlet sink: Sink | null = null;\n\nexport function _setSink(next: Sink | null): void {\n sink = next;\n}\n\nexport function emit(event: ReplayEvent): void {\n if (sink) {\n try {\n sink(event);\n } catch {}\n }\n}\n","import { NativeModules, TurboModuleRegistry } from 'react-native';\nimport type { Spec } from './spec/NativeClintplayRN';\n\n// Graceful runtime accessor for the native TurboModule / NativeModule. Uses\n// `TurboModuleRegistry.get` (nullable) and falls back to `NativeModules.ClintplayRN`\n// for Paper / Old Architecture so the SDK works on both architectures and\n// in JS-only mode when the consumer hasn't yet run `pod install` / re-built.\n//\n// `hasNative()` is the safe guard JS callers should check before\n// invoking the wrappers; today every wrapper is a graceful no-op\n// when the native module isn't autolinked, but exposing the boolean\n// lets the SDK skip work that would otherwise be wasted.\n\nlet cachedModule: Spec | null = null;\n\nexport function resolveNativeModule(): Spec | null {\n if (cachedModule) return cachedModule;\n\n try {\n const turbo = TurboModuleRegistry.get<Spec>('ClintplayRN');\n if (turbo) {\n cachedModule = turbo;\n return cachedModule;\n }\n } catch {\n // TurboModuleRegistry may throw if codegen or TurboModules not enabled\n }\n\n try {\n const paper = (NativeModules.ClintplayRN as Spec | undefined) ?? null;\n if (paper) {\n cachedModule = paper;\n return cachedModule;\n }\n } catch {\n // NativeModules access could fail in unusual environments\n }\n\n // CAND-10: Do NOT latch null permanently. If NativeModules / TurboModuleRegistry\n // is initialized slightly after JS evaluation, subsequent calls should find it.\n return null;\n}\n\nexport function getNativeModule(): Spec | null {\n return resolveNativeModule();\n}\n\nexport function resetNativeModuleCache(): void {\n cachedModule = null;\n}\n\nexport function hasNative(): boolean {\n return resolveNativeModule() !== null;\n}\n\nexport function getNativeVersion(): string | null {\n const n = resolveNativeModule();\n if (!n) return null;\n try {\n return n.getVersion();\n } catch {\n return null;\n }\n}\n\nexport function captureViewHierarchy(): string | null {\n const n = resolveNativeModule();\n if (!n) return null;\n try {\n return n.captureViewHierarchy();\n } catch {\n return null;\n }\n}\n","{\n \"name\": \"clintplay-react-native\",\n \"version\": \"0.1.0\",\n \"description\": \"Clintplay React Native SDK — session capture for iOS and Android apps. Companion to clintplay-sdk (web).\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"app.plugin.js\",\n \"ios\",\n \"android\",\n \"src/spec\",\n \"clintplay-react-native.podspec\",\n \"react-native.config.js\"\n ],\n \"codegenConfig\": {\n \"name\": \"ClintplayRNSpec\",\n \"type\": \"modules\",\n \"jsSrcsDir\": \"src/spec\",\n \"android\": {\n \"javaPackageName\": \"digital.clint.clintplay\"\n }\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/clintdigital/clintplay\",\n \"directory\": \"packages/sdk-react-native\"\n },\n \"author\": \"ThreadCode\",\n \"homepage\": \"https://github.com/clintdigital/clintplay#readme\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"keywords\": [\n \"session-replay\",\n \"react-native\",\n \"expo\",\n \"monitoring\",\n \"clintplay\"\n ],\n \"license\": \"MIT\",\n \"packageManager\": \"pnpm@10.30.0\",\n \"peerDependencies\": {\n \"react\": \">=18\",\n \"react-native\": \">=0.74\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^25.5.2\",\n \"@types/react\": \"^19.1.0\",\n \"react\": \"^19.1.0\",\n \"react-native\": \"^0.81.5\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^6.0.2\",\n \"vitest\": \"^4.1.3\"\n }\n}\n","import React from 'react';\nimport { View, type ViewProps } from 'react-native';\n\n// Stable marker the future native module (PR 2) will look for when\n// traversing the view tree. `nativeID` is the cross-platform RN prop\n// that maps to iOS `accessibilityIdentifier` and Android `setTag()` —\n// exactly the channels the native side uses to locate masked nodes.\n// Exposing a component (rather than asking apps to remember a prop)\n// gives a single lintable wrapper for sensitive UI — text inputs,\n// avatars, financial numbers — even before native masking lands.\nexport const CLINTPLAY_MASK_ID = 'clintplay-mask';\n\nexport interface ClintplayMaskViewProps extends ViewProps {\n children?: React.ReactNode;\n}\n\nexport const ClintplayMaskView = React.forwardRef<\n View,\n ClintplayMaskViewProps\n>(function ClintplayMaskView(\n { children, testID, ...rest },\n ref,\n) {\n return (\n <View\n ref={ref}\n testID={testID ?? CLINTPLAY_MASK_ID}\n {...rest}\n collapsable={false}\n nativeID={CLINTPLAY_MASK_ID}\n >\n {children}\n </View>\n );\n});\n\n","import React from 'react';\nimport { TextInput, type TextInputProps } from 'react-native';\nimport { CLINTPLAY_MASK_ID } from './ClintplayMaskView';\n\nexport type ClintplayMaskTextInputProps = TextInputProps;\n\n// Drop-in replacement for `<TextInput>` whose subtree the native\n// module will mask when traversing the view hierarchy. Same props\n// surface as the upstream component — render it anywhere a TextInput\n// would go and the captured frame substitutes a blur (PR 2) for the\n// pixels.\n//\n// Implementation: we plant the `clintplay-mask` marker on `nativeID`\n// directly (rather than wrapping in `<ClintplayMaskView>`) so that\n// keyboard accessory views, autofocus, scroll-into-view behavior,\n// and other TextInput-specific semantics aren't disturbed by an\n// extra ancestor.\nexport const ClintplayMaskTextInput = React.forwardRef<\n TextInput,\n ClintplayMaskTextInputProps\n>(function ClintplayMaskTextInput({ testID, accessibilityLabel, ...props }, ref) {\n // Mask invariant must be sticky: spread first so caller-provided\n // props (including `nativeID` set for accessibility tagging) don't\n // silently strip the mask marker. The native module finds masked\n // subtrees by `nativeID === \"clintplay-mask\"` — losing it on this\n // wrapper would leak the field's pixels into the captured frame.\n return (\n <TextInput\n ref={ref}\n testID={testID ?? CLINTPLAY_MASK_ID}\n accessibilityLabel={accessibilityLabel}\n {...props}\n nativeID={CLINTPLAY_MASK_ID}\n />\n );\n});\n","import React from 'react';\nimport { Image, type ImageProps } from 'react-native';\nimport { CLINTPLAY_MASK_ID } from './ClintplayMaskView';\n\nexport type ClintplayMaskImageProps = ImageProps;\n\n// Drop-in replacement for `<Image>` whose pixels the native module\n// will redact at capture time. Use for avatars, document scans, CRM\n// screenshots, anything that may carry user PII in the bitmap.\n//\n// `expo-image` users: this wrapper still works as a render — the\n// native module's masking pass operates on the platform view tree, so\n// the underlying RN `<Image>` masking applies regardless of which JS\n// component composed it. If you need expo-image specifics, you can\n// alternatively wrap the call site in `<ClintplayMaskView>` and the\n// same nativeID marker is set.\nexport const ClintplayMaskImage = React.forwardRef<\n Image,\n ClintplayMaskImageProps\n>(function ClintplayMaskImage({ testID, accessibilityLabel, ...props }, ref) {\n // Mask invariant must be sticky: spread first so caller-provided\n // props (including `nativeID` set for accessibility tagging) don't\n // silently strip the mask marker. The native module finds masked\n // subtrees by `nativeID === \"clintplay-mask\"` — losing it here\n // would leak the avatar/document/screenshot pixels into the frame.\n return (\n <Image\n ref={ref}\n testID={testID ?? CLINTPLAY_MASK_ID}\n accessibilityLabel={accessibilityLabel}\n {...props}\n nativeID={CLINTPLAY_MASK_ID}\n />\n );\n});\n","import React, { useCallback } from 'react';\nimport {\n View,\n type GestureResponderEvent,\n type StyleProp,\n type ViewProps,\n type ViewStyle,\n} from 'react-native';\nimport { emit } from '../runtime-bridge';\n\nexport interface ClintplayCaptureProviderProps extends ViewProps {\n children?: React.ReactNode;\n style?: StyleProp<ViewStyle>;\n enabled?: boolean;\n}\n\n// Wraps the app root and observes touches WITHOUT claiming the\n// responder. `onTouchStart` and `onTouchEnd` are bubble-phase touch\n// events; they fire when the React tree dispatches the touch and DO\n// NOT participate in responder negotiation. App-side gesture\n// handlers, Touchables, PanResponders, etc. behave exactly as if\n// this wrapper weren't there.\n//\n// Note: RN's typed `ViewProps` exposes capture-phase variants only\n// for `onTouchEndCapture` (used by some back-press patterns) — there\n// is no public `onTouchStartCapture` prop. Bubble phase is the\n// documented, type-safe choice for observation.\n//\n// Mount once at the root of the navigation tree:\n//\n// <ClintplayCaptureProvider>\n// <Stack />\n// </ClintplayCaptureProvider>\n//\n// Coordinates are in the wrapper's coordinate space (locationX/Y is\n// child-relative when the event originates from a child). The player\n// reconstructs screen-relative positions by composing with the\n// emitted `screen` event's size.\nexport function ClintplayCaptureProvider({\n children,\n style,\n enabled = true,\n onTouchStart,\n onTouchEnd,\n onTouchCancel,\n ...rest\n}: ClintplayCaptureProviderProps) {\n const onStart = useCallback(\n (e: GestureResponderEvent) => {\n const nativeEvent = e?.nativeEvent;\n if (!nativeEvent) return;\n const { locationX = 0, locationY = 0, pageX, pageY } = nativeEvent;\n emit({\n type: 'touch',\n ts: Date.now(),\n x: locationX,\n y: locationY,\n screenX: pageX,\n screenY: pageY,\n kind: 'start',\n });\n onTouchStart?.(e);\n },\n [onTouchStart],\n );\n\n const onEnd = useCallback(\n (e: GestureResponderEvent) => {\n const nativeEvent = e?.nativeEvent;\n if (!nativeEvent) return;\n const { locationX = 0, locationY = 0, pageX, pageY } = nativeEvent;\n emit({\n type: 'touch',\n ts: Date.now(),\n x: locationX,\n y: locationY,\n screenX: pageX,\n screenY: pageY,\n kind: 'end',\n });\n onTouchEnd?.(e);\n },\n [onTouchEnd],\n );\n\n const onCancel = useCallback(\n (e: GestureResponderEvent) => {\n const nativeEvent = e?.nativeEvent;\n if (!nativeEvent) return;\n const { locationX = 0, locationY = 0, pageX, pageY } = nativeEvent;\n emit({\n type: 'touch',\n ts: Date.now(),\n x: locationX,\n y: locationY,\n screenX: pageX,\n screenY: pageY,\n kind: 'end',\n });\n onTouchCancel?.(e);\n },\n [onTouchCancel],\n );\n\n if (!enabled) return <>{children}</>;\n\n return (\n <View\n {...rest}\n style={[{ flex: 1 }, style]}\n onTouchStart={onStart}\n onTouchEnd={onEnd}\n onTouchCancel={onCancel}\n >\n {children}\n </View>\n );\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { emit } from '../runtime-bridge';\nimport {\n getActiveRouteName,\n sanitizeRoute,\n type NavigationStateListenerOptions,\n} from '../components/ClintplayNavigationTracker';\n\nexport interface UseClintplayNavigationOptions {\n /**\n * Initial previous route name if known.\n */\n from?: string;\n /**\n * Optional custom callback triggered on screen change.\n */\n onRouteChanged?: (to: string, from?: string) => void;\n}\n\nexport interface UseClintplayNavigationResult {\n (state: unknown): void;\n onStateChange: (state: unknown) => void;\n trackScreen: (to: string, from?: string) => void;\n}\n\n// Module-level shared route state to maintain transition context across distinct\n// hook instances (e.g. Expo Router screen-level components).\nlet sharedLastTrackedRoute: string | undefined = undefined;\n\n/**\n * Resets the shared last tracked route. Used primarily for test isolation.\n */\nexport function _resetLastTrackedRoute(): void {\n sharedLastTrackedRoute = undefined;\n}\n\n/**\n * Hook for automatic or manual screen tracking in React Native and Expo Router.\n *\n * Usage:\n *\n * 1. Screen-level tracking (Expo Router or per-screen):\n * ```tsx\n * const pathname = usePathname();\n * useClintplayNavigationTracking(pathname);\n * ```\n *\n * 2. NavigationContainer onStateChange helper:\n * ```tsx\n * const { onStateChange } = useClintplayNavigationTracking();\n * <NavigationContainer onStateChange={onStateChange} />\n * ```\n */\nexport function useClintplayNavigationTracking(\n routeNameOrPath?: string,\n options?: UseClintplayNavigationOptions,\n): UseClintplayNavigationResult {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const trackScreen = useCallback((to: string, from?: string) => {\n const cleanTo = sanitizeRoute(to);\n if (!cleanTo || cleanTo === sharedLastTrackedRoute) return;\n\n const cleanFrom = sanitizeRoute(from);\n const initialFrom = sanitizeRoute(optionsRef.current?.from);\n\n // If sharedLastTrackedRoute is set, that's our previous route across transitions.\n // Otherwise, use cleanFrom or initialFrom (provided initialFrom !== cleanTo, preventing deadlock).\n const previousRoute =\n cleanFrom ??\n sharedLastTrackedRoute ??\n (initialFrom && initialFrom !== cleanTo ? initialFrom : undefined);\n\n sharedLastTrackedRoute = cleanTo;\n\n emit({\n type: 'navigation',\n ts: Date.now(),\n to: cleanTo,\n ...(previousRoute ? { from: previousRoute } : {}),\n });\n\n try {\n optionsRef.current?.onRouteChanged?.(cleanTo, previousRoute);\n } catch {\n // CAND-47: User callback error must not crash navigation\n }\n }, []);\n\n useEffect(() => {\n const clean = sanitizeRoute(routeNameOrPath);\n if (clean && clean !== sharedLastTrackedRoute) {\n trackScreen(clean);\n }\n }, [routeNameOrPath, trackScreen]);\n\n const handleStateChange = useCallback(\n (state: unknown) => {\n const nextRoute = getActiveRouteName(state);\n if (nextRoute) {\n trackScreen(nextRoute);\n }\n },\n [trackScreen],\n );\n\n const result = Object.assign(handleStateChange, {\n onStateChange: handleStateChange,\n trackScreen,\n }) as UseClintplayNavigationResult;\n\n return result;\n}\n","import React, { useCallback, useRef } from 'react';\nimport { emit } from '../runtime-bridge';\nimport { useClintplayNavigationTracking } from '../hooks/useClintplayNavigation';\n\nexport interface NavigationRouteLike {\n key?: string;\n name?: string;\n params?: Record<string, unknown>;\n state?: NavigationStateLike | unknown;\n}\n\nexport interface NavigationStateLike {\n key?: string;\n index?: number;\n routes?: NavigationRouteLike[];\n routeNames?: string[];\n [key: string]: unknown;\n}\n\nexport type NavigationStateListenerCallback = (\n to: string,\n from?: string,\n) => void;\n\nexport interface NavigationStateListenerOptions {\n /**\n * Initial previous route name if known.\n */\n initialRouteName?: string;\n /**\n * Optional custom callback invoked when the route changes.\n */\n onRouteChanged?: NavigationStateListenerCallback;\n}\n\n/**\n * Sanitizes a route name or pathname by stripping query parameters (?token=...)\n * and fragments (#section...).\n */\nexport function sanitizeRoute(route?: string): string | undefined {\n if (!route || typeof route !== 'string') return undefined;\n const clean = route.split(/[?#]/)[0];\n return clean || undefined;\n}\n\n/**\n * Traverses a nested React Navigation state tree to extract the active leaf route name.\n */\nexport function getActiveRouteName(state: unknown, depth = 0): string | undefined {\n if (depth > 20) return undefined;\n\n if (!state || typeof state !== 'object') {\n return undefined;\n }\n\n const s = state as NavigationStateLike;\n if (!Array.isArray(s.routes) || s.routes.length === 0) {\n if (typeof (s as any).name === 'string') {\n return (s as any).name;\n }\n return undefined;\n }\n\n const index =\n typeof s.index === 'number' && s.index >= 0 && s.index < s.routes.length\n ? s.index\n : s.routes.length - 1;\n\n const currentRoute = s.routes[index];\n if (!currentRoute) return undefined;\n\n if (currentRoute.state) {\n if (depth >= 20) return undefined;\n const childRoute = getActiveRouteName(currentRoute.state, depth + 1);\n if (childRoute !== undefined) {\n return childRoute;\n }\n const childState = currentRoute.state as NavigationStateLike;\n if (\n childState &&\n typeof childState === 'object' &&\n (!Array.isArray(childState.routes) || childState.routes.length === 0)\n ) {\n return currentRoute.name;\n }\n return undefined;\n }\n\n return currentRoute.name;\n}\n\n/**\n * Creates an `onStateChange` listener for React Navigation's `<NavigationContainer>`.\n * Automatically extracts the active leaf screen name and emits a `navigation` event\n * while preventing duplicate consecutive emissions.\n */\nexport function createClintplayNavigationStateListener(\n options?: NavigationStateListenerOptions | NavigationStateListenerCallback,\n): (state: unknown) => void {\n const opts: NavigationStateListenerOptions =\n typeof options === 'function' ? { onRouteChanged: options } : options ?? {};\n\n let currentRoute: string | undefined = undefined;\n const initialRoute = sanitizeRoute(opts.initialRouteName);\n let isFirst = true;\n\n return function onStateChange(state: unknown) {\n const rawRoute = getActiveRouteName(state);\n const nextRoute = sanitizeRoute(rawRoute);\n if (!nextRoute) return;\n\n if (isFirst) {\n isFirst = false;\n const from = initialRoute && initialRoute !== nextRoute ? initialRoute : undefined;\n currentRoute = nextRoute;\n\n emit({\n type: 'navigation',\n ts: Date.now(),\n to: nextRoute,\n ...(from ? { from } : {}),\n });\n\n try {\n opts.onRouteChanged?.(nextRoute, from);\n } catch {\n // CAND-47: User callback error must not crash navigation\n }\n return;\n }\n\n if (nextRoute === currentRoute) return;\n\n const previousRoute = currentRoute;\n currentRoute = nextRoute;\n\n emit({\n type: 'navigation',\n ts: Date.now(),\n to: nextRoute,\n ...(previousRoute ? { from: previousRoute } : {}),\n });\n\n try {\n opts.onRouteChanged?.(nextRoute, previousRoute);\n } catch {\n // CAND-47: User callback error must not crash navigation\n }\n };\n}\n\nexport interface ClintplayNavigationTrackerProps {\n children?:\n | React.ReactNode\n | ((props: { onStateChange: (state: unknown) => void }) => React.ReactNode);\n pathname?: string;\n onStateChange?: (state: unknown) => void;\n initialRouteName?: string;\n onRouteChanged?: NavigationStateListenerCallback;\n}\n\n/**\n * Navigation tracker component for React Navigation and Expo Router.\n * Can be used as a wrapper, helper, or render-prop provider around `<NavigationContainer>`,\n * or as a standalone tracker component `<ClintplayNavigationTracker pathname={pathname} />`.\n */\nexport function ClintplayNavigationTracker({\n children,\n pathname,\n onStateChange,\n initialRouteName,\n onRouteChanged,\n}: ClintplayNavigationTrackerProps) {\n const tracking = useClintplayNavigationTracking(pathname, {\n from: initialRouteName,\n onRouteChanged,\n });\n\n const handleStateChange = useCallback(\n (state: unknown) => {\n tracking.onStateChange(state);\n try {\n onStateChange?.(state);\n } catch {\n // Guard against errors in user onStateChange\n }\n },\n [tracking, onStateChange],\n );\n\n const childOnStateChangeRef = useRef<((state: unknown) => void) | undefined>(undefined);\n\n const mergedOnStateChange = useCallback(\n (state: unknown) => {\n handleStateChange(state);\n try {\n childOnStateChangeRef.current?.(state);\n } catch {\n // Guard against errors in child onStateChange\n }\n },\n [handleStateChange],\n );\n\n if (typeof children === 'function') {\n return <>{children({ onStateChange: handleStateChange })}</>;\n }\n\n if (React.isValidElement(children)) {\n childOnStateChangeRef.current = (children.props as any)?.onStateChange;\n return React.cloneElement(children as React.ReactElement<any>, {\n onStateChange: mergedOnStateChange,\n });\n }\n\n if (Array.isArray(children) || (children && React.Children.count(children) > 1)) {\n let targetIndex = -1;\n let firstValidIndex = -1;\n let scanIndex = 0;\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n if (firstValidIndex === -1) {\n firstValidIndex = scanIndex;\n }\n if (\n typeof (child.props as any)?.onStateChange === 'function' &&\n targetIndex === -1\n ) {\n targetIndex = scanIndex;\n }\n }\n scanIndex++;\n });\n\n const chosenIndex = targetIndex !== -1 ? targetIndex : firstValidIndex;\n let mapIndex = 0;\n\n const clonedChildren = React.Children.map(children, (child) => {\n const currentIdx = mapIndex++;\n if (!React.isValidElement(child)) return child;\n\n if (currentIdx === chosenIndex) {\n childOnStateChangeRef.current = (child.props as any)?.onStateChange;\n return React.cloneElement(child as React.ReactElement<any>, {\n onStateChange: mergedOnStateChange,\n });\n }\n\n return child;\n });\n\n return <>{clonedChildren}</>;\n }\n\n return <>{children ?? null}</>;\n}\n","import { Platform } from 'react-native';\nimport { EventBuffer } from './buffer';\nimport { SessionManager } from './session';\nimport { Transport } from './transport';\nimport { createRecorder, type Recorder } from './recorder';\nimport { NetworkInterceptor } from './modules/network-interceptor';\nimport { ConsoleInterceptor } from './modules/console-interceptor';\nimport { OfflineQueue } from './modules/offline-queue';\nimport { _setSink } from './runtime-bridge';\nimport { captureViewHierarchy } from './native';\nimport type {\n BackendEvent,\n ClintplayReactNativeConfig,\n DeviceInfo,\n EventType,\n ReplayBatch,\n ReplayEvent,\n WireframeEvent,\n WireframeNode,\n} from './types';\nimport { version as pkgVersion } from '../package.json';\n\n// Source of truth is package.json — tsup inlines the value at build\n// time (mirrors `packages/sdk/src/index.ts`). Avoids drift between the\n// shipped wire-format tag and the npm version.\nexport const SDK_VERSION = pkgVersion;\n\ninterface InternalConfig {\n apiUrl: string;\n apiKey?: string;\n projectId: string;\n anonId?: string;\n flushIntervalMs: number;\n flushSize: number;\n maxBufferSize: number;\n debug: boolean;\n captureWireframe: boolean;\n}\n\ninterface RuntimeState {\n config: InternalConfig;\n buffer: EventBuffer;\n session: SessionManager;\n transport: Transport;\n recorder: Recorder;\n networkInterceptor: NetworkInterceptor | null;\n consoleInterceptor: ConsoleInterceptor | null;\n offlineQueue: OfflineQueue | null;\n flushTimer: ReturnType<typeof setInterval> | null;\n excluded: ReadonlySet<EventType>;\n active: boolean;\n}\n\nlet state: RuntimeState | null = null;\n\nfunction deviceInfo(): DeviceInfo {\n const os = Platform.OS;\n const platform: DeviceInfo['platform'] =\n os === 'ios' ? 'ios' : os === 'android' ? 'android' : 'web';\n return { platform, osVersion: String(Platform.Version ?? '') };\n}\n\nfunction debugLog(cfg: InternalConfig, ...args: unknown[]): void {\n if (!cfg.debug) return;\n if (typeof console !== 'undefined' && console.log) {\n console.log('[clintplay-rn]', ...args);\n }\n}\n\nexport function formatEventForBatch(\n event: ReplayEvent | BackendEvent,\n defaultSessionId: string,\n): BackendEvent {\n const ev = event as any;\n const timestamp =\n typeof ev.timestamp === 'number'\n ? ev.timestamp\n : typeof ev.ts === 'number'\n ? ev.ts\n : Date.now();\n const sessionId = ev.sessionId || defaultSessionId;\n const type = ev.type;\n\n if (ev.data !== undefined) {\n return {\n type,\n timestamp,\n sessionId,\n data: ev.data,\n };\n }\n\n const { type: _t, ts: _ts, timestamp: _tms, sessionId: _s, ...rest } = ev;\n return {\n type,\n timestamp,\n sessionId,\n data: rest,\n };\n}\n\nasync function flushOnce(s: RuntimeState): Promise<void> {\n try {\n if (s.buffer.size() === 0) return;\n const currentSessionId = s.session.current().sessionId;\n const rawEvents = s.buffer.drain();\n const events: BackendEvent[] = rawEvents.map((e) =>\n formatEventForBatch(e, currentSessionId),\n );\n const batch: ReplayBatch = {\n projectId: s.config.projectId,\n sessionId: currentSessionId,\n sdkVersion: SDK_VERSION,\n events,\n sentAt: Date.now(),\n ...(s.config.anonId ? { anonId: s.config.anonId } : {}),\n };\n const ok = await s.transport.send(batch);\n if (!ok && s.offlineQueue) {\n // Live send failed AND the consumer wired AsyncStorage — persist\n // for next boot's drain. Without a queue we'd silently drop these\n // events; with one we trade a bit of disk for crash-resilience.\n await s.offlineQueue.persist(batch);\n }\n debugLog(s.config, ok ? 'flushed' : 'flush failed', events.length);\n } catch (err) {\n debugLog(s.config, 'flush failed with error', String(err));\n }\n}\n\nfunction init(rawConfig: ClintplayReactNativeConfig): void {\n if (state?.active) return;\n if (!rawConfig.apiUrl) return;\n if (rawConfig.enabled === false) return;\n\n const sampleRate = rawConfig.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() > sampleRate) return;\n\n const config: InternalConfig = {\n apiUrl: rawConfig.apiUrl,\n apiKey: rawConfig.apiKey,\n projectId: rawConfig.projectId ?? rawConfig.apiKey ?? '',\n anonId: rawConfig.anonId,\n flushIntervalMs: rawConfig.flushIntervalMs ?? 5000,\n flushSize: rawConfig.flushSize ?? 50,\n maxBufferSize: rawConfig.maxBufferSize ?? 1000,\n debug: rawConfig.debug ?? false,\n captureWireframe: rawConfig.captureWireframe ?? false,\n };\n\n const buffer = new EventBuffer(config.maxBufferSize);\n const session = new SessionManager();\n const transport = new Transport({\n apiUrl: config.apiUrl,\n apiKey: config.apiKey,\n projectId: config.projectId,\n });\n\n const excluded = new Set<EventType>(rawConfig.excludeEventTypes ?? []);\n\n // Bootstrap the runtime ref so onEvent / interval callbacks can\n // observe a coherent state object even when fired during init.\n const local: RuntimeState = {\n config,\n buffer,\n session,\n transport,\n recorder: { start: () => {}, stop: () => {}, takeWireframeSnapshot: () => {} },\n networkInterceptor: null,\n consoleInterceptor: null,\n offlineQueue: rawConfig.asyncStorage\n ? new OfflineQueue({\n storage: rawConfig.asyncStorage,\n send: (b) => transport.sendDetailed(b),\n debug: (msg) => debugLog(config, msg),\n })\n : null,\n flushTimer: null,\n excluded,\n active: true,\n };\n // Publish to the module-level ref before any side-effectful bootstrap\n // step so a concurrent init() call observes `state.active === true`\n // and bails on the first guard above. Without this, two rapid init()s\n // would each install their own AppState/Dimensions listeners and\n // their own flush timer, leaking the first set when the second wins\n // the final `state = local` assignment.\n state = local;\n\n const onEvent = (event: ReplayEvent) => {\n if (excluded.has(event.type)) return;\n buffer.push(event);\n session.touch();\n if (buffer.size() >= config.flushSize) {\n void flushOnce(local);\n }\n };\n\n const recorder = createRecorder({\n onEvent,\n now: Date.now,\n installErrorHandler: true,\n captureWireframe: rawConfig.captureWireframe,\n wireframeIntervalMs: rawConfig.wireframeIntervalMs,\n captureViewHierarchy,\n });\n local.recorder = recorder;\n\n // Network on by default (high value, low overhead). Console opt-in\n // because warn/error chatter is noisy in the typical RN app and the\n // wire-format cost adds up fast in busy components.\n if (rawConfig.captureNetwork !== false) {\n local.networkInterceptor = new NetworkInterceptor({\n onEvent,\n now: Date.now,\n sanitizeUrl: rawConfig.sanitizeUrl,\n apiUrl: config.apiUrl,\n });\n }\n if (rawConfig.captureConsole === true) {\n local.consoleInterceptor = new ConsoleInterceptor({\n onEvent,\n now: Date.now,\n captureConsoleLog: rawConfig.captureConsoleLog,\n });\n }\n\n buffer.push({\n type: 'meta',\n ts: Date.now(),\n sessionId: session.current().sessionId,\n sdkVersion: SDK_VERSION,\n device: deviceInfo(),\n });\n\n recorder.start();\n local.networkInterceptor?.start();\n local.consoleInterceptor?.start();\n // Components (ClintplayCaptureProvider etc.) emit through the\n // runtime bridge; register the sink so they reach the live buffer.\n _setSink(onEvent);\n\n // Replay anything the previous session was unable to deliver. Fire\n // and forget — we explicitly do NOT await here so a hung network\n // can't block the rest of init / the app's first paint. The catch\n // is load-bearing: without it, a rejection inside `hydrate()` /\n // `drain()` becomes an unhandled promise rejection that the host\n // app's error reporter (Sentry) flags as a real bug.\n if (local.offlineQueue) {\n const q = local.offlineQueue;\n void q\n .hydrate()\n .then(() => q.drain())\n .catch((err) =>\n debugLog(config, 'offline queue init failed', String(err)),\n );\n }\n\n local.flushTimer = setInterval(async () => {\n // Idle-rotate the session if stale. Flush pending buffer for the\n // current session FIRST so pre-idle tail events are not misattributed\n // to the new session ID.\n if (local.session.isStale()) {\n await flushOnce(local);\n if (local.session.rotateIfStale()) {\n local.buffer.push({\n type: 'meta',\n ts: Date.now(),\n sessionId: local.session.current().sessionId,\n sdkVersion: SDK_VERSION,\n device: deviceInfo(),\n });\n }\n }\n void flushOnce(local);\n }, config.flushIntervalMs);\n\n debugLog(config, 'init', { sessionId: session.current().sessionId });\n}\n\nfunction identify(\n userId: string | null,\n traits?: Record<string, unknown>,\n): void {\n if (!state?.active) return;\n const prevUser = state.session.current().userId;\n const isUserChange =\n prevUser !== null && (userId === null || prevUser !== userId);\n if (isUserChange) {\n void flushOnce(state);\n }\n const rotated = state.session.setUser(userId);\n if (rotated) {\n state.buffer.push({\n type: 'meta',\n ts: Date.now(),\n sessionId: state.session.current().sessionId,\n sdkVersion: SDK_VERSION,\n device: deviceInfo(),\n });\n }\n state.buffer.push({\n type: 'identify',\n ts: Date.now(),\n userId,\n traits,\n });\n}\n\nfunction reset(options?: { clearOfflineQueue?: boolean }): void {\n if (!state?.active) return;\n void flushOnce(state);\n state.session.reset();\n if (options?.clearOfflineQueue && state.offlineQueue) {\n void state.offlineQueue.clear();\n }\n state.buffer.push({\n type: 'meta',\n ts: Date.now(),\n sessionId: state.session.current().sessionId,\n sdkVersion: SDK_VERSION,\n device: deviceInfo(),\n });\n}\n\nfunction trackScreen(path: string, from?: string): void {\n if (!state?.active) return;\n state.buffer.push({\n type: 'navigation',\n ts: Date.now(),\n to: path,\n ...(from ? { from } : {}),\n });\n state.session.touch();\n if (state.config.captureWireframe) {\n state.recorder.takeWireframeSnapshot();\n }\n}\n\nfunction reportError(err: unknown): void {\n if (!state?.active) return;\n const error = err instanceof Error ? err : new Error(String(err));\n state.buffer.push({\n type: 'error',\n ts: Date.now(),\n message: error.message,\n stack: error.stack,\n name: error.name,\n fatal: false,\n });\n}\n\nasync function flush(): Promise<void> {\n if (!state?.active) return;\n await flushOnce(state);\n}\n\nasync function stop(): Promise<void> {\n if (!state?.active) return;\n const s = state;\n s.active = false;\n state = null;\n _setSink(null);\n if (s.flushTimer) clearInterval(s.flushTimer);\n s.consoleInterceptor?.stop();\n s.networkInterceptor?.stop();\n s.recorder.stop();\n await flushOnce(s);\n}\n\nfunction current(): { sessionId: string; userId: string | null } | null {\n if (!state?.active) return null;\n const s = state.session.current();\n return { sessionId: s.sessionId, userId: s.userId };\n}\n\nexport const Clintplay = {\n init,\n identify,\n reset,\n trackScreen,\n reportError,\n flush,\n stop,\n current,\n};\n\nexport {\n ClintplayMaskView,\n CLINTPLAY_MASK_ID,\n type ClintplayMaskViewProps,\n} from './components/ClintplayMaskView';\nexport {\n ClintplayMaskTextInput,\n type ClintplayMaskTextInputProps,\n} from './components/ClintplayMaskTextInput';\nexport {\n ClintplayMaskImage,\n type ClintplayMaskImageProps,\n} from './components/ClintplayMaskImage';\nexport {\n ClintplayCaptureProvider,\n type ClintplayCaptureProviderProps,\n} from './components/ClintplayCaptureProvider';\nexport {\n ClintplayNavigationTracker,\n createClintplayNavigationStateListener,\n getActiveRouteName,\n sanitizeRoute,\n type ClintplayNavigationTrackerProps,\n type NavigationStateListenerOptions,\n type NavigationStateListenerCallback,\n type NavigationRouteLike,\n type NavigationStateLike,\n} from './components/ClintplayNavigationTracker';\nexport {\n useClintplayNavigationTracking,\n _resetLastTrackedRoute,\n type UseClintplayNavigationOptions,\n type UseClintplayNavigationResult,\n} from './hooks/useClintplayNavigation';\nexport type {\n BackendEvent,\n ReplayEvent,\n ClintplayReactNativeConfig,\n DeviceInfo,\n ReplayBatch,\n WireframeEvent,\n WireframeNode,\n} from './types';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/buffer.ts","../src/session.ts","../src/transport.ts","../src/recorder.ts","../src/modules/network-interceptor.ts","../src/modules/console-interceptor.ts","../src/modules/offline-queue.ts","../src/runtime-bridge.ts","../src/native.ts","../package.json","../src/components/ClintplayMaskView.tsx","../src/components/ClintplayMaskTextInput.tsx","../src/components/ClintplayMaskImage.tsx","../src/components/ClintplayCaptureProvider.tsx","../src/hooks/useClintplayNavigation.ts","../src/components/ClintplayNavigationTracker.tsx","../src/index.ts"],"names":["state","init","React","ClintplayMaskView","ClintplayMaskTextInput","jsx","ClintplayMaskImage","View","trackScreen","useCallback","useRef","Fragment"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ReplayEvent } from './types';\n\n// FIFO queue with a hard cap. When the cap is hit we drop the oldest\n// events so memory stays bounded even if the network is down for a\n// long time — the player sees a gap, which is preferable to running\n// the app out of memory.\nexport class EventBuffer {\n private events: ReplayEvent[] = [];\n\n constructor(private readonly maxSize: number) {}\n\n push(event: ReplayEvent): void {\n this.events.push(event);\n const excess = this.events.length - this.maxSize;\n if (excess > 0) {\n this.events.splice(0, excess);\n }\n }\n\n size(): number {\n return this.events.length;\n }\n\n drain(): ReplayEvent[] {\n const out = this.events;\n this.events = [];\n return out;\n }\n\n peek(): readonly ReplayEvent[] {\n return this.events;\n }\n}\n","declare const crypto: { randomUUID?: () => string } | undefined;\n\nfunction uuid(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n // RFC 4122 v4 fallback. Hit when the host hasn't loaded\n // `react-native-get-random-values` (apps polyfill at boot). Random\n // source quality is good enough for a correlation id, not for any\n // security purpose.\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport const IDLE_TIMEOUT_MS = 30 * 60 * 1000;\n\nexport interface SessionState {\n sessionId: string;\n startedAt: number;\n lastActivity: number;\n userId: string | null;\n}\n\nexport class SessionManager {\n private state: SessionState;\n private readonly now: () => number;\n\n constructor(now: () => number = Date.now) {\n this.now = now;\n this.state = this.create();\n }\n\n private create(): SessionState {\n const ts = this.now();\n return { sessionId: uuid(), startedAt: ts, lastActivity: ts, userId: null };\n }\n\n current(): SessionState {\n return this.state;\n }\n\n touch(): void {\n this.state.lastActivity = this.now();\n }\n\n setUser(userId: string | null): boolean {\n const prev = this.state.userId;\n if (prev !== null && (userId === null || prev !== userId)) {\n const next = this.create();\n next.userId = userId;\n this.state = next;\n return true;\n }\n this.state.userId = userId;\n return false;\n }\n\n isStale(): boolean {\n return this.now() - this.state.lastActivity > IDLE_TIMEOUT_MS;\n }\n\n // Rotates the session id if the gap since last activity exceeds the\n // idle window. Caller should emit a fresh meta event under the new\n // id when this returns true.\n rotateIfStale(): boolean {\n if (this.isStale()) {\n const prevUser = this.state.userId;\n this.state = this.create();\n this.state.userId = prevUser;\n return true;\n }\n return false;\n }\n\n reset(): void {\n this.state = this.create();\n }\n}\n","import type { ReplayBatch } from './types';\n\nexport interface TransportConfig {\n apiUrl: string;\n apiKey?: string;\n projectId?: string;\n maxRetries?: number;\n timeoutMs?: number;\n backoffMs?: (attempt: number) => number;\n}\n\nexport interface TransportResult {\n ok: boolean;\n status?: number;\n retryable?: boolean;\n}\n\nconst DEFAULT_BACKOFF = (attempt: number) => 500 * (attempt + 1);\n// Hard caps that survive a misconfigured consumer. 10 retries with the\n// default backoff is already ~30s; anything beyond becomes a memory\n// pressure problem since we hold the drained batch the whole time.\nconst MAX_RETRIES_CAP = 10;\nconst MAX_BACKOFF_MS = 30_000;\n\nexport class Transport {\n constructor(private readonly cfg: TransportConfig) {}\n\n // Returns true on a 2xx. Drops the batch on 4xx (caller-side error,\n // no point retrying), retries on 5xx up to maxRetries, and returns\n // false on network errors / timeout after exhausting retries.\n async sendDetailed(batch: ReplayBatch): Promise<TransportResult> {\n const maxRetries = Math.min(this.cfg.maxRetries ?? 2, MAX_RETRIES_CAP);\n const timeoutMs = this.cfg.timeoutMs ?? 8000;\n const rawBackoff = this.cfg.backoffMs ?? DEFAULT_BACKOFF;\n const backoff = (attempt: number) =>\n Math.min(rawBackoff(attempt), MAX_BACKOFF_MS);\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n let res: Response;\n try {\n res = await fetch(this.cfg.apiUrl, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(batch),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n if (res.ok) return { ok: true, status: res.status };\n if (res.status >= 400 && res.status < 500) {\n return { ok: false, status: res.status, retryable: false };\n }\n } catch {\n // network/abort — fall through to retry path\n }\n if (attempt < maxRetries) {\n await new Promise<void>((r) => setTimeout(() => r(), backoff(attempt)));\n }\n }\n return { ok: false, retryable: true };\n }\n\n async send(batch: ReplayBatch): Promise<boolean> {\n const res = await this.sendDetailed(batch);\n return res.ok;\n }\n\n private headers(): Record<string, string> {\n const h: Record<string, string> = { 'content-type': 'application/json' };\n if (this.cfg.apiKey) {\n h.authorization = `Bearer ${this.cfg.apiKey}`;\n h['x-api-key'] = this.cfg.apiKey;\n }\n if (this.cfg.projectId) {\n h['x-project-id'] = this.cfg.projectId;\n }\n return h;\n }\n}\n","import { AppState, Dimensions, type AppStateStatus } from 'react-native';\nimport type { ReplayEvent } from './types';\n\nexport interface RecorderDeps {\n onEvent: (event: ReplayEvent) => void;\n now: () => number;\n installErrorHandler: boolean;\n captureWireframe?: boolean;\n wireframeIntervalMs?: number;\n captureViewHierarchy?: () => string | null;\n}\n\nexport interface Recorder {\n start(): void;\n stop(): void;\n takeWireframeSnapshot(): void;\n}\n\ninterface GlobalWithErrorUtils {\n ErrorUtils?: {\n getGlobalHandler: () => ((error: Error, isFatal?: boolean) => void) | undefined;\n setGlobalHandler: (h: (error: Error, isFatal?: boolean) => void) => void;\n };\n}\n\nfunction mapAppState(state: AppStateStatus): 'active' | 'background' | 'inactive' {\n if (state === 'active') return 'active';\n if (state === 'background') return 'background';\n return 'inactive';\n}\n\nfunction orientationFor(width: number, height: number): 'portrait' | 'landscape' {\n return width > height ? 'landscape' : 'portrait';\n}\n\n// Recorder subscribes to RN-level signals and emits ReplayEvents.\n// Covers:\n// - screen meta (Dimensions)\n// - lifecycle (AppState)\n// - JS-side errors (ErrorUtils global handler)\n// - view hierarchy wireframe snapshots (TurboModule via captureViewHierarchy)\nexport function createRecorder(deps: RecorderDeps): Recorder {\n const cleanups: Array<() => void> = [];\n let started = false;\n let wireframeTimer: ReturnType<typeof setInterval> | null = null;\n\n function takeWireframeSnapshot(): void {\n if (!deps.captureViewHierarchy) return;\n try {\n const raw = deps.captureViewHierarchy();\n if (!raw || typeof raw !== 'string') return;\n const payload = JSON.parse(raw);\n if (payload && Array.isArray(payload.nodes)) {\n deps.onEvent({\n type: 'wireframe',\n ts: deps.now(),\n version: typeof payload.version === 'number' ? payload.version : 1,\n nodes: payload.nodes,\n });\n }\n } catch {\n // Replay must never crash the host application.\n }\n }\n\n function startWireframeTimer(): void {\n if (!deps.captureWireframe || !deps.captureViewHierarchy) return;\n if (wireframeTimer) return;\n takeWireframeSnapshot();\n const rawInterval = deps.wireframeIntervalMs;\n const intervalMs =\n typeof rawInterval === 'number' &&\n Number.isFinite(rawInterval) &&\n rawInterval > 0\n ? Math.max(500, rawInterval)\n : 1000;\n wireframeTimer = setInterval(() => {\n takeWireframeSnapshot();\n }, intervalMs);\n }\n\n function stopWireframeTimer(): void {\n if (wireframeTimer) {\n clearInterval(wireframeTimer);\n wireframeTimer = null;\n }\n }\n\n return {\n takeWireframeSnapshot,\n start() {\n if (started) return;\n started = true;\n\n const { width, height, scale } = Dimensions.get('window');\n deps.onEvent({\n type: 'screen',\n ts: deps.now(),\n width,\n height,\n scale,\n orientation: orientationFor(width, height),\n });\n\n const appStateSub = AppState.addEventListener('change', (state) => {\n const mapped = mapAppState(state);\n deps.onEvent({\n type: 'lifecycle',\n ts: deps.now(),\n state: mapped,\n });\n\n if (deps.captureWireframe && deps.captureViewHierarchy) {\n if (mapped === 'active') {\n startWireframeTimer();\n } else {\n stopWireframeTimer();\n }\n }\n });\n cleanups.push(() => appStateSub.remove());\n\n const dimSub = Dimensions.addEventListener('change', ({ window }) => {\n deps.onEvent({\n type: 'screen',\n ts: deps.now(),\n width: window.width,\n height: window.height,\n scale: window.scale,\n orientation: orientationFor(window.width, window.height),\n });\n });\n cleanups.push(() => dimSub.remove());\n\n if (deps.installErrorHandler) {\n const g = globalThis as unknown as GlobalWithErrorUtils;\n const eu = g.ErrorUtils;\n if (eu) {\n let handlerActive = true;\n const original = eu.getGlobalHandler();\n const ourHandler = (error: Error, isFatal?: boolean) => {\n if (handlerActive) {\n try {\n deps.onEvent({\n type: 'error',\n ts: deps.now(),\n message: error?.message ?? String(error),\n stack: error?.stack,\n name: error?.name,\n fatal: !!isFatal,\n });\n } catch {\n // Replay must never block crash propagation downstream.\n }\n }\n // Chain so Sentry + dev red-box still see the error.\n if (original) original(error, isFatal);\n };\n eu.setGlobalHandler(ourHandler);\n cleanups.push(() => {\n handlerActive = false;\n // Only restore the previous handler if WE are still the\n // current global. If a downstream consumer (Sentry, dev\n // red-box) wrapped our handler after start(), restoring\n // `original` would silently disable theirs — leave the\n // chain alone instead.\n if (eu.getGlobalHandler() === ourHandler) {\n eu.setGlobalHandler(original as any);\n }\n });\n }\n }\n\n if (deps.captureWireframe && deps.captureViewHierarchy) {\n if (AppState.currentState === 'active' || !AppState.currentState) {\n startWireframeTimer();\n }\n cleanups.push(() => stopWireframeTimer());\n }\n },\n stop() {\n if (!started) return;\n started = false;\n stopWireframeTimer();\n for (const fn of cleanups.splice(0)) {\n try {\n fn();\n } catch {\n // ignore — teardown errors are unrecoverable noise.\n }\n }\n },\n };\n}\n","import type { ReplayEvent } from '../types';\n\nexport interface NetworkInterceptorDeps {\n onEvent: (event: ReplayEvent) => void;\n now: () => number;\n sanitizeUrl?: (url: string) => string;\n apiUrl?: string;\n}\n\nconst MAX_URL_LENGTH = 2048;\n\nconst stripQuery = (raw: string): string => {\n if (typeof raw !== 'string') return '';\n if (raw.startsWith('data:')) {\n const commaIdx = raw.indexOf(',');\n if (commaIdx !== -1) {\n return `${raw.slice(0, commaIdx + 1)}[data-url]`;\n }\n return 'data:[data-url]';\n }\n // Strip authority userinfo (e.g. https://user:password@host -> https://host)\n const strippedCredentials = raw.replace(\n /^((?:[a-zA-Z][a-zA-Z\\d+.-]*:)?\\/\\/)[^/?#]+@/,\n '$1',\n );\n // Strip query strings and hash fragments (e.g. #access_token=...)\n const cutIdx = strippedCredentials.search(/[?#]/);\n const cleaned =\n cutIdx === -1 ? strippedCredentials : strippedCredentials.substring(0, cutIdx);\n return cleaned.length > MAX_URL_LENGTH\n ? cleaned.slice(0, MAX_URL_LENGTH) + '…'\n : cleaned;\n};\n\ninterface XHRMetadata {\n method: string;\n url: string;\n rawUrl: string;\n startTime: number;\n isFromFetch: boolean;\n}\n\nconst xhrMetadataMap = new WeakMap<object, XHRMetadata>();\n\n// Wraps both `globalThis.fetch` and `globalThis.XMLHttpRequest` so network requests\n// emit telemetry events with method/url/status/durationMs/error.\n// Includes double-counting protection for React Native environments where `fetch`\n// is implemented on top of `XMLHttpRequest` (whatwg-fetch polyfill).\nexport class NetworkInterceptor {\n private originalFetch: typeof fetch | null = null;\n private wrappedFetch: typeof fetch | null = null;\n\n private originalXHROpen: ((...args: any[]) => any) | null = null;\n private wrappedXHROpen: ((...args: any[]) => any) | null = null;\n\n private originalXHRSend: ((...args: any[]) => any) | null = null;\n private wrappedXHRSend: ((...args: any[]) => any) | null = null;\n\n private started = false;\n private isCallingFetchSync = false;\n private readonly sanitize: (url: string) => string;\n private readonly ingestOrigin: string | null = null;\n private readonly ingestPath: string | null = null;\n\n constructor(private readonly deps: NetworkInterceptorDeps) {\n this.sanitize = deps.sanitizeUrl ?? stripQuery;\n if (deps.apiUrl) {\n try {\n const parsed: any = typeof URL !== 'undefined' ? new URL(deps.apiUrl) : null;\n if (parsed) {\n this.ingestOrigin = parsed.origin;\n const cleanPath = parsed.pathname.replace(/\\/+$/, '');\n this.ingestPath = cleanPath || '/';\n }\n } catch {\n this.ingestOrigin = null;\n this.ingestPath = null;\n }\n }\n }\n\n private isSelfIngestUrl(url: string): boolean {\n if (!url) return false;\n try {\n const parsed: any =\n typeof URL !== 'undefined' ? new URL(url, 'http://localhost') : null;\n if (parsed) {\n if (this.ingestOrigin && parsed.origin === this.ingestOrigin) {\n if (this.ingestPath === '/' || !this.ingestPath) {\n return true;\n }\n const reqPath = parsed.pathname.replace(/\\/+$/, '') || '/';\n if (\n reqPath === this.ingestPath ||\n reqPath.startsWith(this.ingestPath + '/')\n ) {\n return true;\n }\n return false;\n }\n if (/(^|\\.)clintplay\\./i.test(parsed.hostname || parsed.host || '')) {\n return true;\n }\n return false;\n }\n } catch {}\n return /(^|\\.)clintplay\\./i.test(url);\n }\n\n start(): void {\n if (this.started) return;\n this.started = true;\n\n // 1. Intercept fetch if available\n if (typeof globalThis.fetch === 'function') {\n if (globalThis.fetch !== this.wrappedFetch) {\n this.originalFetch = globalThis.fetch;\n }\n const self = this;\n const wrapped = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n if (!self.started || !self.originalFetch) {\n return (self.originalFetch ?? globalThis.fetch)(input as RequestInfo, init);\n }\n\n const startedAt = self.deps.now();\n const url = self.extractUrl(input);\n const method = self.extractMethod(input, init);\n const skipTelemetry = !self.started || self.isSelfIngestUrl(url);\n\n self.isCallingFetchSync = true;\n let promise: Promise<Response>;\n try {\n promise = self.originalFetch(input as RequestInfo, init);\n } finally {\n self.isCallingFetchSync = false;\n }\n\n try {\n const res = await promise;\n if (!skipTelemetry && self.started) {\n try {\n self.deps.onEvent({\n type: 'network',\n ts: startedAt,\n method,\n url: self.sanitize(url),\n status: res.status,\n durationMs: Math.max(0, self.deps.now() - startedAt),\n });\n } catch {}\n }\n return res;\n } catch (err) {\n if (!skipTelemetry && self.started) {\n try {\n self.deps.onEvent({\n type: 'network',\n ts: startedAt,\n method,\n url: self.sanitize(url),\n durationMs: Math.max(0, self.deps.now() - startedAt),\n error: err instanceof Error ? err.message : String(err),\n });\n } catch {}\n }\n throw err;\n }\n };\n this.wrappedFetch = wrapped as typeof fetch;\n globalThis.fetch = this.wrappedFetch;\n }\n\n // 2. Intercept XMLHttpRequest if available (e.g. for Axios or direct XHR usage)\n const g = globalThis as any;\n if (g.XMLHttpRequest && g.XMLHttpRequest.prototype) {\n const xhrProto = g.XMLHttpRequest.prototype;\n if (xhrProto.open !== this.wrappedXHROpen) {\n this.originalXHROpen = xhrProto.open;\n }\n if (xhrProto.send !== this.wrappedXHRSend) {\n this.originalXHRSend = xhrProto.send;\n }\n\n const self = this;\n\n const wrappedOpen = function (\n this: any,\n method: string,\n url: string | URL,\n ...rest: any[]\n ) {\n if (self.started) {\n try {\n const urlStr = self.extractUrl(url as any);\n const normalizedMethod =\n typeof method === 'string' ? method.toUpperCase() : 'GET';\n const isFromFetch = self.isCallingFetchSync;\n\n const meta: XHRMetadata = {\n method: normalizedMethod,\n url: self.sanitize(urlStr),\n rawUrl: urlStr,\n startTime: 0,\n isFromFetch,\n };\n\n if (this && typeof this === 'object') {\n xhrMetadataMap.set(this, meta);\n }\n } catch {\n // Never abort host app's originalXHROpen if metadata extraction fails (CAND-30)\n }\n }\n\n if (self.originalXHROpen) {\n return self.originalXHROpen.apply(this, [method, url, ...rest]);\n }\n };\n\n const wrappedSend = function (this: any, body?: any) {\n if (self.started && this && typeof this === 'object') {\n try {\n const meta: XHRMetadata | undefined = xhrMetadataMap.get(this);\n if (\n meta &&\n !meta.isFromFetch &&\n !self.isSelfIngestUrl(meta.rawUrl || meta.url)\n ) {\n // CAND-37: Record startTime in wrappedSend, NOT in wrappedOpen\n meta.startTime = self.deps.now();\n\n let emitted = false;\n\n const cleanupListeners = () => {\n if (typeof this.removeEventListener === 'function') {\n this.removeEventListener('load', handleLoad);\n this.removeEventListener('error', handleError);\n this.removeEventListener('abort', handleAbort);\n this.removeEventListener('timeout', handleTimeout);\n }\n };\n\n const emitOnce = (event: ReplayEvent) => {\n cleanupListeners();\n if (this && typeof this === 'object') {\n xhrMetadataMap.delete(this);\n }\n if (emitted || !self.started) return;\n emitted = true;\n try {\n self.deps.onEvent(event);\n } catch {}\n };\n\n const handleLoad = () => {\n emitOnce({\n type: 'network',\n ts: meta.startTime,\n method: meta.method,\n url: meta.url,\n status: typeof this.status === 'number' ? this.status : 200,\n durationMs: Math.max(0, self.deps.now() - meta.startTime),\n });\n };\n\n const handleError = (e?: any) => {\n emitOnce({\n type: 'network',\n ts: meta.startTime,\n method: meta.method,\n url: meta.url,\n durationMs: Math.max(0, self.deps.now() - meta.startTime),\n error: (e && e.message) || 'Network request failed',\n });\n };\n\n const handleAbort = () => {\n emitOnce({\n type: 'network',\n ts: meta.startTime,\n method: meta.method,\n url: meta.url,\n durationMs: Math.max(0, self.deps.now() - meta.startTime),\n error: 'Request aborted',\n });\n };\n\n const handleTimeout = () => {\n emitOnce({\n type: 'network',\n ts: meta.startTime,\n method: meta.method,\n url: meta.url,\n durationMs: Math.max(0, self.deps.now() - meta.startTime),\n error: 'Request timed out',\n });\n };\n\n if (typeof this.addEventListener === 'function') {\n this.addEventListener('load', handleLoad);\n this.addEventListener('error', handleError);\n this.addEventListener('abort', handleAbort);\n this.addEventListener('timeout', handleTimeout);\n }\n }\n } catch {\n // Never abort host app's originalXHRSend on telemetry setup error\n }\n }\n\n if (self.originalXHRSend) {\n return self.originalXHRSend.apply(this, [body]);\n }\n };\n\n this.wrappedXHROpen = wrappedOpen;\n this.wrappedXHRSend = wrappedSend;\n\n xhrProto.open = wrappedOpen;\n xhrProto.send = wrappedSend;\n }\n }\n\n stop(): void {\n if (!this.started) return;\n this.started = false;\n\n if (this.originalFetch && this.wrappedFetch) {\n if (globalThis.fetch === this.wrappedFetch) {\n globalThis.fetch = this.originalFetch;\n }\n }\n\n const g = globalThis as any;\n if (g.XMLHttpRequest && g.XMLHttpRequest.prototype) {\n const xhrProto = g.XMLHttpRequest.prototype;\n if (this.originalXHROpen && xhrProto.open === this.wrappedXHROpen) {\n xhrProto.open = this.originalXHROpen;\n }\n if (this.originalXHRSend && xhrProto.send === this.wrappedXHRSend) {\n xhrProto.send = this.originalXHRSend;\n }\n }\n }\n\n private extractUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input;\n if (typeof URL !== 'undefined' && input instanceof URL) return input.toString();\n if (\n input &&\n typeof input === 'object' &&\n 'url' in input &&\n typeof (input as any).url === 'string'\n ) {\n return (input as any).url;\n }\n return String(input ?? '');\n }\n\n private extractMethod(input: RequestInfo | URL, init?: RequestInit): string {\n const fromInit = init?.method;\n if (fromInit) return fromInit.toUpperCase();\n if (\n input &&\n typeof input === 'object' &&\n 'method' in input &&\n typeof (input as any).method === 'string'\n ) {\n return (input as any).method.toUpperCase();\n }\n return 'GET';\n }\n}\n","import type { ReplayEvent } from '../types';\n\nexport interface ConsoleInterceptorDeps {\n onEvent: (event: ReplayEvent) => void;\n now: () => number;\n // Hard cap on the serialized message length. Messages with embedded\n // objects/stacks can easily be tens of KB — clipping keeps a single\n // log from dominating the batch. Trailing ellipsis marks truncation.\n maxMessageLength?: number;\n // Opt-in capture of `console.log`. Off by default to avoid noisy logs.\n captureConsoleLog?: boolean;\n}\n\nconst DEFAULT_MAX_LENGTH = 1000;\ntype ConsoleMethod = 'log' | 'warn' | 'error';\n\n// Wraps `console.warn`, `console.error`, and optionally `console.log` (when `captureConsoleLog` is enabled).\n// `console.log` is off by default because it's the hot path for app-side debug logging and shipping\n// every log line off-device is both noisy and a perf hit.\nexport class ConsoleInterceptor {\n private readonly originals = new Map<\n ConsoleMethod,\n (...args: unknown[]) => void\n >();\n private readonly wrapped = new Map<\n ConsoleMethod,\n (...args: unknown[]) => void\n >();\n private started = false;\n private isEmitting = false;\n private readonly maxLength: number;\n\n constructor(private readonly deps: ConsoleInterceptorDeps) {\n this.maxLength = deps.maxMessageLength ?? DEFAULT_MAX_LENGTH;\n }\n\n start(): void {\n if (this.started) return;\n if (typeof console === 'undefined') return;\n this.started = true;\n\n const methods: ConsoleMethod[] = this.deps.captureConsoleLog\n ? ['log', 'warn', 'error']\n : ['warn', 'error'];\n\n for (const method of methods) {\n this.wrapMethod(method);\n }\n }\n\n private wrapMethod(method: ConsoleMethod): void {\n const c = console as unknown as Record<\n ConsoleMethod,\n (...a: unknown[]) => void\n >;\n const original = c[method];\n if (typeof original !== 'function') return;\n this.originals.set(method, original);\n\n const wrappedFn = (...args: unknown[]) => {\n if (this.started && !this.isEmitting) {\n this.isEmitting = true;\n try {\n this.deps.onEvent({\n type: 'log',\n ts: this.deps.now(),\n level: method === 'log' ? 'info' : method,\n message: this.formatMessage(args),\n });\n } catch {\n // Never block console output on our own bookkeeping.\n } finally {\n this.isEmitting = false;\n }\n }\n original.apply(console, args);\n };\n\n this.wrapped.set(method, wrappedFn);\n c[method] = wrappedFn;\n }\n\n stop(): void {\n if (!this.started) return;\n this.started = false;\n this.isEmitting = false;\n const c = console as unknown as Record<\n ConsoleMethod,\n (...a: unknown[]) => void\n >;\n for (const [method, original] of this.originals) {\n // Chain safety: Only restore original if console[method] is still pointing to our wrapper.\n // If downstream wrappers (e.g. Sentry, Reactotron) were installed after us, leave them intact.\n if (c[method] === this.wrapped.get(method)) {\n c[method] = original;\n }\n }\n this.originals.clear();\n this.wrapped.clear();\n }\n\n private formatMessage(args: unknown[]): string {\n const text = args\n .map((a) => {\n if (a === undefined) return 'undefined';\n if (typeof a === 'string') return a;\n if (typeof a === 'number') return String(a);\n if (typeof a === 'boolean') return String(a);\n if (typeof a === 'symbol') return a.toString();\n if (typeof a === 'function') {\n return a.name ? `[Function: ${a.name}]` : '[Function]';\n }\n if (a instanceof Error) return a.stack || `${a.name}: ${a.message}`;\n try {\n const json = JSON.stringify(a);\n return json !== undefined ? json : String(a);\n } catch {\n return String(a);\n }\n })\n .join(' ');\n return text.length > this.maxLength\n ? text.slice(0, this.maxLength) + '…'\n : text;\n }\n}\n","import type { AsyncStorageLike, ReplayBatch } from '../types';\n\n// The duck-typed surface lives in types.ts so consumers can import it\n// from the public entry; the offline queue uses it via the structural\n// peer-dep contract. AsyncStorage is OPTIONAL — the queue is silently\n// disabled when the consumer doesn't pass one to `init()`.\nexport type { AsyncStorageLike };\n\nexport type SendBatchResult =\n | boolean\n | { ok: boolean; status?: number; retryable?: boolean };\n\nexport interface OfflineQueueDeps {\n storage: AsyncStorageLike;\n // Called when replaying a persisted batch — typically the same\n // `Transport.send` the live path uses. Returns `true` or `{ ok: true }` if the batch\n // was accepted upstream.\n send: (batch: ReplayBatch) => Promise<SendBatchResult>;\n // Total persisted footprint in characters (≈ bytes for ASCII).\n // Default 5 MiB matches AsyncStorage's per-key practical ceiling\n // and leaves room for the consumer's own keys.\n maxBytes?: number;\n // Override for tests. Production should use the default — keys with\n // the timestamp prefix sort lexicographically by enqueue time, which\n // is what `drain()` relies on for \"oldest first\" replay order.\n keyPrefix?: string;\n debug?: (msg: string) => void;\n}\n\nconst DEFAULT_MAX_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_PREFIX = 'clintplay:batch:';\n\nexport class OfflineQueue {\n private currentBytes = 0;\n // Monotonic sequence number appended to the storage key. Two batches\n // enqueued in the same millisecond would otherwise tie on the\n // timestamp prefix and sort non-deterministically. The padded seq\n // resolves ties while preserving lex order = enqueue order.\n private seq = 0;\n private readonly prefix: string;\n private readonly maxBytes: number;\n private hydrationPromise: Promise<void> | null = null;\n\n constructor(private readonly deps: OfflineQueueDeps) {\n this.prefix = deps.keyPrefix ?? DEFAULT_PREFIX;\n this.maxBytes = deps.maxBytes ?? DEFAULT_MAX_BYTES;\n }\n\n // Compute the on-disk footprint from existing keys. Cheap on first\n // boot, marginal on subsequent boots — called once from `init()`.\n // Per-key getItem errors are isolated so a single flaky entry can't\n // wedge accounting for the entire queue. `getAllKeys` failure is\n // the only hard stop (no keys → no work).\n hydrate(force = false): Promise<void> {\n if (force) {\n this.hydrationPromise = null;\n }\n if (!this.hydrationPromise) {\n this.hydrationPromise = (async () => {\n let keys: readonly string[];\n try {\n keys = (await this.deps.storage.getAllKeys()).filter((k) =>\n k.startsWith(this.prefix),\n );\n } catch (err) {\n this.deps.debug?.(\n `offline-queue hydrate getAllKeys failed: ${String(err)}`,\n );\n this.hydrationPromise = null;\n return;\n }\n let total = 0;\n for (const k of keys) {\n try {\n const raw = await this.deps.storage.getItem(k);\n if (raw) total += raw.length;\n } catch (err) {\n this.deps.debug?.(\n `offline-queue hydrate getItem ${k} failed: ${String(err)}`,\n );\n }\n }\n this.currentBytes = total;\n })().catch((err) => {\n this.hydrationPromise = null;\n throw err;\n });\n }\n return this.hydrationPromise;\n }\n\n // Persist a single batch. Caller invokes after a live send fails.\n // Silently drops batches that exceed the per-batch ceiling — those\n // are unrecoverable even with retries, and keeping them around would\n // wedge the queue.\n async persist(batch: ReplayBatch): Promise<void> {\n if (this.hydrationPromise) {\n await this.hydrationPromise;\n }\n const json = JSON.stringify(batch);\n const bytes = json.length;\n if (bytes > this.maxBytes) {\n this.deps.debug?.(\n `offline-queue batch too large (${bytes} > ${this.maxBytes})`,\n );\n return;\n }\n await this.evictUntilFits(bytes);\n // Padded timestamp + monotonic seq → lex order matches enqueue\n // order. 13 chars covers ms timestamps until year 2286; 6 chars of\n // seq cover a million batches per session before rollover.\n const ts = Date.now().toString().padStart(13, '0');\n const seqStr = (this.seq++).toString().padStart(6, '0');\n const key = `${this.prefix}${ts}-${seqStr}`;\n try {\n await this.deps.storage.setItem(key, json);\n this.currentBytes += bytes;\n } catch (err) {\n this.deps.debug?.(`offline-queue setItem failed: ${String(err)}`);\n }\n }\n\n // Replay all persisted batches in enqueue order. Stops at the first\n // failed send — a network outage that caused the queue to fill up is\n // typically still ongoing on the next boot; pushing more batches at\n // a dead endpoint just burns retries and drops events on the floor.\n async drain(): Promise<number> {\n if (this.hydrationPromise) {\n await this.hydrationPromise;\n }\n let sent = 0;\n try {\n const keys = (await this.deps.storage.getAllKeys())\n .filter((k) => k.startsWith(this.prefix))\n .sort();\n for (const key of keys) {\n const raw = await this.deps.storage.getItem(key);\n if (!raw) {\n await this.deps.storage.removeItem(key);\n continue;\n }\n try {\n const batch = JSON.parse(raw) as ReplayBatch;\n const result = await this.deps.send(batch);\n const ok = typeof result === 'boolean' ? result : !!result?.ok;\n const isNonRetryable =\n typeof result === 'object' &&\n result !== null &&\n ((typeof result.status === 'number' &&\n result.status >= 400 &&\n result.status < 500) ||\n result.retryable === false);\n\n if (!ok) {\n if (isNonRetryable) {\n this.deps.debug?.(\n `offline-queue drop 4xx non-retryable batch for key: ${key}`,\n );\n await this.deps.storage.removeItem(key);\n this.currentBytes = Math.max(0, this.currentBytes - raw.length);\n continue;\n }\n break;\n }\n await this.deps.storage.removeItem(key);\n this.currentBytes = Math.max(0, this.currentBytes - raw.length);\n sent++;\n } catch (err) {\n this.deps.debug?.(`offline-queue drop bad batch: ${String(err)}`);\n await this.deps.storage.removeItem(key);\n this.currentBytes = Math.max(0, this.currentBytes - raw.length);\n }\n }\n } catch (err) {\n this.deps.debug?.(`offline-queue drain failed: ${String(err)}`);\n }\n return sent;\n }\n\n async clear(): Promise<void> {\n try {\n const keys = (await this.deps.storage.getAllKeys()).filter((k) =>\n k.startsWith(this.prefix),\n );\n if (keys.length > 0) {\n await this.deps.storage.multiRemove(keys);\n }\n this.currentBytes = 0;\n this.hydrationPromise = null;\n } catch (err) {\n this.deps.debug?.(`offline-queue clear failed: ${String(err)}`);\n }\n }\n\n private async evictUntilFits(bytesNeeded: number): Promise<void> {\n if (this.currentBytes + bytesNeeded <= this.maxBytes) return;\n const toFree = this.currentBytes + bytesNeeded - this.maxBytes;\n\n let keys: readonly string[];\n try {\n keys = (await this.deps.storage.getAllKeys())\n .filter((k) => k.startsWith(this.prefix))\n .sort();\n } catch (err) {\n this.deps.debug?.(`evict getAllKeys failed: ${String(err)}`);\n return;\n }\n\n let freed = 0;\n const toRemove: string[] = [];\n for (const key of keys) {\n if (freed >= toFree) break;\n let raw: string | null;\n try {\n raw = await this.deps.storage.getItem(key);\n } catch (err) {\n // Skip the flaky key — don't push to toRemove either, because\n // we don't actually know its size to subtract. A subsequent\n // eviction pass can try again. Continuing the loop also lets\n // the next viable key actually free space.\n this.deps.debug?.(`evict getItem ${key} failed: ${String(err)}`);\n continue;\n }\n // A missing entry (`raw == null`) is dead weight — schedule for\n // removal but don't credit `freed`, otherwise we'd undercount.\n if (raw != null) freed += raw.length;\n toRemove.push(key);\n }\n\n if (toRemove.length === 0) return;\n try {\n await this.deps.storage.multiRemove(toRemove);\n this.currentBytes = Math.max(0, this.currentBytes - freed);\n } catch (err) {\n // Partial-remove on the storage side leaves an inconsistent\n // `currentBytes`. Re-hydrate so accounting matches reality on\n // the next persist instead of silently growing past maxBytes.\n this.deps.debug?.(`evict multiRemove failed: ${String(err)}`);\n await this.hydrate(true);\n }\n }\n}\n","import type { ReplayEvent } from './types';\n\n// Module-level bridge for code that can't take an `onEvent` callback\n// via constructor injection — primarily React components that don't\n// know about the SDK's runtime state. Index.ts registers `_setSink`\n// on `init()` and clears it on `stop()`. Components import `emit()`\n// and use it directly; if the SDK is uninitialized, the call no-ops.\n//\n// Kept in its own file (not in index.ts) to avoid circular imports\n// between the public entry and the component subtree.\n\ntype Sink = (event: ReplayEvent) => void;\n\nlet sink: Sink | null = null;\n\nexport function _setSink(next: Sink | null): void {\n sink = next;\n}\n\nexport function emit(event: ReplayEvent): void {\n if (sink) {\n try {\n sink(event);\n } catch {}\n }\n}\n","import { NativeModules, TurboModuleRegistry } from 'react-native';\nimport type { Spec } from './spec/NativeClintplayRN';\n\n// Graceful runtime accessor for the native TurboModule / NativeModule. Uses\n// `TurboModuleRegistry.get` (nullable) and falls back to `NativeModules.ClintplayRN`\n// for Paper / Old Architecture so the SDK works on both architectures and\n// in JS-only mode when the consumer hasn't yet run `pod install` / re-built.\n//\n// `hasNative()` is the safe guard JS callers should check before\n// invoking the wrappers; today every wrapper is a graceful no-op\n// when the native module isn't autolinked, but exposing the boolean\n// lets the SDK skip work that would otherwise be wasted.\n\nlet cachedModule: Spec | null = null;\n\nexport function resolveNativeModule(): Spec | null {\n if (cachedModule) return cachedModule;\n\n try {\n const turbo = TurboModuleRegistry.get<Spec>('ClintplayRN');\n if (turbo) {\n cachedModule = turbo;\n return cachedModule;\n }\n } catch {\n // TurboModuleRegistry may throw if codegen or TurboModules not enabled\n }\n\n try {\n const paper = (NativeModules.ClintplayRN as Spec | undefined) ?? null;\n if (paper) {\n cachedModule = paper;\n return cachedModule;\n }\n } catch {\n // NativeModules access could fail in unusual environments\n }\n\n // CAND-10: Do NOT latch null permanently. If NativeModules / TurboModuleRegistry\n // is initialized slightly after JS evaluation, subsequent calls should find it.\n return null;\n}\n\nexport function getNativeModule(): Spec | null {\n return resolveNativeModule();\n}\n\nexport function resetNativeModuleCache(): void {\n cachedModule = null;\n}\n\nexport function hasNative(): boolean {\n return resolveNativeModule() !== null;\n}\n\nexport function getNativeVersion(): string | null {\n const n = resolveNativeModule();\n if (!n) return null;\n try {\n return n.getVersion();\n } catch {\n return null;\n }\n}\n\nexport function captureViewHierarchy(): string | null {\n const n = resolveNativeModule();\n if (!n) return null;\n try {\n return n.captureViewHierarchy();\n } catch {\n return null;\n }\n}\n","{\n \"name\": \"clintplay-react-native\",\n \"version\": \"0.2.0\",\n \"description\": \"Clintplay React Native SDK — session capture for iOS and Android apps. Companion to clintplay-sdk (web).\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"app.plugin.js\",\n \"ios\",\n \"android\",\n \"src/spec\",\n \"clintplay-react-native.podspec\",\n \"react-native.config.js\"\n ],\n \"codegenConfig\": {\n \"name\": \"ClintplayRNSpec\",\n \"type\": \"modules\",\n \"jsSrcsDir\": \"src/spec\",\n \"android\": {\n \"javaPackageName\": \"digital.clint.clintplay\"\n }\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/clintdigital/clintplay\",\n \"directory\": \"packages/sdk-react-native\"\n },\n \"author\": \"ThreadCode\",\n \"homepage\": \"https://github.com/clintdigital/clintplay#readme\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"keywords\": [\n \"session-replay\",\n \"react-native\",\n \"expo\",\n \"monitoring\",\n \"clintplay\"\n ],\n \"license\": \"MIT\",\n \"packageManager\": \"pnpm@10.30.0\",\n \"peerDependencies\": {\n \"react\": \">=18\",\n \"react-native\": \">=0.74\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^25.5.2\",\n \"@types/react\": \"^19.1.0\",\n \"react\": \"^19.1.0\",\n \"react-native\": \"^0.81.5\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^6.0.2\",\n \"vitest\": \"^4.1.3\"\n }\n}\n","import React from 'react';\nimport { View, type ViewProps } from 'react-native';\n\n// Stable marker the future native module (PR 2) will look for when\n// traversing the view tree. `nativeID` is the cross-platform RN prop\n// that maps to iOS `accessibilityIdentifier` and Android `setTag()` —\n// exactly the channels the native side uses to locate masked nodes.\n// Exposing a component (rather than asking apps to remember a prop)\n// gives a single lintable wrapper for sensitive UI — text inputs,\n// avatars, financial numbers — even before native masking lands.\nexport const CLINTPLAY_MASK_ID = 'clintplay-mask';\n\nexport interface ClintplayMaskViewProps extends ViewProps {\n children?: React.ReactNode;\n}\n\nexport const ClintplayMaskView = React.forwardRef<\n View,\n ClintplayMaskViewProps\n>(function ClintplayMaskView(\n { children, testID, ...rest },\n ref,\n) {\n return (\n <View\n ref={ref}\n testID={testID ?? CLINTPLAY_MASK_ID}\n {...rest}\n collapsable={false}\n nativeID={CLINTPLAY_MASK_ID}\n >\n {children}\n </View>\n );\n});\n\n","import React from 'react';\nimport { TextInput, type TextInputProps } from 'react-native';\nimport { CLINTPLAY_MASK_ID } from './ClintplayMaskView';\n\nexport type ClintplayMaskTextInputProps = TextInputProps;\n\n// Drop-in replacement for `<TextInput>` whose subtree the native\n// module will mask when traversing the view hierarchy. Same props\n// surface as the upstream component — render it anywhere a TextInput\n// would go and the captured frame substitutes a blur (PR 2) for the\n// pixels.\n//\n// Implementation: we plant the `clintplay-mask` marker on `nativeID`\n// directly (rather than wrapping in `<ClintplayMaskView>`) so that\n// keyboard accessory views, autofocus, scroll-into-view behavior,\n// and other TextInput-specific semantics aren't disturbed by an\n// extra ancestor.\nexport const ClintplayMaskTextInput = React.forwardRef<\n TextInput,\n ClintplayMaskTextInputProps\n>(function ClintplayMaskTextInput({ testID, accessibilityLabel, ...props }, ref) {\n // Mask invariant must be sticky: spread first so caller-provided\n // props (including `nativeID` set for accessibility tagging) don't\n // silently strip the mask marker. The native module finds masked\n // subtrees by `nativeID === \"clintplay-mask\"` — losing it on this\n // wrapper would leak the field's pixels into the captured frame.\n return (\n <TextInput\n ref={ref}\n testID={testID ?? CLINTPLAY_MASK_ID}\n accessibilityLabel={accessibilityLabel}\n {...props}\n nativeID={CLINTPLAY_MASK_ID}\n />\n );\n});\n","import React from 'react';\nimport { Image, type ImageProps } from 'react-native';\nimport { CLINTPLAY_MASK_ID } from './ClintplayMaskView';\n\nexport type ClintplayMaskImageProps = ImageProps;\n\n// Drop-in replacement for `<Image>` whose pixels the native module\n// will redact at capture time. Use for avatars, document scans, CRM\n// screenshots, anything that may carry user PII in the bitmap.\n//\n// `expo-image` users: this wrapper still works as a render — the\n// native module's masking pass operates on the platform view tree, so\n// the underlying RN `<Image>` masking applies regardless of which JS\n// component composed it. If you need expo-image specifics, you can\n// alternatively wrap the call site in `<ClintplayMaskView>` and the\n// same nativeID marker is set.\nexport const ClintplayMaskImage = React.forwardRef<\n Image,\n ClintplayMaskImageProps\n>(function ClintplayMaskImage({ testID, accessibilityLabel, ...props }, ref) {\n // Mask invariant must be sticky: spread first so caller-provided\n // props (including `nativeID` set for accessibility tagging) don't\n // silently strip the mask marker. The native module finds masked\n // subtrees by `nativeID === \"clintplay-mask\"` — losing it here\n // would leak the avatar/document/screenshot pixels into the frame.\n return (\n <Image\n ref={ref}\n testID={testID ?? CLINTPLAY_MASK_ID}\n accessibilityLabel={accessibilityLabel}\n {...props}\n nativeID={CLINTPLAY_MASK_ID}\n />\n );\n});\n","import React, { useCallback } from 'react';\nimport {\n View,\n type GestureResponderEvent,\n type StyleProp,\n type ViewProps,\n type ViewStyle,\n} from 'react-native';\nimport { emit } from '../runtime-bridge';\n\nexport interface ClintplayCaptureProviderProps extends ViewProps {\n children?: React.ReactNode;\n style?: StyleProp<ViewStyle>;\n enabled?: boolean;\n}\n\n// Wraps the app root and observes touches WITHOUT claiming the\n// responder. `onTouchStart` and `onTouchEnd` are bubble-phase touch\n// events; they fire when the React tree dispatches the touch and DO\n// NOT participate in responder negotiation. App-side gesture\n// handlers, Touchables, PanResponders, etc. behave exactly as if\n// this wrapper weren't there.\n//\n// Note: RN's typed `ViewProps` exposes capture-phase variants only\n// for `onTouchEndCapture` (used by some back-press patterns) — there\n// is no public `onTouchStartCapture` prop. Bubble phase is the\n// documented, type-safe choice for observation.\n//\n// Mount once at the root of the navigation tree:\n//\n// <ClintplayCaptureProvider>\n// <Stack />\n// </ClintplayCaptureProvider>\n//\n// Coordinates are in the wrapper's coordinate space (locationX/Y is\n// child-relative when the event originates from a child). The player\n// reconstructs screen-relative positions by composing with the\n// emitted `screen` event's size.\nexport function ClintplayCaptureProvider({\n children,\n style,\n enabled = true,\n onTouchStart,\n onTouchEnd,\n onTouchCancel,\n ...rest\n}: ClintplayCaptureProviderProps) {\n const onStart = useCallback(\n (e: GestureResponderEvent) => {\n const nativeEvent = e?.nativeEvent;\n if (!nativeEvent) return;\n const { locationX = 0, locationY = 0, pageX, pageY } = nativeEvent;\n emit({\n type: 'touch',\n ts: Date.now(),\n x: locationX,\n y: locationY,\n screenX: pageX,\n screenY: pageY,\n kind: 'start',\n });\n onTouchStart?.(e);\n },\n [onTouchStart],\n );\n\n const onEnd = useCallback(\n (e: GestureResponderEvent) => {\n const nativeEvent = e?.nativeEvent;\n if (!nativeEvent) return;\n const { locationX = 0, locationY = 0, pageX, pageY } = nativeEvent;\n emit({\n type: 'touch',\n ts: Date.now(),\n x: locationX,\n y: locationY,\n screenX: pageX,\n screenY: pageY,\n kind: 'end',\n });\n onTouchEnd?.(e);\n },\n [onTouchEnd],\n );\n\n const onCancel = useCallback(\n (e: GestureResponderEvent) => {\n const nativeEvent = e?.nativeEvent;\n if (!nativeEvent) return;\n const { locationX = 0, locationY = 0, pageX, pageY } = nativeEvent;\n emit({\n type: 'touch',\n ts: Date.now(),\n x: locationX,\n y: locationY,\n screenX: pageX,\n screenY: pageY,\n kind: 'end',\n });\n onTouchCancel?.(e);\n },\n [onTouchCancel],\n );\n\n if (!enabled) return <>{children}</>;\n\n return (\n <View\n {...rest}\n style={[{ flex: 1 }, style]}\n onTouchStart={onStart}\n onTouchEnd={onEnd}\n onTouchCancel={onCancel}\n >\n {children}\n </View>\n );\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { emit } from '../runtime-bridge';\nimport {\n getActiveRouteName,\n sanitizeRoute,\n type NavigationStateListenerOptions,\n} from '../components/ClintplayNavigationTracker';\n\nexport interface UseClintplayNavigationOptions {\n /**\n * Initial previous route name if known.\n */\n from?: string;\n /**\n * Optional custom callback triggered on screen change.\n */\n onRouteChanged?: (to: string, from?: string) => void;\n}\n\nexport interface UseClintplayNavigationResult {\n (state: unknown): void;\n onStateChange: (state: unknown) => void;\n trackScreen: (to: string, from?: string) => void;\n}\n\n// Module-level shared route state to maintain transition context across distinct\n// hook instances (e.g. Expo Router screen-level components).\nlet sharedLastTrackedRoute: string | undefined = undefined;\n\n/**\n * Resets the shared last tracked route. Used primarily for test isolation.\n */\nexport function _resetLastTrackedRoute(): void {\n sharedLastTrackedRoute = undefined;\n}\n\n/**\n * Hook for automatic or manual screen tracking in React Native and Expo Router.\n *\n * Usage:\n *\n * 1. Screen-level tracking (Expo Router or per-screen):\n * ```tsx\n * const pathname = usePathname();\n * useClintplayNavigationTracking(pathname);\n * ```\n *\n * 2. NavigationContainer onStateChange helper:\n * ```tsx\n * const { onStateChange } = useClintplayNavigationTracking();\n * <NavigationContainer onStateChange={onStateChange} />\n * ```\n */\nexport function useClintplayNavigationTracking(\n routeNameOrPath?: string,\n options?: UseClintplayNavigationOptions,\n): UseClintplayNavigationResult {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const trackScreen = useCallback((to: string, from?: string) => {\n const cleanTo = sanitizeRoute(to);\n if (!cleanTo || cleanTo === sharedLastTrackedRoute) return;\n\n const cleanFrom = sanitizeRoute(from);\n const initialFrom = sanitizeRoute(optionsRef.current?.from);\n\n // If sharedLastTrackedRoute is set, that's our previous route across transitions.\n // Otherwise, use cleanFrom or initialFrom (provided initialFrom !== cleanTo, preventing deadlock).\n const previousRoute =\n cleanFrom ??\n sharedLastTrackedRoute ??\n (initialFrom && initialFrom !== cleanTo ? initialFrom : undefined);\n\n sharedLastTrackedRoute = cleanTo;\n\n emit({\n type: 'navigation',\n ts: Date.now(),\n to: cleanTo,\n ...(previousRoute ? { from: previousRoute } : {}),\n });\n\n try {\n optionsRef.current?.onRouteChanged?.(cleanTo, previousRoute);\n } catch {\n // CAND-47: User callback error must not crash navigation\n }\n }, []);\n\n useEffect(() => {\n const clean = sanitizeRoute(routeNameOrPath);\n if (clean && clean !== sharedLastTrackedRoute) {\n trackScreen(clean);\n }\n }, [routeNameOrPath, trackScreen]);\n\n const handleStateChange = useCallback(\n (state: unknown) => {\n const nextRoute = getActiveRouteName(state);\n if (nextRoute) {\n trackScreen(nextRoute);\n }\n },\n [trackScreen],\n );\n\n const result = Object.assign(handleStateChange, {\n onStateChange: handleStateChange,\n trackScreen,\n }) as UseClintplayNavigationResult;\n\n return result;\n}\n","import React, { useCallback, useRef } from 'react';\nimport { emit } from '../runtime-bridge';\nimport { useClintplayNavigationTracking } from '../hooks/useClintplayNavigation';\n\nexport interface NavigationRouteLike {\n key?: string;\n name?: string;\n params?: Record<string, unknown>;\n state?: NavigationStateLike | unknown;\n}\n\nexport interface NavigationStateLike {\n key?: string;\n index?: number;\n routes?: NavigationRouteLike[];\n routeNames?: string[];\n [key: string]: unknown;\n}\n\nexport type NavigationStateListenerCallback = (\n to: string,\n from?: string,\n) => void;\n\nexport interface NavigationStateListenerOptions {\n /**\n * Initial previous route name if known.\n */\n initialRouteName?: string;\n /**\n * Optional custom callback invoked when the route changes.\n */\n onRouteChanged?: NavigationStateListenerCallback;\n}\n\n/**\n * Sanitizes a route name or pathname by stripping query parameters (?token=...)\n * and fragments (#section...).\n */\nexport function sanitizeRoute(route?: string): string | undefined {\n if (!route || typeof route !== 'string') return undefined;\n const clean = route.split(/[?#]/)[0];\n return clean || undefined;\n}\n\n/**\n * Traverses a nested React Navigation state tree to extract the active leaf route name.\n */\nexport function getActiveRouteName(state: unknown, depth = 0): string | undefined {\n if (depth > 20) return undefined;\n\n if (!state || typeof state !== 'object') {\n return undefined;\n }\n\n const s = state as NavigationStateLike;\n if (!Array.isArray(s.routes) || s.routes.length === 0) {\n if (typeof (s as any).name === 'string') {\n return (s as any).name;\n }\n return undefined;\n }\n\n const index =\n typeof s.index === 'number' && s.index >= 0 && s.index < s.routes.length\n ? s.index\n : s.routes.length - 1;\n\n const currentRoute = s.routes[index];\n if (!currentRoute) return undefined;\n\n if (currentRoute.state) {\n if (depth >= 20) return undefined;\n const childRoute = getActiveRouteName(currentRoute.state, depth + 1);\n if (childRoute !== undefined) {\n return childRoute;\n }\n const childState = currentRoute.state as NavigationStateLike;\n if (\n childState &&\n typeof childState === 'object' &&\n (!Array.isArray(childState.routes) || childState.routes.length === 0)\n ) {\n return currentRoute.name;\n }\n return undefined;\n }\n\n return currentRoute.name;\n}\n\n/**\n * Creates an `onStateChange` listener for React Navigation's `<NavigationContainer>`.\n * Automatically extracts the active leaf screen name and emits a `navigation` event\n * while preventing duplicate consecutive emissions.\n */\nexport function createClintplayNavigationStateListener(\n options?: NavigationStateListenerOptions | NavigationStateListenerCallback,\n): (state: unknown) => void {\n const opts: NavigationStateListenerOptions =\n typeof options === 'function' ? { onRouteChanged: options } : options ?? {};\n\n let currentRoute: string | undefined = undefined;\n const initialRoute = sanitizeRoute(opts.initialRouteName);\n let isFirst = true;\n\n return function onStateChange(state: unknown) {\n const rawRoute = getActiveRouteName(state);\n const nextRoute = sanitizeRoute(rawRoute);\n if (!nextRoute) return;\n\n if (isFirst) {\n isFirst = false;\n const from = initialRoute && initialRoute !== nextRoute ? initialRoute : undefined;\n currentRoute = nextRoute;\n\n emit({\n type: 'navigation',\n ts: Date.now(),\n to: nextRoute,\n ...(from ? { from } : {}),\n });\n\n try {\n opts.onRouteChanged?.(nextRoute, from);\n } catch {\n // CAND-47: User callback error must not crash navigation\n }\n return;\n }\n\n if (nextRoute === currentRoute) return;\n\n const previousRoute = currentRoute;\n currentRoute = nextRoute;\n\n emit({\n type: 'navigation',\n ts: Date.now(),\n to: nextRoute,\n ...(previousRoute ? { from: previousRoute } : {}),\n });\n\n try {\n opts.onRouteChanged?.(nextRoute, previousRoute);\n } catch {\n // CAND-47: User callback error must not crash navigation\n }\n };\n}\n\nexport interface ClintplayNavigationTrackerProps {\n children?:\n | React.ReactNode\n | ((props: { onStateChange: (state: unknown) => void }) => React.ReactNode);\n pathname?: string;\n onStateChange?: (state: unknown) => void;\n initialRouteName?: string;\n onRouteChanged?: NavigationStateListenerCallback;\n}\n\n/**\n * Navigation tracker component for React Navigation and Expo Router.\n * Can be used as a wrapper, helper, or render-prop provider around `<NavigationContainer>`,\n * or as a standalone tracker component `<ClintplayNavigationTracker pathname={pathname} />`.\n */\nexport function ClintplayNavigationTracker({\n children,\n pathname,\n onStateChange,\n initialRouteName,\n onRouteChanged,\n}: ClintplayNavigationTrackerProps) {\n const tracking = useClintplayNavigationTracking(pathname, {\n from: initialRouteName,\n onRouteChanged,\n });\n\n const handleStateChange = useCallback(\n (state: unknown) => {\n tracking.onStateChange(state);\n try {\n onStateChange?.(state);\n } catch {\n // Guard against errors in user onStateChange\n }\n },\n [tracking, onStateChange],\n );\n\n const childOnStateChangeRef = useRef<((state: unknown) => void) | undefined>(undefined);\n\n const mergedOnStateChange = useCallback(\n (state: unknown) => {\n handleStateChange(state);\n try {\n childOnStateChangeRef.current?.(state);\n } catch {\n // Guard against errors in child onStateChange\n }\n },\n [handleStateChange],\n );\n\n if (typeof children === 'function') {\n return <>{children({ onStateChange: handleStateChange })}</>;\n }\n\n if (React.isValidElement(children)) {\n childOnStateChangeRef.current = (children.props as any)?.onStateChange;\n return React.cloneElement(children as React.ReactElement<any>, {\n onStateChange: mergedOnStateChange,\n });\n }\n\n if (Array.isArray(children) || (children && React.Children.count(children) > 1)) {\n let targetIndex = -1;\n let firstValidIndex = -1;\n let scanIndex = 0;\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n if (firstValidIndex === -1) {\n firstValidIndex = scanIndex;\n }\n if (\n typeof (child.props as any)?.onStateChange === 'function' &&\n targetIndex === -1\n ) {\n targetIndex = scanIndex;\n }\n }\n scanIndex++;\n });\n\n const chosenIndex = targetIndex !== -1 ? targetIndex : firstValidIndex;\n let mapIndex = 0;\n\n const clonedChildren = React.Children.map(children, (child) => {\n const currentIdx = mapIndex++;\n if (!React.isValidElement(child)) return child;\n\n if (currentIdx === chosenIndex) {\n childOnStateChangeRef.current = (child.props as any)?.onStateChange;\n return React.cloneElement(child as React.ReactElement<any>, {\n onStateChange: mergedOnStateChange,\n });\n }\n\n return child;\n });\n\n return <>{clonedChildren}</>;\n }\n\n return <>{children ?? null}</>;\n}\n","import { Platform } from 'react-native';\nimport { EventBuffer } from './buffer';\nimport { SessionManager } from './session';\nimport { Transport } from './transport';\nimport { createRecorder, type Recorder } from './recorder';\nimport { NetworkInterceptor } from './modules/network-interceptor';\nimport { ConsoleInterceptor } from './modules/console-interceptor';\nimport { OfflineQueue } from './modules/offline-queue';\nimport { _setSink } from './runtime-bridge';\nimport { captureViewHierarchy } from './native';\nimport type {\n BackendEvent,\n ClintplayReactNativeConfig,\n DeviceInfo,\n EventType,\n ReplayBatch,\n ReplayEvent,\n WireframeEvent,\n WireframeNode,\n} from './types';\nimport { version as pkgVersion } from '../package.json';\n\n// Source of truth is package.json — tsup inlines the value at build\n// time (mirrors `packages/sdk/src/index.ts`). Avoids drift between the\n// shipped wire-format tag and the npm version.\nexport const SDK_VERSION = pkgVersion;\n\ninterface InternalConfig {\n apiUrl: string;\n apiKey?: string;\n projectId: string;\n anonId?: string;\n flushIntervalMs: number;\n flushSize: number;\n maxBufferSize: number;\n debug: boolean;\n captureWireframe: boolean;\n}\n\ninterface RuntimeState {\n config: InternalConfig;\n buffer: EventBuffer;\n session: SessionManager;\n transport: Transport;\n recorder: Recorder;\n networkInterceptor: NetworkInterceptor | null;\n consoleInterceptor: ConsoleInterceptor | null;\n offlineQueue: OfflineQueue | null;\n flushTimer: ReturnType<typeof setInterval> | null;\n excluded: ReadonlySet<EventType>;\n active: boolean;\n}\n\nlet state: RuntimeState | null = null;\n\nfunction deviceInfo(): DeviceInfo {\n const os = Platform.OS;\n const platform: DeviceInfo['platform'] =\n os === 'ios' ? 'ios' : os === 'android' ? 'android' : 'web';\n return { platform, osVersion: String(Platform.Version ?? '') };\n}\n\nfunction debugLog(cfg: InternalConfig, ...args: unknown[]): void {\n if (!cfg.debug) return;\n if (typeof console !== 'undefined' && console.log) {\n console.log('[clintplay-rn]', ...args);\n }\n}\n\nexport function formatEventForBatch(\n event: ReplayEvent | BackendEvent,\n defaultSessionId: string,\n): BackendEvent {\n const ev = event as any;\n const timestamp =\n typeof ev.timestamp === 'number'\n ? ev.timestamp\n : typeof ev.ts === 'number'\n ? ev.ts\n : Date.now();\n const sessionId = ev.sessionId || defaultSessionId;\n const type = ev.type;\n\n if (ev.data !== undefined) {\n return {\n type,\n timestamp,\n sessionId,\n data: ev.data,\n };\n }\n\n const { type: _t, ts: _ts, timestamp: _tms, sessionId: _s, ...rest } = ev;\n return {\n type,\n timestamp,\n sessionId,\n data: rest,\n };\n}\n\nasync function flushOnce(s: RuntimeState): Promise<void> {\n try {\n if (s.buffer.size() === 0) return;\n const currentSessionId = s.session.current().sessionId;\n const rawEvents = s.buffer.drain();\n const events: BackendEvent[] = rawEvents.map((e) =>\n formatEventForBatch(e, currentSessionId),\n );\n const batch: ReplayBatch = {\n projectId: s.config.projectId,\n sessionId: currentSessionId,\n sdkVersion: SDK_VERSION,\n events,\n sentAt: Date.now(),\n ...(s.config.anonId ? { anonId: s.config.anonId } : {}),\n };\n const ok = await s.transport.send(batch);\n if (!ok && s.offlineQueue) {\n // Live send failed AND the consumer wired AsyncStorage — persist\n // for next boot's drain. Without a queue we'd silently drop these\n // events; with one we trade a bit of disk for crash-resilience.\n await s.offlineQueue.persist(batch);\n }\n debugLog(s.config, ok ? 'flushed' : 'flush failed', events.length);\n } catch (err) {\n debugLog(s.config, 'flush failed with error', String(err));\n }\n}\n\nfunction init(rawConfig: ClintplayReactNativeConfig): typeof Clintplay {\n if (state?.active) return Clintplay;\n const apiUrl = rawConfig.apiUrl ?? rawConfig.endpoint;\n if (!apiUrl) return Clintplay;\n if (rawConfig.enabled === false) return Clintplay;\n\n const sampleRate = rawConfig.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() > sampleRate) return Clintplay;\n\n const config: InternalConfig = {\n apiUrl,\n apiKey: rawConfig.apiKey,\n projectId: rawConfig.projectId ?? rawConfig.apiKey ?? '',\n anonId: rawConfig.anonId,\n flushIntervalMs: rawConfig.flushIntervalMs ?? 5000,\n flushSize: rawConfig.flushSize ?? 50,\n maxBufferSize: rawConfig.maxBufferSize ?? 1000,\n debug: rawConfig.debug ?? false,\n captureWireframe: rawConfig.captureWireframe ?? false,\n };\n\n const buffer = new EventBuffer(config.maxBufferSize);\n const session = new SessionManager();\n const transport = new Transport({\n apiUrl: config.apiUrl,\n apiKey: config.apiKey,\n projectId: config.projectId,\n });\n\n const excluded = new Set<EventType>(rawConfig.excludeEventTypes ?? []);\n\n // Bootstrap the runtime ref so onEvent / interval callbacks can\n // observe a coherent state object even when fired during init.\n const local: RuntimeState = {\n config,\n buffer,\n session,\n transport,\n recorder: { start: () => {}, stop: () => {}, takeWireframeSnapshot: () => {} },\n networkInterceptor: null,\n consoleInterceptor: null,\n offlineQueue: rawConfig.asyncStorage\n ? new OfflineQueue({\n storage: rawConfig.asyncStorage,\n send: (b) => transport.sendDetailed(b),\n debug: (msg) => debugLog(config, msg),\n })\n : null,\n flushTimer: null,\n excluded,\n active: true,\n };\n // Publish to the module-level ref before any side-effectful bootstrap\n // step so a concurrent init() call observes `state.active === true`\n // and bails on the first guard above. Without this, two rapid init()s\n // would each install their own AppState/Dimensions listeners and\n // their own flush timer, leaking the first set when the second wins\n // the final `state = local` assignment.\n state = local;\n\n const onEvent = (event: ReplayEvent) => {\n if (excluded.has(event.type)) return;\n buffer.push(event);\n session.touch();\n if (buffer.size() >= config.flushSize) {\n void flushOnce(local);\n }\n };\n\n const recorder = createRecorder({\n onEvent,\n now: Date.now,\n installErrorHandler: true,\n captureWireframe: rawConfig.captureWireframe,\n wireframeIntervalMs: rawConfig.wireframeIntervalMs,\n captureViewHierarchy,\n });\n local.recorder = recorder;\n\n // Network on by default (high value, low overhead). Console opt-in\n // because warn/error chatter is noisy in the typical RN app and the\n // wire-format cost adds up fast in busy components.\n if (rawConfig.captureNetwork !== false) {\n local.networkInterceptor = new NetworkInterceptor({\n onEvent,\n now: Date.now,\n sanitizeUrl: rawConfig.sanitizeUrl,\n apiUrl: config.apiUrl,\n });\n }\n if (rawConfig.captureConsole === true) {\n local.consoleInterceptor = new ConsoleInterceptor({\n onEvent,\n now: Date.now,\n captureConsoleLog: rawConfig.captureConsoleLog,\n });\n }\n\n buffer.push({\n type: 'meta',\n ts: Date.now(),\n sessionId: session.current().sessionId,\n sdkVersion: SDK_VERSION,\n device: deviceInfo(),\n });\n\n recorder.start();\n local.networkInterceptor?.start();\n local.consoleInterceptor?.start();\n // Components (ClintplayCaptureProvider etc.) emit through the\n // runtime bridge; register the sink so they reach the live buffer.\n _setSink(onEvent);\n\n // Replay anything the previous session was unable to deliver. Fire\n // and forget — we explicitly do NOT await here so a hung network\n // can't block the rest of init / the app's first paint. The catch\n // is load-bearing: without it, a rejection inside `hydrate()` /\n // `drain()` becomes an unhandled promise rejection that the host\n // app's error reporter (Sentry) flags as a real bug.\n if (local.offlineQueue) {\n const q = local.offlineQueue;\n void q\n .hydrate()\n .then(() => q.drain())\n .catch((err) =>\n debugLog(config, 'offline queue init failed', String(err)),\n );\n }\n\n local.flushTimer = setInterval(async () => {\n // Idle-rotate the session if stale. Flush pending buffer for the\n // current session FIRST so pre-idle tail events are not misattributed\n // to the new session ID.\n if (local.session.isStale()) {\n await flushOnce(local);\n if (local.session.rotateIfStale()) {\n local.buffer.push({\n type: 'meta',\n ts: Date.now(),\n sessionId: local.session.current().sessionId,\n sdkVersion: SDK_VERSION,\n device: deviceInfo(),\n });\n }\n }\n void flushOnce(local);\n }, config.flushIntervalMs);\n\n debugLog(config, 'init', { sessionId: session.current().sessionId });\n return Clintplay;\n}\n\nfunction identify(\n userId: string | number | null,\n traits?: Record<string, unknown>,\n): void {\n if (!state?.active) return;\n if (userId === undefined || userId === '') return;\n const normalizedUserId = userId === null ? null : String(userId);\n const prevUser = state.session.current().userId;\n const isUserChange =\n prevUser !== null && (normalizedUserId === null || prevUser !== normalizedUserId);\n if (isUserChange) {\n void flushOnce(state);\n }\n const rotated = state.session.setUser(normalizedUserId);\n if (rotated) {\n state.buffer.push({\n type: 'meta',\n ts: Date.now(),\n sessionId: state.session.current().sessionId,\n sdkVersion: SDK_VERSION,\n device: deviceInfo(),\n });\n }\n state.buffer.push({\n type: 'identify',\n ts: Date.now(),\n data: {\n userId: normalizedUserId,\n traits: traits ?? {},\n },\n });\n}\n\nfunction reset(options?: { clearOfflineQueue?: boolean }): void {\n if (!state?.active) return;\n void flushOnce(state);\n state.session.reset();\n if (options?.clearOfflineQueue && state.offlineQueue) {\n void state.offlineQueue.clear();\n }\n state.buffer.push({\n type: 'meta',\n ts: Date.now(),\n sessionId: state.session.current().sessionId,\n sdkVersion: SDK_VERSION,\n device: deviceInfo(),\n });\n}\n\nfunction trackScreen(path: string, from?: string): void {\n if (!state?.active) return;\n state.buffer.push({\n type: 'navigation',\n ts: Date.now(),\n to: path,\n ...(from ? { from } : {}),\n });\n state.session.touch();\n if (state.config.captureWireframe) {\n state.recorder.takeWireframeSnapshot();\n }\n}\n\nfunction reportError(err: unknown): void {\n if (!state?.active) return;\n const error = err instanceof Error ? err : new Error(String(err));\n state.buffer.push({\n type: 'error',\n ts: Date.now(),\n message: error.message,\n stack: error.stack,\n name: error.name,\n fatal: false,\n });\n}\n\nasync function flush(): Promise<void> {\n if (!state?.active) return;\n await flushOnce(state);\n}\n\nasync function stop(): Promise<void> {\n if (!state?.active) return;\n const s = state;\n s.active = false;\n state = null;\n _setSink(null);\n if (s.flushTimer) clearInterval(s.flushTimer);\n s.consoleInterceptor?.stop();\n s.networkInterceptor?.stop();\n s.recorder.stop();\n await flushOnce(s);\n}\n\nfunction current(): { sessionId: string; userId: string | null } | null {\n if (!state?.active) return null;\n const s = state.session.current();\n return { sessionId: s.sessionId, userId: s.userId };\n}\n\nfunction _getState() {\n if (!state) return null;\n return {\n ...state,\n buffer: state.buffer.peek(),\n };\n}\n\nexport const Clintplay = {\n init,\n identify,\n reset,\n trackScreen,\n reportError,\n flush,\n stop,\n current,\n _getState,\n};\n\nexport { init };\n\nexport {\n ClintplayMaskView,\n CLINTPLAY_MASK_ID,\n type ClintplayMaskViewProps,\n} from './components/ClintplayMaskView';\nexport {\n ClintplayMaskTextInput,\n type ClintplayMaskTextInputProps,\n} from './components/ClintplayMaskTextInput';\nexport {\n ClintplayMaskImage,\n type ClintplayMaskImageProps,\n} from './components/ClintplayMaskImage';\nexport {\n ClintplayCaptureProvider,\n type ClintplayCaptureProviderProps,\n} from './components/ClintplayCaptureProvider';\nexport {\n ClintplayNavigationTracker,\n createClintplayNavigationStateListener,\n getActiveRouteName,\n sanitizeRoute,\n type ClintplayNavigationTrackerProps,\n type NavigationStateListenerOptions,\n type NavigationStateListenerCallback,\n type NavigationRouteLike,\n type NavigationStateLike,\n} from './components/ClintplayNavigationTracker';\nexport {\n useClintplayNavigationTracking,\n _resetLastTrackedRoute,\n type UseClintplayNavigationOptions,\n type UseClintplayNavigationResult,\n} from './hooks/useClintplayNavigation';\nexport type {\n BackendEvent,\n ReplayEvent,\n ClintplayReactNativeConfig,\n DeviceInfo,\n ReplayBatch,\n WireframeEvent,\n WireframeNode,\n} from './types';\n"]}
|