@openclaw/crabline 0.1.10 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/openclaw/artifact-generation.d.ts +5 -0
- package/dist/src/openclaw/artifact-generation.js +54 -5
- package/dist/src/openclaw/artifact-generation.js.map +1 -1
- package/dist/src/openclaw/private-file.d.ts +3 -1
- package/dist/src/openclaw/private-file.js +58 -4
- package/dist/src/openclaw/private-file.js.map +1 -1
- package/dist/src/openclaw/smoke-lock.js +70 -15
- package/dist/src/openclaw/smoke-lock.js.map +1 -1
- package/dist/src/openclaw.js +144 -4
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/providers/recorder.js +13 -3
- package/dist/src/providers/recorder.js.map +1 -1
- package/dist/src/servers/recorder.js +226 -10
- package/dist/src/servers/recorder.js.map +1 -1
- package/dist/src/servers/telegram.js +24 -11
- package/dist/src/servers/telegram.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/servers/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAwB,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACL,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,wBAAwB,EACxB,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAA4B,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GAEtB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,+BAA+B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACzD,MAAM,qCAAqC,GAAG,CAAC,CAAC;AAChD,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAC3C,MAAM,oCAAoC,GAAG,KAAK,CAAC;AACnD,MAAM,uCAAuC,GAAG,CAAC,CAAC;AAClD,MAAM,8BAA8B,GAAG,gCAAgC,CAAC;AACxE,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,eAAe;IACf,WAAW;IACX,cAAc;IACd,aAAa;IACb,WAAW;IACX,WAAW;CACZ,CAAC,CAAC;AACH,MAAM,qBAAqB,GAAG;IAC5B,WAAW;IACX,OAAO;IACP,UAAU;IACV,YAAY;IACZ,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,YAAY;IACZ,OAAO;CACC,CAAC;AACX,MAAM,kCAAkC,GAAG;IACzC,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,cAAc;IACd,YAAY;IACZ,mBAAmB;IACnB,aAAa;IACb,sBAAsB;IACtB,2BAA2B;IAC3B,yBAAyB;IACzB,qBAAqB;IACrB,gBAAgB;IAChB,eAAe;IACf,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,wBAAwB;IACxB,gBAAgB;IAChB,MAAM;IACN,aAAa;IACb,oBAAoB;IACpB,sBAAsB;IACtB,oBAAoB;IACpB,gBAAgB;CACR,CAAC;AA2JX,SAAS,UAAU,CAAC,MAAe;IACjC,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,aAAa,CAAC,WAAmB,EAAE,MAAM,GAAG,GAAG;IACtD,OAAO,YAAY,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAwB;IACtD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;IACtE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9E,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAChD,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CACpD,CAAC;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,MAAM,0BAA0B,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,IAAY,EACZ,WAAmB;IAEnB,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE;YAC3C,IAAI;YACJ,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE;YACxC,MAAM,EAAE,MAAM;SACf,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,MAAM,KAAK,GAAG,0CAA0C,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAClD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YACtD,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;YAClB,CAAC,CAAC,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QACjD,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;IACvD,CAAC;IACD,OAAO,8BAA8B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AACpF,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAA0B,EAAE,KAA0B;IAC/E,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,qBAAqB,CAAI,IAAuB;IACvD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACzC,GAAG;QACH,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK;KAC9C,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAA0B;IAC/C,OAAO;QACL,eAAe,EAAE,IAAI;QACrB,2BAA2B,EAAE,IAAI;QACjC,UAAU,EAAE,UAAU;QACtB,kBAAkB,EAAE,IAAI;QACxB,EAAE,EAAE,KAAK,CAAC,KAAK;QACf,MAAM,EAAE,IAAI;QACZ,uBAAuB,EAAE,KAAK;QAC9B,QAAQ,EAAE,KAAK,CAAC,WAAW;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAAuB;IACzC,MAAM,IAAI,GACR,OAAO,MAAM,KAAK,QAAQ;QACxB,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,MAAM,IAAI,CAAC;YACX,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;gBACjC,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,OAAO,CAAC;IAClB,OAAO;QACL,EAAE,EAAE,MAAM;QACV,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAA0B,EAC1B,IAA6B;IAE7B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,KAAK,SAAS,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;QACxB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACnC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC;QAC1B,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE;QACjC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CACjC,KAA0B,EAC1B,IAA6B,EAC7B,SAAiE;IAEjE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAChD,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,KAAK,SAAS,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG;QACZ,OAAO,EAAE,YAAY,SAAS,IAAI,KAAK,CAAC,aAAa,EAAE;QACvD,SAAS,EAAE,QAAQ;QACnB,cAAc,EAAE,YAAY,SAAS,WAAW,KAAK,CAAC,aAAa,EAAE;KACtE,CAAC;IACF,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;QACxB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACnC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,CAAC,SAAS,CAAC,EACT,SAAS,KAAK,OAAO;YACnB,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACrC,CAAC,CAAC;gBACE,GAAG,KAAK;gBACR,GAAG,CAAC,SAAS,KAAK,OAAO;oBACvB,CAAC,CAAC,EAAE,QAAQ,EAAE;oBACd,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,OAAO;wBAClD,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;wBAC7B,CAAC,CAAC,EAAE,CAAC;gBACT,SAAS,EAAE,0BAA0B;aACtC;QACP,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE;QACjC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA0B,EAC1B,IAA6B;IAE7B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,KAAK,SAAS,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;QACxB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACnC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC;QAC1B,UAAU,EAAE,SAAS;QACrB,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA0B,EAC1B,IAA6B;IAE7B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC;IAChD,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,iBAAiB,CAAC;IACrE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC;IACzD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC;IACtD,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,cAAc,KAAK,SAAS,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC/C,IACE,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,CAAC;QACnD,CAAC,aAAa,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,CAAC;QAC7D,CAAC,cAAc,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,CAAC;QACzD,CAAC,aAAa,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,CAAC,EACvD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5D,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,OAAO,EAAE;YACP,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACnC,IAAI,EAAE;gBACJ,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS;gBACvE,EAAE,EAAE,MAAM,IAAI,MAAM;gBACpB,MAAM,EAAE,KAAK;gBACb,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD;YACD,UAAU,EAAE,SAAS,IAAI,KAAK,CAAC,aAAa;YAC5C,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,IAAI;SACL;QACD,SAAS,EAAE,QAAQ,IAAI,KAAK,CAAC,YAAY;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAc,EACd,IAAY;IAEZ,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAA4D,EAAE,CAAC;IAC7E,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IACE,MAAM,KAAK,SAAS;YACpB,MAAM,GAAG,CAAC;YACV,MAAM,KAAK,SAAS;YACpB,MAAM,GAAG,CAAC;YACV,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM;YAC7B,CAAC,IAAI,EACL,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA8B;IACtD,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,kCAAkC,CAAC,IAA6B;IACvE,OAAO,CACL,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,SAAS,CACtE;QACD;YACE,IAAI,CAAC,MAAM;YACX,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,SAAS;YACd,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,eAAe;YACpB,IAAI,CAAC,iBAAiB;YACtB,IAAI,CAAC,QAAQ;YACb,IAAI,CAAC,SAAS;SACf,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAC/E,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CAAC,IAA6B;IACjE,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC;IACtD,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAE/C,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,IACE,QAAQ,KAAK,SAAS;YACtB,CAAC,IAAI;YACL,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,SAAS;YACrC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,SAAS;YAChD,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;gBACzB,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC;YACjF,CAAC,OAAO,CAAC,iBAAiB,KAAK,SAAS;gBACtC,cAAc,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,SAAS,CAAC,EAC1D,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;IACnD,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,IACE,MAAM,KAAK,SAAS;QACpB,kCAAkC,CAAC,IAAI,CAAC;QACxC,gBAAgB,CAAC,IAAI,CAAC;QACtB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,EACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,QAAQ,KAAK,SAAS;QACtB,kCAAkC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAC9E,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,MAKzC;IACC,IAAI,gBAA6B,CAAC;IAClC,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5D,gBAAgB,GAAG,OAAO,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,MAAM,iBAAiB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;QAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,aAAa,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,aAAa,CAAC,2CAA2C,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC;YACxE,OAAO,aAAa,CAClB,qDAAqD,MAAM,CAAC,KAAK,CAAC,uBAAuB,WAAW,EACpG,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CACnC,MAAM,CAAC,KAAK,CAAC,aAAa,EAC1B,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAC9B,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACtF,MAAM,qBAAqB,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QACzD,MAAM,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC9B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM;gBACvC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ;gBACzB,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC9B,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,KAAK,qBAAqB,EAAE,CAAC;gBACzD,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,aAAa,CAAC;YAC7C,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,KAAK,oBAAoB,EAAE,CAAC;gBACvD,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;YAC3C,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7E,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACzB,+BAA+B,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACjD,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,wBAAwB,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjD,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,gBAAgB,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,KAA0B,EAC1B,SAAqC;IAErC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACjD,4BAA4B,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,OAAO,GAAoB,KAAK,CAAC,OAAO,CAAC;QAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;QACjC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACnE,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;gBACxB,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;oBAC9B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;oBACvD,OAAO,CAAC,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC5C,CAAC;gBACD,OAAO,aAAa,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACpD,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;oBAC9B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;oBACvD,OAAO,CAAC,gBAAgB,GAAG,oCAAoC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACnF,CAAC;gBACD,OAAO,aAAa,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC9B,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC9B,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC9B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;gBACvD,OAAO,CAAC,gBAAgB,GAAG,yBAAyB,CAAC;YACvD,CAAC;YACD,OAAO,aAAa,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,KAAuF,EACvF,GAAQ,EACR,UAAkB,EAClB,MAAmB;IAEnB,MAAM,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,aAAa,CAAC,iDAAiD,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,4BAA4B,EAAE,cAAc,CAAC,CAAC,EACpF,WAAW,CACZ,CAAC;IACF,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,qBAAqB,CAAC;YACnC,iBAAiB,EAAE,KAAK,CAAC,wBAAwB;YACjD,wBAAwB,EAAE,KAAK,CAAC,sBAAsB;YACtD,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClD,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC,iDAAiD,CAAC,CAAC;IAC1E,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,KAAK,cAAc;QACpC,CAAC,CAAC,aAAa,CAAC,iDAAiD,CAAC;QAClE,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,iBAAiB;YAClC,CAAC,CAAC,aAAa,CAAC,0EAA0E,CAAC;YAC3F,CAAC,CAAC,aAAa,CAAC,yCAAyC,CAAC,CAAC;AACjE,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAmB,EACnB,UAAkB,EAClB,MAAmB;IAEnB,MAAM,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,YAAY,CAAC,4BAA4B,EAAE,cAAc,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,MAAM,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,QAAoB,EAAE,EAAE;YACtC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,MAAM,CAAC,GAAG,EAAE,CACV,MAAM,CACJ,MAAM,CAAC,MAAM,YAAY,KAAK;YAC5B,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,IAAI,YAAY,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAC/D,CACF,CAAC;QACJ,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,4BAA4B,EAAE,cAAc,CAAC,CAAC,CAAC,EAC1F,WAAW,CACZ,CAAC;QACF,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EACvC,CAAC,KAAc,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAChD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAA0B,EAC1B,OAAwB,EACxB,MAAsB;IAEtB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,oCAAoC,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3F,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;YAC/B,OAAO,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC;QAC1D,CAAC;QACD,MAAM,SAAS,GACb,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnF,IAAI,SAAkB,CAAC;QACvB,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACnD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,YAAY,CAAC,4BAA4B,EAAE,cAAc,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC;gBACnD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;oBACtC,OAAO;oBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;oBAC5B,aAAa,EAAE,OAAO,CAAC,WAAW;wBAChC,CAAC,CAAC,CAAC,CAAC,iCAAiC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;wBAC5D,CAAC,CAAC,SAAS;oBACb,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,iBAAiB,CAAC,CAAC;oBACnE,GAAG;iBACJ,CAAC,CAAC;gBACH,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAK,CAAC;gBAClB,IAAI,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC/C,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,SAAS,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,KAA0B,EAC1B,OAAoC,EACpC,kBAA2B;IAE3B,IAAI,gBAA6B,CAAC;IAClC,MAAM,iBAAiB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACjD,KAAK,CAAC,gBAAgB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACrD,gBAAgB,GAAG,OAAO,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,MAAM,iBAAiB,CAAC;IACxB,IAAI,CAAC;QACH,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;QAC1B,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvC,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,uBAAuB,EAAE,CAAC;YACvD,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,MAAM,KAAK,CAAC,eAAe,CAAC;QAC5B,IAAI,kBAAkB,EAAE,CAAC;YACvB,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACxB,IAAI,OAAO,EAAE,CAAC;YACZ,wBAAwB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAC5C,+BAA+B,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;YAAS,CAAC;QACT,gBAAgB,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,KAA0B,EAAE,aAAa,GAAG,KAAK;IAClF,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5B,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACtC,KAAK,CAAC,iBAAiB,GAAG,SAAS,CAAC;IACtC,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAC/B,KAAK,CAAC,oBAAoB,GAAG,SAAS,CAAC;IACzC,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,KAA0B;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;IAC7C,IAAI,QAAQ,KAAK,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC5C,OAAO;IACT,CAAC;IACD,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjC,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC;IAC/B,KAAK,CAAC,oBAAoB,GAAG,QAAQ,CAAC;AACxC,CAAC;AAED,SAAS,+BAA+B,CAAC,KAA0B,EAAE,OAAe;IAClF,IACE,KAAK,CAAC,OAAO;QACb,CAAC,KAAK,CAAC,OAAO;QACd,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAC1B,KAAK,CAAC,eAAe;QACrB,KAAK,CAAC,iBAAiB,EACvB,CAAC;QACD,OAAO;IACT,CAAC;IACD,KAAK,CAAC,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;QACxC,KAAK,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACpC,KAAK,6BAA6B,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC,EAAE,OAAO,CAAC,CAAC;IACZ,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,6BAA6B,CAC1C,KAA0B,EAC1B,cAAc,GAAG,KAAK;IAEtB,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO,MAAM,KAAK,CAAC,eAAe,CAAC;IACrC,CAAC;IACD,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC/C,OAAO,aAAa,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,iBAAqC,CAAC;IAC1C,MAAM,QAAQ,GAAG,2BAA2B,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE;QAC/D,iBAAiB,GAAG,QAAQ,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC;IACjC,IAAI,MAA4B,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;YACvC,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;QACpC,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,iBAAiB,EAAE,CAAC;gBACtD,4BAA4B,CAAC,KAAK,CAAC,CAAC;gBACpC,+BAA+B,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;iBAAM,IAAI,MAAM,EAAE,CAAC;gBAClB,MAAM,OAAO,GACX,8BAA8B;oBAC9B,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,qCAAqC,CAAC,CAAC;gBACnF,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CACnC,KAAK,CAAC,oBAAoB,GAAG,CAAC,EAC9B,qCAAqC,CACtC,CAAC;gBACF,+BAA+B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC;gBAC/B,+BAA+B,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAKhC;IACC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC3C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,KAAK,eAAe,CAAC;QACrB,KAAK,kBAAkB,CAAC;QACxB,KAAK,gBAAgB,CAAC;QACtB,KAAK,qBAAqB,CAAC;QAC3B,KAAK,eAAe,CAAC;QACrB,KAAK,gBAAgB,CAAC;QACtB,KAAK,kBAAkB,CAAC;QACxB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,gBAAgB;YACnB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,KAAK,YAAY,EAAE,CAAC;YAClB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;gBAC3B,MAAM,sBAAsB,CAC1B,MAAM,CAAC,KAAK,EACZ,SAAS,EACT,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CACjD,CAAC;gBACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,aAAa,CAAC,8BAA8B,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,SAAc,CAAC;YACnB,IAAI,CAAC;gBACH,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,aAAa,CAAC,8BAA8B,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,SAAS,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACtE,OAAO,aAAa,CAAC,8BAA8B,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,IAAI,uCAAuC,EAAE,CAAC;gBAC1F,OAAO,aAAa,CAAC,iDAAiD,EAAE,GAAG,CAAC,CAAC;YAC/E,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAC7C,MAAM,CAAC,KAAK,EACZ,SAAS,EACT,IAAI,CAAC,GAAG,EAAE,GAAG,oCAAoC,EACjD,UAAU,CAAC,MAAM,CAClB,CAAC,OAAO,CAAC,GAAG,EAAE;gBACb,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YACH,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5D,IAAI,WAAW,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChE,OAAO,aAAa,CAAC,mCAAmC,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,sBAAsB,CAC1B,MAAM,CAAC,KAAK,EACZ;gBACE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,GAAG,EAAE,SAAS,CAAC,IAAI;aACpB,EACD,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CACjD,CAAC;YACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,eAAe;YAClB,MAAM,sBAAsB,CAC1B,MAAM,CAAC,KAAK,EACZ,SAAS,EACT,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CACjD,CAAC;YACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,KAAK,gBAAgB;YACnB,OAAO,UAAU,CAAC;gBAChB,sBAAsB,EAAE,KAAK;gBAC7B,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa;oBACrC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE;oBACzD,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,gBAAgB;oBACxC,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE;oBAC/D,CAAC,CAAC,EAAE,CAAC;gBACP,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM;gBACjD,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE;aACrC,CAAC,CAAC;QACL,KAAK,kBAAkB;YACrB,OAAO,UAAU,CAAC;gBAChB,UAAU,EAAE,QAAQ;gBACpB,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE;gBAC/C,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB;aAC1D,CAAC,CAAC;QACL,KAAK,iBAAiB,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/D,OAAO,OAAO;gBACZ,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;gBACrB,CAAC,CAAC,aAAa,CAAC,yDAAyD,CAAC,CAAC;QAC/E,CAAC;QACD,KAAK,aAAa,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACjE,OAAO,OAAO;gBACZ,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;gBACrB,CAAC,CAAC,aAAa,CAAC,4CAA4C,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,eAAe,CAAC;QACrB,KAAK,WAAW,CAAC;QACjB,KAAK,cAAc,CAAC;QACpB,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAKjC,CAAC;YACZ,MAAM,OAAO,GAAG,0BAA0B,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACjF,OAAO,OAAO;gBACZ,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;gBACrB,CAAC,CAAC,aAAa,CAAC,4BAA4B,SAAS,eAAe,CAAC,CAAC;QAC1E,CAAC;QACD,KAAK,YAAY;YACf,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,aAAa,CAAC,+DAA+D,EAAE,GAAG,CAAC,CAAC;YAC7F,CAAC;YACD,OAAO,MAAM,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAChD;YACE,OAAO,aAAa,CAAC,iCAAiC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAI9C;IACC,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;IACvD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO,aAAa,CAAC,4CAA4C,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;QACvF,OAAO,aAAa,CAAC,2CAA2C,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3F,OAAO,aAAa,CAAC,6CAA6C,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAC7B,OAAO,aAAa,CAAC,8CAA8C,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,aAAa,CAAC,2CAA2C,CAAC,CAAC;IACpE,CAAC;IAED,wBAAwB,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,EAAE,aAAa,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM;YACR,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAC5C,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,OAAO,EACd,WAAW,EACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAC/C,CAAC;YACF,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;gBAC9B,OAAO,aAAa,CAClB,mGAAmG,EACnG,GAAG,CACJ,CAAC;YACJ,CAAC;YACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM;YACR,CAAC;YACD,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA8B,EAC9B,MAA0B,EAC1B,KAAa;IAEb,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;QACzF,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA8B,EAAE,MAA0B;IACpF,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,wBAAwB,CAC/B,KAA8B,EAC9B,MAAgC;IAEhC,KAAK,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,KAA8B,EAC9B,OAAwB,EACxB,SAAiB,EACjB,SAAwB;IAExB,IAAI,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC9C,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,EAAE;QAC7D,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,IAAI,GAAuB;YAC/B,MAAM,CAAC,MAAM;gBACX,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;gBACf,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;gBAC3C,IAAI,KAAK,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;oBACpC,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBACrC,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;SACF,CAAC;QACF,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;QAClE,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC5C,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC9B,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,SAAS,EAAE,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,QAAQ,GAAG,aAAa,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;IAC1D,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC3C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAgE;IAC3F,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACnE,IAAI,GAAG,CAAC,QAAQ,KAAK,4BAA4B,EAAE,CAAC;QAClD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACrC,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,OAAO,cAAc,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,aAAa,CAAC,iDAAiD,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,MAAM,0BAA0B,CAAC;YACtC,IAAI;YACJ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxD,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IACrD,IAAI,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QACxD,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,aAAa,CAAC,sCAAsC,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,KAAK,GAAwB;QACjC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC;QACjC,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,kBAAkB,OAAO,CAAC,MAAM,EAAE;QACxC,KAAK,EAAE,qBAAqB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,EAAE,KAAK;KACZ,CAAC;IACF,IAAI,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;YACvC,IAAI;YACJ,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;QACH,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO,MAAM,iBAAiB,CAAC;QAC7B,IAAI;QACJ,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAM,GAA8B,EAAE;IAEtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,KAAK,GAAwB;QACjC,gBAAgB,EAAE,SAAS;QAC3B,uBAAuB,EAAE,IAAI,GAAG,EAAE;QAClC,wBAAwB,EAAE,IAAI,GAAG,EAAE;QACnC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChE,wBAAwB,EAAE,cAAc,CAAC,IAAI,CAAC;QAC9C,KAAK;QACL,QAAQ,EACN,MAAM,CAAC,QAAQ;YACf,CAAC,cAAc,CAAC,IAAI,CAAC;gBACnB,CAAC,CAAC,gCAAgC;gBAClC,CAAC,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1D,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,cAAc;QACjD,gBAAgB,EAAE,OAAO,CAAC,OAAO,EAAE;QACnC,uBAAuB,EAAE,8BAA8B,CAAC,MAAM,CAAC,uBAAuB,CAAC;QACvF,aAAa,EAAE,CAAC;QAChB,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,gBAAgB,CAAC;QAC3F,sBAAsB,EAAE,IAAI;QAC5B,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,SAAS;QAClB,gBAAgB,EAAE,OAAO,CAAC,OAAO,EAAE;QACnC,eAAe,EAAE,SAAS;QAC1B,oBAAoB,EAAE,CAAC;QACvB,iBAAiB,EAAE,SAAS;QAC5B,oBAAoB,EAAE,SAAS;KAChC,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,QAAQ,EAAE,MAAM,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,aAAa,CACjB,QAAQ,EACR,KAAK,YAAY,oBAAoB;gBACnC,CAAC,CAAC,aAAa,CAAC,sCAAsC,CAAC;gBACvD,CAAC,CAAC,KAAK,YAAY,wBAAwB;oBACzC,CAAC,CAAC,aAAa,CAAC,0BAA0B,EAAE,GAAG,CAAC;oBAChD,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CACvE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,aAAa,CAAC,kDAAkD,EAAE;YAC1E,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,aAAa,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAChE,OAAO;QACL,KAAK,CAAC,KAAK;YACT,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACrB,wBAAwB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAC5C,yBAAyB,CAAC,KAAK,CAAC,CAAC;YACjC,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,uBAAuB,EAAE,CAAC;gBACvD,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;YACD,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,wBAAwB,EAAE,CAAC;gBACxD,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;YACD,MAAM,KAAK,CAAC,eAAe,CAAC;YAC5B,MAAM,KAAK,CAAC,gBAAgB,CAAC;YAC7B,MAAM,KAAK,CAAC,gBAAgB,CAAC;YAC7B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QACD,QAAQ,EAAE;YACR,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO;YACP,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE;gBACT,eAAe,EAAE,GAAG,OAAO,4BAA4B;gBACvD,OAAO,EAAE,OAAO;aACjB;YACD,GAAG,EAAE;gBACH,kBAAkB,EAAE,KAAK,CAAC,QAAQ;aACnC;YACD,QAAQ,EAAE,UAAU;YACpB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,CAAC;SACX;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { createServer, type IncomingMessage } from \"node:http\";\nimport { randomBytes } from \"node:crypto\";\nimport path from \"node:path\";\nimport { CrablineError } from \"../core/errors.js\";\nimport {\n adminAuthError,\n closeServer,\n drainRequestBody,\n formatUrlHost,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isLoopbackHost,\n jsonResponse,\n queryRecord,\n readBody,\n RequestBodyTooLargeError,\n writeResponse,\n} from \"./http.js\";\nimport { recordServerEvent, type ServerEventObserver } from \"./recorder.js\";\nimport { resolveMaxPendingInboundEvents } from \"./pending-events.js\";\nimport {\n postWebhookRequest,\n validateWebhookTarget,\n type WebhookAddress,\n} from \"./webhook-target.js\";\n\nconst TELEGRAM_MAX_REQUEST_BODY_BYTES = 50 * 1024 * 1024;\nconst TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT = 5;\nconst TELEGRAM_WEBHOOK_RETRY_BASE_MS = 100;\nconst TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS = 3_000;\nconst MAX_ACTIVE_TELEGRAM_WEBHOOK_VALIDATIONS = 8;\nconst TELEGRAM_CHAT_USERNAME_PATTERN = /^@[A-Za-z][A-Za-z0-9_]{3,31}$/u;\nconst TELEGRAM_SEND_METHODS = new Set([\n \"sendanimation\",\n \"sendaudio\",\n \"senddocument\",\n \"sendmessage\",\n \"sendphoto\",\n \"sendvideo\",\n]);\nconst TELEGRAM_MEDIA_FIELDS = [\n \"animation\",\n \"audio\",\n \"document\",\n \"paid_media\",\n \"photo\",\n \"sticker\",\n \"story\",\n \"video\",\n \"video_note\",\n \"voice\",\n] as const;\nconst TELEGRAM_UNSUPPORTED_UPDATE_FIELDS = [\n \"business_connection\",\n \"business_message\",\n \"callback_query\",\n \"channel_post\",\n \"chat_boost\",\n \"chat_join_request\",\n \"chat_member\",\n \"chosen_inline_result\",\n \"deleted_business_messages\",\n \"edited_business_message\",\n \"edited_channel_post\",\n \"edited_message\",\n \"guest_message\",\n \"inline_query\",\n \"managed_bot\",\n \"message_reaction\",\n \"message_reaction_count\",\n \"my_chat_member\",\n \"poll\",\n \"poll_answer\",\n \"pre_checkout_query\",\n \"purchased_paid_media\",\n \"removed_chat_boost\",\n \"shipping_query\",\n] as const;\n\ntype TelegramServerEvent = {\n accepted?: boolean | undefined;\n at: string;\n body?: unknown;\n method: string;\n path: string;\n query: Record<string, string>;\n type: \"admin\" | \"api\";\n};\n\ntype TelegramWebhook = {\n lastErrorDate?: number;\n lastErrorMessage?: string;\n secretToken?: string;\n url: string;\n};\n\ntype TelegramServerState = {\n activeUpdatePoll: TelegramUpdatePoll | undefined;\n activeWebhookDeliveries: Set<AbortController>;\n activeWebhookValidations: Set<AbortController>;\n adminToken: string;\n allowLoopbackHttpWebhook: boolean;\n botId: number;\n botToken: string;\n botUsername: string;\n closing: boolean;\n inboundAdmission: Promise<void>;\n maxPendingInboundEvents: number;\n nextMessageId: number;\n nextUpdateId: number;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n restrictWebhookTargets: boolean;\n updates: TelegramUpdate[];\n webhook: TelegramWebhook | undefined;\n webhookAdmission: Promise<void>;\n webhookDelivery: Promise<Response | undefined> | undefined;\n webhookRetryAttempts: number;\n webhookRetryTimer: NodeJS.Timeout | undefined;\n webhookRetryUpdateId: number | undefined;\n};\n\ntype TelegramUpdatePoll = {\n finish(result: TelegramUpdatePollResult): void;\n};\n\ntype TelegramUpdatePollResult = \"conflict\" | \"shutdown\" | \"timeout\" | \"update\";\n\ntype TelegramGetUpdatesState = Pick<\n TelegramServerState,\n \"activeUpdatePoll\" | \"closing\" | \"updates\"\n>;\n\ntype TelegramMessage = {\n chat: {\n id: number | string;\n title?: string;\n type: \"group\" | \"private\" | \"supergroup\";\n };\n animation?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n height: number;\n mime_type?: string;\n width: number;\n };\n caption?: string;\n date: number;\n document?: {\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n mime_type?: string;\n };\n audio?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n mime_type?: string;\n };\n entities?: Array<{\n length: number;\n offset: number;\n type: string;\n }>;\n from: {\n first_name: string;\n id: number;\n is_bot: boolean;\n username?: string;\n };\n message_id: number;\n message_thread_id?: number;\n photo?: Array<{\n file_id: string;\n file_unique_id: string;\n height: number;\n width: number;\n }>;\n text?: string;\n video?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n height: number;\n mime_type?: string;\n width: number;\n };\n};\n\ntype TelegramUpdate = {\n message: TelegramMessage;\n update_id: number;\n};\n\nexport type TelegramServerManifest = {\n adminToken: string;\n baseUrl: string;\n botToken: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n };\n env: {\n TELEGRAM_BOT_TOKEN: string;\n };\n provider: \"telegram\";\n recorderPath: string;\n version: 1;\n};\n\nexport type StartedTelegramServer = {\n close(): Promise<void>;\n manifest: TelegramServerManifest;\n};\n\nexport type StartTelegramServerParams = {\n adminToken?: string | undefined;\n botId?: number | undefined;\n botToken?: string | undefined;\n botUsername?: string | undefined;\n host?: string | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n maxPendingInboundEvents?: number | undefined;\n};\n\nfunction telegramOk(result: unknown): Response {\n return jsonResponse({ ok: true, result });\n}\n\nfunction telegramError(description: string, status = 400): Response {\n return jsonResponse({ description, error_code: status, ok: false }, status);\n}\n\nasync function parseRequestBody(request: IncomingMessage): Promise<unknown> {\n const body = await readBody(request, TELEGRAM_MAX_REQUEST_BODY_BYTES);\n if (body.length === 0) {\n return {};\n }\n const contentType = request.headers[\"content-type\"] ?? \"\";\n const contentTypes = Array.isArray(contentType) ? contentType : [contentType];\n if (contentTypes.some((entry) => entry.toLowerCase().includes(\"json\"))) {\n try {\n return JSON.parse(body.toString(\"utf8\")) as unknown;\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n }\n const multipartType = contentTypes.find((entry) =>\n entry.toLowerCase().includes(\"multipart/form-data\"),\n );\n if (multipartType) {\n return await parseMultipartFormDataBody(body, multipartType);\n }\n const params = new URLSearchParams(body.toString(\"utf8\"));\n return Object.fromEntries(params.entries());\n}\n\nasync function parseMultipartFormDataBody(\n body: Buffer,\n contentType: string,\n): Promise<Record<string, unknown>> {\n let form: FormData;\n try {\n form = await new Request(\"http://localhost\", {\n body,\n headers: { \"content-type\": contentType },\n method: \"POST\",\n }).formData();\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n const fields: Record<string, unknown> = {};\n for (const [name, value] of form) {\n fields[name] = typeof value === \"string\" ? value : value.name;\n }\n return fields;\n}\n\nfunction requireTelegramBotPath(pathname: string): { method: string; token: string } | undefined {\n const match = /^\\/bot([^/]+)\\/([A-Za-z][A-Za-z0-9_]*)$/u.exec(pathname);\n if (!match?.[1] || !match[2]) {\n return undefined;\n }\n return { method: match[2], token: match[1] };\n}\n\nfunction toStringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0\n ? value\n : typeof value === \"number\" || typeof value === \"bigint\"\n ? value.toString()\n : undefined;\n}\n\nfunction toIntegerValue(value: unknown): number | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue || !/^-?\\d+$/u.test(stringValue)) {\n return undefined;\n }\n const integerValue = Number(stringValue);\n return Number.isSafeInteger(integerValue) ? integerValue : undefined;\n}\n\nfunction toBooleanValue(value: unknown): boolean {\n return value === true || (typeof value === \"string\" && value.toLowerCase() === \"true\");\n}\n\nfunction telegramChatId(value: unknown): number | string | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue) {\n return undefined;\n }\n if (/^-?\\d+$/u.test(stringValue)) {\n const integerValue = toIntegerValue(stringValue);\n return integerValue === 0 ? undefined : integerValue;\n }\n return TELEGRAM_CHAT_USERNAME_PATTERN.test(stringValue) ? stringValue : undefined;\n}\n\nasync function appendEvent(state: TelegramServerState, event: TelegramServerEvent) {\n await recordServerEvent({ event, onEvent: state.onEvent, recorderPath: state.recorderPath });\n}\n\nfunction redactTelegramSecrets<T>(body: Record<string, T>): Record<string, T | string> {\n return Object.fromEntries(\n Object.entries(body).map(([key, value]) => [\n key,\n key === \"secret_token\" ? \"<redacted>\" : value,\n ]),\n );\n}\n\nfunction createBotUser(state: TelegramServerState) {\n return {\n can_join_groups: true,\n can_read_all_group_messages: true,\n first_name: \"Crabline\",\n has_topics_enabled: true,\n id: state.botId,\n is_bot: true,\n supports_inline_queries: false,\n username: state.botUsername,\n };\n}\n\nfunction createChat(chatId: number | string): TelegramMessage[\"chat\"] {\n const type =\n typeof chatId === \"string\"\n ? \"supergroup\"\n : chatId >= 0\n ? \"private\"\n : String(chatId).startsWith(\"-100\")\n ? \"supergroup\"\n : \"group\";\n return {\n id: chatId,\n type,\n };\n}\n\nfunction createOutboundMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramMessage | undefined {\n const chatId = telegramChatId(body.chat_id);\n const text = toStringValue(body.text);\n if (chatId === undefined || !text) {\n return undefined;\n }\n const parsedThreadId = toIntegerValue(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n return {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n message_id: state.nextMessageId++,\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n text,\n };\n}\n\nfunction createOutboundMediaMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n mediaKind: \"animation\" | \"audio\" | \"document\" | \"photo\" | \"video\",\n): TelegramMessage | undefined {\n const chatId = telegramChatId(body.chat_id);\n const fileName = toStringValue(body[mediaKind]);\n if (chatId === undefined || !fileName) {\n return undefined;\n }\n const parsedThreadId = toIntegerValue(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n const caption = toStringValue(body.caption);\n const duration = Math.max(0, toIntegerValue(body.duration) ?? 0);\n const height = Math.max(1, toIntegerValue(body.height) ?? 1);\n const width = Math.max(1, toIntegerValue(body.width) ?? 1);\n const media = {\n file_id: `crabline-${mediaKind}-${state.nextMessageId}`,\n file_name: fileName,\n file_unique_id: `crabline-${mediaKind}-unique-${state.nextMessageId}`,\n };\n return {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n ...(caption ? { caption } : {}),\n [mediaKind]:\n mediaKind === \"photo\"\n ? [{ ...media, height: 1, width: 1 }]\n : {\n ...media,\n ...(mediaKind === \"audio\"\n ? { duration }\n : mediaKind === \"animation\" || mediaKind === \"video\"\n ? { duration, height, width }\n : {}),\n mime_type: \"application/octet-stream\",\n },\n message_id: state.nextMessageId++,\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n };\n}\n\nfunction createEditedMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramMessage | undefined {\n const chatId = telegramChatId(body.chat_id);\n const text = toStringValue(body.text);\n const messageId = toIntegerValue(body.message_id);\n if (chatId === undefined || !text || messageId === undefined) {\n return undefined;\n }\n const parsedThreadId = toIntegerValue(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n return {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n message_id: messageId,\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n text,\n };\n}\n\nfunction createInboundUpdate(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramUpdate | undefined {\n const chatId = telegramChatId(body.chatId ?? body.chat_id);\n const text = toStringValue(body.text);\n if (chatId === undefined || !text) {\n return undefined;\n }\n const fromIdValue = body.fromId ?? body.from_id;\n const threadIdValue = body.messageThreadId ?? body.message_thread_id;\n const messageIdValue = body.messageId ?? body.message_id;\n const updateIdValue = body.updateId ?? body.update_id;\n const fromId = toIntegerValue(fromIdValue);\n const parsedThreadId = toIntegerValue(threadIdValue);\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n const fromUsername = toStringValue(body.fromUsername ?? body.from_username);\n const messageId = toIntegerValue(messageIdValue);\n const updateId = toIntegerValue(updateIdValue);\n if (\n (fromIdValue !== undefined && fromId === undefined) ||\n (threadIdValue !== undefined && parsedThreadId === undefined) ||\n (messageIdValue !== undefined && messageId === undefined) ||\n (updateIdValue !== undefined && updateId === undefined)\n ) {\n return undefined;\n }\n const entities = parseTelegramEntities(body.entities, text);\n if (body.entities !== undefined && !entities) {\n return undefined;\n }\n return {\n message: {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: {\n first_name: toStringValue(body.fromName ?? body.from_name) ?? \"QA User\",\n id: fromId ?? 100001,\n is_bot: false,\n ...(fromUsername ? { username: fromUsername } : {}),\n },\n message_id: messageId ?? state.nextMessageId,\n ...(entities && entities.length > 0 ? { entities } : {}),\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n text,\n },\n update_id: updateId ?? state.nextUpdateId,\n };\n}\n\nfunction parseTelegramEntities(\n value: unknown,\n text: string,\n): Array<{ length: number; offset: number; type: string }> | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n return undefined;\n }\n const entities: Array<{ length: number; offset: number; type: string }> = [];\n for (const entry of value) {\n if (!isJsonObject(entry)) {\n return undefined;\n }\n const length = toIntegerValue(entry.length);\n const offset = toIntegerValue(entry.offset);\n const type = toStringValue(entry.type);\n if (\n length === undefined ||\n length < 1 ||\n offset === undefined ||\n offset < 0 ||\n offset + length > text.length ||\n !type\n ) {\n return undefined;\n }\n entities.push({ length, offset, type });\n }\n return entities;\n}\n\nfunction hasTelegramMedia(value: Record<string, unknown>): boolean {\n return TELEGRAM_MEDIA_FIELDS.some((field) => value[field] !== undefined);\n}\n\nfunction hasValidExplicitTelegramIdentities(body: Record<string, unknown>): boolean {\n return (\n [body.chatId, body.chat_id].every(\n (value) => value === undefined || telegramChatId(value) !== undefined,\n ) &&\n [\n body.fromId,\n body.from_id,\n body.messageId,\n body.message_id,\n body.messageThreadId,\n body.message_thread_id,\n body.updateId,\n body.update_id,\n ].every((value) => value === undefined || toIntegerValue(value) !== undefined)\n );\n}\n\nfunction isValidIgnoredTelegramUpdate(body: Record<string, unknown>): boolean {\n const updateIdValue = body.updateId ?? body.update_id;\n const updateId = toIntegerValue(updateIdValue);\n\n if (isJsonObject(body.message)) {\n const message = body.message;\n const chat = isJsonObject(message.chat) ? message.chat : undefined;\n if (\n updateId === undefined ||\n !chat ||\n telegramChatId(chat.id) === undefined ||\n toIntegerValue(message.message_id) === undefined ||\n (message.from !== undefined &&\n (!isJsonObject(message.from) || toIntegerValue(message.from.id) === undefined)) ||\n (message.message_thread_id !== undefined &&\n toIntegerValue(message.message_thread_id) === undefined)\n ) {\n return false;\n }\n return toStringValue(message.text) === undefined;\n }\n\n const chatId = telegramChatId(body.chatId ?? body.chat_id);\n if (\n chatId !== undefined &&\n hasValidExplicitTelegramIdentities(body) &&\n hasTelegramMedia(body) &&\n toStringValue(body.text) === undefined\n ) {\n return true;\n }\n\n return (\n updateId !== undefined &&\n TELEGRAM_UNSUPPORTED_UPDATE_FIELDS.some((field) => isJsonObject(body[field]))\n );\n}\n\nasync function handleTelegramAdminInbound(params: {\n body: Record<string, unknown>;\n request: IncomingMessage;\n state: TelegramServerState;\n url: URL;\n}): Promise<Response> {\n let releaseAdmission!: () => void;\n const previousAdmission = params.state.inboundAdmission;\n params.state.inboundAdmission = new Promise<void>((resolve) => {\n releaseAdmission = resolve;\n });\n await previousAdmission;\n try {\n const nextMessageId = params.state.nextMessageId;\n const nextUpdateId = params.state.nextUpdateId;\n const update = createInboundUpdate(params.state, params.body);\n params.state.nextMessageId = nextMessageId;\n params.state.nextUpdateId = nextUpdateId;\n if (!update) {\n if (isValidIgnoredTelegramUpdate(params.body)) {\n return jsonResponse({ ok: true });\n }\n return telegramError(\"Bad Request: chatId and text are required\");\n }\n if (params.state.updates.length >= params.state.maxPendingInboundEvents) {\n return telegramError(\n `Too Many Requests: pending inbound queue is full (${params.state.maxPendingInboundEvents} updates)`,\n 429,\n );\n }\n params.state.nextMessageId = Math.max(\n params.state.nextMessageId,\n update.message.message_id + 1,\n );\n params.state.nextUpdateId = Math.max(params.state.nextUpdateId, update.update_id + 1);\n const reservedNextMessageId = params.state.nextMessageId;\n const reservedNextUpdateId = params.state.nextUpdateId;\n try {\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body: params.body,\n method: params.request.method ?? \"POST\",\n path: params.url.pathname,\n query: queryRecord(params.url),\n type: \"admin\",\n });\n } catch (error) {\n if (params.state.nextMessageId === reservedNextMessageId) {\n params.state.nextMessageId = nextMessageId;\n }\n if (params.state.nextUpdateId === reservedNextUpdateId) {\n params.state.nextUpdateId = nextUpdateId;\n }\n throw error;\n }\n params.state.updates.push(update);\n params.state.updates.sort((left, right) => left.update_id - right.update_id);\n if (params.state.webhook) {\n scheduleTelegramWebhookDelivery(params.state, 0);\n return jsonResponse({ ok: true, update });\n }\n finishTelegramUpdatePoll(params.state, \"update\");\n return jsonResponse({ ok: true, update });\n } finally {\n releaseAdmission();\n }\n}\n\nasync function flushTelegramWebhookUpdates(\n state: TelegramServerState,\n onAttempt: (updateId: number) => void,\n): Promise<Response | undefined> {\n if (!state.webhook) {\n return undefined;\n }\n while (state.updates.length > 0 && state.webhook) {\n syncTelegramWebhookRetryHead(state);\n const webhook: TelegramWebhook = state.webhook;\n const update = state.updates[0]!;\n onAttempt(update.update_id);\n try {\n const delivery = await postTelegramWebhook(state, webhook, update);\n if (\"error\" in delivery) {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = delivery.error;\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n if (delivery.status < 200 || delivery.status >= 300) {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = `Wrong response from the webhook: ${delivery.status}`;\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n if (state.webhook !== webhook) {\n return undefined;\n }\n const deliveredIndex = state.updates.indexOf(update);\n if (deliveredIndex >= 0) {\n state.updates.splice(deliveredIndex, 1);\n }\n if (state.webhook === webhook) {\n state.webhookRetryAttempts = 0;\n }\n } catch {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = \"Webhook delivery failed\";\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n }\n return undefined;\n}\n\nasync function validateTelegramWebhookUrl(\n state: Pick<TelegramServerState, \"allowLoopbackHttpWebhook\" | \"restrictWebhookTargets\">,\n url: URL,\n deadlineAt: number,\n signal: AbortSignal,\n): Promise<Response | { addresses: WebhookAddress[] | undefined }> {\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n return telegramError(\"Bad Request: webhook host could not be resolved\");\n }\n const deadline = new AbortController();\n const timer = setTimeout(\n () => deadline.abort(new DOMException(\"Webhook delivery timed out\", \"TimeoutError\")),\n remainingMs,\n );\n timer.unref();\n let target;\n try {\n target = await validateWebhookTarget({\n allowLoopbackHttp: state.allowLoopbackHttpWebhook,\n restrictPrivateAddresses: state.restrictWebhookTargets,\n signal: AbortSignal.any([signal, deadline.signal]),\n url,\n });\n } catch {\n return telegramError(\"Bad Request: webhook host could not be resolved\");\n } finally {\n clearTimeout(timer);\n }\n if (!(\"error\" in target)) {\n return target;\n }\n return target.error === \"unresolvable\"\n ? telegramError(\"Bad Request: webhook host could not be resolved\")\n : target.error === \"private-address\"\n ? telegramError(\"Bad Request: webhook URL must not target a private or link-local address\")\n : telegramError(\"Bad Request: webhook URL must use HTTPS\");\n}\n\n/** @internal */\nexport async function withTelegramWebhookDeadline<T>(\n promise: Promise<T>,\n deadlineAt: number,\n signal: AbortSignal,\n): Promise<T> {\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Webhook delivery timed out\", \"TimeoutError\");\n }\n return await new Promise<T>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n callback();\n };\n const onAbort = () =>\n finish(() =>\n reject(\n signal.reason instanceof Error\n ? signal.reason\n : new DOMException(\"Webhook delivery aborted\", \"AbortError\"),\n ),\n );\n const timer = setTimeout(\n () => finish(() => reject(new DOMException(\"Webhook delivery timed out\", \"TimeoutError\"))),\n remainingMs,\n );\n timer.unref();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) {\n onAbort();\n return;\n }\n promise.then(\n (value) => finish(() => resolve(value)),\n (error: unknown) => finish(() => reject(error)),\n );\n });\n}\n\nasync function postTelegramWebhook(\n state: TelegramServerState,\n webhook: TelegramWebhook,\n update: TelegramUpdate,\n): Promise<{ error: string } | { status: number }> {\n const url = new URL(webhook.url);\n const deadlineAt = Date.now() + TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS;\n const controller = new AbortController();\n state.activeWebhookDeliveries.add(controller);\n try {\n const target = await validateTelegramWebhookUrl(state, url, deadlineAt, controller.signal);\n if (target instanceof Response) {\n return { error: \"Webhook target is no longer allowed\" };\n }\n const addresses: Array<WebhookAddress | undefined> =\n target.addresses && target.addresses.length > 0 ? target.addresses : [undefined];\n let lastError: unknown;\n for (const [index, address] of addresses.entries()) {\n if (state.closing) {\n throw new Error(\"Telegram server is shutting down.\");\n }\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Webhook delivery timed out\", \"TimeoutError\");\n }\n try {\n const attemptsRemaining = addresses.length - index;\n const status = await postWebhookRequest({\n address,\n body: JSON.stringify(update),\n headerEntries: webhook.secretToken\n ? [[\"x-telegram-bot-api-secret-token\", webhook.secretToken]]\n : undefined,\n signal: controller.signal,\n timeoutMs: Math.max(1, Math.floor(remainingMs / attemptsRemaining)),\n url,\n });\n return { status };\n } catch (error) {\n lastError = error;\n if (state.closing || controller.signal.aborted) {\n throw error;\n }\n }\n }\n throw lastError;\n } finally {\n state.activeWebhookDeliveries.delete(controller);\n }\n}\n\nasync function replaceTelegramWebhook(\n state: TelegramServerState,\n webhook: TelegramWebhook | undefined,\n dropPendingUpdates: boolean,\n): Promise<void> {\n let releaseAdmission!: () => void;\n const previousAdmission = state.webhookAdmission;\n state.webhookAdmission = new Promise<void>((resolve) => {\n releaseAdmission = resolve;\n });\n await previousAdmission;\n try {\n state.webhook = undefined;\n clearTelegramWebhookRetry(state, true);\n for (const controller of state.activeWebhookDeliveries) {\n controller.abort();\n }\n await state.webhookDelivery;\n if (dropPendingUpdates) {\n state.updates.length = 0;\n }\n state.webhook = webhook;\n if (webhook) {\n finishTelegramUpdatePoll(state, \"conflict\");\n scheduleTelegramWebhookDelivery(state, 0);\n }\n } finally {\n releaseAdmission();\n }\n}\n\nfunction clearTelegramWebhookRetry(state: TelegramServerState, resetAttempts = false): void {\n if (state.webhookRetryTimer) {\n clearTimeout(state.webhookRetryTimer);\n state.webhookRetryTimer = undefined;\n }\n if (resetAttempts) {\n state.webhookRetryAttempts = 0;\n state.webhookRetryUpdateId = undefined;\n }\n}\n\nfunction syncTelegramWebhookRetryHead(state: TelegramServerState): void {\n const updateId = state.updates[0]?.update_id;\n if (updateId === state.webhookRetryUpdateId) {\n return;\n }\n clearTelegramWebhookRetry(state);\n state.webhookRetryAttempts = 0;\n state.webhookRetryUpdateId = updateId;\n}\n\nfunction scheduleTelegramWebhookDelivery(state: TelegramServerState, delayMs: number): void {\n if (\n state.closing ||\n !state.webhook ||\n state.updates.length === 0 ||\n state.webhookDelivery ||\n state.webhookRetryTimer\n ) {\n return;\n }\n state.webhookRetryTimer = setTimeout(() => {\n state.webhookRetryTimer = undefined;\n void deliverTelegramWebhookUpdates(state, true);\n }, delayMs);\n state.webhookRetryTimer.unref();\n}\n\nasync function deliverTelegramWebhookUpdates(\n state: TelegramServerState,\n scheduledRetry = false,\n): Promise<Response | undefined> {\n if (state.webhookDelivery) {\n return await state.webhookDelivery;\n }\n syncTelegramWebhookRetryHead(state);\n if (!scheduledRetry && state.webhookRetryTimer) {\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n let attemptedUpdateId: number | undefined;\n const delivery = flushTelegramWebhookUpdates(state, (updateId) => {\n attemptedUpdateId = updateId;\n });\n state.webhookDelivery = delivery;\n let result: Response | undefined;\n try {\n result = await delivery;\n return result;\n } finally {\n if (state.webhookDelivery === delivery) {\n state.webhookDelivery = undefined;\n }\n if (state.webhook && state.updates.length > 0) {\n if (state.updates[0]?.update_id !== attemptedUpdateId) {\n syncTelegramWebhookRetryHead(state);\n scheduleTelegramWebhookDelivery(state, 0);\n } else if (result) {\n const delayMs =\n TELEGRAM_WEBHOOK_RETRY_BASE_MS *\n 2 ** Math.min(state.webhookRetryAttempts, TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT);\n state.webhookRetryAttempts = Math.min(\n state.webhookRetryAttempts + 1,\n TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT,\n );\n scheduleTelegramWebhookDelivery(state, delayMs);\n } else {\n state.webhookRetryAttempts = 0;\n scheduleTelegramWebhookDelivery(state, 0);\n }\n }\n }\n}\n\nasync function handleTelegramApi(params: {\n body: Record<string, unknown>;\n method: string;\n request: IncomingMessage;\n state: TelegramServerState;\n}) {\n const method = params.method.toLowerCase();\n switch (method) {\n case \"getme\":\n return telegramOk(createBotUser(params.state));\n case \"setmycommands\":\n case \"deletemycommands\":\n case \"sendchataction\":\n case \"answercallbackquery\":\n case \"deletemessage\":\n case \"pinchatmessage\":\n case \"unpinchatmessage\":\n case \"setmessagereaction\":\n case \"editforumtopic\":\n return telegramOk(true);\n case \"setwebhook\": {\n if (params.body.url === \"\") {\n await replaceTelegramWebhook(\n params.state,\n undefined,\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n }\n const webhookUrl = toStringValue(params.body.url);\n if (!webhookUrl) {\n return telegramError(\"Bad Request: url is required\");\n }\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(webhookUrl);\n } catch {\n return telegramError(\"Bad Request: bad webhook URL\");\n }\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n return telegramError(\"Bad Request: bad webhook URL\");\n }\n if (params.state.activeWebhookValidations.size >= MAX_ACTIVE_TELEGRAM_WEBHOOK_VALIDATIONS) {\n return telegramError(\"Too Many Requests: too many webhook validations\", 429);\n }\n const validation = new AbortController();\n params.state.activeWebhookValidations.add(validation);\n const target = await validateTelegramWebhookUrl(\n params.state,\n parsedUrl,\n Date.now() + TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS,\n validation.signal,\n ).finally(() => {\n params.state.activeWebhookValidations.delete(validation);\n });\n if (target instanceof Response) {\n return target;\n }\n const secretToken = toStringValue(params.body.secret_token);\n if (secretToken && !/^[A-Za-z0-9_-]{1,256}$/u.test(secretToken)) {\n return telegramError(\"Bad Request: invalid secret token\");\n }\n await replaceTelegramWebhook(\n params.state,\n {\n ...(secretToken ? { secretToken } : {}),\n url: parsedUrl.href,\n },\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n }\n case \"deletewebhook\":\n await replaceTelegramWebhook(\n params.state,\n undefined,\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n case \"getwebhookinfo\":\n return telegramOk({\n has_custom_certificate: false,\n ...(params.state.webhook?.lastErrorDate\n ? { last_error_date: params.state.webhook.lastErrorDate }\n : {}),\n ...(params.state.webhook?.lastErrorMessage\n ? { last_error_message: params.state.webhook.lastErrorMessage }\n : {}),\n pending_update_count: params.state.updates.length,\n url: params.state.webhook?.url ?? \"\",\n });\n case \"createforumtopic\":\n return telegramOk({\n icon_color: 0x6fb9f0,\n message_thread_id: params.state.nextMessageId++,\n name: toStringValue(params.body.name) ?? \"Crabline Topic\",\n });\n case \"editmessagetext\": {\n const message = createEditedMessage(params.state, params.body);\n return message\n ? telegramOk(message)\n : telegramError(\"Bad Request: chat_id, message_id, and text are required\");\n }\n case \"sendmessage\": {\n const message = createOutboundMessage(params.state, params.body);\n return message\n ? telegramOk(message)\n : telegramError(\"Bad Request: chat_id and text are required\");\n }\n case \"sendanimation\":\n case \"sendaudio\":\n case \"senddocument\":\n case \"sendphoto\":\n case \"sendvideo\": {\n const mediaKind = method.slice(\"send\".length) as\n | \"animation\"\n | \"audio\"\n | \"document\"\n | \"photo\"\n | \"video\";\n const message = createOutboundMediaMessage(params.state, params.body, mediaKind);\n return message\n ? telegramOk(message)\n : telegramError(`Bad Request: chat_id and ${mediaKind} are required`);\n }\n case \"getupdates\":\n if (params.state.webhook) {\n return telegramError(\"Conflict: can't use getUpdates method while webhook is active\", 409);\n }\n return await handleTelegramGetUpdates(params);\n default:\n return telegramError(`Not Found: unsupported method ${params.method}`, 404);\n }\n}\n\n/** @internal */\nexport async function handleTelegramGetUpdates(params: {\n body: Record<string, unknown>;\n request: IncomingMessage;\n state: TelegramGetUpdatesState;\n}): Promise<Response> {\n const offset = toIntegerValue(params.body.offset);\n const limit = toIntegerValue(params.body.limit) ?? 100;\n const timeout = toIntegerValue(params.body.timeout) ?? 0;\n if (params.body.offset !== undefined && offset === undefined) {\n return telegramError(\"Bad Request: offset must be a safe integer\");\n }\n if (params.body.limit !== undefined && toIntegerValue(params.body.limit) === undefined) {\n return telegramError(\"Bad Request: limit must be a safe integer\");\n }\n if (params.body.timeout !== undefined && toIntegerValue(params.body.timeout) === undefined) {\n return telegramError(\"Bad Request: timeout must be a safe integer\");\n }\n if (limit < 1 || limit > 100) {\n return telegramError(\"Bad Request: limit must be between 1 and 100\");\n }\n if (timeout < 0) {\n return telegramError(\"Bad Request: timeout must be non-negative\");\n }\n\n finishTelegramUpdatePoll(params.state, \"conflict\");\n let updates = takeTelegramUpdates(params.state, offset, limit);\n const deadline = Date.now() + Math.min(timeout * 1_000, 2_147_483_647);\n if (updates.length === 0 && timeout > 0) {\n while (updates.length === 0) {\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n break;\n }\n const pollResult = await waitForTelegramUpdate(\n params.state,\n params.request,\n remainingMs,\n () => hasTelegramUpdates(params.state, offset),\n );\n if (pollResult === \"conflict\") {\n return telegramError(\n \"Conflict: terminated by other getUpdates request; make sure that only one bot instance is running\",\n 409,\n );\n }\n if (pollResult !== \"update\") {\n break;\n }\n updates = takeTelegramUpdates(params.state, offset, limit);\n }\n }\n return telegramOk(updates);\n}\n\nfunction takeTelegramUpdates(\n state: TelegramGetUpdatesState,\n offset: number | undefined,\n limit: number,\n): TelegramUpdate[] {\n if (offset !== undefined && offset < 0) {\n const retainedCount = Math.min(Math.abs(offset), state.updates.length);\n state.updates.splice(0, state.updates.length - retainedCount);\n } else if (offset !== undefined) {\n const firstUnconfirmed = state.updates.findIndex((update) => update.update_id >= offset);\n if (firstUnconfirmed === -1) {\n state.updates.length = 0;\n } else if (firstUnconfirmed > 0) {\n state.updates.splice(0, firstUnconfirmed);\n }\n }\n return state.updates.slice(0, limit);\n}\n\nfunction hasTelegramUpdates(state: TelegramGetUpdatesState, offset: number | undefined): boolean {\n if (offset === undefined || offset < 0) {\n return state.updates.length > 0;\n }\n return state.updates.some((update) => update.update_id >= offset);\n}\n\nfunction finishTelegramUpdatePoll(\n state: TelegramGetUpdatesState,\n result: TelegramUpdatePollResult,\n): void {\n state.activeUpdatePoll?.finish(result);\n}\n\nasync function waitForTelegramUpdate(\n state: TelegramGetUpdatesState,\n request: IncomingMessage,\n timeoutMs: number,\n hasUpdate: () => boolean,\n): Promise<TelegramUpdatePollResult> {\n if (state.closing || request.socket.destroyed) {\n return \"shutdown\";\n }\n return await new Promise<TelegramUpdatePollResult>((resolve) => {\n let settled = false;\n const poll: TelegramUpdatePoll = {\n finish(result) {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n request.socket.off(\"close\", onSocketClose);\n if (state.activeUpdatePoll === poll) {\n state.activeUpdatePoll = undefined;\n }\n resolve(result);\n },\n };\n const onSocketClose = () => poll.finish(\"shutdown\");\n const timer = setTimeout(() => poll.finish(\"timeout\"), timeoutMs);\n timer.unref();\n const previousPoll = state.activeUpdatePoll;\n state.activeUpdatePoll = poll;\n previousPoll?.finish(\"conflict\");\n request.socket.once(\"close\", onSocketClose);\n if (state.closing || request.socket.destroyed) {\n poll.finish(\"shutdown\");\n } else if (hasUpdate()) {\n poll.finish(\"update\");\n }\n });\n}\n\nfunction telegramMethodNotAllowed(): Response {\n const response = telegramError(\"Method Not Allowed\", 405);\n response.headers.set(\"allow\", \"GET, POST\");\n return response;\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: TelegramServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname === \"/crabline/telegram/inbound\") {\n if (params.request.method !== \"POST\") {\n return new Response(\"not found\", { status: 404 });\n }\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n drainRequestBody(params.request);\n return adminAuthError();\n }\n const body = await parseRequestBody(params.request);\n if (!isJsonObject(body)) {\n return telegramError(\"Bad Request: request body must be a JSON object\");\n }\n return await handleTelegramAdminInbound({\n body,\n request: params.request,\n state: params.state,\n url,\n });\n }\n\n const botPath = requireTelegramBotPath(url.pathname);\n if (!botPath || botPath.token !== params.state.botToken) {\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n }\n const requestMethod = params.request.method ?? \"GET\";\n if (requestMethod !== \"GET\" && requestMethod !== \"POST\") {\n drainRequestBody(params.request);\n return telegramMethodNotAllowed();\n }\n const body = requestMethod === \"GET\" ? queryRecord(url) : await parseRequestBody(params.request);\n if (!isJsonObject(body)) {\n return telegramError(\"Bad Request: can't parse JSON object\");\n }\n const event: TelegramServerEvent = {\n at: new Date().toISOString(),\n body: redactTelegramSecrets(body),\n method: requestMethod,\n path: `/bot<redacted>/${botPath.method}`,\n query: redactTelegramSecrets(queryRecord(url)),\n type: \"api\",\n };\n if (TELEGRAM_SEND_METHODS.has(botPath.method.toLowerCase())) {\n const response = await handleTelegramApi({\n body,\n method: botPath.method,\n request: params.request,\n state: params.state,\n });\n event.accepted = response.ok;\n try {\n await appendEvent(params.state, event);\n } catch (error) {\n if (!event.accepted) {\n throw error;\n }\n }\n return response;\n }\n await appendEvent(params.state, event);\n return await handleTelegramApi({\n body,\n method: botPath.method,\n request: params.request,\n state: params.state,\n });\n}\n\nexport async function startTelegramServer(\n params: StartTelegramServerParams = {},\n): Promise<StartedTelegramServer> {\n const host = params.host ?? \"127.0.0.1\";\n const botId = params.botId ?? 424242;\n if (!Number.isSafeInteger(botId) || botId < 1) {\n throw new Error(\"botId must be a positive safe integer.\");\n }\n const state: TelegramServerState = {\n activeUpdatePoll: undefined,\n activeWebhookDeliveries: new Set(),\n activeWebhookValidations: new Set(),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"hex\"),\n allowLoopbackHttpWebhook: isLoopbackHost(host),\n botId,\n botToken:\n params.botToken ??\n (isLoopbackHost(host)\n ? \"424242:crabline-telegram-token\"\n : `${botId}:${randomBytes(26).toString(\"base64url\")}`),\n botUsername: params.botUsername ?? \"crabline_bot\",\n inboundAdmission: Promise.resolve(),\n maxPendingInboundEvents: resolveMaxPendingInboundEvents(params.maxPendingInboundEvents),\n nextMessageId: 1,\n nextUpdateId: 1,\n onEvent: params.onEvent,\n recorderPath: params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"telegram.jsonl\"),\n restrictWebhookTargets: true,\n closing: false,\n updates: [],\n webhook: undefined,\n webhookAdmission: Promise.resolve(),\n webhookDelivery: undefined,\n webhookRetryAttempts: 0,\n webhookRetryTimer: undefined,\n webhookRetryUpdateId: undefined,\n };\n const port = params.port ?? 0;\n const server = createServer(async (request, response) => {\n try {\n await writeResponse(response, await handleRequest({ request, state }));\n } catch (error) {\n await writeResponse(\n response,\n error instanceof InvalidJsonBodyError\n ? telegramError(\"Bad Request: can't parse JSON object\")\n : error instanceof RequestBodyTooLargeError\n ? telegramError(\"Request Entity Too Large\", 413)\n : jsonResponse({ error: \"internal server error\", ok: false }, 500),\n );\n }\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address();\n if (!address || typeof address === \"string\") {\n throw new CrablineError(\"Unable to resolve Telegram local server address.\", {\n kind: \"connectivity\",\n });\n }\n const baseUrl = `http://${formatUrlHost(host)}:${address.port}`;\n return {\n async close() {\n state.closing = true;\n finishTelegramUpdatePoll(state, \"shutdown\");\n clearTelegramWebhookRetry(state);\n for (const controller of state.activeWebhookDeliveries) {\n controller.abort();\n }\n for (const controller of state.activeWebhookValidations) {\n controller.abort();\n }\n await state.webhookDelivery;\n await state.webhookAdmission;\n await state.inboundAdmission;\n await closeServer(server);\n },\n manifest: {\n adminToken: state.adminToken,\n baseUrl,\n botToken: state.botToken,\n endpoints: {\n adminInboundUrl: `${baseUrl}/crabline/telegram/inbound`,\n apiRoot: baseUrl,\n },\n env: {\n TELEGRAM_BOT_TOKEN: state.botToken,\n },\n provider: \"telegram\",\n recorderPath: state.recorderPath,\n version: 1,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/servers/telegram.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { randomBytes } from \"node:crypto\";\nimport path from \"node:path\";\nimport { CrablineError } from \"../core/errors.js\";\nimport {\n adminAuthError,\n closeServer,\n drainRequestBody,\n formatUrlHost,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isLoopbackHost,\n jsonResponse,\n queryRecord,\n readBody,\n RequestBodyTooLargeError,\n writeResponse,\n} from \"./http.js\";\nimport { recordServerEvent, type ServerEventObserver } from \"./recorder.js\";\nimport { resolveMaxPendingInboundEvents } from \"./pending-events.js\";\nimport {\n postWebhookRequest,\n validateWebhookTarget,\n type WebhookAddress,\n} from \"./webhook-target.js\";\n\nconst TELEGRAM_MAX_REQUEST_BODY_BYTES = 50 * 1024 * 1024;\nconst TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT = 5;\nconst TELEGRAM_WEBHOOK_RETRY_BASE_MS = 100;\nconst TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS = 3_000;\nconst MAX_ACTIVE_TELEGRAM_WEBHOOK_VALIDATIONS = 8;\nconst TELEGRAM_CHAT_USERNAME_PATTERN = /^@[A-Za-z][A-Za-z0-9_]{3,31}$/u;\nconst TELEGRAM_SEND_METHODS = new Set([\n \"sendanimation\",\n \"sendaudio\",\n \"senddocument\",\n \"sendmessage\",\n \"sendphoto\",\n \"sendvideo\",\n]);\nconst TELEGRAM_MEDIA_FIELDS = [\n \"animation\",\n \"audio\",\n \"document\",\n \"paid_media\",\n \"photo\",\n \"sticker\",\n \"story\",\n \"video\",\n \"video_note\",\n \"voice\",\n] as const;\nconst TELEGRAM_UNSUPPORTED_UPDATE_FIELDS = [\n \"business_connection\",\n \"business_message\",\n \"callback_query\",\n \"channel_post\",\n \"chat_boost\",\n \"chat_join_request\",\n \"chat_member\",\n \"chosen_inline_result\",\n \"deleted_business_messages\",\n \"edited_business_message\",\n \"edited_channel_post\",\n \"edited_message\",\n \"guest_message\",\n \"inline_query\",\n \"managed_bot\",\n \"message_reaction\",\n \"message_reaction_count\",\n \"my_chat_member\",\n \"poll\",\n \"poll_answer\",\n \"pre_checkout_query\",\n \"purchased_paid_media\",\n \"removed_chat_boost\",\n \"shipping_query\",\n] as const;\n\ntype TelegramServerEvent = {\n accepted?: boolean | undefined;\n at: string;\n body?: unknown;\n method: string;\n path: string;\n query: Record<string, string>;\n type: \"admin\" | \"api\";\n};\n\ntype TelegramWebhook = {\n lastErrorDate?: number;\n lastErrorMessage?: string;\n secretToken?: string;\n url: string;\n};\n\ntype TelegramServerState = {\n activeUpdatePoll: TelegramUpdatePoll | undefined;\n activeWebhookDeliveries: Set<AbortController>;\n activeWebhookValidations: Set<AbortController>;\n adminToken: string;\n allowLoopbackHttpWebhook: boolean;\n botId: number;\n botToken: string;\n botUsername: string;\n closing: boolean;\n inboundAdmission: Promise<void>;\n maxPendingInboundEvents: number;\n nextMessageId: number;\n nextUpdateId: number;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n restrictWebhookTargets: boolean;\n updates: TelegramUpdate[];\n webhook: TelegramWebhook | undefined;\n webhookAdmission: Promise<void>;\n webhookDelivery: Promise<Response | undefined> | undefined;\n webhookRetryAttempts: number;\n webhookRetryTimer: NodeJS.Timeout | undefined;\n webhookRetryUpdateId: number | undefined;\n};\n\ntype TelegramUpdatePoll = {\n finish(result: TelegramUpdatePollResult): void;\n};\n\ntype TelegramUpdatePollResult = \"conflict\" | \"shutdown\" | \"timeout\" | \"update\";\n\ntype TelegramGetUpdatesState = Pick<\n TelegramServerState,\n \"activeUpdatePoll\" | \"closing\" | \"updates\"\n>;\n\ntype TelegramMessage = {\n chat: {\n id: number | string;\n title?: string;\n type: \"group\" | \"private\" | \"supergroup\";\n };\n animation?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n height: number;\n mime_type?: string;\n width: number;\n };\n caption?: string;\n date: number;\n document?: {\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n mime_type?: string;\n };\n audio?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n mime_type?: string;\n };\n entities?: Array<{\n length: number;\n offset: number;\n type: string;\n }>;\n from: {\n first_name: string;\n id: number;\n is_bot: boolean;\n username?: string;\n };\n message_id: number;\n message_thread_id?: number;\n photo?: Array<{\n file_id: string;\n file_unique_id: string;\n height: number;\n width: number;\n }>;\n text?: string;\n video?: {\n duration: number;\n file_id: string;\n file_name?: string;\n file_unique_id: string;\n height: number;\n mime_type?: string;\n width: number;\n };\n};\n\ntype TelegramUpdate = {\n message: TelegramMessage;\n update_id: number;\n};\n\nexport type TelegramServerManifest = {\n adminToken: string;\n baseUrl: string;\n botToken: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n };\n env: {\n TELEGRAM_BOT_TOKEN: string;\n };\n provider: \"telegram\";\n recorderPath: string;\n version: 1;\n};\n\nexport type StartedTelegramServer = {\n close(): Promise<void>;\n manifest: TelegramServerManifest;\n};\n\nexport type StartTelegramServerParams = {\n adminToken?: string | undefined;\n botId?: number | undefined;\n botToken?: string | undefined;\n botUsername?: string | undefined;\n host?: string | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n maxPendingInboundEvents?: number | undefined;\n};\n\nfunction telegramOk(result: unknown): Response {\n return jsonResponse({ ok: true, result });\n}\n\nfunction telegramError(description: string, status = 400): Response {\n return jsonResponse({ description, error_code: status, ok: false }, status);\n}\n\nasync function parseRequestBody(request: IncomingMessage): Promise<unknown> {\n const body = await readBody(request, TELEGRAM_MAX_REQUEST_BODY_BYTES);\n if (body.length === 0) {\n return {};\n }\n const contentType = request.headers[\"content-type\"] ?? \"\";\n const contentTypes = Array.isArray(contentType) ? contentType : [contentType];\n if (contentTypes.some((entry) => entry.toLowerCase().includes(\"json\"))) {\n try {\n return JSON.parse(body.toString(\"utf8\")) as unknown;\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n }\n const multipartType = contentTypes.find((entry) =>\n entry.toLowerCase().includes(\"multipart/form-data\"),\n );\n if (multipartType) {\n return await parseMultipartFormDataBody(body, multipartType);\n }\n const params = new URLSearchParams(body.toString(\"utf8\"));\n return Object.fromEntries(params.entries());\n}\n\nasync function parseMultipartFormDataBody(\n body: Buffer,\n contentType: string,\n): Promise<Record<string, unknown>> {\n let form: FormData;\n try {\n form = await new Request(\"http://localhost\", {\n body,\n headers: { \"content-type\": contentType },\n method: \"POST\",\n }).formData();\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n const fields: Record<string, unknown> = {};\n for (const [name, value] of form) {\n fields[name] = typeof value === \"string\" ? value : value.name;\n }\n return fields;\n}\n\nfunction requireTelegramBotPath(pathname: string): { method: string; token: string } | undefined {\n const match = /^\\/bot([^/]+)\\/([A-Za-z][A-Za-z0-9_]*)$/u.exec(pathname);\n if (!match?.[1] || !match[2]) {\n return undefined;\n }\n return { method: match[2], token: match[1] };\n}\n\nfunction toStringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0\n ? value\n : typeof value === \"number\" || typeof value === \"bigint\"\n ? value.toString()\n : undefined;\n}\n\nfunction toIntegerValue(value: unknown): number | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue || !/^-?\\d+$/u.test(stringValue)) {\n return undefined;\n }\n const integerValue = Number(stringValue);\n return Number.isSafeInteger(integerValue) ? integerValue : undefined;\n}\n\nfunction toBooleanValue(value: unknown): boolean {\n return value === true || (typeof value === \"string\" && value.toLowerCase() === \"true\");\n}\n\nfunction telegramChatId(value: unknown): number | string | undefined {\n const stringValue = toStringValue(value);\n if (!stringValue) {\n return undefined;\n }\n if (/^-?\\d+$/u.test(stringValue)) {\n const integerValue = toIntegerValue(stringValue);\n return integerValue === 0 ? undefined : integerValue;\n }\n return TELEGRAM_CHAT_USERNAME_PATTERN.test(stringValue) ? stringValue : undefined;\n}\n\nasync function appendEvent(state: TelegramServerState, event: TelegramServerEvent) {\n await recordServerEvent({ event, onEvent: state.onEvent, recorderPath: state.recorderPath });\n}\n\nfunction redactTelegramSecrets<T>(body: Record<string, T>): Record<string, T | string> {\n return Object.fromEntries(\n Object.entries(body).map(([key, value]) => [\n key,\n key === \"secret_token\" ? \"<redacted>\" : value,\n ]),\n );\n}\n\nfunction createBotUser(state: TelegramServerState) {\n return {\n can_join_groups: true,\n can_read_all_group_messages: true,\n first_name: \"Crabline\",\n has_topics_enabled: true,\n id: state.botId,\n is_bot: true,\n supports_inline_queries: false,\n username: state.botUsername,\n };\n}\n\nfunction createChat(chatId: number | string): TelegramMessage[\"chat\"] {\n const type =\n typeof chatId === \"string\"\n ? \"supergroup\"\n : chatId >= 0\n ? \"private\"\n : String(chatId).startsWith(\"-100\")\n ? \"supergroup\"\n : \"group\";\n return {\n id: chatId,\n type,\n };\n}\n\nfunction createOutboundMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramMessage | undefined {\n const chatId = telegramChatId(body.chat_id);\n const text = toStringValue(body.text);\n if (chatId === undefined || !text) {\n return undefined;\n }\n const parsedThreadId = toIntegerValue(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n return {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n message_id: state.nextMessageId++,\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n text,\n };\n}\n\nfunction createOutboundMediaMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n mediaKind: \"animation\" | \"audio\" | \"document\" | \"photo\" | \"video\",\n): TelegramMessage | undefined {\n const chatId = telegramChatId(body.chat_id);\n const fileName = toStringValue(body[mediaKind]);\n if (chatId === undefined || !fileName) {\n return undefined;\n }\n const parsedThreadId = toIntegerValue(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n const caption = toStringValue(body.caption);\n const duration = Math.max(0, toIntegerValue(body.duration) ?? 0);\n const height = Math.max(1, toIntegerValue(body.height) ?? 1);\n const width = Math.max(1, toIntegerValue(body.width) ?? 1);\n const media = {\n file_id: `crabline-${mediaKind}-${state.nextMessageId}`,\n file_name: fileName,\n file_unique_id: `crabline-${mediaKind}-unique-${state.nextMessageId}`,\n };\n return {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n ...(caption ? { caption } : {}),\n [mediaKind]:\n mediaKind === \"photo\"\n ? [{ ...media, height: 1, width: 1 }]\n : {\n ...media,\n ...(mediaKind === \"audio\"\n ? { duration }\n : mediaKind === \"animation\" || mediaKind === \"video\"\n ? { duration, height, width }\n : {}),\n mime_type: \"application/octet-stream\",\n },\n message_id: state.nextMessageId++,\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n };\n}\n\nfunction createEditedMessage(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramMessage | undefined {\n const chatId = telegramChatId(body.chat_id);\n const text = toStringValue(body.text);\n const messageId = toIntegerValue(body.message_id);\n if (chatId === undefined || !text || messageId === undefined) {\n return undefined;\n }\n const parsedThreadId = toIntegerValue(body.message_thread_id);\n if (body.message_thread_id !== undefined && parsedThreadId === undefined) {\n return undefined;\n }\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n return {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: createBotUser(state),\n message_id: messageId,\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n text,\n };\n}\n\nfunction createInboundUpdate(\n state: TelegramServerState,\n body: Record<string, unknown>,\n): TelegramUpdate | undefined {\n const chatId = telegramChatId(body.chatId ?? body.chat_id);\n const text = toStringValue(body.text);\n if (chatId === undefined || !text) {\n return undefined;\n }\n const fromIdValue = body.fromId ?? body.from_id;\n const threadIdValue = body.messageThreadId ?? body.message_thread_id;\n const messageIdValue = body.messageId ?? body.message_id;\n const updateIdValue = body.updateId ?? body.update_id;\n const fromId = toIntegerValue(fromIdValue);\n const parsedThreadId = toIntegerValue(threadIdValue);\n const threadId = parsedThreadId !== undefined && parsedThreadId > 0 ? parsedThreadId : undefined;\n const fromUsername = toStringValue(body.fromUsername ?? body.from_username);\n const messageId = toIntegerValue(messageIdValue);\n const updateId = toIntegerValue(updateIdValue);\n if (\n (fromIdValue !== undefined && fromId === undefined) ||\n (threadIdValue !== undefined && parsedThreadId === undefined) ||\n (messageIdValue !== undefined && messageId === undefined) ||\n (updateIdValue !== undefined && updateId === undefined)\n ) {\n return undefined;\n }\n const entities = parseTelegramEntities(body.entities, text);\n if (body.entities !== undefined && !entities) {\n return undefined;\n }\n return {\n message: {\n chat: createChat(chatId),\n date: Math.floor(Date.now() / 1000),\n from: {\n first_name: toStringValue(body.fromName ?? body.from_name) ?? \"QA User\",\n id: fromId ?? 100001,\n is_bot: false,\n ...(fromUsername ? { username: fromUsername } : {}),\n },\n message_id: messageId ?? state.nextMessageId,\n ...(entities && entities.length > 0 ? { entities } : {}),\n ...(threadId !== undefined ? { message_thread_id: threadId } : {}),\n text,\n },\n update_id: updateId ?? state.nextUpdateId,\n };\n}\n\nfunction parseTelegramEntities(\n value: unknown,\n text: string,\n): Array<{ length: number; offset: number; type: string }> | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n return undefined;\n }\n const entities: Array<{ length: number; offset: number; type: string }> = [];\n for (const entry of value) {\n if (!isJsonObject(entry)) {\n return undefined;\n }\n const length = toIntegerValue(entry.length);\n const offset = toIntegerValue(entry.offset);\n const type = toStringValue(entry.type);\n if (\n length === undefined ||\n length < 1 ||\n offset === undefined ||\n offset < 0 ||\n offset + length > text.length ||\n !type\n ) {\n return undefined;\n }\n entities.push({ length, offset, type });\n }\n return entities;\n}\n\nfunction hasTelegramMedia(value: Record<string, unknown>): boolean {\n return TELEGRAM_MEDIA_FIELDS.some((field) => value[field] !== undefined);\n}\n\nfunction hasValidExplicitTelegramIdentities(body: Record<string, unknown>): boolean {\n return (\n [body.chatId, body.chat_id].every(\n (value) => value === undefined || telegramChatId(value) !== undefined,\n ) &&\n [\n body.fromId,\n body.from_id,\n body.messageId,\n body.message_id,\n body.messageThreadId,\n body.message_thread_id,\n body.updateId,\n body.update_id,\n ].every((value) => value === undefined || toIntegerValue(value) !== undefined)\n );\n}\n\nfunction isValidIgnoredTelegramUpdate(body: Record<string, unknown>): boolean {\n const updateIdValue = body.updateId ?? body.update_id;\n const updateId = toIntegerValue(updateIdValue);\n\n if (isJsonObject(body.message)) {\n const message = body.message;\n const chat = isJsonObject(message.chat) ? message.chat : undefined;\n if (\n updateId === undefined ||\n !chat ||\n telegramChatId(chat.id) === undefined ||\n toIntegerValue(message.message_id) === undefined ||\n (message.from !== undefined &&\n (!isJsonObject(message.from) || toIntegerValue(message.from.id) === undefined)) ||\n (message.message_thread_id !== undefined &&\n toIntegerValue(message.message_thread_id) === undefined)\n ) {\n return false;\n }\n return toStringValue(message.text) === undefined;\n }\n\n const chatId = telegramChatId(body.chatId ?? body.chat_id);\n if (\n chatId !== undefined &&\n hasValidExplicitTelegramIdentities(body) &&\n hasTelegramMedia(body) &&\n toStringValue(body.text) === undefined\n ) {\n return true;\n }\n\n return (\n updateId !== undefined &&\n TELEGRAM_UNSUPPORTED_UPDATE_FIELDS.some((field) => isJsonObject(body[field]))\n );\n}\n\nasync function handleTelegramAdminInbound(params: {\n body: Record<string, unknown>;\n request: IncomingMessage;\n state: TelegramServerState;\n url: URL;\n}): Promise<Response> {\n let releaseAdmission!: () => void;\n const previousAdmission = params.state.inboundAdmission;\n params.state.inboundAdmission = new Promise<void>((resolve) => {\n releaseAdmission = resolve;\n });\n await previousAdmission;\n try {\n const nextMessageId = params.state.nextMessageId;\n const nextUpdateId = params.state.nextUpdateId;\n const update = createInboundUpdate(params.state, params.body);\n params.state.nextMessageId = nextMessageId;\n params.state.nextUpdateId = nextUpdateId;\n if (!update) {\n if (isValidIgnoredTelegramUpdate(params.body)) {\n return jsonResponse({ ok: true });\n }\n return telegramError(\"Bad Request: chatId and text are required\");\n }\n if (params.state.updates.length >= params.state.maxPendingInboundEvents) {\n return telegramError(\n `Too Many Requests: pending inbound queue is full (${params.state.maxPendingInboundEvents} updates)`,\n 429,\n );\n }\n params.state.nextMessageId = Math.max(\n params.state.nextMessageId,\n update.message.message_id + 1,\n );\n params.state.nextUpdateId = Math.max(params.state.nextUpdateId, update.update_id + 1);\n const reservedNextMessageId = params.state.nextMessageId;\n const reservedNextUpdateId = params.state.nextUpdateId;\n try {\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body: params.body,\n method: params.request.method ?? \"POST\",\n path: params.url.pathname,\n query: queryRecord(params.url),\n type: \"admin\",\n });\n } catch (error) {\n if (params.state.nextMessageId === reservedNextMessageId) {\n params.state.nextMessageId = nextMessageId;\n }\n if (params.state.nextUpdateId === reservedNextUpdateId) {\n params.state.nextUpdateId = nextUpdateId;\n }\n throw error;\n }\n params.state.updates.push(update);\n params.state.updates.sort((left, right) => left.update_id - right.update_id);\n if (params.state.webhook) {\n scheduleTelegramWebhookDelivery(params.state, 0);\n return jsonResponse({ ok: true, update });\n }\n finishTelegramUpdatePoll(params.state, \"update\");\n return jsonResponse({ ok: true, update });\n } finally {\n releaseAdmission();\n }\n}\n\nasync function flushTelegramWebhookUpdates(\n state: TelegramServerState,\n onAttempt: (updateId: number) => void,\n): Promise<Response | undefined> {\n if (!state.webhook) {\n return undefined;\n }\n while (state.updates.length > 0 && state.webhook) {\n syncTelegramWebhookRetryHead(state);\n const webhook: TelegramWebhook = state.webhook;\n const update = state.updates[0]!;\n onAttempt(update.update_id);\n try {\n const delivery = await postTelegramWebhook(state, webhook, update);\n if (\"error\" in delivery) {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = delivery.error;\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n if (delivery.status < 200 || delivery.status >= 300) {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = `Wrong response from the webhook: ${delivery.status}`;\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n if (state.webhook !== webhook) {\n return undefined;\n }\n const deliveredIndex = state.updates.indexOf(update);\n if (deliveredIndex >= 0) {\n state.updates.splice(deliveredIndex, 1);\n }\n if (state.webhook === webhook) {\n state.webhookRetryAttempts = 0;\n }\n } catch {\n if (state.webhook === webhook) {\n webhook.lastErrorDate = Math.floor(Date.now() / 1_000);\n webhook.lastErrorMessage = \"Webhook delivery failed\";\n }\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n }\n return undefined;\n}\n\nasync function validateTelegramWebhookUrl(\n state: Pick<TelegramServerState, \"allowLoopbackHttpWebhook\" | \"restrictWebhookTargets\">,\n url: URL,\n deadlineAt: number,\n signal: AbortSignal,\n): Promise<Response | { addresses: WebhookAddress[] | undefined }> {\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n return telegramError(\"Bad Request: webhook host could not be resolved\");\n }\n const deadline = new AbortController();\n const timer = setTimeout(\n () => deadline.abort(new DOMException(\"Webhook delivery timed out\", \"TimeoutError\")),\n remainingMs,\n );\n timer.unref();\n let target;\n try {\n target = await validateWebhookTarget({\n allowLoopbackHttp: state.allowLoopbackHttpWebhook,\n restrictPrivateAddresses: state.restrictWebhookTargets,\n signal: AbortSignal.any([signal, deadline.signal]),\n url,\n });\n } catch {\n return telegramError(\"Bad Request: webhook host could not be resolved\");\n } finally {\n clearTimeout(timer);\n }\n if (!(\"error\" in target)) {\n return target;\n }\n return target.error === \"unresolvable\"\n ? telegramError(\"Bad Request: webhook host could not be resolved\")\n : target.error === \"private-address\"\n ? telegramError(\"Bad Request: webhook URL must not target a private or link-local address\")\n : telegramError(\"Bad Request: webhook URL must use HTTPS\");\n}\n\n/** @internal */\nexport async function withTelegramWebhookDeadline<T>(\n promise: Promise<T>,\n deadlineAt: number,\n signal: AbortSignal,\n): Promise<T> {\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Webhook delivery timed out\", \"TimeoutError\");\n }\n return await new Promise<T>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n callback();\n };\n const onAbort = () =>\n finish(() =>\n reject(\n signal.reason instanceof Error\n ? signal.reason\n : new DOMException(\"Webhook delivery aborted\", \"AbortError\"),\n ),\n );\n const timer = setTimeout(\n () => finish(() => reject(new DOMException(\"Webhook delivery timed out\", \"TimeoutError\"))),\n remainingMs,\n );\n timer.unref();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) {\n onAbort();\n return;\n }\n promise.then(\n (value) => finish(() => resolve(value)),\n (error: unknown) => finish(() => reject(error)),\n );\n });\n}\n\nasync function postTelegramWebhook(\n state: TelegramServerState,\n webhook: TelegramWebhook,\n update: TelegramUpdate,\n): Promise<{ error: string } | { status: number }> {\n const url = new URL(webhook.url);\n const deadlineAt = Date.now() + TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS;\n const controller = new AbortController();\n state.activeWebhookDeliveries.add(controller);\n try {\n const target = await validateTelegramWebhookUrl(state, url, deadlineAt, controller.signal);\n if (target instanceof Response) {\n return { error: \"Webhook target is no longer allowed\" };\n }\n const addresses: Array<WebhookAddress | undefined> =\n target.addresses && target.addresses.length > 0 ? target.addresses : [undefined];\n let lastError: unknown;\n for (const [index, address] of addresses.entries()) {\n if (state.closing) {\n throw new Error(\"Telegram server is shutting down.\");\n }\n const remainingMs = deadlineAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Webhook delivery timed out\", \"TimeoutError\");\n }\n try {\n const attemptsRemaining = addresses.length - index;\n const status = await postWebhookRequest({\n address,\n body: JSON.stringify(update),\n headerEntries: webhook.secretToken\n ? [[\"x-telegram-bot-api-secret-token\", webhook.secretToken]]\n : undefined,\n signal: controller.signal,\n timeoutMs: Math.max(1, Math.floor(remainingMs / attemptsRemaining)),\n url,\n });\n return { status };\n } catch (error) {\n lastError = error;\n if (state.closing || controller.signal.aborted) {\n throw error;\n }\n }\n }\n throw lastError;\n } finally {\n state.activeWebhookDeliveries.delete(controller);\n }\n}\n\nasync function replaceTelegramWebhook(\n state: TelegramServerState,\n webhook: TelegramWebhook | undefined,\n dropPendingUpdates: boolean,\n): Promise<void> {\n let releaseAdmission!: () => void;\n const previousAdmission = state.webhookAdmission;\n state.webhookAdmission = new Promise<void>((resolve) => {\n releaseAdmission = resolve;\n });\n await previousAdmission;\n try {\n state.webhook = undefined;\n clearTelegramWebhookRetry(state, true);\n for (const controller of state.activeWebhookDeliveries) {\n controller.abort();\n }\n await state.webhookDelivery;\n if (dropPendingUpdates) {\n state.updates.length = 0;\n }\n state.webhook = webhook;\n if (webhook) {\n finishTelegramUpdatePoll(state, \"conflict\");\n scheduleTelegramWebhookDelivery(state, 0);\n }\n } finally {\n releaseAdmission();\n }\n}\n\nfunction clearTelegramWebhookRetry(state: TelegramServerState, resetAttempts = false): void {\n if (state.webhookRetryTimer) {\n clearTimeout(state.webhookRetryTimer);\n state.webhookRetryTimer = undefined;\n }\n if (resetAttempts) {\n state.webhookRetryAttempts = 0;\n state.webhookRetryUpdateId = undefined;\n }\n}\n\nfunction syncTelegramWebhookRetryHead(state: TelegramServerState): void {\n const updateId = state.updates[0]?.update_id;\n if (updateId === state.webhookRetryUpdateId) {\n return;\n }\n clearTelegramWebhookRetry(state);\n state.webhookRetryAttempts = 0;\n state.webhookRetryUpdateId = updateId;\n}\n\nfunction scheduleTelegramWebhookDelivery(state: TelegramServerState, delayMs: number): void {\n if (\n state.closing ||\n !state.webhook ||\n state.updates.length === 0 ||\n state.webhookDelivery ||\n state.webhookRetryTimer\n ) {\n return;\n }\n state.webhookRetryTimer = setTimeout(() => {\n state.webhookRetryTimer = undefined;\n void deliverTelegramWebhookUpdates(state, true);\n }, delayMs);\n state.webhookRetryTimer.unref();\n}\n\nasync function deliverTelegramWebhookUpdates(\n state: TelegramServerState,\n scheduledRetry = false,\n): Promise<Response | undefined> {\n if (state.webhookDelivery) {\n return await state.webhookDelivery;\n }\n syncTelegramWebhookRetryHead(state);\n if (!scheduledRetry && state.webhookRetryTimer) {\n return telegramError(\"Bad Gateway: webhook delivery failed\", 502);\n }\n let attemptedUpdateId: number | undefined;\n const delivery = flushTelegramWebhookUpdates(state, (updateId) => {\n attemptedUpdateId = updateId;\n });\n state.webhookDelivery = delivery;\n let result: Response | undefined;\n try {\n result = await delivery;\n return result;\n } finally {\n if (state.webhookDelivery === delivery) {\n state.webhookDelivery = undefined;\n }\n if (state.webhook && state.updates.length > 0) {\n if (state.updates[0]?.update_id !== attemptedUpdateId) {\n syncTelegramWebhookRetryHead(state);\n scheduleTelegramWebhookDelivery(state, 0);\n } else if (result) {\n const delayMs =\n TELEGRAM_WEBHOOK_RETRY_BASE_MS *\n 2 ** Math.min(state.webhookRetryAttempts, TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT);\n state.webhookRetryAttempts = Math.min(\n state.webhookRetryAttempts + 1,\n TELEGRAM_WEBHOOK_MAX_BACKOFF_EXPONENT,\n );\n scheduleTelegramWebhookDelivery(state, delayMs);\n } else {\n state.webhookRetryAttempts = 0;\n scheduleTelegramWebhookDelivery(state, 0);\n }\n }\n }\n}\n\nasync function handleTelegramApi(params: {\n body: Record<string, unknown>;\n method: string;\n request: IncomingMessage;\n state: TelegramServerState;\n}) {\n const method = params.method.toLowerCase();\n switch (method) {\n case \"getme\":\n return telegramOk(createBotUser(params.state));\n case \"setmycommands\":\n case \"deletemycommands\":\n case \"sendchataction\":\n case \"answercallbackquery\":\n case \"deletemessage\":\n case \"pinchatmessage\":\n case \"unpinchatmessage\":\n case \"setmessagereaction\":\n case \"editforumtopic\":\n return telegramOk(true);\n case \"setwebhook\": {\n if (params.body.url === \"\") {\n await replaceTelegramWebhook(\n params.state,\n undefined,\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n }\n const webhookUrl = toStringValue(params.body.url);\n if (!webhookUrl) {\n return telegramError(\"Bad Request: url is required\");\n }\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(webhookUrl);\n } catch {\n return telegramError(\"Bad Request: bad webhook URL\");\n }\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n return telegramError(\"Bad Request: bad webhook URL\");\n }\n if (params.state.activeWebhookValidations.size >= MAX_ACTIVE_TELEGRAM_WEBHOOK_VALIDATIONS) {\n return telegramError(\"Too Many Requests: too many webhook validations\", 429);\n }\n const validation = new AbortController();\n params.state.activeWebhookValidations.add(validation);\n const target = await validateTelegramWebhookUrl(\n params.state,\n parsedUrl,\n Date.now() + TELEGRAM_WEBHOOK_DELIVERY_TIMEOUT_MS,\n validation.signal,\n ).finally(() => {\n params.state.activeWebhookValidations.delete(validation);\n });\n if (target instanceof Response) {\n return target;\n }\n const secretToken = toStringValue(params.body.secret_token);\n if (secretToken && !/^[A-Za-z0-9_-]{1,256}$/u.test(secretToken)) {\n return telegramError(\"Bad Request: invalid secret token\");\n }\n await replaceTelegramWebhook(\n params.state,\n {\n ...(secretToken ? { secretToken } : {}),\n url: parsedUrl.href,\n },\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n }\n case \"deletewebhook\":\n await replaceTelegramWebhook(\n params.state,\n undefined,\n toBooleanValue(params.body.drop_pending_updates),\n );\n return telegramOk(true);\n case \"getwebhookinfo\":\n return telegramOk({\n has_custom_certificate: false,\n ...(params.state.webhook?.lastErrorDate\n ? { last_error_date: params.state.webhook.lastErrorDate }\n : {}),\n ...(params.state.webhook?.lastErrorMessage\n ? { last_error_message: params.state.webhook.lastErrorMessage }\n : {}),\n pending_update_count: params.state.updates.length,\n url: params.state.webhook?.url ?? \"\",\n });\n case \"createforumtopic\":\n return telegramOk({\n icon_color: 0x6fb9f0,\n message_thread_id: params.state.nextMessageId++,\n name: toStringValue(params.body.name) ?? \"Crabline Topic\",\n });\n case \"editmessagetext\": {\n const message = createEditedMessage(params.state, params.body);\n return message\n ? telegramOk(message)\n : telegramError(\"Bad Request: chat_id, message_id, and text are required\");\n }\n case \"sendmessage\": {\n const message = createOutboundMessage(params.state, params.body);\n return message\n ? telegramOk(message)\n : telegramError(\"Bad Request: chat_id and text are required\");\n }\n case \"sendanimation\":\n case \"sendaudio\":\n case \"senddocument\":\n case \"sendphoto\":\n case \"sendvideo\": {\n const mediaKind = method.slice(\"send\".length) as\n | \"animation\"\n | \"audio\"\n | \"document\"\n | \"photo\"\n | \"video\";\n const message = createOutboundMediaMessage(params.state, params.body, mediaKind);\n return message\n ? telegramOk(message)\n : telegramError(`Bad Request: chat_id and ${mediaKind} are required`);\n }\n case \"getupdates\":\n if (params.state.webhook) {\n return telegramError(\"Conflict: can't use getUpdates method while webhook is active\", 409);\n }\n return await handleTelegramGetUpdates(params);\n default:\n return telegramError(`Not Found: unsupported method ${params.method}`, 404);\n }\n}\n\n/** @internal */\nexport async function handleTelegramGetUpdates(params: {\n body: Record<string, unknown>;\n request: IncomingMessage;\n state: TelegramGetUpdatesState;\n}): Promise<Response> {\n const offset = toIntegerValue(params.body.offset);\n const limit = toIntegerValue(params.body.limit) ?? 100;\n const timeout = toIntegerValue(params.body.timeout) ?? 0;\n if (params.body.offset !== undefined && offset === undefined) {\n return telegramError(\"Bad Request: offset must be a safe integer\");\n }\n if (params.body.limit !== undefined && toIntegerValue(params.body.limit) === undefined) {\n return telegramError(\"Bad Request: limit must be a safe integer\");\n }\n if (params.body.timeout !== undefined && toIntegerValue(params.body.timeout) === undefined) {\n return telegramError(\"Bad Request: timeout must be a safe integer\");\n }\n if (limit < 1 || limit > 100) {\n return telegramError(\"Bad Request: limit must be between 1 and 100\");\n }\n if (timeout < 0) {\n return telegramError(\"Bad Request: timeout must be non-negative\");\n }\n\n finishTelegramUpdatePoll(params.state, \"conflict\");\n let updates = takeTelegramUpdates(params.state, offset, limit);\n const deadline = Date.now() + Math.min(timeout * 1_000, 2_147_483_647);\n if (updates.length === 0 && timeout > 0) {\n while (updates.length === 0) {\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n break;\n }\n const pollResult = await waitForTelegramUpdate(\n params.state,\n params.request,\n remainingMs,\n () => hasTelegramUpdates(params.state, offset),\n );\n if (pollResult === \"conflict\") {\n return telegramError(\n \"Conflict: terminated by other getUpdates request; make sure that only one bot instance is running\",\n 409,\n );\n }\n if (pollResult !== \"update\") {\n break;\n }\n updates = takeTelegramUpdates(params.state, offset, limit);\n }\n }\n return telegramOk(updates);\n}\n\nfunction takeTelegramUpdates(\n state: TelegramGetUpdatesState,\n offset: number | undefined,\n limit: number,\n): TelegramUpdate[] {\n if (offset !== undefined && offset < 0) {\n const retainedCount = Math.min(Math.abs(offset), state.updates.length);\n state.updates.splice(0, state.updates.length - retainedCount);\n } else if (offset !== undefined) {\n const firstUnconfirmed = state.updates.findIndex((update) => update.update_id >= offset);\n if (firstUnconfirmed === -1) {\n state.updates.length = 0;\n } else if (firstUnconfirmed > 0) {\n state.updates.splice(0, firstUnconfirmed);\n }\n }\n return state.updates.slice(0, limit);\n}\n\nfunction hasTelegramUpdates(state: TelegramGetUpdatesState, offset: number | undefined): boolean {\n if (offset === undefined || offset < 0) {\n return state.updates.length > 0;\n }\n return state.updates.some((update) => update.update_id >= offset);\n}\n\nfunction finishTelegramUpdatePoll(\n state: TelegramGetUpdatesState,\n result: TelegramUpdatePollResult,\n): void {\n state.activeUpdatePoll?.finish(result);\n}\n\nasync function waitForTelegramUpdate(\n state: TelegramGetUpdatesState,\n request: IncomingMessage,\n timeoutMs: number,\n hasUpdate: () => boolean,\n): Promise<TelegramUpdatePollResult> {\n if (state.closing || request.socket.destroyed) {\n return \"shutdown\";\n }\n return await new Promise<TelegramUpdatePollResult>((resolve) => {\n let settled = false;\n const poll: TelegramUpdatePoll = {\n finish(result) {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n request.socket.off(\"close\", onSocketClose);\n if (state.activeUpdatePoll === poll) {\n state.activeUpdatePoll = undefined;\n }\n resolve(result);\n },\n };\n const onSocketClose = () => poll.finish(\"shutdown\");\n const timer = setTimeout(() => poll.finish(\"timeout\"), timeoutMs);\n timer.unref();\n const previousPoll = state.activeUpdatePoll;\n state.activeUpdatePoll = poll;\n previousPoll?.finish(\"conflict\");\n request.socket.once(\"close\", onSocketClose);\n if (state.closing || request.socket.destroyed) {\n poll.finish(\"shutdown\");\n } else if (hasUpdate()) {\n poll.finish(\"update\");\n }\n });\n}\n\nfunction telegramMethodNotAllowed(): Response {\n const response = telegramError(\"Method Not Allowed\", 405);\n response.headers.set(\"allow\", \"GET, POST\");\n return response;\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: TelegramServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname === \"/crabline/telegram/inbound\") {\n if (params.request.method !== \"POST\") {\n return new Response(\"not found\", { status: 404 });\n }\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n drainRequestBody(params.request);\n return adminAuthError();\n }\n const body = await parseRequestBody(params.request);\n if (!isJsonObject(body)) {\n return telegramError(\"Bad Request: request body must be a JSON object\");\n }\n return await handleTelegramAdminInbound({\n body,\n request: params.request,\n state: params.state,\n url,\n });\n }\n\n const botPath = requireTelegramBotPath(url.pathname);\n if (!botPath || botPath.token !== params.state.botToken) {\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n }\n const requestMethod = params.request.method ?? \"GET\";\n if (requestMethod !== \"GET\" && requestMethod !== \"POST\") {\n drainRequestBody(params.request);\n return telegramMethodNotAllowed();\n }\n const body = requestMethod === \"GET\" ? queryRecord(url) : await parseRequestBody(params.request);\n if (!isJsonObject(body)) {\n return telegramError(\"Bad Request: can't parse JSON object\");\n }\n const event: TelegramServerEvent = {\n at: new Date().toISOString(),\n body: redactTelegramSecrets(body),\n method: requestMethod,\n path: `/bot<redacted>/${botPath.method}`,\n query: redactTelegramSecrets(queryRecord(url)),\n type: \"api\",\n };\n if (TELEGRAM_SEND_METHODS.has(botPath.method.toLowerCase())) {\n const response = await handleTelegramApi({\n body,\n method: botPath.method,\n request: params.request,\n state: params.state,\n });\n event.accepted = response.ok;\n try {\n await appendEvent(params.state, event);\n } catch (error) {\n if (!event.accepted) {\n throw error;\n }\n }\n return response;\n }\n await appendEvent(params.state, event);\n return await handleTelegramApi({\n body,\n method: botPath.method,\n request: params.request,\n state: params.state,\n });\n}\n\nasync function serveRequest(params: {\n request: IncomingMessage;\n response: ServerResponse;\n state: TelegramServerState;\n}): Promise<void> {\n let fetchResponse: Response;\n try {\n fetchResponse = await handleRequest({ request: params.request, state: params.state });\n } catch (error) {\n fetchResponse =\n error instanceof InvalidJsonBodyError\n ? telegramError(\"Bad Request: can't parse JSON object\")\n : error instanceof RequestBodyTooLargeError\n ? telegramError(\"Request Entity Too Large\", 413)\n : jsonResponse({ error: \"internal server error\", ok: false }, 500);\n }\n\n try {\n await writeResponse(params.response, fetchResponse);\n } catch {\n // A disconnected client cannot receive an error fallback. End delivery here\n // so the Node request callback never leaks an unhandled rejection.\n params.response.destroy();\n }\n}\n\nexport async function startTelegramServer(\n params: StartTelegramServerParams = {},\n): Promise<StartedTelegramServer> {\n const host = params.host ?? \"127.0.0.1\";\n const botId = params.botId ?? 424242;\n if (!Number.isSafeInteger(botId) || botId < 1) {\n throw new Error(\"botId must be a positive safe integer.\");\n }\n const state: TelegramServerState = {\n activeUpdatePoll: undefined,\n activeWebhookDeliveries: new Set(),\n activeWebhookValidations: new Set(),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"hex\"),\n allowLoopbackHttpWebhook: isLoopbackHost(host),\n botId,\n botToken:\n params.botToken ??\n (isLoopbackHost(host)\n ? \"424242:crabline-telegram-token\"\n : `${botId}:${randomBytes(26).toString(\"base64url\")}`),\n botUsername: params.botUsername ?? \"crabline_bot\",\n inboundAdmission: Promise.resolve(),\n maxPendingInboundEvents: resolveMaxPendingInboundEvents(params.maxPendingInboundEvents),\n nextMessageId: 1,\n nextUpdateId: 1,\n onEvent: params.onEvent,\n recorderPath: params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"telegram.jsonl\"),\n restrictWebhookTargets: true,\n closing: false,\n updates: [],\n webhook: undefined,\n webhookAdmission: Promise.resolve(),\n webhookDelivery: undefined,\n webhookRetryAttempts: 0,\n webhookRetryTimer: undefined,\n webhookRetryUpdateId: undefined,\n };\n const port = params.port ?? 0;\n const server = createServer((request, response) => {\n void serveRequest({ request, response, state });\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address();\n if (!address || typeof address === \"string\") {\n throw new CrablineError(\"Unable to resolve Telegram local server address.\", {\n kind: \"connectivity\",\n });\n }\n const baseUrl = `http://${formatUrlHost(host)}:${address.port}`;\n return {\n async close() {\n state.closing = true;\n finishTelegramUpdatePoll(state, \"shutdown\");\n clearTelegramWebhookRetry(state);\n for (const controller of state.activeWebhookDeliveries) {\n controller.abort();\n }\n for (const controller of state.activeWebhookValidations) {\n controller.abort();\n }\n await state.webhookDelivery;\n await state.webhookAdmission;\n await state.inboundAdmission;\n await closeServer(server);\n },\n manifest: {\n adminToken: state.adminToken,\n baseUrl,\n botToken: state.botToken,\n endpoints: {\n adminInboundUrl: `${baseUrl}/crabline/telegram/inbound`,\n apiRoot: baseUrl,\n },\n env: {\n TELEGRAM_BOT_TOKEN: state.botToken,\n },\n provider: \"telegram\",\n recorderPath: state.recorderPath,\n version: 1,\n },\n };\n}\n"]}
|