why-hydration 0.1.1 → 0.1.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/env.ts","../src/core/diff.ts","../src/core/classify/detectors.ts","../src/core/classify/rules.ts","../src/core/classify/index.ts","../src/core/report.ts","../src/core/react-message.ts","../src/core/inspect.ts"],"names":["path","pairs","i","j"],"mappings":";;;AAAO,IAAM,KAAA,GACX,OAAO,OAAA,KAAY,WAAA,IACnB,QAAQ,GAAA,IAAO,IAAA,IACf,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa;;;ACD3B,IAAM,kBAAA,mBAAqB,IAAI,GAAA,CAAY,CAAC,gBAAgB,CAAC,CAAA;AAEtD,SAAS,eAAA,CAAgB,MAAc,WAAA,EAA8B;AAC1E,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,WAAA,IAAe,KAAK,CAAA;AAC7D,EAAA,SAAA,CAAU,SAAA,GAAY,IAAA;AACtB,EAAA,OAAO,SAAA;AACT;AASO,SAAS,kBAAA,CACd,UAAA,EACA,UAAA,EACA,KAAA,GAAQ,EAAA,EACM;AACd,EAAA,MAAM,MAAoB,EAAC;AAC3B,EAAA,eAAA,CAAgB,YAAY,UAAA,EAAY,OAAA,CAAQ,UAAU,CAAA,EAAG,KAAK,KAAK,CAAA;AACvE,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,yBAAA,CACd,UAAA,EACA,UAAA,EACA,KAAA,GAAQ,EAAA,EACM;AACd,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,UAAA,EAAY,UAAA,CAAW,OAAO,CAAA;AACjE,EAAA,OAAO,kBAAA,CAAmB,UAAA,EAAY,UAAA,EAAY,KAAK,CAAA;AACzD;AAGO,SAAS,SAAA,CACd,YACA,UAAA,EACmB;AACnB,EAAA,OAAO,mBAAmB,UAAA,EAAY,UAAA,EAAY,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAC7D;AAEO,SAAS,sBAAA,CACd,YACA,UAAA,EACmB;AACnB,EAAA,OAAO,0BAA0B,UAAA,EAAY,UAAA,EAAY,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AACpE;AAEA,SAAS,eAAA,CACP,YAAA,EACA,YAAA,EACA,UAAA,EACA,KACA,KAAA,EACM;AACN,EAAA,IAAI,GAAA,CAAI,UAAU,KAAA,EAAO;AACzB,EAAA,MAAM,cAAA,GAAiB,qBAAqB,YAAY,CAAA;AACxD,EAAA,MAAM,cAAA,GAAiB,qBAAqB,YAAY,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,mBAAmB,YAAY,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,WAAW,YAAY,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,cAAA,EAAgB,cAAc,CAAA;AAE1D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,GAAA,CAAI,UAAU,KAAA,EAAO;AACzB,IAAA,MAAM,CAAC,UAAA,EAAY,UAAU,CAAA,GAAI,MAAM,CAAC,CAAA;AAIxC,IAAA,IAAI,cAAc,CAAC,UAAA,IAAc,CAAA,GAAI,CAAA,GAAI,MAAM,MAAA,EAAQ;AACrD,MAAA,MAAM,CAAC,UAAA,EAAY,UAAU,CAAA,GAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AAC5C,MAAA,IAAI,CAAC,UAAA,IAAc,UAAA,IAAc,CAAC,mBAAA,CAAoB,UAAU,CAAA,EAAG;AACjE,QAAA,MAAMA,KAAAA,GAAO,SAAA,CAAU,UAAA,EAAY,UAAA,EAAY,KAAK,CAAA;AACpD,QAAA,KAAA,IAAS,CAAA;AACT,QAAA,CAAA,IAAK,CAAA;AACL,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,IAAA,EAAM,WAAA;AAAA,UACN,IAAA,EAAAA,KAAAA;AAAA,UACA,OAAA,EAAS,WAAW,UAAU,CAAA;AAAA,UAC9B,aAAA,EAAe,SAAA;AAAA,UACf,MAAA,EAAQ,UAAU,UAAU,CAAA;AAAA,UAC5B,MAAA,EAAQ,UAAU,UAAU,CAAA;AAAA,UAC5B,OAAA,EAAS,UAAU,UAAU;AAAA,SAC9B,CAAA;AACD,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,UAAA,IAAc,UAAA;AAC7B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,UAAA,EAAY,MAAA,EAAQ,KAAK,CAAA;AAChD,IAAA,KAAA,IAAS,CAAA;AAET,IAAA,IAAI,UAAA,IAAc,CAAC,UAAA,EAAY;AAE7B,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,IAAA;AAAA,QACA,OAAA,EAAS,WAAW,UAAU,CAAA;AAAA,QAC9B,aAAA,EAAe,SAAA;AAAA,QACf,MAAA,EAAQ,UAAU,UAAU,CAAA;AAAA,QAC5B,MAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS,UAAU,YAAY;AAAA,OAChC,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,CAAC,UAAA,IAAc,UAAA,EAAY;AAGpC,MAAA,IAAI,mBAAA,CAAoB,UAAU,CAAA,EAAG;AACrC,MAAA,IAAI,UAAA,CAAW,QAAA,KAAa,IAAA,CAAK,YAAA,IAAgB,aAAA,EAAe;AAChE,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,YAAA;AAAA,QACN,IAAA;AAAA,QACA,OAAA,EAAS,WAAW,UAAU,CAAA;AAAA,QAC9B,aAAA,EAAe,SAAA;AAAA,QACf,MAAA,EAAQ,IAAA;AAAA,QACR,MAAA,EAAQ,UAAU,UAAU,CAAA;AAAA,QAC5B,OAAA,EAAS,UAAU,UAAU;AAAA,OAC9B,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,cAAc,UAAA,EAAY;AACnC,MAAA,WAAA,CAAY,UAAA,EAAY,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,KAAK,KAAK,CAAA;AAAA,IACjE;AAAA,EACF;AACF;AAEA,SAAS,YACP,UAAA,EACA,UAAA,EACA,IAAA,EACA,SAAA,EACA,KACA,KAAA,EACM;AACN,EAAA,IAAI,UAAA,CAAW,QAAA,KAAa,UAAA,CAAW,QAAA,EAAU;AAC/C,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,IAAA,EAAM,WAAA;AAAA,MACN,IAAA;AAAA,MACA,OAAA,EAAS,WAAW,UAAU,CAAA;AAAA,MAC9B,aAAA,EAAe,SAAA;AAAA,MACf,MAAA,EAAQ,UAAU,UAAU,CAAA;AAAA,MAC5B,MAAA,EAAQ,UAAU,UAAU,CAAA;AAAA,MAC5B,OAAA,EAAS,UAAU,UAAU;AAAA,KAC9B,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,IACE,WAAW,QAAA,KAAa,IAAA,CAAK,aAC7B,UAAA,CAAW,QAAA,KAAa,KAAK,YAAA,EAC7B;AACA,IAAA,MAAM,UAAA,GAAa,WAAW,WAAA,IAAe,EAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,WAAW,WAAA,IAAe,EAAA;AAC7C,IAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,MAAA;AAAA,QACN,IAAA;AAAA,QACA,aAAA,EAAe,SAAA;AAAA,QACf,MAAA,EAAQ,UAAA;AAAA,QACR,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS,SAAA,CAAU,UAAA,CAAW,UAAU;AAAA,OACzC,CAAA;AAAA,IACH;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AAC7C,IAAA,MAAM,QAAA,GAAW,UAAA;AACjB,IAAA,MAAM,QAAA,GAAW,UAAA;AAEjB,IAAA,IAAI,QAAA,CAAS,OAAA,KAAY,QAAA,CAAS,OAAA,EAAS;AACzC,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,WAAA;AAAA,QACN,IAAA;AAAA,QACA,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,aAAA,EAAe,SAAA;AAAA,QACf,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,QAC1B,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,QAC1B,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,QAAA,EAAU,QAAA,EAAU,MAAM,SAAS,CAAA;AACzE,IAAA,IAAI,cAAA,EAAgB,GAAA,CAAI,IAAA,CAAK,cAAc,CAAA;AAE3C,IAAA,eAAA,CAAgB,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,GAAA,EAAK,KAAK,CAAA;AAAA,EACtD;AACF;AAEA,SAAS,cAAA,CACP,QAAA,EACA,QAAA,EACA,IAAA,EACA,SAAA,EACmB;AACnB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACjE,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAEjE,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,kBAAA,CAAmB,GAAA,CAAI,IAAI,CAAA,EAAG;AAClC,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA;AAC9C,IAAA,IAAI,cAAc,IAAA,EAAM,WAAW,MAAM,aAAA,CAAc,IAAA,EAAM,WAAW,CAAA,EAAG;AACzE,MAAA;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA;AAAA,MACN,IAAA;AAAA,MACA,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,aAAA,EAAe,SAAA;AAAA,MACf,SAAA,EAAW,IAAA;AAAA,MACX,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAA,CAAc,MAAc,KAAA,EAAqC;AACxE,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAC1B,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,EAClE;AACA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAO,eAAe,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU,KAAA;AACnB,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAC5B,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,IAAI,CAAA,CAAA,EAAI,GAAG,KAAA,CAAM,gBAAA,CAAiB,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACzD;AACA,MAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,MACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,EACnB,MAAA,CAAO,OAAO,EACd,IAAA,EAAK,CACL,KAAK,GAAG,CAAA;AACb;AAIA,SAAS,QAAQ,IAAA,EAAoB;AACnC,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACvC,IAAA,MAAM,EAAA,GAAK,IAAA;AACX,IAAA,OAAO,EAAA,CAAG,KAAK,CAAA,EAAG,EAAA,CAAG,OAAO,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAA,CAAA,GAAK,EAAA,CAAG,OAAA;AAAA,EAC/C;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,SAAA,EAAW,OAAO,OAAA;AAC7C,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,aAAA,CACP,QACA,MAAA,EACmC;AACnC,EAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,EAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,EAAA,IAAI,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,CAAA,IAAK,CAAA,GAAI,OAAO,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,CAAA,GAAI,GAAA,EAAO;AAC7D,IAAA,MAAMC,SAA2C,EAAC;AAClD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AACzB,IAAA,KAAA,IAASC,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAI,GAAA,EAAKA,EAAAA,EAAAA,EAAK;AAC5B,MAAAD,MAAAA,CAAM,IAAA,CAAK,CAAC,MAAA,CAAOC,EAAC,CAAA,IAAK,IAAA,EAAM,MAAA,CAAOA,EAAC,CAAA,IAAK,IAAI,CAAC,CAAA;AAAA,IACnD;AACA,IAAA,OAAOD,MAAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAC7B,EAAA,MAAM,KAAiB,KAAA,CAAM,IAAA;AAAA,IAAK,EAAE,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAE;AAAA,IAAG,MACnD,IAAI,KAAA,CAAM,IAAI,CAAC,CAAA,CAAE,KAAK,CAAC;AAAA,GACzB;AACA,EAAA,KAAA,IAASC,EAAAA,GAAI,CAAA,GAAI,CAAA,EAAGA,EAAAA,IAAK,GAAGA,EAAAA,EAAAA,EAAK;AAC/B,IAAA,KAAA,IAASC,EAAAA,GAAI,CAAA,GAAI,CAAA,EAAGA,EAAAA,IAAK,GAAGA,EAAAA,EAAAA,EAAK;AAC/B,MAAA,EAAA,CAAGD,EAAC,CAAA,CAAGC,EAAC,CAAA,GACN,EAAA,CAAGD,EAAC,CAAA,KAAM,EAAA,CAAGC,EAAC,CAAA,GACV,EAAA,CAAGD,EAAAA,GAAI,CAAC,CAAA,CAAGC,EAAAA,GAAI,CAAC,CAAA,GAAK,CAAA,GACrB,IAAA,CAAK,GAAA,CAAI,EAAA,CAAGD,KAAI,CAAC,CAAA,CAAGC,EAAC,CAAA,EAAI,EAAA,CAAGD,EAAC,CAAA,CAAGC,EAAAA,GAAI,CAAC,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,MAAM,QAA2C,EAAC;AAClD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AACrB,IAAA,IAAI,EAAA,CAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,EAAG;AACnB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,MAAA,CAAO,CAAC,GAAI,MAAA,CAAO,CAAC,CAAE,CAAC,CAAA;AACnC,MAAA,CAAA,EAAA;AACA,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,EAAA,CAAG,CAAA,GAAI,CAAC,CAAA,CAAG,CAAC,CAAA,IAAM,EAAA,CAAG,CAAC,CAAA,CAAG,CAAA,GAAI,CAAC,CAAA,EAAI;AAC3C,MAAA,KAAA,CAAM,KAAK,CAAC,MAAA,CAAO,CAAC,CAAA,EAAI,IAAI,CAAC,CAAA;AAC7B,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,CAAC,IAAA,EAAM,MAAA,CAAO,CAAC,CAAE,CAAC,CAAA;AAC7B,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,CAAA,GAAI,GAAG,KAAA,CAAM,IAAA,CAAK,CAAC,MAAA,CAAO,CAAA,EAAG,CAAA,EAAI,IAAI,CAAC,CAAA;AAC7C,EAAA,OAAO,CAAA,GAAI,GAAG,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,EAAM,MAAA,CAAO,CAAA,EAAG,CAAE,CAAC,CAAA;AAC7C,EAAA,OAAO,KAAA;AACT;AAIA,IAAM,UAAA,uBAAiB,GAAA,CAAY;AAAA,EACjC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,cAAA,GACJ,8MAAA;AAIF,IAAM,eAAA,GACJ,0MAAA;AAEF,SAAS,yBAAyB,EAAA,EAAsB;AACtD,EAAA,MAAM,WAAW,CAAA,EAAG,EAAA,CAAG,YAAA,CAAa,MAAM,KAAK,EAAE,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,IACxD,OAAO,EAAA,CAAG,cAAc,QAAA,GAAW,EAAA,CAAG,YAAY,EACpD,CAAA,CAAA;AACA,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,IAAA;AAC1C,EAAA,IAAI,EAAA,CAAG,YAAY,QAAA,EAAU;AAC3B,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA;AACtC,IAAA,MAAM,SAAS,EAAA,CAAG,YAAA,CAAa,OAAO,CAAA,IAAK,IAAI,WAAA,EAAY;AAC3D,IAAA,MAAM,MAAA,GACJ,oBAAA,CAAqB,IAAA,CAAK,KAAK,CAAA,IAC/B,0BAA0B,IAAA,CAAK,KAAK,CAAA,IACpC,8BAAA,CAA+B,IAAA,CAAK,KAAK,KACzC,mCAAA,CAAoC,IAAA,CAAK,KAAK,CAAA,IAC9C,EAAA,CAAG,YAAA,CAAa,QAAQ,CAAA,IACxB,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA,KAAM,MAAA;AACrC,IAAA,IAAI,GAAA,KAAQ,aAAA,IAAiB,MAAA,EAAQ,OAAO,IAAA;AAAA,EAC9C;AACA,EAAA,OAAO,KAAA;AACT;AAIA,SAAS,oBAAoB,IAAA,EAAqB;AAChD,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc,OAAO,KAAA;AAChD,EAAA,MAAM,EAAA,GAAK,IAAA;AACX,EAAA,IAAI,cAAA,CAAe,EAAE,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,MAAM,OAAO,EAAA,CAAG,SAAA,KAAc,QAAA,GAAW,GAAG,SAAA,GAAY,EAAA;AAC9D,EAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA,EAAG,OAAO,IAAA;AACpD,EAAA,IAAI,EAAA,CAAG,YAAA,CAAa,WAAW,CAAA,EAAG,OAAO,IAAA;AACzC,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA;AACnC,EAAA,IAAI,QAAQ,6CAAA,CAA8C,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,EAAA,CAAG,QAAQ,QAAA,CAAS,SAAS,KAAK,EAAA,CAAG,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AACrE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,UAAU,CAAA,EAAG;AAC5C,IAAA,IAAI,sCAAA,CAAuC,IAAA,CAAK,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAAA,EACrE;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,IAAA,EAAqB;AAC3C,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc,OAAO,KAAA;AAChD,EAAA,MAAM,EAAA,GAAK,IAAA;AACX,EAAA,IAAI,EAAA,CAAG,YAAA,CAAa,oBAAoB,CAAA,EAAG,OAAO,IAAA;AAClD,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,EAAA,CAAG,OAAO,GAAG,OAAO,IAAA;AACvC,EAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,QAAA,CAAS,kBAAkB,GAAG,OAAO,IAAA;AACpD,EAAA,IAAI,wBAAA,CAAyB,EAAE,CAAA,EAAG,OAAO,IAAA;AACzC,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,mBAAmB,MAAA,EAAuB;AACjD,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,EAAG;AAC7C,IAAA,IAAI,CAAA,CAAE,aAAa,IAAA,CAAK,YAAA,IAAA,CAAiB,EAAE,SAAA,IAAa,EAAA,EAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AAC5E,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,qBAAqB,MAAA,EAAsB;AAClD,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AACxC,EAAA,MAAM,aAAa,GAAA,CAAI,IAAA;AAAA,IACrB,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,KAAK,YAAA,IAAgB,CAAC,eAAe,CAAC;AAAA,GAC9D;AACA,EAAA,MAAM,SAAiB,EAAC;AACxB,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACvC,MAAA,MAAM,IAAA,GAAO,KAAK,SAAA,IAAa,EAAA;AAC/B,MAAA,IAAI,IAAA,KAAS,QAAQ,IAAA,KAAS,GAAA,IAAO,SAAS,IAAA,EAAM,aAAA,CAAc,KAAK,IAAI,CAAA;AAAA,WAAA,IAClE,IAAA,KAAS,IAAA,EAAM,aAAA,CAAc,GAAA,EAAI;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,IAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG;AAC1B,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,SAAA,EAAW;AACpC,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,WAAA,IAAe,EAAA;AACjC,IAAA,IAAI,IAAA,CAAK,MAAK,KAAM,EAAA,IAAM,CAAC,UAAA,EAAY,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAAoB;AACrC,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACvC,IAAA,OAAQ,IAAA,CAAiB,SAAA;AAAA,EAC3B;AACA,EAAA,OAAO,KAAK,WAAA,IAAe,EAAA;AAC7B;AAEA,SAAS,UAAU,IAAA,EAA+C;AAChE,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OAAO,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,GAAgB,IAAA,GAAmB,IAAA;AACnE;AAEA,SAAS,WAAW,IAAA,EAAgC;AAClD,EAAA,OAAO,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,GACzB,KAAiB,OAAA,GAClB,MAAA;AACN;AAEA,SAAS,QAAQ,EAAA,EAAqB;AACpC,EAAA,OAAO,EAAA,CAAG,QAAQ,WAAA,EAAY;AAChC;AAEA,SAAS,SAAA,CAAU,UAAA,EAAoB,IAAA,EAAY,KAAA,EAAuB;AACxE,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACvC,IAAA,MAAM,EAAA,GAAK,IAAA;AACX,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,IAAA,MAAM,KAAK,EAAA,CAAG,EAAA,GAAK,CAAA,CAAA,EAAI,EAAA,CAAG,EAAE,CAAA,CAAA,GAAK,EAAA;AACjC,IAAA,OAAO,CAAA,EAAG,UAAU,CAAA,GAAA,EAAM,GAAG,GAAG,EAAE,CAAA,WAAA,EAAc,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,EAC3D;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACvC,IAAA,OAAO,CAAA,EAAG,UAAU,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,CAAA;AACvC;;;AC/cA,IAAM,OAAA,GACJ,iEAAA;AACF,IAAM,WAAA,GAAc,mBAAA;AACpB,IAAM,YAAA,GAAe,kBAAA;AACrB,IAAM,iBAAA,GAAoB,cAAA;AAC1B,IAAM,SAAA,GAAY,sBAAA;AAElB,IAAM,mBAAA,GAAsB,UAAA;AAC5B,IAAM,YAAA,GAAe,OAAA;AAEd,SAAS,aAAa,KAAA,EAAwB;AACnD,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AAC5B,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,IAAI,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AACtC,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,IAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,IAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AACvE,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,KAAA,EAAwB;AACpD,EAAA,OAAO,gDAAA,CAAiD,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA;AAC3E;AAEO,SAAS,YAAY,KAAA,EAA8B;AACxD,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,EAAG;AACzB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,OAAO,CAAA,CAAE,MAAA,KAAW,EAAA,GAAK,CAAA,GAAI,GAAA,GAAO,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,GAAG,OAAO,MAAA;AAClC,EAAA,IAAI,aAAA,CAAc,CAAC,CAAA,EAAG;AACpB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAA,WAAA,EAAc,CAAC,CAAA,CAAE,CAAA;AAC7C,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,QAAQ,GAAG,OAAO,QAAA;AAAA,EACtC;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,qBAAqB,KAAA,EAAwB;AAC3D,EAAA,OAAO,mBAAA,CAAoB,KAAK,KAAK,CAAA;AACvC;AAEO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,OAAO,YAAA,CAAa,KAAK,KAAK,CAAA;AAChC;AAKA,IAAM,YAAA,GAAe,8BAAA;AAEd,SAAS,+BAAA,CAAgC,GAAW,CAAA,EAAoB;AAC7E,EAAA,MAAM,EAAA,GAAK,EAAE,IAAA,EAAK;AAClB,EAAA,MAAM,EAAA,GAAK,EAAE,IAAA,EAAK;AAClB,EAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA,IAAK,CAAC,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,KAAA;AAC7D,EAAA,MAAM,aAAa,CAAC,CAAA,KAAc,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACrD,EAAA,MAAM,EAAA,GAAK,WAAW,EAAE,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,WAAW,EAAE,CAAA;AACxB,EAAA,IAAI,CAAC,EAAA,IAAM,EAAA,KAAO,EAAA,EAAI,OAAO,KAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAc,oBAAA,CAAqB,KAAK,CAAC,CAAA;AACzD,EAAA,OAAA,CAAQ,OAAO,EAAE,CAAA,IAAK,MAAA,CAAO,EAAE,MAAM,EAAA,KAAO,EAAA;AAC9C;AAIA,IAAM,kBAAA,uBAAyB,GAAA,CAAY;AAAA,EACzC,OAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,mBAAmB,IAAA,EAAuB;AACxD,EAAA,OAAO,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,CAAA;AAClD;AAIA,IAAM,mBAAA,GACJ,8OAAA;AAIK,SAAS,uBAAA,CACd,MACA,OAAA,EACS;AACT,EAAA,MAAM,GAAA,GAAA,CAAO,OAAA,IAAW,EAAA,EAAI,WAAA,EAAY;AACxC,EAAA,IAAI,QAAQ,QAAA,IAAY,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,UAAU,OAAO,IAAA;AACpE,EAAA,MAAM,CAAA,GAAA,CAAK,IAAA,IAAQ,EAAA,EAAI,WAAA,EAAY;AACnC,EAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,EAAA,OAAO,oBAAoB,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA,CAAE,SAAS,aAAa,CAAA;AAChE;AAEO,SAAS,wBAAA,CAAyB,GAAW,CAAA,EAAoB;AACtE,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,EAAK,CAAE,MAAM,yCAAyC,CAAA;AACvE,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,EAAK,CAAE,MAAM,yCAAyC,CAAA;AACvE,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,EAAQ,OAAO,KAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,CAAC,MAAA,CAAO,CAAC,GAAG,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,CAAC,MAAA,CAAO,CAAC,GAAG,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA;AAC9D,EAAA,OAAO,SAAS,IAAA,IAAQ,CAAA,CAAE,IAAA,EAAK,KAAM,EAAE,IAAA,EAAK;AAC9C;AAEO,IAAM,oBAAA,uBAA2B,GAAA,CAAY;AAAA,EAClD,oBAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,8BAAA;AAAA,EACA,wBAAA;AAAA,EACA,sBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,qBAAqB,IAAA,EAAuB;AAC1D,EAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,EAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,IAAA;AACxC,EAAA,OACE,CAAA,CAAE,UAAA,CAAW,UAAU,CAAA,IACvB,EAAE,UAAA,CAAW,YAAY,CAAA,IACzB,CAAA,CAAE,UAAA,CAAW,OAAO,CAAA,IACpB,CAAA,CAAE,WAAW,MAAM,CAAA;AAEvB;AAEA,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,KAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,gBAAA,CACd,WACA,QAAA,EACS;AACT,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,QAAA,EAAU,OAAO,KAAA;AACpC,EAAA,MAAM,CAAA,GAAI,UAAU,WAAA,EAAY;AAChC,EAAA,MAAM,CAAA,GAAI,SAAS,WAAA,EAAY;AAC/B,EAAA,IAAI,MAAM,GAAA,IAAO,UAAA,CAAW,GAAA,CAAI,CAAC,GAAG,OAAO,IAAA;AAC3C,EAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACnC,EAAA,IAAI,MAAM,QAAA,KAAa,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,MAAM,OAAO,IAAA;AAC5D,EAAA,IAAA,CAAK,MAAM,OAAA,IAAW,CAAA,KAAM,WAAW,CAAA,KAAM,OAAA,KAAY,MAAM,KAAA,EAAO;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,+BAA+B,OAAA,EAA2B;AACxE,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,OACE,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA,IAClC,gDAAA,CAAiD,KAAK,OAAO,CAAA,IAC7D,0CAAA,CAA2C,IAAA,CAAK,OAAO,CAAA;AAE3D;;;ACzKO,IAAM,SAAA,GACX,uDAAA;AAEF,SAAS,KAAK,QAAA,EAA0B;AACtC,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,EAAG,QAAQ,CAAA,CAAA;AAChC;AAEA,SAAS,WAAW,CAAA,EAGlB;AACA,EAAA,OACE,CAAA,CAAE,MAAA,IAAU,IAAA,IAAQ,CAAA,CAAE,MAAA,IAAU,IAAA,IAAQ,CAAA,CAAE,MAAA,CAAO,IAAA,EAAK,KAAM,CAAA,CAAE,MAAA,CAAO,IAAA,EAAK;AAE9E;AAMA,SAAS,kBAAkB,CAAA,EAAwB;AACjD,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,IAAA;AAC9B,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,WAAA,IAAe,CAAA,CAAE,SAAA,EAAW;AACzC,IAAA,OAAO,kBAAA,CAAmB,EAAE,SAAS,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,gBAAA,GAA+B,CAAC,CAAA,KAAM;AAC1C,EAAA,IAAI,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,IAAI,CAAC,UAAA,CAAW,CAAC,CAAA,EAAG,OAAO,IAAA;AAC3B,EAAA,IAAI,CAAC,YAAA,CAAa,CAAA,CAAE,MAAM,CAAA,IAAK,CAAC,YAAA,CAAa,CAAA,CAAE,MAAM,CAAA,EAAG,OAAO,IAAA;AAC/D,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,yBAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,WAAA,EACE,uLAAA;AAAA,IAGF,UAAA,EACE,yMAAA;AAAA,IAGF,OAAA,EAAS,KAAK,yBAAyB;AAAA,GACzC;AACF,CAAA;AAEA,IAAM,QAAA,GAAuB,CAAC,CAAA,KAAM;AAClC,EAAA,IAAI,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,IAAI,CAAC,UAAA,CAAW,CAAC,CAAA,EAAG,OAAO,IAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,CAAE,MAAM,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,CAAE,MAAM,CAAA;AACrC,EAAA,MAAM,YAAY,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA,IAAK,aAAA,CAAc,EAAE,MAAM,CAAA;AACnE,EAAA,IAAI,QAAA,IAAY,IAAA,IAAQ,QAAA,IAAY,IAAA,EAAM;AACxC,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAAA,EACzB;AACA,EAAA,MAAM,KAAA,GACJ,YAAY,IAAA,IAAQ,QAAA,IAAY,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,QAAQ,CAAA,GAAI,CAAA;AACzE,EAAA,MAAM,aAAa,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AACvD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,WAAA;AAAA,IACV,UAAA,EAAY,UAAA,IAAc,SAAA,GAAY,IAAA,GAAO,GAAA;AAAA,IAC7C,WAAA,EACE,+JAAA;AAAA,IAGF,UAAA,EACE,gKAAA;AAAA,IAGF,OAAA,EAAS,KAAK,WAAW;AAAA,GAC3B;AACF,CAAA;AAEA,IAAM,YAAA,GAA2B,CAAC,CAAA,KAAM;AACtC,EAAA,IAAI,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,IAAI,CAAC,UAAA,CAAW,CAAC,CAAA,EAAG,OAAO,IAAA;AAC3B,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,CAAA;AAE3B,EAAA,MAAM,cAAA,GACH,oBAAA,CAAqB,MAAM,CAAA,IAAK,cAAA,CAAe,MAAM,CAAA,IACrD,cAAA,CAAe,MAAM,CAAA,IAAK,oBAAA,CAAqB,MAAM,CAAA;AACxD,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,eAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EACE,gKAAA;AAAA,MAGF,UAAA,EACE,uLAAA;AAAA,MAGF,OAAA,EAAS,KAAK,eAAe;AAAA,KAC/B;AAAA,EACF;AAEA,EAAA,IAAI,+BAAA,CAAgC,MAAA,EAAQ,MAAM,CAAA,EAAG;AACnD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,eAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EACE,iIAAA;AAAA,MAEF,UAAA,EACE,wGAAA;AAAA,MAEF,OAAA,EAAS,KAAK,eAAe;AAAA,KAC/B;AAAA,EACF;AAEA,EAAA,IAAI,wBAAA,CAAyB,MAAA,EAAQ,MAAM,CAAA,EAAG;AAC5C,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,eAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EACE,mGAAA;AAAA,MAEF,UAAA,EACE,6EAAA;AAAA,MAEF,OAAA,EAAS,KAAK,eAAe;AAAA,KAC/B;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,IAAM,cAAA,GAA6B,CAAC,CAAA,KAAM;AACxC,EAAA,MAAM,cAAc,CAAA,CAAE,MAAA,IAAU,QAAQ,CAAA,CAAE,MAAA,CAAO,MAAK,KAAM,EAAA;AAC5D,EAAA,MAAM,mBAAmB,CAAA,CAAE,MAAA,IAAU,QAAQ,CAAA,CAAE,MAAA,CAAO,MAAK,KAAM,EAAA;AACjE,EAAA,MAAM,SACH,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,CAAE,IAAA,KAAS,iBACjC,WAAA,IACA,gBAAA;AACF,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,kBAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,WAAA,EACE,uLAAA;AAAA,IAGF,UAAA,EACE,mKAAA;AAAA,IAGF,OAAA,EAAS,KAAK,kBAAkB;AAAA,GAClC;AACF,CAAA;AAEA,IAAM,iBAAA,GAAgC,CAAC,CAAA,KAAM;AAC3C,EAAA,MAAM,UAAA,GACJ,EAAE,IAAA,KAAS,WAAA,IACX,EAAE,IAAA,KAAS,YAAA,IACX,EAAE,IAAA,KAAS,cAAA;AACb,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,IACE,gBAAA,CAAiB,EAAE,aAAA,EAAe,CAAA,CAAE,OAAO,CAAA,IAC3C,8BAAA,CAA+B,CAAA,CAAE,YAAY,CAAA,EAC7C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,oBAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,WAAA,EACE,qKAAA;AAAA,IAGF,UAAA,EACE,yKAAA;AAAA,IAGF,OAAA,EAAS,KAAK,oBAAoB;AAAA,GACpC;AACF,CAAA;AAEA,IAAM,cAAA,GAA6B,CAAC,CAAA,KAAM;AACxC,EAAA,MAAM,SAAA,GAAY,8BAAA,CAA+B,CAAA,CAAE,YAAY,CAAA;AAC/D,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,CAAA,CAAE,aAAA,EAAe,EAAE,OAAO,CAAA;AAC3D,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,OAAA,EAAS,OAAO,IAAA;AACnC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,sBAAA;AAAA,IACV,UAAA,EAAY,YAAY,GAAA,GAAM,IAAA;AAAA,IAC9B,WAAA,EACE,kMAAA;AAAA,IAGF,UAAA,EACE,gKAAA;AAAA,IAGF,OAAA,EAAS,KAAK,sBAAsB;AAAA,GACtC;AACF,CAAA;AAEA,IAAM,sBAAA,GAAqC,CAAC,CAAA,KAAM;AAChD,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,IAAA;AAC9B,EAAA,IAAI,EAAE,MAAA,IAAU,IAAA,IAAQ,CAAA,CAAE,MAAA,IAAU,MAAM,OAAO,IAAA;AACjD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,IAAA;AAClC,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAc,CAAA,CAAE,QAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC5D,EAAA,IAAI,QAAA,CAAS,EAAE,MAAM,CAAA,KAAM,SAAS,CAAA,CAAE,MAAM,GAAG,OAAO,IAAA;AACtD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,yBAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,WAAA,EACE,yLAAA;AAAA,IAGF,UAAA,EACE,4IAAA;AAAA,IAEF,OAAA,EAAS,KAAK,yBAAyB;AAAA,GACzC;AACF,CAAA;AAEA,IAAM,qBAAA,GAAoC,CAAC,CAAA,KAAM;AAC/C,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,WAAA,IAAe,CAAA,CAAE,SAAA,EAAW;AACzC,IAAA,IAAI,oBAAA,CAAqB,CAAA,CAAE,SAAS,CAAA,EAAG;AACrC,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,0BAAA;AAAA,QACV,UAAA,EAAY,IAAA;AAAA,QACZ,WAAA,EACE,CAAA,gBAAA,EAAmB,CAAA,CAAE,SAAS,CAAA,2JAAA,CAAA;AAAA,QAGhC,UAAA,EACE,2IAAA;AAAA,QAGF,OAAA,EAAS,KAAK,0BAA0B;AAAA,OAC1C;AAAA,IACF;AACA,IAAA,MAAM,SAAS,gBAAA,CAAiB,IAAA,CAAK,EAAE,IAAI,CAAA,IAAK,EAAE,MAAA,IAAU,IAAA;AAC5D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,0BAAA;AAAA,QACV,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EACE,CAAA,gBAAA,EAAmB,CAAA,CAAE,SAAS,CAAA,yIAAA,CAAA;AAAA,QAGhC,UAAA,EACE,4GAAA;AAAA,QAEF,OAAA,EAAS,KAAK,0BAA0B;AAAA,OAC1C;AAAA,IACF;AAAA,EACF;AAIA,EAAA,IAAA,CACG,CAAA,CAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,cAAA,KACvC,uBAAA,CAAwB,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAO,CAAA,EACvD;AACA,IAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,OAAA,IAAW,SAAA,EAAW,WAAA,EAAY;AACjD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,0BAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,WAAA,EACE,MAAM,GAAG,CAAA,+LAAA,CAAA;AAAA,MAGX,UAAA,EACE,uMAAA;AAAA,MAGF,OAAA,EAAS,KAAK,0BAA0B;AAAA,KAC1C;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAIA,IAAM,iBAAA,GAAgC,CAAC,CAAA,KAAM;AAC3C,EAAA,IAAI,EAAE,IAAA,KAAS,WAAA,IAAe,CAAC,CAAA,CAAE,WAAW,OAAO,IAAA;AACnD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,SAAA,CAAU,WAAA,EAAY;AACrC,EAAA,MAAM,MAAA,GAAS,EAAE,MAAA,IAAU,EAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,EAAE,MAAA,IAAU,EAAA;AAE3B,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,WAAA,EAAa;AAC5C,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,MAAA,CAAO,MAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,MAAA,CAAO,MAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAC7D,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAC,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAC,CAAA;AAC9D,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,oBAAoB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACnE,IAAA,IAAI,OAAA,CAAQ,QAAQ,KAAA,CAAM,IAAA,CAAK,sBAAsB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACzE,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA,EAAA,EAAK,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACzD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,oBAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,WAAA,EACE,kDAAkD,MAAM,CAAA,0JAAA,CAAA;AAAA,MAG1D,UAAA,EACE,kNAAA;AAAA,MAGF,OAAA,EAAS,KAAK,oBAAoB;AAAA,KACpC;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,oBAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EACE,wKAAA;AAAA,MAGF,UAAA,EACE,qIAAA;AAAA,MAEF,OAAA,EAAS,KAAK,oBAAoB;AAAA,KACpC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,oBAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,aACE,CAAA,MAAA,EAAS,CAAA,CAAE,SAAS,CAAA,uCAAA,EAA0C,MAAM,qBACnD,MAAM,CAAA,4GAAA,CAAA;AAAA,IAEzB,UAAA,EACE,sIAAA;AAAA,IAEF,OAAA,EAAS,KAAK,oBAAoB;AAAA,GACpC;AACF,CAAA;AAEO,IAAM,cAAA,GAAwC;AAAA,EACnD,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA;AAAA;AAAA,EAGA,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA;AAAA;AAAA,EAGA;AACF;AAEO,IAAM,aAAA,GAAuB;AAAA,EAClC,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY,CAAA;AAAA,EACZ,WAAA,EACE,yHAAA;AAAA,EAEF,UAAA,EACE,4IAAA;AAAA,EAGF,OAAA,EAAS,KAAK,SAAS;AACzB;;;ACxXO,IAAM,oBAAA,GAAuB;AAO7B,SAAS,QAAA,CACd,UAAA,EACA,OAAA,GAA2B,EAAC,EACrB;AACP,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,oBAAA;AACvC,EAAA,MAAM,KAAA,GAA+B;AAAA,IACnC,GAAI,OAAA,CAAQ,KAAA,IAAS,EAAC;AAAA,IACtB,GAAG;AAAA,GACL;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,MAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,KAAK,UAAU,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AACA,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,UAAA,IAAc,SAAA,EAAW;AAC5C,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,aAAA;AACT;;;ACtBA,IAAI,OAAA,GAAU,CAAA;AAEd,SAAS,MAAA,GAAiB;AACxB,EAAA,OAAA,IAAW,CAAA;AACX,EAAA,OAAO,CAAA,GAAA,EAAM,KAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,IAAI,OAAO,CAAA,CAAA;AACjD;AAEA,SAAS,QAAA,CAAS,KAAA,EAAsB,GAAA,GAAM,GAAA,EAAoB;AAChE,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAC1B,EAAA,OAAO,KAAA,CAAM,SAAS,GAAA,GAAM,CAAA,EAAG,MAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,MAAA,CAAA,GAAM,KAAA;AAC1D;AAEO,SAAS,WAAA,CACd,UAAA,EACA,KAAA,EACA,OAAA,GAA4B,EAAC,EACZ;AACjB,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,EAAO;AAAA,IACX,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,IAAA,EAAM;AAAA,MACJ,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,WAAW,UAAA,CAAW,SAAA;AAAA,MACtB,MAAM,UAAA,CAAW;AAAA,KACnB;AAAA,IACA,MAAA,EAAQ,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA;AAAA,IAClC,MAAA,EAAQ,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA;AAAA,IAClC,KAAA;AAAA,IACA,KAAK,OAAA,CAAQ,YAAA,GACT,EAAE,YAAA,EAAc,OAAA,CAAQ,cAAa,GACrC;AAAA,GACN;AACF;AAMO,SAAS,YAAY,MAAA,EAAiC;AAC3D,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,CAAK,IAAA;AAAA,IACZ,MAAA,CAAO,KAAK,SAAA,IAAa,EAAA;AAAA,IACzB,OAAO,KAAA,CAAM,QAAA;AAAA,IACb,OAAO,MAAA,IAAU,EAAA;AAAA,IACjB,OAAO,MAAA,IAAU;AAAA,GACnB,CAAE,KAAK,GAAG,CAAA;AACZ;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAO3B,WAAA,CAAY,OAAA,GAA4B,EAAC,EAAG;AAN5C,IAAA,IAAA,CAAiB,IAAA,uBAAW,GAAA,EAAY;AACxC,IAAA,IAAA,CAAiB,KAAA,uBAAY,GAAA,EAAgB;AAC7C,IAAA,IAAA,CAAiB,UAA6B,EAAC;AAK7C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,EAAA;AAAA,EAC1C;AAAA,EAEA,QAAQ,IAAA,EAA8B;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,CAAA;AACnB,IAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,EACrC;AAAA,EAEA,UAAA,GAAyC;AACvC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,MAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,UAAA;AAAA,EACrC;AAAA,EAEA,MAAA,CACE,UAAA,EACA,OAAA,GAA4B,EAAC,EACL;AACxB,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAO,IAAA;AACxB,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,UAAU,GAAG,OAAO,IAAA;AAE9C,IAAA,MAAM,KAAA,GAAQ,SAAS,UAAA,EAAY;AAAA,MACjC,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,MACpB,SAAA,EAAW,KAAK,OAAA,CAAQ;AAAA,KACzB,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,UAAA,EAAY,KAAA,EAAO,OAAO,CAAA;AACrD,IAAA,MAAM,SAAA,GAAY,YAAY,MAAM,CAAA;AACpC,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,SAAS,GAAG,OAAO,IAAA;AAErC,IAAA,IAAA,CAAK,IAAA,CAAK,IAAI,SAAS,CAAA;AACvB,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AACxB,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,MAAM,CAAA;AAAA,MACb,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAA,CAAK,QAAQ,MAAA,GAAS,CAAA;AAAA,EACxB;AACF;;;ACzHO,SAAS,mBAAmB,OAAA,EAA0B;AAC3D,EAAA,OACE,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,IACtB,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA,IACrC,sBAAA,CAAuB,IAAA,CAAK,OAAO,CAAA,IACnC,qBAAA,CAAsB,KAAK,OAAO,CAAA,IAClC,2BAAA,CAA4B,IAAA,CAAK,OAAO,CAAA,IACxC,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA,IAClC,8BAAA,CAA+B,IAAA,CAAK,OAAO,CAAA;AAE/C;AAEA,SAAS,UAAU,CAAA,EAAoB;AACrC,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,OAAO,CAAC,CAAA;AAC7C;AAEO,SAAS,kBAAkB,IAAA,EAAkC;AAClE,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC9B,EAAA,MAAM,CAAC,KAAA,EAAO,GAAG,IAAI,CAAA,GAAI,IAAA;AACzB,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,EAAG;AACrD,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,MAAM,UAAU,IAAA,CAAK,CAAA,EAAG,CAAA,IAAK,EAAE,CAAC,CAAA;AAC1E,IAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,CAAC,EAAE,GAAA,CAAI,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC5D,IAAA,OAAO,CAAC,UAAU,GAAG,QAAQ,EAAE,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAAA,EACjD;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,CAAE,KAAK,GAAG,CAAA;AACrC;AAGA,SAAS,oBAAoB,IAAA,EAAuB;AAClD,EAAA,OACE,2JAAA,CAA4J,IAAA;AAAA,IAC1J;AAAA,OAEF,2JAAA,CAA4J,IAAA;AAAA,IAC1J;AAAA,OAEF,uDAAA,CAAwD,IAAA,CAAK,IAAI,CAAA,IACjE,IAAA,KAAS,cACT,IAAA,KAAS,UAAA;AAEb;AAGO,SAAS,4BACd,OAAA,EACoB;AACpB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,EAAA,GAAK,0BAAA;AACX,EAAA,IAAI,CAAA;AACJ,EAAA,OAAA,CAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AACtC,IAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,IAAA,IAAI,QAAQ,CAAC,mBAAA,CAAoB,IAAI,CAAA,EAAG,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAI,MAAA;AAClD;AAEA,IAAM,OAAA,GAAU,2CAAA;AAOhB,SAAS,gBAAgB,OAAA,EAAoC;AAC3D,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AACrC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,IAAI,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,SAAA,IAC3B,EAAA,IAAM,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,CAAM,KAAK,EAAA,CAAG,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AAGpD,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AACzB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,IAAA,GAAO,GAAG,CAAC,CAAA;AACjB,IAAA,MAAM,cAAc,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA;AACtC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,CAAC,EAAA,KAAO;AACjC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA;AAC9B,MAAA,OAAO,MAAA,IAAU,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AACnC,MAAA,MAAM,WAAA,GAAc,SAAU,MAAA,CAAO,CAAC,KAAK,MAAA,CAAO,CAAC,KAAK,EAAA,GAAM,EAAA;AAC9D,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,SAAA,EAAW,IAAA;AAAA,QACX,MAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAQ,WAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA,IAAK,IAAA;AACrD,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA,IAAK,IAAA;AACtD,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,IAAA,EAAM;AACtC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,MAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,sBAAsB,OAAA,EAAoC;AACxE,EAAA,IAAI,CAAC,kBAAA,CAAmB,OAAO,CAAA,EAAG,OAAO,IAAA;AAGzC,EAAA,MAAM,UACJ,uEAAA,CAAwE,IAAA;AAAA,IACtE;AAAA,GACF;AACF,EAAA,IAAI,OAAA,IAAW,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA,EAAG;AAClD,IAAA,MAAM,OACJ,0EAAA,CAA2E,IAAA;AAAA,MACzE;AAAA,KACF;AACF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,SAAS,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,EAAG,aAAY,GAAI,MAAA;AAAA,MACzC,eAAe,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,EAAG,aAAY,GAAI,MAAA;AAAA,MAC/C,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQ,IAAA;AAAA,MACR,YAAA,EAAc;AAAA,KAChB;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,gBAAgB,OAAO,CAAA;AACtC,EAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,EAAA,MAAM,OACJ,kGAAA,CAAmG,IAAA;AAAA,IACjG;AAAA,GACF;AACF,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,MACnB,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,MACnB,YAAA,EAAc;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,MAAM,OACJ,4FAAA,CAA6F,IAAA;AAAA,IAC3F;AAAA,GACF;AACF,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,SAAA,EAAW,KAAK,CAAC,CAAA;AAAA,MACjB,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,MACnB,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,MACnB,YAAA,EAAc;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,MAAM,WACJ,qEAAA,CAAsE,IAAA;AAAA,IACpE;AAAA,GACF;AACF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,EAAG,WAAA,EAAY;AAAA,MAClC,aAAA,EAAe,QAAA,CAAS,CAAC,CAAA,EAAG,WAAA,EAAY;AAAA,MACxC,MAAA,EAAQ,IAAA;AAAA,MACR,QAAQ,CAAA,CAAA,EAAI,QAAA,CAAS,CAAC,CAAA,EAAG,aAAa,CAAA,CAAA,CAAA;AAAA,MACtC,YAAA,EAAc;AAAA,KAChB;AAAA,EACF;AACA,EAAA,MAAM,cACJ,4EAAA,CAA6E,IAAA;AAAA,IAC3E;AAAA,GACF;AACF,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,cAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,WAAA,CAAY,CAAC,CAAA,EAAG,WAAA,EAAY;AAAA,MACrC,QAAQ,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,EAAG,aAAa,CAAA,CAAA,CAAA;AAAA,MACzC,MAAA,EAAQ,IAAA;AAAA,MACR,YAAA,EAAc;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ,IAAA;AAAA,IACR,YAAA,EAAc;AAAA,GAChB;AACF;AAQO,SAAS,6BAA6B,OAAA,EAA+B;AAC1E,EAAA,IAAI,CAAC,kBAAA,CAAmB,OAAO,CAAA,SAAU,EAAC;AAE1C,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AACrC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,IAAI,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,SAAA,IAC3B,EAAA,IAAM,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,CAAM,KAAK,EAAA,CAAG,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC3C,IAAA,MAAM,MAAA,GAAS,sBAAsB,OAAO,CAAA;AAC5C,IAAA,OAAO,MAAA,GAAS,CAAC,MAAM,CAAA,GAAI,EAAC;AAAA,EAC9B;AAEA,EAAA,MAAM,MAAoB,EAAC;AAC3B,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA;AACrD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AACzB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,IAAA,GAAO,GAAG,CAAC,CAAA;AACjB,IAAA,MAAM,cAAc,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA;AACtC,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,SAAA,CAAU,CAAC,GAAG,CAAA,KAAM;AACxC,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,KAAA;AAC7B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAC7B,MAAA,OAAO,MAAA,GAAS,CAAC,CAAA,KAAM,IAAA;AAAA,IACzB,CAAC,CAAA;AACD,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,SAAA,CAAU,IAAI,GAAG,CAAA;AACjB,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,GAAG,CAAE,CAAA;AAC3C,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,SAAA,EAAW,IAAA;AAAA,QACX,MAAA,EAAQ,SAAU,MAAA,CAAO,CAAC,KAAK,MAAA,CAAO,CAAC,KAAK,EAAA,GAAM,EAAA;AAAA,QAClD,MAAA,EAAQ,WAAA;AAAA,QACR,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,CAAC,MAAM,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA;AACpD,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,MAAM,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA;AACtD,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,UAAU,MAAM,CAAA;AACtD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,CAAC,CAAA,IAAK,IAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,CAAC,CAAA,IAAK,IAAA;AAC/B,IAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,IAAA,EAAM;AACtC,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,OAAA,EAAS,CAAA;AAAA,IAChF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,GAAA,GAAO,qBAAA,CAAsB,OAAO,CAAA,GAAI,CAAC,qBAAA,CAAsB,OAAO,CAAE,CAAA,GAAI,EAAC;AACnG;;;AC1QO,SAAS,YACd,IAAA,EACA,SAAA,EACA,OAAA,GAA4B,IAC5B,MAAA,EACQ;AACR,EAAA,MAAM,UAAA,GAAa,qBAAqB,IAAI,CAAA;AAC5C,EAAA,IAAI,UAAA,IAAc,MAAM,OAAO,CAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,yBAAA,CAA0B,UAAA,EAAY,IAAI,CAAA;AAC9D,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,IAAI,OAAA,CAAQ,YAAA,IAAgB,CAAC,UAAA,CAAW,YAAA,EAAc;AACpD,MAAA,UAAA,CAAW,eAAe,OAAA,CAAQ,YAAA;AAAA,IACpC;AACA,IAAA,MAAM,QAAA,GAAW,MAAA,GAAS,MAAA,CAAO,UAAU,IAAI,EAAC;AAChD,IAAA,IAAI,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,EAAE,GAAG,SAAS,GAAG,QAAA,EAAU,CAAA,IAAK,IAAA,EAAM;AACrE,MAAA,QAAA,IAAY,CAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAIO,SAAS,iBAAA,CACd,OAAA,EACA,SAAA,EACA,OAAA,GAA4B,EAAC,EACrB;AACR,EAAA,MAAM,WAAA,GAAc,6BAA6B,OAAO,CAAA;AACxD,EAAA,MAAM,SAAA,GAAY,2BAAA,CAA4B,OAAO,CAAA,IAAK,OAAA,CAAQ,SAAA;AAClE,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,IACE,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,EAAE,GAAG,OAAA,EAAS,SAAA,EAAW,YAAA,EAAc,OAAA,EAAS,CAAA,IAC7E,IAAA,EACA;AACA,MAAA,QAAA,IAAY,CAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT","file":"chunk-WQLUD25W.js","sourcesContent":["export const isDev: boolean =\n typeof process !== 'undefined' &&\n process.env != null &&\n process.env.NODE_ENV !== 'production';\n","import type { Divergence } from './types';\n\nconst IGNORED_ATTRIBUTES = new Set<string>(['data-reactroot']);\n\nexport function parseServerHtml(html: string, rootTagName: string): Element {\n const container = document.createElement(rootTagName || 'div');\n container.innerHTML = html;\n return container;\n}\n\n/**\n * Collect *every* divergence between the server snapshot and the live DOM, in a\n * deterministic order, deduped-by-value upstream. Children are aligned with an\n * LCS (by tag+id) so a node the client injects mid-tree (a portal, toast, ad,\n * or Suspense-resolved subtree) is treated as an insertion instead of shifting\n * every sibling and cascading into false positives.\n */\nexport function collectDivergences(\n serverRoot: Element,\n clientRoot: Element,\n limit = 60,\n): Divergence[] {\n const out: Divergence[] = [];\n collectChildren(serverRoot, clientRoot, tagPath(clientRoot), out, limit);\n return out;\n}\n\nexport function collectSnapshotAgainstDom(\n serverHtml: string,\n clientRoot: Element,\n limit = 60,\n): Divergence[] {\n const serverRoot = parseServerHtml(serverHtml, clientRoot.tagName);\n return collectDivergences(serverRoot, clientRoot, limit);\n}\n\n// Back-compat single-divergence helpers (used by tests / message-less paths).\nexport function diffTrees(\n serverRoot: Element,\n clientRoot: Element,\n): Divergence | null {\n return collectDivergences(serverRoot, clientRoot, 1)[0] ?? null;\n}\n\nexport function diffSnapshotAgainstDom(\n serverHtml: string,\n clientRoot: Element,\n): Divergence | null {\n return collectSnapshotAgainstDom(serverHtml, clientRoot, 1)[0] ?? null;\n}\n\nfunction collectChildren(\n serverParent: Node,\n clientParent: Node,\n parentPath: string,\n out: Divergence[],\n limit: number,\n): void {\n if (out.length >= limit) return;\n const serverChildren = meaningfulChildNodes(serverParent);\n const clientChildren = meaningfulChildNodes(clientParent);\n const parentPending = hasPendingSuspense(serverParent);\n const parentTag = elementTag(clientParent);\n const pairs = alignChildren(serverChildren, clientChildren);\n\n let index = 0;\n for (let k = 0; k < pairs.length; k++) {\n if (out.length >= limit) return;\n const [serverNode, clientNode] = pairs[k]!;\n\n // Coalesce an adjacent delete+insert into one `structure` swap (e.g. server\n // <b>, client <i> at the same slot), so one logical change isn't two reports.\n if (serverNode && !clientNode && k + 1 < pairs.length) {\n const [nextServer, nextClient] = pairs[k + 1]!;\n if (!nextServer && nextClient && !isInjectedContainer(nextClient)) {\n const path = childPath(parentPath, nextClient, index);\n index += 1;\n k += 1;\n out.push({\n kind: 'structure',\n path,\n tagName: elementTag(nextClient),\n parentTagName: parentTag,\n server: serialize(serverNode),\n client: serialize(nextClient),\n element: asElement(nextClient),\n });\n continue;\n }\n }\n\n const anchor = clientNode ?? serverNode;\n if (!anchor) continue;\n const path = childPath(parentPath, anchor, index);\n index += 1;\n\n if (serverNode && !clientNode) {\n // Server rendered a node the client dropped — a real structural mismatch.\n out.push({\n kind: 'node-removed',\n path,\n tagName: elementTag(serverNode),\n parentTagName: parentTag,\n server: serialize(serverNode),\n client: null,\n element: asElement(clientParent),\n });\n } else if (!serverNode && clientNode) {\n // Client rendered an extra node. Skip injections (portals, toasts, ads,\n // modals) and Suspense-resolved content — those are not the dev's bug.\n if (isInjectedContainer(clientNode)) continue;\n if (clientNode.nodeType === Node.ELEMENT_NODE && parentPending) continue;\n out.push({\n kind: 'node-added',\n path,\n tagName: elementTag(clientNode),\n parentTagName: parentTag,\n server: null,\n client: serialize(clientNode),\n element: asElement(clientNode),\n });\n } else if (serverNode && clientNode) {\n collectNode(serverNode, clientNode, path, parentTag, out, limit);\n }\n }\n}\n\nfunction collectNode(\n serverNode: Node,\n clientNode: Node,\n path: string,\n parentTag: string | undefined,\n out: Divergence[],\n limit: number,\n): void {\n if (serverNode.nodeType !== clientNode.nodeType) {\n out.push({\n kind: 'structure',\n path,\n tagName: elementTag(clientNode),\n parentTagName: parentTag,\n server: serialize(serverNode),\n client: serialize(clientNode),\n element: asElement(clientNode),\n });\n return;\n }\n\n if (\n serverNode.nodeType === Node.TEXT_NODE ||\n serverNode.nodeType === Node.COMMENT_NODE\n ) {\n const serverText = serverNode.textContent ?? '';\n const clientText = clientNode.textContent ?? '';\n if (serverText !== clientText) {\n out.push({\n kind: 'text',\n path,\n parentTagName: parentTag,\n server: serverText,\n client: clientText,\n element: asElement(clientNode.parentNode),\n });\n }\n return;\n }\n\n if (serverNode.nodeType === Node.ELEMENT_NODE) {\n const serverEl = serverNode as Element;\n const clientEl = clientNode as Element;\n\n if (serverEl.tagName !== clientEl.tagName) {\n out.push({\n kind: 'structure',\n path,\n tagName: clientEl.tagName,\n parentTagName: parentTag,\n server: serialize(serverEl),\n client: serialize(clientEl),\n element: clientEl,\n });\n return;\n }\n\n const attrDivergence = diffAttributes(serverEl, clientEl, path, parentTag);\n if (attrDivergence) out.push(attrDivergence);\n\n collectChildren(serverEl, clientEl, path, out, limit);\n }\n}\n\nfunction diffAttributes(\n serverEl: Element,\n clientEl: Element,\n path: string,\n parentTag: string | undefined,\n): Divergence | null {\n const names = new Set<string>();\n for (const a of Array.from(serverEl.attributes)) names.add(a.name);\n for (const a of Array.from(clientEl.attributes)) names.add(a.name);\n\n for (const name of names) {\n if (IGNORED_ATTRIBUTES.has(name)) continue;\n const serverValue = serverEl.getAttribute(name);\n const clientValue = clientEl.getAttribute(name);\n if (normalizeAttr(name, serverValue) === normalizeAttr(name, clientValue)) {\n continue;\n }\n return {\n kind: 'attribute',\n path,\n tagName: clientEl.tagName,\n parentTagName: parentTag,\n attribute: name,\n server: serverValue,\n client: clientValue,\n element: clientEl,\n };\n }\n return null;\n}\n\nfunction normalizeAttr(name: string, value: string | null): string | null {\n if (value == null) return null;\n if (name === 'class') {\n return value.trim().split(/\\s+/).filter(Boolean).sort().join(' ');\n }\n if (name === 'style') {\n return normalizeStyle(value);\n }\n return value;\n}\n\n// Canonicalize an inline style through the CSSOM so React's raw serialization\n// (`color:#0f172a`) compares equal to the browser-normalized live value\n// (`color: rgb(15, 23, 42);`), order-independent.\nfunction normalizeStyle(value: string): string {\n if (typeof document !== 'undefined') {\n try {\n const el = document.createElement('div');\n el.style.cssText = value;\n const decls: string[] = [];\n for (let i = 0; i < el.style.length; i++) {\n const prop = el.style.item(i);\n decls.push(`${prop}:${el.style.getPropertyValue(prop)}`);\n }\n return decls.sort().join(';');\n } catch {\n /* fall through to string normalization */\n }\n }\n return value\n .split(';')\n .map((s) => s.trim())\n .filter(Boolean)\n .sort()\n .join(';');\n}\n\n// ---- alignment ------------------------------------------------------------\n\nfunction nodeKey(node: Node): string {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n return el.id ? `${el.tagName}#${el.id}` : el.tagName;\n }\n if (node.nodeType === Node.TEXT_NODE) return '#text';\n return '#other';\n}\n\n// Align two child lists by an LCS on their keys, so inserted/removed nodes are\n// identified rather than shifting the whole comparison. Falls back to index\n// pairing for very large lists (keeps it O(n) there).\nfunction alignChildren(\n server: Node[],\n client: Node[],\n): Array<[Node | null, Node | null]> {\n const m = server.length;\n const n = client.length;\n if (m === 0 || n === 0 || m > 200 || n > 200 || m * n > 10000) {\n const pairs: Array<[Node | null, Node | null]> = [];\n const max = Math.max(m, n);\n for (let i = 0; i < max; i++) {\n pairs.push([server[i] ?? null, client[i] ?? null]);\n }\n return pairs;\n }\n const sk = server.map(nodeKey);\n const ck = client.map(nodeKey);\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n new Array(n + 1).fill(0),\n );\n for (let i = m - 1; i >= 0; i--) {\n for (let j = n - 1; j >= 0; j--) {\n dp[i]![j] =\n sk[i] === ck[j]\n ? dp[i + 1]![j + 1]! + 1\n : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!);\n }\n }\n const pairs: Array<[Node | null, Node | null]> = [];\n let i = 0;\n let j = 0;\n while (i < m && j < n) {\n if (sk[i] === ck[j]) {\n pairs.push([server[i]!, client[j]!]);\n i++;\n j++;\n } else if (dp[i + 1]![j]! >= dp[i]![j + 1]!) {\n pairs.push([server[i]!, null]);\n i++;\n } else {\n pairs.push([null, client[j]!]);\n j++;\n }\n }\n while (i < m) pairs.push([server[i++]!, null]);\n while (j < n) pairs.push([null, client[j++]!]);\n return pairs;\n}\n\n// ---- noise / injection / suspense ----------------------------------------\n\nconst NOISE_TAGS = new Set<string>([\n 'SCRIPT',\n 'STYLE',\n 'LINK',\n 'TEMPLATE',\n 'NOSCRIPT',\n]);\n\nconst TRACKER_MARKER =\n /googlefc|adsbygoogle|google_ads|googletag|__tcfapi|onetrust|optanon|cookiebot|usercentrics|didomi|quantcast|grammarly|gtm|hotjar|fullstory|intercom|drift|zendesk|livechat|tawk|hubspot|turnstile|recaptcha/i;\n\n// Elements client-side scripts/libraries mount that the server never rendered:\n// toasts, modals, portals, overlays, tooltips, consent banners, chat widgets.\nconst INJECTED_MARKER =\n /toastify|toast|modal|portal|overlay|backdrop|drawer|dialog|popover|popper|tooltip|snackbar|notification|consent|gdpr|cookie-?(?:banner|consent)|intercom|drift|crisp|tawk|zendesk|onetrust|usercentrics/i;\n\nfunction isThirdPartyNoiseElement(el: Element): boolean {\n const identity = `${el.getAttribute('name') ?? ''} ${el.id} ${\n typeof el.className === 'string' ? el.className : ''\n }`;\n if (TRACKER_MARKER.test(identity)) return true;\n if (el.tagName === 'IFRAME') {\n const src = el.getAttribute('src') ?? '';\n const style = (el.getAttribute('style') ?? '').toLowerCase();\n const hidden =\n /display\\s*:\\s*none/.test(style) ||\n /visibility\\s*:\\s*hidden/.test(style) ||\n /(?:left|top)\\s*:\\s*-\\d{3,}px/.test(style) ||\n /(?:width|height)\\s*:\\s*0(?:px)?\\b/.test(style) ||\n el.hasAttribute('hidden') ||\n el.getAttribute('aria-hidden') === 'true';\n if (src === 'about:blank' || hidden) return true;\n }\n return false;\n}\n\n// A client-only node that is a portal / toast / overlay / third-party widget —\n// never part of the app's hydration, so it must not be reported.\nfunction isInjectedContainer(node: Node): boolean {\n if (node.nodeType !== Node.ELEMENT_NODE) return false;\n const el = node as Element;\n if (isNoiseElement(el)) return true;\n const cls = typeof el.className === 'string' ? el.className : '';\n if (INJECTED_MARKER.test(`${el.id} ${cls}`)) return true;\n if (el.hasAttribute('aria-live')) return true;\n const role = el.getAttribute('role');\n if (role && /^(dialog|alertdialog|tooltip|status|alert)$/.test(role.trim())) {\n return true;\n }\n if (el.tagName.includes('-PORTAL') || el.tagName.includes('-OVERLAY')) {\n return true;\n }\n for (const attr of Array.from(el.attributes)) {\n if (/portal|radix|headlessui|floating-ui/i.test(attr.name)) return true;\n }\n return false;\n}\n\nfunction isNoiseElement(node: Node): boolean {\n if (node.nodeType !== Node.ELEMENT_NODE) return false;\n const el = node as Element;\n if (el.hasAttribute('data-why-hydration')) return true;\n if (NOISE_TAGS.has(el.tagName)) return true;\n if (el.tagName.includes('-ROUTE-ANNOUNCER')) return true;\n if (isThirdPartyNoiseElement(el)) return true;\n return false;\n}\n\n// True when a parent's server children include a *pending* Suspense boundary\n// (`<!--$?-->`), i.e. the server streamed a fallback that the client resolves to\n// different content. Those differences are expected, not bugs.\nfunction hasPendingSuspense(parent: Node): boolean {\n for (const n of Array.from(parent.childNodes)) {\n if (n.nodeType === Node.COMMENT_NODE && (n.nodeValue ?? '').startsWith('$?')) {\n return true;\n }\n }\n return false;\n}\n\nfunction meaningfulChildNodes(parent: Node): Node[] {\n const raw = Array.from(parent.childNodes);\n const hasElement = raw.some(\n (n) => n.nodeType === Node.ELEMENT_NODE && !isNoiseElement(n),\n );\n const result: Node[] = [];\n const boundaryStack: string[] = [];\n for (const node of raw) {\n if (node.nodeType === Node.COMMENT_NODE) {\n const data = node.nodeValue ?? '';\n if (data === '$?' || data === '$' || data === '$!') boundaryStack.push(data);\n else if (data === '/$') boundaryStack.pop();\n continue; // React/RSC markers are never real content.\n }\n // Skip fallback content inside a pending Suspense boundary.\n if (boundaryStack.includes('$?')) continue;\n if (isNoiseElement(node)) continue;\n if (node.nodeType !== Node.TEXT_NODE) {\n result.push(node);\n continue;\n }\n const text = node.textContent ?? '';\n if (text.trim() !== '' || !hasElement) result.push(node);\n }\n return result;\n}\n\nfunction serialize(node: Node): string {\n if (node.nodeType === Node.ELEMENT_NODE) {\n return (node as Element).outerHTML;\n }\n return node.textContent ?? '';\n}\n\nfunction asElement(node: Node | null | undefined): Element | null {\n if (!node) return null;\n return node.nodeType === Node.ELEMENT_NODE ? (node as Element) : null;\n}\n\nfunction elementTag(node: Node): string | undefined {\n return node.nodeType === Node.ELEMENT_NODE\n ? (node as Element).tagName\n : undefined;\n}\n\nfunction tagPath(el: Element): string {\n return el.tagName.toLowerCase();\n}\n\nfunction childPath(parentPath: string, node: Node, index: number): string {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : '';\n return `${parentPath} > ${tag}${id}:nth-child(${index + 1})`;\n }\n if (node.nodeType === Node.COMMENT_NODE) {\n return `${parentPath} > #comment[${index}]`;\n }\n return `${parentPath} > #text[${index}]`;\n}\n","const UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst REACT_ID_RE = /^:[rR][0-9a-z]*:$/;\nconst HEX_TOKEN_RE = /^[0-9a-f]{16,}$/i;\nconst RANDOM_DECIMAL_RE = /^0?\\.\\d{6,}$/;\nconst NANOID_RE = /^[A-Za-z0-9_-]{10,}$/;\n\nconst ARABIC_INDIC_DIGITS = /[٠-٩۰-۹]/;\nconst LATIN_DIGITS = /[0-9]/;\n\nexport function isRandomLike(value: string): boolean {\n const v = value.trim();\n if (!v) return false;\n if (UUID_RE.test(v)) return true;\n if (REACT_ID_RE.test(v)) return true;\n if (HEX_TOKEN_RE.test(v)) return true;\n if (RANDOM_DECIMAL_RE.test(v)) return true;\n if (NANOID_RE.test(v) && /[A-Za-z]/.test(v) && /[0-9]/.test(v)) return true;\n return false;\n}\n\nexport function looksLikeTime(value: string): boolean {\n return /\\b\\d{1,2}:\\d{2}(?::\\d{2})?(?:\\s?[AaPp][Mm])?\\b/.test(value.trim());\n}\n\nexport function toTimestamp(value: string): number | null {\n const v = value.trim();\n if (!v) return null;\n if (/^\\d{10,13}$/.test(v)) {\n const n = Number(v);\n return v.length === 10 ? n * 1000 : n;\n }\n const parsed = Date.parse(v);\n if (!Number.isNaN(parsed)) return parsed;\n if (looksLikeTime(v)) {\n const anchored = Date.parse(`1970-01-01 ${v}`);\n if (!Number.isNaN(anchored)) return anchored;\n }\n return null;\n}\n\nexport function hasArabicIndicDigits(value: string): boolean {\n return ARABIC_INDIC_DIGITS.test(value);\n}\n\nexport function hasLatinDigits(value: string): boolean {\n return LATIN_DIGITS.test(value);\n}\n\n// A value made only of digits, separators and an optional sign \\u2014 i.e. it\n// actually looks like a formatted number. Guards against class lists, ids, and\n// arbitrary text that merely contain digits (e.g. \"radius-8 border p-8\").\nconst NUMERIC_LIKE = /^[+-]?[\\d.,\\s\\u00a0\\u2009]+$/;\n\nexport function isSameNumberDifferentSeparators(a: string, b: string): boolean {\n const at = a.trim();\n const bt = b.trim();\n if (!NUMERIC_LIKE.test(at) || !NUMERIC_LIKE.test(bt)) return false;\n const digitsOnly = (s: string) => s.replace(/\\D/g, '');\n const da = digitsOnly(at);\n const db = digitsOnly(bt);\n if (!da || da !== db) return false;\n const hasSep = (s: string) => /[.,\\s\\u00a0\\u2009]/.test(s);\n return (hasSep(at) || hasSep(bt)) && at !== bt;\n}\n\n// Attributes whose value is human-facing content that can carry locale/date/\n// random formatting. Structural attributes (class, style, id, href\\u2026) are not.\nconst CONTENT_ATTRIBUTES = new Set<string>([\n 'value',\n 'placeholder',\n 'title',\n 'alt',\n 'label',\n 'aria-label',\n 'aria-valuetext',\n 'content',\n 'datetime',\n]);\n\nexport function isContentAttribute(name: string): boolean {\n return CONTENT_ATTRIBUTES.has(name.toLowerCase());\n}\n\n// Markers of third-party scripts / consent / analytics / chat widgets that\n// inject nodes after the server render (not part of the app's hydration).\nconst THIRD_PARTY_MARKERS =\n /googlefc|adsbygoogle|google_ads|googletag|__tcfapi|onetrust|optanon|cookiebot|usercentrics|iubenda|didomi|quantcast|grammarly|data-gramm|gtm-|_hjsettings|hotjar|fullstory|intercom|drift|zendesk|livechat|tawk|hubspot|turnstile|recaptcha/i;\n\n// True when a *node-added / node-removed* divergence is almost certainly a\n// third-party injection rather than the developer's own hydration mismatch.\nexport function looksLikeThirdPartyNode(\n html: string | null,\n tagName: string | undefined,\n): boolean {\n const tag = (tagName ?? '').toUpperCase();\n if (tag === 'IFRAME' || tag === 'EMBED' || tag === 'OBJECT') return true;\n const h = (html ?? '').toLowerCase();\n if (!h) return false;\n return THIRD_PARTY_MARKERS.test(h) || h.includes('about:blank');\n}\n\nexport function isSameDateDifferentOrder(a: string, b: string): boolean {\n const partsA = a.trim().match(/^(\\d{1,4})[/.-](\\d{1,2})[/.-](\\d{1,4})$/);\n const partsB = b.trim().match(/^(\\d{1,4})[/.-](\\d{1,2})[/.-](\\d{1,4})$/);\n if (!partsA || !partsB) return false;\n const setA = [partsA[1], partsA[2], partsA[3]].sort().join('|');\n const setB = [partsB[1], partsB[2], partsB[3]].sort().join('|');\n return setA === setB && a.trim() !== b.trim();\n}\n\nexport const EXTENSION_ATTRIBUTES = new Set<string>([\n 'cz-shortcut-listen',\n 'data-gramm',\n 'data-gramm_editor',\n 'data-gramm_id',\n 'data-gr-c-s-loaded',\n 'data-lt-installed',\n 'data-new-gr-c-s-check-loaded',\n 'data-new-gr-c-s-loaded',\n 'spellcheck-extension',\n 'bis_register',\n '__processed_by_react_dev_tools',\n]);\n\nexport function isExtensionAttribute(name: string): boolean {\n const n = name.toLowerCase();\n if (EXTENSION_ATTRIBUTES.has(n)) return true;\n return (\n n.startsWith('data-gr-') ||\n n.startsWith('data-gramm') ||\n n.startsWith('__bis') ||\n n.startsWith('bis_')\n );\n}\n\nconst BLOCK_TAGS = new Set([\n 'DIV',\n 'P',\n 'SECTION',\n 'ARTICLE',\n 'UL',\n 'OL',\n 'LI',\n 'TABLE',\n 'HEADER',\n 'FOOTER',\n 'MAIN',\n 'ASIDE',\n 'NAV',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'FORM',\n 'BLOCKQUOTE',\n 'PRE',\n 'HR',\n]);\n\nexport function isInvalidNesting(\n parentTag: string | undefined,\n childTag: string | undefined,\n): boolean {\n if (!parentTag || !childTag) return false;\n const p = parentTag.toUpperCase();\n const c = childTag.toUpperCase();\n if (p === 'P' && BLOCK_TAGS.has(c)) return true;\n if (p === 'A' && c === 'A') return true;\n if (p === 'BUTTON' && (c === 'BUTTON' || c === 'A')) return true;\n if ((p === 'TABLE' || p === 'THEAD' || p === 'TBODY') && c === 'DIV') {\n return true;\n }\n return false;\n}\n\nexport function messageIndicatesInvalidNesting(message?: string): boolean {\n if (!message) return false;\n return (\n /validateDOMNesting/i.test(message) ||\n /cannot (?:be a|contain).*(?:descendant|child)/i.test(message) ||\n /cannot appear as a (?:child|descendant)/i.test(message)\n );\n}\n","import type { Cause, Classifier, Divergence } from '../types';\nimport {\n hasArabicIndicDigits,\n hasLatinDigits,\n isContentAttribute,\n isExtensionAttribute,\n isInvalidNesting,\n isRandomLike,\n isSameDateDifferentOrder,\n isSameNumberDifferentSeparators,\n looksLikeThirdPartyNode,\n looksLikeTime,\n messageIndicatesInvalidNesting,\n toTimestamp,\n} from './detectors';\n\nexport const DOCS_BASE =\n 'https://github.com/razan-aboushi/why-hydration#cause-';\n\nfunction docs(category: string): string {\n return `${DOCS_BASE}${category}`;\n}\n\nfunction bothDiffer(d: Divergence): d is Divergence & {\n server: string;\n client: string;\n} {\n return (\n d.server != null && d.client != null && d.server.trim() !== d.client.trim()\n );\n}\n\n// The value-formatting rules (random / date / locale) only make sense for\n// human-facing text: text nodes and content-like attributes. Applied to\n// `class`/`style`/`id`/etc. they false-match (e.g. a class list with digits\n// looks like \"the same number with different separators\").\nfunction isValueDivergence(d: Divergence): boolean {\n if (d.kind === 'text') return true;\n if (d.kind === 'attribute' && d.attribute) {\n return isContentAttribute(d.attribute);\n }\n return false;\n}\n\nconst nonDeterministic: Classifier = (d) => {\n if (!isValueDivergence(d)) return null;\n if (!bothDiffer(d)) return null;\n if (!isRandomLike(d.server) || !isRandomLike(d.client)) return null;\n return {\n category: 'non-deterministic-value',\n confidence: 0.9,\n explanation:\n 'The server and client rendered different random-looking values ' +\n '(an id, token, or Math.random() output). Anything non-deterministic ' +\n 'in render produces a different value on each side.',\n suggestion:\n 'Use React `useId()` for ids. For random values, generate them after ' +\n 'mount (in `useEffect`) or pass a value down from the server so both ' +\n 'sides agree. Never call `Math.random()`/`crypto` during render.',\n docsUrl: docs('non-deterministic-value'),\n };\n};\n\nconst dateTime: Classifier = (d) => {\n if (!isValueDivergence(d)) return null;\n if (!bothDiffer(d)) return null;\n const serverTs = toTimestamp(d.server);\n const clientTs = toTimestamp(d.client);\n const bothTimes = looksLikeTime(d.server) && looksLikeTime(d.client);\n if (serverTs == null || clientTs == null) {\n if (!bothTimes) return null;\n }\n const delta =\n serverTs != null && clientTs != null ? Math.abs(serverTs - clientTs) : 0;\n const smallDelta = delta > 0 && delta < 24 * 60 * 60 * 1000;\n return {\n category: 'date-time',\n confidence: smallDelta || bothTimes ? 0.85 : 0.7,\n explanation:\n 'The values are dates/times that differ between server render and ' +\n 'client render — the clock moved (or the timezone differs) between the ' +\n 'two environments.',\n suggestion:\n 'Render the current time after mount, or pass a single server ' +\n 'timestamp down and format it identically on both sides. Pin an ' +\n 'explicit timezone when formatting.',\n docsUrl: docs('date-time'),\n };\n};\n\nconst localeFormat: Classifier = (d) => {\n if (!isValueDivergence(d)) return null;\n if (!bothDiffer(d)) return null;\n const { server, client } = d;\n\n const scriptMismatch =\n (hasArabicIndicDigits(server) && hasLatinDigits(client)) ||\n (hasLatinDigits(server) && hasArabicIndicDigits(client));\n if (scriptMismatch) {\n return {\n category: 'locale-format',\n confidence: 0.92,\n explanation:\n 'The same value was formatted with different digit scripts ' +\n '(Arabic-Indic ٠١٢ vs Latin 012). The server and client resolved to ' +\n 'different locales.',\n suggestion:\n 'Pass an explicit `locale` (and timezone) to `Intl.NumberFormat` / ' +\n '`toLocaleString` on both server and client, or format the value ' +\n 'after mount so only the client locale is ever used.',\n docsUrl: docs('locale-format'),\n };\n }\n\n if (isSameNumberDifferentSeparators(server, client)) {\n return {\n category: 'locale-format',\n confidence: 0.82,\n explanation:\n 'The same number was formatted with different grouping/decimal ' +\n 'separators between server and client (e.g. 1,234.56 vs 1.234,56).',\n suggestion:\n 'Pass an explicit locale to `Intl.NumberFormat`/`toLocaleString` on ' +\n 'both sides so the separators match.',\n docsUrl: docs('locale-format'),\n };\n }\n\n if (isSameDateDifferentOrder(server, client)) {\n return {\n category: 'locale-format',\n confidence: 0.75,\n explanation:\n 'The same date was rendered in a different field order ' +\n '(MM/DD vs DD/MM) between server and client.',\n suggestion:\n 'Format dates with an explicit locale and timezone via `Intl` on ' +\n 'both sides.',\n docsUrl: docs('locale-format'),\n };\n }\n return null;\n};\n\nconst browserOnlyApi: Classifier = (d) => {\n const serverEmpty = d.server == null || d.server.trim() === '';\n const clientHasContent = d.client != null && d.client.trim() !== '';\n const shape =\n (d.kind === 'text' || d.kind === 'node-added') &&\n serverEmpty &&\n clientHasContent;\n if (!shape) return null;\n return {\n category: 'browser-only-api',\n confidence: 0.75,\n explanation:\n 'The client rendered content the server left empty — the signature of ' +\n 'reading a browser-only API (`window`, `document`, `localStorage`, ' +\n '`navigator`, `matchMedia`) during render.',\n suggestion:\n 'Gate browser-only reads behind a mounted flag or `useEffect`, or use ' +\n '`useSyncExternalStore` with a server snapshot so the first client ' +\n 'render matches the server.',\n docsUrl: docs('browser-only-api'),\n };\n};\n\nconst viewportBranching: Classifier = (d) => {\n const structural =\n d.kind === 'structure' ||\n d.kind === 'node-added' ||\n d.kind === 'node-removed';\n if (!structural) return null;\n if (\n isInvalidNesting(d.parentTagName, d.tagName) ||\n messageIndicatesInvalidNesting(d.reactMessage)\n ) {\n return null;\n }\n return {\n category: 'viewport-branching',\n confidence: 0.6,\n explanation:\n 'A whole subtree was added, removed, or swapped between server and ' +\n 'client — typically a JavaScript width/viewport check that branches ' +\n 'the tree at first render.',\n suggestion:\n 'Render both branches and switch between them with CSS media queries at ' +\n 'first paint instead of branching in JavaScript, or defer the ' +\n 'JS-driven branch until after mount.',\n docsUrl: docs('viewport-branching'),\n };\n};\n\nconst invalidNesting: Classifier = (d) => {\n const byMessage = messageIndicatesInvalidNesting(d.reactMessage);\n const byShape = isInvalidNesting(d.parentTagName, d.tagName);\n if (!byMessage && !byShape) return null;\n return {\n category: 'invalid-html-nesting',\n confidence: byMessage ? 0.9 : 0.72,\n explanation:\n 'A node was moved or ejected because the markup is invalid HTML ' +\n '(e.g. a `<div>` inside a `<p>`, or nested `<a>`). The browser repairs ' +\n 'the server DOM, so it no longer matches what React expects.',\n suggestion:\n 'Fix the markup validity: block elements cannot live inside `<p>`, ' +\n 'anchors cannot nest, etc. Replace the invalid parent with a `<div>` or ' +\n 'restructure the tree.',\n docsUrl: docs('invalid-html-nesting'),\n };\n};\n\nconst whitespaceMinification: Classifier = (d) => {\n if (d.kind !== 'text') return null;\n if (d.server == null || d.client == null) return null;\n if (d.server === d.client) return null;\n const collapse = (s: string) => s.replace(/\\s+/g, ' ').trim();\n if (collapse(d.server) !== collapse(d.client)) return null;\n return {\n category: 'whitespace-minification',\n confidence: 0.7,\n explanation:\n 'The mismatch is whitespace-only — the text is identical apart from ' +\n 'spaces/newlines. An HTML minifier likely collapsed whitespace around ' +\n 'the hydration root differently from React.',\n suggestion:\n 'Check your HTML minifier settings (e.g. `conservativeCollapse`) around ' +\n 'the app root, or avoid minifying whitespace inside hydrated markup.',\n docsUrl: docs('whitespace-minification'),\n };\n};\n\nconst thirdPartyDomMutation: Classifier = (d) => {\n if (d.kind === 'attribute' && d.attribute) {\n if (isExtensionAttribute(d.attribute)) {\n return {\n category: 'third-party-dom-mutation',\n confidence: 0.88,\n explanation:\n `The attribute \\`${d.attribute}\\` was injected by a browser ` +\n 'extension or third-party script (e.g. Grammarly, ColorZilla) ' +\n 'before hydration, so the client DOM no longer matches the server.',\n suggestion:\n 'This is usually harmless. Add `suppressHydrationWarning` to the ' +\n 'affected element, or defer third-party script init until after ' +\n 'hydration.',\n docsUrl: docs('third-party-dom-mutation'),\n };\n }\n const atRoot = /^(html|body)\\b/.test(d.path) && d.server == null;\n if (atRoot) {\n return {\n category: 'third-party-dom-mutation',\n confidence: 0.6,\n explanation:\n `An attribute (\\`${d.attribute}\\`) appeared on a root element that ` +\n 'the server never sent — a hallmark of an extension or early ' +\n 'third-party script mutating the DOM.',\n suggestion:\n 'Add `suppressHydrationWarning` to the root element, or defer the ' +\n 'third-party script until after hydration.',\n docsUrl: docs('third-party-dom-mutation'),\n };\n }\n }\n\n // An injected node (iframe/embed, or a known ads/consent/analytics/chat\n // marker) the server never rendered — not part of the app's hydration.\n if (\n (d.kind === 'node-added' || d.kind === 'node-removed') &&\n looksLikeThirdPartyNode(d.client ?? d.server, d.tagName)\n ) {\n const tag = (d.tagName ?? 'element').toLowerCase();\n return {\n category: 'third-party-dom-mutation',\n confidence: 0.7,\n explanation:\n `A <${tag}> was injected by a third-party script or browser extension ` +\n '(ads, consent, analytics, chat) after the server render. It is not ' +\n \"part of your app's hydration, so this is usually harmless noise.\",\n suggestion:\n 'If React warns about it, add `suppressHydrationWarning` to the ' +\n 'nearest server-rendered wrapper, or load the third-party script after ' +\n 'hydration (e.g. Next.js `<Script strategy=\"afterInteractive\">`).',\n docsUrl: docs('third-party-dom-mutation'),\n };\n }\n return null;\n};\n\n// Class / style / generic attribute mismatch that no value rule explained.\n// This is where the `forceHide` class-toggle case lands, with the exact tokens.\nconst attributeMismatch: Classifier = (d) => {\n if (d.kind !== 'attribute' || !d.attribute) return null;\n const attr = d.attribute.toLowerCase();\n const server = d.server ?? '';\n const client = d.client ?? '';\n\n if (attr === 'class' || attr === 'classname') {\n const serverSet = new Set(server.split(/\\s+/).filter(Boolean));\n const clientSet = new Set(client.split(/\\s+/).filter(Boolean));\n const added = [...clientSet].filter((c) => !serverSet.has(c));\n const removed = [...serverSet].filter((c) => !clientSet.has(c));\n const parts: string[] = [];\n if (added.length) parts.push(`added on client: ${added.join(', ')}`);\n if (removed.length) parts.push(`removed on client: ${removed.join(', ')}`);\n const detail = parts.length ? ` (${parts.join('; ')})` : '';\n return {\n category: 'attribute-mismatch',\n confidence: 0.8,\n explanation:\n `The \\`class\\` differs between server and client${detail}. A class was ` +\n 'applied conditionally on the client — commonly a viewport, media-query, ' +\n 'theme, or feature-flag check that runs during the first render.',\n suggestion:\n 'Render the same className on the server and the first client paint. ' +\n 'Move client-only conditions into `useEffect`/a mounted flag, or drive ' +\n 'the visual change with CSS media queries instead of a JS class toggle.',\n docsUrl: docs('attribute-mismatch'),\n };\n }\n\n if (attr === 'style') {\n return {\n category: 'attribute-mismatch',\n confidence: 0.75,\n explanation:\n 'The inline `style` differs between server and client — an inline ' +\n 'style was computed from client-only state (viewport size, theme, ' +\n 'scroll position) during render.',\n suggestion:\n 'Compute the style after mount (`useEffect`) so the first client render ' +\n 'matches the server, or move it to a CSS class / media query.',\n docsUrl: docs('attribute-mismatch'),\n };\n }\n\n return {\n category: 'attribute-mismatch',\n confidence: 0.6,\n explanation:\n `The \\`${d.attribute}\\` attribute differs between server (\\`${server}\\`) ` +\n `and client (\\`${client}\\`) — its value was derived from something that ` +\n 'differs between the server and the first client render.',\n suggestion:\n 'Make the attribute deterministic across server and client, or set it ' +\n 'after mount so the first client render matches the server HTML.',\n docsUrl: docs('attribute-mismatch'),\n };\n};\n\nexport const BUILT_IN_RULES: readonly Classifier[] = [\n nonDeterministic,\n dateTime,\n localeFormat,\n // Third-party runs before browser-only/viewport so an injected iframe is\n // labelled correctly instead of \"browser-only API\" or \"viewport branching\".\n thirdPartyDomMutation,\n browserOnlyApi,\n viewportBranching,\n invalidNesting,\n whitespaceMinification,\n // Catch-all for class/style/generic attribute diffs — after the specific\n // rules so extension attributes and content values are handled first.\n attributeMismatch,\n];\n\nexport const UNKNOWN_CAUSE: Cause = {\n category: 'unknown',\n confidence: 0,\n explanation:\n 'A hydration mismatch was detected but could not be matched to a known ' +\n 'cause. Inspect the server vs client values above.',\n suggestion:\n 'Compare the server and client values. Common causes are ' +\n 'non-deterministic values, dates/locales, and browser-only APIs used ' +\n 'during render.',\n docsUrl: docs('unknown'),\n};\n","import type { Cause, Classifier, Divergence } from '../types';\nimport { BUILT_IN_RULES, UNKNOWN_CAUSE } from './rules';\n\nexport const CONFIDENCE_THRESHOLD = 0.5;\n\nexport interface ClassifyOptions {\n extra?: readonly Classifier[];\n threshold?: number;\n}\n\nexport function classify(\n divergence: Divergence,\n options: ClassifyOptions = {},\n): Cause {\n const threshold = options.threshold ?? CONFIDENCE_THRESHOLD;\n const rules: readonly Classifier[] = [\n ...(options.extra ?? []),\n ...BUILT_IN_RULES,\n ];\n\n for (const rule of rules) {\n let result: Cause | null = null;\n try {\n result = rule(divergence);\n } catch {\n result = null;\n }\n if (result && result.confidence >= threshold) {\n return result;\n }\n }\n return UNKNOWN_CAUSE;\n}\n\nexport { BUILT_IN_RULES, UNKNOWN_CAUSE } from './rules';\n","import { classify, type ClassifyOptions } from './classify';\nimport type {\n Cause,\n DetectionContext,\n Divergence,\n HydrationReport,\n} from './types';\n\nexport type ReportSink = (report: HydrationReport) => void;\n\nlet counter = 0;\n\nfunction nextId(): string {\n counter += 1;\n return `wh_${Date.now().toString(36)}_${counter}`;\n}\n\nfunction truncate(value: string | null, max = 300): string | null {\n if (value == null) return null;\n return value.length > max ? `${value.slice(0, max)}…` : value;\n}\n\nexport function buildReport(\n divergence: Divergence,\n cause: Cause,\n context: DetectionContext = {},\n): HydrationReport {\n return {\n id: nextId(),\n timestamp: Date.now(),\n component: context.component,\n componentStack: context.componentStack,\n location: context.location,\n node: {\n path: divergence.path,\n tagName: divergence.tagName,\n attribute: divergence.attribute,\n kind: divergence.kind,\n },\n server: truncate(divergence.server),\n client: truncate(divergence.client),\n cause,\n raw: context.reactMessage\n ? { reactMessage: context.reactMessage }\n : undefined,\n };\n}\n\n// Deduplicate by the *values* of the mismatch, not the DOM path. The same\n// mismatch is often reported twice — once from React's console message (path\n// `body`) and once from the DOM diff (a precise selector path) — and those must\n// collapse into one report.\nexport function signatureOf(report: HydrationReport): string {\n return [\n report.node.kind,\n report.node.attribute ?? '',\n report.cause.category,\n report.server ?? '',\n report.client ?? '',\n ].join('|');\n}\n\nexport interface CollectorOptions extends ClassifyOptions {\n maxReports?: number;\n ignore?: (divergence: Divergence) => boolean;\n}\n\nexport class ReportCollector {\n private readonly seen = new Set<string>();\n private readonly sinks = new Set<ReportSink>();\n private readonly reports: HydrationReport[] = [];\n private readonly maxReports: number;\n private readonly options: CollectorOptions;\n\n constructor(options: CollectorOptions = {}) {\n this.options = options;\n this.maxReports = options.maxReports ?? 25;\n }\n\n addSink(sink: ReportSink): () => void {\n this.sinks.add(sink);\n return () => this.sinks.delete(sink);\n }\n\n getReports(): readonly HydrationReport[] {\n return this.reports;\n }\n\n get isFull(): boolean {\n return this.reports.length >= this.maxReports;\n }\n\n report(\n divergence: Divergence,\n context: DetectionContext = {},\n ): HydrationReport | null {\n if (this.isFull) return null;\n if (this.options.ignore?.(divergence)) return null;\n\n const cause = classify(divergence, {\n extra: this.options.extra,\n threshold: this.options.threshold,\n });\n const report = buildReport(divergence, cause, context);\n const signature = signatureOf(report);\n if (this.seen.has(signature)) return null;\n\n this.seen.add(signature);\n this.reports.push(report);\n for (const sink of this.sinks) {\n try {\n sink(report);\n } catch {\n /* a failing sink must not stop the others */\n }\n }\n return report;\n }\n\n reset(): void {\n this.seen.clear();\n this.reports.length = 0;\n }\n}\n","import type { Divergence } from './types';\n\nexport function isHydrationMessage(message: string): boolean {\n return (\n /hydrat/i.test(message) ||\n /did(?:n't| not) match/i.test(message) ||\n /won't be patched up/i.test(message) ||\n /hydration-mismatch/i.test(message) ||\n /server (?:HTML|rendered)/i.test(message) ||\n /validateDOMNesting/i.test(message) ||\n /Text content does not match/i.test(message)\n );\n}\n\nfunction stringify(v: unknown): string {\n return typeof v === 'string' ? v : String(v);\n}\n\nexport function formatConsoleArgs(args: readonly unknown[]): string {\n if (args.length === 0) return '';\n const [first, ...rest] = args;\n if (typeof first === 'string' && /%[sco]/.test(first)) {\n let i = 0;\n const expanded = first.replace(/%[sco]/g, () => stringify(rest[i++] ?? ''));\n const leftover = rest.slice(i).map(stringify).filter(Boolean);\n return [expanded, ...leftover].join('\\n').trim();\n }\n return args.map(stringify).join(' ');\n}\n\n// Next.js / React internal components we never want to name as the culprit.\nfunction isInternalComponent(name: string): boolean {\n return (\n /^(Inner|Outer|Segment|Client|Server|Redirect|Error|Loading|HTTPAccess|RenderFrom|ScrollAndFocus|Metadata|Outlet|ViewTransition|NotFound|Hot|DevRoot|App)$/.test(\n name,\n ) ||\n /^(Inner|Outer|Segment|Client|Server|Redirect|Error|Loading|HTTPAccess|RenderFrom|ScrollAndFocus|Metadata|Outlet|ViewTransition|NotFound|Hot|DevRoot)[A-Z]/.test(\n name,\n ) ||\n /(Boundary|Router|Handler|Provider|Context|Root|Node)$/.test(name) ||\n name === 'Fragment' ||\n name === 'Suspense'\n );\n}\n\n/** The nearest user component named in a React hydration diff tree. */\nexport function extractComponentFromMessage(\n message: string,\n): string | undefined {\n const names: string[] = [];\n const re = /<([A-Z][A-Za-z0-9_]*)\\b/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(message)) !== null) {\n const name = m[1];\n if (name && !isInternalComponent(name)) names.push(name);\n }\n return names.length ? names[names.length - 1] : undefined;\n}\n\nconst ATTR_RE = /^([\\w:-]+)=(?:\"([\\s\\S]*)\"|\\{([\\s\\S]*)\\})$/;\n\n/**\n * Modern React (18.3+/19) prints hydration mismatches as a JSX diff tree with\n * `+` (client) and `-` (server) lines. This extracts the changed attribute or\n * text and both values.\n */\nfunction parseModernDiff(message: string): Divergence | null {\n const plus: string[] = [];\n const minus: string[] = [];\n for (const raw of message.split('\\n')) {\n const line = raw.trim();\n const p = /^\\+\\s+(.+)$/.exec(line);\n const mn = /^-\\s+(.+)$/.exec(line);\n if (p && p[1]) plus.push(p[1].trim());\n else if (mn && mn[1]) minus.push(mn[1].trim());\n }\n if (plus.length === 0 && minus.length === 0) return null;\n\n // Prefer a matching attribute pair (same attribute on + and -).\n for (const p of plus) {\n const pm = ATTR_RE.exec(p);\n if (!pm) continue;\n const name = pm[1];\n const clientValue = pm[2] ?? pm[3] ?? '';\n const matched = minus.find((mm) => {\n const parsed = ATTR_RE.exec(mm);\n return parsed && parsed[1] === name;\n });\n if (matched) {\n const parsed = ATTR_RE.exec(matched);\n const serverValue = parsed ? (parsed[2] ?? parsed[3] ?? '') : '';\n return {\n kind: 'attribute',\n path: 'body',\n attribute: name,\n server: serverValue,\n client: clientValue,\n reactMessage: message,\n };\n }\n }\n\n // Otherwise a text/content change: pick the non-attribute lines.\n const client = plus.find((p) => !ATTR_RE.test(p)) ?? null;\n const server = minus.find((m) => !ATTR_RE.test(m)) ?? null;\n if (client !== null || server !== null) {\n return {\n kind: 'text',\n path: 'body',\n server,\n client,\n reactMessage: message,\n };\n }\n return null;\n}\n\nexport function parseHydrationMessage(message: string): Divergence | null {\n if (!isHydrationMessage(message)) return null;\n\n // Invalid nesting is reported as its own message in every React version.\n const nesting =\n /<(\\w+)>\\s*cannot (?:appear as a|be a|contain a) (?:child|descendant)/i.exec(\n message,\n );\n if (nesting || /validateDOMNesting/i.test(message)) {\n const pair =\n /<(\\w+)>\\s*cannot (?:appear as a|be a) (?:child|descendant) of <?(\\w+)>?/i.exec(\n message,\n );\n return {\n kind: 'structure',\n path: 'body',\n tagName: pair ? pair[1]?.toUpperCase() : undefined,\n parentTagName: pair ? pair[2]?.toUpperCase() : undefined,\n server: null,\n client: null,\n reactMessage: message,\n };\n }\n\n // Modern diff-tree format (React 18.3+/19).\n const modern = parseModernDiff(message);\n if (modern) return modern;\n\n // Legacy explicit formats (React <18.3).\n const text =\n /Text content (?:did not match|does not match)[^:]*Server:\\s*\"?(.*?)\"?\\s+Client:\\s*\"?(.*?)\"?\\s*$/i.exec(\n message,\n );\n if (text) {\n return {\n kind: 'text',\n path: 'body',\n server: text[1] ?? null,\n client: text[2] ?? null,\n reactMessage: message,\n };\n }\n\n const prop =\n /Prop [`'\"]([^`'\"]+)[`'\"] did not match\\.?\\s*Server:\\s*\"?(.*?)\"?\\s+Client:\\s*\"?(.*?)\"?\\s*$/i.exec(\n message,\n );\n if (prop) {\n return {\n kind: 'attribute',\n path: 'body',\n attribute: prop[1],\n server: prop[2] ?? null,\n client: prop[3] ?? null,\n reactMessage: message,\n };\n }\n\n const expected =\n /Expected server HTML to contain a matching <(\\w+)>(?: in <(\\w+)>)?/i.exec(\n message,\n );\n if (expected) {\n return {\n kind: 'node-added',\n path: 'body',\n tagName: expected[1]?.toUpperCase(),\n parentTagName: expected[2]?.toUpperCase(),\n server: null,\n client: `<${expected[1]?.toLowerCase()}>`,\n reactMessage: message,\n };\n }\n const notExpected =\n /Did not expect server HTML to contain(?: the text node)?(?: a)? <?(\\w+)>?/i.exec(\n message,\n );\n if (notExpected) {\n return {\n kind: 'node-removed',\n path: 'body',\n tagName: notExpected[1]?.toUpperCase(),\n server: `<${notExpected[1]?.toLowerCase()}>`,\n client: null,\n reactMessage: message,\n };\n }\n\n return {\n kind: 'structure',\n path: 'body',\n server: null,\n client: null,\n reactMessage: message,\n };\n}\n\n/**\n * Extract EVERY divergence a single React hydration message describes. A modern\n * diff tree can list several changed attributes/text nodes at once; class/style\n * mismatches are only visible here (React doesn't patch attributes into the DOM),\n * so we must not stop at the first.\n */\nexport function parseAllHydrationDivergences(message: string): Divergence[] {\n if (!isHydrationMessage(message)) return [];\n\n const plus: string[] = [];\n const minus: string[] = [];\n for (const raw of message.split('\\n')) {\n const line = raw.trim();\n const p = /^\\+\\s+(.+)$/.exec(line);\n const mn = /^-\\s+(.+)$/.exec(line);\n if (p && p[1]) plus.push(p[1].trim());\n else if (mn && mn[1]) minus.push(mn[1].trim());\n }\n if (plus.length === 0 && minus.length === 0) {\n const single = parseHydrationMessage(message);\n return single ? [single] : [];\n }\n\n const out: Divergence[] = [];\n const attrMinus = minus.filter((m) => ATTR_RE.test(m));\n const usedMinus = new Set<number>();\n\n for (const p of plus) {\n const pm = ATTR_RE.exec(p);\n if (!pm) continue;\n const name = pm[1];\n const clientValue = pm[2] ?? pm[3] ?? '';\n const idx = attrMinus.findIndex((m, k) => {\n if (usedMinus.has(k)) return false;\n const parsed = ATTR_RE.exec(m);\n return parsed?.[1] === name;\n });\n if (idx >= 0) {\n usedMinus.add(idx);\n const parsed = ATTR_RE.exec(attrMinus[idx]!);\n out.push({\n kind: 'attribute',\n path: 'body',\n attribute: name,\n server: parsed ? (parsed[2] ?? parsed[3] ?? '') : '',\n client: clientValue,\n reactMessage: message,\n });\n }\n }\n\n const textPlus = plus.filter((p) => !ATTR_RE.test(p));\n const textMinus = minus.filter((m) => !ATTR_RE.test(m));\n const len = Math.max(textPlus.length, textMinus.length);\n for (let i = 0; i < len; i++) {\n const client = textPlus[i] ?? null;\n const server = textMinus[i] ?? null;\n if (client !== null || server !== null) {\n out.push({ kind: 'text', path: 'body', server, client, reactMessage: message });\n }\n }\n\n return out.length ? out : (parseHydrationMessage(message) ? [parseHydrationMessage(message)!] : []);\n}\n","import { collectSnapshotAgainstDom } from './diff';\nimport {\n extractComponentFromMessage,\n parseAllHydrationDivergences,\n} from './react-message';\nimport { getServerHtmlForRoot } from './snapshot';\nimport type { DetectionContext, Divergence } from './types';\nimport type { ReportCollector } from './report';\n\n// Diff the server snapshot against a live root and report EVERY divergence\n// (deduped by value in the collector). Returns how many new reports were made.\nexport function inspectRoot(\n root: Element,\n collector: ReportCollector,\n context: DetectionContext = {},\n enrich?: (divergence: Divergence) => DetectionContext,\n): number {\n const serverHtml = getServerHtmlForRoot(root);\n if (serverHtml == null) return 0;\n const divergences = collectSnapshotAgainstDom(serverHtml, root);\n let reported = 0;\n for (const divergence of divergences) {\n if (context.reactMessage && !divergence.reactMessage) {\n divergence.reactMessage = context.reactMessage;\n }\n const enriched = enrich ? enrich(divergence) : {};\n if (collector.report(divergence, { ...context, ...enriched }) != null) {\n reported += 1;\n }\n }\n return reported;\n}\n\n// Report every divergence a React hydration message describes. Deduped by value\n// in the collector, so it's safe to call alongside the DOM diff and repeatedly.\nexport function reportFromMessage(\n message: string,\n collector: ReportCollector,\n context: DetectionContext = {},\n): number {\n const divergences = parseAllHydrationDivergences(message);\n const component = extractComponentFromMessage(message) ?? context.component;\n let reported = 0;\n for (const divergence of divergences) {\n if (\n collector.report(divergence, { ...context, component, reactMessage: message }) !=\n null\n ) {\n reported += 1;\n }\n }\n return reported;\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,73 +1,73 @@
1
1
  'use strict';
