@hapticjs/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/config.ts","../src/adapters/noop.adapter.ts","../src/utils/scheduling.ts","../src/adapters/web-vibration.adapter.ts","../src/utils/platform.ts","../src/engine/capability-detector.ts","../src/engine/adaptive-engine.ts","../src/engine/fallback-manager.ts","../src/composer/pattern-composer.ts","../src/patterns/tokenizer.ts","../src/patterns/parser.ts","../src/patterns/compiler.ts","../src/engine/haptic-engine.ts","../src/patterns/validator.ts","../src/presets/ui.ts","../src/presets/notifications.ts","../src/presets/gaming.ts","../src/presets/accessibility.ts","../src/presets/system.ts","../src/presets/index.ts","../src/index.ts"],"names":["presets"],"mappings":";;;AAsCO,IAAM,cAAA,GAA+B;AAAA,EAC1C,SAAA,EAAW,CAAA;AAAA,EACX,OAAA,EAAS,IAAA;AAAA,EACT,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,EACzB,qBAAA,EAAuB;AACzB,CAAA;;;ACrCO,IAAM,cAAN,MAA2C;AAAA,EAA3C,WAAA,GAAA;AACL,IAAA,IAAA,CAAS,IAAA,GAAO,MAAA;AAChB,IAAA,IAAA,CAAS,SAAA,GAAY,KAAA;AAAA,EAAA;AAAA,EAErB,YAAA,GAAoC;AAClC,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,CAAA;AAAA,MACpB,WAAA,EAAa,CAAA;AAAA,MACb,WAAA,EAAa,CAAA;AAAA,MACb,eAAA,EAAiB,KAAA;AAAA,MACjB,iBAAA,EAAmB,KAAA;AAAA,MACnB,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAM,UAAA,EAAoB,SAAA,EAAkC;AAAA,EAElE;AAAA,EAEA,MAAM,aAAa,MAAA,EAAqC;AAAA,EAExD;AAAA,EAEA,MAAA,GAAe;AAAA,EAEf;AAAA,EAEA,OAAA,GAAgB;AAAA,EAEhB;AACF;;;AClCO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEO,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AACrE,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,EAAO,GAAG,GAAG,GAAG,CAAA;AAC3C;AAEO,SAAS,mBAAmB,SAAA,EAA2B;AAC5D,EAAA,OAAO,KAAA,CAAM,SAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AAC9B;;;ACJO,IAAM,sBAAN,MAAmD;AAAA,EAMxD,WAAA,GAAc;AALd,IAAA,IAAA,CAAS,IAAA,GAAO,eAAA;AAGhB,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AAGnB,IAAA,IAAA,CAAK,SAAA,GACH,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,IAAa,SAAA;AAAA,EACrD;AAAA,EAEA,YAAA,GAAoC;AAClC,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,CAAA;AAAA;AAAA,MACpB,WAAA,EAAa,EAAA;AAAA,MACb,WAAA,EAAa,GAAA;AAAA,MACb,eAAA,EAAiB,IAAA;AAAA,MACjB,iBAAA,EAAmB,KAAA;AAAA,MACnB,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAM,UAAA,EAAoB,QAAA,EAAiC;AAC/D,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACrB,IAAA,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,aAAa,KAAA,EAAoC;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,KAAA,CAAM,WAAW,CAAA,EAAG;AAE3C,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAGlB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAG9C,IAAA,IAAI,IAAA,CAAK,oBAAA,CAAqB,KAAK,CAAA,EAAG;AACpC,MAAA,SAAA,CAAU,QAAQ,OAAO,CAAA;AACzB,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,KAAK,UAAA,EAAY;AAErB,MAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,QAAA,IAAI,IAAA,CAAK,YAAY,GAAA,EAAK;AAExB,UAAA,IAAI,IAAA,CAAK,YAAY,GAAA,EAAK;AACxB,YAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,QAAA,EAAU,KAAK,SAAS,CAAA;AAAA,UACtD,CAAA,MAAO;AACL,YAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAC/B,YAAA,MAAM,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,UAC3B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,QAC3B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA;AAAA,EAGQ,oBAAoB,KAAA,EAA+B;AACzD,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGQ,qBAAqB,KAAA,EAA8B;AACzD,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,MACX,CAAC,MACE,CAAA,CAAE,IAAA,KAAS,WACX,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,SAAA,IAAa;AAAA,KAC5C;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,WAAA,CAAY,QAAA,EAAkB,SAAA,EAAkC;AAC5E,IAAA,MAAM,SAAA,GAAY,EAAA;AAClB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,SAAS,CAAA;AAC/C,IAAA,MAAM,UAAU,SAAA,GAAY,MAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,SAAS,CAAA;AAE9C,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,SAAA,CAAU,QAAQ,OAAO,CAAA;AACzB,MAAA,MAAM,MAAM,QAAQ,CAAA;AAAA,IACtB;AAAA,EACF;AACF;;;ACxGO,SAAS,cAAA,GAA+B;AAC7C,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,QAAA,KAAa,WAAA;AAEnE,EAAA,MAAM,MAAA,GACJ,OAAO,UAAA,KAAe,WAAA,IACtB,OAAQ,UAAA,CAAuC,OAAA,KAAY,QAAA,IAC3D,OAAS,UAAA,CAAuC,OAAA,EAAqC,QAAA,KAAa,QAAA;AACpG,EAAA,MAAM,aAAA,GACJ,OAAO,SAAA,KAAc,WAAA,IAAe,UAAU,OAAA,KAAY,aAAA;AAE5D,EAAA,MAAM,eAAA,GAAkB,SAAS,SAAA,IAAa,SAAA;AAC9C,EAAA,MAAM,aAAA,GAAgB,SAAS,aAAA,IAAiB,SAAA;AAEhD,EAAA,MAAM,EAAA,GAAK,KAAA,GAAQ,SAAA,CAAU,SAAA,GAAY,EAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA,IAAM,SAAS,SAAA,CAAU,QAAA,KAAa,UAAA,IAAc,SAAA,CAAU,cAAA,GAAiB,CAAA;AACvH,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AACnC,EAAA,MAAM,WAAW,KAAA,IAAS,SAAA;AAE1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACjCO,SAAS,aAAA,GAA+B;AAC7C,EAAA,MAAM,WAAW,cAAA,EAAe;AAGhC,EAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,IAAA,OAAO,IAAI,mBAAA,EAAoB;AAAA,EACjC;AAGA,EAAA,OAAO,IAAI,WAAA,EAAY;AACzB;;;ACXO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,KAAA,CAAM,OAAqB,YAAA,EAAiD;AAC1E,IAAA,OAAO,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,KAAK,UAAA,CAAW,IAAA,EAAM,YAAY,CAAC,CAAA;AAAA,EAChE;AAAA,EAEQ,UAAA,CAAW,MAAkB,IAAA,EAAuC;AAC1E,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,EAAK;AAG1B,IAAA,IAAI,OAAA,CAAQ,SAAS,SAAA,EAAW;AAC9B,MAAA,OAAA,CAAQ,WAAW,KAAA,CAAM,OAAA,CAAQ,UAAU,IAAA,CAAK,WAAA,EAAa,KAAK,WAAW,CAAA;AAAA,IAC/E;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,IAAqB,OAAA,CAAQ,SAAS,SAAA,EAAW;AAEzD,MAAA,OAAA,CAAQ,SAAA,GAAY,OAAA,CAAQ,SAAA,GAAY,GAAA,GAAM,CAAA,GAAM,CAAA;AAAA,IACtD,WAAW,IAAA,CAAK,kBAAA,GAAqB,CAAA,IAAK,IAAA,CAAK,qBAAqB,GAAA,EAAK;AAEvE,MAAA,MAAM,SAAS,IAAA,CAAK,kBAAA;AACpB,MAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,GAAY,MAAM,CAAA,GAAI,MAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;;;AC3BO,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,aAAa,MAAA,EAA8B;AACzC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,QAAQ,KAAA,EAAoC;AAChD,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,MAAA,EAAQ;AAEjC,IAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AAClE,IAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,SAAS,EAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,SAAS,GAAG,CAAC,CAAA;AAErG,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,YAAY,IAAA,CAAK,MAAA,CAAO,SAAS,MAAA,EAAQ;AAChE,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,aAAA,EAAe,YAAY,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,WAAW,IAAA,CAAK,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC/D,MAAA,MAAM,IAAA,CAAK,cAAA,CAAe,aAAA,EAAe,YAAY,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,CAAgB,QAAA,EAAkB,SAAA,EAAkC;AAChF,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA;AAC3B,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,QAAA,KAAa,WAAA,EAAa;AAEhD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,QAAA,CAAS,IAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,OAAA;AAC9B,IAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAEzB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,SAAA,CAAU,IAAI,SAAS,CAAA;AAC/B,MAAA,UAAA,CAAW,MAAM,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,SAAS,GAAG,QAAQ,CAAA;AAC9D,MAAA;AAAA,IACF;AAGA,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,OAAA,GAAU,MAAM,SAAA,GAAY,GAAA;AAClC,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,QAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,UAC3B,QAAA,EAAU,OAAA;AAAA,UACV,KAAA,EAAO,GAAA;AAAA,UACP,eAAA,EAAiB,iBAAiB,OAAO,CAAA,CAAA,CAAA;AAAA,UACzC,aAAA,EAAe,MAAA;AAAA,UACf,MAAA,EAAQ,OAAA;AAAA,UACR,UAAA,EAAY,WAAW,QAAQ,CAAA,WAAA;AAAA,SAChC,CAAA;AACD,QAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACjC,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AAAA,QAC1B,CAAC,CAAA;AACD,QAAA,UAAA,CAAW,MAAM,OAAA,CAAQ,MAAA,EAAO,EAAG,WAAW,GAAG,CAAA;AACjD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA;AAC1C,QAAA,OAAA,CAAQ,MAAM,UAAA,GAAa,MAAA;AAC3B,QAAA,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAA,WAAA,EAAc,SAAS,CAAA,GAAA,CAAA;AACjD,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,OAAA,CAAQ,KAAA,CAAM,UAAA,GAAa,CAAA,UAAA,EAAa,QAAQ,CAAA,WAAA,CAAA;AAChD,UAAA,OAAA,CAAQ,MAAM,SAAA,GAAY,EAAA;AAAA,QAC5B,GAAG,EAAE,CAAA;AACL,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,KAAA,GAAQ,IAAI,SAAA,GAAY,IAAA;AAC9B,QAAA,OAAA,CAAQ,KAAA,CAAM,UAAA,GAAa,CAAA,UAAA,EAAa,QAAQ,CAAA,WAAA,CAAA;AAChD,QAAA,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,CAAA;AACxC,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,OAAA,CAAQ,MAAM,SAAA,GAAY,EAAA;AAAA,QAC5B,GAAG,QAAQ,CAAA;AACX,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA,EAEA,MAAc,cAAA,CAAe,QAAA,EAAkB,SAAA,EAAkC;AAC/E,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,KAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,EAAO,OAAA,IAAW,OAAO,iBAAiB,WAAA,EAAa;AAE5D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,YAAA,EAAa;AAC7B,MAAA,MAAM,UAAA,GAAa,IAAI,gBAAA,EAAiB;AACxC,MAAA,MAAM,QAAA,GAAW,IAAI,UAAA,EAAW;AAEhC,MAAA,UAAA,CAAW,QAAQ,QAAQ,CAAA;AAC3B,MAAA,QAAA,CAAS,OAAA,CAAQ,IAAI,WAAW,CAAA;AAEhC,MAAA,UAAA,CAAW,SAAA,CAAU,KAAA,GAAQ,GAAA,GAAM,SAAA,GAAY,GAAA;AAC/C,MAAA,QAAA,CAAS,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,SAAA,GAAY,GAAA;AAEjD,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,QAAA,GAAW,GAAI,CAAA;AAEjD,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,QAAA,UAAA,CAAW,UAAU,MAAM;AACzB,UAAA,GAAA,CAAI,KAAA,EAAM;AACV,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;;;ACvGO,IAAM,kBAAN,MAAsB;AAAA,EAAtB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,QAAsB,EAAC;AAAA,EAAA;AAAA;AAAA,EAI/B,OAAO,EAAA,EAAkD;AACvD,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,GAAA,CAAI,YAAY,GAAA,EAAW;AACzB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA;AAC5D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAA,CAAQ,QAAA,EAAkB,SAAA,GAAY,CAAA,EAAW;AAC/C,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,MAAM,SAAA,EAAW,QAAA,EAAU,WAAW,CAAA;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAA,CAAK,QAAA,GAAW,GAAA,EAAK,SAAA,GAAY,GAAA,EAAW;AAC1C,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,MAAM,SAAA,EAAW,QAAA,EAAU,WAAW,CAAA;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,CAAM,WAAW,EAAA,EAAU;AACzB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,SAAS,QAAA,EAAU,SAAA,EAAW,GAAG,CAAA;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAA,CACE,cAAA,EACA,YAAA,EACA,QAAA,EACA,SAAyB,QAAA,EACnB;AACN,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,QAAA,GAAW,EAAE,CAAC,CAAA;AACvD,IAAA,MAAM,eAAe,QAAA,GAAW,SAAA;AAEhC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,CAAA,GAAI,CAAA,IAAK,SAAA,GAAY,CAAA,IAAK,CAAA,CAAA;AAChC,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAA,EAAG,MAAM,CAAA;AACpC,MAAA,MAAM,SAAA,GAAY,cAAA,GAAA,CAAkB,YAAA,GAAe,cAAA,IAAkB,MAAA;AACrE,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,YAAA,EAAc,WAAW,CAAA;AAAA,IACxE;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,KAAA,EAAe,UAAA,GAAa,IAAI,WAAA,GAAc,EAAA,EAAI,YAAY,GAAA,EAAW;AAC7E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,UAAA,EAAY,WAAW,CAAA;AACpE,MAAA,IAAI,CAAA,GAAI,QAAQ,CAAA,EAAG;AACjB,QAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,SAAS,QAAA,EAAU,WAAA,EAAa,SAAA,EAAW,CAAA,EAAG,CAAA;AAAA,MACxE;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,KAAA,EAAqB;AAC1B,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAAsB;AACpB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EACvB;AAAA;AAAA,EAGA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AAAA,EAC1D;AACF;AAEA,SAAS,WAAA,CAAY,GAAW,MAAA,EAAgC;AAC9D,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,QAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,GAAI,CAAA;AAAA,IACb,KAAK,UAAA;AACH,MAAA,OAAO,KAAK,CAAA,GAAI,CAAA,CAAA;AAAA,IAClB,KAAK,aAAA;AACH,MAAA,OAAO,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,GAAI,IAAI,EAAA,GAAA,CAAM,CAAA,GAAI,IAAI,CAAA,IAAK,CAAA;AAAA;AAEtD;;;ACxHA,IAAM,SAAA,GAA0C;AAAA,EAC9C,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,QAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AAEO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAC3C,WAAA,CACE,SACgB,QAAA,EAChB;AACA,IAAA,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAQ,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAF/C,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAGO,SAAS,SAAS,KAAA,EAA2B;AAClD,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAGpB,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAQ,SAAS,IAAA,EAAM;AAClD,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,CAAA,GAAI,CAAA,GAAI,MAAM,MAAA,EAAQ;AACxC,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,CAAC,KAAM,GAAA,IAAO,KAAA,CAAM,CAAC,CAAA,IAAM,GAAA,EAAK;AAC/D,QAAA,MAAA,IAAU,MAAM,CAAC,CAAA;AACjB,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,IAAI,MAAM,CAAA,CAAA;AAAA,UACjB,WAAA,EAAa,QAAA,CAAS,MAAA,EAAQ,EAAE;AAAA,SACjC,CAAA;AACD,QAAA,CAAA,GAAI,CAAA;AACJ,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,UAAU,IAAI,CAAA;AAChC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,MAAM,CAAA;AAC5C,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,sBAAA,EAAyB,IAAI,KAAK,CAAC,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO,MAAA;AACT;;;ACvDA,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,YAAA,GAAe,EAAA;AAGrB,IAAM,aAAA,GAAwC;AAAA,EAC5C,KAAA,EAAO,GAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,CAAA,kBAAA,EAAqB,OAAO,CAAA,CAAE,CAAA;AACpC,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAYO,IAAM,YAAN,MAAgB;AAAA,EAAhB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAqB,EAAC;AAC9B,IAAA,IAAA,CAAQ,GAAA,GAAM,CAAA;AAAA,EAAA;AAAA,EAEd,MAAM,KAAA,EAAgC;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,SAAS,KAAK,CAAA;AAC5B,IAAA,IAAA,CAAK,GAAA,GAAM,CAAA;AAEX,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,EAAC,EAAE;AAAA,IAC1C;AAEA,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AAErC,IAAA,IAAI,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACjC,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,KAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAG,KAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,GAAG,CAAA;AAAA,OAC5E;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAS;AAAA,EACtC;AAAA,EAEQ,cAAA,GAA4B;AAClC,IAAA,MAAM,QAAmB,EAAC;AAC1B,IAAA,OAAO,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACpC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAElC,MAAA,IAAI,KAAA,CAAM,SAAS,WAAA,EAAa;AAC9B,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAAyB;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAElC,IAAA,IAAI,KAAA,CAAM,SAAS,aAAA,EAAe;AAChC,MAAA,OAAO,KAAK,WAAA,EAAY;AAAA,IAC1B;AAEA,IAAA,OAAO,KAAK,UAAA,EAAW;AAAA,EACzB;AAAA,EAEQ,WAAA,GAA4B;AAClC,IAAA,IAAA,CAAK,GAAA,EAAA;AAEL,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AAErC,IAAA,IAAI,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAG,IAAA,KAAS,WAAA,EAAa;AACjF,MAAA,MAAM,IAAI,eAAe,oCAA+B,CAAA;AAAA,IAC1D;AACA,IAAA,IAAA,CAAK,GAAA,EAAA;AAGL,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAG,IAAA,KAAS,QAAA,EAAU;AAC7E,MAAA,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAG,EAAG,WAAA,IAAe,CAAA;AAC/C,MAAA,IAAA,CAAK,GAAA,EAAA;AAAA,IACP;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,MAAA,EAAO;AAAA,EAC3C;AAAA,EAEQ,UAAA,GAAsB;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAClC,IAAA,IAAA,CAAK,GAAA,EAAA;AAEL,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,OAAA;AAAA,MACL,KAAK,QAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AAAA,MACrC,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,UAAA,EAAW;AAAA,MACzB,KAAK,KAAA;AACH,QAAA,OAAO,KAAK,QAAA,EAAS;AAAA,MACvB,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,YAAA,EAAa;AAAA,MAC3B;AACE,QAAA,MAAM,IAAI,cAAA,CAAe,CAAA,uBAAA,EAA0B,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA;AACpE,EACF;AAAA,EAEQ,aAAa,KAAA,EAA+B;AAClD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAW,aAAA,CAAc,KAAK,CAAA,IAAK,GAAA;AAAA,MACnC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,UAAA,GAA2B;AACjC,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,aAAA,EAAc;AAAA,EAClD;AAAA,EAEQ,QAAA,GAAuB;AAC7B,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,YAAA,EAAc,WAAW,CAAA,EAAI;AAAA,EAC/D;AAAA,EAEQ,YAAA,GAA+B;AACrC,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,aAAA,EAAc;AAAA,EACrD;AACF;AAGO,SAAS,SAAS,KAAA,EAAgC;AACvD,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,EAAU;AAC7B,EAAA,OAAO,MAAA,CAAO,MAAM,KAAK,CAAA;AAC3B;;;ACjJO,SAAS,QAAQ,GAAA,EAAoC;AAC1D,EAAA,MAAM,GAAA,GAAM,YAAY,GAAG,CAAA;AAC3B,EAAA,OAAO,cAAc,GAAG,CAAA;AAC1B;AAEA,SAAS,YAAY,IAAA,EAA6B;AAChD,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,SAAA;AACH,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,KAAK,QAAA,EAAU,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,IAEjF,KAAK,OAAA;AACH,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,UAAU,IAAA,CAAK,QAAA,EAAU,SAAA,EAAW,CAAA,EAAG,CAAA;AAAA,IAElE,KAAK,KAAA;AACH,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,KAAK,QAAA,EAAU,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,IAEjF,KAAK,SAAA;AAEH,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,UAAU,IAAA,CAAK,SAAA,EAAW,SAAA,EAAW,EAAA,EAAI,CAAA;AAAA;AAAA,IAEtE,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA;AACpD,MAAA,MAAM,SAAuB,EAAC;AAC9B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAA,CAAW,GAAA,CAAI,CAAC,OAAO,EAAE,GAAG,CAAA,EAAE,CAAE,CAAC,CAAA;AAAA,MAClD;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,IAEA,KAAK,UAAA;AACH,MAAA,OAAO,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA;AAAA;AAE9C;AAMA,SAAS,cAAc,KAAA,EAAmC;AACxD,EAAA,MAAM,SAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,SAAA,KAAc,EAAA,IAAM,MAAA,CAAO,SAAS,CAAA,EAAG;AAE9C,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,MAAA,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,IAAA,EAAM,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cAAc,KAAA,EAAmC;AAC/D,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEhC,EAAA,MAAM,SAAuB,CAAC,EAAE,GAAG,KAAA,CAAM,CAAC,GAAI,CAAA;AAE9C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAGrC,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,SAAS,OAAA,EAAS;AACrD,MAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,QAAA;AACzB,MAAA;AAAA,IACF;AAGA,IAAA,IACE,OAAA,CAAQ,IAAA,KAAS,SAAA,IACjB,IAAA,CAAK,IAAA,KAAS,SAAA,IACd,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,SAAS,IAAI,IAAA,EAC/C;AACA,MAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,QAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,OAAA,EAAS,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,MAAA;AACT;;;ACpEO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EAMxB,YAAY,MAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,aAAA,EAAc;AACpD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,EAAe;AACnC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,eAAA,CAAgB,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,EAC1D;AAAA;AAAA,EAGA,OAAO,OAAO,MAAA,EAA8C;AAC1D,IAAA,OAAO,IAAI,cAAa,MAAM,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAI,SAAA,GAAY,GAAA,EAAoB;AACxC,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,CAAC,CAAA;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,SAAA,CAAU,SAAA,GAAY,GAAA,EAAoB;AAC9C,IAAA,MAAM,KAAK,UAAA,CAAW;AAAA,MACpB,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,IAAI,SAAA,EAAU;AAAA,MAC3C,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MAC5C,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,IAAI,SAAA;AAAU,KAC5C,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,SAAA,CAAU,SAAA,GAAY,GAAA,EAAoB;AAC9C,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,CAAC,CAAA;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,KAAK,UAAA,CAAW;AAAA,MACpB,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MAChD,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MAC5C,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI,KACjD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,KAAK,UAAA,CAAW;AAAA,MACpB,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MAChD,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MAC5C,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MAChD,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MAC5C,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI,KACjD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,KAAK,UAAA,CAAW;AAAA,MACpB,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAI;AAAA,MAChD,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAE;AAAA,MAC7C,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA;AAAI,KACjD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,SAAA,GAA2B;AAC/B,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,CAAC,CAAA;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,OAAO,EAAA,EAA4B;AACvC,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK,CAAC,CAAA;AAAA,IAC3E,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK,CAAC,CAAA;AAAA,IAC3E;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,KAAA,GAAqB,QAAA,EAAyB;AACzD,IAAA,MAAMA,QAAAA,GAA6C;AAAA,MACjD,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK,CAAA;AAAA,MACzD,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK,CAAA;AAAA,MAC1D,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,CAAA,EAAK,CAAA;AAAA,MACzD,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK,CAAA;AAAA,MACxD,IAAA,EAAM,CAAC,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK;AAAA,KAC1D;AACA,IAAA,MAAM,IAAA,CAAK,UAAA,CAAWA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,QAAA,EAAkB,SAAA,GAAY,CAAA,EAAoB;AAC9D,IAAA,MAAM,KAAK,UAAA,CAAW;AAAA,MACpB,EAAE,IAAA,EAAM,SAAA,EAAW,UAAU,SAAA,EAAW,kBAAA,CAAmB,SAAS,CAAA;AAAE,KACvE,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAK,OAAA,EAA+D;AACxE,IAAA,IAAI,KAAA;AAEJ,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,GAAA,GAAM,SAAS,OAAO,CAAA;AAC5B,MAAA,KAAA,GAAQ,QAAQ,GAAG,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjC,MAAA,KAAA,GAAQ,OAAA;AAAA,IACV,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAAA,IAClB;AAEA,IAAA,MAAM,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA,EAKA,OAAA,GAA2B;AACzB,IAAA,MAAM,QAAA,GAAW,IAAI,eAAA,EAAgB;AACrC,IAAA,QAAA,CAAS,OAAO,CAAC,KAAA,KAAU,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AACjD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAqC;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA;AAEjC,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AAAA,IACxB;AAEA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,IACjD;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,KAAK,OAAA,CAAQ,SAAA;AAAA,EACtB;AAAA;AAAA,EAGA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,EACtB;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,EACvB;AAAA;AAAA,EAIA,MAAc,WAAW,KAAA,EAAoC;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,KAAA,CAAM,WAAW,CAAA,EAAG;AAGhD,IAAA,IAAI,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC/B,GAAG,CAAA;AAAA,MACH,SAAA,EACE,CAAA,CAAE,IAAA,KAAS,SAAA,GACP,kBAAA,CAAmB,EAAE,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GACtD;AAAA,KACR,CAAE,CAAA;AAGF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAa;AACvC,IAAA,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAA,EAAU,IAAI,CAAA;AAG7C,IAAA,QAAA,GAAW,cAAc,QAAQ,CAAA;AAEjC,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACtC;AAAA,EACF;AACF;;;ACzNA,IAAM,WAAA,GAAc,IAAI,GAAA,CAAI,2BAA4B,CAAA;AAEjD,SAAS,YAAY,KAAA,EAAiC;AAC3D,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAE;AAAA,EACnC;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,CAAC,CAAE,CAAA,EAAG;AAC/B,MAAA,MAAA,CAAO,KAAK,CAAA,mBAAA,EAAsB,KAAA,CAAM,CAAC,CAAC,CAAA,cAAA,EAAiB,CAAC,CAAA,CAAE,CAAA;AAAA,IAChE;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAK,KAAA,EAAA;AACtB,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAK,KAAA,EAAA;AACtB,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,0BAAA,EAA6B,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9C;AAAA,EACF;AACA,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,wBAAA,CAA0B,CAAA;AAAA,EAChD;AAGA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACzC,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAO,MAAM,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AAC5C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAO,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAE,CAAA,EAAG;AACxE,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,gCAAA,EAAmC,CAAC,CAAA,4BAAA,CAA8B,CAAA;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,MAAA,KAAW,GAAG,MAAA,EAAO;AAC9C;;;ACjDO,IAAM,EAAA,GAAK;AAAA;AAAA,EAEhB,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK;AAAA,GACpE;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK;AAAA,GACpE;AAAA;AAAA,EAGA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK;AAAA,GACpE;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK;AAAA,GACpE;AAAA;AAAA,EAGA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK;AAAA,GACnE;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK;AAAA,GACnE;AAAA;AAAA,EAGA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,kBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,CAAA,EAAG,WAAW,GAAA;AAAI;AAC1D,GACF;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,gBAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK;AAAA,GACpE;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK;AAAA,GACpE;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D;AAEJ;;;ACxFO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,uBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,uBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,qBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAE;AAAA,MACtD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,oBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,+BAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAE;AAAA,MACtD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,qBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAI;AAAA,MAC1D,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAI;AAAA,MAC1D,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAI;AAAA,MAC1D,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAE;AAAA,MACtD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAI;AAAA,MAC1D,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAI;AAAA,MAC1D,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA;AAAI;AAC5D,GACF;AAAA;AAAA,EAGA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,wBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAE;AAAA,MACtD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D;AAEJ;;;AC9EO,IAAM,MAAA,GAAS;AAAA;AAAA,EAEpB,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,kBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAI;AAAA,MAC1D,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,kBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,kBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA;AAAE;AACxD,GACF;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,gBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,gBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,sBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,qBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D;AAEJ;;;ACnHO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,uBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA,EAAE;AAAA,MACtD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,oBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,GAAA,EAAK,WAAW,GAAA;AAAI;AAC5D,GACF;AAAA;AAAA,EAGA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,wBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,2BAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,CAAA,EAAG,WAAW,GAAA;AAAI;AAC1D,GACF;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,yBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,CAAA,EAAG,WAAW,GAAA;AAAI;AAC1D,GACF;AAAA;AAAA,EAGA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,wBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,kBAAA,EAAoB;AAAA,IAClB,IAAA,EAAM,kCAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D;AAEJ;;;AChEO,IAAM,MAAA,GAAS;AAAA;AAAA,EAEpB,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK;AAAA,GACnE;AAAA;AAAA,EAGA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,GAAA,EAAK;AAAA,GACnE;AAAA;AAAA,EAGA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,qBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,MACzD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D,GACF;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,WAAoB,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK;AAAA,GACpE;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,CAAA,EAAG,WAAW,GAAA,EAAI;AAAA,MACxD,EAAE,IAAA,EAAM,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,SAAA,EAAoB,QAAA,EAAU,EAAA,EAAI,WAAW,GAAA;AAAI;AAC3D;AAEJ;;;AC/CO,IAAM,OAAA,GAAU;AAAA,EACrB,EAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF;;;ACqCO,IAAM,MAAA,GAAS,aAAa,MAAA","file":"index.cjs","sourcesContent":["import type { HapticAdapter } from './adapter';\n\n/** Visual fallback style when haptics are unavailable */\nexport type VisualFallbackStyle = 'flash' | 'shake' | 'pulse';\n\n/** Fallback configuration for non-haptic feedback */\nexport interface FallbackConfig {\n type: 'none' | 'visual' | 'audio' | 'both';\n visual?: {\n /** Element to animate */\n element?: HTMLElement;\n /** CSS class to toggle */\n className?: string;\n /** Animation style */\n style?: VisualFallbackStyle;\n };\n audio?: {\n enabled: boolean;\n /** Volume from 0 to 1 */\n volume: number;\n };\n}\n\n/** Main configuration for the haptic engine */\nexport interface HapticConfig {\n /** Explicitly set an adapter (overrides auto-detection) */\n adapter?: HapticAdapter;\n /** Global intensity multiplier (0.0 to 1.0) */\n intensity: number;\n /** Whether haptics are enabled */\n enabled: boolean;\n /** Fallback when haptics are unavailable */\n fallback: FallbackConfig;\n /** Respect system haptic settings */\n respectSystemSettings: boolean;\n}\n\n/** Default configuration */\nexport const DEFAULT_CONFIG: HapticConfig = {\n intensity: 1.0,\n enabled: true,\n fallback: { type: 'none' },\n respectSystemSettings: true,\n};\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\n\n/**\n * No-op adapter — used in SSR, Node, or when no haptic hardware is available.\n * Silently accepts all calls without doing anything.\n */\nexport class NoopAdapter implements HapticAdapter {\n readonly name = 'noop';\n readonly supported = false;\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 0,\n minDuration: 0,\n maxDuration: 0,\n supportsPattern: false,\n supportsIntensity: false,\n dualMotor: false,\n };\n }\n\n async pulse(_intensity: number, _duration: number): Promise<void> {\n // No-op\n }\n\n async playSequence(_steps: HapticStep[]): Promise<void> {\n // No-op\n }\n\n cancel(): void {\n // No-op\n }\n\n dispose(): void {\n // No-op\n }\n}\n","/** Scheduling utilities for timed haptic playback */\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function normalizeIntensity(intensity: number): number {\n return clamp(intensity, 0, 1);\n}\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\nimport { delay } from '../utils/scheduling';\n\n/**\n * Web Vibration API adapter.\n * Uses navigator.vibrate() — supported on Android browsers.\n * Intensity is simulated via PWM (rapid on/off) since the API only supports on/off.\n */\nexport class WebVibrationAdapter implements HapticAdapter {\n readonly name = 'web-vibration';\n readonly supported: boolean;\n\n private _cancelled = false;\n\n constructor() {\n this.supported =\n typeof navigator !== 'undefined' && 'vibrate' in navigator;\n }\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 1, // on/off only\n minDuration: 10,\n maxDuration: 10000,\n supportsPattern: true,\n supportsIntensity: false,\n dualMotor: false,\n };\n }\n\n async pulse(_intensity: number, duration: number): Promise<void> {\n if (!this.supported) return;\n navigator.vibrate(duration);\n }\n\n async playSequence(steps: HapticStep[]): Promise<void> {\n if (!this.supported || steps.length === 0) return;\n\n this._cancelled = false;\n\n // Convert to Vibration API pattern: [vibrate, pause, vibrate, pause, ...]\n const pattern = this._toVibrationPattern(steps);\n\n // If it's a simple pattern, use native pattern support\n if (this._canUseNativePattern(steps)) {\n navigator.vibrate(pattern);\n return;\n }\n\n // For complex patterns (intensity variation), play step by step\n for (const step of steps) {\n if (this._cancelled) break;\n\n if (step.type === 'vibrate') {\n if (step.intensity > 0.1) {\n // Simulate intensity via PWM for lower intensities\n if (step.intensity < 0.5) {\n await this._pwmVibrate(step.duration, step.intensity);\n } else {\n navigator.vibrate(step.duration);\n await delay(step.duration);\n }\n } else {\n await delay(step.duration);\n }\n } else {\n await delay(step.duration);\n }\n }\n }\n\n cancel(): void {\n this._cancelled = true;\n if (this.supported) {\n navigator.vibrate(0);\n }\n }\n\n dispose(): void {\n this.cancel();\n }\n\n /** Convert steps to Vibration API pattern array */\n private _toVibrationPattern(steps: HapticStep[]): number[] {\n const pattern: number[] = [];\n for (const step of steps) {\n pattern.push(step.duration);\n }\n return pattern;\n }\n\n /** Check if all steps can be played with native pattern (no intensity variation) */\n private _canUseNativePattern(steps: HapticStep[]): boolean {\n return steps.every(\n (s) =>\n (s.type === 'pause') ||\n (s.type === 'vibrate' && s.intensity >= 0.5)\n );\n }\n\n /** Simulate lower intensity via pulse-width modulation */\n private async _pwmVibrate(duration: number, intensity: number): Promise<void> {\n const cycleTime = 20; // ms per PWM cycle\n const onTime = Math.round(cycleTime * intensity);\n const offTime = cycleTime - onTime;\n const cycles = Math.floor(duration / cycleTime);\n\n const pattern: number[] = [];\n for (let i = 0; i < cycles; i++) {\n pattern.push(onTime, offTime);\n }\n\n if (pattern.length > 0) {\n navigator.vibrate(pattern);\n await delay(duration);\n }\n }\n}\n","/** Platform detection utilities */\n\nexport interface PlatformInfo {\n isWeb: boolean;\n isNode: boolean;\n isReactNative: boolean;\n hasVibrationAPI: boolean;\n hasGamepadAPI: boolean;\n isIOS: boolean;\n isAndroid: boolean;\n isMobile: boolean;\n}\n\nexport function detectPlatform(): PlatformInfo {\n const isWeb = typeof window !== 'undefined' && typeof document !== 'undefined';\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const isNode =\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as Record<string, unknown>).process === 'object' &&\n typeof ((globalThis as Record<string, unknown>).process as Record<string, unknown>)?.versions === 'object';\n const isReactNative =\n typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\n\n const hasVibrationAPI = isWeb && 'vibrate' in navigator;\n const hasGamepadAPI = isWeb && 'getGamepads' in navigator;\n\n const ua = isWeb ? navigator.userAgent : '';\n const isIOS = /iPad|iPhone|iPod/.test(ua) || (isWeb && navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n const isAndroid = /Android/.test(ua);\n const isMobile = isIOS || isAndroid;\n\n return {\n isWeb,\n isNode,\n isReactNative,\n hasVibrationAPI,\n hasGamepadAPI,\n isIOS,\n isAndroid,\n isMobile,\n };\n}\n","import type { HapticAdapter } from '../types';\nimport { NoopAdapter } from '../adapters/noop.adapter';\nimport { WebVibrationAdapter } from '../adapters/web-vibration.adapter';\nimport { detectPlatform } from '../utils/platform';\n\n/**\n * Auto-detect the best available haptic adapter for the current platform.\n */\nexport function detectAdapter(): HapticAdapter {\n const platform = detectPlatform();\n\n // Web browser with Vibration API support\n if (platform.hasVibrationAPI) {\n return new WebVibrationAdapter();\n }\n\n // Fallback to no-op (SSR, Node, unsupported browsers, iOS)\n return new NoopAdapter();\n}\n","import type { HapticStep, AdapterCapabilities } from '../types';\nimport { clamp } from '../utils/scheduling';\n\n/**\n * Adapts ideal haptic patterns to what the device can actually produce.\n * Handles intensity quantization, duration clamping, and step merging.\n */\nexport class AdaptiveEngine {\n adapt(steps: HapticStep[], capabilities: AdapterCapabilities): HapticStep[] {\n return steps.map((step) => this._adaptStep(step, capabilities));\n }\n\n private _adaptStep(step: HapticStep, caps: AdapterCapabilities): HapticStep {\n const adapted = { ...step };\n\n // Clamp duration\n if (adapted.type === 'vibrate') {\n adapted.duration = clamp(adapted.duration, caps.minDuration, caps.maxDuration);\n }\n\n // Quantize intensity if device has limited levels\n if (!caps.supportsIntensity && adapted.type === 'vibrate') {\n // On/off only — threshold at 0.1\n adapted.intensity = adapted.intensity > 0.1 ? 1.0 : 0;\n } else if (caps.maxIntensityLevels > 1 && caps.maxIntensityLevels < 100) {\n // Quantize to available levels\n const levels = caps.maxIntensityLevels;\n adapted.intensity = Math.round(adapted.intensity * levels) / levels;\n }\n\n return adapted;\n }\n}\n","import type { FallbackConfig, HapticStep } from '../types';\n\n/**\n * Provides visual/audio fallback when haptic hardware is unavailable.\n */\nexport class FallbackManager {\n private config: FallbackConfig;\n\n constructor(config: FallbackConfig) {\n this.config = config;\n }\n\n updateConfig(config: FallbackConfig): void {\n this.config = config;\n }\n\n /** Execute fallback feedback for the given steps */\n async execute(steps: HapticStep[]): Promise<void> {\n if (this.config.type === 'none') return;\n\n const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);\n const maxIntensity = Math.max(...steps.filter((s) => s.type === 'vibrate').map((s) => s.intensity), 0);\n\n if (this.config.type === 'visual' || this.config.type === 'both') {\n await this._visualFallback(totalDuration, maxIntensity);\n }\n\n if (this.config.type === 'audio' || this.config.type === 'both') {\n await this._audioFallback(totalDuration, maxIntensity);\n }\n }\n\n private async _visualFallback(duration: number, intensity: number): Promise<void> {\n const visual = this.config.visual;\n if (!visual || typeof document === 'undefined') return;\n\n const element = visual.element ?? document.body;\n const style = visual.style ?? 'pulse';\n const className = visual.className;\n\n if (className) {\n element.classList.add(className);\n setTimeout(() => element.classList.remove(className), duration);\n return;\n }\n\n // Built-in visual feedback\n switch (style) {\n case 'flash': {\n const opacity = 0.1 + intensity * 0.3;\n const overlay = document.createElement('div');\n Object.assign(overlay.style, {\n position: 'fixed',\n inset: '0',\n backgroundColor: `rgba(0, 0, 0, ${opacity})`,\n pointerEvents: 'none',\n zIndex: '99999',\n transition: `opacity ${duration}ms ease-out`,\n });\n document.body.appendChild(overlay);\n requestAnimationFrame(() => {\n overlay.style.opacity = '0';\n });\n setTimeout(() => overlay.remove(), duration + 100);\n break;\n }\n case 'shake': {\n const magnitude = Math.round(intensity * 5);\n element.style.transition = 'none';\n element.style.transform = `translateX(${magnitude}px)`;\n setTimeout(() => {\n element.style.transition = `transform ${duration}ms ease-out`;\n element.style.transform = '';\n }, 50);\n break;\n }\n case 'pulse': {\n const scale = 1 + intensity * 0.02;\n element.style.transition = `transform ${duration}ms ease-out`;\n element.style.transform = `scale(${scale})`;\n setTimeout(() => {\n element.style.transform = '';\n }, duration);\n break;\n }\n }\n }\n\n private async _audioFallback(duration: number, intensity: number): Promise<void> {\n const audio = this.config.audio;\n if (!audio?.enabled || typeof AudioContext === 'undefined') return;\n\n try {\n const ctx = new AudioContext();\n const oscillator = ctx.createOscillator();\n const gainNode = ctx.createGain();\n\n oscillator.connect(gainNode);\n gainNode.connect(ctx.destination);\n\n oscillator.frequency.value = 200 + intensity * 200;\n gainNode.gain.value = audio.volume * intensity * 0.1;\n\n oscillator.start();\n oscillator.stop(ctx.currentTime + duration / 1000);\n\n await new Promise<void>((resolve) => {\n oscillator.onended = () => {\n ctx.close();\n resolve();\n };\n });\n } catch {\n // Audio fallback is best-effort\n }\n }\n}\n","import type { HapticStep, EasingFunction } from '../types';\n\n/**\n * Fluent builder for composing haptic patterns programmatically.\n *\n * Usage:\n * const pattern = new PatternComposer()\n * .tap(0.5)\n * .pause(100)\n * .ramp(0.2, 1.0, 300)\n * .buzz(200)\n * .build();\n */\nexport class PatternComposer {\n private steps: HapticStep[] = [];\n private _onPlay?: (steps: HapticStep[]) => Promise<void>;\n\n /** Register a play callback (used by HapticEngine) */\n onPlay(fn: (steps: HapticStep[]) => Promise<void>): this {\n this._onPlay = fn;\n return this;\n }\n\n /** Add a short tap vibration */\n tap(intensity = 0.6): this {\n this.steps.push({ type: 'vibrate', duration: 10, intensity });\n return this;\n }\n\n /** Add a vibration with specified duration and intensity */\n vibrate(duration: number, intensity = 1.0): this {\n this.steps.push({ type: 'vibrate', duration, intensity });\n return this;\n }\n\n /** Add a buzz (medium-length vibration) */\n buzz(duration = 100, intensity = 0.7): this {\n this.steps.push({ type: 'vibrate', duration, intensity });\n return this;\n }\n\n /** Add a pause */\n pause(duration = 50): this {\n this.steps.push({ type: 'pause', duration, intensity: 0 });\n return this;\n }\n\n /** Add an intensity ramp from start to end intensity over duration */\n ramp(\n startIntensity: number,\n endIntensity: number,\n duration: number,\n easing: EasingFunction = 'linear',\n ): this {\n const stepCount = Math.max(1, Math.floor(duration / 20));\n const stepDuration = duration / stepCount;\n\n for (let i = 0; i < stepCount; i++) {\n const t = i / (stepCount - 1 || 1);\n const easedT = applyEasing(t, easing);\n const intensity = startIntensity + (endIntensity - startIntensity) * easedT;\n this.steps.push({ type: 'vibrate', duration: stepDuration, intensity });\n }\n\n return this;\n }\n\n /** Add a pulse pattern (on-off-on-off) */\n pulse(count: number, onDuration = 50, offDuration = 50, intensity = 0.8): this {\n for (let i = 0; i < count; i++) {\n this.steps.push({ type: 'vibrate', duration: onDuration, intensity });\n if (i < count - 1) {\n this.steps.push({ type: 'pause', duration: offDuration, intensity: 0 });\n }\n }\n return this;\n }\n\n /** Repeat the entire current sequence N times */\n repeat(times: number): this {\n const original = [...this.steps];\n for (let i = 1; i < times; i++) {\n this.steps.push(...original.map((s) => ({ ...s })));\n }\n return this;\n }\n\n /** Build and return the step array */\n build(): HapticStep[] {\n return [...this.steps];\n }\n\n /** Build and immediately play the pattern */\n async play(): Promise<void> {\n if (this._onPlay) {\n await this._onPlay(this.steps);\n }\n }\n\n /** Reset the composer */\n clear(): this {\n this.steps = [];\n return this;\n }\n\n /** Get total duration in ms */\n get duration(): number {\n return this.steps.reduce((sum, s) => sum + s.duration, 0);\n }\n}\n\nfunction applyEasing(t: number, easing: EasingFunction): number {\n switch (easing) {\n case 'linear':\n return t;\n case 'ease-in':\n return t * t;\n case 'ease-out':\n return t * (2 - t);\n case 'ease-in-out':\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n }\n}\n","import type { HPLToken, HPLTokenType } from '../types';\n\nconst TOKEN_MAP: Record<string, HPLTokenType> = {\n '~': 'LIGHT',\n '#': 'MEDIUM',\n '@': 'HEAVY',\n '.': 'PAUSE',\n '|': 'TAP',\n '-': 'SUSTAIN',\n '[': 'GROUP_START',\n ']': 'GROUP_END',\n};\n\nexport class HPLTokenizerError extends Error {\n constructor(\n message: string,\n public readonly position: number,\n ) {\n super(`HPL Tokenizer Error at position ${position}: ${message}`);\n this.name = 'HPLTokenizerError';\n }\n}\n\n/** Tokenize an HPL pattern string into tokens */\nexport function tokenize(input: string): HPLToken[] {\n const tokens: HPLToken[] = [];\n let i = 0;\n\n while (i < input.length) {\n const char = input[i]!;\n\n // Skip whitespace\n if (char === ' ' || char === '\\t' || char === '\\n') {\n i++;\n continue;\n }\n\n // Check for repeat modifier: xN\n if (char === 'x' && i + 1 < input.length) {\n let numStr = '';\n let j = i + 1;\n while (j < input.length && input[j]! >= '0' && input[j]! <= '9') {\n numStr += input[j];\n j++;\n }\n if (numStr.length > 0) {\n tokens.push({\n type: 'REPEAT',\n value: `x${numStr}`,\n repeatCount: parseInt(numStr, 10),\n });\n i = j;\n continue;\n }\n }\n\n // Check known tokens\n const tokenType = TOKEN_MAP[char];\n if (tokenType) {\n tokens.push({ type: tokenType, value: char });\n i++;\n continue;\n }\n\n throw new HPLTokenizerError(`Unexpected character '${char}'`, i);\n }\n\n return tokens;\n}\n","import type {\n HPLToken,\n HPLNode,\n HPLSequenceNode,\n HPLGroupNode,\n HPLVibrateNode,\n HPLPauseNode,\n HPLTapNode,\n HPLSustainNode,\n} from '../types';\nimport { tokenize } from './tokenizer';\n\n/** Duration constants in milliseconds */\nconst UNIT_DURATION = 50;\nconst TAP_DURATION = 10;\n\n/** Intensity levels for vibrate tokens */\nconst INTENSITY_MAP: Record<string, number> = {\n LIGHT: 0.3,\n MEDIUM: 0.6,\n HEAVY: 1.0,\n};\n\nexport class HPLParserError extends Error {\n constructor(message: string) {\n super(`HPL Parser Error: ${message}`);\n this.name = 'HPLParserError';\n }\n}\n\n/**\n * Recursive descent parser for the Haptic Pattern Language (HPL).\n *\n * Grammar:\n * Pattern := Segment+\n * Segment := Group | Atom\n * Group := '[' Segment+ ']' Repeat?\n * Atom := '~' | '#' | '@' | '.' | '|' | '-'\n * Repeat := 'x' Number\n */\nexport class HPLParser {\n private tokens: HPLToken[] = [];\n private pos = 0;\n\n parse(input: string): HPLSequenceNode {\n this.tokens = tokenize(input);\n this.pos = 0;\n\n if (this.tokens.length === 0) {\n return { type: 'sequence', children: [] };\n }\n\n const children = this._parseSegments();\n\n if (this.pos < this.tokens.length) {\n throw new HPLParserError(\n `Unexpected token '${this.tokens[this.pos]!.value}' at position ${this.pos}`,\n );\n }\n\n return { type: 'sequence', children };\n }\n\n private _parseSegments(): HPLNode[] {\n const nodes: HPLNode[] = [];\n while (this.pos < this.tokens.length) {\n const token = this.tokens[this.pos]!;\n\n if (token.type === 'GROUP_END') {\n break; // Let parent group handle this\n }\n\n nodes.push(this._parseSegment());\n }\n return nodes;\n }\n\n private _parseSegment(): HPLNode {\n const token = this.tokens[this.pos]!;\n\n if (token.type === 'GROUP_START') {\n return this._parseGroup();\n }\n\n return this._parseAtom();\n }\n\n private _parseGroup(): HPLGroupNode {\n this.pos++; // consume '['\n\n const children = this._parseSegments();\n\n if (this.pos >= this.tokens.length || this.tokens[this.pos]!.type !== 'GROUP_END') {\n throw new HPLParserError('Unclosed group — expected \"]\"');\n }\n this.pos++; // consume ']'\n\n // Check for repeat modifier\n let repeat = 1;\n if (this.pos < this.tokens.length && this.tokens[this.pos]!.type === 'REPEAT') {\n repeat = this.tokens[this.pos]!.repeatCount ?? 1;\n this.pos++;\n }\n\n return { type: 'group', children, repeat };\n }\n\n private _parseAtom(): HPLNode {\n const token = this.tokens[this.pos]!;\n this.pos++;\n\n switch (token.type) {\n case 'LIGHT':\n case 'MEDIUM':\n case 'HEAVY':\n return this._makeVibrate(token.type);\n case 'PAUSE':\n return this._makePause();\n case 'TAP':\n return this._makeTap();\n case 'SUSTAIN':\n return this._makeSustain();\n default:\n throw new HPLParserError(`Unexpected token type '${token.type}'`);\n }\n }\n\n private _makeVibrate(level: string): HPLVibrateNode {\n return {\n type: 'vibrate',\n intensity: INTENSITY_MAP[level] ?? 0.5,\n duration: UNIT_DURATION,\n };\n }\n\n private _makePause(): HPLPauseNode {\n return { type: 'pause', duration: UNIT_DURATION };\n }\n\n private _makeTap(): HPLTapNode {\n return { type: 'tap', duration: TAP_DURATION, intensity: 1.0 };\n }\n\n private _makeSustain(): HPLSustainNode {\n return { type: 'sustain', extension: UNIT_DURATION };\n }\n}\n\n/** Convenience function to parse an HPL string */\nexport function parseHPL(input: string): HPLSequenceNode {\n const parser = new HPLParser();\n return parser.parse(input);\n}\n","import type { HapticStep } from '../types/haptic-effect';\nimport type { HPLNode, HPLSequenceNode } from '../types/pattern';\n\n/**\n * Compiles an HPL AST into a flat array of HapticSteps.\n * Handles group expansion, sustain merging, and repeat unrolling.\n */\nexport function compile(ast: HPLSequenceNode): HapticStep[] {\n const raw = compileNode(ast);\n return mergeSustains(raw);\n}\n\nfunction compileNode(node: HPLNode): HapticStep[] {\n switch (node.type) {\n case 'vibrate':\n return [{ type: 'vibrate', duration: node.duration, intensity: node.intensity }];\n\n case 'pause':\n return [{ type: 'pause', duration: node.duration, intensity: 0 }];\n\n case 'tap':\n return [{ type: 'vibrate', duration: node.duration, intensity: node.intensity }];\n\n case 'sustain':\n // Sustain is a marker — it extends the previous step during merge\n return [{ type: 'vibrate', duration: node.extension, intensity: -1 }]; // sentinel\n\n case 'group': {\n const groupSteps = node.children.flatMap(compileNode);\n const result: HapticStep[] = [];\n for (let i = 0; i < node.repeat; i++) {\n result.push(...groupSteps.map((s) => ({ ...s })));\n }\n return result;\n }\n\n case 'sequence':\n return node.children.flatMap(compileNode);\n }\n}\n\n/**\n * Merge sustain markers (-) into the preceding step.\n * A sustain with intensity=-1 extends the previous vibrate's duration.\n */\nfunction mergeSustains(steps: HapticStep[]): HapticStep[] {\n const result: HapticStep[] = [];\n\n for (const step of steps) {\n if (step.intensity === -1 && result.length > 0) {\n // Sustain — extend previous step\n const prev = result[result.length - 1]!;\n prev.duration += step.duration;\n } else {\n result.push({ ...step });\n }\n }\n\n return result;\n}\n\n/**\n * Optimize a step sequence by merging adjacent same-type steps.\n */\nexport function optimizeSteps(steps: HapticStep[]): HapticStep[] {\n if (steps.length === 0) return [];\n\n const result: HapticStep[] = [{ ...steps[0]! }];\n\n for (let i = 1; i < steps.length; i++) {\n const current = steps[i]!;\n const prev = result[result.length - 1]!;\n\n // Merge adjacent pauses\n if (current.type === 'pause' && prev.type === 'pause') {\n prev.duration += current.duration;\n continue;\n }\n\n // Merge adjacent vibrates with same intensity\n if (\n current.type === 'vibrate' &&\n prev.type === 'vibrate' &&\n Math.abs(current.intensity - prev.intensity) < 0.01\n ) {\n prev.duration += current.duration;\n continue;\n }\n\n result.push({ ...current });\n }\n\n return result;\n}\n","import type {\n HapticAdapter,\n HapticConfig,\n HapticStep,\n HapticPattern,\n ImpactStyle,\n} from '../types';\nimport { DEFAULT_CONFIG } from '../types';\nimport { detectAdapter } from './capability-detector';\nimport { AdaptiveEngine } from './adaptive-engine';\nimport { FallbackManager } from './fallback-manager';\nimport { PatternComposer } from '../composer/pattern-composer';\nimport { parseHPL } from '../patterns/parser';\nimport { compile, optimizeSteps } from '../patterns/compiler';\nimport { normalizeIntensity } from '../utils/scheduling';\n\n/**\n * The main haptic engine — orchestrates adapters, patterns, and fallbacks.\n *\n * Usage:\n * const engine = HapticEngine.create();\n * engine.tap();\n * engine.success();\n * engine.play('~~..##..@@');\n */\nexport class HapticEngine {\n private adapter: HapticAdapter;\n private config: HapticConfig;\n private adaptive: AdaptiveEngine;\n private fallback: FallbackManager;\n\n constructor(config?: Partial<HapticConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.adapter = this.config.adapter ?? detectAdapter();\n this.adaptive = new AdaptiveEngine();\n this.fallback = new FallbackManager(this.config.fallback);\n }\n\n /** Create a new engine with auto-detected adapter */\n static create(config?: Partial<HapticConfig>): HapticEngine {\n return new HapticEngine(config);\n }\n\n // ─── Semantic API ──────────────────────────────────────────\n\n /** Light tap feedback */\n async tap(intensity = 0.6): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 10, intensity }]);\n }\n\n /** Double tap */\n async doubleTap(intensity = 0.6): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 10, intensity },\n { type: 'pause', duration: 80, intensity: 0 },\n { type: 'vibrate', duration: 10, intensity },\n ]);\n }\n\n /** Long press feedback */\n async longPress(intensity = 0.8): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 50, intensity }]);\n }\n\n /** Success notification */\n async success(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 30, intensity: 0.5 },\n { type: 'pause', duration: 60, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.8 },\n ]);\n }\n\n /** Warning notification */\n async warning(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n { type: 'pause', duration: 50, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n { type: 'pause', duration: 50, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n ]);\n }\n\n /** Error notification */\n async error(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 80, intensity: 1.0 },\n { type: 'pause', duration: 100, intensity: 0 },\n { type: 'vibrate', duration: 80, intensity: 1.0 },\n ]);\n }\n\n /** Selection change feedback */\n async selection(): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 8, intensity: 0.4 }]);\n }\n\n /** Toggle feedback */\n async toggle(on: boolean): Promise<void> {\n if (on) {\n await this._playSteps([{ type: 'vibrate', duration: 15, intensity: 0.6 }]);\n } else {\n await this._playSteps([{ type: 'vibrate', duration: 10, intensity: 0.3 }]);\n }\n }\n\n /** Impact with style (matches iOS UIImpactFeedbackGenerator) */\n async impact(style: ImpactStyle = 'medium'): Promise<void> {\n const presets: Record<ImpactStyle, HapticStep[]> = {\n light: [{ type: 'vibrate', duration: 10, intensity: 0.3 }],\n medium: [{ type: 'vibrate', duration: 15, intensity: 0.6 }],\n heavy: [{ type: 'vibrate', duration: 25, intensity: 1.0 }],\n rigid: [{ type: 'vibrate', duration: 8, intensity: 0.9 }],\n soft: [{ type: 'vibrate', duration: 30, intensity: 0.4 }],\n };\n await this._playSteps(presets[style]);\n }\n\n // ─── Parametric API ────────────────────────────────────────\n\n /** Vibrate for a specified duration */\n async vibrate(duration: number, intensity = 1.0): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration, intensity: normalizeIntensity(intensity) },\n ]);\n }\n\n /**\n * Play a haptic pattern.\n * Accepts:\n * - HPL string: \"~~..##..@@\"\n * - HapticPattern object\n * - Raw HapticStep array\n */\n async play(pattern: string | HapticPattern | HapticStep[]): Promise<void> {\n let steps: HapticStep[];\n\n if (typeof pattern === 'string') {\n const ast = parseHPL(pattern);\n steps = compile(ast);\n } else if (Array.isArray(pattern)) {\n steps = pattern;\n } else {\n steps = pattern.steps;\n }\n\n await this._playSteps(steps);\n }\n\n // ─── Composer ──────────────────────────────────────────────\n\n /** Create a new pattern composer */\n compose(): PatternComposer {\n const composer = new PatternComposer();\n composer.onPlay((steps) => this._playSteps(steps));\n return composer;\n }\n\n // ─── Configuration ─────────────────────────────────────────\n\n /** Update engine configuration */\n configure(config: Partial<HapticConfig>): void {\n Object.assign(this.config, config);\n\n if (config.adapter) {\n this.adapter = config.adapter;\n }\n\n if (config.fallback) {\n this.fallback.updateConfig(this.config.fallback);\n }\n }\n\n /** Check if haptics are supported on this device */\n get isSupported(): boolean {\n return this.adapter.supported;\n }\n\n /** Get the current adapter name */\n get adapterName(): string {\n return this.adapter.name;\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────\n\n /** Cancel any ongoing haptic effect */\n cancel(): void {\n this.adapter.cancel();\n }\n\n /** Clean up resources */\n dispose(): void {\n this.adapter.dispose();\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n private async _playSteps(steps: HapticStep[]): Promise<void> {\n if (!this.config.enabled || steps.length === 0) return;\n\n // Apply global intensity multiplier\n let adjusted = steps.map((s) => ({\n ...s,\n intensity:\n s.type === 'vibrate'\n ? normalizeIntensity(s.intensity * this.config.intensity)\n : 0,\n }));\n\n // Adapt to device capabilities\n const caps = this.adapter.capabilities();\n adjusted = this.adaptive.adapt(adjusted, caps);\n\n // Optimize\n adjusted = optimizeSteps(adjusted);\n\n if (this.adapter.supported) {\n await this.adapter.playSequence(adjusted);\n } else {\n await this.fallback.execute(adjusted);\n }\n }\n}\n","/** Validate an HPL pattern string and return human-readable errors */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nconst VALID_CHARS = new Set('~#@.|\\\\-[] \\t\\nx0123456789');\n\nexport function validateHPL(input: string): ValidationResult {\n const errors: string[] = [];\n\n if (input.length === 0) {\n return { valid: true, errors: [] };\n }\n\n // Check for invalid characters\n for (let i = 0; i < input.length; i++) {\n if (!VALID_CHARS.has(input[i]!)) {\n errors.push(`Invalid character '${input[i]}' at position ${i}`);\n }\n }\n\n // Check bracket matching\n let depth = 0;\n for (let i = 0; i < input.length; i++) {\n if (input[i] === '[') depth++;\n if (input[i] === ']') depth--;\n if (depth < 0) {\n errors.push(`Unmatched ']' at position ${i}`);\n }\n }\n if (depth > 0) {\n errors.push(`${depth} unclosed '[' bracket(s)`);\n }\n\n // Check for empty groups\n for (let i = 0; i < input.length - 1; i++) {\n if (input[i] === '[' && input[i + 1] === ']') {\n errors.push(`Empty group at position ${i}`);\n }\n }\n\n // Check repeat modifiers are after groups or atoms\n for (let i = 0; i < input.length; i++) {\n if (input[i] === 'x' && i + 1 < input.length && /\\d/.test(input[i + 1]!)) {\n if (i === 0) {\n errors.push(`Repeat modifier 'x' at position ${i} must follow a group or atom`);\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","import type { HapticPattern } from '../types';\n\n/** UI interaction presets */\nexport const ui = {\n /** Light button tap */\n tap: {\n name: 'ui.tap',\n steps: [{ type: 'vibrate' as const, duration: 10, intensity: 0.6 }],\n },\n\n /** Double tap */\n doubleTap: {\n name: 'ui.doubleTap',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.6 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.6 },\n ],\n },\n\n /** Long press acknowledgment */\n longPress: {\n name: 'ui.longPress',\n steps: [{ type: 'vibrate' as const, duration: 50, intensity: 0.8 }],\n },\n\n /** Toggle switch on */\n toggleOn: {\n name: 'ui.toggleOn',\n steps: [{ type: 'vibrate' as const, duration: 15, intensity: 0.6 }],\n },\n\n /** Toggle switch off */\n toggleOff: {\n name: 'ui.toggleOff',\n steps: [{ type: 'vibrate' as const, duration: 10, intensity: 0.3 }],\n },\n\n /** Slider snap to value */\n sliderSnap: {\n name: 'ui.sliderSnap',\n steps: [{ type: 'vibrate' as const, duration: 5, intensity: 0.4 }],\n },\n\n /** Selection changed */\n selection: {\n name: 'ui.selection',\n steps: [{ type: 'vibrate' as const, duration: 8, intensity: 0.4 }],\n },\n\n /** Pull to refresh threshold reached */\n pullToRefresh: {\n name: 'ui.pullToRefresh',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n ],\n },\n\n /** Swipe action triggered */\n swipe: {\n name: 'ui.swipe',\n steps: [\n { type: 'vibrate' as const, duration: 12, intensity: 0.4 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 8, intensity: 0.3 },\n ],\n },\n\n /** Context menu appearance */\n contextMenu: {\n name: 'ui.contextMenu',\n steps: [{ type: 'vibrate' as const, duration: 20, intensity: 0.7 }],\n },\n\n /** Drag start */\n dragStart: {\n name: 'ui.dragStart',\n steps: [{ type: 'vibrate' as const, duration: 12, intensity: 0.5 }],\n },\n\n /** Drag drop */\n drop: {\n name: 'ui.drop',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.8 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.4 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Notification feedback presets */\nexport const notifications = {\n /** Success — two ascending pulses */\n success: {\n name: 'notifications.success',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.8 },\n ],\n },\n\n /** Warning — three even pulses */\n warning: {\n name: 'notifications.warning',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n ],\n },\n\n /** Error — two heavy pulses */\n error: {\n name: 'notifications.error',\n steps: [\n { type: 'vibrate' as const, duration: 80, intensity: 1.0 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 80, intensity: 1.0 },\n ],\n },\n\n /** Info — soft single pulse */\n info: {\n name: 'notifications.info',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.4 },\n ],\n },\n\n /** Message received */\n messageReceived: {\n name: 'notifications.messageReceived',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n ],\n },\n\n /** Alarm — urgent repeating pattern */\n alarm: {\n name: 'notifications.alarm',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 200, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n ],\n },\n\n /** Reminder — gentle nudge */\n reminder: {\n name: 'notifications.reminder',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n { type: 'pause' as const, duration: 150, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Gaming haptic presets */\nexport const gaming = {\n /** Explosion — heavy descending */\n explosion: {\n name: 'gaming.explosion',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'vibrate' as const, duration: 80, intensity: 0.8 },\n { type: 'vibrate' as const, duration: 60, intensity: 0.5 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.3 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.1 },\n ],\n },\n\n /** Collision — sharp impact */\n collision: {\n name: 'gaming.collision',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 1.0 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n ],\n },\n\n /** Heartbeat — rhythmic pulse */\n heartbeat: {\n name: 'gaming.heartbeat',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.8 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 1.0 },\n { type: 'pause' as const, duration: 400, intensity: 0 },\n ],\n },\n\n /** Gunshot — sharp burst */\n gunshot: {\n name: 'gaming.gunshot',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 1.0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n ],\n },\n\n /** Sword clash — metallic ring */\n swordClash: {\n name: 'gaming.swordClash',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 1.0 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.6 },\n { type: 'vibrate' as const, duration: 50, intensity: 0.3 },\n ],\n },\n\n /** Power up — ascending intensity */\n powerUp: {\n name: 'gaming.powerUp',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.2 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.4 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.6 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.8 },\n { type: 'vibrate' as const, duration: 60, intensity: 1.0 },\n ],\n },\n\n /** Damage taken — heavy stutter */\n damage: {\n name: 'gaming.damage',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.9 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.6 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.3 },\n ],\n },\n\n /** Item pickup — light cheerful */\n pickup: {\n name: 'gaming.pickup',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.3 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n ],\n },\n\n /** Level complete — celebratory */\n levelComplete: {\n name: 'gaming.levelComplete',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 50, intensity: 1.0 },\n ],\n },\n\n /** Engine rumble — continuous vibration */\n engineRumble: {\n name: 'gaming.engineRumble',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Accessibility-focused haptic presets — rhythmic patterns for non-visual feedback */\nexport const accessibility = {\n /** Confirm action — clear double pulse */\n confirm: {\n name: 'accessibility.confirm',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n ],\n },\n\n /** Deny/reject — long single buzz */\n deny: {\n name: 'accessibility.deny',\n steps: [\n { type: 'vibrate' as const, duration: 200, intensity: 0.8 },\n ],\n },\n\n /** Boundary reached (e.g., scroll limit, min/max value) */\n boundary: {\n name: 'accessibility.boundary',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 1.0 },\n ],\n },\n\n /** Focus change — subtle tick */\n focusChange: {\n name: 'accessibility.focusChange',\n steps: [\n { type: 'vibrate' as const, duration: 5, intensity: 0.3 },\n ],\n },\n\n /** Counting rhythm — one tick per count */\n countTick: {\n name: 'accessibility.countTick',\n steps: [\n { type: 'vibrate' as const, duration: 8, intensity: 0.5 },\n ],\n },\n\n /** Navigation landmark reached */\n landmark: {\n name: 'accessibility.landmark',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n ],\n },\n\n /** Progress checkpoint — escalating feedback */\n progressCheckpoint: {\n name: 'accessibility.progressCheckpoint',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.4 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.7 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** System-level haptic presets */\nexport const system = {\n /** Keyboard key press */\n keyPress: {\n name: 'system.keyPress',\n steps: [{ type: 'vibrate' as const, duration: 5, intensity: 0.3 }],\n },\n\n /** Scroll tick (detent-like) */\n scrollTick: {\n name: 'system.scrollTick',\n steps: [{ type: 'vibrate' as const, duration: 3, intensity: 0.2 }],\n },\n\n /** Scroll boundary reached */\n scrollBounce: {\n name: 'system.scrollBounce',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.5 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.3 },\n ],\n },\n\n /** Delete action */\n delete: {\n name: 'system.delete',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.8 },\n ],\n },\n\n /** Undo action */\n undo: {\n name: 'system.undo',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.3 },\n ],\n },\n\n /** Copy to clipboard */\n copy: {\n name: 'system.copy',\n steps: [{ type: 'vibrate' as const, duration: 12, intensity: 0.4 }],\n },\n\n /** Paste from clipboard */\n paste: {\n name: 'system.paste',\n steps: [\n { type: 'vibrate' as const, duration: 8, intensity: 0.3 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 12, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","export { ui } from './ui';\nexport { notifications } from './notifications';\nexport { gaming } from './gaming';\nexport { accessibility } from './accessibility';\nexport { system } from './system';\n\nimport { ui } from './ui';\nimport { notifications } from './notifications';\nimport { gaming } from './gaming';\nimport { accessibility } from './accessibility';\nimport { system } from './system';\n\n/** All presets grouped by category */\nexport const presets = {\n ui,\n notifications,\n gaming,\n accessibility,\n system,\n} as const;\n","// Types\nexport type {\n HapticStep,\n HapticPattern,\n EasingFunction,\n ImpactStyle,\n NotificationType,\n SemanticEffect,\n AdapterCapabilities,\n HapticAdapter,\n HapticConfig,\n FallbackConfig,\n VisualFallbackStyle,\n HPLToken,\n HPLTokenType,\n HPLNode,\n HPLNodeType,\n} from './types';\n\n// Engine\nexport { HapticEngine } from './engine';\nexport { AdaptiveEngine, FallbackManager, detectAdapter } from './engine';\n\n// Adapters\nexport { NoopAdapter, WebVibrationAdapter } from './adapters';\n\n// Patterns\nexport { parseHPL, HPLParser, HPLParserError } from './patterns';\nexport { compile, optimizeSteps } from './patterns';\nexport { tokenize, HPLTokenizerError } from './patterns';\nexport { validateHPL } from './patterns';\nexport type { ValidationResult } from './patterns';\n\n// Composer\nexport { PatternComposer } from './composer';\n\n// Presets\nexport { presets, ui, notifications, gaming, accessibility, system } from './presets';\n\n// Utils\nexport { detectPlatform } from './utils';\nexport type { PlatformInfo } from './utils';\n\n// ─── Default singleton ──────────────────────────────────────\n\nimport { HapticEngine } from './engine';\n\n/**\n * Pre-configured haptic engine singleton.\n * Import and use directly for quick haptic feedback:\n *\n * import { haptic } from '@hapticjs/core';\n * haptic.tap();\n * haptic.success();\n * haptic.play('~~..##..@@');\n */\nexport const haptic = HapticEngine.create();\n"]}
@@ -0,0 +1,384 @@
1
+ export { accessibility, gaming, notifications, presets, system, ui } from './presets/index.cjs';
2
+
3
+ /** A single step in a haptic sequence */
4
+ interface HapticStep {
5
+ type: 'vibrate' | 'pause';
6
+ /** Duration in milliseconds */
7
+ duration: number;
8
+ /** Intensity from 0.0 to 1.0 (0 = off, 1 = max) */
9
+ intensity: number;
10
+ /** Optional easing for intensity ramps */
11
+ easing?: EasingFunction;
12
+ }
13
+ /** A complete haptic pattern — a named sequence of steps */
14
+ interface HapticPattern {
15
+ name?: string;
16
+ steps: HapticStep[];
17
+ metadata?: Record<string, unknown>;
18
+ }
19
+ /** Easing function type for smooth transitions */
20
+ type EasingFunction = 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out';
21
+ /** Semantic impact styles matching iOS UIImpactFeedbackGenerator */
22
+ type ImpactStyle = 'light' | 'medium' | 'heavy' | 'rigid' | 'soft';
23
+ /** Semantic notification types */
24
+ type NotificationType = 'success' | 'warning' | 'error';
25
+ /** All built-in semantic effect names */
26
+ type SemanticEffect = 'tap' | 'doubleTap' | 'longPress' | 'success' | 'warning' | 'error' | 'selection' | 'toggle' | ImpactStyle;
27
+
28
+ /** Capabilities a haptic adapter supports */
29
+ interface AdapterCapabilities {
30
+ /** Number of discrete intensity levels (1 = on/off only, 100+ = fine-grained) */
31
+ maxIntensityLevels: number;
32
+ /** Minimum pulse duration in ms */
33
+ minDuration: number;
34
+ /** Maximum continuous duration in ms */
35
+ maxDuration: number;
36
+ /** Whether the adapter can play multi-step patterns natively */
37
+ supportsPattern: boolean;
38
+ /** Whether the adapter can vary intensity (not just on/off) */
39
+ supportsIntensity: boolean;
40
+ /** Whether the adapter has dual motors (gamepad-style) */
41
+ dualMotor: boolean;
42
+ }
43
+ /** Interface all haptic adapters must implement */
44
+ interface HapticAdapter {
45
+ readonly name: string;
46
+ readonly supported: boolean;
47
+ /** Get the capabilities of this adapter */
48
+ capabilities(): AdapterCapabilities;
49
+ /** Fire a single haptic pulse */
50
+ pulse(intensity: number, duration: number): Promise<void>;
51
+ /** Play a sequence of haptic steps */
52
+ playSequence(steps: HapticStep[]): Promise<void>;
53
+ /** Cancel any ongoing haptic effect */
54
+ cancel(): void;
55
+ /** Clean up resources */
56
+ dispose(): void;
57
+ }
58
+
59
+ /** Visual fallback style when haptics are unavailable */
60
+ type VisualFallbackStyle = 'flash' | 'shake' | 'pulse';
61
+ /** Fallback configuration for non-haptic feedback */
62
+ interface FallbackConfig {
63
+ type: 'none' | 'visual' | 'audio' | 'both';
64
+ visual?: {
65
+ /** Element to animate */
66
+ element?: HTMLElement;
67
+ /** CSS class to toggle */
68
+ className?: string;
69
+ /** Animation style */
70
+ style?: VisualFallbackStyle;
71
+ };
72
+ audio?: {
73
+ enabled: boolean;
74
+ /** Volume from 0 to 1 */
75
+ volume: number;
76
+ };
77
+ }
78
+ /** Main configuration for the haptic engine */
79
+ interface HapticConfig {
80
+ /** Explicitly set an adapter (overrides auto-detection) */
81
+ adapter?: HapticAdapter;
82
+ /** Global intensity multiplier (0.0 to 1.0) */
83
+ intensity: number;
84
+ /** Whether haptics are enabled */
85
+ enabled: boolean;
86
+ /** Fallback when haptics are unavailable */
87
+ fallback: FallbackConfig;
88
+ /** Respect system haptic settings */
89
+ respectSystemSettings: boolean;
90
+ }
91
+
92
+ /** HPL Token types */
93
+ type HPLTokenType = 'LIGHT' | 'MEDIUM' | 'HEAVY' | 'PAUSE' | 'TAP' | 'SUSTAIN' | 'GROUP_START' | 'GROUP_END' | 'REPEAT';
94
+ /** A single HPL token */
95
+ interface HPLToken {
96
+ type: HPLTokenType;
97
+ value: string;
98
+ /** For REPEAT tokens, the repeat count */
99
+ repeatCount?: number;
100
+ }
101
+ /** AST node types */
102
+ type HPLNodeType = 'vibrate' | 'pause' | 'tap' | 'sustain' | 'group' | 'sequence';
103
+ /** Base AST node */
104
+ interface HPLBaseNode {
105
+ type: HPLNodeType;
106
+ }
107
+ /** Vibrate node — ~, #, or @ */
108
+ interface HPLVibrateNode extends HPLBaseNode {
109
+ type: 'vibrate';
110
+ intensity: number;
111
+ duration: number;
112
+ }
113
+ /** Pause node — . */
114
+ interface HPLPauseNode extends HPLBaseNode {
115
+ type: 'pause';
116
+ duration: number;
117
+ }
118
+ /** Tap node — | */
119
+ interface HPLTapNode extends HPLBaseNode {
120
+ type: 'tap';
121
+ duration: number;
122
+ intensity: number;
123
+ }
124
+ /** Sustain node — - */
125
+ interface HPLSustainNode extends HPLBaseNode {
126
+ type: 'sustain';
127
+ extension: number;
128
+ }
129
+ /** Group node — [...] with optional repeat */
130
+ interface HPLGroupNode extends HPLBaseNode {
131
+ type: 'group';
132
+ children: HPLNode[];
133
+ repeat: number;
134
+ }
135
+ /** Sequence node — the root */
136
+ interface HPLSequenceNode extends HPLBaseNode {
137
+ type: 'sequence';
138
+ children: HPLNode[];
139
+ }
140
+ /** Any HPL AST node */
141
+ type HPLNode = HPLVibrateNode | HPLPauseNode | HPLTapNode | HPLSustainNode | HPLGroupNode | HPLSequenceNode;
142
+
143
+ /**
144
+ * Fluent builder for composing haptic patterns programmatically.
145
+ *
146
+ * Usage:
147
+ * const pattern = new PatternComposer()
148
+ * .tap(0.5)
149
+ * .pause(100)
150
+ * .ramp(0.2, 1.0, 300)
151
+ * .buzz(200)
152
+ * .build();
153
+ */
154
+ declare class PatternComposer {
155
+ private steps;
156
+ private _onPlay?;
157
+ /** Register a play callback (used by HapticEngine) */
158
+ onPlay(fn: (steps: HapticStep[]) => Promise<void>): this;
159
+ /** Add a short tap vibration */
160
+ tap(intensity?: number): this;
161
+ /** Add a vibration with specified duration and intensity */
162
+ vibrate(duration: number, intensity?: number): this;
163
+ /** Add a buzz (medium-length vibration) */
164
+ buzz(duration?: number, intensity?: number): this;
165
+ /** Add a pause */
166
+ pause(duration?: number): this;
167
+ /** Add an intensity ramp from start to end intensity over duration */
168
+ ramp(startIntensity: number, endIntensity: number, duration: number, easing?: EasingFunction): this;
169
+ /** Add a pulse pattern (on-off-on-off) */
170
+ pulse(count: number, onDuration?: number, offDuration?: number, intensity?: number): this;
171
+ /** Repeat the entire current sequence N times */
172
+ repeat(times: number): this;
173
+ /** Build and return the step array */
174
+ build(): HapticStep[];
175
+ /** Build and immediately play the pattern */
176
+ play(): Promise<void>;
177
+ /** Reset the composer */
178
+ clear(): this;
179
+ /** Get total duration in ms */
180
+ get duration(): number;
181
+ }
182
+
183
+ /**
184
+ * The main haptic engine — orchestrates adapters, patterns, and fallbacks.
185
+ *
186
+ * Usage:
187
+ * const engine = HapticEngine.create();
188
+ * engine.tap();
189
+ * engine.success();
190
+ * engine.play('~~..##..@@');
191
+ */
192
+ declare class HapticEngine {
193
+ private adapter;
194
+ private config;
195
+ private adaptive;
196
+ private fallback;
197
+ constructor(config?: Partial<HapticConfig>);
198
+ /** Create a new engine with auto-detected adapter */
199
+ static create(config?: Partial<HapticConfig>): HapticEngine;
200
+ /** Light tap feedback */
201
+ tap(intensity?: number): Promise<void>;
202
+ /** Double tap */
203
+ doubleTap(intensity?: number): Promise<void>;
204
+ /** Long press feedback */
205
+ longPress(intensity?: number): Promise<void>;
206
+ /** Success notification */
207
+ success(): Promise<void>;
208
+ /** Warning notification */
209
+ warning(): Promise<void>;
210
+ /** Error notification */
211
+ error(): Promise<void>;
212
+ /** Selection change feedback */
213
+ selection(): Promise<void>;
214
+ /** Toggle feedback */
215
+ toggle(on: boolean): Promise<void>;
216
+ /** Impact with style (matches iOS UIImpactFeedbackGenerator) */
217
+ impact(style?: ImpactStyle): Promise<void>;
218
+ /** Vibrate for a specified duration */
219
+ vibrate(duration: number, intensity?: number): Promise<void>;
220
+ /**
221
+ * Play a haptic pattern.
222
+ * Accepts:
223
+ * - HPL string: "~~..##..@@"
224
+ * - HapticPattern object
225
+ * - Raw HapticStep array
226
+ */
227
+ play(pattern: string | HapticPattern | HapticStep[]): Promise<void>;
228
+ /** Create a new pattern composer */
229
+ compose(): PatternComposer;
230
+ /** Update engine configuration */
231
+ configure(config: Partial<HapticConfig>): void;
232
+ /** Check if haptics are supported on this device */
233
+ get isSupported(): boolean;
234
+ /** Get the current adapter name */
235
+ get adapterName(): string;
236
+ /** Cancel any ongoing haptic effect */
237
+ cancel(): void;
238
+ /** Clean up resources */
239
+ dispose(): void;
240
+ private _playSteps;
241
+ }
242
+
243
+ /**
244
+ * Adapts ideal haptic patterns to what the device can actually produce.
245
+ * Handles intensity quantization, duration clamping, and step merging.
246
+ */
247
+ declare class AdaptiveEngine {
248
+ adapt(steps: HapticStep[], capabilities: AdapterCapabilities): HapticStep[];
249
+ private _adaptStep;
250
+ }
251
+
252
+ /**
253
+ * Provides visual/audio fallback when haptic hardware is unavailable.
254
+ */
255
+ declare class FallbackManager {
256
+ private config;
257
+ constructor(config: FallbackConfig);
258
+ updateConfig(config: FallbackConfig): void;
259
+ /** Execute fallback feedback for the given steps */
260
+ execute(steps: HapticStep[]): Promise<void>;
261
+ private _visualFallback;
262
+ private _audioFallback;
263
+ }
264
+
265
+ /**
266
+ * Auto-detect the best available haptic adapter for the current platform.
267
+ */
268
+ declare function detectAdapter(): HapticAdapter;
269
+
270
+ /**
271
+ * No-op adapter — used in SSR, Node, or when no haptic hardware is available.
272
+ * Silently accepts all calls without doing anything.
273
+ */
274
+ declare class NoopAdapter implements HapticAdapter {
275
+ readonly name = "noop";
276
+ readonly supported = false;
277
+ capabilities(): AdapterCapabilities;
278
+ pulse(_intensity: number, _duration: number): Promise<void>;
279
+ playSequence(_steps: HapticStep[]): Promise<void>;
280
+ cancel(): void;
281
+ dispose(): void;
282
+ }
283
+
284
+ /**
285
+ * Web Vibration API adapter.
286
+ * Uses navigator.vibrate() — supported on Android browsers.
287
+ * Intensity is simulated via PWM (rapid on/off) since the API only supports on/off.
288
+ */
289
+ declare class WebVibrationAdapter implements HapticAdapter {
290
+ readonly name = "web-vibration";
291
+ readonly supported: boolean;
292
+ private _cancelled;
293
+ constructor();
294
+ capabilities(): AdapterCapabilities;
295
+ pulse(_intensity: number, duration: number): Promise<void>;
296
+ playSequence(steps: HapticStep[]): Promise<void>;
297
+ cancel(): void;
298
+ dispose(): void;
299
+ /** Convert steps to Vibration API pattern array */
300
+ private _toVibrationPattern;
301
+ /** Check if all steps can be played with native pattern (no intensity variation) */
302
+ private _canUseNativePattern;
303
+ /** Simulate lower intensity via pulse-width modulation */
304
+ private _pwmVibrate;
305
+ }
306
+
307
+ declare class HPLParserError extends Error {
308
+ constructor(message: string);
309
+ }
310
+ /**
311
+ * Recursive descent parser for the Haptic Pattern Language (HPL).
312
+ *
313
+ * Grammar:
314
+ * Pattern := Segment+
315
+ * Segment := Group | Atom
316
+ * Group := '[' Segment+ ']' Repeat?
317
+ * Atom := '~' | '#' | '@' | '.' | '|' | '-'
318
+ * Repeat := 'x' Number
319
+ */
320
+ declare class HPLParser {
321
+ private tokens;
322
+ private pos;
323
+ parse(input: string): HPLSequenceNode;
324
+ private _parseSegments;
325
+ private _parseSegment;
326
+ private _parseGroup;
327
+ private _parseAtom;
328
+ private _makeVibrate;
329
+ private _makePause;
330
+ private _makeTap;
331
+ private _makeSustain;
332
+ }
333
+ /** Convenience function to parse an HPL string */
334
+ declare function parseHPL(input: string): HPLSequenceNode;
335
+
336
+ /**
337
+ * Compiles an HPL AST into a flat array of HapticSteps.
338
+ * Handles group expansion, sustain merging, and repeat unrolling.
339
+ */
340
+ declare function compile(ast: HPLSequenceNode): HapticStep[];
341
+ /**
342
+ * Optimize a step sequence by merging adjacent same-type steps.
343
+ */
344
+ declare function optimizeSteps(steps: HapticStep[]): HapticStep[];
345
+
346
+ declare class HPLTokenizerError extends Error {
347
+ readonly position: number;
348
+ constructor(message: string, position: number);
349
+ }
350
+ /** Tokenize an HPL pattern string into tokens */
351
+ declare function tokenize(input: string): HPLToken[];
352
+
353
+ /** Validate an HPL pattern string and return human-readable errors */
354
+ interface ValidationResult {
355
+ valid: boolean;
356
+ errors: string[];
357
+ }
358
+ declare function validateHPL(input: string): ValidationResult;
359
+
360
+ /** Platform detection utilities */
361
+ interface PlatformInfo {
362
+ isWeb: boolean;
363
+ isNode: boolean;
364
+ isReactNative: boolean;
365
+ hasVibrationAPI: boolean;
366
+ hasGamepadAPI: boolean;
367
+ isIOS: boolean;
368
+ isAndroid: boolean;
369
+ isMobile: boolean;
370
+ }
371
+ declare function detectPlatform(): PlatformInfo;
372
+
373
+ /**
374
+ * Pre-configured haptic engine singleton.
375
+ * Import and use directly for quick haptic feedback:
376
+ *
377
+ * import { haptic } from '@hapticjs/core';
378
+ * haptic.tap();
379
+ * haptic.success();
380
+ * haptic.play('~~..##..@@');
381
+ */
382
+ declare const haptic: HapticEngine;
383
+
384
+ export { type AdapterCapabilities, AdaptiveEngine, type EasingFunction, type FallbackConfig, FallbackManager, type HPLNode, type HPLNodeType, HPLParser, HPLParserError, type HPLToken, type HPLTokenType, HPLTokenizerError, type HapticAdapter, type HapticConfig, HapticEngine, type HapticPattern, type HapticStep, type ImpactStyle, NoopAdapter, type NotificationType, PatternComposer, type PlatformInfo, type SemanticEffect, type ValidationResult, type VisualFallbackStyle, WebVibrationAdapter, compile, detectAdapter, detectPlatform, haptic, optimizeSteps, parseHPL, tokenize, validateHPL };