2
2
 
3
- var chunkCDNKC2LD_cjs = require('./chunk-CDNKC2LD.cjs');
3
+ var chunkDSO337ME_cjs = require('./chunk-DSO337ME.cjs');
4
4
  var chunkOGQEPU7G_cjs = require('./chunk-OGQEPU7G.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "BUILT_IN_RULES", {
9
9
  enumerable: true,
10
- get: function () { return chunkCDNKC2LD_cjs.BUILT_IN_RULES; }
10
+ get: function () { return chunkDSO337ME_cjs.BUILT_IN_RULES; }
11
11
  });
12
12
  Object.defineProperty(exports, "CONFIDENCE_THRESHOLD", {
13
13
  enumerable: true,
14
- get: function () { return chunkCDNKC2LD_cjs.CONFIDENCE_THRESHOLD; }
14
+ get: function () { return chunkDSO337ME_cjs.CONFIDENCE_THRESHOLD; }
15
15
  });
16
16
  Object.defineProperty(exports, "ReportCollector", {
17
17
  enumerable: true,
18
- get: function () { return chunkCDNKC2LD_cjs.ReportCollector; }
18
+ get: function () { return chunkDSO337ME_cjs.ReportCollector; }
19
19
  });
20
20
  Object.defineProperty(exports, "UNKNOWN_CAUSE", {
21
21
  enumerable: true,
22
- get: function () { return chunkCDNKC2LD_cjs.UNKNOWN_CAUSE; }
22
+ get: function () { return chunkDSO337ME_cjs.UNKNOWN_CAUSE; }
23
23
  });
24
24
  Object.defineProperty(exports, "buildReport", {
25
25
  enumerable: true,
26
- get: function () { return chunkCDNKC2LD_cjs.buildReport; }
26
+ get: function () { return chunkDSO337ME_cjs.buildReport; }
27
27
  });
28
28
  Object.defineProperty(exports, "classify", {
29
29
  enumerable: true,
30
- get: function () { return chunkCDNKC2LD_cjs.classify; }
30
+ get: function () { return chunkDSO337ME_cjs.classify; }
31
31
  });
32
32
  Object.defineProperty(exports, "diffSnapshotAgainstDom", {
33
33
  enumerable: true,
34
- get: function () { return chunkCDNKC2LD_cjs.diffSnapshotAgainstDom; }
34
+ get: function () { return chunkDSO337ME_cjs.diffSnapshotAgainstDom; }
35
35
  });
36
36
  Object.defineProperty(exports, "diffTrees", {
37
37
  enumerable: true,
38
- get: function () { return chunkCDNKC2LD_cjs.diffTrees; }
38
+ get: function () { return chunkDSO337ME_cjs.diffTrees; }
39
39
  });
40
40
  Object.defineProperty(exports, "formatConsoleArgs", {
41
41
  enumerable: true,
42
- get: function () { return chunkCDNKC2LD_cjs.formatConsoleArgs; }
42
+ get: function () { return chunkDSO337ME_cjs.formatConsoleArgs; }
43
43
  });
44
44
  Object.defineProperty(exports, "inspectRoot", {
45
45
  enumerable: true,
46
- get: function () { return chunkCDNKC2LD_cjs.inspectRoot; }
46
+ get: function () { return chunkDSO337ME_cjs.inspectRoot; }
47
47
  });
48
48
  Object.defineProperty(exports, "isDev", {
49
49
  enumerable: true,
50
- get: function () { return chunkCDNKC2LD_cjs.isDev; }
50
+ get: function () { return chunkDSO337ME_cjs.isDev; }
51
51
  });
52
52
  Object.defineProperty(exports, "isHydrationMessage", {
53
53
  enumerable: true,
54
- get: function () { return chunkCDNKC2LD_cjs.isHydrationMessage; }
54
+ get: function () { return chunkDSO337ME_cjs.isHydrationMessage; }
55
55
  });
56
56
  Object.defineProperty(exports, "parseHydrationMessage", {
57
57
  enumerable: true,
58
- get: function () { return chunkCDNKC2LD_cjs.parseHydrationMessage; }
58
+ get: function () { return chunkDSO337ME_cjs.parseHydrationMessage; }
59
59
  });
60
60
  Object.defineProperty(exports, "parseServerHtml", {
61
61
  enumerable: true,
62
- get: function () { return chunkCDNKC2LD_cjs.parseServerHtml; }
62
+ get: function () { return chunkDSO337ME_cjs.parseServerHtml; }
63
63
  });
64
64
  Object.defineProperty(exports, "reportFromMessage", {
65
65
  enumerable: true,
66
- get: function () { return chunkCDNKC2LD_cjs.reportFromMessage; }
66
+ get: function () { return chunkDSO337ME_cjs.reportFromMessage; }
67
67
  });
68
68
  Object.defineProperty(exports, "signatureOf", {
69
69
  enumerable: true,
70
- get: function () { return chunkCDNKC2LD_cjs.signatureOf; }
70
+ get: function () { return chunkDSO337ME_cjs.signatureOf; }
71
71
  });
72
72
  Object.defineProperty(exports, "DEFAULT_SNAPSHOT_SELECTORS", {
73
73
  enumerable: true,
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { D as Divergence, C as Classifier, a as Cause, H as HydrationReport, b as DetectionContext } from './types-CDtDTiIa.cjs';
2
- export { c as DivergenceKind, d as HydrationCauseCategory, S as SourceLocation } from './types-CDtDTiIa.cjs';
1
+ import { D as Divergence, C as Classifier, a as Cause, H as HydrationReport, b as DetectionContext } from './types-6wTih14e.cjs';
2
+ export { c as DivergenceKind, d as HydrationCauseCategory, S as SourceLocation } from './types-6wTih14e.cjs';
3
3
 
4
4
  declare const isDev: boolean;
5
5
 
@@ -21,7 +21,7 @@ declare function getServerHtmlForRoot(root: Element): string | undefined;
21
21
  declare function captureSnapshotNow(selectors?: readonly string[]): Snapshot | undefined;
22
22
 
23
23
  declare function parseServerHtml(html: string, rootTagName: string): Element;
24
- declare function diffTrees(serverRoot: Element, clientRoot: Element, basePath?: string): Divergence | null;
24
+ declare function diffTrees(serverRoot: Element, clientRoot: Element): Divergence | null;
25
25
  declare function diffSnapshotAgainstDom(serverHtml: string, clientRoot: Element): Divergence | null;
26
26
 
27
27
  declare const BUILT_IN_RULES: readonly Classifier[];
@@ -55,8 +55,8 @@ declare class ReportCollector {
55
55
  reset(): void;
56
56
  }
57
57
 
58
- declare function inspectRoot(root: Element, collector: ReportCollector, context?: DetectionContext): boolean;
59
- declare function reportFromMessage(message: string, collector: ReportCollector, context?: DetectionContext): boolean;
58
+ declare function inspectRoot(root: Element, collector: ReportCollector, context?: DetectionContext, enrich?: (divergence: Divergence) => DetectionContext): number;
59
+ declare function reportFromMessage(message: string, collector: ReportCollector, context?: DetectionContext): number;
60
60
 
61
61
  declare function isHydrationMessage(message: string): boolean;
62
62
  declare function formatConsoleArgs(args: readonly unknown[]): string;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { D as Divergence, C as Classifier, a as Cause, H as HydrationReport, b as DetectionContext } from './types-CDtDTiIa.js';
2
- export { c as DivergenceKind, d as HydrationCauseCategory, S as SourceLocation } from './types-CDtDTiIa.js';
1
+ import { D as Divergence, C as Classifier, a as Cause, H as HydrationReport, b as DetectionContext } from './types-6wTih14e.js';
2
+ export { c as DivergenceKind, d as HydrationCauseCategory, S as SourceLocation } from './types-6wTih14e.js';
3
3
 
4
4
  declare const isDev: boolean;
5
5
 
@@ -21,7 +21,7 @@ declare function getServerHtmlForRoot(root: Element): string | undefined;
21
21
  declare function captureSnapshotNow(selectors?: readonly string[]): Snapshot | undefined;
22
22
 
23
23
  declare function parseServerHtml(html: string, rootTagName: string): Element;
24
- declare function diffTrees(serverRoot: Element, clientRoot: Element, basePath?: string): Divergence | null;
24
+ declare function diffTrees(serverRoot: Element, clientRoot: Element): Divergence | null;
25
25
  declare function diffSnapshotAgainstDom(serverHtml: string, clientRoot: Element): Divergence | null;
26
26
 
27
27
  declare const BUILT_IN_RULES: readonly Classifier[];
@@ -55,8 +55,8 @@ declare class ReportCollector {
55
55
  reset(): void;
56
56
  }
57
57
 
58
- declare function inspectRoot(root: Element, collector: ReportCollector, context?: DetectionContext): boolean;
59
- declare function reportFromMessage(message: string, collector: ReportCollector, context?: DetectionContext): boolean;
58
+ declare function inspectRoot(root: Element, collector: ReportCollector, context?: DetectionContext, enrich?: (divergence: Divergence) => DetectionContext): number;
59
+ declare function reportFromMessage(message: string, collector: ReportCollector, context?: DetectionContext): number;
60
60
 
61
61
  declare function isHydrationMessage(message: string): boolean;
62
62
  declare function formatConsoleArgs(args: readonly unknown[]): string;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { BUILT_IN_RULES, CONFIDENCE_THRESHOLD, ReportCollector, UNKNOWN_CAUSE, buildReport, classify, diffSnapshotAgainstDom, diffTrees, formatConsoleArgs, inspectRoot, isDev, isHydrationMessage, parseHydrationMessage, parseServerHtml, reportFromMessage, signatureOf } from './chunk-WJ3ZOW4D.js';
1
+ export { BUILT_IN_RULES, CONFIDENCE_THRESHOLD, ReportCollector, UNKNOWN_CAUSE, buildReport, classify, diffSnapshotAgainstDom, diffTrees, formatConsoleArgs, inspectRoot, isDev, isHydrationMessage, parseHydrationMessage, parseServerHtml, reportFromMessage, signatureOf } from './chunk-WQLUD25W.js';
2
2
  export { DEFAULT_SNAPSHOT_SELECTORS, SNAPSHOT_KEY, captureSnapshotNow, getServerHtmlForRoot, getSnapshotScriptSource, readSnapshot } from './chunk-FV3PEJQE.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,19 +1,19 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkVUGHOMMU_cjs = require('../chunk-VUGHOMMU.cjs');
5
- require('../chunk-CDNKC2LD.cjs');
4
+ var chunkMTAU6G26_cjs = require('../chunk-MTAU6G26.cjs');
5
+ require('../chunk-DSO337ME.cjs');
6
6
  require('../chunk-OGQEPU7G.cjs');
7
7
 
8
8
 
9
9
 
10
10
  Object.defineProperty(exports, "HydrationInspector", {
11
11
  enumerable: true,
12
- get: function () { return chunkVUGHOMMU_cjs.HydrationInspector; }
12
+ get: function () { return chunkMTAU6G26_cjs.HydrationInspector; }
13
13
  });
14
14
  Object.defineProperty(exports, "createHydrationInspector", {
15
15
  enumerable: true,
16
- get: function () { return chunkVUGHOMMU_cjs.createHydrationInspector; }
16
+ get: function () { return chunkMTAU6G26_cjs.createHydrationInspector; }
17
17
  });
18
18
  //# sourceMappingURL=index.cjs.map
19
19
  //# sourceMappingURL=index.cjs.map
@@ -1,3 +1,3 @@
1
1
  export { HydrationInspector, HydrationInspectorHandle, HydrationInspectorProps, InspectorOptions, OverlayOptions, createHydrationInspector } from '../react.cjs';
2
- export { d as HydrationCauseCategory, H as HydrationReport } from '../types-CDtDTiIa.cjs';
2
+ export { d as HydrationCauseCategory, H as HydrationReport } from '../types-6wTih14e.cjs';
3
3
  import 'react';
@@ -1,3 +1,3 @@
1
1
  export { HydrationInspector, HydrationInspectorHandle, HydrationInspectorProps, InspectorOptions, OverlayOptions, createHydrationInspector } from '../react.js';
2
- export { d as HydrationCauseCategory, H as HydrationReport } from '../types-CDtDTiIa.js';
2
+ export { d as HydrationCauseCategory, H as HydrationReport } from '../types-6wTih14e.js';
3
3
  import 'react';
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- export { HydrationInspector, createHydrationInspector } from '../chunk-ZMAUNJJR.js';
3
- import '../chunk-WJ3ZOW4D.js';
2
+ export { HydrationInspector, createHydrationInspector } from '../chunk-NQX4TBV5.js';
3
+ import '../chunk-WQLUD25W.js';
4
4
  import '../chunk-FV3PEJQE.js';
5
5
  //# sourceMappingURL=index.js.map
6
6
  //# sourceMappingURL=index.js.map
package/dist/react.cjs CHANGED
@@ -1,19 +1,19 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkVUGHOMMU_cjs = require('./chunk-VUGHOMMU.cjs');
5
- require('./chunk-CDNKC2LD.cjs');
4
+ var chunkMTAU6G26_cjs = require('./chunk-MTAU6G26.cjs');
5
+ require('./chunk-DSO337ME.cjs');
6
6
  require('./chunk-OGQEPU7G.cjs');
7
7
 
8
8
 
9
9
 
10
10
  Object.defineProperty(exports, "HydrationInspector", {
11
11
  enumerable: true,
12
- get: function () { return chunkVUGHOMMU_cjs.HydrationInspector; }
12
+ get: function () { return chunkMTAU6G26_cjs.HydrationInspector; }
13
13
  });
14
14
  Object.defineProperty(exports, "createHydrationInspector", {
15
15
  enumerable: true,
16
- get: function () { return chunkVUGHOMMU_cjs.createHydrationInspector; }
16
+ get: function () { return chunkMTAU6G26_cjs.createHydrationInspector; }
17
17
  });
18
18
  //# sourceMappingURL=react.cjs.map
19
19
  //# sourceMappingURL=react.cjs.map
package/dist/react.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
- import { H as HydrationReport, C as Classifier } from './types-CDtDTiIa.cjs';
3
- export { a as Cause, b as DetectionContext, D as Divergence, d as HydrationCauseCategory } from './types-CDtDTiIa.cjs';
2
+ import { H as HydrationReport, C as Classifier } from './types-6wTih14e.cjs';
3
+ export { a as Cause, b as DetectionContext, D as Divergence, d as HydrationCauseCategory } from './types-6wTih14e.cjs';
4
4
 
5
5
  interface OverlayOptions {
6
6
  position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
package/dist/react.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
- import { H as HydrationReport, C as Classifier } from './types-CDtDTiIa.js';
3
- export { a as Cause, b as DetectionContext, D as Divergence, d as HydrationCauseCategory } from './types-CDtDTiIa.js';
2
+ import { H as HydrationReport, C as Classifier } from './types-6wTih14e.js';
3
+ export { a as Cause, b as DetectionContext, D as Divergence, d as HydrationCauseCategory } from './types-6wTih14e.js';
4
4
 
5
5
  interface OverlayOptions {
6
6
  position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
package/dist/react.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- export { HydrationInspector, createHydrationInspector } from './chunk-ZMAUNJJR.js';
3
- import './chunk-WJ3ZOW4D.js';
2
+ export { HydrationInspector, createHydrationInspector } from './chunk-NQX4TBV5.js';
3
+ import './chunk-WQLUD25W.js';
4
4
  import './chunk-FV3PEJQE.js';
5
5
  //# sourceMappingURL=react.js.map
6
6
  //# sourceMappingURL=react.js.map
@@ -1,5 +1,5 @@
1
1
  type DivergenceKind = 'text' | 'attribute' | 'structure' | 'node-added' | 'node-removed';
2
- type HydrationCauseCategory = 'non-deterministic-value' | 'date-time' | 'locale-format' | 'browser-only-api' | 'viewport-branching' | 'invalid-html-nesting' | 'whitespace-minification' | 'third-party-dom-mutation' | 'unknown';
2
+ type HydrationCauseCategory = 'non-deterministic-value' | 'date-time' | 'locale-format' | 'browser-only-api' | 'viewport-branching' | 'invalid-html-nesting' | 'whitespace-minification' | 'third-party-dom-mutation' | 'attribute-mismatch' | 'unknown';
3
3
  interface Divergence {
4
4
  kind: DivergenceKind;
5
5
  path: string;
@@ -1,5 +1,5 @@
1
1
  type DivergenceKind = 'text' | 'attribute' | 'structure' | 'node-added' | 'node-removed';
2
- type HydrationCauseCategory = 'non-deterministic-value' | 'date-time' | 'locale-format' | 'browser-only-api' | 'viewport-branching' | 'invalid-html-nesting' | 'whitespace-minification' | 'third-party-dom-mutation' | 'unknown';
2
+ type HydrationCauseCategory = 'non-deterministic-value' | 'date-time' | 'locale-format' | 'browser-only-api' | 'viewport-branching' | 'invalid-html-nesting' | 'whitespace-minification' | 'third-party-dom-mutation' | 'attribute-mismatch' | 'unknown';
3
3
  interface Divergence {
4
4
  kind: DivergenceKind;
5
5
  path: string;
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "why-hydration",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Tells you which component broke hydration, what differed, and how to fix it — in dev, with zero production cost.",
5
- "license": "MIT",
6
- "author": "Razan Aboushi (https://github.com/razan-aboushi)",
5
+ "license": "UNLICENSED",
6
+ "author": "Razan Aboushi (https://www.linkedin.com/in/razan-aboushi/)",
7
7
  "homepage": "https://github.com/razan-aboushi/why-hydration#readme",
8
8
  "repository": {
9
9
  "type": "git",
@@ -15,6 +15,7 @@
15
15
  "keywords": [
16
16
  "react",
17
17
  "hydration",
18
+ "hydration error",
18
19
  "ssr",
19
20
  "next",
20
21
  "remix",
@@ -89,7 +90,7 @@
89
90
  "files": [
90
91
  "dist",
91
92
  "README.md",
92
- "LICENSE"
93
+ "CHANGELOG.md"
93
94
  ],
94
95
  "scripts": {
95
96
  "build": "tsup",
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Razan Aboushi (https://github.com/razan-aboushi)
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.