@meritsandtree/mt-os-cli 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +223 -0
- package/assets/agent-skill/SKILL.md +29 -0
- package/assets/claude/CLAUDE.md +10 -0
- package/dist/index.js +5961 -0
- package/dist/index.js.map +1 -0
- package/examples/claude-code/README.md +38 -0
- package/examples/prompts/basic.md +8 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/util/errors.ts","../src/output/cli-output.ts","../src/util/base-url.ts","../src/config/environments.ts","../src/http/api-client.ts","../src/cli/context.ts","../src/commands/api.ts","../src/auth/login.ts","../src/install/templates.ts","../src/install/install.ts","../src/commands/install.ts","../src/commands/auth.ts","../src/commands/doctor.ts","../src/commands/env.ts","../src/commands/mcp.ts","../src/tool/schema.ts","../src/commands/schema.ts","../src/commands/skills.ts","../src/cli/pagination.ts","../src/commands/shortcut-common.ts","../src/commands/shortcut-schedule.ts","../src/commands/shortcut-task.ts","../src/commands/shortcuts.ts","../src/commands/tool.ts","../src/update/self-update.ts","../src/update/semver.ts","../src/update/version-check.ts","../src/commands/update.ts","../src/session/store.ts","../src/update/notice.ts","../src/index.ts"],"names":["fs","path","require","createRequire","os","parameter","sleep","addWriteOptions","addReadOptions","collectOption","parseCsvOption","DEFAULT_UPLOAD_TOOL_NAME","definition","runCommand","skills"],"mappings":";;;;;;;;;;;;;;;;;AAAO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClC,WAAA,CACE,OAAA,EACS,IAAA,EACA,MAAA,EACT;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHJ,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGT,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,SAAA,GAAN,cAAwB,QAAA,CAAS;AAAA,EACtC,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAe,MAAA,EAAiB;AAC3D,IAAA,KAAA,CAAM,OAAA,EAAS,MAAM,MAAM,CAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAC5C,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAe,MAAA,EAAiB;AAC3D,IAAA,KAAA,CAAM,OAAA,EAAS,MAAM,MAAM,CAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF,CAAA;;;AC0BO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,WAAA,CACW,UACA,MAAA,EACT;AACA,IAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AAHX,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGT,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF,CAAA;AAKO,IAAM,yBAAA,GAAN,cAAwC,YAAA,CAAa;AAAA,EAC1D,WAAA,CAAY,MAAA,EAAgB,IAAA,GAAO,0BAAA,EAA4B;AAC7D,IAAA,KAAA,CAAM,EAAA,EAAI;AAAA,MACR,IAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS,GAAG,MAAM,CAAA,sBAAA,CAAA;AAAA,MAClB,IAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,iBAAA;AAAA,QACP;AAAA;AACF,KACD,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,2BAAA;AAAA,EACd;AACF,CAAA;AAUA,IAAI,qBAAA;AAOG,SAAS,yBAAyB,QAAA,EAAiC;AACxE,EAAA,qBAAA,GAAwB,QAAA;AAC1B;AAKO,SAAS,0BAAA,GAAmC;AACjD,EAAA,qBAAA,GAAwB,MAAA;AAC1B;AAOO,SAAS,gBAAA,GAAwD;AACtE,EAAA,OAAO,qBAAA,IAAwB;AACjC;AAQO,SAAS,kBAAkB,KAAA,EAAyC;AACzE,EAAA,MAAM,UAAA,GAAA,CAAc,KAAA,IAAS,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AACxD,EAAA,IACE,UAAA,KAAe,UACf,UAAA,KAAe,QAAA,IACf,eAAe,OAAA,IACf,UAAA,KAAe,QAAA,IACf,UAAA,KAAe,KAAA,EACf;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,IACxB,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,0BAA0B,KAAK,CAAA,CAAA;AAAA,IACxC,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAWO,SAAS,WAAA,CAAY,MAAe,UAAA,EAA8B;AACvE,EAAA,MAAM,OAAA,GAAU,YAAY,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,GAAA,EAAK;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,8BAA8B,UAAU,CAAA,CAAA;AAAA,MACjD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,MAAM,WAAW,OAAA,CACd,KAAA,CAAM,CAAC,CAAA,CACP,MAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,YAAY,OAAA,CAAQ,IAAA,EAAM,CAAA,CAC/B,OAAO,OAAO,CAAA;AACjB,EAAA,OAAO,QAAA,CAAS,MAAA,CAAgB,CAAC,OAAA,EAAS,OAAA,KAAY;AACpD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,MAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,SAAS,eAAA,CAAgB,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,eAAA,CAAgB,SAAS,OAAO,CAAA;AAAA,EACzC,GAAG,IAAI,CAAA;AACT;AAQO,SAAS,SAAA,CACd,MACA,OAAA,EAMM;AACN,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,MAAA;AAClC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,IAAA,EAAM,OAAA,EAAS,EAAE,CAAA;AAC9C,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,OAAA,GACJ,SAAS,QAAA,KAAa,KAAA,GAClB,WACA,oBAAA,CAAqB,QAAA,EAAU,SAAS,IAAI,CAAA;AAClD,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,QAAQ,CAAC,CAAA;AAClC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,QAAQ,CAAC,CAAA;AACjC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,WAAA,CAAY,QAAQ,CAAA;AACpB,IAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAC,CAAA;AACjC;AAQO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,EAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,EAAA,OAAA,CAAQ,KAAA;AAAA,IACN,IAAA,CAAK,SAAA;AAAA,MACH;AAAA,QACE,EAAA,EAAI,KAAA;AAAA,QACJ,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,GAAI,MAAA,GAAS,EAAE,OAAA,EAAS,MAAA,KAAW;AAAC,OACtC;AAAA,MACA,IAAA;AAAA,MACA;AAAA;AACF,GACF;AACA,EAAA,OAAO,MAAA,CAAO,QAAA;AAChB;AASA,SAAS,oBAAA,CACP,MACA,IAAA,EAC0B;AAC1B,EAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA;AAAA,IACA,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS,EAAC;AAAA,IACvB,GAAI,MAAA,GAAS,EAAE,OAAA,EAAS,MAAA,KAAW;AAAC,GACtC;AACF;AAQA,SAAS,eAAe,KAAA,EAGtB;AACA,EAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,IAAA,OAAO;AAAA,MACL,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK,GAAI,EAAC;AAAA,QACvD,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,IAAA,EACE,KAAA,CAAM,OAAA,KAAY,eAAA,GACd,+NAAA,GACA;AAAA;AACR,KACF;AAAA,EACF;AACA,EAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK,GAAI,EAAC;AAAA,QACvD,SAAS,KAAA,CAAM;AAAA;AACjB,KACF;AAAA,EACF;AACA,EAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK,GAAI,EAAC;AAAA,QACvD,SAAS,KAAA,CAAM;AAAA;AACjB,KACF;AAAA,EACF;AACA,EAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,IAAA,EAAM;AAAA;AACR,KACF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,CAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE,GACF;AACF;AASA,SAAS,eAAA,CAAgB,OAAgB,KAAA,EAAwB;AAC/D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAQ,MAAkC,KAAK,CAAA;AACjD;AAQA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AACtC;AAQA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,MAAM,IAAA,GAAO,cAAc,KAAK,CAAA;AAChC,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,eAAe,IAAI,CAAA;AACnC,EAAA,MAAM,SAAS,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,WAC1B,IAAA,CAAK,GAAA;AAAA,MACH,MAAA,CAAO,MAAA;AAAA,MACP,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,aAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAE,MAAM;AAAA;AACvD,GACF;AACA,EAAA,MAAM,YAAY,CAAC,KAAA,KACjB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA,IAAK,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AACvE,EAAA,OAAO;AAAA,IACL,UAAU,OAAO,CAAA;AAAA,IACjB,SAAA,CAAU,OAAO,GAAA,CAAI,CAAC,UAAU,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,IAClD,GAAG,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,GAAA,KACX,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,YAAA,CAAa,GAAA,CAAI,MAAM,CAAC,CAAC,CAAC;AAAA;AAC9D,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAOA,SAAS,YAAY,KAAA,EAAsB;AACzC,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAClD,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EACjC;AACF;AAQA,SAAS,UAAU,KAAA,EAAwB;AACzC,EAAA,MAAM,IAAA,GAAO,cAAc,KAAK,CAAA;AAChC,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,eAAe,IAAI,CAAA;AACnC,EAAA,OAAO;AAAA,IACL,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,IACnC,GAAG,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,GAAA,KACX,OAAA,CACG,GAAA,CAAI,CAAC,MAAA,KAAW,aAAA,CAAc,YAAA,CAAa,GAAA,CAAI,MAAM,CAAC,CAAC,CAAC,CAAA,CACxD,KAAK,GAAG;AAAA;AACb,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAQA,SAAS,cAAc,KAAA,EAAgD;AACrE,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAClD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,IAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACzD,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,KACT;AAAA,EACF,CAAC,CAAA;AACH;AAQA,SAAS,eAAe,IAAA,EAAgD;AACtE,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,OAAO,CAAA;AACpB;AAQA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AAC3D,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;AAQA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AACtC;;;AC5dO,SAAS,iBAAiB,KAAA,EAAuB;AACtD,EAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAK,CAAA;AACzB,EAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG;AACpC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,GAAA,CAAI,QAAQ,CAAA,CAAE,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,GAAA,CAAI,QAAA,EAAS,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC1C;;;ACEO,IAAM,wBAAA,GAAmD,MAAA;AAsBhE,IAAM,aAAA,GAGF;AAAA,EACF,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,WAAA,EAAa,gEAAA;AAAA,IACb,OAAA,EAAS,uBAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA,IACH,KAAA,EAAO,0BAAA;AAAA,IACP,WAAA,EAAa,2GAAA;AAAA,IACb,OAAA,EAAS,uBAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,0BAAA;AAAA,IACP,WAAA,EAAa,qCAAA;AAAA,IACb,OAAA,EAAS,mCAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,0BAAA;AAAA,IACP,WAAA,EAAa,qCAAA;AAAA,IACb,OAAA,EAAS,+BAAA;AAAA,IACT,UAAA,EAAY;AAAA;AAEhB,CAAA;AAEA,IAAM,4BAA4B,MAAA,CAAO,IAAA;AAAA,EACvC;AACF,CAAA;AAOO,SAAS,sBAAA,GAA8C;AAC5D,EAAA,OAAO,yBAAA,CAA0B,GAAA;AAAA,IAAI,CAAC,IAAA,KACpC,eAAA,CAAgB,IAAA,EAAM,aAAA,CAAc,IAAI,CAAC;AAAA,GAC3C;AACF;AAQO,SAAS,gCACd,MAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACL,GAAG,sBAAA,EAAuB;AAAA,IAC1B,GAAG,6BAA6B,MAAM;AAAA,GACxC;AACF;AAQO,SAAS,oBAAA,CACd,MACA,MAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,cAAA,GAAiB,yBAAyB,IAAI,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,yBAAyB,cAAc,CAAA;AAC3D,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,0BAAA,CAA2B,gBAAgB,MAAM,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,eAAA,CAAgB,WAAA,EAAa,aAAA,CAAc,WAAW,CAAC,CAAA;AAChE;AAQO,SAAS,2BAAA,CACd,MACA,MAAA,EACmB;AACnB,EAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,IAAA,EAAM,MAAM,CAAA;AAChD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,SAAA,GAAY,+BAAA,CAAgC,MAAA,IAAU,EAAE,CAAA,CAC3D,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA,CACvB,KAAK,IAAI,CAAA;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qBAAA,EAAwB,IAAI,CAAA,0BAAA,EAA6B,SAAS,CAAA;AAAA,KACpE;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,2BAAA,GAAiD;AAC/D,EAAA,OAAO,4BAA4B,wBAAwB,CAAA;AAC7D;AASO,SAAS,sBAAA,CACd,QACA,MAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,aAAa,MAAA,CAAO,IAAA;AAAA,IACpB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,YAAY,MAAA,CAAO;AAAA,GACrB;AACF;AAQO,SAAS,yBAAyB,IAAA,EAAmC;AAC1E,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,wBAAA,CAAyB,wBAAA,CAAyB,IAAI,CAAC,CAAA,KAAM,MAAA;AACtE;AAQO,SAAS,yBAAyB,IAAA,EAAsB;AAC7D,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY;AAC3C,EAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,CAAK,UAAU,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAQO,SAAS,6BAA6B,KAAA,EAMvB;AACpB,EAAA,MAAM,IAAA,GAAO,wBAAA,CAAyB,KAAA,CAAM,IAAI,CAAA;AAChD,EAAA,IAAI,wBAAA,CAAyB,IAAI,CAAA,EAAG;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,eAAe,IAAI,CAAA,uCAAA;AAAA,KACrB;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAK,IAAK,IAAA;AAAA,IAC9B,WAAA,EAAa,KAAA,CAAM,WAAA,EAAa,IAAA,EAAK,IAAK,kDAAA;AAAA,IAC1C,OAAA;AAAA,IACA,UAAA,EAAY,gBAAA,CAAiB,KAAA,CAAM,UAAA,IAAc,OAAO,CAAA;AAAA,IACxD,MAAA,EAAQ;AAAA,GACV;AACF;AASO,SAAS,uBAAA,CACd,QACA,MAAA,EACa;AAIb,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,kBAAA,EAAoB;AAAA,MAClB,GAAI,MAAA,CAAO,kBAAA,IAAsB,EAAC;AAAA,MAClC,CAAC,MAAA,CAAO,IAAI,GAAG;AAAA,QACb,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,YAAY,MAAA,CAAO;AAAA;AACrB;AACF,GACF;AACF;AASO,SAAS,uBAAA,CACd,QACA,IAAA,EAIA;AACA,EAAA,MAAM,cAAA,GAAiB,yBAAyB,IAAI,CAAA;AACpD,EAAA,IAAI,wBAAA,CAAyB,cAAc,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,cAAc,CAAA,mBAAA,CAAqB,CAAA;AAAA,EAC7E;AACA,EAAA,MAAM,kBAAA,GAAqB;AAAA,IACzB,GAAI,MAAA,CAAO,kBAAA,IAAsB;AAAC,GACpC;AACA,EAAA,IAAI,CAAC,kBAAA,CAAmB,cAAc,CAAA,EAAG;AACvC,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,OAAO,mBAAmB,cAAc,CAAA;AACxC,EAAA,MAAM,UAAA,GAA0B;AAAA,IAC9B,GAAG,MAAA;AAAA,IACH;AAAA,GACF;AACA,EAAA,IAAI,UAAA,CAAW,gBAAgB,cAAA,EAAgB;AAC7C,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,sBAAA,CAAuB,UAAA,EAAY,2BAAA,EAA6B,CAAA;AAAA,MACxE,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AACF;AASA,SAAS,eAAA,CACP,MACA,MAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAA,EAAS,gBAAA,CAAiB,MAAA,CAAO,OAAO,CAAA;AAAA,IACxC,UAAA,EAAY,gBAAA,CAAiB,MAAA,CAAO,UAAU,CAAA;AAAA,IAC9C,MAAA,EAAQ;AAAA,GACV;AACF;AAQA,SAAS,yBACP,IAAA,EACoC;AACpC,EAAA,OAAQ,yBAAA,CAAuC,QAAA,CAAS,IAAI,CAAA,GACvD,IAAA,GACD,MAAA;AACN;AAQA,SAAS,6BAA6B,MAAA,EAA0C;AAC9E,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,kBAAA,IAAsB,EAAE,CAAA,CAClD,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM,gCAAA,CAAiC,IAAA,EAAM,MAAM,CAAC,CAAA,CACtE,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,IAAI,CAAC,CAAA;AAC9D;AASA,SAAS,0BAAA,CACP,MACA,MAAA,EAC+B;AAC/B,EAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,kBAAA,GAAqB,IAAI,CAAA;AAChD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,gCAAA,CAAiC,MAAM,MAAM,CAAA;AACtD;AASA,SAAS,gCAAA,CACP,MACA,MAAA,EACmB;AACnB,EAAA,MAAM,cAAA,GAAiB,yBAAyB,IAAI,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,MAAA,CAAO,OAAO,CAAA;AAC/C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,IAAA,EAAK,IAAK,cAAA;AAAA,IAC/B,WAAA,EAAa,MAAA,CAAO,WAAA,EAAa,IAAA,EAAK,IAAK,kDAAA;AAAA,IAC3C,OAAA;AAAA,IACA,UAAA,EAAY,gBAAA,CAAiB,MAAA,CAAO,UAAA,IAAc,OAAO,CAAA;AAAA,IACzD,MAAA,EAAQ;AAAA,GACV;AACF;ACxWA,IAAM,mBAAA,GAAsB,GAAA;AAC5B,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,sBAAA,GAAyB,GAAA;AAmC/B,SAAS,iBAAoB,KAAA,EAA4C;AACvE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,OACE,OAAO,MAAA,CAAO,OAAA,KAAY,SAAA,IAC1B,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IACvB,OAAO,MAAA,CAAO,GAAA,KAAQ,QAAA,IACtB,MAAA,IAAU,MAAA;AAEd;AAQA,SAAS,2BAA2B,KAAA,EAAuB;AACzD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA;AACjF;AAQA,SAAS,0BAA0B,KAAA,EAA8C;AAC/E,EAAA,MAAM,QAAA,GAAW,CAAA,cAAA,EAAiB,UAAA,EAAY,CAAA,CAAA;AAC9C,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,CAAA,iBAAA,EAAoB,0BAAA,CAA2B,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACzD,KAAK,QAAA,GAAW,CAAA,UAAA,EAAa,2BAA2B,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA,GAAM;AAAA,KAC9E,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA;AAAA,CAAA,EAAQ,MAAM,CAAC,CAAA;AACpD,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,qBAAA,EAAwB,WAAW,CAAA;AAAA,CAAA,EAAQ,MAAM,CAAC,CAAA;AAC1E,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,WAAW,CAAA;AAAA,CAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IAC1E;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAC,CAAA;AACvC,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAC,CAAA;AACnF,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA;AAAA,CAAA,EAAU,MAAM,CAAC,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AACjC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,WAAA,EAAa,iCAAiC,QAAQ,CAAA,CAAA;AAAA,IACtD,eAAe,IAAA,CAAK;AAAA,GACtB;AACF;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACR,IAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EAEjB,YAAY,OAAA,EAMT;AACD,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,IAAA;AACtC,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,WAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GACH,OAAA,CAAQ,IAAA,IACR,KAAA,CAAM,MAAA,CAAO;AAAA,MACX,SAAS,IAAA,CAAK,SAAA;AAAA,MACd,gBAAgB,MAAM;AAAA,KACvB,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,YAAA,CACJ,OAAA,EACA,OAAA,EACsB;AACtB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,OAAA;AAAA,MACA,gCAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,mBAAA,CACJ,OAAA,EACA,OAAA,EACgC;AAChC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,OAAA;AAAA,MACA,qCAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAA,CACJ,OAAA,EACA,UAAA,EACsB;AACtB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,OAAA;AAAA,MACA,CAAA,kCAAA,EAAqC,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AAAA,MACnE,EAAC;AAAA,MACD;AAAA,QACE,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAA,CACJ,OAAA,EACA,OAAA,EACsB;AACtB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,OAAA;AAAA,MACA,6BAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,OAAA,EAAiB,KAAA,EAAmC;AACnE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA;AAAA,MAC1B,OAAA;AAAA,MACA,0BAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,QACE,WAAA,EAAa,0BAAA;AAAA,QACb,KAAA;AAAA,QACA,YAAA,EAAc;AAAA;AAChB,KACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,OAAA,EAAiD;AACpE,IAAA,MAAM,OAAA,GAAU,OAAA,IAAY,MAAM,IAAA,CAAK,aAAa,UAAA,EAAW;AAC/D,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,IAC7E;AACA,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA;AAAA,MAC5B,OAAA,CAAQ,OAAA;AAAA,MACR,4BAAA;AAAA,MACA,OAAA,CAAQ,YAAA;AAAA,MACR;AAAA,QACE,WAAA,EAAa,0BAAA;AAAA,QACb,OAAA,EAAS;AAAA;AACX,KACF;AACA,IAAA,MAAM,WAAA,GAA6B;AAAA,MACjC,GAAG,OAAA;AAAA,MACH,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,YAAA,EAAc,UAAA,CAAW,YAAA,IAAgB,OAAA,CAAQ,YAAA;AAAA,MACjD,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AACA,IAAA,IAAI,UAAA,CAAW,oBAAoB,MAAA,EAAW;AAC5C,MAAA,WAAA,CAAY,kBAAkB,UAAA,CAAW,eAAA;AAAA,IAC3C;AACA,IAAA,IAAI,UAAA,CAAW,2BAA2B,MAAA,EAAW;AACnD,MAAA,WAAA,CAAY,yBAAyB,UAAA,CAAW,sBAAA;AAAA,IAClD;AACA,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,WAAW,CAAA;AAC/C,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAA,CAAU,OAAA,EAAiB,KAAA,EAA4C;AAC3E,IAAA,MAAM,cAAA,GAGF;AAAA,MACF,YAAA,EAAc;AAAA,KAChB;AACA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,cAAA,CAAe,KAAA,GAAQ,KAAA;AAAA,IACzB;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA;AAAA,MAC1B,OAAA;AAAA,MACA,uBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,CAAQ,OAAA,EAAiB,QAAA,EAAoC;AACjE,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,MACV,OAAA;AAAA,MACA,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA;AAAA,MACrD,EAAE,cAAc,IAAA;AAAK,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,UAAA,CACJ,OAAA,EACA,QAAA,EACA,OAAA,EACkB;AAClB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,OAAA;AAAA,MACA,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAA;AAAA,MACrD,OAAA;AAAA,MACA,EAAE,cAAc,IAAA;AAAK,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAA,CACJ,OAAA,EACA,UACA,QAAA,EACA,OAAA,GAAkC,EAAC,EACjB;AAClB,IAAA,MAAM,QAAA,GAAW,MAAMA,GAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAO,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC3C;AACA,IAAA,MAAM,QAAA,GAAWC,KAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AACvC,IAAA,MAAM,WAAA,GAAc,MAAMD,GAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AAC9C,IAAA,MAAM,qBAAqB,MAA4B;AACrD,MAAA,MAAM,KAAA,GAAyB;AAAA,QAC7B;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,WAAA;AAAA,UACN,QAAA,EAAU,QAAA;AAAA,UACV,WAAA,EAAa;AAAA;AACf,OACF;AACA,MAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO;AAAA,SACrC,CAAA;AAAA,MACH;AACA,MAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,MAAA,CAAO,OAAA,CAAQ,OAAO;AAAA,SAC7B,CAAA;AAAA,MACH;AACA,MAAA,OAAO,0BAA0B,KAAK,CAAA;AAAA,IACxC,CAAA;AACA,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,MACV,OAAA;AAAA,MACA,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAA;AAAA,MACrD,kBAAA;AAAA,MACA,EAAE,cAAc,IAAA;AAAK,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBAAoB,OAAA,EAA8C;AACtE,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,MACV,OAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,UAAA,CACJ,OAAA,EACA,OAAA,EACyB;AACzB,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,OAAA,EAAS;AAAA,MAClD,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,YAAA,CACZ,OAAA,EACA,GAAA,EACA,MACA,OAAA,EAMY;AACZ,IAAA,MAAM,OAAA,GACJ,SAAS,OAAA,KAAY,MAAA,GACjB,QAAQ,OAAA,GACR,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,EAAW;AACzC,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,OAAA,EAAS,KAAA;AACzC,IAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,KAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,SAAS,WAAA,IAAe,kBAAA;AAAA,QACxC,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,QACzB,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK;AAAA;AAC1C,KACD,CAAA;AAED,IAAA,IAAI,gBAAA,CAAoB,QAAA,CAAS,IAAI,CAAA,EAAG;AACtC,MAAA,MAAM,SAAS,QAAA,CAAS,IAAA;AACxB,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,KAAS,mBAAA,EAAqB;AACzD,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,KAAS,gBAAA,IAAoB,YAAA,EAAc;AACpD,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,SAAA,CAAU,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,QAC9D;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACrD,QAAA,OAAO,IAAA,CAAK,YAAA,CAAgB,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM;AAAA,UAC9C,GAAG,OAAA;AAAA,UACH,OAAA,EAAS,WAAA;AAAA,UACT,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,QAAA,MAAM,IAAI,SAAA,CAAU,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,MAC9D;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,sBAAA,EAAwB;AAC1C,QAAA,MAAM,IAAI,eAAA,CAAgB,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,MACpE;AACA,MAAA,MAAM,IAAI,QAAA,CAAS,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,gBAAA,IAAoB,YAAA,EAAc;AACxD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,2BAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAA,CAAS;AAAA,SACX;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACrD,MAAA,OAAO,IAAA,CAAK,YAAA,CAAgB,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM;AAAA,QAC9C,GAAG,OAAA;AAAA,QACH,OAAA,EAAS,WAAA;AAAA,QACT,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AACA,IAAA,IAAI,QAAA,CAAS,WAAW,gBAAA,EAAkB;AACxC,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,2BAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA,CAAS;AAAA,OACX;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,WAAW,sBAAA,EAAwB;AAC9C,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,oBAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA,CAAS;AAAA,OACX;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,QAAA,CAAS,SAAS,GAAA,EAAK;AACnD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AACA,IAAA,MAAM,IAAI,QAAA;AAAA,MACR,CAAA,4BAAA,EAA+B,SAAS,MAAM,CAAA,CAAA;AAAA,MAC9C,MAAA;AAAA,MACA,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAc,gBAAgB,OAAA,EAQH;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA,EAAS,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA;AAAA,QACzC,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,GAAI,QAAQ,aAAA,KAAkB,KAAA,CAAA,GAC1B,EAAE,aAAA,EAAe,OAAA,CAAQ,aAAA,EAAc,GACvC,EAAC;AAAA,QACL,GAAI,QAAQ,gBAAA,KAAqB,KAAA,CAAA,GAC7B,EAAE,gBAAA,EAAkB,OAAA,CAAQ,gBAAA,EAAiB,GAC7C;AAAC,OACP;AACA,MAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,QAAA,MAAM,OAAA,GAAU;AAAA,UACd,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,IAAA,IAAQ,qBAAA;AAAA,UAC/B,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,gBAAA,CAAiB,QAAQ,OAAO,CAAC,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA;AAAA,SACtE,CAAE,KAAK,KAAK,CAAA;AACZ,QAAA,MAAM,IAAI,QAAA,CAAS,OAAA,EAAS,MAAA,EAAW,KAAA,CAAM,UAAU,MAAM,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,qBAAA,CACZ,OAAA,EACA,GAAA,EACA,WACA,OAAA,EAKY;AACZ,IAAA,MAAM,OAAA,GACJ,SAAS,OAAA,KAAY,MAAA,GACjB,QAAQ,OAAA,GACR,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,EAAW;AACzC,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,OAAA,EAAS,KAAA;AACzC,IAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,KAAA;AAC9C,IAAA,MAAM,gBAAgB,SAAA,EAAU;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAM,aAAA,CAAc,IAAA;AAAA,MACpB,aAAA,EAAe,QAAA;AAAA,MACf,gBAAA,EAAkB,QAAA;AAAA,MAClB,OAAA,EAAS;AAAA,QACP,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,QACzB,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,QACxC,gBAAgB,aAAA,CAAc,WAAA;AAAA,QAC9B,gBAAA,EAAkB,MAAA,CAAO,aAAA,CAAc,aAAa;AAAA;AACtD,KACD,CAAA;AAED,IAAA,IAAI,gBAAA,CAAoB,QAAA,CAAS,IAAI,CAAA,EAAG;AACtC,MAAA,MAAM,SAAS,QAAA,CAAS,IAAA;AACxB,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,KAAS,mBAAA,EAAqB;AACzD,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,KAAS,gBAAA,IAAoB,YAAA,EAAc;AACpD,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,SAAA,CAAU,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,QAC9D;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACrD,QAAA,OAAO,IAAA,CAAK,qBAAA,CAAyB,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW;AAAA,UAC5D,GAAG,OAAA;AAAA,UACH,OAAA,EAAS,WAAA;AAAA,UACT,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,QAAA,MAAM,IAAI,SAAA,CAAU,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,MAC9D;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,sBAAA,EAAwB;AAC1C,QAAA,MAAM,IAAI,eAAA,CAAgB,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,MACpE;AACA,MAAA,MAAM,IAAI,QAAA,CAAS,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,gBAAA,IAAoB,YAAA,EAAc;AACxD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,2BAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAA,CAAS;AAAA,SACX;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACrD,MAAA,OAAO,IAAA,CAAK,qBAAA,CAAyB,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW;AAAA,QAC5D,GAAG,OAAA;AAAA,QACH,OAAA,EAAS,WAAA;AAAA,QACT,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AACA,IAAA,IAAI,QAAA,CAAS,WAAW,gBAAA,EAAkB;AACxC,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,2BAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA,CAAS;AAAA,OACX;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,WAAW,sBAAA,EAAwB;AAC9C,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,oBAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA,CAAS;AAAA,OACX;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,QAAA,CAAS,SAAS,GAAA,EAAK;AACnD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AACA,IAAA,MAAM,IAAI,QAAA;AAAA,MACR,CAAA,4BAAA,EAA+B,SAAS,MAAM,CAAA,CAAA;AAAA,MAC9C,MAAA;AAAA,MACA,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,WAAA,CACZ,OAAA,EACA,GAAA,EACA,OAAA,EAMY;AACZ,IAAA,MAAM,OAAA,GACJ,SAAS,OAAA,KAAY,MAAA,GACjB,QAAQ,OAAA,GACR,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,EAAW;AACzC,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,OAAA,EAAS,KAAA;AACzC,IAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,KAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ;AAAA,MACvC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,iBAAiB,OAAO,CAAA;AAAA,MACjC,GAAA;AAAA,MACA,QAAQ,OAAA,EAAS,KAAA;AAAA,MACjB,OAAA,EAAS;AAAA,QACP,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,QACzB,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK;AAAA;AAC1C,KACD,CAAA;AACD,IAAA,IAAI,gBAAA,CAAoB,QAAA,CAAS,IAAI,CAAA,EAAG;AACtC,MAAA,MAAM,SAAS,QAAA,CAAS,IAAA;AACxB,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,KAAS,mBAAA,EAAqB;AACzD,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,KAAS,gBAAA,IAAoB,YAAA,EAAc;AACpD,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,SAAA,CAAU,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,QAC9D;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACrD,QAAA,OAAO,IAAA,CAAK,WAAA,CAAe,OAAA,EAAS,GAAA,EAAK;AAAA,UACvC,GAAG,OAAA;AAAA,UACH,OAAA,EAAS,WAAA;AAAA,UACT,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,QAAA,MAAM,IAAI,SAAA,CAAU,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,MAC9D;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,sBAAA,EAAwB;AAC1C,QAAA,MAAM,IAAI,eAAA,CAAgB,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,MACpE;AACA,MAAA,MAAM,IAAI,QAAA,CAAS,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,QAAA,CAAS,SAAS,GAAA,EAAK;AACnD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB;AACA,IAAA,MAAM,IAAI,SAAS,CAAA,4BAAA,EAA+B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,MAAA,EAAW,SAAS,MAAM,CAAA;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,qBAAA,CACZ,OAAA,EACA,OAAA,EACA,OAAA,EAKyB;AACzB,IAAA,MAAM,OAAA,GACJ,SAAS,OAAA,KAAY,MAAA,GACjB,QAAQ,OAAA,GACR,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,EAAW;AACzC,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,OAAA,EAAS,KAAA;AACzC,IAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,KAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ;AAAA,MACvC,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAA,EAAS,iBAAiB,OAAO,CAAA;AAAA,MACjC,KAAK,OAAA,CAAQ,IAAA;AAAA,MACb,QAAQ,OAAA,CAAQ,KAAA;AAAA,MAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAA,EAAS;AAAA,QACP,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,QACzB,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,QACxC,GAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,GACjB,EAAE,gBAAgB,OAAA,CAAQ,WAAA,IAAe,kBAAA,EAAmB,GAC5D;AAAC;AACP,KACD,CAAA;AAED,IAAA,IAAI,wBAAA,CAAyB,QAAQ,CAAA,IAAK,YAAA,EAAc;AACtD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,2BAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAA,CAAS;AAAA,SACX;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACrD,MAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,OAAA,EAAS;AAAA,QAClD,GAAG,OAAA;AAAA,QACH,OAAA,EAAS,WAAA;AAAA,QACT,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,MAAM,QAAA,CAAS;AAAA,KACjB;AAAA,EACF;AACF,CAAA;AAQA,SAAS,yBAAyB,QAAA,EAA2C;AAC3E,EAAA,IAAI,QAAA,CAAS,WAAW,gBAAA,EAAkB;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,gBAAA,CAA0B,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5C,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,KAAS,gBAAA;AAAA,EAChC;AACA,EAAA,OAAO,KAAA;AACT;;;ACjxBA,IAAME,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAW7C,SAAS,eAAA,GAGP;AACA,EAAA,KAAA,MAAW,SAAA,IAAa,CAAC,oBAAA,EAAsB,iBAAiB,CAAA,EAAG;AACjE,IAAA,IAAI;AACF,MAAA,OAAOA,SAAQ,SAAS,CAAA;AAAA,IAI1B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAO,KAAA,YAAiB,KAAA,IAAS,MAAA,IAAU,KAAA,GAC5C,MAAgC,IAAA,GACjC,MAAA;AACJ,MAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAEA,IAAM,cAAc,eAAA,EAAgB;AAK7B,IAAM,QAAA,GAAW,YAAY,IAAA,IAAQ,0BAAA;AAKrC,IAAM,WAAA,GAAc,YAAY,OAAA,IAAW,OAAA;AAK3C,IAAM,eAAA,GAAkB,+BAAA;AAKxB,IAAM,iBAAA,GAAoB,mDAAA;AAEjC,IAAM,eAAA,GAAkB,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AA2E9B,SAAS,aAAa,KAAA,EAAuB;AAClD,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACxC,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAE,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,gBAAgB,KAAA,EAAwC;AACtE,EAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACxC,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,IAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,qBAAqB,OAAA,EAGnC;AACA,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,OAAA,CAAQ,MAAM,CAAA;AAC/C,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,GAAI,QAAQ,EAAA,GAAK,EAAE,IAAI,OAAA,CAAQ,EAAA,KAAO;AAAC,GACzC;AACF;AAQO,SAAS,cAAc,KAAA,EAAwB;AACpD,EAAA,OAAO,QAAQ,WAAA,GAAc,SAAA;AAC/B;AAOO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,QAAQ,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,IAAK,CAAC,QAAQ,GAAA,CAAI,QAAA;AACvD;AASO,SAAS,QAAA,CAAS,MAAc,IAAA,EAAsB;AAC3D,EAAA,IAAI,CAAC,eAAc,EAAG;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,KAAA,EAAU,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,OAAA,CAAA;AAC/B;AAKO,SAAS,cAAA,GAAuB;AACrC,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,SAAA,EAAW,SAAS,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,UAAA,EAAY,MAAM,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,CAAA,CAAA,EAAI,WAAW,IAAI,MAAM,CAAA;AAClD,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,eAAA,EAAiB,MAAM,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,eAAA,EAAiB,MAAM,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,EAAK,IAAI,CAAA;AAClC,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA,GACxE;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,iBAAA,EAAmB,IAAI,CAAC,CAAA;AAC/C;AAQO,SAAS,YAAA,CAAa,KAAA,EAAe,SAAA,GAAY,MAAA,EAAc;AACpE,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,QAAA,CAAS,GAAG,eAAe,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,eAAe,IAAI,SAAS;AAAA,GACtE;AACF;AAQO,SAAS,UAAA,CAAW,OAAe,KAAA,EAAqB;AAC7D,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAC3C,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AACzC;AAQO,SAAS,aAAa,KAAA,EAAwB;AACnD,EAAA,OAAO,QAAQ,QAAA,CAAS,WAAA,EAAa,MAAM,CAAA,GAAI,QAAA,CAAS,WAAW,MAAM,CAAA;AAC3E;AAUO,SAAS,oBAAA,CACd,KAAA,EACA,UAAA,EACA,QAAA,EACoB;AACpB,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,IAAK,QAAA;AACrD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,iBAAiB,QAAQ,CAAA;AAClC;AASA,eAAsB,oBAAA,CACpB,cACA,OAAA,EAUC;AACD,EAAA,MAAM,aAAA,GAAgB,MAAM,YAAA,CAAa,SAAA,EAAU;AACnD,EAAA,MAAM,uBAAA,GACJ,SAAS,WAAA,IACT,OAAA,EAAS,OACT,aAAA,CAAc,WAAA,IACd,6BAA4B,CAAE,IAAA;AAChC,EAAA,MAAM,MAAA,GAAS,2BAAA;AAAA,IACb,uBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,gBAAA,GAAmB,sBAAA,CAAuB,aAAA,EAAe,MAAM,CAAA;AACrE,EAAA,MAAM,OAAA,GAAU,oBAAA;AAAA,IACd,OAAA,EAAS,OAAA;AAAA,IACT,gBAAA;AAAA,IACA,gBAAA,CAAiB;AAAA,GACnB;AACA,EAAA,MAAM,UAAA,GAAa,oBAAA;AAAA,IACjB,OAAA,EAAS,UAAA;AAAA,IACT,oBAAA;AAAA,IACA,iBAAiB,UAAA,IAAc;AAAA,GACjC;AAEA,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAG,gBAAA;AAAA,IACH,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY,EAAC;AAAA,IAC7B,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe;AAAC,GACrC;AACA,EAAA,MAAM,UAAA,GACJ,UAAA,CAAW,WAAA,KAAgB,aAAA,CAAc,WAAA,IACzC,UAAA,CAAW,OAAA,KAAY,aAAA,CAAc,OAAA,IACrC,UAAA,CAAW,UAAA,KAAe,aAAA,CAAc,UAAA;AAC1C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,YAAA,CAAa,WAAW,UAAU,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,UAAA;AAAA,IACR,OAAA;AAAA,IACA;AAAA,GACF;AACF;AASA,eAAsB,wBAAA,CACpB,cACA,OAAA,EAIC;AACD,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,YAAA,EAAc,OAAO,CAAA;AACjE,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,EAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,UAAA,EAAW;AAC9C,EAAA,MAAM,0BAAA,GAA6B,OAAA;AAAA,IACjC,SAAS,OAAA,IACP,OAAA,EAAS,OACT,OAAA,EAAS,WAAA,IACT,QAAQ,GAAA,CAAI;AAAA,GAChB;AACA,EAAA,MAAM,OAAA,GACJ,0BAAA,GACK,QAAA,CAAS,OAAA,IAAW,OAAO,OAAA,IAAW,2BAAA,EAA4B,CAAE,OAAA,GACpE,OAAA,EAAS,OAAA,IAAW,MAAA,CAAO,OAAA,IAAW,6BAA4B,CAAE,OAAA;AAC3E,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,IAAI,aAAA,CAAc;AAAA,MACxB,YAAA;AAAA,MACA,GAAI,OAAO,SAAA,KAAc,MAAA,GACrB,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GAC9B;AAAC,KACN;AAAA,GACH;AACF;;;ACrWA,IAAM,eAAA,uBAAsB,GAAA,CAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,QAAQ,CAAC,CAAA;AACzE,IAAM,YAAA,mBAAe,IAAI,GAAA,CAAI,CAAC,KAAK,CAAC,CAAA;AACpC,IAAM,qBAAA,GAAwB;AAAA,EAC5B,uBAAA;AAAA,EACA,0BAAA;AAAA,EACA,0BAAA;AAAA,EACA,4BAAA;AAAA,EACA;AACF,CAAA;AAQO,SAAS,kBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,OAAA,CACG,QAAQ,KAAK,CAAA,CACb,WAAA,CAAY,gDAAgD,EAC5D,QAAA,CAAS,UAAA,EAAY,4CAA4C,CAAA,CACjE,SAAS,QAAA,EAAU,kDAAkD,CAAA,CACrE,MAAA,CAAO,gBAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,qBAAA,EAAuB,wCAAwC,EACtE,MAAA,CAAO,oBAAA,EAAsB,sBAAsB,CAAA,CACnD,OAAO,uBAAA,EAAyB,sBAAsB,EACtD,MAAA,CAAO,WAAA,EAAa,kCAAkC,CAAA,CACtD,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CACC,OAAO,aAAA,EAAe,iCAAiC,EACvD,MAAA,CAAO,OAAO,MAAA,EAAgBD,KAAAA,EAAc,OAAA,KAA+B;AAC1E,IAAA,MAAM,aAAA,CAAc,OAAA,EAAS,MAAA,EAAQA,KAAAA,EAAM,OAAO,CAAA;AAAA,EACpD,CAAC,CAAA;AACL;AAUA,eAAe,aAAA,CACb,OAAA,EACA,MAAA,EACAA,KAAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AACnD,EAAA,MAAM,cAAA,GAAiB,iBAAiBA,KAAI,CAAA;AAC5C,EAAA,mBAAA,CAAoB,gBAAgB,CAAA;AACpC,EAAA,iBAAA,CAAkB,cAAc,CAAA;AAChC,EAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,gBAAgB,CAAA,IAAK,CAAC,QAAQ,OAAA,EAAS;AAC3D,IAAA,MAAM,IAAI,yBAAA;AAAA,MACR,CAAA,cAAA,EAAiB,gBAAgB,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,wBAAA;AAAA,IAChC,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS;AAAA,IAChD,MAAA,EAAQ,gBAAA;AAAA,IACR,IAAA,EAAM,cAAA;AAAA,IACN,GAAI,OAAA,CAAQ,SAAA,GACR,EAAE,KAAA,EAAO,gBAAgB,OAAA,CAAQ,SAAS,CAAA,EAAE,GAC5C,EAAC;AAAA,IACL,GAAI,OAAA,CAAQ,QAAA,GAAW,EAAE,IAAA,EAAM,eAAe,OAAA,CAAQ,QAAQ,CAAA,EAAE,GAAI,EAAC;AAAA,IACrE,GAAI,QAAQ,WAAA,GAAc,EAAE,aAAa,OAAA,CAAQ,WAAA,KAAgB;AAAC,GACnE,CAAA;AACD,EAAA,SAAA,CAAU,QAAA,EAAU,oBAAA,CAAqB,OAAO,CAAC,CAAA;AACnD;AAQA,SAAS,iBAAiB,KAAA,EAAuB;AAC/C,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,6BAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,4CAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,oBAAoB,MAAA,EAAsB;AACjD,EAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,2BAA2B,MAAM,CAAA,CAAA;AAAA,MAC1C,IAAA,EAAM,sBAAsB,KAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACnE,CAAA;AAAA,EACH;AACF;AAOA,SAAS,kBAAkBA,KAAAA,EAAoB;AAC7C,EAAA,IAAI,qBAAA,CAAsB,KAAK,CAAC,MAAA,KAAWA,MAAK,UAAA,CAAW,MAAM,CAAC,CAAA,EAAG;AACnE,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,IACxB,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,gCAAgCA,KAAI,CAAA,CAAA;AAAA,IAC7C,IAAA,EAAM,CAAA,kBAAA,EAAqB,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,GAC5D,CAAA;AACH;AAQA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AACzB;AC/IA,IAAM,WAAA,GAAc,WAAA;AACpB,IAAM,cAAA,GAAiB,IAAA;AACvB,IAAM,wBAAA,GAA2B,GAAA;AACjC,IAAM,wBAAA,GAA2B,GAAA;AACjC,IAAM,oCAAA,GAAuC,sCAAA;AAC7C,IAAMC,QAAAA,GAAUC,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAY7C,IAAM,cAAA,GAAiBD,SAAQ,iBAAiB,CAAA;AAEhD,SAAS,YAAA,CACP,UACA,OAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,mBAAmB,OAAA,EAAS;AAAA,IACvD,MAAA,EAAQ;AAAA,GACT,CAAA;AACD,EAAA,QAAA,CAAS,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AACtC;AAQA,SAAS,eAAA,CACP,UACA,OAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA;AAAA,EACF;AACA,EAAA,QAAA,CAAS,OAAO,CAAA;AAClB;AAOA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAQA,SAAS,uBAAuB,KAAA,EAAyB;AACvD,EAAA,OACE,KAAA,YAAiB,QAAA,IACjB,KAAA,CAAM,OAAA,CAAQ,WAAW,oCAAoC,CAAA;AAEjE;AAOA,SAAS,eAAA,GAA0B;AACjC,EAAA,OAAO,CAAA,EAAG,GAAG,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAQ,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,CAAA,CAAA;AAC9D;AAQA,SAAS,oBAAoB,KAAA,EAAuB;AAClD,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,cAAA,CAAe,SAAS,KAAA,EAAO,EAAE,OAAO,IAAA,EAAK,EAAG,CAAC,MAAA,KAAW;AAC1D,IAAA,QAAA,GAAW,MAAA;AAAA,EACb,CAAC,CAAA;AACD,EAAA,OAAO,QAAA;AACT;AAQA,SAAS,6BAAA,CACP,MACA,QAAA,EACM;AACN,EAAA,YAAA;AAAA,IACE,QAAA;AAAA,IACA,CAAA,iBAAA,EAAoB,IAAA,CAAK,QAAA,IAAY,gBAAgB,CAAA;AAAA,GACvD;AACA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,IAAA,CAAK,uBAAuB,CAAA;AAC/D,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,YAAA,CAAa,UAAU,uCAAuC,CAAA;AAC9D,IAAA,eAAA,CAAgB,QAAA,EAAU;AAAA,EAAK,MAAM;AAAA,CAAI,CAAA;AAAA,EAC3C;AACA,EAAA,YAAA,CAAa,QAAA,EAAU,CAAA,YAAA,EAAe,IAAA,CAAK,uBAAuB,CAAA,CAAE,CAAA;AACtE;AASA,SAAS,eAAA,CACP,MACA,SAAA,EACQ;AACR,EAAA,MAAM,cAAA,GACJ,OAAO,IAAA,CAAK,SAAA,KAAc,QAAA,IAAY,KAAK,SAAA,GAAY,CAAA,GACnD,IAAA,CAAK,SAAA,GAAY,GAAA,GACjB,SAAA;AACN,EAAA,OAAO,KAAK,GAAA,EAAI,GAAI,IAAA,CAAK,GAAA,CAAI,WAAW,cAAc,CAAA;AACxD;AAQA,SAAS,sBAAsB,IAAA,EAAqC;AAClE,EAAA,IAAI,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,IAAY,IAAA,CAAK,YAAY,CAAA,EAAG;AAC3D,IAAA,OAAO,wBAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAO,IAAA,CAAK,WAAW,GAAI,CAAA;AAC7C;AASA,SAAS,YAAA,CAAa,SAAiB,OAAA,EAAqC;AAC1E,EAAA,MAAM,WAAW,OAAA,CAAQ,WAAA;AACzB,EAAA,IAAI,CAAC,QAAA,EAAU,KAAA,IAAS,CAAC,SAAS,YAAA,EAAc;AAC9C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAyB;AAAA,IAC7B,OAAA;AAAA,IACA,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,UAAA,EAAY,cAAA;AAAA,IACZ,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACpC;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,IAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,EAC3B;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,EAAA,KAAO,MAAA,EAAW;AACpC,IAAA,OAAA,CAAQ,MAAA,GAAS,QAAQ,MAAA,CAAO,EAAA;AAAA,EAClC;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,EAAQ,IAAA,IAAQ,QAAQ,MAAA,EAAQ,QAAA;AACzD,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,OAAA,CAAQ,QAAA,GAAW,QAAA;AAAA,EACrB;AACA,EAAA,IAAI,QAAA,CAAS,oBAAoB,MAAA,EAAW;AAC1C,IAAA,OAAA,CAAQ,kBAAkB,QAAA,CAAS,eAAA;AAAA,EACrC;AACA,EAAA,IAAI,QAAA,CAAS,2BAA2B,MAAA,EAAW;AACjD,IAAA,OAAA,CAAQ,yBAAyB,QAAA,CAAS,sBAAA;AAAA,EAC5C;AACA,EAAA,OAAO,OAAA;AACT;AAYA,eAAe,0BAAA,CACb,SAAA,EACA,OAAA,EACA,IAAA,EACA,WACA,QAAA,EACsB;AACtB,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,EAAM,SAAS,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,sBAAsB,IAAI,CAAA;AAC7C,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,IAAK,QAAA,EAAU;AAC7B,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,SAAA,CAAU,iBAAA,CAAkB,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,IACnE,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,CAAC,sBAAA,CAAuB,KAAK,CAAA,EAAG;AAClC,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,YAAA,CAAa,UAAU,uCAAuC,CAAA;AAAA,IAChE;AACA,IAAA,MAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,IAAA,CAAK,GAAA,EAAK,CAAC,CAAC,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AACpE;AASA,eAAe,mBAAA,CACb,SACA,YAAA,EAKC;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,EAAU;AAC5C,EAAA,MAAM,OAAA,GAAU,gBAAA;AAAA,IACd,QAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,cAAA,IAAkB,OAAO,OAAA,IAAW;AAAA,GACrE;AACA,EAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,SAAA,IAAa,MAAA,CAAO,SAAA,IAAa,wBAAA;AAE3C,EAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,SAAA,IACR,IAAI,aAAA,CAAc;AAAA,IAChB,YAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,EAAY;AAAA,GACb,CAAA;AACH,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAYA,eAAsB,8BAAA,CACpB,SACA,YAAA,EACyC;AACzC,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,KAAc,MAAM,mBAAA;AAAA,IAC9C,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,0CAA0C,CAAA;AAC3E,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAU,mBAAA,CAAoB,OAAA,EAAS;AAAA,IACxD,MAAA,EAAQ,WAAA;AAAA,IACR,YAAY,eAAA;AAAgB,GAC7B,CAAA;AACD,EAAA,MAAM,aAAa,UAAA,CAAW;AAAA,IAC5B,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAUA,eAAsB,4BAAA,CACpB,OAAA,EACA,YAAA,EACA,UAAA,EACwB;AACxB,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,KAAc,MAAM,mBAAA;AAAA,IAC9C,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,IAAA,GAA8B;AAAA,IAClC,UAAA;AAAA,IACA,uBAAA,EAAyB;AAAA,GAC3B;AACA,EAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,0CAA0C,CAAA;AAC3E,EAAA,MAAM,UAAU,MAAM,0BAAA;AAAA,IACpB,SAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AACA,EAAA,OAAO,gBAAA,CAAiB,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS,cAAc,OAAO,CAAA;AAC5E;AASA,eAAsB,QAAA,CACpB,SACA,YAAA,EACwB;AACxB,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,KAAc,MAAM,mBAAA;AAAA,IAC9C,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,WAAA,GACJ,OAAA,CAAQ,WAAA,KACP,OAAO,GAAA,KAAgB;AACtB,IAAA,MAAM,IAAA,CAAK,GAAA,EAAK,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,EACjC,CAAA,CAAA;AAEF,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,8BAAA,CAA+B,SAAS,YAAY,CAAA;AAC3E,EAAA,6BAAA,CAA8B,IAAA,EAAM,QAAQ,UAAU,CAAA;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,CAAY,KAAK,uBAAuB,CAAA;AAAA,EAChD,SAAS,KAAA,EAAO;AACd,IAAA,YAAA;AAAA,MACE,OAAA,CAAQ,UAAA;AAAA,MACR,CAAA,yDAAA,EAA4D,KAAK,uBAAuB,CAAA;AAAA,KAC1F;AAAA,EACF;AACA,EAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,0CAA0C,CAAA;AAC3E,EAAA,MAAM,UAAU,MAAM,0BAAA;AAAA,IACpB,SAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AACA,EAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,wCAAwC,CAAA;AACzE,EAAA,OAAO,gBAAA,CAAiB,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS,cAAc,OAAO,CAAA;AAC5E;AAYA,eAAe,gBAAA,CACb,OAAA,EACA,SAAA,EACA,OAAA,EACA,cACA,OAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,EAAU;AAC5C,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAC7C,EAAA,MAAM,UAAA,GAIF;AAAA,IACF,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,IAAU,MAAA,CAAO,aAAA;AAC/C,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,UAAA,CAAW,aAAA,GAAgB,aAAA;AAAA,EAC7B;AACA,EAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,wCAAwC,CAAA;AACzE,EAAA,MAAM,YAAA,CAAa,WAAW,UAAU,CAAA;AACxC,EAAA,MAAM,YAAA,CAAa,YAAY,OAAO,CAAA;AACtC,EAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,4BAA4B,CAAA;AAC7D,EAAA,OAAO,OAAA;AACT;ACzaO,IAAM,eAAA,GAAkB,qBAAA;AACxB,IAAM,gBAAA,GAAmB,UAAA;AACzB,IAAM,iBAAA,GAAoB,OAAA;AAC1B,IAAM,iBAAA,GAAoB,UAAA;AAE1B,IAAM,eAAA,GAAkB,SAAA;AACxB,IAAM,iBAAA,GAAoB,gBAAA;AAC1B,IAAM,wBAAA,GAA2B,WAAA;AACjC,IAAM,kBAAA,GAAqB,0BAAA;AAC3B,IAAM,gBAAA,GAAmB,wBAAA;AAEhC,SAAS,kBAAA,GAA6B;AACpC,EAAA,IAAI,aAAaD,KAAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC5D,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AACtD,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACzC,IAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AACA,IAAA,UAAA,GAAa,SAAA;AAAA,EACf;AACF;AAEA,IAAM,eAAe,kBAAA,EAAmB;AAEjC,IAAM,6BAA6BA,KAAAA,CAAK,IAAA;AAAA,EAC7C,YAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,oCAAoCA,KAAAA,CAAK,IAAA;AAAA,EACpD,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,6BAA6BA,KAAAA,CAAK,IAAA;AAAA,EAC7C,0BAAA;AAAA,EACA;AACF,CAAA;AAEA,eAAsB,sBAAA,GAA0C;AAC9D,EAAA,OAAOD,GAAAA,CAAG,QAAA,CAAS,0BAAA,EAA4B,MAAM,CAAA;AACvD;AAEA,eAAsB,8BAAA,GAAkD;AACtE,EAAA,MAAM,OAAA,GAAU,MAAMA,GAAAA,CAAG,QAAA,CAAS,mCAAmC,MAAM,CAAA;AAC3E,EAAA,OAAO,GAAG,kBAAkB;AAAA,EAAK,OAAA,CAAQ,MAAM;AAAA,EAAK,gBAAgB,CAAA,CAAA;AACtE;AAEA,eAAsB,uBAAA,GAA2C;AAC/D,EAAA,OAAOA,GAAAA,CAAG,QAAA,CAAS,0BAAA,EAA4B,MAAM,CAAA;AACvD;AAEO,SAAS,kBAAA,CAAmB,SAAiB,KAAA,EAAuB;AACzE,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AACjD,EAAA,IAAI,UAAA,KAAe,EAAA,IAAM,QAAA,KAAa,EAAA,IAAM,YAAY,UAAA,EAAY;AAClE,IAAA,MAAM,SAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,UAAU,EAAE,OAAA,EAAQ;AACpD,IAAA,MAAM,QAAQ,OAAA,CACX,KAAA,CAAM,WAAW,gBAAA,CAAiB,MAAM,EACxC,SAAA,EAAU;AACb,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAK,EAAG,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AAC5E,IAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC;AAAA,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,EAAM;AAAA,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,GAAG,OAAO;;AAAA,EAAO,KAAA,CAAM,MAAM;AAAA,CAAA;AACtC;AAEO,SAAS,mBAAmB,OAAA,EAAyB;AAC1D,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AACjD,EAAA,IAAI,UAAA,KAAe,EAAA,IAAM,QAAA,KAAa,EAAA,IAAM,WAAW,UAAA,EAAY;AACjE,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,UAAU,EAAE,OAAA,EAAQ;AACpD,EAAA,MAAM,QAAQ,OAAA,CACX,KAAA,CAAM,WAAW,gBAAA,CAAiB,MAAM,EACxC,SAAA,EAAU;AACb,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC;AAAA,CAAA;AAC9B;;;AC5EA,IAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAKxC,IAAM,eAAA,GAAkB,OAAA;AAQxB,IAAM,kBAAA,GAAqB;AAAA,EACzB,iBAAA;AAAA,EACA;AACF,CAAA;AAQA,IAAM,8BAAA,GAAiC;AAAA,EACrC,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA;AASA,IAAM,uBAAA,GAA0B,+BAAA;AAKhC,IAAM,YAAA,GAAe,MAAA;AAmHrB,SAAS,eAAe,OAAA,EAA0B;AAChD,EAAA,OAAO,OAAA,IAAWI,GAAG,OAAA,EAAQ;AAC/B;AAQO,SAAS,oBAAoB,OAAA,EAAgC;AAClE,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAA,OAAO;AAAA,IACL,cAAA,EAAgBH,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,eAAe,CAAA;AAAA,IAC/C,cAAA,EAAgBA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,iBAAiB,gBAAgB,CAAA;AAAA,IACjE,wBAAwBA,KAAAA,CAAK,IAAA;AAAA,MAC3B,IAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,eAAA,EAAiBA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,mBAAmB,iBAAiB,CAAA;AAAA,IACrE,iBAAiBA,KAAAA,CAAK,IAAA;AAAA,MACpB,IAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,mBAAmBA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,WAAA,EAAa,UAAU,iBAAiB,CAAA;AAAA,IAC3E,mBAAmBA,KAAAA,CAAK,IAAA;AAAA,MACtB,IAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAQA,SAAS,6BAA6B,OAAA,EAA4B;AAChE,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,eAAe,CAAA;AAClD,EAAA,OAAO,CAACA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,iBAAiB,CAAC,CAAA;AAClD;AAQA,SAAS,8BAA8B,OAAA,EAA4B;AACjE,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,iBAAiB,CAAA;AACpD,EAAA,OAAO,CAACA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,iBAAiB,CAAC,CAAA;AAClD;AAWA,SAAS,gCAAgC,OAAA,EAA4B;AACnE,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,aAAa,QAAQ,CAAA;AACxD,EAAA,OAAO,CAACA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,iBAAiB,CAAC,CAAA;AAClD;AAQA,SAAS,kBAAkB,OAAA,EAAkD;AAC3E,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAA,OAAO;AAAA,IACL,OAAO,CAACA,KAAAA,CAAK,KAAK,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IAC3C,QAAQ,CAACA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,iBAAiB,CAAC,CAAA;AAAA,IAC3C,UAAU,CAACA,KAAAA,CAAK,KAAK,IAAA,EAAM,WAAA,EAAa,QAAQ,CAAC;AAAA,GACnD;AACF;AAQA,SAAS,4BAA4B,KAAA,EAA2C;AAC9E,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC/C,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,cAAA,GAAiB,0BAAA,CAA2B,IAAA,CAAK,IAAI,CAAA;AAC3D,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,EAAE;AAAA,KACpC;AAAA,EACF,CAAC,CAAA;AACH;AAQA,SAAS,2BAA2B,QAAA,EAA0B;AAC5D,EAAA,MAAM,UAAU,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AACzD,EAAA,IAAI,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAE,KAAK,CAAC,QAAA,KAAa,QAAA,KAAa,IAAI,CAAA,EAAG;AAC5D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAE,CAAA;AAAA,EACzD;AACA,EAAA,MAAM,cAAA,GAAiBA,KAAAA,CAAK,KAAA,CAAM,SAAA,CAAU,OAAO,CAAA;AACnD,EAAA,IACE,CAAC,cAAA,IACD,cAAA,KAAmB,GAAA,IACnB,eAAe,UAAA,CAAW,GAAG,CAAA,IAC7B,cAAA,CAAe,WAAW,KAAK,CAAA,IAC/B,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,EAC9B;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAE,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,cAAA;AACT;AAQO,SAAS,oBACd,OAAA,EACiB;AACjB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,IAAA,OAAO,CAAC,KAAK,CAAA;AAAA,EACf;AACA,EAAA,MAAM,UAAA,GAAa,OAAA,CAChB,OAAA,CAAQ,CAAC,MAAA,KAAW,OAAO,KAAA,CAAM,GAAG,CAAC,CAAA,CACrC,GAAA,CAAI,CAAC,WAAW,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAa,CAAA,CAC3C,OAAO,CAAC,MAAA,KAAW,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACvC,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,CAAC,KAAK,CAAA;AAAA,EACf;AACA,EAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,MAAA,KAAW;AAChC,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,aAAA,EAAe;AAClD,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,qBAAA,EAAuB;AAC3D,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,IAAI,MAAA,KAAW,UAAA,IAAc,MAAA,KAAW,WAAA,EAAa;AACnD,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,MAAM,CAAA,CAAE,CAAA;AAAA,EACrD,CAAC,CAAA;AACH;AAQO,SAAS,qBAAqB,OAAA,EAA0C;AAC7E,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,CAAC,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA;AAAA,EACvC;AACA,EAAA,MAAM,OAAuB,EAAC;AAC9B,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7B,IAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EACnB;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC9B,IAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,EACpB;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AAChC,IAAA,IAAA,CAAK,KAAK,UAAU,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,uBAAuB,OAAA,EAAiC;AACtE,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAC1B;AAOA,eAAsB,sBAAA,GAEpB;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,UAAA,EAAY,YAAY,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC9D,eAAe,OAAO,CAAA;AAAA,IACtB,eAAe,QAAQ,CAAA;AAAA,IACvB,eAAe,UAAU;AAAA,GAC1B,CAAA;AACD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,SAAA,EAAW,QAAQ,SAAS,CAAA;AAAA,MAC5B,GAAI,SAAA,GAAY,EAAE,WAAA,EAAa,SAAA,KAAc;AAAC,KAChD;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW,QAAQ,UAAU,CAAA;AAAA,MAC7B,GAAI,UAAA,GAAa,EAAE,WAAA,EAAa,UAAA,KAAe;AAAC,KAClD;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW,QAAQ,YAAY,CAAA;AAAA,MAC/B,GAAI,YAAA,GAAe,EAAE,WAAA,EAAa,YAAA,KAAiB;AAAC;AACtD,GACF;AACF;AAQA,eAAsB,wBACpB,OAAA,EACyB;AACzB,EAAA,MAAM,QAAA,GAAW,qBAAqB,OAAO,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,EAAuB;AAC9C,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,SAAS,MAAA,CAAO,CAAC,WAAW,QAAA,CAAS,MAAM,EAAE,SAAS,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,QAAA;AACT;AAQA,eAAsB,kBAAkB,OAAA,EAEnB;AACnB,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAClD,EAAA,MAAM,qBAAA,CAAsBA,KAAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,cAAc,CAAC,CAAA;AAC9D,EAAA,MAAM,gBAAgB,MAAM,yBAAA;AAAA,IAC1B,0BAAA;AAAA,IACA,KAAA,CAAM;AAAA,GACR;AACA,EAAA,OAAO,aAAA;AACT;AAQA,eAAsB,0BAA0B,OAAA,EAE3B;AACnB,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAClD,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMD,GAAAA,CAAG,QAAA,CAAS,KAAA,CAAM,wBAAwB,MAAM,CAAA;AAAA,EAClE,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,8BAAA,EAA+B;AACtD,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,OAAA,EAAS,QAAQ,CAAA;AACjD,EAAA,OAAO,cAAA,CAAe,KAAA,CAAM,sBAAA,EAAwB,IAAA,EAAM,GAAK,CAAA;AACjE;AAQA,eAAsB,oBAAoB,OAAA,EAErB;AACnB,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAClD,EAAA,MAAM,qBAAA,CAAsBC,MAAK,IAAA,CAAK,cAAA,CAAe,SAAS,OAAO,CAAA,EAAG,iBAAiB,CAAC,CAAA;AAC1F,EAAA,MAAM,gBAAgB,MAAM,yBAAA;AAAA,IAC1B,0BAAA;AAAA,IACA,KAAA,CAAM;AAAA,GACR;AACA,EAAA,OAAO,aAAA;AACT;AAWA,eAAsB,sBAAsB,OAAA,EAEvB;AACnB,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAClD,EAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,iBAAiB,CAAA;AACvD,EAAA,MAAM,sBAAsB,UAAU,CAAA;AACtC,EAAA,MAAM,gBAAgB,MAAM,yBAAA;AAAA,IAC1B,0BAAA;AAAA,IACA,KAAA,CAAM;AAAA,GACR;AACA,EAAA,OAAO,aAAA;AACT;AAaA,eAAsB,yBAAA,CACpB,KAAA,EACA,OAAA,EACA,OAAA,EAGuC;AACvC,EAAA,MAAM,eAAA,GAAkB,4BAA4B,KAAK,CAAA;AACzD,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,OAAA,EAAS,OAAO,CAAA;AACtD,EAAA,MAAM,UAAwC,EAAC;AAC/C,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AACrE,IAAA,MAAM,QAAQ,MAAM,yBAAA,CAA0B,MAAA,EAAQ,WAAA,CAAY,MAAM,CAAC,CAAA;AACzE,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,sBAAsB,IAAI,CAAA;AAChC,MAAA,MAAM,6BAAA,CAA8B,MAAM,YAAY,CAAA;AACtD,MAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAClC,QAAA,MAAM,QAAQ,MAAM,cAAA;AAAA,UAClBA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAAA,UACzB,IAAA,CAAK,OAAA;AAAA,UACL;AAAA,SACF;AACA,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,YAAA,IAAgB,CAAA;AAAA,QAClB;AAAA,MACF;AACA,MAAA,MAAM,qBAAA,CAAsB,MAAM,YAAY,CAAA;AAAA,IAChD;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACT;AAYA,eAAe,yBAAA,CACb,SACA,KAAA,EACmB;AACnB,EAAA,OAAO,KAAA;AACT;AAQA,eAAsB,WAAW,OAAA,EAEP;AACxB,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,EAAuB;AAC9C,EAAA,MAAM;AAAA,IACJ,mBAAA;AAAA,IACA,2BAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IACpB,kBAAkB,OAAO,CAAA;AAAA,IACzB,0BAA0B,OAAO,CAAA;AAAA,IACjC,oBAAoB,OAAO,CAAA;AAAA,IAC3B,sBAAsB,OAAO;AAAA,GAC9B,CAAA;AACD,EAAA,MAAM,CAAC,kBAAA,EAAoB,mBAAA,EAAqB,qBAAqB,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACzF,4BAAA,CAA6B,SAAS,KAAK,CAAA;AAAA,IAC3C,6BAAA,CAA8B,SAAS,MAAM,CAAA;AAAA,IAC7C,+BAAA,CAAgC,SAAS,QAAQ;AAAA,GAClD,CAAA;AACD,EAAA,OAAO;AAAA,IACL,mBAAA;AAAA,IACA,2BAAA;AAAA,IACA,qBAAA;AAAA,IACA,uBAAA;AAAA,IACA,iBAAA,EAAmB,SAAS,KAAA,CAAM,SAAA;AAAA,IAClC,kBAAA,EAAoB,SAAS,MAAA,CAAO,SAAA;AAAA,IACpC,oBAAA,EAAsB,SAAS,QAAA,CAAS,SAAA;AAAA,IACxC,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA,qBAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA,EAAe;AAAA,MACb,uBAAA,EAAyB,0BAAA;AAAA,MACzB,uBAAA,EAAyB,0BAAA;AAAA,MACzB,8BAAA,EAAgC;AAAA;AAClC,GACF;AACF;AAQA,eAAsB,qBAAqB,OAAA,EAGd;AAC3B,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAClD,EAAA,MAAM;AAAA,IACJ,iBAAA;AAAA,IACA,yBAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF,GACE,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IAChB,oBAAA,CAAqB;AAAA,MACnB,GAAG,4BAAA,CAA6B,OAAA,EAAS,OAAO,CAAA;AAAA,MAChD,GAAG,kCAAkCA,KAAAA,CAAK,IAAA,CAAK,eAAe,OAAA,EAAS,OAAO,CAAA,EAAG,eAAe,CAAC;AAAA,KAClG,CAAA;AAAA,IACD,+BAAA,CAAgC,MAAM,sBAAsB,CAAA;AAAA,IAC5D,uBAAA,CAAwB,SAAS,SAAS,CAAA;AAAA,IAC1C,4BAAA,CAA6B,SAAS,OAAO,CAAA;AAAA,IAC7C,uBAAA,CAAwB,SAAS,OAAO;AAAA,GACzC,CAAA;AAEH,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,qBAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,GACF;AACF;AAQA,eAAsB,oBAAoB,OAAA,EAEhB;AACxB,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,EAAuB;AAC9C,EAAA,MAAM;AAAA,IACJ,mBAAA;AAAA,IACA,2BAAA;AAAA,IACA,qBAAA;AAAA,IACA,uBAAA;AAAA,IACA,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IACpB,UAAA,CAAW,MAAM,cAAc,CAAA;AAAA,IAC/B,UAAA,CAAW,MAAM,sBAAsB,CAAA;AAAA,IACvC,4BAAA,CAA6B,SAAS,OAAO,CAAA;AAAA,IAC7C,8BAAA,CAA+B,SAAS,OAAO,CAAA;AAAA,IAC/C,4BAAA,CAA6B,SAAS,KAAK,CAAA;AAAA,IAC3C,6BAAA,CAA8B,SAAS,MAAM,CAAA;AAAA,IAC7C,+BAAA,CAAgC,SAAS,QAAQ;AAAA,GAClD,CAAA;AACD,EAAA,OAAO;AAAA,IACL,mBAAA;AAAA,IACA,2BAAA;AAAA,IACA,qBAAA;AAAA,IACA,uBAAA;AAAA,IACA,iBAAA,EAAmB,SAAS,KAAA,CAAM,SAAA;AAAA,IAClC,kBAAA,EAAoB,SAAS,MAAA,CAAO,SAAA;AAAA,IACpC,oBAAA,EAAsB,SAAS,QAAA,CAAS,SAAA;AAAA,IACxC,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA,qBAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA,EAAe;AAAA,MACb,uBAAA,EAAyB,0BAAA;AAAA,MACzB,uBAAA,EAAyB,0BAAA;AAAA,MACzB,8BAAA,EAAgC;AAAA;AAClC,GACF;AACF;AAQA,eAAsB,uBAAuB,OAAA,EAKf;AAC5B,EAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,EAAuB;AAC9C,EAAA,MAAM,kCAAkC,QAAQ,CAAA;AAChD,EAAA,MAAM,iBAAiC,EAAC;AACxC,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,MAAM,UAAA,GAAa,uBAAuB,OAAA,CAAQ,UAAU,KACvD,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAE7C,EAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,IAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAA;AAC/B,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,IAAa,CAAC,QAAQ,WAAA,EAAa;AAC9C,MAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,8DAAA,CAAc,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,OAAA,CAAQ,aAAa,8DAAsB,CAAA;AAC3C,QAAA,MAAM,aAAA,GAAgB,MAAM,0BAAA,CAA2B,UAAA,EAAY,OAAO,CAAA;AAC1E,QAAA,MAAM,SAAA,GAAY,MAAM,wBAAA,CAAyB,OAAO,CAAA;AACxD,QAAA,IAAI,aAAA,IAAiB,cAAc,WAAA,EAAa;AAC9C,UAAA,OAAA,CAAQ,aAAa,4HAAkC,CAAA;AACvD,UAAA,MAAM,uBAAuB,OAAO,CAAA;AAAA,QACtC,CAAA,MAAO;AACL,UAAA,eAAA,CAAgB,KAAK,iFAA0B,CAAA;AAAA,QACjD;AACA,QAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,WAAW,UAAA,EAAY;AACzB,QAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO;AAC1B,UAAA,eAAA,CAAgB,KAAK,0FAAwC,CAAA;AAC7D,UAAA;AAAA,QACF;AACA,QAAA,OAAA,CAAQ,aAAa,yEAAiC,CAAA;AACtD,QAAA,MAAM,6BAAA,CAA8B,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,OAAO,OAAO,CAAA;AAC9E,QAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO;AAC1B,QAAA,eAAA,CAAgB,KAAK,wFAAsC,CAAA;AAC3D,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,aAAa,uEAA+B,CAAA;AACpD,MAAA,MAAM,2BAAA,CAA4B,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,OAAO,OAAO,CAAA;AAC5E,MAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAA,eAAA,CAAgB,KAAK,CAAA,EAAG,MAAM,0EAAmB,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9E;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAQA,SAAS,mBAAmB,KAAA,EAAwB;AAClD,EAAA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC9D;AAWA,eAAsB,oBAAoB,OAAA,EAKZ;AAC5B,EAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,EAAuB;AAC9C,EAAA,MAAM,kCAAkC,QAAQ,CAAA;AAChD,EAAA,MAAM,iBAAiC,EAAC;AACxC,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,MAAM,aAAa,sBAAA,CAAuB,OAAA,CAAQ,UAAU,CAAA,IACvD,sBAAA,CAAuB,QAAQ,OAAO,CAAA;AAE3C,EAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,IAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAA;AAC/B,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,IAAa,CAAC,QAAQ,WAAA,EAAa;AAC9C,MAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,8DAAA,CAAc,CAAA;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,oFAAA,CAAoC,CAAA;AAClE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,0BAAA,CAA2B,YAAY,OAAO,CAAA;AACpD,MAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,UAAA,EAAY;AACzB,MAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO;AAC3B,QAAA,eAAA,CAAgB,KAAK,iJAAsE,CAAA;AAC3F,QAAA;AAAA,MACF;AACA,MAAA,MAAM,6BAAA,CAA8B,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,OAAO,OAAO,CAAA;AAC9E,MAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO;AAC3B,MAAA,eAAA,CAAgB,KAAK,+IAAoE,CAAA;AACzF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,2BAAA,CAA4B,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,OAAO,OAAO,CAAA;AAC5E,IAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAQA,eAAsB,cACpB,OAAA,EAC2B;AAC3B,EAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,EAAuB;AAC9C,EAAA,MAAM,iBAAiC,EAAC;AACxC,EAAA,MAAM,kBAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAA;AAC/B,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,IAAa,CAAC,QAAQ,WAAA,EAAa;AAC9C,MAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,8DAAA,CAAc,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,WAAW,OAAA,CAAQ,WAAA,EAAa,CAAC,KAAA,EAAO,QAAA,EAAU,eAAe,CAAA,EAAG;AAAA,QACxE,YAAA,EAAc;AAAA,OACf,CAAA;AACD,MAAA,MAAM,sBAAA,CAAuB,OAAA,CAAQ,WAAoB,CAAA;AACzD,MAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,UAAA,EAAY;AACzB,MAAA,MAAM,sBAAA,CAAuB,OAAA,CAAQ,WAAuB,CAAA;AAC5D,MAAA,MAAM,WAAW,OAAA,CAAQ,WAAA,EAAa,CAAC,KAAA,EAAO,OAAA,EAAS,eAAe,CAAA,EAAG;AAAA,QACvE,YAAA,EAAc;AAAA,OACf,CAAA;AACD,MAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,sBAAA,CAAuB,OAAA,CAAQ,WAAqB,CAAA;AAC1D,IAAA,MAAM,UAAA;AAAA,MACJ,OAAA,CAAQ,WAAA;AAAA,MACR,CAAC,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,cAAc,eAAe,CAAA;AAAA,MACrD;AAAA,QACE,YAAA,EAAc;AAAA;AAChB,KACF;AACA,IAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAQA,eAAsB,6BACpB,OAAA,EACkB;AAClB,EAAA,MAAM,eAAA,GACJ,OAAA,IAAA,CAAY,MAAM,sBAAA,EAAuB,EAAG,KAAA;AAC9C,EAAA,IAAI,CAAC,eAAA,CAAgB,SAAA,IAAa,CAAC,gBAAgB,WAAA,EAAa;AAC9D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAS,MAAM,UAAA;AAAA,IACnB,eAAA,CAAgB,WAAA;AAAA,IAChB,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,eAAe,CAAA;AAAA,IACxC;AAAA,MACE,YAAA,EAAc;AAAA;AAChB,GACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,MAAA,CAAO,MAAK,EAAG;AAC5C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACvC,IAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAIzB,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,OAAO,SAAA,KAAc,UAAU,SAAA,KAAc,iBAAA;AAAA,IAC/C;AACA,IAAA,OACE,SAAA,EAAW,IAAA,KAAS,MAAA,IAAU,SAAA,EAAW,IAAA,KAAS,iBAAA;AAAA,EAEtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQA,eAAsB,8BACpB,OAAA,EACkB;AAClB,EAAA,MAAM,eAAA,GACJ,OAAA,IAAA,CAAY,MAAM,sBAAA,EAAuB,EAAG,MAAA;AAC9C,EAAA,IAAI,CAAC,eAAA,CAAgB,SAAA,IAAa,CAAC,gBAAgB,WAAA,EAAa;AAC9D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAS,MAAM,UAAA;AAAA,IACnB,eAAA,CAAgB,WAAA;AAAA,IAChB,CAAC,KAAA,EAAO,KAAA,EAAO,eAAe,CAAA;AAAA,IAC9B;AAAA,MACE,YAAA,EAAc;AAAA;AAChB,GACF;AACA,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AAQA,eAAsB,gCACpB,OAAA,EACkB;AAClB,EAAA,MAAM,eAAA,GACJ,OAAA,IAAA,CAAY,MAAM,sBAAA,EAAuB,EAAG,QAAA;AAC9C,EAAA,IAAI,CAAC,eAAA,CAAgB,SAAA,IAAa,CAAC,gBAAgB,WAAA,EAAa;AAC9D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAS,MAAM,UAAA;AAAA,IACnB,eAAA,CAAgB,WAAA;AAAA,IAChB,CAAC,KAAA,EAAO,MAAA,EAAQ,eAAA,EAAiB,QAAQ,CAAA;AAAA,IACzC;AAAA,MACE,YAAA,EAAc;AAAA;AAChB,GACF;AACA,EAAA,OAAO,OAAO,OAAA,IAAW,MAAA,CAAO,MAAA,CAAO,IAAA,GAAO,MAAA,GAAS,CAAA;AACzD;AAQA,eAAsB,0BACpB,OAAA,EACwB;AACxB,EAAA,MAAM,eAAA,GACJ,CAAY,MAAM,sBAAA,EAAuB,EAAG,KAAA;AAC9C,EAAA,IAAI,CAAC,eAAA,CAAgB,SAAA,IAAa,CAAC,gBAAgB,WAAA,EAAa;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAS,MAAM,UAAA;AAAA,IACnB,eAAA,CAAgB,WAAA;AAAA,IAChB,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,eAAe,CAAA;AAAA,IACxC;AAAA,MACE,YAAA,EAAc;AAAA;AAChB,GACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,MAAA,CAAO,MAAK,EAAG;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,IAAA,EAAK;AAC5B;AAQA,eAAsB,2BACpB,OAAA,EACwB;AACxB,EAAA,MAAM,eAAA,GACJ,CAAY,MAAM,sBAAA,EAAuB,EAAG,MAAA;AAC9C,EAAA,IAAI,CAAC,eAAA,CAAgB,SAAA,IAAa,CAAC,gBAAgB,WAAA,EAAa;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAS,MAAM,UAAA;AAAA,IACnB,eAAA,CAAgB,WAAA;AAAA,IAChB,CAAC,KAAA,EAAO,KAAA,EAAO,eAAe,CAAA;AAAA,IAC9B;AAAA,MACE,YAAA,EAAc;AAAA;AAChB,GACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,MAAA,CAAO,MAAK,EAAG;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,IAAA,EAAK;AAC5B;AAQA,eAAsB,6BACpB,OAAA,EACwB;AACxB,EAAA,MAAM,eAAA,GACJ,CAAY,MAAM,sBAAA,EAAuB,EAAG,QAAA;AAC9C,EAAA,IAAI,CAAC,eAAA,CAAgB,SAAA,IAAa,CAAC,gBAAgB,WAAA,EAAa;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAS,MAAM,UAAA;AAAA,IACnB,eAAA,CAAgB,WAAA;AAAA,IAChB,CAAC,KAAA,EAAO,MAAA,EAAQ,eAAA,EAAiB,QAAQ,CAAA;AAAA,IACzC;AAAA,MACE,YAAA,EAAc;AAAA;AAChB,GACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,MAAA,CAAO,MAAK,EAAG;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,IAAA,EAAK;AAC5B;AAQA,eAAe,0BAAA,CACb,SACA,OAAA,EACkB;AAClB,EAAA,MAAM,WAAA,GAAc,YAAY,OAAO,CAAA;AACvC,EAAA,MAAM,sBAAA,CAAuB,OAAA,CAAQ,WAAqB,CAAA;AAC1D,EAAA,MAAM,oBAAA,GAAuB,MAAM,+BAAA,CAAgC,OAAO,CAAA;AAC1E,EAAA,IACE,oBAAA,KACI,qBAAqB,SAAA,KAAc,MAAA,IAClC,qBAAqB,SAAA,KAAc,iBAAA,CAAA,IACrC,oBAAA,CAAqB,GAAA,KAAQ,WAAA,EAChC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,OAAA,CAAQ,WAAA,EAAc,CAAC,KAAA,EAAO,QAAA,EAAU,eAAe,CAAA,EAAG;AAAA,IACzE,YAAA,EAAc;AAAA,GACf,CAAA;AACD,EAAA,MAAM,UAAA,CAAW,QAAQ,WAAA,EAAc;AAAA,IACrC,KAAA;AAAA,IACA,KAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAOA,eAAe,uBACb,OAAA,EACe;AACf,EAAA,MAAM,WAAW,OAAA,CAAQ,WAAA,EAAc,CAAC,KAAA,EAAO,OAAA,EAAS,eAAe,CAAC,CAAA;AAC1E;AAQA,eAAe,yBACb,OAAA,EAC4B;AAC5B,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,aAAc,CAAC,KAAA,EAAO,MAAM,CAAA,EAAG;AAAA,IACrE,YAAA,EAAc;AAAA,GACf,CAAA;AACD,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,MAAA,CAAO,MAAK,EAAG;AAC5C,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,CAC1B,KAAA,CAAM,OAAO,CAAA,CACb,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAA,EAAM,CAAA,CACzB,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAA,EAAM,CAAC,CAAA,CAC/D,KAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,CAAC,MAAM,eAAe,CAAA;AACnD,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,EAAA,CAAG,EAAE,CAAA;AACtC,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,OAAO,eAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAA,IAAc,eAAe,GAAA,EAAK;AACpC,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA;AACT;AASA,eAAe,2BAAA,CACb,OAAA,EACA,WAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,sBAAA,CAAuB,OAAA,CAAQ,WAAsB,CAAA;AAC3D,EAAA,MAAM,UAAA;AAAA,IACJ,OAAA,CAAQ,WAAA;AAAA,IACR,CAAC,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,cAAc,eAAe,CAAA;AAAA,IACrD;AAAA,MACE,YAAA,EAAc;AAAA;AAChB,GACF;AACA,EAAA,MAAM,UAAA,CAAW,QAAQ,WAAA,EAAc;AAAA,IACrC,KAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAY,OAAO,CAAA;AAAA,IACnB,UAAA;AAAA,IACA,yBAAyB,WAAW,CAAA;AAAA,GACrC,CAAA;AACH;AAaA,eAAe,6BAAA,CACb,OAAA,EACA,WAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,sBAAA,CAAuB,OAAA,CAAQ,WAAwB,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,GAAA,EAAK,YAAY,OAAO,CAAA;AAAA,IACxB,SAAA,EAAW,iBAAA;AAAA,IACX,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,UAAU,WAAW,CAAA;AAAA;AACtC,GACF;AACA,EAAA,MAAM,UAAA,CAAW,QAAQ,WAAA,EAAc;AAAA,IACrC,KAAA;AAAA,IACA,KAAA;AAAA,IACA,eAAA;AAAA,IACA,IAAA,CAAK,UAAU,OAAO;AAAA,GACvB,CAAA;AACH;AAQA,eAAe,gCACb,OAAA,EAIQ;AACR,EAAA,MAAM,SAAS,MAAM,UAAA;AAAA,IACnB,OAAA,CAAQ,WAAA;AAAA,IACR,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,eAAe,CAAA;AAAA,IACxC;AAAA,MACE,YAAA,EAAc;AAAA;AAChB,GACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,MAAA,CAAO,MAAK,EAAG;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAIvC,IAAA,MAAM,iBAAA,GACJ,OAAO,MAAA,CAAO,SAAA,KAAc,WACxB,MAAA,CAAO,SAAA,GACP,OAAO,SAAA,EAAW,IAAA;AACxB,IAAA,OAAO;AAAA,MACL,GAAI,OAAO,GAAA,KAAQ,KAAA,CAAA,GAAY,EAAE,GAAA,EAAK,MAAA,CAAO,GAAA,EAAI,GAAI,EAAC;AAAA,MACtD,GAAI,iBAAA,KAAsB,KAAA,CAAA,GACtB,EAAE,SAAA,EAAW,iBAAA,KACb;AAAC,KACP;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAUA,eAAe,UAAA,CACb,WAAA,EACA,IAAA,EACA,OAAA,EAGwB;AACxB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,WAAA,EAAa,IAAA,EAAM;AAAA,MACpD,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,SAAA,EAAW,KAAK,IAAA,GAAO;AAAA,KACxB,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ,OAAO,MAAA,IAAU,EAAA;AAAA,MACzB,MAAA,EAAQ,OAAO,MAAA,IAAU;AAAA,KAC3B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,YAAA,GAAe,KAAA;AAKrB,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,aAAa,MAAA,IAAU,EAAA;AAAA,QAC/B,MAAA,EAAQ,aAAa,MAAA,IAAU;AAAA,OACjC;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAK;AACzC,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAK;AACzC,IAAA,MAAM,OAAA,GAAU,MAAA,IAAU,MAAA,IAAU,YAAA,CAAa,OAAA;AACjD,IAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,EACzB;AACF;AAQA,SAAS,YAAY,OAAA,EAAyB;AAC5C,EAAA,OAAO,CAAA,EAAG,gBAAA,CAAiB,OAAO,CAAC,CAAA,IAAA,CAAA;AACrC;AAQA,eAAe,qBAAqB,SAAA,EAAuC;AACzE,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,aAAaA,KAAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,CAAC,KAAK,EAAE,CAAA;AAClD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAA,GAAW,MAAM,yBAAA,CAA0B,UAAU,CAAA,IAAM,OAAA;AAAA,EAC7D;AACA,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,IAAI,MAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG;AACnC,MAAA,MAAMD,GAAAA,CAAG,GAAG,QAAA,EAAU;AAAA,QACpB,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAQA,eAAe,gCACb,gBAAA,EACkB;AAClB,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMA,GAAAA,CAAG,QAAA,CAAS,gBAAA,EAAkB,MAAM,CAAA;AAAA,EACtD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,MAAM,IAAA,GAAO,mBAAmB,OAAO,CAAA;AACvC,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC5B,IAAA,MAAMA,IAAG,EAAA,CAAG,gBAAA,EAAkB,EAAE,KAAA,EAAO,MAAM,CAAA;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAMA,GAAAA,CAAG,SAAA,CAAU,gBAAA,EAAkB,IAAA,EAAM;AAAA,IACzC,QAAA,EAAU,MAAA;AAAA,IACV,IAAA,EAAM;AAAA,GACP,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAQA,eAAe,6BACb,OAAA,EACkB;AAClB,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,MAAM,aAAaC,KAAAA,CAAK,IAAA,CAAK,cAAA,CAAe,OAAO,GAAG,iBAAiB,CAAA;AACvE,EAAA,OAAA,GAAW,MAAM,yBAAA,CAA0B,UAAU,CAAA,IAAM,OAAA;AAC3D,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,GAAG,8BAA8B,OAAO,CAAA;AAAA,IACxC,GAAG,kCAAkC,UAAU;AAAA,GACjD;AAEA,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,IAAI,MAAM,eAAA,CAAgB,UAAU,CAAA,EAAG;AACrC,MAAA,MAAMD,GAAAA,CAAG,GAAG,UAAA,EAAY;AAAA,QACtB,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAQA,eAAe,wBAAwB,OAAA,EAAoC;AACzE,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,aAAaC,KAAAA,CAAK,IAAA,CAAK,eAAe,OAAO,CAAA,EAAG,aAAa,QAAQ,CAAA;AAC3E,EAAA,OAAA,GAAW,MAAM,yBAAA,CAA0B,UAAU,CAAA,IAAM,OAAA;AAC3D,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,GAAG,gCAAgC,OAAO,CAAA;AAAA,IAC1C,GAAG,kCAAkC,UAAU;AAAA,GACjD;AACA,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,IAAI,MAAM,eAAA,CAAgB,UAAU,CAAA,EAAG;AACrC,MAAA,MAAMD,GAAAA,CAAG,GAAG,UAAA,EAAY;AAAA,QACtB,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAOA,eAAe,kCACb,QAAA,EACe;AACf,EAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,IAChB,QAAA,CAAS,KAAA,CAAM,WAAA,GACX,sBAAA,CAAuB,QAAA,CAAS,MAAM,WAAoB,CAAA,GAC1D,OAAA,CAAQ,OAAA,EAAQ;AAAA,IACpB,QAAA,CAAS,MAAA,CAAO,WAAA,GACZ,sBAAA,CAAuB,QAAA,CAAS,OAAO,WAAqB,CAAA,GAC5D,OAAA,CAAQ,OAAA,EAAQ;AAAA,IACpB,QAAA,CAAS,QAAA,CAAS,WAAA,GACd,sBAAA,CAAuB,QAAA,CAAS,SAAS,WAAuB,CAAA,GAChE,OAAA,CAAQ,OAAA;AAAQ,GACrB,CAAA;AACH;AAQA,eAAe,sBAAA,CACb,aACA,UAAA,EACe;AAGjB;AAQA,eAAe,wBACb,aAAA,EACkB;AAClB,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAE,MAAM,eAAA,CAAgB,aAAa,CAAA,EAAI;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAMA,GAAAA,CAAG,GAAG,aAAA,EAAe;AAAA,IACzB,SAAA,EAAW,IAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAYA,eAAe,0BAA0B,UAAA,EAAsC;AAC7E,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,aAAA,IAAiB,CAAC,uBAAuB,CAAA,EAAG;AACrD,IAAA,MAAM,SAAA,GAAYC,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,MAAM,wBAAA,CAAyB,SAAS,CAAA;AACtD,IAAA,KAAA,MAAW,gBAAA,IAAoB,MAAM,KAAA,EAAO;AAC1C,MAAA,MAAM,gBAAA,GAAmBA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,gBAAgB,CAAA;AAC/D,MAAA,IAAI,MAAM,UAAA,CAAW,gBAAgB,CAAA,EAAG;AACtC,QAAA,MAAM,uBAAA,CAAwB,YAAY,gBAAgB,CAAA;AAC1D,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,MAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/B,MAAA,MAAMD,IAAG,EAAA,CAAG,SAAA,EAAW,EAAE,KAAA,EAAO,MAAM,CAAA;AACtC,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAQA,eAAe,yBAAyB,SAAA,EAA8C;AACpF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMA,GAAAA,CAAG,QAAA,CAAS,WAAW,MAAM,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,GACtC,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,QAAA,KAAa,sBAAA,CAAuB,QAAQ,CAAC,IACrE,EAAC;AACL,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAE;AAAA,IACrB;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAE;AAAA,EACrB;AACF;AAQA,SAAS,uBAAuB,OAAA,EAAsC;AACpE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,iBAAiB,OAAO,CAAA;AACjC;AAQA,eAAe,6BAA6B,OAAA,EAAoC;AAC9E,EAAA,MAAM,SAAA,GAAY,8BAA8B,OAAO,CAAA;AACvD,EAAA,MAAM,UAAA,GAAa,UAAU,GAAA,CAAI,CAAC,aAAaC,KAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,gBAAgB,CAAC,CAAA;AACpF,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc,UAAA,CAAW,SAAS,CAAC,CAAC,CAAA;AACtF,EAAA,OAAO,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC9B;AAQA,eAAe,+BAA+B,OAAA,EAAoC;AAChF,EAAA,MAAM,SAAA,GAAY,gCAAgC,OAAO,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,UAAU,GAAA,CAAI,CAAC,aAAaA,KAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,gBAAgB,CAAC,CAAA;AACpF,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc,UAAA,CAAW,SAAS,CAAC,CAAC,CAAA;AACtF,EAAA,OAAO,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC9B;AAQA,eAAe,WAAW,QAAA,EAAoC;AAC5D,EAAA,IAAI;AACF,IAAA,MAAMD,GAAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AASA,eAAe,yBAAA,CACb,WACA,SAAA,EACkB;AAClB,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,OAAA,GAAU,MAAMA,GAAAA,CAAG,OAAA,CAAQ,WAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AACnE,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,UAAA,GAAaC,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,CAAA;AAClD,IAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,CAAA;AAClD,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,MAAM,YAAA,GAAe,MAAM,yBAAA,CAA0B,UAAA,EAAY,UAAU,CAAA;AAC3E,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,MAAMD,GAAAA,CAAG,QAAA,CAAS,YAAY,MAAM,CAAA;AACpD,IAAA,MAAM,KAAA,GAAQ,MAAM,cAAA,CAAe,UAAA,EAAY,SAAS,GAAK,CAAA;AAC7D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAQA,SAAS,uBAAuB,UAAA,EAA8B;AAC5D,EAAA,OAAO,kBAAA,CAAmB,IAAI,CAAC,SAAA,KAAcC,MAAK,IAAA,CAAK,UAAA,EAAY,SAAS,CAAC,CAAA;AAC/E;AAQA,SAAS,kCAAkC,UAAA,EAA8B;AACvE,EAAA,OAAO,CAAC,GAAG,kBAAA,EAAoB,GAAG,8BAA8B,CAAA,CAAE,GAAA;AAAA,IAChE,CAAC,SAAA,KAAcA,KAAAA,CAAK,IAAA,CAAK,YAAY,SAAS;AAAA,GAChD;AACF;AAQA,eAAe,sBAAsB,UAAA,EAAsC;AACzE,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,QAAA,IAAY,sBAAA,CAAuB,UAAU,CAAA,EAAG;AACzD,IAAA,IAAI,MAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG;AACnC,MAAA,MAAMD,GAAAA,CAAG,GAAG,QAAA,EAAU;AAAA,QACpB,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAaA,eAAe,6BAAA,CACb,YACA,YAAA,EACe;AACf,EAAA,MAAM,aAAA,GAAgB,MAAM,oBAAA,CAAqB,UAAU,CAAA;AAC3D,EAAA,KAAA,MAAW,YAAA,IAAgB,cAAc,KAAA,EAAO;AAC9C,IAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,YAAY,CAAA,EAAG;AACnC,MAAA,MAAM,uBAAA,CAAwB,YAAY,YAAY,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,yBAAA,CAA0B,YAAY,CAAA,EAAG;AAC5D,IAAA,MAAM,UAAA,GAAaC,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AAC/C,IAAA,MAAM,aAAA,GAAgB,MAAM,oBAAA,CAAqB,UAAU,CAAA;AAC3D,IAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,MAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,UAAA,EAAY,YAAY,CAAA;AACjE,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,YAAY,CAAA,EAAG;AACnC,QAAA,MAAM,uBAAA,CAAwB,YAAY,YAAY,CAAA;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACF;AAQA,eAAe,qBAAqB,UAAA,EAA+C;AACjF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMD,GAAAA,CAAG,QAAA;AAAA,MACvBC,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,uBAAuB,CAAA;AAAA,MAC7C;AAAA,KACF;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,GACtC,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,QAAA,KAAa,sBAAA,CAAuB,QAAQ,CAAC,IACrE,EAAC;AACL,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAE;AAAA,IACrB;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAE;AAAA,EACrB;AACF;AAQA,eAAe,qBAAA,CACb,YACA,YAAA,EACe;AACf,EAAA,MAAM,KAAA,GAA0B;AAAA,IAC9B,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,YAAY,EAAE,IAAA;AAAK,GACvC;AACA,EAAA,MAAM,cAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,uBAAuB,CAAA;AAAA,IAC7C,GAAG,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAAA,IACjC;AAAA,GACF;AACF;AAQA,SAAS,uBAAuB,QAAA,EAA6B;AAC3D,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,IAAI;AACF,IAAA,OAAO,CAAC,0BAAA,CAA2B,QAAQ,CAAC,CAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAQA,SAAS,0BAA0B,YAAA,EAAqC;AACtE,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,IAAA,MAAM,CAAC,MAAA,EAAQ,GAAG,SAAS,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACpD,IAAA,IAAI,MAAA,IAAU,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA,EAAK;AAClC;AAQA,eAAe,qBAAqB,aAAA,EAA0C;AAC5E,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMD,GAAAA,CAAG,OAAA,CAAQ,eAAe,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EACnE,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,SAAA,GAAYC,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAe,MAAM,IAAI,CAAA;AACrD,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAI,MAAM,oBAAA,CAAqB,SAAS,CAAE,CAAA;AACrD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,QAAO,EAAG;AAClB,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAQA,eAAe,uBAAA,CACb,YACA,YAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,2BAA2B,YAAY,CAAA;AACxD,EAAA,MAAM,YAAA,GAAeA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AACnD,EAAA,MAAMD,IAAG,EAAA,CAAG,YAAA,EAAc,EAAE,KAAA,EAAO,MAAM,CAAA;AACzC,EAAA,MAAM,qBAAA,CAAsB,UAAA,EAAYC,KAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAChE;AAQA,eAAe,qBAAA,CACb,SACA,WAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACrC,EAAA,IAAI,WAAA,GAAcA,KAAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,WAAW,CAAA;AACnD,EAAA,OAAO,WAAA,CAAY,WAAW,CAAA,EAAG,QAAQ,GAAGA,KAAAA,CAAK,GAAG,EAAE,CAAA,EAAG;AACvD,IAAA,IAAI;AACF,MAAA,MAAMD,GAAAA,CAAG,MAAM,WAAW,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,SAAA,GAAY,KAAA;AAClB,MAAA,IACE,SAAA,CAAU,SAAS,QAAA,IACnB,SAAA,CAAU,SAAS,WAAA,IACnB,SAAA,CAAU,SAAS,QAAA,EACnB;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,WAAA,GAAcC,KAAAA,CAAK,QAAQ,WAAW,CAAA;AAAA,EACxC;AACF;AASA,SAAS,mBAAA,CAAoB,SAAiB,YAAA,EAA8B;AAC1E,EAAA,OAAOA,KAAAA,CAAK,QAAA,CAAS,OAAA,EAAS,YAAY,CAAA,CAAE,MAAMA,KAAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACtE;AAQA,eAAe,gBAAgB,aAAA,EAAyC;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAMD,GAAAA,CAAG,IAAA,CAAK,aAAa,CAAA;AACzC,IAAA,OAAO,MAAM,WAAA,EAAY;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAOA,eAAe,UAAU,QAAA,EAAiC;AACxD,EAAA,MAAMA,GAAAA,CAAG,MAAMC,KAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC5D;AAUA,eAAe,cAAA,CACb,QAAA,EACA,OAAA,EACA,IAAA,EACkB;AAClB,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMD,GAAAA,CAAG,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAAA,EAC9C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,QAAQ,CAAA;AACxB,EAAA,MAAMA,GAAAA,CAAG,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS;AAAA,IACpC,QAAA,EAAU,MAAA;AAAA,IACV;AAAA,GACD,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAQA,eAAe,eAAe,OAAA,EAAyC;AACrE,EAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,IAAA;AAC9B,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAc,SAAA,CAAU,KAAA,CAAMC,MAAK,SAAS,CAAA,CAAE,OAAO,OAAO,CAAA;AAClE,EAAA,MAAM,UAAA,GACJ,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAA,CAChB,QAAQ,GAAA,CAAI,OAAA,IAAW,gBAAA,EACrB,KAAA,CAAM,GAAG,CAAA,CACT,MAAA,CAAO,OAAO,CAAA,GACjB,CAAC,EAAE,CAAA;AAET,EAAA,KAAA,MAAW,aAAa,WAAA,EAAa;AACnC,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,MAAM,YAAYA,KAAAA,CAAK,IAAA;AAAA,QACrB,SAAA;AAAA,QACA,QAAQ,QAAA,KAAa,OAAA,GAAU,GAAG,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,GAAK;AAAA,OAC5D;AACA,MAAA,IAAI;AACF,QAAA,MAAMD,GAAAA,CAAG,MAAA,CAAO,SAAA,EAAWA,GAAAA,CAAG,UAAU,IAAI,CAAA;AAC5C,QAAA,OAAO,SAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;;;AC/5DO,SAAS,uBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,OAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,sCAAsC,CAAA,CAClD,QAAA,CAAS,gBAAgB,wDAAwD,CAAA,CACjF,OAAO,cAAA,EAAgB,4CAA4C,EACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,sBAAA,EAAwB,0BAA0B,CAAA,CACzD,MAAA;AAAA,IACC,OACE,SACA,OAAA,KAMG;AACH,MAAA,MAAM,UAAA,CAAW,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,IAC5C;AAAA,GACF;AAEF,EAAA,OAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA;AAAA,IACC;AAAA,GACF,CACC,OAAO,YAAY;AAClB,IAAA,MAAM,aAAa,OAAO,CAAA;AAAA,EAC5B,CAAC,CAAA;AACL;AASA,eAAe,UAAA,CACb,UAAA,EACA,OAAA,EACA,OAAA,EAMe;AACf,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,gBAAA,GAAmB,oBAAA,CAAqB,mBAAA,CAAoB,UAAU,CAAC,CAAA;AAC7E,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,YAAA,EAAc,OAAO,CAAA;AACjE,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AAExB,EAAA,MAAM,UAAA,EAAW;AACjB,EAAA,MAAM,gBAAA;AAAA,IACJ,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,CAAS,OAAA;AAAA,IACT,CAAC,OAAA,KAAY,OAAA,CAAQ,GAAA,CAAI,OAAO;AAAA,GAClC;AAEA,EAAA,OAAA,CAAQ,IAAI,CAAA,eAAA,CAAiB,CAAA;AAC7B,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,sBAAA,CAAuB,gBAAgB,CAAC,CAAA,CAAE,CAAA;AAC5E,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,MAAA,CAAO,WAAA,IAAe,WAAW,CAAA,CAAE,CAAA;AAC/D,EAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,EAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AACrC,EAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AACvC,EAAA,OAAA,CAAQ,IAAI,oHAAwD,CAAA;AACtE;AAYA,eAAsB,cAAA,CACpB,UAAA,EACA,OAAA,EACA,OAAA,EACA,YACA,QAAA,EAKC;AACD,EAAA,QAAA,CAAS,yFAAkC,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,GAAS,CAAA,GACjC,oBAAA,CAAqB,mBAAA,CAAoB,UAAU,CAAC,CAAA,GACpD,oBAAA,CAAqB,CAAC,KAAK,CAAC,CAAA;AAChC,EAAA,MAAM,UAAA,EAAW;AACjB,EAAA,MAAM,gBAAA,CAAiB,QAAA,EAAU,OAAA,EAAS,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACnE,EAAA,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,UAAA,EAAY;AACvC,IAAA,QAAA,CAAS,kIAA4D,CAAA;AAAA,EACvE;AACA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,iBAAiB;AAAC,GACpB;AACF;AAaA,eAAe,gBAAA,CACb,OAAA,EACA,OAAA,EACA,OAAA,EACA,QAAA,EACe;AACf,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,QAAA,CAAS,2CAA2C,CAAA;AACpD,IAAA;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc;AAAA,MAC/B,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,mBAAA,CAAoB,OAAO,CAAA;AACzD,IAAA,MAAM,aAAa,MAAM,yBAAA,CAA0B,SAAS,KAAA,IAAS,IAAI,OAAO,CAAA;AAChF,IAAA,QAAA,CAAS,CAAA,uBAAA,EAA0B,QAAA,CAAS,OAAA,IAAW,WAAW,CAAA,CAAE,CAAA;AACpE,IAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,GAAG,MAAA,CAAO,MAAM,CAAA,eAAA,EAAkB,MAAA,CAAO,YAAY,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,QAAA,CAAS,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAChD;AACF;AAQA,eAAsB,SAAA,CACpB,YACA,OAAA,EACe;AACf,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,oBAAoB,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,MAAM,uBAAA,CAAwB,OAAO,CAAA;AACtD,EAAA,MAAM,aAAa,YAAA,EAAa;AAChC,EAAA,MAAM,YAAA,GAAe,MAAM,aAAA,CAAc,QAAQ,CAAA;AACjD,EAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,EAAA,IAAI,YAAA,CAAa,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC1C,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,eAAA,EAAkB,sBAAA,CAAuB,YAAA,CAAa,cAAc,CAAC,CAAA;AAAA,KACvE;AAAA,EACF;AACA,EAAA,KAAA,MAAW,cAAA,IAAkB,aAAa,eAAA,EAAiB;AACzD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,EAAS,cAAc,CAAA,CAAE,CAAA;AAAA,EACvC;AACF;AAYA,eAAsB,sBAAA,CACpB,SACA,OAAA,EAMC;AACD,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,MAAM,uBAAA,CAAwB,CAAC,KAAK,CAAC,CAAA;AACtD,EAAA,MAAM,aAAa,YAAA,EAAa;AAChC,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,WAAW,YAAA,CAAa,SAAA;AAAA,IACxB,GAAsD;AAAC,GACzD;AACA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACxD,cAAc,QAAQ,CAAA;AAAA,IACtB,qBAAqB,gBAAgB;AAAA,GACtC,CAAA;AACD,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAOA,eAAe,aAAa,OAAA,EAAwC;AAClE,EAAA,MAAM,EAAE,YAAA,EAAc,eAAA,EAAgB,GAAI,MAAM,uBAAuB,OAAO,CAAA;AAE9E,EAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,EAAA,IAAI,YAAA,CAAa,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC1C,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,eAAA,EAAkB,sBAAA,CAAuB,YAAA,CAAa,cAAc,CAAC,CAAA;AAAA,KACvE;AAAA,EACF;AACA,EAAA,YAAA,CAAa,aAAa,MAAM,CAAA;AAChC,EAAA,UAAA;AAAA,IACE,qBAAA;AAAA,IACA,eAAA,CAAgB,oBACZ,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA,GACtB,QAAA,CAAS,MAAM,MAAM;AAAA,GAC3B;AACA,EAAA,UAAA;AAAA,IACE,6BAAA;AAAA,IACA,eAAA,CAAgB,4BACZ,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA,GACtB,QAAA,CAAS,MAAM,MAAM;AAAA,GAC3B;AACA,EAAA,UAAA;AAAA,IACE,uBAAA;AAAA,IACA,eAAA,CAAgB,sBACZ,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA,GACtB,QAAA,CAAS,MAAM,MAAM;AAAA,GAC3B;AACA,EAAA,UAAA;AAAA,IACE,yBAAA;AAAA,IACA,eAAA,CAAgB,wBACZ,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA,GACtB,QAAA,CAAS,MAAM,MAAM;AAAA,GAC3B;AACA,EAAA,UAAA;AAAA,IACE,oBAAA;AAAA,IACA,eAAA,CAAgB,mBACZ,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA,GACtB,QAAA,CAAS,MAAM,MAAM;AAAA,GAC3B;AACA,EAAA,UAAA;AAAA,IACE,oBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,KAAA,MAAW,cAAA,IAAkB,aAAa,eAAA,EAAiB;AACzD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,EAAS,cAAc,CAAA,CAAE,CAAA;AAAA,EACvC;AACF;;;ACxQA,IAAM,mBAAA,GAAsB,KAAA;AAC5B,IAAM,qBAAA,GAAwB,GAAA;AAqBvB,SAAS,mBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,MAAM,OAAO,OAAA,CACV,OAAA,CAAQ,MAAM,CAAA,CACd,YAAY,4CAA4C,CAAA;AAE3D,EAAA,IAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,oEAAoE,EAChF,QAAA,CAAS,cAAA,EAAgB,mDAAmD,CAAA,CAC5E,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,sBAAA,EAAwB,0BAA0B,CAAA,CACzD,MAAA,CAAO,uBAAA,EAAyB,sCAAsC,CAAA,CACtE,MAAA,CAAO,yBAAyB,qBAAqB,CAAA,CACrD,MAAA,CAAO,wBAAA,EAA0B,mCAAmC,CAAA,CACpE,OAAO,mBAAA,EAAqB,mCAAA,EAAqC,YAAY,CAAA,CAC7E,MAAA,CAAO,QAAA,EAAU,4BAA4B,CAAA,CAC7C,MAAA,CAAO,WAAA,EAAa,iDAAiD,CAAA,CACrE,MAAA,CAAO,4BAAA,EAA8B,8BAA8B,CAAA,CACnE,MAAA,CAAO,OAAO,OAAA,EAAmB,OAAA,KAAiC;AACjE,IAAA,MAAM,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EACrD,CAAC,CAAA;AAEH,EAAA,IAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,+BAA+B,CAAA,CAC3C,cAAA,CAAe,iBAAA,EAAmB,sBAAsB,CAAA,CACxD,MAAA,CAAO,gBAAgB,4CAA4C,CAAA,CACnE,OAAO,kBAAA,EAAoB,mBAAmB,EAC9C,MAAA,CAAO,4BAAA,EAA8B,8BAAA,EAAgC,mBAAmB,CAAA,CACxF,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA,CACvD,MAAA,CAAO,OAAO,OAAA,KAAqC;AAClD,IAAA,MAAM,YAAA,CAAa,SAAS,OAAO,CAAA;AAAA,EACrC,CAAC,CAAA;AAEH,EAAA,IAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,4CAA4C,CAAA,CACxD,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA,CACvD,MAAA,CAAO,OAAO,OAAA,KAAgC;AAC7C,IAAA,MAAM,aAAA,CAAc,SAAS,OAAO,CAAA;AAAA,EACtC,CAAC,CAAA;AAEH,EAAA,IAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,uDAAuD,CAAA,CACnE,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA,CACvD,MAAA,CAAO,OAAO,OAAA,KAAgC;AAC7C,IAAA,MAAM,YAAA,CAAa,SAAS,OAAO,CAAA;AAAA,EACrC,CAAC,CAAA;AAEH,EAAA,IAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,gDAAgD,CAAA,CAC5D,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA,CACvD,MAAA,CAAO,OAAO,OAAA,KAAgC;AAC7C,IAAA,MAAM,aAAA,CAAc,SAAS,OAAO,CAAA;AAAA,EACtC,CAAC,CAAA;AAEH,EAAA,IAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,yCAAyC,CAAA,CACrD,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA,CACvD,MAAA,CAAO,OAAO,OAAA,KAAgC;AAC7C,IAAA,MAAM,WAAA,CAAY,SAAS,OAAO,CAAA;AAAA,EACpC,CAAC,CAAA;AAEH,EAAA,IAAA,CACG,QAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,uBAAuB,EACnC,QAAA,CAAS,cAAA,EAAgB,mDAAmD,CAAA,CAC5E,OAAO,cAAA,EAAgB,4CAA4C,EACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CACC,OAAO,aAAA,EAAe,iCAAiC,EACvD,MAAA,CAAO,OAAO,SAAmB,OAAA,KAAgC;AAChE,IAAA,MAAM,cAAA,CAAe,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EAChD,CAAC,CAAA;AAEH,EAAA,IAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,4DAA4D,CAAA,CACxE,QAAA,CAAS,cAAA,EAAgB,iDAAiD,CAAA,CAC1E,MAAA,CAAO,OAAO,OAAA,KAAsB;AACnC,IAAA,MAAM,SAAA,CAAU,SAAS,OAAO,CAAA;AAAA,EAClC,CAAC,CAAA;AACL;AAaA,eAAe,mBAAA,CACb,UAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,QAAA,EAAU;AACxC,IAAA,MAAM,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACvC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,YAAA,EAAc,OAAO,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAAoB;AACpC,IAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,MAAA,EAAQ;AAClC,MAAA,OAAA,CAAQ,MAAM,OAAO,CAAA;AACrB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,SAAS,MAAM,8BAAA;AAAA,MACnB;AAAA,QACE,GAAG,OAAA;AAAA,QACH,GAAI,SAAS,OAAA,GAAU,EAAE,SAAS,QAAA,CAAS,OAAA,KAAY,EAAC;AAAA,QACxD,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,KACF;AACA,IAAA,SAAA;AAAA,MACE;AAAA,QACE,gBAAA,EAAkB,OAAO,IAAA,CAAK,uBAAA;AAAA,QAC9B,gBAAA,EAAkB,OAAO,IAAA,CAAK,eAAA;AAAA,QAC9B,SAAA,EAAW,OAAO,IAAA,CAAK,QAAA;AAAA,QACvB,WAAA,EAAa,OAAO,IAAA,CAAK,UAAA;AAAA,QACzB,UAAA,EAAY,OAAO,IAAA,CAAK,SAAA;AAAA,QACxB,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAAA,QACtB,IAAA,EAAM,CAAA,iHAAA,EAAoH,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,OAClJ;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,QAAA,EAAU;AAAA;AACZ,KACF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,GACpB,MAAM,4BAAA;AAAA,IACJ;AAAA,MACE,GAAG,OAAA;AAAA,MACH,GAAI,SAAS,OAAA,GAAU,EAAE,SAAS,QAAA,CAAS,OAAA,KAAY,EAAC;AAAA,MACxD,UAAA,EAAY;AAAA,KACd;AAAA,IACA,YAAA;AAAA,IACA,OAAA,CAAQ;AAAA,MAEV,MAAM,QAAA;AAAA,IACJ;AAAA,MACE,GAAG,OAAA;AAAA,MACH,GAAI,SAAS,OAAA,GAAU,EAAE,SAAS,QAAA,CAAS,OAAA,KAAY,EAAC;AAAA,MACxD,UAAA,EAAY;AAAA,KACd;AAAA,IACA;AAAA,GACF;AAEJ,EAAA,MAAM,aAAA,GAAgB,MAAM,YAAA,CAAa,SAAA,EAAU;AACnD,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,MAAM,aAAa,UAAA,CAAW;AAAA,MAC5B,GAAG,aAAA;AAAA,MACH,YAAY,QAAA,CAAS;AAAA,KACtB,CAAA;AAAA,EACH;AACA,EAAA,MAAM,aAAa,MAAM,cAAA;AAAA,IACvB,UAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,CAAS,UAAA;AAAA,IACT;AAAA,GACF;AACA,EAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,SAAA,EAAU;AAClD,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,KAAA,EAAO,eAAA;AAAA,IACP,WAAA,EACE,YAAA,CAAa,WAAA,IAAe,2BAAA,EAA4B,CAAE,IAAA;AAAA,IAC5D,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,WAAA,EAAa,WAAA;AAAA,IACb,OAAA,EAAS,SAAA;AAAA,IACT,YAAY,UAAA,CAAW,cAAA;AAAA,IACvB,SAAS,UAAA,CAAW,eAAA;AAAA,IACpB,WAAA,EACE;AAAA,GACJ;AACA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,SAAA,CAAU,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAClC,IAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAC9C,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,CAAA,aAAA,EAAgB,QAAQ,QAAA,IAAY,OAAA,CAAQ,MAAM,CAAA,SAAA,EAAY,OAAA,CAAQ,UAAU,SAAS,CAAA,CAAA;AAAA,GAC3F;AACA,EAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AACrC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AACvC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAC5C,EAAA,IAAI,UAAA,CAAW,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AACxC,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,aAAA,EAAgB,sBAAA,CAAuB,UAAA,CAAW,cAAc,CAAC,CAAA;AAAA,KACnE;AAAA,EACF;AACA,EAAA,KAAA,MAAW,cAAA,IAAkB,WAAW,eAAA,EAAiB;AACvD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,EAAS,cAAc,CAAA,CAAE,CAAA;AAAA,EACvC;AACF;AAQA,eAAe,gBAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,CAAC,QAAQ,QAAA,EAAU;AAC1C,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,kDAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,cAAc,OAAO,CAAA;AACzE,EAAA,MAAM,UACJ,QAAA,CAAS,OAAA,IAAW,SAAS,MAAA,CAAO,OAAA,IAAW,6BAA4B,CAAE,OAAA;AAC/E,EAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc;AAAA,IAC/B,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB,UAAA,EAAY;AAAA,GACb,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,iBAAA,CAAkB,OAAA,EAAS;AAAA,IACtD,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,YAAA,EAAc,QAAQ,YAAA,IAAgB;AAAA,GACvC,CAAA;AACD,EAAA,MAAM,UAAU,MAAM,sBAAA;AAAA,IACpB,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,KAAA,EAAO,eAAA;AAAA,IACP,WAAA,EAAa,QAAA,CAAS,MAAA,CAAO,WAAA,IAAe,6BAA4B,CAAE,IAAA;AAAA,IAC1E,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAS,OAAA,CAAQ;AAAA,GACnB;AACA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,SAAA,CAAU,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAClC,IAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAC9C,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,CAAA,aAAA,EAAgB,QAAQ,QAAA,IAAY,OAAA,CAAQ,MAAM,CAAA,SAAA,EAAY,OAAA,CAAQ,UAAU,SAAS,CAAA,CAAA;AAAA,GAC3F;AACF;AAQA,eAAe,YAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,cAAc,OAAO,CAAA;AACzE,EAAA,MAAM,UACJ,QAAA,CAAS,OAAA,IAAW,SAAS,MAAA,CAAO,OAAA,IAAW,6BAA4B,CAAE,OAAA;AAC/E,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,mBAAA;AACzC,EAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc;AAAA,IAC/B,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB;AAAA,GACD,CAAA;AACD,EAAA,MAAM,YAAY,MAAM,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,QAAQ,KAAK,CAAA;AAChE,EAAA,MAAM,OAAA,GAAyB;AAAA,IAC7B,OAAA;AAAA,IACA,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,cAAc,OAAA,CAAQ,KAAA;AAAA,IACtB,UAAA;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACpC;AACA,EAAA,IAAI,SAAA,CAAU,WAAW,MAAA,EAAW;AAClC,IAAA,OAAA,CAAQ,SAAS,SAAA,CAAU,MAAA;AAAA,EAC7B;AACA,EAAA,IAAI,SAAA,CAAU,WAAW,MAAA,EAAW;AAClC,IAAA,OAAA,CAAQ,SAAS,SAAA,CAAU,MAAA;AAAA,EAC7B;AACA,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,IAAQ,SAAA,CAAU,QAAA;AAC7C,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,OAAA,CAAQ,QAAA,GAAW,QAAA;AAAA,EACrB;AACA,EAAA,MAAM,WAAA,CAAY,SAAS,OAAO,CAAA;AAClC,EAAA,SAAA;AAAA,IACE;AAAA,MACE,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,YAAY,OAAA,CAAQ;AAAA,KACtB;AAAA,IACA,qBAAqB,OAAO;AAAA,GAC9B;AACF;AAWA,eAAe,sBAAA,CACb,OAAA,EACA,OAAA,EACA,OAAA,EACA,UAAA,EACwB;AACxB,EAAA,MAAM,WAAW,OAAA,CAAQ,WAAA;AACzB,EAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACpB,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,OAAA,GAAyB;AAAA,IAC7B,OAAA;AAAA,IACA,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,YAAA,EAAc,QAAA,CAAS,YAAA,IAAgB,QAAA,CAAS,KAAA;AAAA,IAChD,UAAA;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACpC;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,IAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,EAC3B;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,EAAA,KAAO,MAAA,EAAW;AACpC,IAAA,OAAA,CAAQ,MAAA,GAAS,QAAQ,MAAA,CAAO,EAAA;AAAA,EAClC;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,EAAQ,IAAA,IAAQ,QAAQ,MAAA,EAAQ,QAAA;AACzD,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,OAAA,CAAQ,QAAA,GAAW,QAAA;AAAA,EACrB;AACA,EAAA,IAAI,QAAA,CAAS,oBAAoB,MAAA,EAAW;AAC1C,IAAA,OAAA,CAAQ,kBAAkB,QAAA,CAAS,eAAA;AAAA,EACrC;AACA,EAAA,IAAI,QAAA,CAAS,2BAA2B,MAAA,EAAW;AACjD,IAAA,OAAA,CAAQ,yBAAyB,QAAA,CAAS,sBAAA;AAAA,EAC5C;AACA,EAAA,MAAM,WAAA,CAAY,SAAS,OAAO,CAAA;AAClC,EAAA,OAAO,OAAA;AACT;AAQA,eAAe,WAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,YAAA,CAAa,SAAA,EAAU;AACpD,EAAA,MAAM,OAAA,CAAQ,aAAa,UAAA,CAAW;AAAA,IACpC,GAAG,MAAA;AAAA,IACH,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,GAAI,QAAQ,MAAA,GAAS,EAAE,eAAe,OAAA,CAAQ,MAAA,KAAW;AAAC,GAC3D,CAAA;AACD,EAAA,MAAM,OAAA,CAAQ,YAAA,CAAa,WAAA,CAAY,OAAO,CAAA;AAChD;AAQA,eAAe,aAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,MAAA,GAAA,CAAU,MAAM,oBAAA,CAAqB,YAAA,EAAc,OAAO,CAAA,EAAG,MAAA;AACnE,EAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,UAAA,EAAW;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,SAAA;AAAA,MACE;AAAA,QACE,QAAA,EAAU,KAAA;AAAA,QACV,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,2BAAA,EAA4B,CAAE,IAAA;AAAA,QACjE,IAAA,EAAM;AAAA,OACR;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AACA,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,EAAE,cAAc,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,OAAA,EAAS,OAAO,CAAA;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,YAAY,MAAM,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,QAAQ,KAAK,CAAA;AAChE,IAAA,SAAA;AAAA,MACE;AAAA,QACE,QAAA,EAAU,IAAA;AAAA,QACV,UAAA,EAAY,IAAA;AAAA,QACZ,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,SAAA,CAAU,MAAA;AAAA,QACpC,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,SAAA,CAAU,QAAQ,SAAA,CAAU,QAAA;AAAA,QAC1D,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,SAAA,CAAU,MAAA;AAAA,QACpC,OAAA;AAAA,QACA,iBAAiB,OAAA,CAAQ,eAAA;AAAA,QACzB,wBAAwB,OAAA,CAAQ;AAAA,OAClC;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,SAAA;AAAA,MACE;AAAA,QACE,QAAA,EAAU,IAAA;AAAA,QACV,UAAA,EAAY,KAAA;AAAA,QACZ,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA;AAAA,QACA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC5D,IAAA,EAAM;AAAA,OACR;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AAAA,EACF;AACF;AAQA,eAAe,YAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAA,KAAY,MAAM,yBAAA;AAAA,IACzC,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,YAAY,MAAM,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,QAAQ,KAAK,CAAA;AAChE,EAAA,SAAA;AAAA,IACE;AAAA,MACE,UAAA,EAAY,IAAA;AAAA,MACZ,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,IAAA,EAAM,SAAA,CAAU,IAAA,IAAQ,SAAA,CAAU;AAAA,KACpC;AAAA,IACA,qBAAqB,OAAO;AAAA,GAC9B;AACF;AAQA,eAAe,aAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAA,KAAY,MAAM,yBAAA;AAAA,IACzC,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,YAAY,MAAM,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,QAAQ,KAAK,CAAA;AAChE,EAAA,SAAA;AAAA,IACE;AAAA,MACE,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,SAAA,CAAU,MAAA;AAAA,MACpC,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,SAAA,CAAU,QAAQ,SAAA,CAAU,QAAA;AAAA,MAC1D,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,SAAA,CAAU,MAAA;AAAA,MACpC,OAAA;AAAA,MACA,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,wBAAwB,OAAA,CAAQ;AAAA,KAClC;AAAA,IACA,qBAAqB,OAAO;AAAA,GAC9B;AACF;AAWA,eAAe,WAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,MAAM,UAAU,MAAM,oBAAA;AAAA,IACpB,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF,EAAG,MAAA;AACH,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,YAAA,CAAa,UAAA,EAAW;AACtD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,SAAA;AAAA,MACE;AAAA,QACE,UAAU,EAAC;AAAA,QACX,iBAAA,EACE,MAAA,CAAO,WAAA,IAAe,2BAAA,EAA4B,CAAE;AAAA,OACxD;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc;AAAA,IAC/B,cAAc,OAAA,CAAQ;AAAA,GACvB,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,OAAA,EAAS,OAAO,CAAA;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,YAAY,MAAM,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,QAAQ,KAAK,CAAA;AAChE,IAAA,SAAA;AAAA,MACE;AAAA,QACE,QAAA,EAAU;AAAA,UACR;AAAA,YACE,MAAA,EAAQ,IAAA;AAAA,YACR,UAAA,EAAY,IAAA;AAAA,YACZ,WAAA,EACE,MAAA,CAAO,WAAA,IAAe,2BAAA,EAA4B,CAAE,IAAA;AAAA,YACtD,OAAA;AAAA,YACA,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,SAAA,CAAU,MAAA;AAAA,YACpC,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,SAAA,CAAU,QAAQ,SAAA,CAAU,QAAA;AAAA,YAC1D,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,SAAA,CAAU,MAAA;AAAA,YACpC,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,YACzB,wBAAwB,OAAA,CAAQ;AAAA;AAClC;AACF,OACF;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,SAAA;AAAA,MACE;AAAA,QACE,QAAA,EAAU;AAAA,UACR;AAAA,YACE,MAAA,EAAQ,IAAA;AAAA,YACR,UAAA,EAAY,KAAA;AAAA,YACZ,WAAA,EACE,MAAA,CAAO,WAAA,IAAe,2BAAA,EAA4B,CAAE,IAAA;AAAA,YACtD,OAAA;AAAA,YACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAC9D;AACF,OACF;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AAAA,EACF;AACF;AASA,eAAe,cAAA,CACb,UAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,OAAO,CAAA;AAC5C,EAAA,MAAM,UAAU,MAAM,oBAAA;AAAA,IACpB,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF,EAAG,MAAA;AACH,EAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc;AAAA,IAC/B,cAAc,OAAA,CAAQ;AAAA,GACvB,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,OAAA,EAAS,OAAO,CAAA;AACzD,EAAA,MAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,cAAA,CAAe;AAAA,IACnD,GAAG,OAAA;AAAA,IACH;AAAA,GACD,CAAA;AACD,EAAA,MAAM,aAAa,MAAM,cAAA;AAAA,IACvB,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA,CAAO,cAAc,gBAAA,CAAiB,OAAA;AAAA,IACtC,CAAC,OAAA,KAAY;AACX,MAAA,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,IACvB;AAAA,GACF;AACA,EAAA,SAAA;AAAA,IACE;AAAA,MACE,SAAA,EAAW,IAAA;AAAA,MACX,QAAQ,gBAAA,CAAiB,MAAA;AAAA,MACzB,UAAU,gBAAA,CAAiB,QAAA;AAAA,MAC3B,QAAQ,gBAAA,CAAiB,MAAA;AAAA,MACzB,SAAS,gBAAA,CAAiB,OAAA;AAAA,MAC1B,iBAAiB,gBAAA,CAAiB,eAAA;AAAA,MAClC,wBAAwB,gBAAA,CAAiB,sBAAA;AAAA,MACzC,OAAA,EAAS,SAAA;AAAA,MACT,YAAY,UAAA,CAAW,cAAA;AAAA,MACvB,SAAS,UAAA,CAAW;AAAA,KACtB;AAAA,IACA,qBAAqB,OAAO;AAAA,GAC9B;AACF;AAQA,eAAe,eAAe,OAAA,EAAyB;AACrD,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,YAAA,CAAa,UAAA,EAAW;AACtD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,yBAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACT;AASA,eAAe,kBAAA,CACb,SACA,OAAA,EACiB;AACjB,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,wBAAA;AAAA,IACxB,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,OAAO,OAAA;AACT;AASA,eAAe,yBAAA,CACb,SACA,OAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,OAAO,CAAA;AAC5C,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,wBAAA;AAAA,IAChC,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;AClvBO,SAAS,qBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,OAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA;AAAA,IACC;AAAA,GACF,CACC,OAAO,YAAY;AAClB,IAAA,MAAM,SAAA,CAAU,OAAA,EAAS,EAAE,CAAA;AAAA,EAC7B,CAAC,CAAA;AACL;AAOA,eAAsB,eAAe,OAAA,EAAwC;AAC3E,EAAA,MAAM,UAAU,OAAA,EAAS;AAAA,IACvB,WAAA,EAAa,IAAA;AAAA,IACb,kBAAA,EAAoB,IAAA;AAAA,IACpB,wBAAA,EAA0B;AAAA,GAC3B,CAAA;AACH;AAQA,eAAsB,SAAA,CACpB,SACA,OAAA,EAKe;AACf,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,MAAA,GAAA,CAAU,MAAM,oBAAA,CAAqB,YAAY,CAAA,EAAG,MAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,UAAA,EAAW;AAC9C,EAAA,MAAM,YAAA,GAAe,MAAM,mBAAA,EAAoB;AAC/C,EAAA,MAAM,QAAQ,mBAAA,EAAoB;AAElC,EAAA,IAAI,OAAA,EAAS,eAAe,IAAA,EAAM;AAChC,IAAA,cAAA,EAAe;AAAA,EACjB;AACA,EAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,IAAA,YAAA,CAAa,WAAW,MAAM,CAAA;AAC9B,IAAA,UAAA,CAAW,kBAAkB,QAAQ,CAAA;AACrC,IAAA,UAAA,CAAW,qBAAqB,WAAW,CAAA;AAC3C,IAAA,UAAA,CAAW,cAAA,EAAgB,QAAQ,OAAO,CAAA;AAAA,EAC5C;AAEA,EAAA,YAAA,CAAa,UAAU,MAAM,CAAA;AAC7B,EAAA,UAAA;AAAA,IACE,aAAA;AAAA,IACA,SAAS,MAAA,CAAO,WAAA,IAAe,2BAAA,EAA4B,CAAE,MAAM,MAAM;AAAA,GAC3E;AACA,EAAA,UAAA;AAAA,IACE,UAAA;AAAA,IACA,MAAA,CAAO,OAAA,IAAW,2BAAA,EAA4B,CAAE;AAAA,GAClD;AACA,EAAA,UAAA;AAAA,IACE,cAAA;AAAA,IACA,MAAA,CAAO,UAAA,IAAc,2BAAA,EAA4B,CAAE;AAAA,GACrD;AACA,EAAA,UAAA,CAAW,iBAAA,EAAmB,MAAA,CAAO,aAAA,IAAiB,WAAW,CAAA;AACjE,EAAA,UAAA;AAAA,IACE,qBAAA;AAAA,IACA,MAAA,CAAO,MAAA,CAAO,iBAAA,IAAqB,QAAQ;AAAA,GAC7C;AACA,EAAA,UAAA,CAAW,YAAA,EAAc,MAAA,CAAO,MAAA,CAAO,SAAA,IAAa,IAAK,CAAC,CAAA;AAE1D,EAAA,IAAI,OAAA,EAAS,4BAA4B,IAAA,EAAM;AAC7C,IAAA,YAAA,CAAa,WAAW,MAAM,CAAA;AAC9B,IAAA,UAAA,CAAW,aAAA,EAAe,YAAA,CAAa,YAAA,CAAa,mBAAmB,CAAC,CAAA;AACxE,IAAA,UAAA;AAAA,MACE,qBAAA;AAAA,MACA,YAAA,CAAa,aAAa,2BAA2B;AAAA,KACvD;AACA,IAAA,UAAA;AAAA,MACE,qBAAA;AAAA,MACA,YAAA,CAAa,aAAa,qBAAqB;AAAA,KACjD;AACA,IAAA,UAAA;AAAA,MACE,gBAAA;AAAA,MACA,YAAA,CAAa,aAAa,uBAAuB;AAAA,KACnD;AACA,IAAA,UAAA,CAAW,WAAA,EAAa,YAAA,CAAa,YAAA,CAAa,iBAAiB,CAAC,CAAA;AACpE,IAAA,UAAA,CAAW,YAAA,EAAc,YAAA,CAAa,YAAA,CAAa,kBAAkB,CAAC,CAAA;AACtE,IAAA,UAAA,CAAW,cAAA,EAAgB,YAAA,CAAa,YAAA,CAAa,oBAAoB,CAAC,CAAA;AAC1E,IAAA,UAAA,CAAW,WAAA,EAAa,YAAA,CAAa,YAAA,CAAa,kBAAkB,CAAC,CAAA;AACrE,IAAA,UAAA,CAAW,YAAA,EAAc,YAAA,CAAa,YAAA,CAAa,mBAAmB,CAAC,CAAA;AACvE,IAAA,UAAA,CAAW,cAAA,EAAgB,YAAA,CAAa,YAAA,CAAa,qBAAqB,CAAC,CAAA;AAC3E,IAAA,UAAA,CAAW,kBAAA,EAAoB,MAAM,cAAc,CAAA;AACnD,IAAA,UAAA,CAAW,0BAAA,EAA4B,MAAM,sBAAsB,CAAA;AACnE,IAAA,UAAA,CAAW,mBAAA,EAAqB,MAAM,eAAe,CAAA;AACrD,IAAA,UAAA,CAAW,qBAAA,EAAuB,MAAM,iBAAiB,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,YAAA,CAAa,WAAW,MAAM,CAAA;AAC9B,IAAA,UAAA,CAAW,SAAA,EAAW,QAAA,CAAS,SAAA,EAAW,MAAM,CAAC,CAAA;AACjD,IAAA;AAAA,EACF;AAEA,EAAA,YAAA,CAAa,WAAW,MAAM,CAAA;AAC9B,EAAA,UAAA;AAAA,IACE,SAAA;AAAA,IACA,QAAA;AAAA,MACE,CAAA,YAAA,EAAe,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,UAAU,cAAc,CAAA,CAAA;AAAA,MACnE;AAAA;AACF,GACF;AACA,EAAA,UAAA,CAAW,kBAAA,EAAoB,QAAQ,OAAO,CAAA;AAC9C,EAAA,UAAA,CAAW,iBAAA,EAAmB,OAAA,CAAQ,MAAA,IAAU,WAAW,CAAA;AAC3D,EAAA,UAAA,CAAW,iBAAA,EAAmB,OAAA,CAAQ,MAAA,IAAU,WAAW,CAAA;AAC3D,EAAA,UAAA;AAAA,IACE,mBAAA;AAAA,IACA,MAAA,CAAO,OAAA,CAAQ,eAAA,IAAmB,WAAW;AAAA,GAC/C;AACA,EAAA,UAAA;AAAA,IACE,2BAAA;AAAA,IACA,MAAA,CAAO,OAAA,CAAQ,sBAAA,IAA0B,WAAW;AAAA,GACtD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,IAAI,aAAA,CAAc;AAAA,MAClC,YAAA;AAAA,MACA,GAAI,OAAO,SAAA,KAAc,KAAA,CAAA,GACrB,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GAC9B;AAAC,KACN,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,UAAA;AAAA,MAChC,OAAA,CAAQ,OAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AACA,IAAA,YAAA,CAAa,OAAO,MAAM,CAAA;AAC1B,IAAA,UAAA;AAAA,MACE,WAAA;AAAA,MACA,QAAA;AAAA,QACE,CAAA,YAAA,EAAe,SAAA,CAAU,MAAM,CAAA,QAAA,EAAW,UAAU,MAAM,CAAA,CAAA;AAAA,QAC1D;AAAA;AACF,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,YAAA,CAAa,OAAO,MAAM,CAAA;AAC1B,IAAA,UAAA,CAAW,aAAa,QAAA,CAAS,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,EAAI,MAAM,CAAC,CAAA;AAAA,EACjE;AACF;;;ACpJO,SAAS,kBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,OAAA,CACG,OAAA,CAAQ,KAAK,CAAA,CACb,WAAA,CAAY,+CAA+C,CAAA,CAC3D,QAAA,CAAS,UAAA,EAAY,yCAAyC,EAC9D,QAAA,CAAS,QAAA,EAAU,kBAAkB,CAAA,CACrC,SAAS,WAAA,EAAa,oBAAoB,CAAA,CAC1C,MAAA,CAAO,wBAAwB,qCAAqC,CAAA,CACpE,MAAA,CAAO,iBAAA,EAAmB,sCAAsC,CAAA,CAChE,MAAA,CAAO,6BAAA,EAA+B,oCAAoC,EAC1E,MAAA,CAAO,OACN,MAAA,EACA,IAAA,EACA,SACA,OAAA,KACG;AACH,IAAA,MAAM,qBAAA,CAAsB,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,EACrE,CAAC,CAAA;AACL;AAOA,eAAe,mBAAmB,OAAA,EAAwC;AACxE,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,YAAA,CAAa,SAAA,EAAU;AACpD,EAAA,KAAA,MAAW,MAAA,IAAU,+BAAA,CAAgC,MAAM,CAAA,EAAG;AAC5D,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,SAAA,EAAY,OAAO,MAAM,CAAA,MAAA,EAAS,MAAA,CAAO,OAAO,CAAA,MAAA,EAAS,MAAA,CAAO,UAAU,CAAA,OAAA,EAAU,OAAO,WAAW,CAAA;AAAA,KACtH;AAAA,EACF;AACF;AAOA,eAAe,sBAAsB,OAAA,EAAwC;AAC3E,EAAA,MAAM,MAAA,GAAA,CAAU,MAAM,oBAAA,CAAqB,OAAA,CAAQ,YAAY,CAAA,EAAG,MAAA;AAClE,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,CAAA,aAAA,EAAgB,MAAA,CAAO,WAAA,IAAe,2BAAA,GAA8B,IAAI,CAAA;AAAA,GAC1E;AACA,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,CAAA,UAAA,EAAa,MAAA,CAAO,OAAA,IAAW,2BAAA,GAA8B,OAAO,CAAA;AAAA,GACtE;AACA,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,CAAA,cAAA,EAAiB,MAAA,CAAO,UAAA,IAAc,2BAAA,GAA8B,UAAU,CAAA;AAAA,GAChF;AACF;AAQA,eAAe,iBAAA,CACb,aACA,OAAA,EACe;AACf,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,YAAA,CAAa,SAAA,EAAU;AAC3D,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,YAAA,CAAa,UAAA,EAAW;AAC7D,EAAA,MAAM,MAAA,GAAS,2BAAA,CAA4B,WAAA,EAAa,aAAa,CAAA;AACrE,EAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,aAAA,EAAe,MAAM,CAAA;AAC/D,EAAA,MAAM,OAAA,CAAQ,YAAA,CAAa,UAAA,CAAW,UAAU,CAAA;AAChD,EAAA,IAAI,cAAA,IAAkB,cAAA,CAAe,OAAA,KAAY,MAAA,CAAO,OAAA,EAAS;AAC/D,IAAA,MAAM,OAAA,CAAQ,aAAa,YAAA,EAAa;AACxC,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACzC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AACzC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAClD;AAUA,eAAe,iBAAA,CACb,IAAA,EACA,OAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,YAAA,CAAa,SAAA,EAAU;AAC3D,EAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,IAC1C,IAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAI,QAAQ,UAAA,GAAa,EAAE,YAAY,OAAA,CAAQ,UAAA,KAAe,EAAC;AAAA,IAC/D,GAAI,QAAQ,KAAA,GAAQ,EAAE,OAAO,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,IAChD,GAAI,QAAQ,WAAA,GAAc,EAAE,aAAa,OAAA,CAAQ,WAAA,KAAgB;AAAC,GACnE,CAAA;AACD,EAAA,MAAM,QAAQ,YAAA,CAAa,UAAA;AAAA,IACzB,uBAAA,CAAwB,eAAe,MAAM;AAAA,GAC/C;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAC/C,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AACzC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAChD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACtD;AAQA,eAAe,oBAAA,CACb,MACA,OAAA,EACe;AACf,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,YAAA,CAAa,SAAA,EAAU;AAC3D,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,YAAA,CAAa,UAAA,EAAW;AAC7D,EAAA,MAAM,cAAA,GAAiB,yBAAyB,IAAI,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,aAAA,EAAe,IAAI,CAAA;AAC1D,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI,CAAA,CAAE,CAAA;AAAA,EACzD;AACA,EAAA,MAAM,OAAA,CAAQ,YAAA,CAAa,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AACnD,EAAA,IAAI,cAAA,IAAkB,aAAA,CAAc,WAAA,KAAgB,cAAA,EAAgB;AAClE,IAAA,MAAM,OAAA,CAAQ,aAAa,YAAA,EAAa;AACxC,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAC5C;AAWA,eAAe,qBAAA,CACb,MAAA,EACA,WAAA,EACA,OAAA,EACA,SACA,OAAA,EACe;AACf,EAAA,MAAM,gBAAA,GAAmB,MAAA,EAAQ,IAAA,EAAK,CAAE,aAAY,IAAK,SAAA;AACzD,EAAA,IAAI,qBAAqB,MAAA,EAAQ;AAC/B,IAAA,MAAM,mBAAmB,OAAO,CAAA;AAChC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,qBAAqB,SAAA,EAAW;AAClC,IAAA,MAAM,sBAAsB,OAAO,CAAA;AACnC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,qBAAqB,KAAA,EAAO;AAC9B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,iBAAA,CAAkB,aAAa,OAAO,CAAA;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,qBAAqB,KAAA,EAAO;AAC9B,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC5B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,iBAAA,CAAkB,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAC9D,IAAA;AAAA,EACF;AACA,EAAA,IAAI,qBAAqB,QAAA,EAAU;AACjC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,oBAAA,CAAqB,aAAa,OAAO,CAAA;AAC/C,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,uBAAuB,gBAAgB,CAAA,oDAAA;AAAA,GACzC;AACF;;;ACtMO,SAAS,kBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,OAAA,CACG,QAAQ,KAAK,CAAA,CACb,YAAY,yDAAyD,CAAA,CACrE,OAAO,YAAY;AAClB,IAAA,MAAM,aAAa,OAAO,CAAA;AAAA,EAC5B,CAAC,CAAA,CACA,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,yDAAyD,CAAA,CACrE,QAAA,CAAS,cAAA,EAAgB,kDAAkD,CAAA,CAC3E,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,sBAAA,EAAwB,0BAA0B,CAAA,CACzD,MAAA,CAAO,mBAAA,EAAqB,uCAAA,EAAyC,YAAY,CAAA,CACjF,MAAA;AAAA,IACC,OACE,SACA,OAAA,KAOG;AACH,MAAA,MAAM,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,IAC/C;AAAA,GACF;AACJ;AAYA,eAAe,aAAA,CACb,UAAA,EACA,OAAA,EACA,OAAA,EAOe;AACf,EAAA,KAAK,OAAA,EAAS,SAAA;AACd,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,MAAM,uBAAA,CAAwB,mBAAA,CAAoB,UAAU,CAAC,CAAA;AAC9E,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,YAAA,EAAc,OAAO,CAAA;AACjE,EAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,UAAA,EAAW;AAC9C,EAAA,MAAM,UAAA,GAAa,OAAA,GACf,MAAM,sBAAA,CAAuB;AAAA,IAC3B,OAAA,EAAS,QAAA;AAAA,IACT,OAAA;AAAA,IACA,GAAI,SAAS,UAAA,GAAa,EAAE,YAAY,QAAA,CAAS,UAAA,KAAe,EAAC;AAAA,IACjE,YAAY,CAAC,OAAA,KAAY,QAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,OAAO,CAAA,CAAE;AAAA,GAC5D,CAAA,GACD,MAAM,mBAAA,CAAoB;AAAA,IACxB,OAAA,EAAS,QAAA;AAAA,IACT,GAAI,SAAS,OAAA,GAAU,EAAE,SAAS,QAAA,CAAS,OAAA,KAAY,EAAC;AAAA,IACxD,GAAI,SAAS,UAAA,GAAa,EAAE,YAAY,QAAA,CAAS,UAAA,KAAe;AAAC,GAClE,CAAA;AAEL,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,sBAAA,CAAuB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAC9D,EAAA,IAAI,UAAA,CAAW,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AACxC,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,gBAAA,EAAmB,sBAAA,CAAuB,UAAA,CAAW,cAAc,CAAC,CAAA;AAAA,KACtE;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,cAAA,IAAkB,WAAW,eAAA,EAAiB;AACvD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,EAAS,cAAc,CAAA,CAAE,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,CAAQ,IAAI,sGAAyD,CAAA;AAAA,EACvE;AACF;AAOA,eAAe,aAAa,OAAA,EAAwC;AAClE,EAAA,MAAM,MAAA,GAAA,CAAU,MAAM,oBAAA,CAAqB,OAAA,CAAQ,YAAY,CAAA,EAAG,MAAA;AAClE,EAAA,MAAM,CAAC,WAAA,EAAa,YAAA,EAAc,cAAc,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACpE,yBAAA,EAA0B;AAAA,IAC1B,0BAAA,EAA2B;AAAA,IAC3B,4BAAA;AAA6B,GAC9B,CAAA;AACD,EAAA,OAAA,CAAQ,IAAI,CAAA,sBAAA,CAAwB,CAAA;AACpC,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,CAAA,aAAA,EAAgB,MAAA,CAAO,WAAA,IAAe,2BAAA,GAA8B,IAAI,CAAA;AAAA,GAC1E;AACA,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,CAAA,cAAA,EAAiB,MAAA,CAAO,UAAA,IAAc,2BAAA,GAA8B,UAAU,CAAA;AAAA,GAChF;AACA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAC/B,IAAA,OAAA,CAAQ,IAAI,WAAW,CAAA;AAAA,EACzB,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAAA,EAClC;AACA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAChC,IAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AAAA,EAC1B,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AAAA,EACnC;AACA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAA,CAAQ,IAAI,sBAAsB,CAAA;AAClC,IAAA,OAAA,CAAQ,IAAI,cAAc,CAAA;AAAA,EAC5B,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AAAA,EACrC;AACF;;;ACjEO,SAAS,0BACd,UAAA,EACyB;AACzB,EAAA,MAAM,IAAA,GAAO,iBAAiB,UAAU,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,WAAA;AAC1B,EAAA,MAAM,gBAAgB,IAAI,GAAA,CAAI,KAAK,eAAA,EAAiB,QAAA,IAAY,EAAE,CAAA;AAClE,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,eAAA,EAAiB,UAAA,IAAc,EAAC;AAC9D,EAAA,MAAM,cAAA,uBAAqB,GAAA,CAAY;AAAA,IACrC,GAAG,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAC/B,IAAI,IAAA,CAAK,UAAA,IAAc,EAAC,EACrB,IAAI,CAAC,SAAA,KAAc,SAAA,CAAU,IAAI,EACjC,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAA,CAAQ,KAAK,CAAC;AAAA,GACrD,CAAA;AACD,EAAA,MAAM,UAAA,GAA2C,CAAC,GAAG,cAAc,CAAA,CAAE,GAAA;AAAA,IACnE,CAAC,aAAA,KAAkB;AACjB,MAAA,MAAM,cAAA,GAAiB,iBAAiB,aAAa,CAAA;AACrD,MAAA,MAAM,SAAA,GAAY,KAAK,UAAA,EAAY,IAAA;AAAA,QACjC,CAACK,UAAAA,KAAcA,UAAAA,CAAU,IAAA,KAAS;AAAA,OACpC;AACA,MAAA,MAAM,SAAA,GAAwC;AAAA,QAC5C,IAAA,EAAM,aAAA;AAAA,QACN,QAAA,EAAU,OAAA;AAAA,UACR,SAAA,EAAW,QAAA,IAAY,aAAA,CAAc,GAAA,CAAI,aAAa;AAAA;AACxD,OACF;AACA,MAAA,MAAM,IAAA,GAAO,cAAA,EAAgB,IAAA,IAAQ,SAAA,EAAW,aAAA;AAChD,MAAA,IAAI,SAAS,MAAA,EAAW;AACtB,QAAA,SAAA,CAAU,IAAA,GAAO,IAAA;AAAA,MACnB;AACA,MAAA,MAAM,WAAA,GAAc,cAAA,EAAgB,WAAA,IAAe,SAAA,EAAW,WAAA;AAC9D,MAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,QAAA,SAAA,CAAU,WAAA,GAAc,WAAA;AAAA,MAC1B;AACA,MAAA,IAAI,cAAA,EAAgB,SAAS,MAAA,EAAW;AACtC,QAAA,SAAA,CAAU,OAAO,cAAA,CAAe,IAAA;AAAA,MAClC;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,MAAM,uBACJ,OAAA,CAAQ,IAAA,CAAK,oBAAoB,CAAA,IAAK,KAAK,aAAA,KAAkB,QAAA;AAC/D,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,GAAI,KAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU,EAAC;AAAA,IAC1C,GAAI,KAAK,WAAA,GAAc,EAAE,aAAa,IAAA,CAAK,WAAA,KAAgB,EAAC;AAAA,IAC5D,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW,EAAC;AAAA,IAC7C,GAAI,KAAK,WAAA,GAAc,EAAE,aAAa,IAAA,CAAK,WAAA,KAAgB,EAAC;AAAA,IAC5D,IAAA,EAAM;AAAA,MACJ,oBAAA;AAAA,MACA,GAAI,KAAK,aAAA,GAAgB,EAAE,eAAe,IAAA,CAAK,aAAA,KAAkB,EAAC;AAAA,MAClE,KAAA,EAAO,uBAAuB,iBAAA,GAAoB;AAAA,KACpD;AAAA,IACA,UAAA;AAAA,IACA,GAAI,KAAK,eAAA,GAAkB,EAAE,iBAAiB,IAAA,CAAK,eAAA,KAAoB,EAAC;AAAA,IACxE,GAAI,KAAK,YAAA,GAAe,EAAE,cAAc,IAAA,CAAK,YAAA,KAAiB,EAAC;AAAA,IAC/D,GAAI,KAAK,UAAA,GAAa,EAAE,YAAY,IAAA,CAAK,UAAA,KAAe,EAAC;AAAA,IACzD,GAAA,EAAK;AAAA,MACH,OAAA,EAAS,oBAAoB,IAAI,CAAA,CAAA;AAAA,MACjC,MAAA,EAAQ,uBAAuB,IAAI,CAAA,2BAAA,CAAA;AAAA,MACnC,IAAA,EAAM,uBAAuB,IAAI,CAAA,iBAAA;AAAA;AACnC,GACF;AACF;AAQO,SAAS,kBAAkB,WAAA,EAAmC;AACnE,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,KAAe;AACrC,IAAA,MAAM,MAAA,GAAS,0BAA0B,UAAU,CAAA;AACnD,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,oBAAA,EAAsB,OAAO,IAAA,CAAK,oBAAA;AAAA,MAClC,OAAA,EAAS,OAAO,GAAA,CAAI;AAAA,KACtB;AAAA,EACF,CAAC,CAAA;AACH;AAQO,SAAS,uBAAuB,UAAA,EAA8B;AACnE,EAAA,MAAM,IAAA,GAAO,iBAAiB,UAAU,CAAA;AACxC,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,oBAAoB,CAAA,IAAK,KAAK,aAAA,KAAkB,QAAA;AACtE;AAQA,SAAS,iBAAiB,UAAA,EAAyC;AACjE,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,UAAA;AACT;;;AC7KO,SAAS,qBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,OAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,oCAAoC,CAAA,CAChD,QAAA,CAAS,YAAA,EAAc,sCAAsC,CAAA,CAC7D,MAAA,CAAO,mBAAA,EAAqB,uBAAuB,CAAA,CACnD,MAAA,CAAO,8BAAA,EAAgC,4BAA4B,CAAA,CACnE,MAAA,CAAO,qBAAA,EAAuB,mBAAmB,CAAA,CACjD,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA,CACvD,MAAA;AAAA,IACC,OACE,UACA,OAAA,KACG;AACH,MAAA,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AAAA,IAC5C;AAAA,GACF;AACJ;AASA,eAAe,SAAA,CACb,OAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,wBAAA;AAAA,IAChC,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACzD,IAAA,SAAA;AAAA,MACE,0BAA0B,UAAU,CAAA;AAAA,MACpC,qBAAqB,OAAO;AAAA,KAC9B;AACA,IAAA;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,SAAA,CAAU,SAAS,OAAO,CAAA;AACrD,EAAA,SAAA,CAAU,iBAAA,CAAkB,KAAK,CAAA,EAAG,oBAAA,CAAqB,OAAO,CAAC,CAAA;AACnE;;;AC3BO,SAAS,qBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,OAAA,CACZ,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA;AAAA,IACC;AAAA,IAED,QAAA,CAAS,cAAA,EAAgB,kDAAkD,CAAA,CAC3E,MAAA,CAAO,OAAO,OAAA,KAAsB;AACnC,IAAA,MAAM,UAAU,OAAO,CAAA;AAAA,EACzB,CAAC,CAAA;AAEH,EAAA,MAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,mEAAmE,CAAA,CAC/E,QAAA,CAAS,cAAA,EAAgB,iDAAiD,CAAA,CAC1E,MAAA,CAAO,mBAAA,EAAqB,qCAAA,EAAuC,MAAM,CAAA,CACzE,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,OAAO,OAAA,EAAmB,OAAA,KAAgC;AAChE,IAAA,MAAM,eAAA,CAAgB,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EACjD,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,sDAAsD,CAAA,CAClE,QAAA;AAAA,IACC,UAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,MAAA,KAAmB;AAChC,IAAA,MAAM,eAAA,CAAgB,MAAA,CAAO,IAAA,EAAK,CAAE,aAAa,CAAA;AAAA,EACnD,CAAC,CAAA;AACL;AAOA,eAAe,UAAU,UAAA,EAAqC;AAC5D,EAAA,MAAM,OAAA,GAAU,oBAAoB,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,qBAAqB,OAAO,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,MAAM,mBAAA,EAAoB;AAE/C,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,0BAA0B,CAAA,CAAE,CAAA;AACvE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,0BAA0B,CAAA,CAAE,CAAA;AACvE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,YAAA,CAAa,KAAA,CAAM,cAAc,CAAA,CAAE,CAAA;AACpE,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,oBAAA,EAAuB,aAAA,CAAc,YAAA,CAAa,mBAAmB,CAAC,CAAA;AAAA,KACxE;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC/B,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,sCAAsC,iCAAiC,CAAA;AAAA,KACzE;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,0BAAA,EAA6B,YAAA,CAAa,KAAA,CAAM,sBAAsB,CAAA;AAAA,KACxE;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,4BAAA,EAA+B,aAAA,CAAc,YAAA,CAAa,2BAA2B,CAAC,CAAA;AAAA,KACxF;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,4BAAA,EAA+B,YAAA,CAAa,aAAA,CAAc,uBAAuB,CAAA;AAAA,KACnF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,YAAA,CAAa,KAAA,CAAM,eAAe,CAAA,CAAE,CAAA;AACtE,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,qBAAA,EAAwB,aAAA,CAAc,YAAA,CAAa,qBAAqB,CAAC,CAAA;AAAA,KAC3E;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG;AACjC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,0BAA0B,CAAA,CAAE,CAAA;AACvE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,0BAA0B,CAAA,CAAE,CAAA;AACvE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,YAAA,CAAa,KAAA,CAAM,iBAAiB,CAAA,CAAE,CAAA;AAC1E,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,uBAAA,EAA0B,aAAA,CAAc,YAAA,CAAa,uBAAuB,CAAC,CAAA;AAAA,KAC/E;AAAA,EACF;AAEF;AASA,eAAe,eAAA,CACb,UAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,oBAAoB,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,qBAAqB,OAAO,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,OAAA,CAAQ,MAAM,CAAA;AACpD,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,MAAM,oBAAoB,QAAQ,CAAA;AAAA,EACpC,CAAA,MAAO;AACL,IAAA,MAAM,gBAAgB,MAAM,kBAAA,CAAmB,QAAA,EAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AACjF,IAAA,IAAI,CAAC,aAAA,IAAiB,MAAA,KAAW,MAAA,EAAQ;AACvC,MAAA,MAAM,oBAAoB,QAAQ,CAAA;AAClC,MAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA,CAAE,CAAA;AAC3D,EAAA,MAAM,UAAU,QAAQ,CAAA;AAC1B;AAOA,eAAe,oBACb,QAAA,EACe;AACf,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9B,IAAA,MAAM,iBAAA,EAAkB;AACxB,IAAA,OAAA,CAAQ,IAAI,sBAAsB,CAAA;AAAA,EACpC;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC/B,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,yBAAA,EAA0B;AAAA,MAC1B,mBAAA;AAAoB,KACrB,CAAA;AACD,IAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAC1C,IAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AAAA,EACrC;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG;AACjC,IAAA,MAAM,qBAAA,EAAsB;AAC5B,IAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AAAA,EACvC;AACF;AAUA,eAAe,kBAAA,CACb,QAAA,EACA,OAAA,EACA,OAAA,EACA,MAAA,EACkB;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,cAAc,OAAO,CAAA;AACzE,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc;AAAA,MAC/B,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAClE,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,IAAS,EAAC;AACjC,IAAA,MAAM,UAAA,GAAa,MAAM,yBAAA,CAA0B,KAAA,EAAO,QAAQ,CAAA;AAClE,IAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,QAAA,CAAS,OAAA,IAAW,WAAW,CAAA,CAAE,CAAA;AAChE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iBAAA,EAAoB,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AAClD,IAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,eAAA,EAAkB,MAAA,CAAO,YAAY,CAAA,CAAE,CAAA;AAAA,IACrE;AACA,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC/B,MAAA,MAAM,yBAAA,EAA0B;AAChC,MAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAA,CAAG,CAAA;AACjD,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQA,SAAS,uBAAuB,KAAA,EAA8C;AAC5E,EAAA,MAAM,UAAA,GAAA,CAAc,KAAA,IAAS,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AACxD,EAAA,IAAI,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,QAAA,IAAY,eAAe,SAAA,EAAW;AAChF,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,KAAK,CAAA,CAAE,CAAA;AAC1D;AAOA,eAAe,gBAAgB,MAAA,EAA+B;AAC5D,EAAA,IAAI,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,UAAA,EAAY;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,sBAAA,EAAwB,CAAA;AAC1C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,WAAA,EAAa;AAChD,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,uBAAA,EAAyB,CAAA;AAC3C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,8BAAA,EAAgC,CAAA;AAClD,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAE,CAAA;AACnD;;;AChPO,SAAS,qBAAwC,OAAA,EAAe;AACrE,EAAA,OAAO,OAAA,CACJ,OAAO,oBAAA,EAAsB,4BAAA,EAA8B,oBAAoB,CAAA,CAC/E,MAAA,CAAO,sBAAA,EAAwB,2BAAA,EAA6B,oBAAoB,CAAA,CAChF,OAAO,YAAA,EAAc,oDAAoD,CAAA,CACzE,MAAA,CAAO,uBAAA,EAAyB,4CAAA,EAA8C,oBAAoB,CAAA,CAClG,MAAA,CAAO,0BAAA,EAA4B,mCAAA,EAAqC,uBAAuB,CAAA;AACpG;AAYO,SAAS,wBAAA,CACd,MACA,OAAA,EACyB;AACzB,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,GAAG;AAAA,GACL;AACA,EAAA,IACE,OAAA,CAAQ,WAAW,MAAA,IACnB,IAAA,CAAK,YAAY,MAAA,IACjB,IAAA,CAAK,WAAW,MAAA,EAChB;AACA,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,MAAA;AAAA,EACzB;AACA,EAAA,IACE,OAAA,CAAQ,aAAa,MAAA,IACrB,IAAA,CAAK,cAAc,MAAA,IACnB,IAAA,CAAK,aAAa,MAAA,EAClB;AACA,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,QAAA;AAAA,EAC3B;AACA,EAAA,OAAO,IAAA;AACT;AAYA,eAAsB,gCAAA,CACpB,MAAA,EACA,OAAA,EACA,QAAA,EACA,SACA,OAAA,EACkB;AAClB,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,OAAO,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,QAAA,EAAU;AAAA,MAC1C,GAAG,OAAA;AAAA,MACH,WAAW,wBAAA,CAAyB,OAAA,CAAQ,SAAA,IAAa,IAAI,OAAO;AAAA,KACrE,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACrC,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,IAAU,CAAA;AACtC,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,aAAA,GAAgB,WAAA;AAEpB,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,UAAA,CAAW,SAAS,QAAA,EAAU;AAAA,MACxD,GAAG,OAAA;AAAA,MACH,SAAA,EAAW;AAAA,QACT,GAAI,OAAA,CAAQ,SAAA,IAAa,EAAC;AAAA,QAC1B,OAAA,EAAS,aAAA;AAAA,QACT,SAAA,EAAW;AAAA;AACb,KACD,CAAA;AACD,IAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAEjB,IAAA,MAAM,IAAA,GAAO,oBAAoB,MAAM,CAAA;AACvC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,QAAA;AAAA,QACA,OAAA,EACE,6EAAA;AAAA,QACF;AAAA,OACF;AAAA,IACF;AAEA,IAAA,WAAA,GAAc,IAAA,CAAK,WAAA;AACnB,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,QAAA,EAAU;AAClC,MAAA,IAAI,SAAA,KAAc,MAAA,IAAa,QAAA,CAAS,MAAA,IAAU,SAAA,EAAW;AAC3D,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,IACtB;AAEA,IAAA,MAAM,YAAA,GAAe,SAAA,KAAc,MAAA,IAAa,QAAA,CAAS,MAAA,IAAU,SAAA;AACnE,IAAA,MAAM,kBAAkB,IAAA,CAAK,MAAA,IAAU,KAAK,SAAA,IAAa,IAAA,CAAK,SAAS,MAAA,KAAW,CAAA;AAClF,IAAA,IAAI,gBAAgB,eAAA,EAAiB;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,aAAA,GAAgB,KAAK,MAAA,GAAS,CAAA;AAC9B,IAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA,GAAc,CAAA,EAAG;AAClD,MAAA,MAAMC,MAAAA,CAAM,QAAQ,WAAW,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAiC;AAAA,IACrC,OAAA,EAAS,IAAA;AAAA,IACT,QAAA;AAAA,IACA,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA;AAAA,IACA,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,IAC/C,kBAAkB,KAAA,CAAM,MAAA;AAAA,IACxB,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,IACnD,QAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,QAAA;AACT;AAWA,SAAS,oBAAoB,KAAA,EAAmD;AAC9E,EAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,MAAA,CAAO,IAAA;AAAA,IACP,MAAA,CAAO,MAAA;AAAA,IACP,UAAA,CAAW,MAAA,EAAQ,CAAC,QAAA,EAAU,MAAM,CAAC;AAAA,GACvC;AACA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,IAAA,GAAO,oBAAoB,SAAS,CAAA;AAC1C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,MAAM,IAAA,GAAO,eAAe,IAAI,CAAA;AAChC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,QAAA,MAAM,IAAA,GAAO,oBAAoB,MAAM,CAAA;AACvC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAQA,SAAS,eAAe,KAAA,EAAgD;AACtE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,OACE,OAAO,MAAA,CAAO,MAAA,KAAW,YACzB,OAAO,MAAA,CAAO,aAAa,QAAA,IAC3B,OAAO,OAAO,SAAA,KAAc,QAAA,IAC5B,OAAO,MAAA,CAAO,WAAA,KAAgB,YAC9B,KAAA,CAAM,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAEjC;AASA,SAAS,UAAA,CAAW,OAAgCL,KAAAA,EAAyB;AAC3E,EAAA,OAAOA,KAAAA,CAAK,MAAA,CAAgB,CAAC,OAAA,EAAS,GAAA,KAAQ;AAC5C,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAQ,QAAoC,GAAG,CAAA;AAAA,EACjD,GAAG,KAAK,CAAA;AACV;AAQA,SAAS,eAAe,KAAA,EAAoC;AAC1D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,OAAO,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,MAAA;AACzD;AAQA,SAAS,qBAAqB,KAAA,EAAuB;AACnD,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAK,CAAA,CAAE,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,MAAA;AACT;AAQA,SAAS,wBAAwB,KAAA,EAAuB;AACtD,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAE,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,MAAA;AACT;AAOA,SAASK,OAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;;;ACnQA,eAAsB,eAAA,CACpB,OAAA,EACA,QAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,gBAAgB,OAAA,CAAQ,WAAA,GAC1B,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA,GACnC,MAAA;AACJ,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,SAAA,EAAW,wBAAA,CAAyB,IAAA,EAAM,OAAO,CAAA;AAAA,IACjD,GAAI,aAAA,GAAgB,EAAE,OAAA,EAAS,aAAA,KAAkB,EAAC;AAAA,IAClD,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI;AAAC,GACtE;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,SAAA;AAAA,MACE;AAAA,QACE,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,IAAA;AAAA,QACV,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,UACH;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,GAAA,EAAK,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAA;AAAA,YAC1D,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,wBAAA;AAAA,IAChC,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,SAAS,MAAM,gCAAA;AAAA,IACnB,MAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,SAAA,CAAU,MAAA,EAAQ,oBAAA,CAAqB,OAAO,CAAC,CAAA;AACjD;;;AC6BO,SAAS,uBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,MAAM,WAAW,OAAA,CACd,OAAA,CAAQ,UAAU,CAAA,CAClB,YAAY,yCAAyC,CAAA;AAExD,EAAA,cAAA;AAAA,IACE,QAAA,CACG,QAAQ,SAAS,CAAA,CACjB,YAAY,qCAAqC,CAAA,CACjD,MAAA,CAAO,gBAAA,EAAkB,+BAA+B,CAAA,CACxD,OAAO,cAAA,EAAgB,iCAAiC,EACxD,MAAA,CAAO,eAAA,EAAiB,kEAAkE,CAAA,CAC1F,MAAA,CAAO,kBAAA,EAAoB,uBAAA,EAAyB,YAAY;AAAA,GACrE,CAAE,MAAA,CAAO,OAAO,OAAA,KAA2C;AACzD,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,oCAAA;AAAA,MACA,wBAAwB,OAAO,CAAA;AAAA,MAC/B;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,cAAA;AAAA,IACE,QAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,qCAAqC,CAAA,CACjD,cAAA,CAAe,yBAAA,EAA2B,kBAAA,EAAoB,YAAY;AAAA,GAC/E,CAAE,MAAA,CAAO,OAAO,OAAA,KAA2C;AACzD,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,oCAAA;AAAA,MACA,EAAE,gBAAA,EAAkB,OAAA,CAAQ,cAAA,EAAe;AAAA,MAC3C;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,eAAA;AAAA,IACE,QAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,kCAAkC,CAAA,CAC9C,cAAA,CAAe,kBAAA,EAAoB,kBAAkB,CAAA,CACrD,cAAA,CAAe,gBAAA,EAAkB,YAAY,CAAA,CAC7C,cAAA,CAAe,cAAA,EAAgB,UAAU,CAAA,CACzC,MAAA,CAAO,sBAAA,EAAwB,sBAAsB,CAAA,CACrD,MAAA,CAAO,2BAAA,EAA6B,mCAAmC,CAAA,CACvE,MAAA,CAAO,wBAAA,EAA0B,qCAAqC,CAAA,CACtE,MAAA,CAAO,gBAAA,EAAkB,gBAAgB,CAAA,CACzC,MAAA,CAAO,aAAA,EAAe,2BAA2B,CAAA,CACjD,MAAA,CAAO,eAAA,EAAiB,eAAe,CAAA,CACvC,MAAA,CAAO,wBAAA,EAA0B,2BAA2B,CAAA,CAC5D,MAAA,CAAO,oBAAA,EAAsB,+BAA+B,CAAA,CAC5D,MAAA,CAAO,sBAAA,EAAwB,aAAa,CAAA,CAC5C,MAAA,CAAO,0BAAA,EAA4B,iBAAiB,CAAA,CACpD,MAAA,CAAO,yBAAyB,6BAA6B,CAAA;AAAA,IAChE;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAA2C;AACzD,IAAA,MAAM,yBAAA,CAA0B,SAAS,OAAO,CAAA;AAAA,EAClD,CAAC,CAAA;AAED,EAAA,eAAA;AAAA,IACE,QAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,mDAAmD,CAAA,CAC/D,cAAA,CAAe,yBAAA,EAA2B,kBAAA,EAAoB,YAAY,CAAA,CAC1E,OAAO,kBAAA,EAAoB,kBAAkB,CAAA,CAC7C,MAAA,CAAO,gBAAA,EAAkB,qCAAqC,CAAA,CAC9D,MAAA,CAAO,cAAA,EAAgB,qCAAqC,CAAA,CAC5D,MAAA,CAAO,sBAAA,EAAwB,sBAAsB,EACrD,MAAA,CAAO,+BAAA,EAAiC,0CAA0C,CAAA,CAClF,MAAA,CAAO,kCAAA,EAAoC,6CAA6C,CAAA,CACxF,MAAA,CAAO,4BAAA,EAA8B,4CAA4C,CAAA,CACjF,MAAA,CAAO,iCAAiC,+CAA+C,CAAA,CACvF,MAAA,CAAO,sBAAA,EAAwB,aAAa,CAAA,CAC5C,MAAA,CAAO,0BAAA,EAA4B,iBAAiB,CAAA,CACpD,MAAA,CAAO,2BAAA,EAA6B,qBAAqB,CAAA;AAAA,IAC5D;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAA2C;AACzD,IAAA,MAAM,yBAAA,CAA0B,SAAS,OAAO,CAAA;AAAA,EAClD,CAAC,CAAA;AAED,EAAA,cAAA;AAAA,IACE,SACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,sDAAsD,CAAA,CAClE,MAAA,CAAO,gBAAA,EAAkB,YAAY,EACrC,MAAA,CAAO,cAAA,EAAgB,UAAU,CAAA,CACjC,MAAA,CAAO,oBAAoB,0BAA0B;AAAA,GAC1D,CAAE,MAAA,CAAO,OAAO,OAAA,KAA6C;AAC3D,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,yBAAA;AAAA,MACA,0BAA0B,OAAO,CAAA;AAAA,MACjC;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,cAAA;AAAA,IACE,QAAA,CACG,OAAA,CAAQ,YAAY,CAAA,CACpB,WAAA,CAAY,oDAAoD,CAAA,CAChE,MAAA,CAAO,oBAAA,EAAsB,2CAAA,EAA6C,aAAA,EAAe,EAAE,EAC3F,MAAA,CAAO,uBAAA,EAAyB,8BAA8B,CAAA,CAC9D,MAAA,CAAO,yBAAA,EAA2B,uBAAA,EAAyB,YAAY,CAAA,CACvE,MAAA,CAAO,yBAAA,EAA2B,uBAAA,EAAyB,YAAY;AAAA,GAC5E,CAAE,MAAA,CAAO,OAAO,OAAA,KAA6C;AAC3D,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,kCAAA;AAAA,MACA,0BAA0B,OAAO,CAAA;AAAA,MACjC;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,eAAA;AAAA,IACE,QAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,YAAY,6CAA6C,CAAA,CACzD,cAAA,CAAe,yBAAA,EAA2B,kBAAA,EAAoB,YAAY,CAAA,CAC1E,cAAA,CAAe,0BAA0B,yCAAyC,CAAA;AAAA,IACrF;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAAyC;AACvD,IAAA,MAAM,uBAAA,CAAwB,SAAS,OAAO,CAAA;AAAA,EAChD,CAAC,CAAA;AAED,EAAA,cAAA;AAAA,IACE,QAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,6BAA6B,CAAA,CACzC,MAAA,CAAO,gBAAA,EAAkB,mBAAmB,CAAA,CAC5C,MAAA,CAAO,gBAAgB,iBAAiB,CAAA,CACxC,MAAA,CAAO,2BAAA,EAA6B,mCAAmC,CAAA,CACvE,MAAA,CAAO,6BAAA,EAA+B,4BAA4B,YAAY,CAAA,CAC9E,MAAA,CAAO,mBAAA,EAAqB,oDAAoD,CAAA,CAChF,MAAA,CAAO,kBAAA,EAAoB,uBAAuB,YAAY;AAAA,GACnE,CAAE,MAAA,CAAO,OAAO,OAAA,KAA+C;AAC7D,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,2BAAA;AAAA,MACA,4BAA4B,OAAO,CAAA;AAAA,MACnC;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAQA,SAAS,eAAe,OAAA,EAA2B;AACjD,EAAA,OAAO,QACJ,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,OAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,yBAAyB,0BAA0B,CAAA,CAC1D,MAAA,CAAO,WAAA,EAAa,6CAA6C,CAAA,CACjE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA;AAC5D;AASA,SAAS,eAAA,CAAgB,SAAkB,kBAAA,EAAqC;AAC9E,EAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,MAAA,CAAO,WAAA,EAAa,kBAAkB,CAAC,CAAA;AACvE;AAQA,eAAe,yBAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,2BAAA,CAA4B,SAAS,QAAQ,CAAA;AAC7C,EAAA,MAAM,eAAA;AAAA,IACJ,OAAA;AAAA,IACA,8BAAA;AAAA,IACA,wBAAwB,OAAO,CAAA;AAAA,IAC/B;AAAA,GACF;AACF;AAQA,eAAe,yBAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,2BAAA,CAA4B,SAAS,QAAQ,CAAA;AAC7C,EAAA,MAAM,eAAA;AAAA,IACJ,OAAA;AAAA,IACA,8BAAA;AAAA,IACA,wBAAwB,OAAO,CAAA;AAAA,IAC/B;AAAA,GACF;AACF;AAQA,eAAe,uBAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,2BAAA,CAA4B,SAAS,MAAM,CAAA;AAC3C,EAAA,MAAM,eAAA;AAAA,IACJ,OAAA;AAAA,IACA,mCAAA;AAAA,IACA;AAAA,MACE,kBAAkB,OAAA,CAAQ,cAAA;AAAA,MAC1B,aAAa,OAAA,CAAQ;AAAA,KACvB;AAAA,IACA;AAAA,GACF;AACF;AAQA,SAAS,2BAAA,CACP,SACA,WAAA,EACM;AACN,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,IAAW,CAAC,QAAQ,MAAA,EAAQ;AACvC,IAAA,MAAM,IAAI,yBAAA,CAA0B,CAAA,oBAAA,EAAuB,WAAW,CAAA,CAAE,CAAA;AAAA,EAC1E;AACF;AAQA,SAAS,wBACP,OAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,GAAI,QAAQ,KAAA,GAAQ,EAAE,YAAY,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,IACrD,GAAI,QAAQ,GAAA,GAAM,EAAE,UAAU,OAAA,CAAQ,GAAA,KAAQ,EAAC;AAAA,IAC/C,GAAI,QAAQ,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,IAC7C,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI;AAAC,GAChE;AACF;AAQA,SAAS,wBACP,OAAA,EACyB;AACzB,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,OAAA,CAAQ,eAAe,CAAA;AAC9D,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,OAAA,CAAQ,aAAa,CAAA;AAC1D,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,OAAA,CAAQ,UAAU,CAAA;AACpD,EAAA,OAAO;AAAA,IACL,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,YAAY,OAAA,CAAQ,KAAA;AAAA,IACpB,UAAU,OAAA,CAAQ,GAAA;AAAA,IAClB,GAAI,QAAQ,WAAA,GAAc,EAAE,aAAa,OAAA,CAAQ,WAAA,KAAgB,EAAC;AAAA,IAClE,GAAI,eAAA,GAAkB,EAAE,iBAAA,EAAmB,eAAA,KAAoB,EAAC;AAAA,IAChE,GAAI,aAAA,GAAgB,EAAE,cAAA,EAAgB,aAAA,KAAkB,EAAC;AAAA,IACzD,GAAI,QAAQ,KAAA,GAAQ,EAAE,OAAO,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,IAChD,GAAI,QAAQ,QAAA,KAAa,MAAA,GAAY,EAAE,SAAA,EAAW,OAAA,CAAQ,QAAA,EAAS,GAAI,EAAC;AAAA,IACxE,GAAI,QAAQ,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,IAC7C,GAAI,QAAQ,UAAA,GAAa,EAAE,aAAa,OAAA,CAAQ,UAAA,KAAe,EAAC;AAAA,IAChE,GAAI,QAAQ,QAAA,GAAW,EAAE,WAAW,OAAA,CAAQ,QAAA,KAAa,EAAC;AAAA,IAC1D,GAAI,QAAQ,UAAA,GAAa,EAAE,aAAa,OAAA,CAAQ,UAAA,KAAe,EAAC;AAAA,IAChE,GAAI,QAAQ,cAAA,GAAiB,EAAE,iBAAiB,OAAA,CAAQ,cAAA,KAAmB,EAAC;AAAA,IAC5E,GAAI,UAAA,GAAa,EAAE,WAAA,EAAa,UAAA,KAAe;AAAC,GAClD;AACF;AAQA,SAAS,wBACP,OAAA,EACyB;AACzB,EAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,OAAA,CAAQ,kBAAkB,CAAA;AACpE,EAAA,MAAM,qBAAA,GAAwB,cAAA,CAAe,OAAA,CAAQ,qBAAqB,CAAA;AAC1E,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,OAAA,CAAQ,gBAAgB,CAAA;AAChE,EAAA,MAAM,mBAAA,GAAsB,cAAA,CAAe,OAAA,CAAQ,mBAAmB,CAAA;AACtE,EAAA,OAAO;AAAA,IACL,kBAAkB,OAAA,CAAQ,cAAA;AAAA,IAC1B,GAAI,QAAQ,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,KAAY,EAAC;AAAA,IACtD,GAAI,QAAQ,KAAA,GAAQ,EAAE,YAAY,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,IACrD,GAAI,QAAQ,GAAA,GAAM,EAAE,UAAU,OAAA,CAAQ,GAAA,KAAQ,EAAC;AAAA,IAC/C,GAAI,QAAQ,WAAA,GAAc,EAAE,aAAa,OAAA,CAAQ,WAAA,KAAgB,EAAC;AAAA,IAClE,GAAI,kBAAA,GAAqB,EAAE,qBAAA,EAAuB,kBAAA,KAAuB,EAAC;AAAA,IAC1E,GAAI,qBAAA,GAAwB,EAAE,wBAAA,EAA0B,qBAAA,KAA0B,EAAC;AAAA,IACnF,GAAI,gBAAA,GAAmB,EAAE,kBAAA,EAAoB,gBAAA,KAAqB,EAAC;AAAA,IACnE,GAAI,mBAAA,GAAsB,EAAE,qBAAA,EAAuB,mBAAA,KAAwB,EAAC;AAAA,IAC5E,GAAI,QAAQ,UAAA,GAAa,EAAE,aAAa,OAAA,CAAQ,UAAA,KAAe,EAAC;AAAA,IAChE,GAAI,QAAQ,cAAA,GAAiB,EAAE,iBAAiB,OAAA,CAAQ,cAAA,KAAmB,EAAC;AAAA,IAC5E,GAAI,QAAQ,cAAA,GAAiB,EAAE,kBAAkB,OAAA,CAAQ,cAAA,KAAmB;AAAC,GAC/E;AACF;AAQA,SAAS,0BACP,OAAA,EACyB;AACzB,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,GAAI,QAAQ,KAAA,GAAQ,EAAE,YAAY,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,IACrD,GAAI,QAAQ,GAAA,GAAM,EAAE,UAAU,OAAA,CAAQ,GAAA,KAAQ,EAAC;AAAA,IAC/C,GAAI,OAAA,GAAU,EAAE,QAAA,EAAU,OAAA,KAAY;AAAC,GACzC;AACF;AAQA,SAAS,0BACP,OAAA,EACyB;AACzB,EAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,OAAA,CAAQ,IAAI,CAAA;AACjD,EAAA,OAAO;AAAA,IACL,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,IACzB,GAAI,QAAQ,QAAA,GAAW,EAAE,WAAW,OAAA,CAAQ,QAAA,KAAa,EAAC;AAAA,IAC1D,GAAI,QAAQ,WAAA,KAAgB,MAAA,GAAY,EAAE,YAAA,EAAc,OAAA,CAAQ,WAAA,EAAY,GAAI,EAAC;AAAA,IACjF,GAAI,QAAQ,WAAA,KAAgB,MAAA,GAAY,EAAE,YAAA,EAAc,OAAA,CAAQ,WAAA,EAAY,GAAI;AAAC,GACnF;AACF;AAQA,SAAS,4BACP,OAAA,EACyB;AACzB,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,OAAA,CAAQ,eAAe,CAAA;AAC9D,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA;AACnD,EAAA,OAAO;AAAA,IACL,GAAI,QAAQ,KAAA,GAAQ,EAAE,YAAY,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,IACrD,GAAI,QAAQ,GAAA,GAAM,EAAE,UAAU,OAAA,CAAQ,GAAA,KAAQ,EAAC;AAAA,IAC/C,GAAI,eAAA,GAAkB,EAAE,iBAAA,EAAmB,eAAA,KAAoB,EAAC;AAAA,IAChE,GAAI,QAAQ,eAAA,KAAoB,MAAA,GAC5B,EAAE,gBAAA,EAAkB,OAAA,CAAQ,eAAA,EAAgB,GAC5C,EAAC;AAAA,IACL,GAAI,YAAA,GAAe,EAAE,aAAA,EAAe,YAAA,KAAiB,EAAC;AAAA,IACtD,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI;AAAC,GAChE;AACF;AAQA,SAAS,eAAe,KAAA,EAAiD;AACvE,EAAA,MAAM,KAAA,GAAQ,KAAA,EACV,KAAA,CAAM,GAAG,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,OAAO,OAAO,CAAA;AACjB,EAAA,OAAO,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,MAAA;AAC7C;AASA,SAAS,aAAA,CAAc,KAAA,EAAe,QAAA,GAAqB,EAAC,EAAa;AACvE,EAAA,OAAO,CAAC,GAAG,QAAA,EAAU,KAAK,CAAA;AAC5B;AAQA,SAAS,uBAAuB,MAAA,EAAoD;AAClF,EAAA,MAAM,QAAQ,MAAA,EACV,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,MAAM,GAAG,CAAC,CAAA,CACpC,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAM,CAAA,CACzB,OAAO,OAAO,CAAA;AACjB,EAAA,OAAO,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,MAAA;AAC7C;;;ACjgBA,IAAM,oCAAA,GAAuC,mBAAA;AAC7C,IAAM,mCAAA,GAAsC,6BAAA;AA4FrC,SAAS,mBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,MAAM,OAAO,OAAA,CACV,OAAA,CAAQ,MAAM,CAAA,CACd,YAAY,qCAAqC,CAAA;AAEpD,EAAAC,gBAAAA;AAAA,IACE,oBAAA;AAAA,MACE,IAAA,CACG,QAAQ,iBAAiB,CAAA,CACzB,YAAY,uBAAuB,CAAA,CACnC,cAAA,CAAe,0BAAA,EAA4B,wBAAwB;AAAA,KACxE;AAAA,IACA;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAA8C;AAC5D,IAAA,MAAM,4BAAA,CAA6B,SAAS,OAAO,CAAA;AAAA,EACrD,CAAC,CAAA;AAED,EAAAA,gBAAAA;AAAA,IACE,oBAAA;AAAA,MACE,IAAA,CACG,OAAA,CAAQ,kBAAkB,CAAA,CAC1B,YAAY,wBAAwB;AAAA,KACzC;AAAA,IACA;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAA+C;AAC7D,IAAA,MAAM,6BAAA,CAA8B,SAAS,OAAO,CAAA;AAAA,EACtD,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAUC,eAAAA;AAAA,IACd,IAAA,CACG,QAAQ,mBAAmB,CAAA,CAC3B,YAAY,mCAAmC,CAAA,CAC/C,OAAO,kBAAA,EAAoB,oBAAoB,EAC/C,MAAA,CAAO,0BAAA,EAA4B,wBAAwB,CAAA,CAC3D,MAAA,CAAO,mBAAmB,2BAA2B,CAAA,CACrD,MAAA,CAAO,gBAAA,EAAkB,kCAAkC;AAAA,GAChE;AACA,EAAA,oBAAA,CAAqB,OAAO,CAAA,CAAE,MAAA,CAAO,OAAO,OAAA,KAAwC;AAClF,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,wBAAA;AAAA,MACA,qBAAqB,OAAO,CAAA;AAAA,MAC5B;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAAD,gBAAAA;AAAA,IACE,wBAAA;AAAA,MACE,KACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,wBAAwB,CAAA,CACpC,cAAA,CAAe,gBAAA,EAAkB,SAAS,EAC1C,MAAA,CAAO,gBAAA,EAAkB,gBAAgB,CAAA,CACzC,OAAO,kBAAA,EAAoB,kBAAkB,CAAA,CAC7C,MAAA,CAAO,4BAA4B,gCAAgC,CAAA,CACnE,MAAA,CAAO,mBAAA,EAAqB,4CAA4C,CAAA,CACxE,MAAA,CAAO,yBAAA,EAA2B,4BAAA,EAA8BE,gBAAe,EAAE,EACjF,MAAA,CAAO,sBAAA,EAAwB,qBAAqB,CAAA,CACpD,MAAA;AAAA,QACC,4BAAA;AAAA,QACA;AAAA,OACF,CACC,MAAA,CAAO,eAAA,EAAiB,wBAAwB;AAAA,KACrD;AAAA,IACA;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAAuC;AACrD,IAAA,MAAM,qBAAA,CAAsB,SAAS,OAAO,CAAA;AAAA,EAC9C,CAAC,CAAA;AAED,EAAAF,gBAAAA;AAAA,IACE,IAAA,CACG,QAAQ,WAAW,CAAA,CACnB,YAAY,yBAAyB,CAAA,CACrC,cAAA,CAAe,gBAAA,EAAkB,SAAS,CAAA;AAAA,IAC7C;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAAuC;AACrD,IAAA,MAAM,qBAAA,CAAsB,OAAA,EAAS,eAAA,EAAiB,WAAA,EAAa,OAAO,CAAA;AAAA,EAC5E,CAAC,CAAA;AAED,EAAAA,gBAAAA;AAAA,IACE,IAAA,CACG,QAAQ,SAAS,CAAA,CACjB,YAAY,yBAAyB,CAAA,CACrC,cAAA,CAAe,gBAAA,EAAkB,SAAS,CAAA;AAAA,IAC7C;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAAuC;AACrD,IAAA,MAAM,qBAAA,CAAsB,OAAA,EAAS,oBAAA,EAAsB,SAAA,EAAW,OAAO,CAAA;AAAA,EAC/E,CAAC,CAAA;AAED,EAAAA,gBAAAA;AAAA,IACE,IAAA,CACG,OAAA,CAAQ,YAAY,CAAA,CACpB,WAAA,CAAY,gCAAgC,CAAA,CAC5C,cAAA,CAAe,gBAAA,EAAkB,SAAS,CAAA,CAC1C,cAAA,CAAe,oBAAoB,wBAAwB,CAAA;AAAA,IAC9D;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAAyC;AACvD,IAAA,MAAM,uBAAA,CAAwB,SAAS,OAAO,CAAA;AAAA,EAChD,CAAC,CAAA;AAED,EAAAA,gBAAAA;AAAA,IACE,IAAA,CACG,QAAQ,iBAAiB,CAAA,CACzB,YAAY,wCAAwC,CAAA,CACpD,cAAA,CAAe,sBAAA,EAAwB,oBAAoB,CAAA;AAAA,IAC9D;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAA4C;AAC1D,IAAA,MAAM,0BAAA;AAAA,MACJ,OAAA;AAAA,MACA,qBAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAAA,gBAAAA;AAAA,IACE,IAAA,CACG,QAAQ,eAAe,CAAA,CACvB,YAAY,wCAAwC,CAAA,CACpD,cAAA,CAAe,sBAAA,EAAwB,oBAAoB,CAAA;AAAA,IAC9D;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,OAAA,KAA4C;AAC1D,IAAA,MAAM,0BAAA;AAAA,MACJ,OAAA;AAAA,MACA,0BAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAQA,SAAS,qBAAqB,OAAA,EAA2B;AACvD,EAAA,OAAO,wBAAA;AAAA,IACL,OAAA,CACG,cAAA,CAAe,gBAAA,EAAkB,YAAY,CAAA,CAC7C,MAAA,CAAO,kBAAA,EAAoB,cAAc,CAAA,CACzC,MAAA,CAAO,0BAAA,EAA4B,gCAAgC,CAAA,CACnE,OAAO,mBAAA,EAAqB,kCAAkC,CAAA,CAC9D,MAAA,CAAO,yBAAA,EAA2B,4BAAA,EAA8BE,cAAAA,EAAe,EAAE,CAAA,CACjF,MAAA,CAAO,sBAAA,EAAwB,qBAAqB;AAAA,GACzD;AACF;AAQA,SAAS,yBAAyB,OAAA,EAA2B;AAC3D,EAAA,OAAO,OAAA,CACJ,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,yBAAA;AAAA,IACA,mCAAA;AAAA,IACAA,cAAAA;AAAA,IACA;AAAC,GACH;AACJ;AAQA,SAASD,gBAAe,OAAA,EAA2B;AACjD,EAAA,OAAO,QACJ,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,OAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,yBAAyB,0BAA0B,CAAA,CAC1D,MAAA,CAAO,WAAA,EAAa,6CAA6C,CAAA,CACjE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA;AAC5D;AASA,SAASD,gBAAAA,CAAgB,SAAkB,kBAAA,EAAqC;AAC9E,EAAA,OAAOC,eAAAA,CAAe,OAAA,CAAQ,MAAA,CAAO,WAAA,EAAa,kBAAkB,CAAC,CAAA;AACvE;AAQA,eAAe,4BAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,MAAM,oBAAA;AAAA,IACJ,OAAA;AAAA,IACA,qBAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,MACE,wBAAwB,OAAA,CAAQ,OAAA;AAAA,MAChC,GAAG,yBAAyB,OAAO;AAAA,KACrC;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAQA,eAAe,6BAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,MAAM,oBAAA;AAAA,IACJ,OAAA;AAAA,IACA,sBAAA;AAAA,IACA,kBAAA;AAAA,IACA,yBAAyB,OAAO,CAAA;AAAA,IAChC,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAQA,eAAe,qBAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,MAAM,cAAA,GAAiB,4BAA4B,OAAO,CAAA;AAC1D,EAAA,MAAM,oBAAA;AAAA,IACJ,OAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,MACE,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjB,GAAG,yBAAyB,OAAO;AAAA,KACrC;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAUA,eAAe,qBAAA,CACb,OAAA,EACA,QAAA,EACA,WAAA,EACA,OAAA,EACe;AACf,EAAA,uBAAA,CAAwB,SAAS,WAAW,CAAA;AAC5C,EAAA,MAAM,eAAA;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,EAAE,OAAA,EAAS,OAAA,CAAQ,MAAA,EAAO;AAAA,IAC1B;AAAA,GACF;AACF;AAQA,eAAe,uBAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,uBAAA,CAAwB,SAAS,YAAY,CAAA;AAC7C,EAAA,MAAM,eAAA;AAAA,IACJ,OAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,MACE,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjB,SAAS,OAAA,CAAQ;AAAA,KACnB;AAAA,IACA;AAAA,GACF;AACF;AAUA,eAAe,0BAAA,CACb,OAAA,EACA,QAAA,EACA,WAAA,EACA,OAAA,EACe;AACf,EAAA,uBAAA,CAAwB,SAAS,WAAW,CAAA;AAC5C,EAAA,MAAM,eAAA;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,EAAE,aAAA,EAAe,OAAA,CAAQ,WAAA,EAAY;AAAA,IACrC;AAAA,GACF;AACF;AAeA,eAAe,qBACb,OAAA,EACA,QAAA,EACA,WAAA,EACA,IAAA,EACA,SACA,cAAA,EACe;AACf,EAAA,uBAAA,CAAwB,SAAS,WAAW,CAAA;AAC5C,EAAA,kBAAA,CAAmB,SAAS,cAAc,CAAA;AAC1C,EAAA,MAAM,eAAA,GAAkB,uBAAA,CAAwB,OAAA,CAAQ,UAAU,CAAA;AAClE,EAAA,MAAM,iBAAA,GAAoB,wBAAA,CAAyB,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA,CAAe,IAAA,EAAM,sBAAA,CAAuB,OAAA,EAAS,iBAAiB,CAAC,CAAA;AAAA,MACvE;AAAA,KACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,mEAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,MAAM,+BAAA;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAYA,eAAe,gCACb,OAAA,EACA,QAAA,EACA,IAAA,EACA,OAAA,EACA,gBACA,eAAA,EACe;AACf,EAAA,MAAM,gBAAgB,OAAA,CAAQ,WAAA,GAC1B,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA,GACnC,MAAA;AACJ,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,GAAI,aAAA,GAAgB,EAAE,OAAA,EAAS,aAAA,KAAkB;AAAC,GACpD;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,SAAA,GAAY,6BAAA,CAA8B,cAAA,EAAgB,eAAe,CAAA;AAC/E,IAAA,SAAA;AAAA,MACE;AAAA,QACE,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,IAAA;AAAA,QACV,QAAA;AAAA,QACA,cAAA;AAAA,QACA,GAAA,EAAK;AAAA,UACH,GAAG,eAAA,CAAgB,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,YACpC,MAAA,EAAQ,MAAA;AAAA,YACR,GAAA,EAAK,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,cAAc,CAAC,CAAA,OAAA,CAAA;AAAA,YAChE,SAAA,EAAW;AAAA,cACT,IAAA,EAAM,QAAA;AAAA,cACN,GAAG;AAAA;AACL,WACF,CAAE,CAAA;AAAA,UACF;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,GAAA,EAAK,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAA;AAAA,YAC1D,MAAM,gBAAA,CAAiB,cAAA,CAAe,MAAM,SAAS,CAAA,EAAG,SAAS,aAAa;AAAA;AAChF;AACF,OACF;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,wBAAA;AAAA,IAChC,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,gBAA2C,EAAC;AAClD,EAAA,KAAA,MAAW,YAAY,eAAA,EAAiB;AACtC,IAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,cAAA;AAAA,MAChC,OAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,aAAA,CAAc,IAAA,CAAK,yBAAA,CAA0B,YAAY,CAAC,CAAA;AAAA,EAC5D;AACA,EAAA,MAAM,OAAA,GAAU,gBAAA;AAAA,IACd,cAAA,CAAe,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,IAClD,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,SAAS,MAAM,gCAAA;AAAA,IACnB,MAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,SAAA,CAAU,MAAA,EAAQ,oBAAA,CAAqB,OAAO,CAAC,CAAA;AACjD;AAQA,SAAS,yBACP,OAAA,EACyB;AACzB,EAAA,MAAM,aAAA,GAAgBE,eAAAA,CAAe,OAAA,CAAQ,aAAa,CAAA;AAC1D,EAAA,MAAM,cAAA,GAAiB,uBAAA,CAAwB,OAAA,CAAQ,aAAa,CAAA;AACpE,EAAA,OAAO;AAAA,IACL,GAAI,QAAQ,KAAA,GAAQ,EAAE,OAAO,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,IAChD,GAAI,QAAQ,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,KAAY,EAAC;AAAA,IACtD,GAAI,aAAA,GAAgB,EAAE,cAAA,EAAgB,aAAA,KAAkB,EAAC;AAAA,IACzD,GAAI,QAAQ,QAAA,GAAW,EAAE,UAAU,OAAA,CAAQ,QAAA,KAAa,EAAC;AAAA,IACzD,GAAI,cAAA,GAAiB,EAAE,eAAA,EAAiB,cAAA,KAAmB,EAAC;AAAA,IAC5D,GAAI,QAAQ,SAAA,GAAY,EAAE,YAAY,OAAA,CAAQ,SAAA,KAAc;AAAC,GAC/D;AACF;AAQA,SAAS,qBACP,OAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,GAAI,QAAQ,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,KAAY,EAAC;AAAA,IACtD,GAAI,QAAQ,OAAA,GAAU,EAAE,wBAAwB,OAAA,CAAQ,OAAA,KAAY,EAAC;AAAA,IACrE,GAAI,QAAQ,YAAA,KAAiB,MAAA,GAAY,EAAE,aAAA,EAAe,OAAA,CAAQ,YAAA,EAAa,GAAI,EAAC;AAAA,IACpF,GAAI,QAAQ,WAAA,KAAgB,MAAA,GAAY,EAAE,YAAA,EAAc,OAAA,CAAQ,WAAA,EAAY,GAAI;AAAC,GACnF;AACF;AAQA,SAAS,uBAAA,CACP,SACA,WAAA,EACM;AACN,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,IAAW,CAAC,QAAQ,MAAA,EAAQ;AACvC,IAAA,MAAM,IAAI,yBAAA,CAA0B,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAE,CAAA;AAAA,EACrE;AACF;AAQA,SAAS,kBAAA,CACP,SACA,cAAA,EACM;AACN,EAAA,MAAM,eAAA,GAAkB,uBAAA,CAAwB,OAAA,CAAQ,UAAU,CAAA;AAClE,EAAA,IAAI,OAAA,CAAQ,aAAa,eAAA,EAAiB;AACxC,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,gDAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,IAAI,eAAA,IAAmB,CAAC,cAAA,EAAgB;AACtC,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,2DAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF;AAQA,SAAS,4BACP,OAAA,EACoB;AACpB,EAAA,IAAI,QAAQ,UAAA,KAAe,OAAA,CAAQ,aAAa,uBAAA,CAAwB,OAAA,CAAQ,UAAU,CAAA,CAAA,EAAI;AAC5F,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,iEAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,IAAI,CAAC,uBAAA,CAAwB,OAAA,CAAQ,UAAU,CAAA,EAAG;AAChD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,eAAA,EAAiB,IAAA,GAAO,WAAA,EAAY;AACpE,EAAA,IAAI,oBAAoB,SAAA,EAAW;AACjC,IAAA,OAAO,mCAAA;AAAA,EACT;AACA,EAAA,IAAI,oBAAoB,UAAA,EAAY;AAClC,IAAA,OAAO,oCAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,IACxB,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,yEAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AASA,SAAS,sBAAA,CACP,SACA,iBAAA,EACoB;AACpB,EAAA,IAAI,YAAA,IAAgB,OAAA,IAAW,OAAA,CAAQ,UAAA,EAAY;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,iBAAA;AACT;AASA,SAAS,cAAA,CACP,MACA,SAAA,EACyB;AACzB,EAAA,OAAO,cAAc,MAAA,GAAY,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,OAAO,SAAA,EAAU;AACtE;AAUA,SAAS,gBAAA,CACP,IAAA,EACA,OAAA,EACA,aAAA,EAKA;AACA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,wBAAA,CAAyB,IAAA,EAAM,OAAO,CAAA;AAAA,IACjD,GAAI,aAAA,GAAgB,EAAE,OAAA,EAAS,aAAA,KAAkB,EAAC;AAAA,IAClD,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI;AAAC,GACtE;AACF;AAQA,SAAS,yBAAyB,KAAA,EAA+C;AAC/E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,2CAAA;AAAA,MACT,IAAA,EAAM,CAAA,4DAAA;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9B;AAQA,SAAS,0BAA0B,YAAA,EAAgD;AACjF,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,SAAS,YAAA,EAAc,CAAC,UAAU,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,IACvD,QAAA,CAAS,YAAA,EAAc,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,IACzC,QAAA,CAAS,YAAA,EAAc,CAAC,MAAM,CAAC,CAAA;AAAA,IAC/B;AAAA,GACF;AACA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,UAAA,GAAa,+BAA+B,SAAS,CAAA;AAC3D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,IACxB,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,4DAAA;AAAA,IACT,IAAA,EAAM,kEAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAQA,SAAS,+BACP,SAAA,EACqC;AACrC,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,GAAI,SAAA;AACxD,EAAA,IAAI,CAAC,SAAS,KAAK,CAAA,IAAK,MAAM,EAAA,KAAO,MAAA,IAAa,KAAA,CAAM,EAAA,KAAO,IAAA,EAAM;AACnE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,EAAE;AAAA,GACrB;AACF;AASA,SAAS,6BAAA,CACP,gBACA,eAAA,EACQ;AACR,EAAA,OAAO,IAAA,CAAK,SAAA;AAAA,IACV,eAAA,CAAgB,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,MAAW;AAAA,MACxC,EAAA,EAAI,CAAA,EAAG,cAAc,CAAA,eAAA,EAAkB,QAAQ,CAAC,CAAA,CAAA;AAAA,MAChD,IAAA,EAAM;AAAA,KACR,CAAE;AAAA,GACJ;AACF;AAQA,SAASA,gBAAe,KAAA,EAAiD;AACvE,EAAA,MAAM,KAAA,GAAQ,KAAA,EACV,KAAA,CAAM,GAAG,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,OAAO,OAAO,CAAA;AACjB,EAAA,OAAO,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,MAAA;AAC7C;AASA,SAASD,cAAAA,CAAc,KAAA,EAAe,QAAA,GAAqB,EAAC,EAAa;AACvE,EAAA,OAAO,CAAC,GAAG,QAAA,EAAU,KAAK,CAAA;AAC5B;AAQA,SAAS,wBAAwB,MAAA,EAAoD;AACnF,EAAA,MAAM,KAAA,GAAQ,MAAA,EACV,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAA,EAAM,CAAA,CAC1B,MAAA,CAAO,OAAO,CAAA;AACjB,EAAA,OAAO,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,MAAA;AAC7C;AASA,SAAS,QAAA,CAAS,OAAgBR,KAAAA,EAAuC;AACvE,EAAA,OAAOA,KAAAA,CAAK,MAAA,CAAgB,CAAC,OAAA,EAAS,OAAA,KAAY;AAChD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,CAAQ,OAAO,CAAA,GAAI,MAAA;AAAA,IACrD;AACA,IAAA,OAAO,QAAA,CAAS,OAAO,CAAA,GAAI,OAAA,CAAQ,OAAO,CAAA,GAAI,MAAA;AAAA,EAChD,GAAG,KAAK,CAAA;AACV;AAQA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAC5E;;;ACx3BA,IAAM,wBAAA,GAA2B,mBAAA;AAwD1B,SAAS,wBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,uBAAA,CAAwB,SAAS,OAAO,CAAA;AACxC,EAAA,sBAAA,CAAuB,SAAS,OAAO,CAAA;AACvC,EAAA,qBAAA,CAAsB,SAAS,OAAO,CAAA;AACtC,EAAA,uBAAA,CAAwB,SAAS,OAAO,CAAA;AACxC,EAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACpC,EAAA,oBAAA,CAAqB,SAAS,OAAO,CAAA;AACrC,EAAA,yBAAA,CAA0B,SAAS,OAAO,CAAA;AAC5C;AAQA,SAAS,uBAAA,CACP,SACA,OAAA,EACM;AACN,EAAA,MAAM,WAAW,OAAA,CACd,OAAA,CAAQ,UAAU,CAAA,CAClB,YAAY,yCAAyC,CAAA;AAExD,EAAA,QAAA,CACG,OAAA,CAAQ,iBAAiB,CAAA,CACzB,WAAA,CAAY,kCAAkC,CAAA,CAC9C,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,EAC9C,MAAA,CAAO,kBAAA,EAAoB,8BAAA,EAAgC,YAAY,CAAA,CACvE,MAAA,CAAO,uBAAA,EAAyB,0BAA0B,CAAA,CAC1D,MAAA,CAAO,WAAA,EAAa,6CAA6C,CAAA,CACjE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA,CACvD,MAAA,CAAO,OAAO,OAAA,KAAqC;AAClD,IAAA,MAAM,IAAA,GAAO,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AACvE,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,+BAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,MAAM,MAAA,GAAS,SACZ,OAAA,CAAQ,iBAAiB,EACzB,WAAA,CAAY,iCAAiC,CAAA,CAC7C,MAAA,CAAO,cAAA,EAAgB,4CAA4C,EACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,uBAAA,EAAyB,0BAA0B,CAAA,CAC1D,MAAA,CAAO,WAAA,EAAa,6CAA6C,CAAA,CACjE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA;AAC1D,EAAA,oBAAA,CAAqB,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,OAAA,KAA6B;AACtE,IAAA,MAAM,eAAA,CAAgB,OAAA,EAAS,+BAAA,EAAiC,IAAI,OAAO,CAAA;AAAA,EAC7E,CAAC,CAAA;AACH;AAQA,SAAS,sBAAA,CACP,SACA,OAAA,EACM;AACN,EAAA,MAAM,UAAU,OAAA,CACb,OAAA,CAAQ,SAAS,CAAA,CACjB,YAAY,wCAAwC,CAAA;AAEvD,EAAA,MAAM,UAAA,GAAa,QAChB,OAAA,CAAQ,cAAc,EACtB,WAAA,CAAY,mDAAmD,CAAA,CAC/D,MAAA,CAAO,cAAA,EAAgB,4CAA4C,EACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,uBAAA,EAAyB,0BAA0B,CAAA,CAC1D,MAAA,CAAO,WAAA,EAAa,6CAA6C,CAAA,CACjE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA;AAC1D,EAAA,oBAAA,CAAqB,UAAU,CAAA,CAAE,MAAA,CAAO,OAAO,OAAA,KAA6B;AAC1E,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,wCAAA;AAAA,MACA,EAAC;AAAA,MACD;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAQA,SAAS,qBAAA,CACP,SACA,OAAA,EACM;AACN,EAAA,MAAM,SAAS,OAAA,CACZ,OAAA,CAAQ,QAAQ,CAAA,CAChB,YAAY,uCAAuC,CAAA;AAEtD,EAAA,MAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,wCAAwC,CAAA,CACpD,cAAA,CAAe,0BAAA,EAA4B,wBAAwB,CAAA,CACnE,cAAA,CAAe,qBAAA,EAAuB,WAAW,CAAA,CACjD,MAAA,CAAO,qBAAA,EAAuB,+BAA+B,CAAA,CAC7D,MAAA,CAAO,mBAAA,EAAqB,6BAA6B,CAAA,CACzD,MAAA,CAAO,sBAAA,EAAwB,kBAAA,EAAoB,YAAY,CAAA,CAC/D,MAAA,CAAO,8BAAA,EAAgC,kBAAA,EAAoB,YAAY,CAAA,CACvE,cAAA,CAAe,sBAAA,EAAwB,oBAAoB,CAAA,CAC3D,MAAA,CAAO,oBAAA,EAAsB,gBAAgB,CAAA,CAC7C,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,uBAAA,EAAyB,0BAA0B,CAAA,CAC1D,MAAA,CAAO,WAAA,EAAa,yBAAyB,CAAA,CAC7C,MAAA,CAAO,WAAA,EAAa,6CAA6C,CAAA,CACjE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA,CACvD,MAAA,CAAO,OAAO,OAAA,KAAyC;AACtD,IAAA,MAAM,uBAAA,CAAwB,SAAS,OAAO,CAAA;AAAA,EAChD,CAAC,CAAA;AAEH,EAAA,kBAAA,CAAmB,QAAQ,QAAA,EAAU,kCAAkC,CAAA,CACpE,MAAA,CAAO,OAAO,OAAA,KAAwC;AACrD,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,iCAAA;AAAA,MACA,qBAAqB,OAAO,CAAA;AAAA,MAC5B;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,kBAAA,CAAmB,MAAA,EAAQ,gBAAgB,0CAAA,EAA4C;AAAA,IACrF,MAAA,EAAQ;AAAA,GACT,CAAA,CACE,MAAA,CAAO,OAAO,OAAA,KAAwC;AACrD,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,uCAAA;AAAA,MACA,oBAAA,CAAqB,OAAA,EAAS,EAAE,aAAA,EAAe,OAAO,CAAA;AAAA,MACtD;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,MAAA,EAAQ,SAAA,EAAW,mCAAA,EAAqC;AAAA,IACxF,MAAA,EAAQ;AAAA,GACT,CAAA,CACE,MAAA,CAAO,0BAAA,EAA4B,wBAAwB,CAAA,CAC3D,MAAA,CAAO,oBAAA,EAAsB,gBAAgB,CAAA,CAC7C,MAAA,CAAO,qBAAA,EAAuB,qBAAqB,CAAA;AACtD,EAAA,oBAAA,CAAqB,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,OAAA,KAAwC;AACjF,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,kCAAA;AAAA,MACA,sBAAsB,OAAO,CAAA;AAAA,MAC7B;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,kBAAA,CAAmB,MAAA,EAAQ,aAAA,EAAe,gCAAgC,CAAA,CACvE,cAAA,CAAe,iBAAiB,WAAW,CAAA,CAC3C,MAAA,CAAO,OAAO,OAAA,KAAwC;AACrD,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,iCAAA;AAAA,MACA,oBAAA,CAAqB,OAAA,EAAS,EAAE,WAAA,EAAa,MAAM,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,kBAAA,CAAmB,MAAA,EAAQ,eAAA,EAAiB,kCAAkC,CAAA,CAC3E,cAAA,CAAe,iBAAiB,WAAW,CAAA,CAC3C,MAAA,CAAO,OAAO,OAAA,KAAwC;AACrD,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,mCAAA;AAAA,MACA,oBAAA,CAAqB,OAAA,EAAS,EAAE,WAAA,EAAa,MAAM,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,MAAA,EAAQ,cAAA,EAAgB,iCAAA,EAAmC;AAAA,IAC/F,MAAA,EAAQ;AAAA,GACT,CAAA,CACE,cAAA,CAAe,eAAA,EAAiB,WAAW,EAC3C,MAAA,CAAO,0BAAA,EAA4B,wBAAwB,CAAA,CAC3D,OAAO,oBAAA,EAAsB,gBAAgB,CAAA,CAC7C,MAAA,CAAO,uBAAuB,qBAAqB,CAAA;AACtD,EAAA,oBAAA,CAAqB,UAAU,CAAA,CAAE,MAAA,CAAO,OAAO,OAAA,KAAwC;AACrF,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,kCAAA;AAAA,MACA,qBAAA,CAAsB,OAAA,EAAS,EAAE,WAAA,EAAa,MAAM,CAAA;AAAA,MACpD;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,kBAAA,CAAmB,MAAA,EAAQ,kBAAkB,8BAAA,EAAgC;AAAA,IAC3E,MAAA,EAAQ;AAAA,GACT,EACE,cAAA,CAAe,0BAAA,EAA4B,wBAAwB,CAAA,CACnE,MAAA,CAAO,OAAO,OAAA,KAAwC;AACrD,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,4BAAA;AAAA,MACA,qBAAqB,OAAA,EAAS,EAAE,gBAAgB,IAAA,EAAM,aAAA,EAAe,OAAO,CAAA;AAAA,MAC5E;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,MAAA,EAAQ,iBAAA,EAAmB,+BAAA,EAAiC;AAAA,IACnG,MAAA,EAAQ;AAAA,GACT,CAAA,CACE,cAAA,CAAe,0BAAA,EAA4B,wBAAwB,EACnE,MAAA,CAAO,eAAA,EAAiB,WAAW,CAAA,CACnC,OAAO,oBAAA,EAAsB,gBAAgB,CAAA,CAC7C,MAAA,CAAO,uBAAuB,qBAAqB,CAAA;AACtD,EAAA,oBAAA,CAAqB,aAAa,CAAA,CAAE,MAAA,CAAO,OAAO,OAAA,KAAwC;AACxF,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,6BAAA;AAAA,MACA,sBAAsB,OAAA,EAAS,EAAE,gBAAgB,IAAA,EAAM,WAAA,EAAa,MAAM,CAAA;AAAA,MAC1E;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,kBAAA,CAAmB,MAAA,EAAQ,2BAA2B,+CAAA,EAAiD;AAAA,IACrG,MAAA,EAAQ;AAAA,GACT,EACE,cAAA,CAAe,0BAAA,EAA4B,wBAAwB,CAAA,CACnE,MAAA,CAAO,OAAO,OAAA,KAAwC;AACrD,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,wCAAA;AAAA,MACA,qBAAqB,OAAA,EAAS,EAAE,gBAAgB,IAAA,EAAM,aAAA,EAAe,OAAO,CAAA;AAAA,MAC5E;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACL;AAUA,SAAS,mBACP,MAAA,EACA,IAAA,EACA,WAAA,EACA,OAAA,GAEI,EAAC,EACI;AACT,EAAA,MAAM,OAAA,GAAU,MAAA,CACb,OAAA,CAAQ,IAAI,CAAA,CACZ,WAAA,CAAY,WAAW,CAAA,CACvB,cAAA,CAAe,qBAAA,EAAuB,YAAY,CAAA,CAClD,eAAe,mBAAA,EAAqB,UAAU,CAAA,CAC9C,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,oBAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,uBAAA,EAAyB,0BAA0B,CAAA,CAC1D,MAAA,CAAO,WAAA,EAAa,6CAA6C,CAAA,CACjE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA;AAC1D,EAAA,IAAI,OAAA,CAAQ,WAAW,KAAA,EAAO;AAC5B,IAAA,OAAA,CAAQ,MAAA,CAAO,4BAAA,EAA8B,gBAAA,EAAkB,YAAY,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,OAAA;AACT;AAQA,eAAe,uBAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,IAAW,CAAC,QAAQ,MAAA,EAAQ;AACvC,IAAA,MAAM,IAAI,0BAA0B,0BAA0B,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,eAAA,IAAmB,OAAA,CAAQ,QAAA;AAC3D,EAAA,MAAM,eAAA;AAAA,IACJ,OAAA;AAAA,IACA,oCAAA;AAAA,IACA;AAAA,MACE,wBAAwB,OAAA,CAAQ,OAAA;AAAA,MAChC,WAAW,OAAA,CAAQ,IAAA;AAAA,MACnB,GAAI,QAAQ,SAAA,GAAY,EAAE,YAAY,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,MAC7D,GAAI,QAAQ,OAAA,GAAU,EAAE,UAAU,OAAA,CAAQ,OAAA,KAAY,EAAC;AAAA,MACvD,GAAI,eAAA,KAAoB,MAAA,GAAY,EAAE,gBAAA,EAAkB,eAAA,KAAoB,EAAC;AAAA,MAC7E,aAAa,OAAA,CAAQ,UAAA;AAAA,MACrB,GAAI,QAAQ,QAAA,GAAW,EAAE,gBAAgB,OAAA,CAAQ,QAAA,KAAa;AAAC,KACjE;AAAA,IACA;AAAA,GACF;AACF;AASA,SAAS,oBAAA,CACP,OAAA,EACA,MAAA,GAII,EAAC,EACoB;AACzB,EAAA,OAAO;AAAA,IACL,YAAY,OAAA,CAAQ,IAAA;AAAA,IACpB,UAAU,OAAA,CAAQ,EAAA;AAAA,IAClB,GAAI,MAAA,CAAO,cAAA,IAAkB,OAAA,CAAQ,OAAA,GACjC,EAAE,sBAAA,EAAwB,OAAA,CAAQ,OAAA,EAAQ,GAC1C,EAAC;AAAA,IACL,GAAI,MAAA,CAAO,WAAA,IAAe,OAAA,CAAQ,IAAA,GAAO,EAAE,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,IACxE,GAAI,MAAA,CAAO,aAAA,KAAkB,KAAA,IAAS,OAAA,CAAQ,aAAA,KAAkB,MAAA,GAC5D,EAAE,cAAA,EAAgB,OAAA,CAAQ,aAAA,EAAc,GACxC;AAAC,GACP;AACF;AASA,SAAS,qBAAA,CACP,OAAA,EACA,MAAA,GAGI,EAAC,EACoB;AACzB,EAAA,OAAO;AAAA,IACL,YAAY,OAAA,CAAQ,IAAA;AAAA,IACpB,UAAU,OAAA,CAAQ,EAAA;AAAA,IAClB,GAAI,MAAA,CAAO,cAAA,IAAkB,OAAA,CAAQ,OAAA,GACjC,EAAE,sBAAA,EAAwB,OAAA,CAAQ,OAAA,EAAQ,GAC1C,EAAC;AAAA,IACL,GAAI,MAAA,CAAO,WAAA,IAAe,OAAA,CAAQ,IAAA,GAAO,EAAE,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,IACxE,GAAI,CAAC,MAAA,CAAO,cAAA,IAAkB,OAAA,CAAQ,OAAA,GAClC,EAAE,sBAAA,EAAwB,OAAA,CAAQ,OAAA,EAAQ,GAC1C,EAAC;AAAA,IACL,GAAI,QAAQ,QAAA,GAAW,EAAE,gBAAgB,OAAA,CAAQ,QAAA,KAAa,EAAC;AAAA,IAC/D,GAAI,QAAQ,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,KAAY;AAAC,GACxD;AACF;AAQA,SAAS,oBAAA,CACP,SACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,OAAA,CACX,OAAA,CAAQ,OAAO,CAAA,CACf,YAAY,sCAAsC,CAAA;AAErD,EAAA,KAAA,CACG,OAAA,CAAQ,UAAU,CAAA,CAClB,WAAA,CAAY,oCAAoC,EAChD,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,kBAAA,EAAoB,gDAAgD,CAAA,CAC3E,MAAA,CAAO,uBAAA,EAAyB,0BAA0B,CAAA,CAC1D,MAAA,CAAO,WAAA,EAAa,6CAA6C,CAAA,CACjE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA,CACvD,MAAA,CAAO,OAAO,OAAA,KAAkC;AAC/C,IAAA,MAAM,eAAA;AAAA,MACJ,OAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,QACE,cAAA,EAAgB,OAAA,CAAQ,OAAA,CAAQ,aAAa;AAAA,OAC/C;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACL;AAQA,SAAS,yBAAA,CACP,SACA,OAAA,EACM;AACN,EAAA,MAAM,aAAa,OAAA,CAChB,OAAA,CAAQ,YAAY,CAAA,CACpB,YAAY,2CAA2C,CAAA;AAE1D,EAAA,UAAA,CACG,QAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,2CAA2C,EACvD,QAAA,CAAS,YAAA,EAAc,iBAAiB,CAAA,CACxC,OAAO,cAAA,EAAgB,4CAA4C,EACnE,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA;AAAA,IACC,wBAAA;AAAA,IACA;AAAA,GACF,CACC,OAAO,uBAAA,EAAyB,0BAA0B,EAC1D,MAAA,CAAO,WAAA,EAAa,6CAA6C,CAAA,CACjE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CACC,OAAO,aAAA,EAAe,iCAAiC,EACvD,MAAA,CAAO,OAAO,UAAkB,OAAA,KAAuC;AACtE,IAAA,MAAM,mBAAA,CAAoB,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AAAA,EACtD,CAAC,CAAA;AACL;AASA,eAAe,mBAAA,CACb,OAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,gBAAgB,OAAA,CAAQ,WAAA,GAC1B,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA,GACnC,MAAA;AACJ,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,wBAAA;AACrC,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,GAAI,aAAA,GAAgB,EAAE,OAAA,EAAS,aAAA,KAAkB;AAAC,GACpD;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,SAAA;AAAA,MACE;AAAA,QACE,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,IAAA;AAAA,QACV,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,UACH;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,GAAA,EAAK,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAA;AAAA,YAC1D,SAAA,EAAW;AAAA,cACT,IAAA,EAAM,QAAA;AAAA,cACN,GAAG;AAAA;AACL;AACF;AACF,OACF;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AACA,IAAA;AAAA,EACF;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,wBAAA;AAAA,IAChC,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,cAAA;AAAA,IAC1B,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,SAAA,CAAU,MAAA,EAAQ,oBAAA,CAAqB,OAAO,CAAC,CAAA;AACjD;;;ACnjBA,IAAMU,yBAAAA,GAA2B,mBAAA;AAQ1B,SAAS,mBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,MAAM,OAAO,OAAA,CACV,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,uCAAuC,CAAA,CACnD,QAAA,CAAS,YAAY,iCAAiC,CAAA,CACtD,SAAS,UAAA,EAAY,iDAAiD,EACtE,MAAA,CAAO,mBAAA,EAAqB,uBAAuB,CAAA,CACnD,MAAA,CAAO,gCAAgC,4BAA4B,CAAA,CACnE,OAAO,qBAAA,EAAuB,mBAAmB,EACjD,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,oBAAoB,mBAAmB,CAAA,CAC9C,OAAO,oBAAA,EAAsB,qCAAqC,EAClE,MAAA,CAAO,uBAAA,EAAyB,mCAAmC,CAAA,CACnE,MAAA;AAAA,IACC,wBAAA;AAAA,IACA;AAAA,GACF,CACC,OAAO,WAAA,EAAa,mCAAmC,EACvD,MAAA,CAAO,WAAA,EAAa,6CAA6C,CAAA,CACjE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,aAAA,EAAe,iCAAiC,CAAA;AAC1D,EAAA,oBAAA,CAAqB,IAAI,CAAA,CACtB,MAAA;AAAA,IACC,OACE,MAAA,EACA,MAAA,EACA,OAAA,KACG;AACH,MAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,IACvD;AAAA,GACF;AACJ;AAUA,eAAe,cAAA,CACb,MAAA,EACA,MAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AACnD,EAAA,IAAI,qBAAqB,MAAA,EAAQ;AAC/B,IAAA,MAAM,WAAA,CAAY,SAAS,OAAO,CAAA;AAClC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,qBAAqB,KAAA,EAAO;AAC9B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,QACxB,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,MAAM,UAAA,CAAW,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AACzC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,qBAAqB,MAAA,EAAQ;AAC/B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,QACxB,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,MAAM,WAAA,CAAY,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAC1C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,qBAAqB,QAAA,EAAU;AACjC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,QACxB,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,MAAM,aAAA,CAAc,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,IACxB,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,wBAAwB,gBAAgB,CAAA,CAAA;AAAA,IACjD,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAQA,eAAe,WAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,wBAAA;AAAA,IAChC,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,SAAA,CAAU,SAAS,OAAO,CAAA;AACpD,EAAA,SAAA,CAAU,IAAA,EAAM,oBAAA,CAAqB,OAAO,CAAC,CAAA;AAC/C;AASA,eAAe,UAAA,CACb,OAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,wBAAA;AAAA,IAChC,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACnD,EAAA,SAAA,CAAU,IAAA,EAAM,oBAAA,CAAqB,OAAO,CAAC,CAAA;AAC/C;AASA,eAAe,WAAA,CACb,OAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,wBAAA;AAAA,IAChC,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,kBAAkB,OAAA,CAAQ,QAAA,GAC5B,gBAAgB,OAAA,CAAQ,QAAQ,IAChC,EAAC;AACL,EAAA,MAAM,gBAAgB,OAAA,CAAQ,WAAA,GAC1B,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA,GACnC,MAAA;AACJ,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,SAAA,EAAW,wBAAA,CAAyB,eAAA,EAAiB,OAAO,CAAA;AAAA,IAC5D,GAAI,aAAA,GAAgB,EAAE,OAAA,EAAS,aAAA,KAAkB,EAAC;AAAA,IAClD,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI;AAAC,GACtE;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAMC,WAAAA,GAAa,MAAM,MAAA,CAAO,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACzD,IAAA,SAAA;AAAA,MACE;AAAA,QACE,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,UACH;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,GAAA,EAAK,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAA;AAAA,YAC1D,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA,MAAA,EAAQ,0BAA0BA,WAAU;AAAA,OAC9C;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AACA,IAAA;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACzD,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,IAAW,sBAAA,CAAuB,UAAU,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAI,yBAAA,CAA0B,CAAA,oBAAA,EAAuB,QAAQ,CAAA,CAAE,CAAA;AAAA,EACvE;AACA,EAAA,MAAM,SAAS,MAAM,gCAAA;AAAA,IACnB,MAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,SAAA,CAAU,MAAA,EAAQ,oBAAA,CAAqB,OAAO,CAAC,CAAA;AACjD;AASA,eAAe,aAAA,CACb,OAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,wBAAA;AAAA,IAChC,OAAA,CAAQ,YAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,MAAM,gBAAgB,OAAA,CAAQ,WAAA,GAC1B,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA,GACnC,MAAA;AACJ,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAYD,yBAAAA;AACrC,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,GAAI,aAAA,GAAgB,EAAE,OAAA,EAAS,aAAA,KAAkB,EAAC;AAAA,IAClD,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI;AAAC,GACtE;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,SAAA;AAAA,MACE;AAAA,QACE,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA;AAAA,QACA,GAAA,EAAK;AAAA,UACH;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,GAAA,EAAK,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAA;AAAA,YAC1D,SAAA,EAAW;AAAA,cACT,IAAA,EAAM,QAAA;AAAA,cACN,GAAG;AAAA;AACL;AACF;AACF,OACF;AAAA,MACA,qBAAqB,OAAO;AAAA,KAC9B;AACA,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,cAAA;AAAA,IAC1B,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,SAAA,CAAU,MAAA,EAAQ,oBAAA,CAAqB,OAAO,CAAC,CAAA;AACjD;AClRA,IAAM,sBAAA,GAAyB,KAAK,EAAA,GAAK,GAAA;AACzC,IAAM,wBAAA,GAA2B,IAAI,EAAA,GAAK,GAAA;AAC1C,IAAM,oBAAoB,EAAA,GAAK,GAAA;AAC/B,IAAM,yBAAA,GAA4B,GAAA;AAmD3B,IAAM,cAAN,MAAkB;AAAA,EACN,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EAMjB,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,WAAA,GAAc,SAAS,WAAA,IAAe,QAAA;AAC3C,IAAA,IAAA,CAAK,WAAA,GAAc,SAAS,WAAA,IAAe,WAAA;AAC3C,IAAA,IAAA,CAAK,YAAY,OAAA,EAAS,SAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAS,aAAA,IAAiBE,WAAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAA,GAAiD;AACrD,IAAA,MAAM,YAAA,GAAe,MAAM,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA;AAC1D,IAAA,MAAM,MAAA,GACJ,gBAAgB,aAAA,CAAc,YAAY,EAAE,QAAA,CAAS,gBAAgB,IACjE,KAAA,GACA,QAAA;AACN,IAAA,MAAM,eACJ,MAAA,KAAW,KAAA,GAAQ,MAAM,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA,GAAI,KAAA;AAC5D,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB,EAAC;AAAA,MACvC,YAAA;AAAA,MACA,aAAA,EAAe,WAAW,KAAA,IAAS;AAAA,KACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,OAAA,EAA4C;AAC9D,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,gBAAgB,KAAK,CAAA;AAAA,MACrB,CAAC,WAAW,IAAA,EAAM,CAAA,EAAG,KAAK,WAAW,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MAClD;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAA,GAA6C;AACjD,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,eAAA,CAAgB,KAAK,WAAW,CAAA;AAAA,MAChC,CAAC,UAAU,QAAQ,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,6BAAA,CACJ,eAAA,EACA,kBAAA,EACe;AACf,IAAA,MAAM,SAAA,GACJ,kBAAA,IAAsB,MAAM,gBAAA,CAAiB,KAAK,SAAS,CAAA;AAC7D,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AACA,IAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,SAAA,EAAW,KAAK,WAAW,CAAA;AACzE,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,IAAA,CAAK,WAAW,CAAA,aAAA,CAAe,CAAA;AAAA,IAClE;AACA,IAAA,MAAM,OAAA,GAAU,MAAMb,GAAAA,CAAG,QAAA,CAAS,iBAAiB,MAAM,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGjC,IAAA,IAAI,MAAA,CAAO,YAAY,eAAA,EAAiB;AACtC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,YAAY,eAAe,CAAA,MAAA,EAAS,OAAO,MAAA,CAAO,OAAA,IAAW,SAAS,CAAC,CAAA;AAAA,OACzE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,mBAAmB,OAAA,EAAmC;AAClE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA;AAAA,MACxB,gBAAgB,OAAO,CAAA;AAAA,MACvB,CAAC,WAAW,CAAA;AAAA,MACZ;AAAA,KACF;AACA,IAAA,OAAO,MAAA,CAAO,QAAA,KAAa,CAAA,IAAK,CAAC,MAAA,CAAO,KAAA;AAAA,EAC1C;AACF,CAAA;AAUO,SAASa,WAAAA,CACd,OAAA,EACA,IAAA,EACA,SAAA,EAC2B;AAC3B,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM;AAAA,MACjC,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAAA,MAChC,WAAA,EAAa;AAAA,KACd,CAAA;AACD,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,UAAA;AAEJ,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,IACtB,GAAG,SAAS,CAAA;AAEZ,IAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AACzC,MAAA,MAAA,GAAS,qBAAA,CAAsB,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,IAChE,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AACzC,MAAA,MAAA,GAAS,qBAAA,CAAsB,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,IAChE,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC3B,MAAA,UAAA,GAAa,KAAA;AAAA,IACf,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,QAAA,KAAa;AAC9B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA;AAAA,MACF;AACA,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,OAAA,CAAQ;AAAA,QACN,OAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAI,UAAA,GAAa,EAAE,KAAA,EAAO,UAAA,KAAe,EAAC;AAAA,QAC1C;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AASO,SAAS,aAAA,CAAc,SAAiB,IAAA,EAAwB;AACrE,EAAA,OAAO,CAAC,SAAS,GAAG,IAAA,CAAK,IAAI,aAAa,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACvD;AAQO,SAAS,oBAAoB,MAAA,EAAkC;AACpE,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,MAAA,CAAO,MAAM;AAAA,EAAK,OAAO,MAAM,CAAA,CAAA;AACnD,EAAA,IAAI,SAAS,QAAA,CAAS,QAAQ,CAAA,IAAK,OAAA,CAAQ,aAAa,OAAA,EAAS;AAC/D,IAAA,OAAO,wKAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAA;AACT;AAQO,SAAS,wBAAwB,MAAA,EAAkC;AACxE,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,OAAO,KAAA,EAAO,OAAA;AAAA,IACd,MAAA,CAAO,WAAW,mBAAA,GAAsB,MAAA;AAAA,IACxC,MAAA,CAAO,OAAO,IAAA,EAAK;AAAA,IACnB,MAAA,CAAO,OAAO,IAAA;AAAK,IACnB,MAAA,CAAO,CAAC,IAAA,KAAyB,OAAA,CAAQ,IAAI,CAAC,CAAA;AAChD,EAAA,OAAO,qBAAA,CAAsB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAC/C;AAQO,SAAS,mBAAmB,SAAA,EAAqC;AACtE,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,KAAA,IAAS,CAAC,UAAU,YAAA,EAAc;AACzD,IAAA,OAAO,qGAAA;AAAA,EACT;AACA,EAAA,OAAO,qFAAA;AACT;AAQA,eAAe,iBACb,iBAAA,EAC6B;AAC7B,EAAA,MAAM,SAAA,GAAY,iBAAA,IAAqB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AACrD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,MAAMb,GAAAA,CAAG,QAAA,CAAS,SAAS,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AASA,eAAe,eAAA,CACb,WACA,WAAA,EAC6B;AAC7B,EAAA,IAAI,UAAA,GAAaC,KAAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACvC,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMD,GAAAA,CAAG,QAAA,CAAS,WAAW,MAAM,CAAA;AACnD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGjC,MAAA,IAAI,MAAA,CAAO,SAAS,WAAA,EAAa;AAC/B,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,MAAA,GAASC,KAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACtC,IAAA,IAAI,WAAW,UAAA,EAAY;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,UAAA,GAAa,MAAA;AAAA,EACf;AACF;AAQA,SAAS,gBAAgB,OAAA,EAAyB;AAChD,EAAA,OAAO,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,GAAS,OAAA;AAC3D;AAQA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,OAAO,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,GAAG,CAAA;AACnC;AAQA,SAAS,sBAAsB,KAAA,EAAuB;AACpD,EAAA,IAAI,KAAA,CAAM,UAAU,yBAAA,EAA2B;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,yBAAyB,CAAA;AAC7D;AAQA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,IAAI,0BAAA,CAA2B,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,UAAA,CAAW,GAAA,EAAK,OAAO,CAAC,CAAA,CAAA,CAAA;AAC3C;;;ACjXA,IAAM,cAAA,GACJ,oEAAA;AACF,IAAM,oBAAA,GAAuB,qBAAA;AAWtB,SAAS,YAAY,KAAA,EAAoC;AAC9D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC9C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,IAC1C,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,IAC1C,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,IAC1C,YAAY,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,GAAG,KAAK;AAAC,GACvC;AACF;AAUO,SAAS,iBAAiB,KAAA,EAAwB;AACvD,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,KAAe,KAAA,IAAS,eAAe,KAAA,EAAO;AAC/D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,UAAU,CAAA,EAAG;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,WAAA,CAAY,UAAU,CAAA,KAAM,IAAA;AACrC;AASO,SAAS,aAAA,CAAc,MAAc,KAAA,EAAuB;AACjE,EAAA,MAAM,UAAA,GAAa,YAAY,IAAI,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,YAAY,KAAK,CAAA;AACrC,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,WAAA,EAAa;AAC/B,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,GAAA,IAAO,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA,EAAY;AACtD,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAG,CAAA,GAAI,YAAY,GAAG,CAAA;AAC9C,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,iBAAA,CAAkB,UAAA,CAAW,UAAA,EAAY,WAAA,CAAY,UAAU,CAAA;AACxE;AASO,SAAS,cAAA,CAAe,WAAmB,OAAA,EAA0B;AAC1E,EAAA,OAAO,aAAA,CAAc,SAAA,EAAW,OAAO,CAAA,GAAI,CAAA;AAC7C;AAYA,SAAS,iBAAA,CAAkB,MAAgB,KAAA,EAAyB;AAClE,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC3C,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,MAAM,CAAA;AACpD,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,EAAW,SAAS,CAAA,EAAG;AACjD,IAAA,MAAM,QAAA,GAAW,KAAK,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,MAAM,KAAK,CAAA;AAC7B,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,QAAA,EAAU,SAAS,CAAA;AACtD,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,CAAA;AACT;AASA,SAAS,qBAAA,CAAsB,MAAc,KAAA,EAAuB;AAClE,EAAA,MAAM,UAAA,GAAa,uBAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,uBAAuB,KAAK,CAAA;AAChD,EAAA,IAAI,UAAA,KAAe,MAAA,IAAa,WAAA,KAAgB,MAAA,EAAW;AACzD,IAAA,OAAO,UAAA,GAAa,WAAA;AAAA,EACtB;AACA,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,cAAc,KAAK,CAAA;AACjC;AAQA,SAAS,uBAAuB,KAAA,EAAmC;AACjE,EAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA,EAAG;AACjC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAClC;AChKA,IAAM,mBAAA,GACJ,8DAAA;AACF,IAAM,iBAAA,GAAoB,mBAAA;AAC1B,IAAM,YAAA,GAAe,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AACpC,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,qBAAqB,GAAA,GAAM,IAAA;AAoC1B,SAAS,wBAAA,CACd,iBAAiB,WAAA,EACR;AACT,EAAA,IAAI,OAAA,CAAQ,IAAI,4BAAA,EAA8B;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,IAAI,EAAA,IAAM,OAAA,CAAQ,IAAI,YAAA,IAAgB,OAAA,CAAQ,IAAI,MAAA,EAAQ;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAC,iBAAiB,cAAc,CAAA;AACzC;AASA,eAAsB,iBAAA,CACpB,gBACA,SAAA,EAC4B;AAC5B,EAAA,IAAI,wBAAA,CAAyB,cAAc,CAAA,EAAG;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,SAAS,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAO,aAAA,EAAe;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,cAAA,CAAe,KAAA,CAAM,aAAA,EAAe,cAAc,CAAA,EAAG;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,cAAA;AAAA,IACT,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAaA,eAAsB,kBAAA,CACpB,cAAA,EACA,SAAA,EACA,OAAA,EAC4B;AAC5B,EAAA,IAAI,wBAAA,CAAyB,cAAc,CAAA,EAAG;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,SAAS,CAAA;AAC7C,EAAA,IACE,KAAA,IACA,MAAM,aAAA,IACN,IAAA,CAAK,KAAI,GAAI,KAAA,CAAM,YAAY,YAAA,EAC/B;AACA,IAAA,OAAO,cAAA,CAAe,KAAA,CAAM,aAAA,EAAe,cAAc,CAAA,GACrD;AAAA,MACE,OAAA,EAAS,cAAA;AAAA,MACT,QAAQ,KAAA,CAAM;AAAA,KAChB,GACA,IAAA;AAAA,EACN;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,yBAAA,CAA0B,OAAO,CAAA;AACtD,EAAA,MAAM,gBAAA,CAAiB,WAAW,MAAM,CAAA;AACxC,EAAA,OAAO,cAAA,CAAe,MAAA,EAAQ,cAAc,CAAA,GACxC;AAAA,IACE,OAAA,EAAS,cAAA;AAAA,IACT;AAAA,GACF,GACA,IAAA;AACN;AAQA,eAAsB,0BACpB,OAAA,EACiB;AACjB,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,mBAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,gBAAA;AACxC,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,WAAA,EAAa,WAAW,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAChF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAG9B,EAAA,IAAI,OAAO,OAAO,OAAA,KAAY,QAAA,IAAY,CAAC,WAAA,CAAY,MAAA,CAAO,OAAO,CAAA,EAAG;AACtE,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AAQA,eAAsB,gBAAA,CACpB,WACA,aAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,aAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACA,EAAA,MAAMD,IAAG,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC7C,EAAA,MAAMA,GAAAA,CAAG,SAAA,CAAU,eAAA,CAAgB,SAAS,CAAA,EAAG,KAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,IAC7E,QAAA,EAAU,MAAA;AAAA,IACV,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAQA,eAAe,gBAAgB,SAAA,EAAgD;AAC7E,EAAA,IAAI;AACF,IAAA,MAAM,UAAU,MAAMA,GAAAA,CAAG,SAAS,eAAA,CAAgB,SAAS,GAAG,MAAM,CAAA;AACpE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,IAAA,IACE,OAAO,MAAA,CAAO,aAAA,KAAkB,YAChC,OAAO,MAAA,CAAO,cAAc,QAAA,EAC5B;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,WAAW,MAAA,CAAO;AAAA,KACpB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,QAAA,IAAY,KAAA,YAAiB,WAAA,EAAa;AAC/D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAQA,SAAS,gBAAgB,SAAA,EAA2B;AAClD,EAAA,OAAOC,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,iBAAiB,CAAA;AAC/C;AAaA,SAAS,aAAA,CACP,GAAA,EACA,SAAA,EACA,WAAA,EACiB;AACjB,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AAAA,MACpB,GAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,kBAAA;AAAA,UACR,YAAA,EAAc,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA;AAAA;AAC1C,OACF;AAAA,MACA,CAAC,QAAA,KAAa;AACZ,QAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,CAAA;AAC1C,QAAA,IAAI,UAAA,GAAa,GAAA,IAAO,UAAA,IAAc,GAAA,EAAK;AACzC,UAAA,QAAA,CAAS,MAAA,EAAO;AAChB,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,UAAU,EAAE,CAAC,CAAA;AAC5D,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,MAAM,SAAmB,EAAC;AAC1B,QAAA,QAAA,CAAS,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AACrC,UAAA,UAAA,IAAc,KAAA,CAAM,UAAA;AACpB,UAAA,IAAI,aAAa,kBAAA,EAAoB;AACnC,YAAA,OAAA,CAAQ,OAAA;AAAA,cACN,IAAI,MAAM,8CAA8C;AAAA,aAC1D;AACA,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,QACnB,CAAC,CAAA;AACD,QAAA,QAAA,CAAS,EAAA,CAAG,OAAO,MAAM;AACvB,UAAA,OAAA,CAAQ,OAAO,MAAA,CAAO,MAAM,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,QAChD,CAAC,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,OAAA,CAAQ,UAAA,CAAW,WAAW,MAAM;AAClC,MAAA,OAAA,CAAQ,QAAQ,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,SAAS,IAAI,CAAC,CAAA;AAAA,IAClF,CAAC,CAAA;AACD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,CAAC,MAAA,KAAW;AAC/B,QAAA,MAAA,CAAO,KAAA,EAAM;AAAA,MACf,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAA,CAAQ,EAAA,CAAG,SAAS,MAAM,CAAA;AAC1B,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd,CAAC,CAAA;AACH;;;ACjLO,SAAS,qBAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,OAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,sDAAsD,CAAA,CAClE,MAAA,CAAO,UAAU,8BAA8B,CAAA,CAC/C,OAAO,SAAA,EAAW,mDAAmD,EACrE,MAAA,CAAO,SAAA,EAAW,2CAA2C,CAAA,CAC7D,MAAA,CAAO,OAAO,OAAA,KAAkC;AAC/C,IAAA,MAAM,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAAA,EACzC,CAAC,CAAA;AACL;AAQA,eAAe,gBAAA,CACb,SACA,OAAA,EACe;AACf,EAAA,0BAAA,EAA2B;AAC3B,EAAA,MAAM,YAAA,GAA0C,OAAA,CAAQ,IAAA,GACpD,EAAC,GACD;AAAA,IACE,UAAA,EAAY,CAAC,OAAA,KAAY;AACvB,MAAA,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,IACvB;AAAA,GACF;AACJ,EAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB,OAAA,EAAS,SAAS,YAAY,CAAA;AACxE,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,IAAA,EAAM,GAAG,MAAA,EAAO,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5D,IAAA;AAAA,EACF;AACA,EAAA,eAAA,CAAgB,MAAM,CAAA;AACxB;AAaA,eAAsB,oBAAA,CACpB,OAAA,EACA,OAAA,EACA,YAAA,EAC8B;AAC9B,EAAA,MAAM,cAAA,GAAiB,cAAc,cAAA,IAAkB,WAAA;AACvD,EAAA,MAAM,OAAA,GAAU,YAAA,EAAc,OAAA,IAAW,IAAI,WAAA,EAAY;AACzD,EAAA,MAAM,aAAA,GAAgB,MAAM,yBAAA,CAA0B,YAAY,CAAA;AAClE,EAAA,MAAM,gBAAA,CAAiB,OAAA,CAAQ,YAAA,CAAa,SAAA,EAAW,aAAa,CAAA;AAEpE,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,IAAS,CAAC,cAAA,CAAe,aAAA,EAAe,cAAc,CAAA,EAAG;AACpE,IAAA,MAAMa,OAAAA,GAAS,QAAQ,KAAA,GACnB,MAAA,GACA,MAAM,UAAA,CAAW,OAAA,EAAS,cAAc,UAAU,CAAA;AACtD,IAAA,OAAO,UAAA;AAAA,MACL;AAAA,QACE,gBAAA,EAAkB,cAAA;AAAA,QAClB,eAAA,EAAiB,cAAA;AAAA,QACjB,cAAA,EAAgB,aAAA;AAAA,QAChB,MAAA,EAAQ,oBAAA;AAAA,QACR,OAAA,EAAS,aAAa,cAAc,CAAA,sBAAA,CAAA;AAAA,QACpC,WAAW,YAAA;AAAa,OAC1B;AAAA,MACAA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,mBAAA,EAAoB;AACpD,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,OAAO;AAAA,MACL,gBAAA,EAAkB,cAAA;AAAA,MAClB,eAAA,EAAiB,cAAA;AAAA,MACjB,cAAA,EAAgB,aAAA;AAAA,MAChB,MAAA,EAAQ,kBAAA;AAAA,MACR,aAAa,SAAA,CAAU,aAAA;AAAA,MACvB,gBAAgB,SAAA,CAAU,MAAA;AAAA,MAC1B,GAAI,UAAU,YAAA,GAAe,EAAE,eAAe,SAAA,CAAU,YAAA,KAAiB,EAAC;AAAA,MAC1E,OAAA,EAAS,CAAA,UAAA,EAAa,cAAc,CAAA,IAAA,EAAO,aAAa,CAAA,UAAA,CAAA;AAAA,MACxD,GAAI,SAAA,CAAU,aAAA,GAAgB,EAAE,OAAA,EAAS,kBAAA,KAAuB,EAAC;AAAA,MACjE,cAAA,EAAgB,qBAAqB,aAAa,CAAA;AAAA,MAClD,WAAW,YAAA;AAAa,KAC1B;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,UAAU,aAAA,EAAe;AAC5B,IAAA,MAAMA,OAAAA,GAAS,MAAM,UAAA,CAAW,OAAA,EAAS,cAAc,UAAU,CAAA;AACjE,IAAA,OAAO,UAAA;AAAA,MACL;AAAA,QACE,gBAAA,EAAkB,cAAA;AAAA,QAClB,eAAA,EAAiB,cAAA;AAAA,QACjB,cAAA,EAAgB,aAAA;AAAA,QAChB,MAAA,EAAQ,iBAAA;AAAA,QACR,WAAA,EAAa,KAAA;AAAA,QACb,gBAAgB,SAAA,CAAU,MAAA;AAAA,QAC1B,GAAI,UAAU,YAAA,GAAe,EAAE,eAAe,SAAA,CAAU,YAAA,KAAiB,EAAC;AAAA,QAC1E,OAAA,EAAS,CAAA,8BAAA,EAAiC,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA;AAAA,QACvE,cAAA,EAAgB,qBAAqB,aAAa,CAAA;AAAA,QAClD,WAAW,YAAA;AAAa,OAC1B;AAAA,MACAA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,YAAA,EAAc,UAAA;AAAA,IACZ,CAAA,mBAAA,EAAsB,cAAc,CAAA,IAAA,EAAO,aAAa,CAAA,YAAA;AAAA,GAC1D;AACA,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,aAAA,CAAc,aAAa,CAAA;AAC3D,EAAA,sBAAA,CAAuB,WAAW,oBAAoB,CAAA;AACtD,EAAA,MAAM,sBAAA,CAAuB,OAAA,EAAS,aAAA,EAAe,SAAS,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,EAAS,cAAc,UAAU,CAAA;AAEjE,EAAA,OAAO,UAAA;AAAA,IACL;AAAA,MACE,gBAAA,EAAkB,cAAA;AAAA,MAClB,eAAA,EAAiB,aAAA;AAAA,MACjB,cAAA,EAAgB,aAAA;AAAA,MAChB,MAAA,EAAQ,SAAA;AAAA,MACR,WAAA,EAAa,IAAA;AAAA,MACb,gBAAgB,SAAA,CAAU,MAAA;AAAA,MAC1B,GAAI,UAAU,YAAA,GAAe,EAAE,eAAe,SAAA,CAAU,YAAA,KAAiB,EAAC;AAAA,MAC1E,OAAA,EAAS,CAAA,uBAAA,EAA0B,cAAc,CAAA,IAAA,EAAO,aAAa,CAAA,CAAA;AAAA,MACrE,OAAA,EAAS,kBAAA;AAAA,MACT,WAAW,YAAA;AAAa,KAC1B;AAAA,IACA;AAAA,GACF;AACF;AAQA,eAAe,0BACb,YAAA,EACiB;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GACJ,MAAA,CAAO,YAAA,EAAc,kBAAA,IAAsB,yBAAA,GAA2B;AACxE,IAAA,IAAI,CAAC,WAAA,CAAY,MAAM,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAE,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,SAAA;AAAA,MACN,SACE,KAAA,YAAiB,KAAA,GACb,CAAA,0CAAA,EAA6C,KAAA,CAAM,OAAO,CAAA,CAAA,GAC1D;AAAA,KACP,CAAA;AAAA,EACH;AACF;AASA,eAAe,sBAAA,CACb,OAAA,EACA,aAAA,EACA,SAAA,EACe;AACf,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,CAAQ,6BAAA;AAAA,MACZ,aAAA;AAAA,MACA,SAAA,CAAU;AAAA,KACZ;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,MACxB,IAAA,EAAM,cAAA;AAAA,MACN,SACE,KAAA,YAAiB,KAAA,GACb,CAAA,iCAAA,EAAoC,KAAA,CAAM,OAAO,CAAA,CAAA,GACjD,iCAAA;AAAA,MACN,IAAA,EAAM,CAAA,qCAAA,EAAU,oBAAA,CAAqB,aAAa,CAAC,CAAA,mDAAA;AAAA,KACpD,CAAA;AAAA,EACH;AACF;AAQA,SAAS,sBAAA,CACP,QACA,OAAA,EACM;AACN,EAAA,IAAI,MAAA,CAAO,aAAa,CAAA,IAAK,CAAC,OAAO,KAAA,IAAS,CAAC,OAAO,QAAA,EAAU;AAC9D,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAO,oBAAoB,MAAM,CAAA;AACvC,EAAA,MAAM,IAAI,aAAa,CAAA,EAAG;AAAA,IACxB,IAAA,EAAM,cAAA;AAAA,IACN,OAAA;AAAA,IACA,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS,EAAC;AAAA,IACvB,MAAA,EAAQ,wBAAwB,MAAM;AAAA,GACvC,CAAA;AACH;AASA,eAAe,UAAA,CACb,SACA,UAAA,EAC2B;AAC3B,EAAA,UAAA,GAAa,+BAA+B,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,eAAA,EAAgB;AAC7C,EAAA,IAAI,MAAA,CAAO,aAAa,CAAA,IAAK,CAAC,OAAO,KAAA,IAAS,CAAC,OAAO,QAAA,EAAU;AAC9D,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS,sBAAA;AAAA,IACT,MAAA,EAAQ,wBAAwB,MAAM;AAAA,GACxC;AACF;AASA,SAAS,UAAA,CACP,QACA,MAAA,EACqB;AACrB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,eAAe,MAAA,CAAO,MAAA;AAAA,IACtB,GAAI,OAAO,OAAA,GAAU,EAAE,gBAAgB,MAAA,CAAO,OAAA,KAAY,EAAC;AAAA,IAC3D,GAAI,OAAO,MAAA,GAAS,EAAE,eAAe,MAAA,CAAO,MAAA,KAAW;AAAC,GAC1D;AACF;AAOA,SAAS,gBAAgB,MAAA,EAAmC;AAC1D,EAAA,IAAI,MAAA,CAAO,WAAW,kBAAA,EAAoB;AACxC,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,CAAA,kBAAA,EAAqB,MAAA,CAAO,gBAAgB,CAAA,IAAA,EAAO,OAAO,cAAc,CAAA;AAAA,KAC1E;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,aAAA,EAAgB,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA;AAChD,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,OAAA,CAAQ,MAAM,oCAAoC,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,cAAA,EAAiB,MAAA,CAAO,cAAc,CAAA,CAAE,CAAA;AAAA,IACxD;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,WAAW,iBAAA,EAAmB;AACvC,IAAA,OAAA,CAAQ,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5B,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,QAAA,EAAW,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAAA,IACjD;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,cAAA,EAAiB,MAAA,CAAO,cAAc,CAAA,CAAE,CAAA;AACtD,IAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,IAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,KAAA,CAAM,OAAO,OAAO,CAAA;AAC5B,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,aAAA,EAAgB,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA;AAAA,EAClD;AACA,EAAA,eAAA,CAAgB,MAAM,CAAA;AACxB;AAOA,SAAS,gBAAgB,MAAA,EAAmC;AAC1D,EAAA,IAAI,CAAC,OAAO,aAAA,EAAe;AACzB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,kBAAkB,QAAA,EAAU;AACrC,IAAA,OAAA,CAAQ,MAAM,gBAAgB,CAAA;AAC9B,IAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,aAAA,IAAiB,eAAe,CAAA,CAAE,CAAA;AAClF;AAQA,SAAS,qBAAqB,OAAA,EAAyB;AACrD,EAAA,OAAO,cAAc,KAAA,EAAO;AAAA,IAC1B,SAAA;AAAA,IACA,IAAA;AAAA,IACA,4BAA4B,OAAO,CAAA;AAAA,GACpC,CAAA;AACH;AAOA,SAAS,YAAA,GAAuB;AAC9B,EAAA,OAAO,wDAAA;AACT;AC/XO,IAAM,YAAA,GAAe,0BAAA;AAC5B,IAAM,eAAA,GAAkB,SAAA;AAExB,SAAS,gBAAA,GAA2B;AAClC,EAAA,OACE,OAAA,CAAQ,IAAI,gBAAA,IACZb,KAAAA,CAAK,KAAKG,EAAAA,CAAG,OAAA,EAAQ,EAAG,SAAA,EAAW,WAAW,CAAA;AAElD;AAEO,IAAM,eAAN,MAAmB;AAAA,EACf,SAAA;AAAA,EACA,UAAA;AAAA,EACQ,WAAA;AAAA,EAEjB,YAAY,OAAA,EAA6D;AACvE,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,gBAAA,EAAiB;AACxD,IAAA,IAAA,CAAK,UAAA,GAAaH,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,WAAW,aAAa,CAAA;AACzD,IAAA,IAAA,CAAK,WAAA,GAAc,SAAS,WAAA,IAAe,MAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,SAAA,GAAkC;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,MAAMD,GAAAA,CAAG,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AACzD,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,SAAA,GAAY,KAAA;AAClB,MAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,QAAA,OAAO,EAAC;AAAA,MACV;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,KAAA,EAA0C;AACzD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,EAAU;AACrC,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAG,OAAA;AAAA,MACH,GAAG;AAAA,KACL;AACA,IAAA,MAAMA,IAAG,KAAA,CAAM,IAAA,CAAK,WAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAClD,IAAA,MAAMA,GAAAA,CAAG,UAAU,IAAA,CAAK,UAAA,EAAY,KAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,MACjE,QAAA,EAAU,MAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,UAAA,GAA4C;AAChD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,WAAA,CAAY,WAAA;AAAA,MACjC,YAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB;AAAA,EAEA,MAAM,YAAY,OAAA,EAAuC;AACvD,IAAA,MAAM,KAAK,WAAA,CAAY,WAAA;AAAA,MACrB,YAAA;AAAA,MACA,eAAA;AAAA,MACA,IAAA,CAAK,UAAU,OAAO;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,GAA8B;AAClC,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,cAAA,CAAe,YAAA,EAAc,eAAe,CAAA;AAAA,EACrE;AACF,CAAA;;;AC/GA,IAAI,iBAAA;AAWJ,eAAsB,iBAAA,CACpB,SAAA,EACA,cAAA,GAAiB,WAAA,EACF;AACf,EAAA,iBAAA,GACG,MAAM,iBAAA,CAAkB,cAAA,EAAgB,SAAS,CAAA,IAAM,MAAA;AAC1D,EAAA,KAAK,kBAAA,CAAmB,cAAA,EAAgB,SAAA,EAAW,EAAE,KAAA,EAAO,MAAM,CAAA,CAC/D,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,IAAA,IAAI,CAAC,qBAAqB,IAAA,EAAM;AAC9B,MAAA,iBAAA,GAAoB,IAAA;AAAA,IACtB;AAAA,EACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,EAEb,CAAC,CAAA;AAEH,EAAA,wBAAA,CAAyB,MAAM;AAC7B,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ;AAAA,QACN,SAAS,iBAAA,CAAkB,OAAA;AAAA,QAC3B,QAAQ,iBAAA,CAAkB,MAAA;AAAA,QAC1B,SAAS,CAAA,UAAA,EAAa,iBAAA,CAAkB,MAAM,CAAA,oBAAA,EAAuB,kBAAkB,OAAO,CAAA,uBAAA,CAAA;AAAA,QAC9F,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF,CAAC,CAAA;AACH;;;ACpBA,eAAe,IAAA,GAAsB;AACnC,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,YAAA,EAAc,IAAI,YAAA;AAAa,GACjC;AACA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACpC,EAAA,IAAI,CAAC,mBAAA,CAAoB,OAAO,CAAA,EAAG;AACjC,IAAA,MAAM,iBAAA,CAAkB,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,KAAM,OAAA,CAAQ,CAAC,MAAM,IAAA,IAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM,WAAA,CAAA,EAAc;AAC/E,IAAA,MAAM,eAAe,OAAO,CAAA;AAC5B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,EAAA,OAAA,CACG,IAAA,CAAK,WAAW,CAAA,CAChB,WAAA,CAAY,6CAA6C,CAAA,CACzD,MAAA,CAAO,iBAAiB,gDAAgD,CAAA;AAE3E,EAAA,uBAAA,CAAwB,SAAS,OAAO,CAAA;AACxC,EAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACpC,EAAA,qBAAA,CAAsB,SAAS,OAAO,CAAA;AACtC,EAAA,kBAAA,CAAmB,SAAS,OAAO,CAAA;AACnC,EAAA,qBAAA,CAAsB,SAAS,OAAO,CAAA;AACtC,EAAA,kBAAA,CAAmB,SAAS,OAAO,CAAA;AACnC,EAAA,qBAAA,CAAsB,SAAS,OAAO,CAAA;AACtC,EAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACpC,EAAA,kBAAA,CAAmB,SAAS,OAAO,CAAA;AACnC,EAAA,qBAAA,CAAsB,SAAS,OAAO,CAAA;AACtC,EAAA,wBAAA,CAAyB,SAAS,OAAO,CAAA;AAEzC,EAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AACvC;AAEA,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC/B,EAAA,OAAA,CAAQ,QAAA,GAAW,WAAW,KAAK,CAAA;AACrC,CAAC,CAAA;AAUD,SAAS,oBAAoB,OAAA,EAA4B;AACvD,EAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,IAAK,CAAC,GAAA,KACnB,GAAA,KAAQ,YAAA,IACR,GAAA,KAAQ,gBACR,GAAA,KAAQ;AAAA,GACV;AACF","file":"index.js","sourcesContent":["export class ApiError extends Error {\n constructor(\n message: string,\n readonly code?: number,\n readonly status?: number,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport class AuthError extends ApiError {\n constructor(message: string, code?: number, status?: number) {\n super(message, code, status);\n this.name = 'AuthError';\n }\n}\n\nexport class PermissionError extends ApiError {\n constructor(message: string, code?: number, status?: number) {\n super(message, code, status);\n this.name = 'PermissionError';\n }\n}\n","import { ApiError, AuthError, PermissionError } from \"../util/errors.js\";\n\n/**\n * CLI 支持的输出格式。\n */\nexport type OutputFormat = \"json\" | \"pretty\" | \"table\" | \"ndjson\" | \"csv\";\n\n/**\n * CLI 成功响应统一信封。\n */\nexport interface SuccessEnvelope<T> {\n ok: true;\n data: T;\n meta?: Record<string, unknown>;\n _notice?: Record<string, unknown>;\n}\n\n/**\n * CLI 错误响应统一信封。\n */\nexport interface ErrorEnvelope {\n ok: false;\n error: ErrorDetail;\n _notice?: Record<string, unknown>;\n}\n\n/**\n * CLI 错误详情。\n */\nexport interface ErrorDetail {\n type: string;\n code?: number | string;\n message: string;\n hint?: string;\n risk?: RiskDetail;\n detail?: unknown;\n}\n\n/**\n * 高风险操作描述。\n */\nexport interface RiskDetail {\n level: \"read\" | \"write\" | \"high-risk-write\";\n action: string;\n}\n\n/**\n * 可带退出码和结构化错误信息的 CLI 异常。\n */\nexport class CliExitError extends Error {\n constructor(\n readonly exitCode: number,\n readonly detail: ErrorDetail,\n ) {\n super(detail.message);\n this.name = \"CliExitError\";\n }\n}\n\n/**\n * 需要用户确认后才能继续执行的异常。\n */\nexport class ConfirmationRequiredError extends CliExitError {\n constructor(action: string, hint = \"add --confirm to confirm\") {\n super(10, {\n type: \"confirmation_required\",\n message: `${action} requires confirmation`,\n hint,\n risk: {\n level: \"high-risk-write\",\n action,\n },\n });\n this.name = \"ConfirmationRequiredError\";\n }\n}\n\n/**\n * CLI 全局提醒提供器。\n *\n * <p>提醒只作为结构化 JSON envelope 的附加信息输出,不能改变命令退出码,也不能写入普通\n * 文本输出。这样 Agent 调用业务命令时可以解析 `_notice`,而不会破坏原有 `data` 数据结构。\n */\nexport type NoticeProvider = () => Record<string, unknown> | undefined;\n\nlet pendingNoticeProvider: NoticeProvider | undefined;\n\n/**\n * 设置当前进程内的全局提醒提供器。\n *\n * @param provider 提醒提供器,传空表示关闭提醒\n */\nexport function setPendingNoticeProvider(provider?: NoticeProvider): void {\n pendingNoticeProvider = provider;\n}\n\n/**\n * 清空当前进程内的全局提醒。\n */\nexport function clearPendingNoticeProvider(): void {\n pendingNoticeProvider = undefined;\n}\n\n/**\n * 读取当前应注入 JSON envelope 的提醒。\n *\n * @returns 提醒对象;没有提醒时返回 undefined\n */\nexport function getPendingNotice(): Record<string, unknown> | undefined {\n return pendingNoticeProvider?.();\n}\n\n/**\n * 解析输出格式,未知格式按校验错误处理。\n *\n * @param value 原始格式\n * @returns 标准输出格式\n */\nexport function parseOutputFormat(value: string | undefined): OutputFormat {\n const normalized = (value ?? \"json\").trim().toLowerCase();\n if (\n normalized === \"json\" ||\n normalized === \"pretty\" ||\n normalized === \"table\" ||\n normalized === \"ndjson\" ||\n normalized === \"csv\"\n ) {\n return normalized;\n }\n throw new CliExitError(2, {\n type: \"validation\",\n message: `unknown output format: ${value}`,\n hint: \"supported formats: json, pretty, table, ndjson, csv\",\n });\n}\n\n/**\n * 对数据应用极简 jq 风格点路径。\n *\n * <p>这里只实现 Agent 常用的 `.a.b` 和数组映射场景,不试图完整复刻 jq。\n *\n * @param data 原始数据\n * @param expression 点路径表达式\n * @returns 提取后的数据\n */\nexport function applyJqPath(data: unknown, expression?: string): unknown {\n const trimmed = expression?.trim();\n if (!trimmed || trimmed === \".\") {\n return data;\n }\n if (!trimmed.startsWith(\".\")) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: `unsupported jq expression: ${expression}`,\n hint: \"mt-os-cli currently supports simple dot paths, for example: --jq .data.items\",\n });\n }\n const segments = trimmed\n .slice(1)\n .split(\".\")\n .map((segment) => segment.trim())\n .filter(Boolean);\n return segments.reduce<unknown>((current, segment) => {\n if (Array.isArray(current)) {\n return current.map((item) => readObjectField(item, segment));\n }\n return readObjectField(current, segment);\n }, data);\n}\n\n/**\n * 写成功输出。\n *\n * @param data 数据\n * @param options 输出选项\n */\nexport function writeData(\n data: unknown,\n options?: {\n format?: OutputFormat;\n jq?: string;\n meta?: Record<string, unknown>;\n envelope?: boolean;\n },\n): void {\n const format = options?.format ?? \"json\";\n const filtered = applyJqPath(data, options?.jq);\n if (format === \"json\") {\n const payload =\n options?.envelope === false\n ? filtered\n : buildSuccessEnvelope(filtered, options?.meta);\n console.log(JSON.stringify(payload, null, 2));\n return;\n }\n if (format === \"pretty\") {\n console.log(renderPretty(filtered));\n return;\n }\n if (format === \"table\") {\n console.log(renderTable(filtered));\n return;\n }\n if (format === \"ndjson\") {\n writeNdjson(filtered);\n return;\n }\n console.log(renderCsv(filtered));\n}\n\n/**\n * 将异常写成结构化错误信封。\n *\n * @param error 原始异常\n * @returns 进程退出码\n */\nexport function writeError(error: unknown): number {\n const detail = normalizeError(error);\n const notice = getPendingNotice();\n console.error(\n JSON.stringify(\n {\n ok: false,\n error: detail.error,\n ...(notice ? { _notice: notice } : {}),\n } satisfies ErrorEnvelope,\n null,\n 2,\n ),\n );\n return detail.exitCode;\n}\n\n/**\n * 构建成功信封。\n *\n * @param data 数据\n * @param meta 元信息\n * @returns 成功信封\n */\nfunction buildSuccessEnvelope(\n data: unknown,\n meta?: Record<string, unknown>,\n): SuccessEnvelope<unknown> {\n const notice = getPendingNotice();\n return {\n ok: true,\n data,\n ...(meta ? { meta } : {}),\n ...(notice ? { _notice: notice } : {}),\n };\n}\n\n/**\n * 归一化异常。\n *\n * @param error 原始异常\n * @returns 退出码和错误详情\n */\nfunction normalizeError(error: unknown): {\n exitCode: number;\n error: ErrorDetail;\n} {\n if (error instanceof CliExitError) {\n return {\n exitCode: error.exitCode,\n error: error.detail,\n };\n }\n if (error instanceof AuthError) {\n return {\n exitCode: 3,\n error: {\n type: \"auth\",\n ...(error.code !== undefined ? { code: error.code } : {}),\n message: error.message,\n hint:\n error.message === \"token is null\"\n ? \"device-auth create endpoint returned 401. Confirm the selected environment has deployed and anonymously exposed /user/api/v1/cli-device-auth/create, or retry with --env local/--base-url pointing to the local user service.\"\n : \"run `mt-os-cli auth login --no-wait --json`, send the verification_url to the user, then run `mt-os-cli auth login --device-code <device_code>`.\",\n },\n };\n }\n if (error instanceof PermissionError) {\n return {\n exitCode: 4,\n error: {\n type: \"permission\",\n ...(error.code !== undefined ? { code: error.code } : {}),\n message: error.message,\n },\n };\n }\n if (error instanceof ApiError) {\n return {\n exitCode: 4,\n error: {\n type: \"api\",\n ...(error.code !== undefined ? { code: error.code } : {}),\n message: error.message,\n },\n };\n }\n if (error instanceof SyntaxError) {\n return {\n exitCode: 2,\n error: {\n type: \"validation\",\n message: error.message,\n hint: \"check JSON flags such as --args-json and --runtime-json\",\n },\n };\n }\n return {\n exitCode: 1,\n error: {\n type: \"internal\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n}\n\n/**\n * 读取对象字段。\n *\n * @param value 当前值\n * @param field 字段名\n * @returns 字段值\n */\nfunction readObjectField(value: unknown, field: string): unknown {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n return (value as Record<string, unknown>)[field];\n}\n\n/**\n * 渲染便于人阅读的文本。\n *\n * @param value 数据\n * @returns 文本\n */\nfunction renderPretty(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n return JSON.stringify(value, null, 2);\n}\n\n/**\n * 渲染表格。\n *\n * @param value 数据\n * @returns 表格文本\n */\nfunction renderTable(value: unknown): string {\n const rows = normalizeRows(value);\n if (rows.length === 0) {\n return \"(no data)\";\n }\n const columns = collectColumns(rows);\n const widths = columns.map((column) =>\n Math.max(\n column.length,\n ...rows.map((row) => cellToString(row[column]).length),\n ),\n );\n const renderRow = (cells: string[]) =>\n cells.map((cell, index) => cell.padEnd(widths[index] ?? 0)).join(\" \");\n return [\n renderRow(columns),\n renderRow(widths.map((width) => \"-\".repeat(width))),\n ...rows.map((row) =>\n renderRow(columns.map((column) => cellToString(row[column]))),\n ),\n ].join(\"\\n\");\n}\n\n/**\n * 输出 NDJSON。\n *\n * @param value 数据\n */\nfunction writeNdjson(value: unknown): void {\n const rows = Array.isArray(value) ? value : [value];\n for (const row of rows) {\n console.log(JSON.stringify(row));\n }\n}\n\n/**\n * 渲染 CSV。\n *\n * @param value 数据\n * @returns CSV 文本\n */\nfunction renderCsv(value: unknown): string {\n const rows = normalizeRows(value);\n if (rows.length === 0) {\n return \"\";\n }\n const columns = collectColumns(rows);\n return [\n columns.map(escapeCsvCell).join(\",\"),\n ...rows.map((row) =>\n columns\n .map((column) => escapeCsvCell(cellToString(row[column])))\n .join(\",\"),\n ),\n ].join(\"\\n\");\n}\n\n/**\n * 将任意值归一化为对象行。\n *\n * @param value 数据\n * @returns 表格行\n */\nfunction normalizeRows(value: unknown): Array<Record<string, unknown>> {\n const rows = Array.isArray(value) ? value : [value];\n return rows.map((row) => {\n if (row && typeof row === \"object\" && !Array.isArray(row)) {\n return row as Record<string, unknown>;\n }\n return {\n value: row,\n };\n });\n}\n\n/**\n * 收集表格列。\n *\n * @param rows 行\n * @returns 列名\n */\nfunction collectColumns(rows: Array<Record<string, unknown>>): string[] {\n const columns = new Set<string>();\n for (const row of rows) {\n for (const key of Object.keys(row)) {\n columns.add(key);\n }\n }\n return [...columns];\n}\n\n/**\n * 单元格转字符串。\n *\n * @param value 原始值\n * @returns 字符串\n */\nfunction cellToString(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n return JSON.stringify(value);\n}\n\n/**\n * 转义 CSV 单元格。\n *\n * @param value 原始值\n * @returns CSV 安全值\n */\nfunction escapeCsvCell(value: string): string {\n if (!/[\",\\r\\n]/.test(value)) {\n return value;\n }\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n","export function normalizeBaseUrl(input: string): string {\n const value = input.trim();\n if (!value) {\n throw new Error(\n \"Missing MTOS base URL. Use --env, --base-url, or MT_OS_BASE_URL.\",\n );\n }\n const url = new URL(value);\n if (!url.protocol.startsWith('http')) {\n throw new Error(`Unsupported base URL protocol: ${url.protocol}`);\n }\n return url.toString().replace(/\\/+$/, '');\n}\n","import type {\n CustomEnvironmentConfig,\n LocalConfig,\n} from \"../session/store.js\";\nimport { normalizeBaseUrl } from \"../util/base-url.js\";\n\n/**\n * CLI 内置支持的环境名称。\n */\nexport type BuiltinEnvironmentName = \"local\" | \"dev\" | \"test\" | \"prod\";\n\n/**\n * CLI 默认环境。\n */\nexport const DEFAULT_ENVIRONMENT_NAME: BuiltinEnvironmentName = \"test\";\n\n/**\n * 环境来源。\n */\nexport type EnvironmentSource = \"builtin\" | \"custom\";\n\n/**\n * 环境预设定义。\n */\nexport interface EnvironmentPreset {\n name: string;\n label: string;\n description: string;\n baseUrl: string;\n mcpBaseUrl: string;\n source: EnvironmentSource;\n}\n\n/**\n * 环境预设原始配置。\n */\nconst PRESET_RECORD: Record<\n BuiltinEnvironmentName,\n Omit<EnvironmentPreset, \"name\" | \"source\">\n> = {\n local: {\n label: \"本地联调\",\n description: \"本地 Law test 环境,HTTP 走 8087。\",\n baseUrl: \"http://localhost:8087\",\n mcpBaseUrl: \"http://localhost:8087\",\n },\n dev: {\n label: \"开发环境\",\n description: \"MTOS 开发环境;未单独配置时使用本地 Law。\",\n baseUrl: \"http://localhost:8087\",\n mcpBaseUrl: \"http://localhost:8087\",\n },\n test: {\n label: \"测试环境\",\n description: \"MTOS 测试环境。\",\n baseUrl: \"https://testlaw.meritsandtree.com\",\n mcpBaseUrl: \"https://testlaw.meritsandtree.com\",\n },\n prod: {\n label: \"生产环境\",\n description: \"MTOS 生产环境。\",\n baseUrl: \"https://law.meritsandtree.com\",\n mcpBaseUrl: \"https://law.meritsandtree.com\",\n },\n};\n\nconst BUILTIN_ENVIRONMENT_NAMES = Object.keys(\n PRESET_RECORD,\n) as BuiltinEnvironmentName[];\n\n/**\n * 返回所有环境预设。\n *\n * @returns 规范化后的环境预设列表\n */\nexport function listEnvironmentPresets(): EnvironmentPreset[] {\n return BUILTIN_ENVIRONMENT_NAMES.map((name) =>\n normalizePreset(name, PRESET_RECORD[name]),\n );\n}\n\n/**\n * 返回内置和用户自定义环境。\n *\n * @param config 本地配置\n * @returns 环境列表\n */\nexport function listAvailableEnvironmentPresets(\n config: LocalConfig,\n): EnvironmentPreset[] {\n return [\n ...listEnvironmentPresets(),\n ...listCustomEnvironmentPresets(config),\n ];\n}\n\n/**\n * 根据名称读取环境预设。\n *\n * @param name 环境名称\n * @returns 对应预设,不存在时返回 undefined\n */\nexport function getEnvironmentPreset(\n name: string | undefined,\n config?: LocalConfig,\n): EnvironmentPreset | undefined {\n if (!name) {\n return undefined;\n }\n const normalizedName = normalizeEnvironmentName(name);\n const builtinName = toBuiltinEnvironmentName(normalizedName);\n if (!builtinName) {\n return getCustomEnvironmentPreset(normalizedName, config);\n }\n return normalizePreset(builtinName, PRESET_RECORD[builtinName]);\n}\n\n/**\n * 根据名称读取环境预设,不存在时抛出错误。\n *\n * @param name 环境名称\n * @returns 对应预设\n */\nexport function getEnvironmentPresetOrThrow(\n name: string,\n config?: LocalConfig,\n): EnvironmentPreset {\n const preset = getEnvironmentPreset(name, config);\n if (!preset) {\n const supported = listAvailableEnvironmentPresets(config ?? {})\n .map((item) => item.name)\n .join(\", \");\n throw new Error(\n `Unknown environment: ${name}. Supported environments: ${supported}`,\n );\n }\n return preset;\n}\n\n/**\n * 读取默认环境预设。\n *\n * @returns 默认环境预设\n */\nexport function getDefaultEnvironmentPreset(): EnvironmentPreset {\n return getEnvironmentPresetOrThrow(DEFAULT_ENVIRONMENT_NAME);\n}\n\n/**\n * 把某个环境预设写入本地配置。\n *\n * @param config 当前配置\n * @param preset 目标环境预设\n * @returns 合并后的配置\n */\nexport function applyEnvironmentPreset(\n config: LocalConfig,\n preset: EnvironmentPreset,\n): LocalConfig {\n return {\n ...config,\n environment: preset.name,\n baseUrl: preset.baseUrl,\n mcpBaseUrl: preset.mcpBaseUrl,\n };\n}\n\n/**\n * 判断环境名是否为内置环境。\n *\n * @param name 环境名\n * @returns 是否是内置环境\n */\nexport function isBuiltinEnvironmentName(name: string | undefined): boolean {\n if (!name) {\n return false;\n }\n return toBuiltinEnvironmentName(normalizeEnvironmentName(name)) !== undefined;\n}\n\n/**\n * 规范化环境名。\n *\n * @param name 原始环境名\n * @returns 规范化后的环境名\n */\nexport function normalizeEnvironmentName(name: string): string {\n const normalized = name.trim().toLowerCase();\n if (!/^[a-z][a-z0-9_-]*$/.test(normalized)) {\n throw new Error(\n \"Invalid environment name. Use lowercase letters, numbers, hyphen, or underscore, and start with a letter.\",\n );\n }\n return normalized;\n}\n\n/**\n * 构建用户自定义环境。\n *\n * @param input 原始自定义环境\n * @returns 规范化后的环境预设\n */\nexport function buildCustomEnvironmentPreset(input: {\n name: string;\n baseUrl: string;\n mcpBaseUrl?: string;\n label?: string;\n description?: string;\n}): EnvironmentPreset {\n const name = normalizeEnvironmentName(input.name);\n if (isBuiltinEnvironmentName(name)) {\n throw new Error(\n `Environment ${name} is built in and cannot be overwritten.`,\n );\n }\n const baseUrl = normalizeBaseUrl(input.baseUrl);\n return {\n name,\n label: input.label?.trim() || name,\n description: input.description?.trim() || \"用户自定义环境。\",\n baseUrl,\n mcpBaseUrl: normalizeBaseUrl(input.mcpBaseUrl ?? baseUrl),\n source: \"custom\",\n };\n}\n\n/**\n * 保存用户自定义环境。\n *\n * @param config 当前配置\n * @param preset 自定义环境预设\n * @returns 合并后的配置\n */\nexport function upsertCustomEnvironment(\n config: LocalConfig,\n preset: EnvironmentPreset,\n): LocalConfig {\n if (preset.source !== \"custom\") {\n throw new Error(\"Only custom environments can be saved.\");\n }\n return {\n ...config,\n customEnvironments: {\n ...(config.customEnvironments ?? {}),\n [preset.name]: {\n label: preset.label,\n description: preset.description,\n baseUrl: preset.baseUrl,\n mcpBaseUrl: preset.mcpBaseUrl,\n },\n },\n };\n}\n\n/**\n * 删除用户自定义环境。\n *\n * @param config 当前配置\n * @param name 环境名\n * @returns 删除后的配置和是否删除成功\n */\nexport function removeCustomEnvironment(\n config: LocalConfig,\n name: string,\n): {\n config: LocalConfig;\n removed: boolean;\n} {\n const normalizedName = normalizeEnvironmentName(name);\n if (isBuiltinEnvironmentName(normalizedName)) {\n throw new Error(`Built-in environment ${normalizedName} cannot be removed.`);\n }\n const customEnvironments = {\n ...(config.customEnvironments ?? {}),\n };\n if (!customEnvironments[normalizedName]) {\n return {\n config,\n removed: false,\n };\n }\n delete customEnvironments[normalizedName];\n const nextConfig: LocalConfig = {\n ...config,\n customEnvironments,\n };\n if (nextConfig.environment === normalizedName) {\n return {\n config: applyEnvironmentPreset(nextConfig, getDefaultEnvironmentPreset()),\n removed: true,\n };\n }\n return {\n config: nextConfig,\n removed: true,\n };\n}\n\n/**\n * 规范化单个环境预设。\n *\n * @param name 环境名称\n * @param preset 原始预设\n * @returns 规范化后的预设\n */\nfunction normalizePreset(\n name: BuiltinEnvironmentName,\n preset: Omit<EnvironmentPreset, \"name\" | \"source\">,\n): EnvironmentPreset {\n return {\n name,\n label: preset.label,\n description: preset.description,\n baseUrl: normalizeBaseUrl(preset.baseUrl),\n mcpBaseUrl: normalizeBaseUrl(preset.mcpBaseUrl),\n source: \"builtin\",\n };\n}\n\n/**\n * 把字符串转换为内置环境名。\n *\n * @param name 规范化后的环境名\n * @returns 内置环境名;不是内置环境时返回 undefined\n */\nfunction toBuiltinEnvironmentName(\n name: string,\n): BuiltinEnvironmentName | undefined {\n return (BUILTIN_ENVIRONMENT_NAMES as string[]).includes(name)\n ? (name as BuiltinEnvironmentName)\n : undefined;\n}\n\n/**\n * 返回用户自定义环境列表。\n *\n * @param config 本地配置\n * @returns 自定义环境预设列表\n */\nfunction listCustomEnvironmentPresets(config: LocalConfig): EnvironmentPreset[] {\n return Object.entries(config.customEnvironments ?? {})\n .map(([name, preset]) => normalizeCustomEnvironmentPreset(name, preset))\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\n/**\n * 根据名称读取自定义环境。\n *\n * @param name 环境名\n * @param config 本地配置\n * @returns 自定义环境预设\n */\nfunction getCustomEnvironmentPreset(\n name: string,\n config?: LocalConfig,\n): EnvironmentPreset | undefined {\n const preset = config?.customEnvironments?.[name];\n if (!preset) {\n return undefined;\n }\n return normalizeCustomEnvironmentPreset(name, preset);\n}\n\n/**\n * 规范化用户自定义环境。\n *\n * @param name 环境名\n * @param preset 原始自定义环境\n * @returns 环境预设\n */\nfunction normalizeCustomEnvironmentPreset(\n name: string,\n preset: CustomEnvironmentConfig,\n): EnvironmentPreset {\n const normalizedName = normalizeEnvironmentName(name);\n const baseUrl = normalizeBaseUrl(preset.baseUrl);\n return {\n name: normalizedName,\n label: preset.label?.trim() || normalizedName,\n description: preset.description?.trim() || \"用户自定义环境。\",\n baseUrl,\n mcpBaseUrl: normalizeBaseUrl(preset.mcpBaseUrl ?? baseUrl),\n source: \"custom\",\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport axios, { AxiosError, type AxiosInstance, type AxiosResponse } from \"axios\";\n\nimport type {\n AgentToolInvokeRequest,\n AgentToolQuery,\n AgentToolUploadRequest,\n CliDeviceAuthCreateRequest,\n CliDeviceAuthCreateVO,\n CliSkillManifestVO,\n JwtTokenDTO,\n McpExchangeRequest,\n PasswordLoginRequest,\n ResultEnvelope,\n TokenUser,\n UserLoginVO,\n} from \"../types.js\";\nimport type { SessionRecord, SessionStore } from \"../session/store.js\";\nimport { ApiError, AuthError, PermissionError } from \"../util/errors.js\";\nimport { normalizeBaseUrl } from \"../util/base-url.js\";\n\nconst RESULT_CODE_SUCCESS = 200;\nconst RESULT_CODE_AUTH = 401;\nconst RESULT_CODE_PERMISSION = 403;\n\ninterface MultipartPart {\n name: string;\n data: Buffer | string;\n filename?: string;\n contentType?: string;\n}\n\ninterface MultipartRequestBody {\n body: Buffer;\n contentType: string;\n contentLength: number;\n}\n\n/**\n * Raw API 请求参数。\n */\nexport interface RawApiRequestOptions {\n method: string;\n path: string;\n query?: Record<string, unknown>;\n data?: unknown;\n contentType?: string;\n}\n\n/**\n * Raw API 响应。\n */\nexport interface RawApiResponse {\n status: number;\n headers: unknown;\n data: unknown;\n}\n\nfunction isResultEnvelope<T>(value: unknown): value is ResultEnvelope<T> {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const record = value as Record<string, unknown>;\n return (\n typeof record.success === \"boolean\" &&\n typeof record.code === \"number\" &&\n typeof record.msg === \"string\" &&\n \"data\" in record\n );\n}\n\n/**\n * 转义 multipart 头部中的字段名和文件名。\n *\n * @param value 原始字段值\n * @returns 可安全放入 Content-Disposition 的字段值\n */\nfunction escapeMultipartHeaderValue(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, \"%22\").replace(/[\\r\\n]/g, \"_\");\n}\n\n/**\n * 构造明确 Content-Type 和 boundary 的 multipart 请求体。\n *\n * @param parts multipart 表单字段列表\n * @returns 请求体、Content-Type 和长度\n */\nfunction buildMultipartRequestBody(parts: MultipartPart[]): MultipartRequestBody {\n const boundary = `----mt-os-cli-${randomUUID()}`;\n const chunks: Buffer[] = [];\n for (const part of parts) {\n const disposition = [\n `form-data; name=\"${escapeMultipartHeaderValue(part.name)}\"`,\n part.filename ? `filename=\"${escapeMultipartHeaderValue(part.filename)}\"` : undefined,\n ].filter(Boolean).join(\"; \");\n chunks.push(Buffer.from(`--${boundary}\\r\\n`, \"utf8\"));\n chunks.push(Buffer.from(`Content-Disposition: ${disposition}\\r\\n`, \"utf8\"));\n if (part.contentType) {\n chunks.push(Buffer.from(`Content-Type: ${part.contentType}\\r\\n`, \"utf8\"));\n }\n chunks.push(Buffer.from(\"\\r\\n\", \"utf8\"));\n chunks.push(Buffer.isBuffer(part.data) ? part.data : Buffer.from(part.data, \"utf8\"));\n chunks.push(Buffer.from(\"\\r\\n\", \"utf8\"));\n }\n chunks.push(Buffer.from(`--${boundary}--\\r\\n`, \"utf8\"));\n const body = Buffer.concat(chunks);\n return {\n body,\n contentType: `multipart/form-data; boundary=${boundary}`,\n contentLength: body.length,\n };\n}\n\nexport class MtOsApiClient {\n private readonly http: AxiosInstance;\n private readonly sessionStore: SessionStore;\n private readonly timeoutMs: number;\n private readonly deviceType: string;\n\n constructor(options: {\n sessionStore: SessionStore;\n timeoutMs?: number;\n baseUrl?: string;\n deviceType?: string;\n http?: AxiosInstance;\n }) {\n this.sessionStore = options.sessionStore;\n this.timeoutMs = options.timeoutMs ?? 15_000;\n this.deviceType = options.deviceType ?? \"mt-os-cli\";\n this.http =\n options.http ??\n axios.create({\n timeout: this.timeoutMs,\n validateStatus: () => true,\n });\n }\n\n async exchangeCode(\n baseUrl: string,\n payload: McpExchangeRequest,\n ): Promise<JwtTokenDTO> {\n return this.postEnvelope<JwtTokenDTO>(\n baseUrl,\n \"/user/api/v1/mcp-auth/exchange\",\n payload,\n {\n session: null,\n },\n );\n }\n\n /**\n * 创建 CLI 设备授权会话。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param payload 创建请求\n * @returns 设备授权码、短码和授权页地址\n */\n async createCliDeviceAuth(\n baseUrl: string,\n payload: CliDeviceAuthCreateRequest,\n ): Promise<CliDeviceAuthCreateVO> {\n return this.postEnvelope<CliDeviceAuthCreateVO>(\n baseUrl,\n \"/user/api/v1/cli-device-auth/create\",\n payload,\n {\n session: null,\n },\n );\n }\n\n /**\n * 轮询 CLI 设备授权结果。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param deviceCode 设备授权码\n * @returns 登录成功结果\n */\n async pollCliDeviceAuth(\n baseUrl: string,\n deviceCode: string,\n ): Promise<UserLoginVO> {\n return this.postEnvelope<UserLoginVO>(\n baseUrl,\n `/user/api/v1/cli-device-auth/poll/${encodeURIComponent(deviceCode)}`,\n {},\n {\n session: null,\n },\n );\n }\n\n /**\n * 使用 Law 用户中心账号密码登录。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param payload 账号密码登录请求\n * @returns 登录成功返回\n */\n async loginWithPassword(\n baseUrl: string,\n payload: PasswordLoginRequest,\n ): Promise<UserLoginVO> {\n return this.postEnvelope<UserLoginVO>(\n baseUrl,\n \"/user/api/v1/login/password\",\n payload,\n {\n session: null,\n },\n );\n }\n\n async checkToken(baseUrl: string, token: string): Promise<TokenUser> {\n const response = await this.postEnvelope<TokenUser>(\n baseUrl,\n \"/user/api/v1/token/check\",\n token,\n {\n contentType: \"text/plain;charset=UTF-8\",\n token,\n allowRefresh: true,\n },\n );\n return response;\n }\n\n async refreshSession(session?: SessionRecord): Promise<SessionRecord> {\n const current = session ?? (await this.sessionStore.getSession());\n if (!current) {\n throw new Error('No local session found. Run \"mt-os-cli auth login\" first.');\n }\n const nextTokens = await this.postEnvelope<JwtTokenDTO>(\n current.baseUrl,\n \"/user/api/v1/token/refresh\",\n current.refreshToken,\n {\n contentType: \"text/plain;charset=UTF-8\",\n session: current,\n },\n );\n const nextSession: SessionRecord = {\n ...current,\n token: nextTokens.token,\n refreshToken: nextTokens.refreshToken ?? current.refreshToken,\n updatedAt: new Date().toISOString(),\n };\n if (nextTokens.tokenExpireTime !== undefined) {\n nextSession.tokenExpireTime = nextTokens.tokenExpireTime;\n }\n if (nextTokens.refreshTokenExpireTime !== undefined) {\n nextSession.refreshTokenExpireTime = nextTokens.refreshTokenExpireTime;\n }\n await this.sessionStore.saveSession(nextSession);\n return nextSession;\n }\n\n /**\n * 查询当前用户可见工具。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param query Tool 查询过滤条件\n * @returns Tool 定义列表\n */\n async listTools(baseUrl: string, query?: AgentToolQuery): Promise<unknown[]> {\n const requestOptions: {\n allowRefresh: boolean;\n query?: Record<string, unknown>;\n } = {\n allowRefresh: true,\n };\n if (query !== undefined) {\n requestOptions.query = query as Record<string, unknown>;\n }\n const response = await this.getEnvelope<unknown[]>(\n baseUrl,\n \"/law/api/v1/cli/tools\",\n requestOptions,\n );\n return response;\n }\n\n /**\n * 查询单个工具定义。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param toolName Tool 技术名称\n * @returns Tool 定义\n */\n async getTool(baseUrl: string, toolName: string): Promise<unknown> {\n return this.getEnvelope<unknown>(\n baseUrl,\n `/law/api/v1/cli/tools/${encodeURIComponent(toolName)}`,\n { allowRefresh: true },\n );\n }\n\n /**\n * 调用工具。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param toolName Tool 技术名称\n * @param payload Tool 调用请求\n * @returns Tool 调用结果\n */\n async invokeTool(\n baseUrl: string,\n toolName: string,\n payload: AgentToolInvokeRequest,\n ): Promise<unknown> {\n return this.postEnvelope<unknown>(\n baseUrl,\n `/law/api/v1/cli/tools/${encodeURIComponent(toolName)}/invoke`,\n payload,\n { allowRefresh: true },\n );\n }\n\n /**\n * 上传本地文件并调用文件上传 Tool。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param toolName 文件上传 Tool 技术名称\n * @param filePath 本地文件路径\n * @param payload 上传运行时参数\n * @returns Tool 调用结果\n */\n async uploadToolFile(\n baseUrl: string,\n toolName: string,\n filePath: string,\n payload: AgentToolUploadRequest = {},\n ): Promise<unknown> {\n const fileStat = await fs.stat(filePath);\n if (!fileStat.isFile()) {\n throw new Error(`Not a file: ${filePath}`);\n }\n const fileName = path.basename(filePath);\n const fileContent = await fs.readFile(filePath);\n const buildMultipartData = (): MultipartRequestBody => {\n const parts: MultipartPart[] = [\n {\n name: \"file\",\n data: fileContent,\n filename: fileName,\n contentType: \"application/octet-stream\",\n },\n ];\n if (payload.runtime !== undefined) {\n parts.push({\n name: \"runtime\",\n data: JSON.stringify(payload.runtime),\n });\n }\n if (payload.confirm !== undefined) {\n parts.push({\n name: \"confirm\",\n data: String(payload.confirm),\n });\n }\n return buildMultipartRequestBody(parts);\n };\n return this.postMultipartEnvelope<unknown>(\n baseUrl,\n `/law/api/v1/cli/tools/${encodeURIComponent(toolName)}/upload`,\n buildMultipartData,\n { allowRefresh: true },\n );\n }\n\n /**\n * 查询服务端提供的 CLI skill 清单。\n *\n * @param baseUrl MTOS 服务基础地址\n * @returns CLI skill 清单\n */\n async getCliSkillManifest(baseUrl: string): Promise<CliSkillManifestVO> {\n return this.getEnvelope<CliSkillManifestVO>(\n baseUrl,\n \"/agent/api/v1/cli/skills\",\n {\n session: null,\n },\n );\n }\n\n /**\n * 发起受控的原始 API 请求。\n *\n * <p>该方法用于 CLI 排障入口,保留 HTTP 状态码和原始响应体;如果服务端通过\n * HTTP 401 或统一返回体 401 表示 token 失效,则沿用普通 Tool 调用的 refresh\n * 逻辑自动刷新一次后重试。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param request Raw API 请求参数\n * @returns HTTP 状态码、响应头和原始响应体\n */\n async rawRequest(\n baseUrl: string,\n request: RawApiRequestOptions,\n ): Promise<RawApiResponse> {\n return this.rawRequestWithSession(baseUrl, request, {\n allowRefresh: true,\n });\n }\n\n private async postEnvelope<T>(\n baseUrl: string,\n url: string,\n data: unknown,\n options?: {\n contentType?: string;\n token?: string;\n session?: SessionRecord | null;\n allowRefresh?: boolean;\n },\n ): Promise<T> {\n const session =\n options?.session !== undefined\n ? options.session\n : await this.sessionStore.getSession();\n const token = options?.token ?? session?.token;\n const allowRefresh = options?.allowRefresh ?? false;\n const response = await this.requestEnvelope({\n method: \"POST\",\n baseUrl,\n url,\n data,\n headers: {\n \"Content-Type\": options?.contentType ?? \"application/json\",\n ...(token ? { token } : {}),\n deviceType: session?.deviceType ?? this.deviceType,\n },\n });\n\n if (isResultEnvelope<T>(response.data)) {\n const result = response.data;\n if (result.success && result.code === RESULT_CODE_SUCCESS) {\n return result.data;\n }\n if (result.code === RESULT_CODE_AUTH && allowRefresh) {\n if (!session) {\n throw new AuthError(result.msg, result.code, response.status);\n }\n const nextSession = await this.refreshSession(session);\n return this.postEnvelope<T>(baseUrl, url, data, {\n ...options,\n session: nextSession,\n token: nextSession.token,\n allowRefresh: false,\n });\n }\n if (result.code === RESULT_CODE_AUTH) {\n throw new AuthError(result.msg, result.code, response.status);\n }\n if (result.code === RESULT_CODE_PERMISSION) {\n throw new PermissionError(result.msg, result.code, response.status);\n }\n throw new ApiError(result.msg, result.code, response.status);\n }\n\n if (response.status === RESULT_CODE_AUTH && allowRefresh) {\n if (!session) {\n throw new AuthError(\n \"Token invalid or expired.\",\n undefined,\n response.status,\n );\n }\n const nextSession = await this.refreshSession(session);\n return this.postEnvelope<T>(baseUrl, url, data, {\n ...options,\n session: nextSession,\n token: nextSession.token,\n allowRefresh: false,\n });\n }\n if (response.status === RESULT_CODE_AUTH) {\n throw new AuthError(\n \"Token invalid or expired.\",\n undefined,\n response.status,\n );\n }\n if (response.status === RESULT_CODE_PERMISSION) {\n throw new PermissionError(\n \"Permission denied.\",\n undefined,\n response.status,\n );\n }\n if (response.status >= 200 && response.status < 300) {\n return response.data as T;\n }\n throw new ApiError(\n `Unexpected response status: ${response.status}`,\n undefined,\n response.status,\n );\n }\n\n /**\n * 执行统一返回体请求,并把网络层错误转换成带上下文的 API 异常。\n *\n * <p>Axios 在连接被拒绝、DNS 失败、TLS 失败等场景下可能只有 code 而没有 message,\n * 如果直接把原始异常抛给 CLI,用户只会看到空字符串。这里统一补充 method、baseUrl\n * 和 path,方便判断是不是环境没切对或本地服务没启动。\n *\n * @param request 请求参数\n * @returns Axios 响应\n */\n private async requestEnvelope(request: {\n method: \"POST\";\n baseUrl: string;\n url: string;\n data: unknown;\n headers: Record<string, string>;\n maxBodyLength?: number;\n maxContentLength?: number;\n }): Promise<AxiosResponse> {\n try {\n const requestConfig = {\n method: request.method,\n baseURL: normalizeBaseUrl(request.baseUrl),\n url: request.url,\n data: request.data,\n headers: request.headers,\n ...(request.maxBodyLength !== undefined\n ? { maxBodyLength: request.maxBodyLength }\n : {}),\n ...(request.maxContentLength !== undefined\n ? { maxContentLength: request.maxContentLength }\n : {}),\n };\n return await this.http.request(requestConfig);\n } catch (error) {\n if (error instanceof AxiosError) {\n const message = [\n error.message || error.code || \"HTTP request failed\",\n `${request.method} ${normalizeBaseUrl(request.baseUrl)}${request.url}`,\n ].join(\" - \");\n throw new ApiError(message, undefined, error.response?.status);\n }\n throw error;\n }\n }\n\n /**\n * 发起 multipart POST 请求并按统一返回体解析。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param url 请求路径\n * @param buildData multipart 请求体构造函数;重试时会重新构造,避免复用已消费的请求体\n * @param options 请求选项\n * @returns 统一返回体中的业务数据\n */\n private async postMultipartEnvelope<T>(\n baseUrl: string,\n url: string,\n buildData: () => MultipartRequestBody,\n options?: {\n token?: string;\n session?: SessionRecord | null;\n allowRefresh?: boolean;\n },\n ): Promise<T> {\n const session =\n options?.session !== undefined\n ? options.session\n : await this.sessionStore.getSession();\n const token = options?.token ?? session?.token;\n const allowRefresh = options?.allowRefresh ?? false;\n const multipartData = buildData();\n const response = await this.requestEnvelope({\n method: \"POST\",\n baseUrl,\n url,\n data: multipartData.body,\n maxBodyLength: Infinity,\n maxContentLength: Infinity,\n headers: {\n ...(token ? { token } : {}),\n deviceType: session?.deviceType ?? this.deviceType,\n \"Content-Type\": multipartData.contentType,\n \"Content-Length\": String(multipartData.contentLength),\n },\n });\n\n if (isResultEnvelope<T>(response.data)) {\n const result = response.data;\n if (result.success && result.code === RESULT_CODE_SUCCESS) {\n return result.data;\n }\n if (result.code === RESULT_CODE_AUTH && allowRefresh) {\n if (!session) {\n throw new AuthError(result.msg, result.code, response.status);\n }\n const nextSession = await this.refreshSession(session);\n return this.postMultipartEnvelope<T>(baseUrl, url, buildData, {\n ...options,\n session: nextSession,\n token: nextSession.token,\n allowRefresh: false,\n });\n }\n if (result.code === RESULT_CODE_AUTH) {\n throw new AuthError(result.msg, result.code, response.status);\n }\n if (result.code === RESULT_CODE_PERMISSION) {\n throw new PermissionError(result.msg, result.code, response.status);\n }\n throw new ApiError(result.msg, result.code, response.status);\n }\n\n if (response.status === RESULT_CODE_AUTH && allowRefresh) {\n if (!session) {\n throw new AuthError(\n \"Token invalid or expired.\",\n undefined,\n response.status,\n );\n }\n const nextSession = await this.refreshSession(session);\n return this.postMultipartEnvelope<T>(baseUrl, url, buildData, {\n ...options,\n session: nextSession,\n token: nextSession.token,\n allowRefresh: false,\n });\n }\n if (response.status === RESULT_CODE_AUTH) {\n throw new AuthError(\n \"Token invalid or expired.\",\n undefined,\n response.status,\n );\n }\n if (response.status === RESULT_CODE_PERMISSION) {\n throw new PermissionError(\n \"Permission denied.\",\n undefined,\n response.status,\n );\n }\n if (response.status >= 200 && response.status < 300) {\n return response.data as T;\n }\n throw new ApiError(\n `Unexpected response status: ${response.status}`,\n undefined,\n response.status,\n );\n }\n\n /**\n * 发起 GET 请求并按统一返回体解析。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param url 请求路径\n * @param options 请求选项\n * @returns 统一返回体中的业务数据\n */\n private async getEnvelope<T>(\n baseUrl: string,\n url: string,\n options?: {\n token?: string;\n session?: SessionRecord | null;\n allowRefresh?: boolean;\n query?: Record<string, unknown>;\n },\n ): Promise<T> {\n const session =\n options?.session !== undefined\n ? options.session\n : await this.sessionStore.getSession();\n const token = options?.token ?? session?.token;\n const allowRefresh = options?.allowRefresh ?? false;\n const response = await this.http.request({\n method: \"GET\",\n baseURL: normalizeBaseUrl(baseUrl),\n url,\n params: options?.query,\n headers: {\n ...(token ? { token } : {}),\n deviceType: session?.deviceType ?? this.deviceType,\n },\n });\n if (isResultEnvelope<T>(response.data)) {\n const result = response.data;\n if (result.success && result.code === RESULT_CODE_SUCCESS) {\n return result.data;\n }\n if (result.code === RESULT_CODE_AUTH && allowRefresh) {\n if (!session) {\n throw new AuthError(result.msg, result.code, response.status);\n }\n const nextSession = await this.refreshSession(session);\n return this.getEnvelope<T>(baseUrl, url, {\n ...options,\n session: nextSession,\n token: nextSession.token,\n allowRefresh: false,\n });\n }\n if (result.code === RESULT_CODE_AUTH) {\n throw new AuthError(result.msg, result.code, response.status);\n }\n if (result.code === RESULT_CODE_PERMISSION) {\n throw new PermissionError(result.msg, result.code, response.status);\n }\n throw new ApiError(result.msg, result.code, response.status);\n }\n if (response.status >= 200 && response.status < 300) {\n return response.data as T;\n }\n throw new ApiError(`Unexpected response status: ${response.status}`, undefined, response.status);\n }\n\n /**\n * 带会话和 refresh 的 Raw API 请求实现。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param request Raw API 请求参数\n * @param options 会话选项\n * @returns Raw API 响应\n */\n private async rawRequestWithSession(\n baseUrl: string,\n request: RawApiRequestOptions,\n options?: {\n token?: string;\n session?: SessionRecord | null;\n allowRefresh?: boolean;\n },\n ): Promise<RawApiResponse> {\n const session =\n options?.session !== undefined\n ? options.session\n : await this.sessionStore.getSession();\n const token = options?.token ?? session?.token;\n const allowRefresh = options?.allowRefresh ?? false;\n const response = await this.http.request({\n method: request.method,\n baseURL: normalizeBaseUrl(baseUrl),\n url: request.path,\n params: request.query,\n data: request.data,\n headers: {\n ...(token ? { token } : {}),\n deviceType: session?.deviceType ?? this.deviceType,\n ...(request.data !== undefined\n ? { \"Content-Type\": request.contentType ?? \"application/json\" }\n : {}),\n },\n });\n\n if (shouldRefreshRawResponse(response) && allowRefresh) {\n if (!session) {\n throw new AuthError(\n \"Token invalid or expired.\",\n undefined,\n response.status,\n );\n }\n const nextSession = await this.refreshSession(session);\n return this.rawRequestWithSession(baseUrl, request, {\n ...options,\n session: nextSession,\n token: nextSession.token,\n allowRefresh: false,\n });\n }\n\n return {\n status: response.status,\n headers: response.headers,\n data: response.data,\n };\n }\n}\n\n/**\n * 判断 Raw API 响应是否需要刷新 token。\n *\n * @param response Axios 响应\n * @returns 是否需要 refresh 后重试\n */\nfunction shouldRefreshRawResponse(response: AxiosResponse<unknown>): boolean {\n if (response.status === RESULT_CODE_AUTH) {\n return true;\n }\n if (isResultEnvelope<unknown>(response.data)) {\n return response.data.code === RESULT_CODE_AUTH;\n }\n return false;\n}\n","import { createRequire } from \"node:module\";\n\nimport {\n applyEnvironmentPreset,\n getDefaultEnvironmentPreset,\n getEnvironmentPresetOrThrow,\n} from \"../config/environments.js\";\nimport { MtOsApiClient } from \"../http/api-client.js\";\nimport {\n parseOutputFormat,\n type OutputFormat,\n} from \"../output/cli-output.js\";\nimport { SessionStore } from \"../session/store.js\";\nimport { normalizeBaseUrl } from \"../util/base-url.js\";\n\nconst require = createRequire(import.meta.url);\n\n/**\n * 读取包信息。\n *\n * <p>源码运行时当前文件位于 `src/cli`,需要向上两级;tsup 打包后所有代码位于\n * `dist/index.js`,只需要向上一级。这里显式兼容两种执行形态,避免全局安装后的\n * `mt-os-cli --help` 在加载阶段就失败。\n *\n * @returns package.json 中的包名和版本\n */\nfunction loadPackageJson(): {\n name?: string;\n version?: string;\n} {\n for (const candidate of [\"../../package.json\", \"../package.json\"]) {\n try {\n return require(candidate) as {\n name?: string;\n version?: string;\n };\n } catch (error) {\n const code = error instanceof Error && \"code\" in error\n ? (error as NodeJS.ErrnoException).code\n : undefined;\n if (code !== \"MODULE_NOT_FOUND\") {\n throw error;\n }\n }\n }\n return {};\n}\n\nconst packageJson = loadPackageJson();\n\n/**\n * CLI 包名。\n */\nexport const CLI_NAME = packageJson.name ?? \"@meritsandtree/mt-os-cli\";\n\n/**\n * CLI 版本号。\n */\nexport const CLI_VERSION = packageJson.version ?? \"0.0.0\";\n\n/**\n * 公司官网。\n */\nexport const COMPANY_WEBSITE = \"https://www.meritsandtree.com\";\n\n/**\n * 版权声明。\n */\nexport const COMPANY_COPYRIGHT = \"Copyright (c) Merits & Tree. All rights reserved.\";\n\nconst SECTION_DIVIDER = \"=\".repeat(20);\n\n/**\n * 通用格式化输出参数。\n */\nexport interface FormattedOutputOptions {\n format?: string;\n jq?: string;\n}\n\n/**\n * HTTP API 目标环境参数。\n */\nexport interface ApiTargetOptions {\n env?: string;\n environment?: string;\n baseUrl?: string;\n}\n\n/**\n * 分页命令参数。\n */\nexport interface PaginationOptions {\n pageNo?: number;\n pageSize?: number;\n pageAll?: boolean;\n pageLimit?: number;\n pageDelayMs?: number;\n}\n\n/**\n * Tool 命令参数。\n */\nexport interface ToolCommandOptions extends FormattedOutputOptions, PaginationOptions, ApiTargetOptions {\n domain?: string;\n subjectType?: string;\n keyword?: string;\n argsJson?: string;\n runtimeJson?: string;\n toolName?: string;\n confirm?: boolean;\n dryRun?: boolean;\n}\n\n/**\n * 登录命令参数。\n */\nexport interface LoginCommandOptions {\n env?: string;\n environment?: string;\n baseUrl?: string;\n mcpBaseUrl?: string;\n timeoutMs?: number;\n debug?: boolean;\n json?: boolean;\n noWait?: boolean;\n deviceCode?: string;\n username?: string;\n password?: string;\n terminalType?: string;\n}\n\n/**\n * 命令注册上下文。\n */\nexport interface CommandContext {\n sessionStore: SessionStore;\n}\n\n/**\n * 解析数字命令行参数。\n *\n * @param value 原始字符串\n * @returns 数字\n */\nexport function parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid number: ${value}`);\n }\n return parsed;\n}\n\n/**\n * 解析命令行传入的 JSON 对象参数。\n *\n * @param value 原始 JSON 字符串\n * @returns 解析后的对象\n */\nexport function parseJsonObject(value: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(value);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"JSON must be an object.\");\n }\n return parsed as Record<string, unknown>;\n}\n\n/**\n * 解析输出选项。\n *\n * @param options 原始输出选项\n * @returns 标准输出选项\n */\nexport function resolveOutputOptions(options: FormattedOutputOptions): {\n format: OutputFormat;\n jq?: string;\n} {\n const format = parseOutputFormat(options.format);\n return {\n format,\n ...(options.jq ? { jq: options.jq } : {}),\n };\n}\n\n/**\n * 转换布尔安装状态。\n *\n * @param value 是否安装\n * @returns 状态文本\n */\nexport function formatBoolean(value: boolean): string {\n return value ? \"installed\" : \"missing\";\n}\n\n/**\n * 命令行是否支持颜色。\n *\n * @returns 是否支持颜色\n */\nexport function supportsColor(): boolean {\n return Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;\n}\n\n/**\n * 给文本增加终端颜色。\n *\n * @param text 文本\n * @param code ANSI 颜色码\n * @returns 渲染文本\n */\nexport function colorize(text: string, code: string): string {\n if (!supportsColor()) {\n return text;\n }\n return `\\u001B[${code}m${text}\\u001B[0m`;\n}\n\n/**\n * 输出 CLI 头部。\n */\nexport function printCliHeader(): void {\n const readyBadge = colorize(\" READY \", \"1;30;42\");\n const name = colorize(\"MTOS CLI\", \"1;96\");\n const version = colorize(`v${CLI_VERSION}`, \"1;95\");\n const websiteLabel = colorize(\"Merits & Tree\", \"1;94\");\n const website = colorize(COMPANY_WEBSITE, \"4;36\");\n const divider = colorize(\"|\", \"90\");\n console.log(\n `${readyBadge} ${name} ${version} ${divider} ${websiteLabel} ${website}`,\n );\n console.log(colorize(COMPANY_COPYRIGHT, \"90\"));\n}\n\n/**\n * 输出分组标题。\n *\n * @param title 标题\n * @param colorCode 颜色码\n */\nexport function printSection(title: string, colorCode = \"1;36\"): void {\n console.log(\n colorize(`${SECTION_DIVIDER} ${title} ${SECTION_DIVIDER}`, colorCode),\n );\n}\n\n/**\n * 输出键值字段。\n *\n * @param label 字段名\n * @param value 字段值\n */\nexport function printField(label: string, value: string): void {\n const coloredLabel = colorize(label, \"1;33\");\n console.log(`${coloredLabel}: ${value}`);\n}\n\n/**\n * 格式化安装状态。\n *\n * @param value 是否安装\n * @returns 状态文本\n */\nexport function formatStatus(value: boolean): string {\n return value ? colorize(\"installed\", \"1;32\") : colorize(\"missing\", \"1;31\");\n}\n\n/**\n * 解析可配置 URL。\n *\n * @param value 命令行显式值\n * @param envVarName 环境变量名\n * @param fallback 兜底值\n * @returns URL\n */\nexport function resolveConfiguredUrl(\n value: string | undefined,\n envVarName: string,\n fallback?: string,\n): string | undefined {\n const rawValue = value ?? process.env[envVarName] ?? fallback;\n if (!rawValue) {\n return undefined;\n }\n return normalizeBaseUrl(rawValue);\n}\n\n/**\n * 解析并保存当前命令配置。\n *\n * @param sessionStore 本地会话存储\n * @param options 命令配置覆盖项\n * @returns 解析后的配置和 URL\n */\nexport async function resolveCommandConfig(\n sessionStore: SessionStore,\n options?: {\n env?: string;\n environment?: string;\n baseUrl?: string;\n mcpBaseUrl?: string;\n },\n): Promise<{\n config: Awaited<ReturnType<SessionStore[\"getConfig\"]>>;\n baseUrl: string | undefined;\n mcpBaseUrl: string | undefined;\n}> {\n const currentConfig = await sessionStore.getConfig();\n const resolvedEnvironmentName =\n options?.environment ??\n options?.env ??\n currentConfig.environment ??\n getDefaultEnvironmentPreset().name;\n const preset = getEnvironmentPresetOrThrow(\n resolvedEnvironmentName,\n currentConfig,\n );\n const configWithPreset = applyEnvironmentPreset(currentConfig, preset);\n const baseUrl = resolveConfiguredUrl(\n options?.baseUrl,\n \"MT_OS_BASE_URL\",\n configWithPreset.baseUrl,\n );\n const mcpBaseUrl = resolveConfiguredUrl(\n options?.mcpBaseUrl,\n \"MT_OS_MCP_BASE_URL\",\n configWithPreset.mcpBaseUrl ?? baseUrl,\n );\n\n const nextConfig = {\n ...configWithPreset,\n ...(baseUrl ? { baseUrl } : {}),\n ...(mcpBaseUrl ? { mcpBaseUrl } : {}),\n };\n const shouldSave =\n nextConfig.environment !== currentConfig.environment ||\n nextConfig.baseUrl !== currentConfig.baseUrl ||\n nextConfig.mcpBaseUrl !== currentConfig.mcpBaseUrl;\n if (shouldSave) {\n await sessionStore.saveConfig(nextConfig);\n }\n return {\n config: nextConfig,\n baseUrl,\n mcpBaseUrl,\n };\n}\n\n/**\n * 解析需要访问 MTOS HTTP API 的命令上下文。\n *\n * @param sessionStore 本地会话存储\n * @param options 当前命令传入的环境覆盖参数\n * @returns API 基础地址和客户端\n */\nexport async function resolveApiCommandContext(\n sessionStore: SessionStore,\n options?: ApiTargetOptions,\n): Promise<{\n baseUrl: string;\n client: MtOsApiClient;\n}> {\n const resolved = await resolveCommandConfig(sessionStore, options);\n const config = resolved.config;\n const session = await sessionStore.getSession();\n const hasExplicitBaseUrlOverride = Boolean(\n options?.baseUrl ??\n options?.env ??\n options?.environment ??\n process.env.MT_OS_BASE_URL,\n );\n const baseUrl =\n hasExplicitBaseUrlOverride\n ? (resolved.baseUrl ?? config.baseUrl ?? getDefaultEnvironmentPreset().baseUrl)\n : (session?.baseUrl ?? config.baseUrl ?? getDefaultEnvironmentPreset().baseUrl);\n return {\n baseUrl,\n client: new MtOsApiClient({\n sessionStore,\n ...(config.timeoutMs !== undefined\n ? { timeoutMs: config.timeoutMs }\n : {}),\n }),\n };\n}\n","import { Command } from \"commander\";\n\nimport {\n CliExitError,\n ConfirmationRequiredError,\n writeData,\n} from \"../output/cli-output.js\";\nimport {\n parseJsonObject,\n resolveApiCommandContext,\n resolveOutputOptions,\n type ApiTargetOptions,\n type CommandContext,\n type FormattedOutputOptions,\n} from \"../cli/context.js\";\n\n/**\n * Raw API 命令参数。\n */\ninterface ApiCommandOptions extends FormattedOutputOptions, ApiTargetOptions {\n queryJson?: string;\n dataJson?: string;\n contentType?: string;\n confirm?: boolean;\n}\n\nconst ALLOWED_METHODS = new Set([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"]);\nconst READ_METHODS = new Set([\"GET\"]);\nconst ALLOWED_PATH_PREFIXES = [\n \"/law/api/v1/cli/tools\",\n \"/agent/api/v1/cli/skills\",\n \"/user/api/v1/token/check\",\n \"/user/api/v1/token/refresh\",\n \"/user/api/v1/cli-device-auth\",\n];\n\n/**\n * 注册受控 Raw API 命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerApiCommand(\n program: Command,\n context: CommandContext,\n): void {\n program\n .command(\"api\")\n .description(\"Call a whitelisted MTOS API path for debugging\")\n .argument(\"<method>\", \"HTTP method: GET, POST, PUT, PATCH, DELETE\")\n .argument(\"<path>\", \"MTOS API path, for example /law/api/v1/cli/tools\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--query-json <json>\", \"Query string parameters as JSON object\")\n .option(\"--data-json <json>\", \"Request body as JSON\")\n .option(\"--content-type <type>\", \"Request content type\")\n .option(\"--confirm\", \"Confirm non-GET raw API requests\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (method: string, path: string, options: ApiCommandOptions) => {\n await runApiCommand(context, method, path, options);\n });\n}\n\n/**\n * 执行 Raw API 调试请求。\n *\n * @param context 命令上下文\n * @param method 原始 HTTP 方法\n * @param path 原始 API path\n * @param options 命令参数\n */\nasync function runApiCommand(\n context: CommandContext,\n method: string,\n path: string,\n options: ApiCommandOptions,\n): Promise<void> {\n const normalizedMethod = method.trim().toUpperCase();\n const normalizedPath = normalizeApiPath(path);\n assertAllowedMethod(normalizedMethod);\n assertAllowedPath(normalizedPath);\n if (!READ_METHODS.has(normalizedMethod) && !options.confirm) {\n throw new ConfirmationRequiredError(\n `mt-os-cli api ${normalizedMethod} ${normalizedPath}`,\n \"add --confirm to run non-GET raw API requests\",\n );\n }\n\n const { baseUrl, client } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n const response = await client.rawRequest(baseUrl, {\n method: normalizedMethod,\n path: normalizedPath,\n ...(options.queryJson\n ? { query: parseJsonObject(options.queryJson) }\n : {}),\n ...(options.dataJson ? { data: parseJsonValue(options.dataJson) } : {}),\n ...(options.contentType ? { contentType: options.contentType } : {}),\n });\n writeData(response, resolveOutputOptions(options));\n}\n\n/**\n * 校验并标准化 API path。\n *\n * @param value 原始 path\n * @returns 标准 path\n */\nfunction normalizeApiPath(value: string): string {\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"/\")) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"API path must start with /.\",\n hint: \"Use: mt-os-cli api GET /law/api/v1/cli/tools\",\n });\n }\n if (trimmed.includes(\"://\")) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"API path must be relative, not a full URL.\",\n hint: \"Use --base-url through auth/env config instead of raw full URLs.\",\n });\n }\n return trimmed;\n}\n\n/**\n * 校验 HTTP 方法。\n *\n * @param method 标准大写方法\n */\nfunction assertAllowedMethod(method: string): void {\n if (!ALLOWED_METHODS.has(method)) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: `Unsupported API method: ${method}`,\n hint: `Supported methods: ${Array.from(ALLOWED_METHODS).join(\", \")}`,\n });\n }\n}\n\n/**\n * 校验 Raw API 白名单前缀。\n *\n * @param path API path\n */\nfunction assertAllowedPath(path: string): void {\n if (ALLOWED_PATH_PREFIXES.some((prefix) => path.startsWith(prefix))) {\n return;\n }\n throw new CliExitError(2, {\n type: \"validation\",\n message: `API path is not whitelisted: ${path}`,\n hint: `Allowed prefixes: ${ALLOWED_PATH_PREFIXES.join(\", \")}`,\n });\n}\n\n/**\n * 解析任意 JSON 值。\n *\n * @param value JSON 字符串\n * @returns JSON 值\n */\nfunction parseJsonValue(value: string): unknown {\n return JSON.parse(value) as unknown;\n}\n","import os from \"node:os\";\nimport { createRequire } from \"node:module\";\n\nimport open from \"open\";\n\nimport { MtOsApiClient } from \"../http/api-client.js\";\nimport type { SessionRecord, SessionStore } from \"../session/store.js\";\nimport type { CliDeviceAuthCreateVO, UserLoginVO } from \"../types.js\";\nimport { normalizeBaseUrl } from \"../util/base-url.js\";\nimport { ApiError } from \"../util/errors.js\";\n\nexport interface LoginOptions {\n baseUrl?: string;\n callbackPort?: number;\n timeoutMs?: number;\n debug?: boolean;\n apiClient?: MtOsApiClient;\n openBrowser?: (url: string) => Promise<void> | void;\n onProgress?: (message: string) => void;\n}\n\n/**\n * CLI 设备授权发起结果。\n */\nexport interface LoginDeviceAuthorizationResult {\n baseUrl: string;\n timeoutMs: number;\n auth: CliDeviceAuthCreateVO;\n}\n\nconst CLIENT_NAME = \"mt-os-cli\";\nconst DEVICE_TYPE_AI = \"ai\";\nconst DEFAULT_LOGIN_TIMEOUT_MS = 300_000;\nconst DEFAULT_POLL_INTERVAL_MS = 2_000;\nconst PENDING_AUTHORIZATION_MESSAGE_PREFIX = \"授权尚未确认\";\nconst require = createRequire(import.meta.url);\n\ninterface QrCodeTerminal {\n generate: (\n value: string,\n options: {\n small?: boolean;\n },\n callback: (qrcode: string) => void,\n ) => void;\n}\n\nconst qrCodeTerminal = require(\"qrcode-terminal\") as QrCodeTerminal;\n\nfunction emitProgress(\n reporter: ((message: string) => void) | undefined,\n message: string,\n): void {\n if (!reporter) {\n return;\n }\n const timestamp = new Date().toLocaleTimeString(\"zh-CN\", {\n hour12: false,\n });\n reporter(`[${timestamp}] ${message}`);\n}\n\n/**\n * 输出不带时间戳的进度内容。\n *\n * @param reporter 进度输出函数\n * @param message 原始输出内容\n */\nfunction emitRawProgress(\n reporter: ((message: string) => void) | undefined,\n message: string,\n): void {\n if (!reporter) {\n return;\n }\n reporter(message);\n}\n\n/**\n * 暂停指定毫秒数。\n *\n * @param ms 等待时长\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * 判断轮询结果是否仍处于等待确认状态。\n *\n * @param error 请求错误\n * @returns 是否为待确认错误\n */\nfunction isPendingAuthorization(error: unknown): boolean {\n return (\n error instanceof ApiError &&\n error.message.startsWith(PENDING_AUTHORIZATION_MESSAGE_PREFIX)\n );\n}\n\n/**\n * 构建设备授权页展示用设备名称。\n *\n * @returns 当前设备名称\n */\nfunction buildDeviceName(): string {\n return `${os.hostname()} (${process.platform} ${process.arch})`;\n}\n\n/**\n * 构建终端可显示的二维码文本。\n *\n * @param value 需要写入二维码的内容\n * @returns 可打印二维码;生成失败时返回空字符串\n */\nfunction buildTerminalQrCode(value: string): string {\n let rendered = \"\";\n qrCodeTerminal.generate(value, { small: true }, (qrcode) => {\n rendered = qrcode;\n });\n return rendered;\n}\n\n/**\n * 输出设备授权提示。\n *\n * @param auth 创建授权结果\n * @param reporter 进度输出函数\n */\nfunction emitDeviceAuthorizationPrompt(\n auth: CliDeviceAuthCreateVO,\n reporter: ((message: string) => void) | undefined,\n): void {\n emitProgress(\n reporter,\n `login: user code ${auth.userCode ?? \"(not provided)\"}`,\n );\n const qrcode = buildTerminalQrCode(auth.verificationUriComplete);\n if (qrcode) {\n emitProgress(reporter, \"login: scan this QR code to authorize\");\n emitRawProgress(reporter, `\\n${qrcode}\\n`);\n }\n emitProgress(reporter, `login: open ${auth.verificationUriComplete}`);\n}\n\n/**\n * 计算轮询截止时间。\n *\n * @param auth 创建授权结果\n * @param timeoutMs 命令行侧超时时间\n * @returns 截止时间戳\n */\nfunction resolveDeadline(\n auth: CliDeviceAuthCreateVO,\n timeoutMs: number,\n): number {\n const serverExpireMs =\n typeof auth.expiresIn === \"number\" && auth.expiresIn > 0\n ? auth.expiresIn * 1000\n : timeoutMs;\n return Date.now() + Math.min(timeoutMs, serverExpireMs);\n}\n\n/**\n * 计算轮询间隔。\n *\n * @param auth 创建授权结果\n * @returns 轮询间隔,单位毫秒\n */\nfunction resolvePollIntervalMs(auth: CliDeviceAuthCreateVO): number {\n if (typeof auth.interval !== \"number\" || auth.interval <= 0) {\n return DEFAULT_POLL_INTERVAL_MS;\n }\n return Math.max(1_000, auth.interval * 1000);\n}\n\n/**\n * 根据登录成功结果构建本地会话。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param loginVO 登录成功结果\n * @returns 本地会话\n */\nfunction buildSession(baseUrl: string, loginVO: UserLoginVO): SessionRecord {\n const tokenDto = loginVO.jwtTokenDTO;\n if (!tokenDto?.token || !tokenDto.refreshToken) {\n throw new Error(\n \"Device authorization succeeded but token payload is incomplete.\",\n );\n }\n const session: SessionRecord = {\n baseUrl,\n token: tokenDto.token,\n refreshToken: tokenDto.refreshToken,\n deviceType: DEVICE_TYPE_AI,\n updatedAt: new Date().toISOString(),\n };\n if (loginVO.siteId !== undefined) {\n session.siteId = loginVO.siteId;\n }\n if (loginVO.userVO?.id !== undefined) {\n session.userId = loginVO.userVO.id;\n }\n const userName = loginVO.userVO?.name ?? loginVO.userVO?.userName;\n if (userName !== undefined) {\n session.userName = userName;\n }\n if (tokenDto.tokenExpireTime !== undefined) {\n session.tokenExpireTime = tokenDto.tokenExpireTime;\n }\n if (tokenDto.refreshTokenExpireTime !== undefined) {\n session.refreshTokenExpireTime = tokenDto.refreshTokenExpireTime;\n }\n return session;\n}\n\n/**\n * 轮询设备授权结果。\n *\n * @param apiClient MTOS API 客户端\n * @param baseUrl MTOS 服务基础地址\n * @param auth 创建授权结果\n * @param timeoutMs 命令行侧超时时间\n * @param reporter 进度输出\n * @returns 登录成功结果\n */\nasync function waitForDeviceAuthorization(\n apiClient: MtOsApiClient,\n baseUrl: string,\n auth: CliDeviceAuthCreateVO,\n timeoutMs: number,\n reporter: ((message: string) => void) | undefined,\n): Promise<UserLoginVO> {\n const deadline = resolveDeadline(auth, timeoutMs);\n const intervalMs = resolvePollIntervalMs(auth);\n while (Date.now() <= deadline) {\n try {\n return await apiClient.pollCliDeviceAuth(baseUrl, auth.deviceCode);\n } catch (error) {\n if (!isPendingAuthorization(error)) {\n throw error;\n }\n emitProgress(reporter, \"login: authorization is still pending\");\n }\n await sleep(Math.min(intervalMs, Math.max(0, deadline - Date.now())));\n }\n throw new Error(\"Timed out waiting for MTOS device authorization.\");\n}\n\n/**\n * 解析登录所需的基础上下文。\n *\n * @param options 登录选项\n * @param sessionStore 本地会话存储\n * @returns 基础地址、超时时间和 API 客户端\n */\nasync function resolveLoginContext(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<{\n baseUrl: string;\n timeoutMs: number;\n apiClient: MtOsApiClient;\n}> {\n const config = await sessionStore.getConfig();\n const baseUrl = normalizeBaseUrl(\n options.baseUrl ?? process.env.MT_OS_BASE_URL ?? config.baseUrl ?? \"\",\n );\n const timeoutMs =\n options.timeoutMs ?? config.timeoutMs ?? DEFAULT_LOGIN_TIMEOUT_MS;\n\n const apiClient =\n options.apiClient ??\n new MtOsApiClient({\n sessionStore,\n timeoutMs,\n baseUrl,\n deviceType: DEVICE_TYPE_AI,\n });\n return {\n baseUrl,\n timeoutMs,\n apiClient,\n };\n}\n\n/**\n * 发起设备授权但不等待用户确认。\n *\n * <p>该方法用于 Agent 异步登录协议:先拿到授权 URL 和 deviceCode,由 Agent\n * 把 URL 原样交给用户,再用 deviceCode 继续轮询。\n *\n * @param options 登录选项\n * @param sessionStore 本地会话存储\n * @returns 设备授权信息\n */\nexport async function createLoginDeviceAuthorization(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<LoginDeviceAuthorizationResult> {\n const { baseUrl, timeoutMs, apiClient } = await resolveLoginContext(\n options,\n sessionStore,\n );\n emitProgress(options.onProgress, \"login: creating CLI device authorization\");\n const auth = await apiClient.createCliDeviceAuth(baseUrl, {\n client: CLIENT_NAME,\n deviceName: buildDeviceName(),\n });\n await sessionStore.saveConfig({\n baseUrl,\n timeoutMs,\n });\n return {\n baseUrl,\n timeoutMs,\n auth,\n };\n}\n\n/**\n * 使用已有 deviceCode 轮询授权结果并保存本地会话。\n *\n * @param options 登录选项\n * @param sessionStore 本地会话存储\n * @param deviceCode 设备授权码\n * @returns 登录后的本地会话\n */\nexport async function pollLoginDeviceAuthorization(\n options: LoginOptions,\n sessionStore: SessionStore,\n deviceCode: string,\n): Promise<SessionRecord> {\n const { baseUrl, timeoutMs, apiClient } = await resolveLoginContext(\n options,\n sessionStore,\n );\n const auth: CliDeviceAuthCreateVO = {\n deviceCode,\n verificationUriComplete: \"\",\n };\n emitProgress(options.onProgress, \"login: waiting for browser authorization\");\n const loginVO = await waitForDeviceAuthorization(\n apiClient,\n baseUrl,\n auth,\n timeoutMs,\n options.onProgress,\n );\n return saveLoginSession(baseUrl, timeoutMs, loginVO, sessionStore, options);\n}\n\n/**\n * 执行完整设备授权登录。\n *\n * @param options 登录选项\n * @param sessionStore 本地会话存储\n * @returns 登录后的本地会话\n */\nexport async function runLogin(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<SessionRecord> {\n const { baseUrl, timeoutMs, apiClient } = await resolveLoginContext(\n options,\n sessionStore,\n );\n const openBrowser =\n options.openBrowser ??\n (async (url: string) => {\n await open(url, { wait: false });\n });\n\n const { auth } = await createLoginDeviceAuthorization(options, sessionStore);\n emitDeviceAuthorizationPrompt(auth, options.onProgress);\n try {\n await openBrowser(auth.verificationUriComplete);\n } catch (error) {\n emitProgress(\n options.onProgress,\n `login: failed to open browser automatically, please open ${auth.verificationUriComplete}`,\n );\n }\n emitProgress(options.onProgress, \"login: waiting for browser authorization\");\n const loginVO = await waitForDeviceAuthorization(\n apiClient,\n baseUrl,\n auth,\n timeoutMs,\n options.onProgress,\n );\n emitProgress(options.onProgress, \"login: browser authorization completed\");\n return saveLoginSession(baseUrl, timeoutMs, loginVO, sessionStore, options);\n}\n\n/**\n * 保存登录结果到本地配置和密钥存储。\n *\n * @param baseUrl MTOS 服务基础地址\n * @param timeoutMs 登录超时时间\n * @param loginVO 登录成功返回\n * @param sessionStore 本地会话存储\n * @param options 登录选项\n * @returns 本地会话\n */\nasync function saveLoginSession(\n baseUrl: string,\n timeoutMs: number,\n loginVO: UserLoginVO,\n sessionStore: SessionStore,\n options: LoginOptions,\n): Promise<SessionRecord> {\n const config = await sessionStore.getConfig();\n const session = buildSession(baseUrl, loginVO);\n const nextConfig: {\n baseUrl: string;\n defaultSiteId?: string;\n timeoutMs: number;\n } = {\n baseUrl,\n timeoutMs,\n };\n const defaultSiteId = session.siteId ?? config.defaultSiteId;\n if (defaultSiteId !== undefined) {\n nextConfig.defaultSiteId = defaultSiteId;\n }\n emitProgress(options.onProgress, \"login: saving local config and session\");\n await sessionStore.saveConfig(nextConfig);\n await sessionStore.saveSession(session);\n emitProgress(options.onProgress, \"login: local session saved\");\n return session;\n}\n","import fs from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const INSTALL_MANAGER = \"mt-os-cli\";\n\nexport const CODEX_SKILL_NAME = \"mt-os\";\nexport const CODEX_SKILL_DIR = \".codex/skills/mt-os\";\nexport const CODEX_SKILL_FILE = \"SKILL.md\";\nexport const SHARED_SKILL_NAME = \"mt-os\";\nexport const SHARED_SKILL_FILE = \"SKILL.md\";\n\nexport const CLAUDE_HOME_DIR = \".claude\";\nexport const CLAUDE_SKILLS_DIR = \".claude/skills\";\nexport const CLAUDE_INSTRUCTIONS_FILE = \"CLAUDE.md\";\nexport const CLAUDE_BLOCK_START = \"<!-- mt-os-cli:start -->\";\nexport const CLAUDE_BLOCK_END = \"<!-- mt-os-cli:end -->\";\n\nfunction resolvePackageRoot(): string {\n let currentDir = path.dirname(fileURLToPath(import.meta.url));\n while (true) {\n const candidate = path.join(currentDir, \"package.json\");\n if (existsSync(candidate)) {\n return currentDir;\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n throw new Error(\"Cannot resolve mt-os-cli package root.\");\n }\n currentDir = parentDir;\n }\n}\n\nconst PACKAGE_ROOT = resolvePackageRoot();\n\nexport const SHARED_SKILL_TEMPLATE_ROOT = path.join(\n PACKAGE_ROOT,\n \"assets\",\n \"agent-skill\",\n);\n\nexport const CLAUDE_INSTRUCTIONS_TEMPLATE_PATH = path.join(\n PACKAGE_ROOT,\n \"assets\",\n \"claude\",\n \"CLAUDE.md\",\n);\n\nexport const SHARED_SKILL_TEMPLATE_PATH = path.join(\n SHARED_SKILL_TEMPLATE_ROOT,\n SHARED_SKILL_FILE,\n);\n\nexport async function loadCodexSkillTemplate(): Promise<string> {\n return fs.readFile(SHARED_SKILL_TEMPLATE_PATH, \"utf8\");\n}\n\nexport async function loadClaudeInstructionsTemplate(): Promise<string> {\n const content = await fs.readFile(CLAUDE_INSTRUCTIONS_TEMPLATE_PATH, \"utf8\");\n return `${CLAUDE_BLOCK_START}\\n${content.trim()}\\n${CLAUDE_BLOCK_END}`;\n}\n\nexport async function loadSharedSkillTemplate(): Promise<string> {\n return fs.readFile(SHARED_SKILL_TEMPLATE_PATH, \"utf8\");\n}\n\nexport function upsertManagedBlock(content: string, block: string): string {\n const startIndex = content.indexOf(CLAUDE_BLOCK_START);\n const endIndex = content.indexOf(CLAUDE_BLOCK_END);\n if (startIndex !== -1 && endIndex !== -1 && endIndex >= startIndex) {\n const before = content.slice(0, startIndex).trimEnd();\n const after = content\n .slice(endIndex + CLAUDE_BLOCK_END.length)\n .trimStart();\n const parts = [before, block.trim(), after].filter((part) => part.length > 0);\n return `${parts.join(\"\\n\\n\")}\\n`;\n }\n\n const trimmed = content.trim();\n if (!trimmed) {\n return `${block.trim()}\\n`;\n }\n return `${trimmed}\\n\\n${block.trim()}\\n`;\n}\n\nexport function removeManagedBlock(content: string): string {\n const startIndex = content.indexOf(CLAUDE_BLOCK_START);\n const endIndex = content.indexOf(CLAUDE_BLOCK_END);\n if (startIndex === -1 || endIndex === -1 || endIndex < startIndex) {\n return content;\n }\n\n const before = content.slice(0, startIndex).trimEnd();\n const after = content\n .slice(endIndex + CLAUDE_BLOCK_END.length)\n .trimStart();\n const parts = [before, after].filter((part) => part.length > 0);\n if (parts.length === 0) {\n return \"\";\n }\n return `${parts.join(\"\\n\\n\")}\\n`;\n}\n","import { execFile } from \"node:child_process\";\nimport type { Dirent } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport type { SessionRecord } from \"../session/store.js\";\nimport type { CliSkillFileVO } from \"../types.js\";\nimport { normalizeBaseUrl } from \"../util/base-url.js\";\nimport {\n CLAUDE_HOME_DIR,\n CLAUDE_INSTRUCTIONS_FILE,\n CLAUDE_INSTRUCTIONS_TEMPLATE_PATH,\n CLAUDE_SKILLS_DIR,\n CODEX_SKILL_DIR,\n CODEX_SKILL_FILE,\n SHARED_SKILL_NAME,\n SHARED_SKILL_TEMPLATE_PATH,\n SHARED_SKILL_TEMPLATE_ROOT,\n loadClaudeInstructionsTemplate,\n loadCodexSkillTemplate,\n removeManagedBlock,\n upsertManagedBlock,\n} from \"./templates.js\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * 远程 MCP 服务在客户端侧统一使用的名字。\n */\nconst MCP_SERVER_NAME = \"mt-os\";\n\n/**\n * 旧版本 mt-os-cli 写入过的业务 skill 目录。\n *\n * <p>这些目录里的业务说明现在全部改由服务端 {@code /agent/api/v1/cli/skills}\n * 下发,CLI 本地只保留中性的启动说明。安装和远程更新时主动清理,避免 Agent 继续读取旧业务文档。</p>\n */\nconst LEGACY_SKILL_NAMES = [\n \"agent-assistant\",\n \"jsola-tool-index\",\n];\n\n/**\n * 卸载时需要兜底清理的远程 skill 目录。\n *\n * <p>这些目录可能是服务端动态清单下发的当前名称,不能放进安装前清理名单,否则会破坏\n * `skills update` 的幂等写入判断;但卸载时必须兜底移除。</p>\n */\nconst UNINSTALL_FALLBACK_SKILL_NAMES = [\n \"agent-assistant\",\n \"agent-shared\",\n \"agent-draft\",\n \"agent-attachment\",\n \"tool-index\",\n];\n\n/**\n * 远程 skill 同步状态文件名。\n *\n * <p>这个文件只记录 mt-os-cli 通过服务端清单写入过的文件路径,用于下一次同步时\n * 删除已经从清单里消失的旧文件。它放在各客户端 skills 根目录下,避免误删用户手工\n * 创建的其它 skill。</p>\n */\nconst REMOTE_SKILL_STATE_FILE = \".mt-os-cli-remote-skills.json\";\n\n/**\n * Claude 配置统一写入用户级作用域。\n */\nconst CLAUDE_SCOPE = \"user\";\n\n/**\n * 支持的安装目标。\n */\nexport type InstallTarget = \"all\" | \"codex\" | \"claude\" | \"openclaw\";\n\n/**\n * 具体客户端目标。\n */\nexport type ClientTarget = Exclude<InstallTarget, \"all\">;\n\n/**\n * 客户端安装路径。\n */\nexport interface InstallPaths {\n codexSkillRoot: string;\n codexSkillPath: string;\n claudeInstructionsPath: string;\n claudeSkillRoot: string;\n claudeSkillPath: string;\n openClawSkillRoot: string;\n openClawSkillPath: string;\n}\n\n/**\n * 模板源文件路径。\n */\nexport interface InstallTemplatePaths {\n sharedSkillTemplatePath: string;\n sharedSkillTemplateRoot: string;\n claudeInstructionsTemplatePath: string;\n}\n\n/**\n * 本地安装状态。\n */\nexport interface InstallState {\n codexSkillInstalled: boolean;\n claudeInstructionsInstalled: boolean;\n claudeSkillsInstalled: boolean;\n openClawSkillsInstalled: boolean;\n codexCliInstalled: boolean;\n claudeCliInstalled: boolean;\n openClawCliInstalled: boolean;\n codexMcpConfigured: boolean;\n claudeMcpConfigured: boolean;\n openClawMcpConfigured: boolean;\n paths: InstallPaths;\n templatePaths: InstallTemplatePaths;\n}\n\n/**\n * 卸载本地安装产物的结果。\n */\nexport interface UninstallResult {\n removedCodexSkill: boolean;\n removedClaudeSkills: boolean;\n removedOpenClawSkills: boolean;\n removedClaudeInstructions: boolean;\n removedConfigDir: boolean;\n}\n\n/**\n * 客户端运行时信息。\n */\nexport interface ClientRuntimeState {\n installed: boolean;\n commandPath?: string;\n}\n\n/**\n * 客户端同步结果。\n */\nexport interface ClientSyncResult {\n appliedTargets: ClientTarget[];\n skippedMessages: string[];\n}\n\n/**\n * 远程 skill 文件写入结果。\n */\nexport interface ExternalSkillInstallResult {\n target: ClientTarget;\n writtenFiles: number;\n}\n\n/**\n * Codex 远程 MCP OAuth 登录状态。\n */\nexport type CodexMcpAuthState = \"logged_in\" | \"not_logged_in\" | \"unknown\";\n\n/**\n * 系统命令执行结果。\n */\ninterface CommandResult {\n success: boolean;\n stdout: string;\n stderr: string;\n}\n\n/**\n * 远程 skill 同步状态。\n */\ninterface RemoteSkillState {\n /** 上一次远程清单写入过的文件路径。 */\n files: string[];\n}\n\n/**\n * 解析 home 目录。\n *\n * @param homeDir 自定义 home 目录\n * @returns 最终 home 目录\n */\nfunction resolveHomeDir(homeDir?: string): string {\n return homeDir ?? os.homedir();\n}\n\n/**\n * 解析本地安装路径。\n *\n * @param homeDir 自定义 home 目录\n * @returns 安装路径\n */\nexport function resolveInstallPaths(homeDir?: string): InstallPaths {\n const root = resolveHomeDir(homeDir);\n return {\n codexSkillRoot: path.join(root, CODEX_SKILL_DIR),\n codexSkillPath: path.join(root, CODEX_SKILL_DIR, CODEX_SKILL_FILE),\n claudeInstructionsPath: path.join(\n root,\n CLAUDE_HOME_DIR,\n CLAUDE_INSTRUCTIONS_FILE,\n ),\n claudeSkillRoot: path.join(root, CLAUDE_SKILLS_DIR, SHARED_SKILL_NAME),\n claudeSkillPath: path.join(\n root,\n CLAUDE_SKILLS_DIR,\n SHARED_SKILL_NAME,\n CODEX_SKILL_FILE,\n ),\n openClawSkillRoot: path.join(root, \".openclaw\", \"skills\", SHARED_SKILL_NAME),\n openClawSkillPath: path.join(\n root,\n \".openclaw\",\n \"skills\",\n SHARED_SKILL_NAME,\n CODEX_SKILL_FILE,\n ),\n };\n}\n\n/**\n * 解析 Codex 下由 mt-os-cli 管理的所有 skill 目录。\n *\n * @param homeDir 自定义 home 目录\n * @returns skill 目录列表\n */\nfunction resolveManagedCodexSkillDirs(homeDir?: string): string[] {\n const root = resolveHomeDir(homeDir);\n const skillsRoot = path.join(root, \".codex/skills\");\n return [path.join(skillsRoot, SHARED_SKILL_NAME)];\n}\n\n/**\n * 解析 Claude 下由 mt-os-cli 管理的所有 skill 目录。\n *\n * @param homeDir 自定义 home 目录\n * @returns skill 目录列表\n */\nfunction resolveManagedClaudeSkillDirs(homeDir?: string): string[] {\n const root = resolveHomeDir(homeDir);\n const skillsRoot = path.join(root, CLAUDE_SKILLS_DIR);\n return [path.join(skillsRoot, SHARED_SKILL_NAME)];\n}\n\n/**\n * 解析 OpenClaw 下由 mt-os-cli 管理的所有 skill 目录。\n *\n * <p>OpenClaw 官方内置全局 skill 根目录包含 `~/.openclaw/skills`,因此这里直接写入该\n * 目录,避免要求用户额外修改 `openclaw.json`。\n *\n * @param homeDir 自定义 home 目录\n * @returns skill 目录列表\n */\nfunction resolveManagedOpenClawSkillDirs(homeDir?: string): string[] {\n const root = resolveHomeDir(homeDir);\n const skillsRoot = path.join(root, \".openclaw\", \"skills\");\n return [path.join(skillsRoot, SHARED_SKILL_NAME)];\n}\n\n/**\n * 解析各客户端的 skills 根目录。\n *\n * @param homeDir 自定义 home 目录\n * @returns 客户端 skills 根目录映射\n */\nfunction resolveSkillRoots(homeDir?: string): Record<ClientTarget, string[]> {\n const root = resolveHomeDir(homeDir);\n return {\n codex: [path.join(root, \".codex\", \"skills\")],\n claude: [path.join(root, CLAUDE_SKILLS_DIR)],\n openclaw: [path.join(root, \".openclaw\", \"skills\")],\n };\n}\n\n/**\n * 规范化并校验远程 skill 文件。\n *\n * @param files 远程文件列表\n * @returns 可安全写入的文件列表\n */\nfunction normalizeExternalSkillFiles(files: CliSkillFileVO[]): CliSkillFileVO[] {\n if (!Array.isArray(files) || files.length === 0) {\n return [];\n }\n return files.map((file) => {\n const normalizedPath = normalizeExternalSkillPath(file.path);\n return {\n ...file,\n path: normalizedPath,\n content: String(file.content ?? \"\"),\n };\n });\n}\n\n/**\n * 校验远程 skill 文件路径,避免路径穿越。\n *\n * @param filePath 原始相对路径\n * @returns 标准化后的相对路径\n */\nfunction normalizeExternalSkillPath(filePath: string): string {\n const rawPath = String(filePath ?? \"\").replace(/\\\\/g, \"/\");\n if (rawPath.split(\"/\").some((pathPart) => pathPart === \"..\")) {\n throw new Error(`Unsafe remote skill path: ${filePath}`);\n }\n const normalizedPath = path.posix.normalize(rawPath);\n if (\n !normalizedPath ||\n normalizedPath === \".\" ||\n normalizedPath.startsWith(\"/\") ||\n normalizedPath.startsWith(\"../\") ||\n normalizedPath.includes(\"/../\")\n ) {\n throw new Error(`Unsafe remote skill path: ${filePath}`);\n }\n return normalizedPath;\n}\n\n/**\n * 解析单次执行的目标列表。\n *\n * @param targets 原始目标参数\n * @returns 解析后的目标列表\n */\nexport function parseInstallTargets(\n targets: string[] | undefined,\n): InstallTarget[] {\n if (!targets || targets.length === 0) {\n return [\"all\"];\n }\n const normalized = targets\n .flatMap((target) => target.split(\",\"))\n .map((target) => target.trim().toLowerCase())\n .filter((target) => target.length > 0);\n if (normalized.length === 0) {\n return [\"all\"];\n }\n return normalized.map((target) => {\n if (target === \"all\") {\n return \"all\";\n }\n if (target === \"codex\" || target === \"codex-skill\") {\n return \"codex\";\n }\n if (target === \"claude\" || target === \"claude-instructions\") {\n return \"claude\";\n }\n if (target === \"openclaw\" || target === \"open-claw\") {\n return \"openclaw\";\n }\n throw new Error(`Unknown install target: ${target}`);\n });\n}\n\n/**\n * 展开目标。\n *\n * @param targets 安装目标\n * @returns 展开后的具体客户端\n */\nexport function expandInstallTargets(targets: InstallTarget[]): ClientTarget[] {\n if (targets.includes(\"all\")) {\n return [\"codex\", \"claude\", \"openclaw\"];\n }\n const next: ClientTarget[] = [];\n if (targets.includes(\"codex\")) {\n next.push(\"codex\");\n }\n if (targets.includes(\"claude\")) {\n next.push(\"claude\");\n }\n if (targets.includes(\"openclaw\")) {\n next.push(\"openclaw\");\n }\n return next;\n}\n\n/**\n * 生成可读的客户端列表描述。\n *\n * @param targets 客户端列表\n * @returns 描述文本\n */\nexport function describeInstallTargets(targets: ClientTarget[]): string {\n if (targets.length === 0) {\n return \"none\";\n }\n return targets.join(\", \");\n}\n\n/**\n * 检测当前机器已安装的客户端。\n *\n * @returns 客户端运行时信息\n */\nexport async function detectInstalledClients(): Promise<\n Record<ClientTarget, ClientRuntimeState>\n> {\n const [codexPath, claudePath, openClawPath] = await Promise.all([\n findExecutable(\"codex\"),\n findExecutable(\"claude\"),\n findExecutable(\"openclaw\"),\n ]);\n return {\n codex: {\n installed: Boolean(codexPath),\n ...(codexPath ? { commandPath: codexPath } : {}),\n },\n claude: {\n installed: Boolean(claudePath),\n ...(claudePath ? { commandPath: claudePath } : {}),\n },\n openclaw: {\n installed: Boolean(openClawPath),\n ...(openClawPath ? { commandPath: openClawPath } : {}),\n },\n };\n}\n\n/**\n * 根据请求目标和本机安装状态解析最终要同步的客户端。\n *\n * @param targets 请求目标\n * @returns 最终客户端列表\n */\nexport async function resolveRequestedClients(\n targets: InstallTarget[],\n): Promise<ClientTarget[]> {\n const expanded = expandInstallTargets(targets);\n const runtimes = await detectInstalledClients();\n if (targets.includes(\"all\")) {\n return expanded.filter((target) => runtimes[target].installed);\n }\n return expanded;\n}\n\n/**\n * 安装 Codex skill。\n *\n * @param options 安装选项\n * @returns 是否写入了新内容\n */\nexport async function installCodexSkill(options?: {\n homeDir?: string;\n}): Promise<boolean> {\n const paths = resolveInstallPaths(options?.homeDir);\n await removeLegacySkillDirs(path.dirname(paths.codexSkillRoot));\n const sharedChanged = await syncManagedSkillDirectory(\n SHARED_SKILL_TEMPLATE_ROOT,\n paths.codexSkillRoot,\n );\n return sharedChanged;\n}\n\n/**\n * 安装 Claude 用户级指令。\n *\n * @param options 安装选项\n * @returns 是否写入了新内容\n */\nexport async function installClaudeInstructions(options?: {\n homeDir?: string;\n}): Promise<boolean> {\n const paths = resolveInstallPaths(options?.homeDir);\n let current = \"\";\n try {\n current = await fs.readFile(paths.claudeInstructionsPath, \"utf8\");\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code !== \"ENOENT\") {\n throw error;\n }\n }\n\n const template = await loadClaudeInstructionsTemplate();\n const next = upsertManagedBlock(current, template);\n return writeIfChanged(paths.claudeInstructionsPath, next, 0o644);\n}\n\n/**\n * 安装 Claude skills 目录下的 bootstrap 技能。\n *\n * @param options 安装选项\n * @returns 是否写入了新内容\n */\nexport async function installClaudeSkills(options?: {\n homeDir?: string;\n}): Promise<boolean> {\n const paths = resolveInstallPaths(options?.homeDir);\n await removeLegacySkillDirs(path.join(resolveHomeDir(options?.homeDir), CLAUDE_SKILLS_DIR));\n const sharedChanged = await syncManagedSkillDirectory(\n SHARED_SKILL_TEMPLATE_ROOT,\n paths.claudeSkillRoot,\n );\n return sharedChanged;\n}\n\n/**\n * 安装 OpenClaw 全局 skills 目录下的 bootstrap 技能。\n *\n * <p>OpenClaw 默认扫描 `~/.openclaw/skills`,因此安装动作只复制标准 `SKILL.md`\n * 目录结构,不主动修改 OpenClaw 的配置文件。\n *\n * @param options 安装选项\n * @returns 是否写入了新内容\n */\nexport async function installOpenClawSkills(options?: {\n homeDir?: string;\n}): Promise<boolean> {\n const paths = resolveInstallPaths(options?.homeDir);\n const skillsRoot = path.dirname(paths.openClawSkillRoot);\n await removeLegacySkillDirs(skillsRoot);\n const sharedChanged = await syncManagedSkillDirectory(\n SHARED_SKILL_TEMPLATE_ROOT,\n paths.openClawSkillRoot,\n );\n return sharedChanged;\n}\n\n/**\n * 安装远程 skill 文件到指定客户端的 skills 根目录。\n *\n * <p>远程文件路径只允许是相对路径,且不能包含 {@code ..}。这样服务端可以贡献业务\n * skill 文档,但不能越权覆盖用户本机其它文件。</p>\n *\n * @param files 远程 skill 文件列表\n * @param targets 目标客户端\n * @param options 安装选项\n * @returns 每个客户端实际写入的文件数量\n */\nexport async function installExternalSkillFiles(\n files: CliSkillFileVO[],\n targets: ClientTarget[],\n options?: {\n homeDir?: string;\n },\n): Promise<ExternalSkillInstallResult[]> {\n const normalizedFiles = normalizeExternalSkillFiles(files);\n const targetRoots = resolveSkillRoots(options?.homeDir);\n const results: ExternalSkillInstallResult[] = [];\n for (const target of targets) {\n let writtenFiles = 0;\n const desiredPaths = new Set(normalizedFiles.map((file) => file.path));\n const roots = await resolveExistingSkillRoots(target, targetRoots[target]);\n for (const root of roots) {\n await removeLegacySkillDirs(root);\n await removeStaleExternalSkillFiles(root, desiredPaths);\n for (const file of normalizedFiles) {\n const wrote = await writeIfChanged(\n path.join(root, file.path),\n file.content,\n 0o644,\n );\n if (wrote) {\n writtenFiles += 1;\n }\n }\n await writeRemoteSkillState(root, desiredPaths);\n }\n results.push({\n target,\n writtenFiles,\n });\n }\n return results;\n}\n\n/**\n * 根据目标客户端解析本次需要写入的真实 skills 根目录。\n *\n * <p>Codex、Claude、OpenClaw 的 skills 根目录由 CLI 负责创建,\n * 远程 skill 文件会写入对应客户端的标准 skills 目录。</p>\n *\n * @param target 客户端目标\n * @param roots 候选 skills 根目录\n * @returns 可写入的 skills 根目录\n */\nasync function resolveExistingSkillRoots(\n _target: ClientTarget,\n roots: string[],\n): Promise<string[]> {\n return roots;\n}\n\n/**\n * 安装本地 skill / 指令文件。\n *\n * @param options 安装选项\n * @returns 安装状态\n */\nexport async function installAll(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const paths = resolveInstallPaths(options?.homeDir);\n const runtimes = await detectInstalledClients();\n const [\n codexSkillInstalled,\n claudeInstructionsInstalled,\n claudeSkillsInstalled,\n openClawSkillsInstalled,\n ] = await Promise.all([\n installCodexSkill(options),\n installClaudeInstructions(options),\n installClaudeSkills(options),\n installOpenClawSkills(options),\n ]);\n const [codexMcpConfigured, claudeMcpConfigured, openClawMcpConfigured] = await Promise.all([\n inspectCodexMcpConfiguration(runtimes.codex),\n inspectClaudeMcpConfiguration(runtimes.claude),\n inspectOpenClawMcpConfiguration(runtimes.openclaw),\n ]);\n return {\n codexSkillInstalled,\n claudeInstructionsInstalled,\n claudeSkillsInstalled,\n openClawSkillsInstalled,\n codexCliInstalled: runtimes.codex.installed,\n claudeCliInstalled: runtimes.claude.installed,\n openClawCliInstalled: runtimes.openclaw.installed,\n codexMcpConfigured,\n claudeMcpConfigured,\n openClawMcpConfigured,\n paths,\n templatePaths: {\n sharedSkillTemplatePath: SHARED_SKILL_TEMPLATE_PATH,\n sharedSkillTemplateRoot: SHARED_SKILL_TEMPLATE_ROOT,\n claudeInstructionsTemplatePath: CLAUDE_INSTRUCTIONS_TEMPLATE_PATH,\n },\n };\n}\n\n/**\n * 卸载本地 skill、指令和配置目录。\n *\n * @param options 卸载选项\n * @returns 卸载结果\n */\nexport async function uninstallLocalAssets(options?: {\n homeDir?: string;\n configDir?: string;\n}): Promise<UninstallResult> {\n const paths = resolveInstallPaths(options?.homeDir);\n const [\n removedCodexSkill,\n removedClaudeInstructions,\n removedConfigDir,\n removedClaudeSkills,\n removedOpenClawSkills,\n ] =\n await Promise.all([\n removeCodexSkillDirs([\n ...resolveManagedCodexSkillDirs(options?.homeDir),\n ...resolveUninstallFallbackSkillDirs(path.join(resolveHomeDir(options?.homeDir), \".codex/skills\")),\n ]),\n removeClaudeManagedInstructions(paths.claudeInstructionsPath),\n removeDirectoryIfExists(options?.configDir),\n removeManagedClaudeSkillDirs(options?.homeDir),\n removeOpenClawSkillDirs(options?.homeDir),\n ]);\n\n return {\n removedCodexSkill,\n removedClaudeSkills,\n removedOpenClawSkills,\n removedClaudeInstructions,\n removedConfigDir,\n };\n}\n\n/**\n * 检查当前安装状态。\n *\n * @param options 检查选项\n * @returns 安装状态\n */\nexport async function inspectInstallState(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const paths = resolveInstallPaths(options?.homeDir);\n const runtimes = await detectInstalledClients();\n const [\n codexSkillInstalled,\n claudeInstructionsInstalled,\n claudeSkillsInstalled,\n openClawSkillsInstalled,\n codexMcpConfigured,\n claudeMcpConfigured,\n openClawMcpConfigured,\n ] = await Promise.all([\n fileExists(paths.codexSkillPath),\n fileExists(paths.claudeInstructionsPath),\n inspectClaudeSkillsInstalled(options?.homeDir),\n inspectOpenClawSkillsInstalled(options?.homeDir),\n inspectCodexMcpConfiguration(runtimes.codex),\n inspectClaudeMcpConfiguration(runtimes.claude),\n inspectOpenClawMcpConfiguration(runtimes.openclaw),\n ]);\n return {\n codexSkillInstalled,\n claudeInstructionsInstalled,\n claudeSkillsInstalled,\n openClawSkillsInstalled,\n codexCliInstalled: runtimes.codex.installed,\n claudeCliInstalled: runtimes.claude.installed,\n openClawCliInstalled: runtimes.openclaw.installed,\n codexMcpConfigured,\n claudeMcpConfigured,\n openClawMcpConfigured,\n paths,\n templatePaths: {\n sharedSkillTemplatePath: SHARED_SKILL_TEMPLATE_PATH,\n sharedSkillTemplateRoot: SHARED_SKILL_TEMPLATE_ROOT,\n claudeInstructionsTemplatePath: CLAUDE_INSTRUCTIONS_TEMPLATE_PATH,\n },\n };\n}\n\n/**\n * 根据登录态同步远程 MCP 配置。\n *\n * @param options 同步参数\n * @returns 同步结果\n */\nexport async function syncClientsFromSession(options: {\n targets: ClientTarget[];\n session: SessionRecord;\n mcpBaseUrl?: string;\n onProgress?: (message: string) => void;\n}): Promise<ClientSyncResult> {\n const runtimes = await detectInstalledClients();\n await cleanupLegacyClientConfigurations(runtimes);\n const appliedTargets: ClientTarget[] = [];\n const skippedMessages: string[] = [];\n const mcpBaseUrl = resolveOptionalBaseUrl(options.mcpBaseUrl)\n ?? normalizeBaseUrl(options.session.baseUrl);\n\n for (const target of options.targets) {\n const runtime = runtimes[target];\n if (!runtime.installed || !runtime.commandPath) {\n skippedMessages.push(`${target}: 客户端未安装,已跳过`);\n continue;\n }\n\n try {\n if (target === \"codex\") {\n options.onProgress?.(\"codex: 正在检查远程 MCP 配置\");\n const configChanged = await configureCodexRemoteServer(mcpBaseUrl, runtime);\n const authState = await inspectCodexMcpAuthState(runtime);\n if (configChanged || authState !== \"logged_in\") {\n options.onProgress?.(\"codex: 正在同步 OAuth 登录,这一步首次执行可能稍慢\");\n await loginCodexRemoteServer(runtime);\n } else {\n skippedMessages.push(\"codex: OAuth 已登录,已跳过重复登录\");\n }\n appliedTargets.push(target);\n continue;\n }\n\n if (target === \"openclaw\") {\n if (!options.session.token) {\n skippedMessages.push(\"openclaw: 缺少 Bearer token,未写入远程 MCP 配置\");\n continue;\n }\n options.onProgress?.(\"openclaw: 正在写入 Bearer 远程 MCP 配置\");\n await configureOpenClawRemoteServer(mcpBaseUrl, options.session.token, runtime);\n appliedTargets.push(target);\n continue;\n }\n\n if (!options.session.token) {\n skippedMessages.push(\"claude: 缺少 Bearer token,未写入远程 MCP 配置\");\n continue;\n }\n options.onProgress?.(\"claude: 正在写入 Bearer 远程 MCP 配置\");\n await configureClaudeRemoteServer(mcpBaseUrl, options.session.token, runtime);\n appliedTargets.push(target);\n } catch (error) {\n skippedMessages.push(`${target}: 客户端同步失败,已跳过 - ${formatErrorMessage(error)}`);\n }\n }\n\n return {\n appliedTargets,\n skippedMessages,\n };\n}\n\n/**\n * 格式化客户端同步异常。\n *\n * @param error 原始异常\n * @returns 可展示的错误信息\n */\nfunction formatErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * 在仅执行 install 时尝试预配置客户端。\n *\n * <p>Codex 只需要远程 MCP URL,因此在已知 baseUrl 时可以提前写入;\n * Claude 还依赖 Bearer token,所以只在已经有 session 时才配置。\n *\n * @param options 预配置参数\n * @returns 同步结果\n */\nexport async function preconfigureClients(options: {\n targets: ClientTarget[];\n baseUrl?: string;\n mcpBaseUrl?: string;\n session?: SessionRecord | null;\n}): Promise<ClientSyncResult> {\n const runtimes = await detectInstalledClients();\n await cleanupLegacyClientConfigurations(runtimes);\n const appliedTargets: ClientTarget[] = [];\n const skippedMessages: string[] = [];\n const mcpBaseUrl = resolveOptionalBaseUrl(options.mcpBaseUrl)\n ?? resolveOptionalBaseUrl(options.baseUrl);\n\n for (const target of options.targets) {\n const runtime = runtimes[target];\n if (!runtime.installed || !runtime.commandPath) {\n skippedMessages.push(`${target}: 客户端未安装,已跳过`);\n continue;\n }\n if (!mcpBaseUrl) {\n skippedMessages.push(`${target}: 缺少 mcpBaseUrl,远程 MCP 配置延后到 login`);\n continue;\n }\n\n if (target === \"codex\") {\n await configureCodexRemoteServer(mcpBaseUrl, runtime);\n appliedTargets.push(target);\n continue;\n }\n\n if (target === \"openclaw\") {\n if (!options.session?.token) {\n skippedMessages.push(\"openclaw: install 已成功;当前只差 Bearer header,下一步请执行 mt-os-cli auth login\");\n continue;\n }\n await configureOpenClawRemoteServer(mcpBaseUrl, options.session.token, runtime);\n appliedTargets.push(target);\n continue;\n }\n\n if (!options.session?.token) {\n skippedMessages.push(\"claude: install 已成功;当前只差 Bearer header,下一步请执行 mt-os-cli auth login\");\n continue;\n }\n await configureClaudeRemoteServer(mcpBaseUrl, options.session.token, runtime);\n appliedTargets.push(target);\n }\n\n return {\n appliedTargets,\n skippedMessages,\n };\n}\n\n/**\n * 退出远程 MCP 登录。\n *\n * @param targets 客户端列表\n * @returns 退出结果\n */\nexport async function logoutClients(\n targets: ClientTarget[],\n): Promise<ClientSyncResult> {\n const runtimes = await detectInstalledClients();\n const appliedTargets: ClientTarget[] = [];\n const skippedMessages: string[] = [];\n\n for (const target of targets) {\n const runtime = runtimes[target];\n if (!runtime.installed || !runtime.commandPath) {\n skippedMessages.push(`${target}: 客户端未安装,已跳过`);\n continue;\n }\n\n if (target === \"codex\") {\n await runCommand(runtime.commandPath, [\"mcp\", \"logout\", MCP_SERVER_NAME], {\n allowFailure: true,\n });\n await removeLegacyMcpServers(runtime.commandPath, \"codex\");\n appliedTargets.push(target);\n continue;\n }\n\n if (target === \"openclaw\") {\n await removeLegacyMcpServers(runtime.commandPath, \"openclaw\");\n await runCommand(runtime.commandPath, [\"mcp\", \"unset\", MCP_SERVER_NAME], {\n allowFailure: true,\n });\n appliedTargets.push(target);\n continue;\n }\n\n await removeLegacyMcpServers(runtime.commandPath, \"claude\");\n await runCommand(\n runtime.commandPath,\n [\"mcp\", \"remove\", \"-s\", CLAUDE_SCOPE, MCP_SERVER_NAME],\n {\n allowFailure: true,\n },\n );\n appliedTargets.push(target);\n }\n\n return {\n appliedTargets,\n skippedMessages,\n };\n}\n\n/**\n * 检测远程 MCP 是否已写入 Codex。\n *\n * @param runtime Codex 运行时信息\n * @returns 是否已配置\n */\nexport async function inspectCodexMcpConfiguration(\n runtime?: ClientRuntimeState,\n): Promise<boolean> {\n const resolvedRuntime =\n runtime ?? (await detectInstalledClients()).codex;\n if (!resolvedRuntime.installed || !resolvedRuntime.commandPath) {\n return false;\n }\n const result = await runCommand(\n resolvedRuntime.commandPath,\n [\"mcp\", \"get\", \"--json\", MCP_SERVER_NAME],\n {\n allowFailure: true,\n },\n );\n if (!result.success || !result.stdout.trim()) {\n return false;\n }\n try {\n const parsed = JSON.parse(result.stdout) as Record<string, unknown>;\n const transport = parsed.transport as\n | string\n | { type?: string }\n | undefined;\n if (typeof transport === \"string\") {\n return transport === \"http\" || transport === \"streamable_http\";\n }\n return (\n transport?.type === \"http\" || transport?.type === \"streamable_http\"\n );\n } catch {\n return false;\n }\n}\n\n/**\n * 检测远程 MCP 是否已写入 Claude。\n *\n * @param runtime Claude 运行时信息\n * @returns 是否已配置\n */\nexport async function inspectClaudeMcpConfiguration(\n runtime?: ClientRuntimeState,\n): Promise<boolean> {\n const resolvedRuntime =\n runtime ?? (await detectInstalledClients()).claude;\n if (!resolvedRuntime.installed || !resolvedRuntime.commandPath) {\n return false;\n }\n const result = await runCommand(\n resolvedRuntime.commandPath,\n [\"mcp\", \"get\", MCP_SERVER_NAME],\n {\n allowFailure: true,\n },\n );\n return result.success;\n}\n\n/**\n * 检测远程 MCP 是否已写入 OpenClaw。\n *\n * @param runtime OpenClaw 运行时信息\n * @returns 是否已配置\n */\nexport async function inspectOpenClawMcpConfiguration(\n runtime?: ClientRuntimeState,\n): Promise<boolean> {\n const resolvedRuntime =\n runtime ?? (await detectInstalledClients()).openclaw;\n if (!resolvedRuntime.installed || !resolvedRuntime.commandPath) {\n return false;\n }\n const result = await runCommand(\n resolvedRuntime.commandPath,\n [\"mcp\", \"show\", MCP_SERVER_NAME, \"--json\"],\n {\n allowFailure: true,\n },\n );\n return result.success && result.stdout.trim().length > 0;\n}\n\n/**\n * 读取 Codex 远程 MCP 配置详情。\n *\n * @param runtime Codex 运行时信息\n * @returns 原始配置文本\n */\nexport async function readCodexMcpConfiguration(\n runtime?: ClientRuntimeState,\n): Promise<string | null> {\n const resolvedRuntime =\n runtime ?? (await detectInstalledClients()).codex;\n if (!resolvedRuntime.installed || !resolvedRuntime.commandPath) {\n return null;\n }\n const result = await runCommand(\n resolvedRuntime.commandPath,\n [\"mcp\", \"get\", \"--json\", MCP_SERVER_NAME],\n {\n allowFailure: true,\n },\n );\n if (!result.success || !result.stdout.trim()) {\n return null;\n }\n return result.stdout.trim();\n}\n\n/**\n * 读取 Claude 远程 MCP 配置详情。\n *\n * @param runtime Claude 运行时信息\n * @returns 原始配置文本\n */\nexport async function readClaudeMcpConfiguration(\n runtime?: ClientRuntimeState,\n): Promise<string | null> {\n const resolvedRuntime =\n runtime ?? (await detectInstalledClients()).claude;\n if (!resolvedRuntime.installed || !resolvedRuntime.commandPath) {\n return null;\n }\n const result = await runCommand(\n resolvedRuntime.commandPath,\n [\"mcp\", \"get\", MCP_SERVER_NAME],\n {\n allowFailure: true,\n },\n );\n if (!result.success || !result.stdout.trim()) {\n return null;\n }\n return result.stdout.trim();\n}\n\n/**\n * 读取 OpenClaw 远程 MCP 配置详情。\n *\n * @param runtime OpenClaw 运行时信息\n * @returns 原始配置文本\n */\nexport async function readOpenClawMcpConfiguration(\n runtime?: ClientRuntimeState,\n): Promise<string | null> {\n const resolvedRuntime =\n runtime ?? (await detectInstalledClients()).openclaw;\n if (!resolvedRuntime.installed || !resolvedRuntime.commandPath) {\n return null;\n }\n const result = await runCommand(\n resolvedRuntime.commandPath,\n [\"mcp\", \"show\", MCP_SERVER_NAME, \"--json\"],\n {\n allowFailure: true,\n },\n );\n if (!result.success || !result.stdout.trim()) {\n return null;\n }\n return result.stdout.trim();\n}\n\n/**\n * 配置 Codex 远程 MCP。\n *\n * @param baseUrl OA 基础地址\n * @param runtime Codex 运行时信息\n */\nasync function configureCodexRemoteServer(\n baseUrl: string,\n runtime: ClientRuntimeState,\n): Promise<boolean> {\n const expectedUrl = buildMcpUrl(baseUrl);\n await removeLegacyMcpServers(runtime.commandPath!, \"codex\");\n const currentConfiguration = await readCodexMcpConfigurationRecord(runtime);\n if (\n currentConfiguration\n && (currentConfiguration.transport === \"http\"\n || currentConfiguration.transport === \"streamable_http\")\n && currentConfiguration.url === expectedUrl\n ) {\n return false;\n }\n await runCommand(runtime.commandPath!, [\"mcp\", \"remove\", MCP_SERVER_NAME], {\n allowFailure: true,\n });\n await runCommand(runtime.commandPath!, [\n \"mcp\",\n \"add\",\n MCP_SERVER_NAME,\n \"--url\",\n expectedUrl,\n ]);\n return true;\n}\n\n/**\n * 调起 Codex 原生 OAuth 登录。\n *\n * @param runtime Codex 运行时信息\n */\nasync function loginCodexRemoteServer(\n runtime: ClientRuntimeState,\n): Promise<void> {\n await runCommand(runtime.commandPath!, [\"mcp\", \"login\", MCP_SERVER_NAME]);\n}\n\n/**\n * 检查 Codex 远程 MCP 的 OAuth 登录状态。\n *\n * @param runtime Codex 运行时信息\n * @returns OAuth 登录状态\n */\nasync function inspectCodexMcpAuthState(\n runtime: ClientRuntimeState,\n): Promise<CodexMcpAuthState> {\n const result = await runCommand(runtime.commandPath!, [\"mcp\", \"list\"], {\n allowFailure: true,\n });\n if (!result.success || !result.stdout.trim()) {\n return \"unknown\";\n }\n const targetColumns = result.stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .map((line) => line.split(/\\s{2,}/).map((value) => value.trim()))\n .find((columns) => columns[0] === MCP_SERVER_NAME);\n if (!targetColumns) {\n return \"unknown\";\n }\n const authColumn = targetColumns.at(-1);\n if (authColumn === \"Not logged in\") {\n return \"not_logged_in\";\n }\n if (authColumn && authColumn !== \"-\") {\n return \"logged_in\";\n }\n return \"unknown\";\n}\n\n/**\n * 配置 Claude 远程 MCP。\n *\n * @param baseUrl OA 基础地址\n * @param bearerToken Bearer token\n * @param runtime Claude 运行时信息\n */\nasync function configureClaudeRemoteServer(\n baseUrl: string,\n bearerToken: string,\n runtime: ClientRuntimeState,\n): Promise<void> {\n await removeLegacyMcpServers(runtime.commandPath!, \"claude\");\n await runCommand(\n runtime.commandPath!,\n [\"mcp\", \"remove\", \"-s\", CLAUDE_SCOPE, MCP_SERVER_NAME],\n {\n allowFailure: true,\n },\n );\n await runCommand(runtime.commandPath!, [\n \"mcp\",\n \"add\",\n \"--transport\",\n \"http\",\n \"-s\",\n CLAUDE_SCOPE,\n MCP_SERVER_NAME,\n buildMcpUrl(baseUrl),\n \"--header\",\n `Authorization: Bearer ${bearerToken}`,\n ]);\n}\n\n/**\n * 配置 OpenClaw 远程 MCP。\n *\n * <p>OpenClaw 的客户端注册表使用 `mcp.servers`,官方 CLI 通过\n * `openclaw mcp set <name> <json>` 写入。这里使用 OpenClaw 规范里的\n * `transport: \"streamable-http\"`,并把 mt-os-cli 登录态写入 Bearer header。\n *\n * @param baseUrl OA 基础地址\n * @param bearerToken Bearer token\n * @param runtime OpenClaw 运行时信息\n */\nasync function configureOpenClawRemoteServer(\n baseUrl: string,\n bearerToken: string,\n runtime: ClientRuntimeState,\n): Promise<void> {\n await removeLegacyMcpServers(runtime.commandPath!, \"openclaw\");\n const payload = {\n url: buildMcpUrl(baseUrl),\n transport: \"streamable-http\",\n headers: {\n Authorization: `Bearer ${bearerToken}`,\n },\n };\n await runCommand(runtime.commandPath!, [\n \"mcp\",\n \"set\",\n MCP_SERVER_NAME,\n JSON.stringify(payload),\n ]);\n}\n\n/**\n * 读取 Codex 远程 MCP 配置对象。\n *\n * @param runtime Codex 运行时信息\n * @returns 解析后的配置对象\n */\nasync function readCodexMcpConfigurationRecord(\n runtime: ClientRuntimeState,\n): Promise<{\n url?: string;\n transport?: string;\n} | null> {\n const result = await runCommand(\n runtime.commandPath!,\n [\"mcp\", \"get\", \"--json\", MCP_SERVER_NAME],\n {\n allowFailure: true,\n },\n );\n if (!result.success || !result.stdout.trim()) {\n return null;\n }\n try {\n const parsed = JSON.parse(result.stdout) as {\n url?: string;\n transport?: string | { type?: string };\n };\n const resolvedTransport =\n typeof parsed.transport === \"string\"\n ? parsed.transport\n : parsed.transport?.type;\n return {\n ...(parsed.url !== undefined ? { url: parsed.url } : {}),\n ...(resolvedTransport !== undefined\n ? { transport: resolvedTransport }\n : {}),\n };\n } catch {\n return null;\n }\n}\n\n/**\n * 执行命令行。\n *\n * @param commandPath 可执行文件路径\n * @param args 参数列表\n * @param options 执行选项\n * @returns 执行结果\n */\nasync function runCommand(\n commandPath: string,\n args: string[],\n options?: {\n allowFailure?: boolean;\n },\n): Promise<CommandResult> {\n try {\n const result = await execFileAsync(commandPath, args, {\n env: process.env,\n maxBuffer: 10 * 1024 * 1024,\n });\n return {\n success: true,\n stdout: result.stdout ?? \"\",\n stderr: result.stderr ?? \"\",\n };\n } catch (error) {\n const commandError = error as NodeJS.ErrnoException & {\n stdout?: string;\n stderr?: string;\n code?: number | string;\n };\n if (options?.allowFailure) {\n return {\n success: false,\n stdout: commandError.stdout ?? \"\",\n stderr: commandError.stderr ?? \"\",\n };\n }\n const stderr = commandError.stderr?.trim();\n const stdout = commandError.stdout?.trim();\n const message = stderr || stdout || commandError.message;\n throw new Error(message);\n }\n}\n\n/**\n * 构建远程 MCP URL。\n *\n * @param baseUrl OA 基础地址\n * @returns 远程 MCP URL\n */\nfunction buildMcpUrl(baseUrl: string): string {\n return `${normalizeBaseUrl(baseUrl)}/mcp`;\n}\n\n/**\n * 删除当前和历史 Codex skill 目录。\n *\n * @param skillDirs skill 目录列表\n * @returns 是否删除了至少一个目录\n */\nasync function removeCodexSkillDirs(skillDirs: string[]): Promise<boolean> {\n let removed = false;\n const skillsRoot = path.dirname(skillDirs[0] ?? \"\");\n if (skillsRoot) {\n removed = (await removeRemoteManagedSkills(skillsRoot)) || removed;\n }\n for (const skillDir of skillDirs) {\n if (await directoryExists(skillDir)) {\n await fs.rm(skillDir, {\n recursive: true,\n force: true,\n });\n removed = true;\n }\n }\n return removed;\n}\n\n/**\n * 删除 Claude 指令文件中的 mt-os-cli 托管区块。\n *\n * @param instructionsPath Claude 指令文件路径\n * @returns 是否发生变更\n */\nasync function removeClaudeManagedInstructions(\n instructionsPath: string,\n): Promise<boolean> {\n let current = \"\";\n try {\n current = await fs.readFile(instructionsPath, \"utf8\");\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n\n const next = removeManagedBlock(current);\n if (next === current) {\n return false;\n }\n if (next.trim().length === 0) {\n await fs.rm(instructionsPath, { force: true });\n return true;\n }\n await fs.writeFile(instructionsPath, next, {\n encoding: \"utf8\",\n mode: 0o644,\n });\n return true;\n}\n\n/**\n * 删除 Claude 下由 mt-os-cli 管理的 skills 目录。\n *\n * @param skillsRoot Claude skills 根目录\n * @returns 是否删除了至少一个技能目录\n */\nasync function removeManagedClaudeSkillDirs(\n homeDir?: string,\n): Promise<boolean> {\n let removed = false;\n\n const skillsRoot = path.join(resolveHomeDir(homeDir), CLAUDE_SKILLS_DIR);\n removed = (await removeRemoteManagedSkills(skillsRoot)) || removed;\n const managedDirs = [\n ...resolveManagedClaudeSkillDirs(homeDir),\n ...resolveUninstallFallbackSkillDirs(skillsRoot),\n ];\n\n for (const managedDir of managedDirs) {\n if (await directoryExists(managedDir)) {\n await fs.rm(managedDir, {\n recursive: true,\n force: true,\n });\n removed = true;\n }\n }\n\n return removed;\n}\n\n/**\n * 删除 OpenClaw 下由 mt-os-cli 管理的 skills 目录。\n *\n * @param homeDir 自定义 home 目录\n * @returns 是否删除了至少一个技能目录\n */\nasync function removeOpenClawSkillDirs(homeDir?: string): Promise<boolean> {\n let removed = false;\n const skillsRoot = path.join(resolveHomeDir(homeDir), \".openclaw\", \"skills\");\n removed = (await removeRemoteManagedSkills(skillsRoot)) || removed;\n const managedDirs = [\n ...resolveManagedOpenClawSkillDirs(homeDir),\n ...resolveUninstallFallbackSkillDirs(skillsRoot),\n ];\n for (const managedDir of managedDirs) {\n if (await directoryExists(managedDir)) {\n await fs.rm(managedDir, {\n recursive: true,\n force: true,\n });\n removed = true;\n }\n }\n return removed;\n}\n\n/**\n * 清理客户端中遗留的旧 MCP 服务名。\n *\n * @param runtimes 客户端运行时信息\n */\nasync function cleanupLegacyClientConfigurations(\n runtimes: Record<ClientTarget, ClientRuntimeState>,\n): Promise<void> {\n await Promise.all([\n runtimes.codex.commandPath\n ? removeLegacyMcpServers(runtimes.codex.commandPath, \"codex\")\n : Promise.resolve(),\n runtimes.claude.commandPath\n ? removeLegacyMcpServers(runtimes.claude.commandPath, \"claude\")\n : Promise.resolve(),\n runtimes.openclaw.commandPath\n ? removeLegacyMcpServers(runtimes.openclaw.commandPath, \"openclaw\")\n : Promise.resolve(),\n ]);\n}\n\n/**\n * 删除历史 MCP 服务名。\n *\n * @param commandPath 客户端命令路径\n * @param clientType 客户端类型\n */\nasync function removeLegacyMcpServers(\n commandPath: string,\n clientType: \"codex\" | \"claude\" | \"openclaw\",\n): Promise<void> {\n void commandPath;\n void clientType;\n}\n\n/**\n * 删除目录(如果存在)。\n *\n * @param directoryPath 目录路径\n * @returns 是否删除\n */\nasync function removeDirectoryIfExists(\n directoryPath: string | undefined,\n): Promise<boolean> {\n if (!directoryPath) {\n return false;\n }\n if (!(await directoryExists(directoryPath))) {\n return false;\n }\n await fs.rm(directoryPath, {\n recursive: true,\n force: true,\n });\n return true;\n}\n\n/**\n * 删除服务端远程清单写入过的 skill 文件和状态文件。\n *\n * <p>远程 skill 可能是 `agent-shared`、`tool-index` 等业务目录,\n * 它们不属于单一本地 bootstrap 目录。卸载时必须读取状态文件逐个清理,否则 Codex、\n * Claude、OpenClaw 会继续看到历史业务 skill。</p>\n *\n * @param skillsRoot 客户端 skills 根目录\n * @returns 是否删除了至少一个文件或目录\n */\nasync function removeRemoteManagedSkills(skillsRoot: string): Promise<boolean> {\n let removed = false;\n for (const stateFileName of [REMOTE_SKILL_STATE_FILE]) {\n const statePath = path.join(skillsRoot, stateFileName);\n const state = await readRemoteSkillStateFile(statePath);\n for (const relativeFilePath of state.files) {\n const absoluteFilePath = path.join(skillsRoot, relativeFilePath);\n if (await fileExists(absoluteFilePath)) {\n await removeExternalSkillFile(skillsRoot, relativeFilePath);\n removed = true;\n }\n }\n if (await fileExists(statePath)) {\n await fs.rm(statePath, { force: true });\n removed = true;\n }\n }\n return removed;\n}\n\n/**\n * 读取指定路径的远程 skill 同步状态文件。\n *\n * @param statePath 状态文件绝对路径\n * @returns 同步状态\n */\nasync function readRemoteSkillStateFile(statePath: string): Promise<RemoteSkillState> {\n try {\n const content = await fs.readFile(statePath, \"utf8\");\n const rawState = JSON.parse(content) as Partial<RemoteSkillState>;\n const files = Array.isArray(rawState.files)\n ? rawState.files.flatMap((filePath) => normalizeStateFilePath(filePath))\n : [];\n return { files };\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n return { files: [] };\n }\n return { files: [] };\n }\n}\n\n/**\n * 解析可选基础地址。\n *\n * @param baseUrl 原始基础地址\n * @returns 合法地址或 undefined\n */\nfunction resolveOptionalBaseUrl(baseUrl?: string): string | undefined {\n if (!baseUrl) {\n return undefined;\n }\n return normalizeBaseUrl(baseUrl);\n}\n\n/**\n * 检查 Claude managed skills 是否已完整安装。\n *\n * @param homeDir 自定义 home 目录\n * @returns 是否全部存在\n */\nasync function inspectClaudeSkillsInstalled(homeDir?: string): Promise<boolean> {\n const skillDirs = resolveManagedClaudeSkillDirs(homeDir);\n const skillFiles = skillDirs.map((skillDir) => path.join(skillDir, CODEX_SKILL_FILE));\n const results = await Promise.all(skillFiles.map((skillFile) => fileExists(skillFile)));\n return results.every(Boolean);\n}\n\n/**\n * 检查 OpenClaw managed skills 是否已完整安装。\n *\n * @param homeDir 自定义 home 目录\n * @returns 是否全部存在\n */\nasync function inspectOpenClawSkillsInstalled(homeDir?: string): Promise<boolean> {\n const skillDirs = resolveManagedOpenClawSkillDirs(homeDir);\n const skillFiles = skillDirs.map((skillDir) => path.join(skillDir, CODEX_SKILL_FILE));\n const results = await Promise.all(skillFiles.map((skillFile) => fileExists(skillFile)));\n return results.every(Boolean);\n}\n\n/**\n * 判断文件是否存在。\n *\n * @param filePath 文件路径\n * @returns 是否存在\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 同步一个受管的 skill 目录。\n *\n * @param sourceDir 模板目录\n * @param targetDir 目标目录\n * @returns 是否发生写入\n */\nasync function syncManagedSkillDirectory(\n sourceDir: string,\n targetDir: string,\n): Promise<boolean> {\n let changed = false;\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n if (entry.isDirectory()) {\n const childChanged = await syncManagedSkillDirectory(sourcePath, targetPath);\n if (childChanged) {\n changed = true;\n }\n continue;\n }\n const content = await fs.readFile(sourcePath, \"utf8\");\n const wrote = await writeIfChanged(targetPath, content, 0o644);\n if (wrote) {\n changed = true;\n }\n }\n return changed;\n}\n\n/**\n * 解析旧版本写入过的 skill 目录。\n *\n * @param skillsRoot 客户端 skills 根目录\n * @returns 旧目录列表\n */\nfunction resolveLegacySkillDirs(skillsRoot: string): string[] {\n return LEGACY_SKILL_NAMES.map((skillName) => path.join(skillsRoot, skillName));\n}\n\n/**\n * 解析卸载时需要兜底删除的 skill 目录。\n *\n * @param skillsRoot 客户端 skills 根目录\n * @returns 卸载兜底目录列表\n */\nfunction resolveUninstallFallbackSkillDirs(skillsRoot: string): string[] {\n return [...LEGACY_SKILL_NAMES, ...UNINSTALL_FALLBACK_SKILL_NAMES].map(\n (skillName) => path.join(skillsRoot, skillName),\n );\n}\n\n/**\n * 删除旧版本写入过的业务 skill 目录。\n *\n * @param skillsRoot 客户端 skills 根目录\n * @returns 是否删除了至少一个目录\n */\nasync function removeLegacySkillDirs(skillsRoot: string): Promise<boolean> {\n let removed = false;\n for (const skillDir of resolveLegacySkillDirs(skillsRoot)) {\n if (await directoryExists(skillDir)) {\n await fs.rm(skillDir, {\n recursive: true,\n force: true,\n });\n removed = true;\n }\n }\n return removed;\n}\n\n/**\n * 删除远程清单已经不再声明的历史 skill 文件。\n *\n * <p>清理来源有两类:第一类是上一次同步状态文件里记录过、但本次清单不存在的文件;\n * 第二类是本次清单管辖的顶层目录里残留的旧文件。后者用于兼容旧版本 CLI 没有写\n * 状态文件的场景,避免服务端把 `reference.md` 改成 `SKILL.md` 后本地同时残留两个\n * markdown 文件。</p>\n *\n * @param skillsRoot 客户端 skills 根目录\n * @param desiredPaths 本次远程清单声明的目标文件路径\n */\nasync function removeStaleExternalSkillFiles(\n skillsRoot: string,\n desiredPaths: Set<string>,\n): Promise<void> {\n const previousState = await readRemoteSkillState(skillsRoot);\n for (const previousPath of previousState.files) {\n if (!desiredPaths.has(previousPath)) {\n await removeExternalSkillFile(skillsRoot, previousPath);\n }\n }\n\n for (const topDir of resolveRemoteSkillTopDirs(desiredPaths)) {\n const topDirPath = path.join(skillsRoot, topDir);\n const existingFiles = await listFilesRecursively(topDirPath);\n for (const existingFile of existingFiles) {\n const relativePath = toPosixRelativePath(skillsRoot, existingFile);\n if (!desiredPaths.has(relativePath)) {\n await removeExternalSkillFile(skillsRoot, relativePath);\n }\n }\n }\n}\n\n/**\n * 读取上一次远程 skill 同步状态。\n *\n * @param skillsRoot 客户端 skills 根目录\n * @returns 同步状态\n */\nasync function readRemoteSkillState(skillsRoot: string): Promise<RemoteSkillState> {\n try {\n const content = await fs.readFile(\n path.join(skillsRoot, REMOTE_SKILL_STATE_FILE),\n \"utf8\",\n );\n const rawState = JSON.parse(content) as Partial<RemoteSkillState>;\n const files = Array.isArray(rawState.files)\n ? rawState.files.flatMap((filePath) => normalizeStateFilePath(filePath))\n : [];\n return { files };\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n return { files: [] };\n }\n return { files: [] };\n }\n}\n\n/**\n * 写入本次远程 skill 同步状态。\n *\n * @param skillsRoot 客户端 skills 根目录\n * @param desiredPaths 本次清单声明的文件路径\n */\nasync function writeRemoteSkillState(\n skillsRoot: string,\n desiredPaths: Set<string>,\n): Promise<void> {\n const state: RemoteSkillState = {\n files: Array.from(desiredPaths).sort(),\n };\n await writeIfChanged(\n path.join(skillsRoot, REMOTE_SKILL_STATE_FILE),\n `${JSON.stringify(state, null, 2)}\\n`,\n 0o644,\n );\n}\n\n/**\n * 从状态文件中读取并校验历史路径。\n *\n * @param filePath 状态文件中的原始路径\n * @returns 安全路径列表,非法路径直接丢弃\n */\nfunction normalizeStateFilePath(filePath: unknown): string[] {\n if (typeof filePath !== \"string\") {\n return [];\n }\n try {\n return [normalizeExternalSkillPath(filePath)];\n } catch {\n return [];\n }\n}\n\n/**\n * 解析本次远程清单涉及的顶层 skill 目录。\n *\n * @param desiredPaths 本次清单声明的文件路径\n * @returns 顶层目录名\n */\nfunction resolveRemoteSkillTopDirs(desiredPaths: Set<string>): string[] {\n const topDirs = new Set<string>();\n for (const desiredPath of desiredPaths) {\n const [topDir, ...restParts] = desiredPath.split(\"/\");\n if (topDir && restParts.length > 0) {\n topDirs.add(topDir);\n }\n }\n return Array.from(topDirs).sort();\n}\n\n/**\n * 递归列出目录下所有普通文件。\n *\n * @param directoryPath 目录路径\n * @returns 文件绝对路径列表\n */\nasync function listFilesRecursively(directoryPath: string): Promise<string[]> {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(directoryPath, { withFileTypes: true });\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const files: string[] = [];\n for (const entry of entries) {\n const entryPath = path.join(directoryPath, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listFilesRecursively(entryPath)));\n continue;\n }\n if (entry.isFile()) {\n files.push(entryPath);\n }\n }\n return files;\n}\n\n/**\n * 删除一个由远程清单管理的历史文件,并顺手清理空父目录。\n *\n * @param skillsRoot 客户端 skills 根目录\n * @param relativePath 文件相对路径\n */\nasync function removeExternalSkillFile(\n skillsRoot: string,\n relativePath: string,\n): Promise<void> {\n const safePath = normalizeExternalSkillPath(relativePath);\n const absolutePath = path.join(skillsRoot, safePath);\n await fs.rm(absolutePath, { force: true });\n await removeEmptyParentDirs(skillsRoot, path.dirname(safePath));\n}\n\n/**\n * 清理删除文件后留下的空目录。\n *\n * @param rootDir 停止清理的根目录\n * @param relativeDir 从根目录开始的相对目录\n */\nasync function removeEmptyParentDirs(\n rootDir: string,\n relativeDir: string,\n): Promise<void> {\n const rootPath = path.resolve(rootDir);\n let currentPath = path.resolve(rootDir, relativeDir);\n while (currentPath.startsWith(`${rootPath}${path.sep}`)) {\n try {\n await fs.rmdir(currentPath);\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (\n nodeError.code === \"ENOENT\" ||\n nodeError.code === \"ENOTEMPTY\" ||\n nodeError.code === \"EEXIST\"\n ) {\n return;\n }\n throw error;\n }\n currentPath = path.dirname(currentPath);\n }\n}\n\n/**\n * 转换为 POSIX 风格相对路径,和服务端清单路径格式保持一致。\n *\n * @param rootDir 根目录\n * @param absolutePath 文件绝对路径\n * @returns POSIX 相对路径\n */\nfunction toPosixRelativePath(rootDir: string, absolutePath: string): string {\n return path.relative(rootDir, absolutePath).split(path.sep).join(\"/\");\n}\n\n/**\n * 判断目录是否存在。\n *\n * @param directoryPath 目录路径\n * @returns 是否存在\n */\nasync function directoryExists(directoryPath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(directoryPath);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * 确保目录存在。\n *\n * @param filePath 目标文件路径\n */\nasync function ensureDir(filePath: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n}\n\n/**\n * 内容发生变化时才写文件。\n *\n * @param filePath 目标文件\n * @param content 目标内容\n * @param mode 文件权限\n * @returns 是否写入\n */\nasync function writeIfChanged(\n filePath: string,\n content: string,\n mode?: number,\n): Promise<boolean> {\n let current = \"\";\n try {\n current = await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code !== \"ENOENT\") {\n throw error;\n }\n }\n\n if (current === content) {\n return false;\n }\n\n await ensureDir(filePath);\n await fs.writeFile(filePath, content, {\n encoding: \"utf8\",\n mode,\n });\n return true;\n}\n\n/**\n * 在 PATH 中查找可执行文件。\n *\n * @param command 命令名称\n * @returns 可执行文件绝对路径\n */\nasync function findExecutable(command: string): Promise<string | null> {\n const pathValue = process.env.PATH;\n if (!pathValue) {\n return null;\n }\n\n const directories = pathValue.split(path.delimiter).filter(Boolean);\n const extensions =\n process.platform === \"win32\"\n ? (process.env.PATHEXT ?? \".EXE;.CMD;.BAT\")\n .split(\";\")\n .filter(Boolean)\n : [\"\"];\n\n for (const directory of directories) {\n for (const extension of extensions) {\n const candidate = path.join(\n directory,\n process.platform === \"win32\" ? `${command}${extension}` : command,\n );\n try {\n await fs.access(candidate, fs.constants.X_OK);\n return candidate;\n } catch {\n // ignore\n }\n }\n }\n return null;\n}\n","import { Command } from \"commander\";\n\nimport {\n describeInstallTargets,\n expandInstallTargets,\n installAll,\n installExternalSkillFiles,\n logoutClients,\n parseInstallTargets,\n resolveRequestedClients,\n uninstallLocalAssets,\n type ClientTarget,\n} from \"../install/install.js\";\nimport {\n colorize,\n printField,\n printSection,\n resolveCommandConfig,\n type CommandContext,\n} from \"../cli/context.js\";\nimport { MtOsApiClient } from \"../http/api-client.js\";\nimport type { SessionRecord } from \"../session/store.js\";\n\n/**\n * 注册安装和卸载命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerInstallCommands(\n program: Command,\n context: CommandContext,\n): void {\n program\n .command(\"install\")\n .description(\"Repair local skill/instructions only\")\n .argument(\"[targets...]\", \"Skill targets to install: all, codex, claude, openclaw\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--mcp-base-url <url>\", \"MTOS MCP server base URL\")\n .action(\n async (\n targets: string[],\n options: {\n env?: string;\n environment?: string;\n baseUrl?: string;\n mcpBaseUrl?: string;\n },\n ) => {\n await runInstall(targets, context, options);\n },\n );\n\n program\n .command(\"uninstall\")\n .description(\n \"Remove local mt-os-cli assets, session, and client MCP configuration\",\n )\n .action(async () => {\n await runUninstall(context);\n });\n}\n\n/**\n * 手动修复安装本地 skill 和指令模板。\n *\n * @param targetArgs 客户端目标\n * @param context 命令上下文\n * @param options 环境选项\n */\nasync function runInstall(\n targetArgs: string[],\n context: CommandContext,\n options?: {\n env?: string;\n environment?: string;\n baseUrl?: string;\n mcpBaseUrl?: string;\n },\n): Promise<void> {\n const sessionStore = context.sessionStore;\n const requestedTargets = expandInstallTargets(parseInstallTargets(targetArgs));\n const resolved = await resolveCommandConfig(sessionStore, options);\n const config = resolved.config;\n\n await installAll();\n await syncRemoteSkills(\n requestedTargets,\n context,\n resolved.baseUrl,\n (message) => console.log(message),\n );\n\n console.log(`install: skills`);\n console.log(`requested_targets: ${describeInstallTargets(requestedTargets)}`);\n console.log(`environment: ${config.environment ?? \"(not set)\"}`);\n console.log(\"codex_skill: installed\");\n console.log(\"claude_skill: installed\");\n console.log(\"openclaw_skill: installed\");\n console.log(\"mcp_next_step: 如需安装 MCP 服务,请单独执行 mt-os-cli mcp install\");\n}\n\n/**\n * 登录完成后同步本地 skill。\n *\n * @param targetArgs 保留的目标参数,目前默认登录不再自动写入 MCP\n * @param session 登录会话\n * @param context 命令上下文\n * @param mcpBaseUrl MCP 基础地址,默认登录流程不使用\n * @param reporter 进度输出\n * @returns 同步结果\n */\nexport async function syncAfterLogin(\n targetArgs: string[],\n session: SessionRecord,\n context: CommandContext,\n mcpBaseUrl: string | undefined,\n reporter: (message: string) => void,\n): Promise<{\n selected: ClientTarget[];\n appliedTargets: ClientTarget[];\n skippedMessages: string[];\n}> {\n reporter(\"local_assets: 正在安装本地 skill 和指令模板\");\n const selected = targetArgs.length > 0\n ? expandInstallTargets(parseInstallTargets(targetArgs))\n : expandInstallTargets([\"all\"]);\n await installAll();\n await syncRemoteSkills(selected, context, session.baseUrl, reporter);\n if (targetArgs.length > 0 || mcpBaseUrl) {\n reporter(\"mcp_sync_skipped: 默认登录不再自动安装 MCP,请执行 mt-os-cli mcp install\");\n }\n return {\n selected,\n appliedTargets: [],\n skippedMessages: [],\n };\n}\n\n/**\n * 从服务端同步动态 skill 清单。\n *\n * <p>本地 npm 包只保留 bootstrap,业务说明来自服务端模块贡献的 manifest。\n * 这里失败时只降级到 bootstrap,不阻断登录或本地修复安装。</p>\n *\n * @param targets 客户端目标\n * @param context 命令上下文\n * @param baseUrl 服务端基础地址\n * @param reporter 进度输出\n */\nasync function syncRemoteSkills(\n targets: ClientTarget[],\n context: CommandContext,\n baseUrl: string | undefined,\n reporter: (message: string) => void,\n): Promise<void> {\n if (!baseUrl) {\n reporter(\"remote_skills: skipped (missing base url)\");\n return;\n }\n try {\n const client = new MtOsApiClient({\n sessionStore: context.sessionStore,\n });\n const manifest = await client.getCliSkillManifest(baseUrl);\n const resultList = await installExternalSkillFiles(manifest.files ?? [], targets);\n reporter(`remote_skills: updated ${manifest.version ?? \"(unknown)\"}`);\n for (const result of resultList) {\n reporter(`${result.target}_remote_files: ${result.writtenFiles}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n reporter(`remote_skills: skipped (${message})`);\n }\n}\n\n/**\n * 退出本地会话和客户端登录。\n *\n * @param targetArgs 客户端目标\n * @param context 命令上下文\n */\nexport async function runLogout(\n targetArgs: string[],\n context: CommandContext,\n): Promise<void> {\n const sessionStore = context.sessionStore;\n const targets = parseInstallTargets(targetArgs);\n const selected = await resolveRequestedClients(targets);\n await sessionStore.clearSession();\n const logoutResult = await logoutClients(selected);\n console.log(\"local_session: cleared\");\n if (logoutResult.appliedTargets.length > 0) {\n console.log(\n `client_logout: ${describeInstallTargets(logoutResult.appliedTargets)}`,\n );\n }\n for (const skippedMessage of logoutResult.skippedMessages) {\n console.log(`skip: ${skippedMessage}`);\n }\n}\n\n/**\n * 清理本机登录态、客户端授权配置和本地安装资产。\n *\n * <p>这里是 `mt-os-cli uninstall` 的真实卸载入口,单独抽出来是为了让测试能覆盖\n * Keychain session 与文件资产的组合清理,避免以后只删文件不删登录态。</p>\n *\n * @param context 命令上下文\n * @param options 卸载选项,测试可传入临时 home 目录\n * @returns 客户端登出结果和本地资产卸载结果\n */\nexport async function clearLocalInstallState(\n context: CommandContext,\n options?: {\n homeDir?: string;\n },\n): Promise<{\n logoutResult: Awaited<ReturnType<typeof logoutClients>>;\n uninstallResult: Awaited<ReturnType<typeof uninstallLocalAssets>>;\n}> {\n const sessionStore = context.sessionStore;\n const selected = await resolveRequestedClients([\"all\"]);\n await sessionStore.clearSession();\n const uninstallOptions = {\n configDir: sessionStore.configDir,\n ...(options?.homeDir ? { homeDir: options.homeDir } : {}),\n };\n const [logoutResult, uninstallResult] = await Promise.all([\n logoutClients(selected),\n uninstallLocalAssets(uninstallOptions),\n ]);\n return {\n logoutResult,\n uninstallResult,\n };\n}\n\n/**\n * 完整卸载本地资产。\n *\n * @param context 命令上下文\n */\nasync function runUninstall(context: CommandContext): Promise<void> {\n const { logoutResult, uninstallResult } = await clearLocalInstallState(context);\n\n console.log(\"local_session: cleared\");\n if (logoutResult.appliedTargets.length > 0) {\n console.log(\n `client_logout: ${describeInstallTargets(logoutResult.appliedTargets)}`,\n );\n }\n printSection(\"Uninstall\", \"1;31\");\n printField(\n \"removed_codex_skill\",\n uninstallResult.removedCodexSkill\n ? colorize(\"yes\", \"1;32\")\n : colorize(\"no\", \"1;33\"),\n );\n printField(\n \"removed_claude_instructions\",\n uninstallResult.removedClaudeInstructions\n ? colorize(\"yes\", \"1;32\")\n : colorize(\"no\", \"1;33\"),\n );\n printField(\n \"removed_claude_skills\",\n uninstallResult.removedClaudeSkills\n ? colorize(\"yes\", \"1;32\")\n : colorize(\"no\", \"1;33\"),\n );\n printField(\n \"removed_openclaw_skills\",\n uninstallResult.removedOpenClawSkills\n ? colorize(\"yes\", \"1;32\")\n : colorize(\"no\", \"1;33\"),\n );\n printField(\n \"removed_config_dir\",\n uninstallResult.removedConfigDir\n ? colorize(\"yes\", \"1;32\")\n : colorize(\"no\", \"1;33\"),\n );\n printField(\n \"npm_uninstall_hint\",\n \"如需彻底移除全局命令,请再执行 npm uninstall -g @meritsandtree/mt-os-cli\",\n );\n for (const skippedMessage of logoutResult.skippedMessages) {\n console.log(`skip: ${skippedMessage}`);\n }\n}\n","import { Command } from \"commander\";\n\nimport {\n createLoginDeviceAuthorization,\n pollLoginDeviceAuthorization,\n runLogin,\n} from \"../auth/login.js\";\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { MtOsApiClient } from \"../http/api-client.js\";\nimport { describeInstallTargets } from \"../install/install.js\";\nimport {\n CliExitError,\n writeData,\n} from \"../output/cli-output.js\";\nimport {\n parseInteger,\n resolveApiCommandContext,\n resolveCommandConfig,\n resolveOutputOptions,\n type ApiTargetOptions,\n type CommandContext,\n type FormattedOutputOptions,\n type LoginCommandOptions,\n} from \"../cli/context.js\";\nimport type { SessionRecord } from \"../session/store.js\";\nimport { runLogout, syncAfterLogin } from \"./install.js\";\n\nconst DEFAULT_DEVICE_TYPE = \"web\";\nconst DEFAULT_TERMINAL_TYPE = \"B\";\n\n/**\n * 认证状态类命令参数。\n */\ninterface AuthCommandOptions extends FormattedOutputOptions, ApiTargetOptions {}\n\n/**\n * 导入已有 token 的命令参数。\n */\ninterface AuthTokenCommandOptions extends AuthCommandOptions {\n token: string;\n deviceType?: string;\n}\n\n/**\n * 注册认证命令组。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerAuthCommand(\n program: Command,\n context: CommandContext,\n): void {\n const auth = program\n .command(\"auth\")\n .description(\"Manage MTOS authentication for CLI clients\");\n\n auth\n .command(\"login\")\n .description(\"Login to MTOS with account/password or legacy device authorization\")\n .argument(\"[targets...]\", \"Reserved; login no longer installs MCP by default\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--mcp-base-url <url>\", \"MTOS MCP server base URL\")\n .option(\"--username <username>\", \"MTOS login username, phone, or email\")\n .option(\"--password <password>\", \"MTOS login password\")\n .option(\"--terminal-type <type>\", \"MTOS terminal type, defaults to B\")\n .option(\"--timeout-ms <ms>\", \"Device authorization wait timeout\", parseInteger)\n .option(\"--json\", \"Print final result as JSON\")\n .option(\"--no-wait\", \"Create device authorization and print JSON only\")\n .option(\"--device-code <deviceCode>\", \"Poll an existing device code\")\n .action(async (targets: string[], options: LoginCommandOptions) => {\n await runAuthLoginCommand(targets, context, options);\n });\n\n auth\n .command(\"token\")\n .description(\"Import an existing MTOS token\")\n .requiredOption(\"--token <token>\", \"Existing token value\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--device-type <deviceType>\", \"Device type sent to Law APIs\", DEFAULT_DEVICE_TYPE)\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (options: AuthTokenCommandOptions) => {\n await runAuthToken(context, options);\n });\n\n auth\n .command(\"status\")\n .description(\"Print local login state and token validity\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (options: AuthCommandOptions) => {\n await runAuthStatus(context, options);\n });\n\n auth\n .command(\"check\")\n .description(\"Validate current token and fail when login is missing\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (options: AuthCommandOptions) => {\n await runAuthCheck(context, options);\n });\n\n auth\n .command(\"whoami\")\n .description(\"Print current MTOS user and tenant information\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (options: AuthCommandOptions) => {\n await runAuthWhoami(context, options);\n });\n\n auth\n .command(\"list\")\n .description(\"List local MTOS authentication sessions\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (options: AuthCommandOptions) => {\n await runAuthList(context, options);\n });\n\n auth\n .command(\"refresh\")\n .description(\"Refresh current token\")\n .argument(\"[targets...]\", \"Reserved; use mt-os-cli mcp install to resync MCP\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (targets: string[], options: AuthCommandOptions) => {\n await runAuthRefresh(targets, context, options);\n });\n\n auth\n .command(\"logout\")\n .description(\"Clear local session and explicit client MCP bearer headers\")\n .argument(\"[targets...]\", \"Targets to logout: all, codex, claude, openclaw\")\n .action(async (targets: string[]) => {\n await runLogout(targets, context);\n });\n}\n\n/**\n * 执行设备授权登录。\n *\n * <p>Agent 场景优先使用 `--no-wait --json` 生成授权链接,再把 `device_code`\n * 交回同一个命令轮询。这样 Codex、OpenClaw、Claude Code 等宿主都不依赖浏览器\n * callback,也不会把 CLI 终端变成 OAuth 回调入口。\n *\n * @param targetArgs 登录成功后要同步的客户端目标\n * @param context 命令上下文\n * @param options 登录选项\n */\nasync function runAuthLoginCommand(\n targetArgs: string[],\n context: CommandContext,\n options: LoginCommandOptions,\n): Promise<void> {\n if (options.username || options.password) {\n await runPasswordLogin(context, options);\n return;\n }\n\n const sessionStore = context.sessionStore;\n const resolved = await resolveCommandConfig(sessionStore, options);\n const progress = (message: string) => {\n if (options.json || options.noWait) {\n console.error(message);\n return;\n }\n console.log(message);\n };\n\n if (options.noWait) {\n const result = await createLoginDeviceAuthorization(\n {\n ...options,\n ...(resolved.baseUrl ? { baseUrl: resolved.baseUrl } : {}),\n onProgress: progress,\n },\n sessionStore,\n );\n writeData(\n {\n verification_url: result.auth.verificationUriComplete,\n verification_uri: result.auth.verificationUri,\n user_code: result.auth.userCode,\n device_code: result.auth.deviceCode,\n expires_in: result.auth.expiresIn,\n interval: result.auth.interval,\n hint: `Show verification_url to the user exactly as returned by mt-os-cli. Then run: mt-os-cli auth login --device-code ${result.auth.deviceCode}`,\n },\n {\n format: \"json\",\n envelope: false,\n },\n );\n return;\n }\n\n const session = options.deviceCode\n ? await pollLoginDeviceAuthorization(\n {\n ...options,\n ...(resolved.baseUrl ? { baseUrl: resolved.baseUrl } : {}),\n onProgress: progress,\n },\n sessionStore,\n options.deviceCode,\n )\n : await runLogin(\n {\n ...options,\n ...(resolved.baseUrl ? { baseUrl: resolved.baseUrl } : {}),\n onProgress: progress,\n },\n sessionStore,\n );\n\n const currentConfig = await sessionStore.getConfig();\n if (resolved.mcpBaseUrl) {\n await sessionStore.saveConfig({\n ...currentConfig,\n mcpBaseUrl: resolved.mcpBaseUrl,\n });\n }\n const syncResult = await syncAfterLogin(\n targetArgs,\n session,\n context,\n resolved.mcpBaseUrl,\n progress,\n );\n const latestConfig = await sessionStore.getConfig();\n const data = {\n event: \"login_success\",\n environment:\n latestConfig.environment ?? getDefaultEnvironmentPreset().name,\n userId: session.userId,\n userName: session.userName,\n siteId: session.siteId,\n localAssets: \"installed\",\n mcpSync: \"skipped\",\n clientSync: syncResult.appliedTargets,\n skipped: syncResult.skippedMessages,\n restartHint:\n \"如果你需要 MCP,请单独执行 mt-os-cli mcp install;仅使用 HTTP CLI 时不需要安装 MCP。\",\n };\n if (options.json) {\n writeData(data, { format: \"json\" });\n return;\n }\n console.log(`environment: ${data.environment}`);\n console.log(\n `Logged in as ${session.userName ?? session.userId} on site ${session.siteId ?? \"unknown\"}.`,\n );\n console.log(\"local_assets: installed\");\n console.log(`mcp_sync: ${data.mcpSync}`);\n console.log(`next_step: ${data.restartHint}`);\n if (syncResult.appliedTargets.length > 0) {\n console.log(\n `client_sync: ${describeInstallTargets(syncResult.appliedTargets)}`,\n );\n }\n for (const skippedMessage of syncResult.skippedMessages) {\n console.log(`skip: ${skippedMessage}`);\n }\n}\n\n/**\n * 使用 Law 用户中心账号密码登录并保存本地会话。\n *\n * @param context 命令上下文\n * @param options 登录选项\n */\nasync function runPasswordLogin(\n context: CommandContext,\n options: LoginCommandOptions,\n): Promise<void> {\n if (!options.username || !options.password) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"Username and password must be provided together.\",\n hint: \"Use: mt-os-cli auth login --username <username> --password <password>\",\n });\n }\n const resolved = await resolveCommandConfig(context.sessionStore, options);\n const baseUrl =\n resolved.baseUrl ?? resolved.config.baseUrl ?? getDefaultEnvironmentPreset().baseUrl;\n const client = new MtOsApiClient({\n sessionStore: context.sessionStore,\n deviceType: DEFAULT_DEVICE_TYPE,\n });\n const loginVO = await client.loginWithPassword(baseUrl, {\n userName: options.username,\n password: options.password,\n terminalType: options.terminalType ?? DEFAULT_TERMINAL_TYPE,\n });\n const session = await saveLoginSessionFromVO(\n context,\n baseUrl,\n loginVO,\n DEFAULT_DEVICE_TYPE,\n );\n const data = {\n event: \"login_success\",\n environment: resolved.config.environment ?? getDefaultEnvironmentPreset().name,\n userId: session.userId,\n userName: session.userName,\n siteId: session.siteId,\n baseUrl: session.baseUrl,\n };\n if (options.json) {\n writeData(data, { format: \"json\" });\n return;\n }\n console.log(`environment: ${data.environment}`);\n console.log(\n `Logged in as ${session.userName ?? session.userId} on site ${session.siteId ?? \"unknown\"}.`,\n );\n}\n\n/**\n * 导入已有 token,并通过 token/check 补齐当前用户信息。\n *\n * @param context 命令上下文\n * @param options 导入参数\n */\nasync function runAuthToken(\n context: CommandContext,\n options: AuthTokenCommandOptions,\n): Promise<void> {\n const resolved = await resolveCommandConfig(context.sessionStore, options);\n const baseUrl =\n resolved.baseUrl ?? resolved.config.baseUrl ?? getDefaultEnvironmentPreset().baseUrl;\n const deviceType = options.deviceType ?? DEFAULT_DEVICE_TYPE;\n const client = new MtOsApiClient({\n sessionStore: context.sessionStore,\n deviceType,\n });\n const tokenUser = await client.checkToken(baseUrl, options.token);\n const session: SessionRecord = {\n baseUrl,\n token: options.token,\n refreshToken: options.token,\n deviceType,\n updatedAt: new Date().toISOString(),\n };\n if (tokenUser.siteId !== undefined) {\n session.siteId = tokenUser.siteId;\n }\n if (tokenUser.userId !== undefined) {\n session.userId = tokenUser.userId;\n }\n const userName = tokenUser.name ?? tokenUser.userName;\n if (userName !== undefined) {\n session.userName = userName;\n }\n await saveSession(context, session);\n writeData(\n {\n imported: true,\n tokenValid: true,\n userId: session.userId,\n userName: session.userName,\n siteId: session.siteId,\n baseUrl: session.baseUrl,\n deviceType: session.deviceType,\n },\n resolveOutputOptions(options),\n );\n}\n\n/**\n * 把登录接口返回转换为本地会话。\n *\n * @param context 命令上下文\n * @param baseUrl 服务基础地址\n * @param loginVO 登录返回\n * @param deviceType 后续调用发送的设备类型\n * @returns 本地会话\n */\nasync function saveLoginSessionFromVO(\n context: CommandContext,\n baseUrl: string,\n loginVO: import(\"../types.js\").UserLoginVO,\n deviceType: string,\n): Promise<SessionRecord> {\n const tokenDTO = loginVO.jwtTokenDTO;\n if (!tokenDTO?.token) {\n throw new Error(\"Login succeeded but token payload is incomplete.\");\n }\n const session: SessionRecord = {\n baseUrl,\n token: tokenDTO.token,\n refreshToken: tokenDTO.refreshToken ?? tokenDTO.token,\n deviceType,\n updatedAt: new Date().toISOString(),\n };\n if (loginVO.siteId !== undefined) {\n session.siteId = loginVO.siteId;\n }\n if (loginVO.userVO?.id !== undefined) {\n session.userId = loginVO.userVO.id;\n }\n const userName = loginVO.userVO?.name ?? loginVO.userVO?.userName;\n if (userName !== undefined) {\n session.userName = userName;\n }\n if (tokenDTO.tokenExpireTime !== undefined) {\n session.tokenExpireTime = tokenDTO.tokenExpireTime;\n }\n if (tokenDTO.refreshTokenExpireTime !== undefined) {\n session.refreshTokenExpireTime = tokenDTO.refreshTokenExpireTime;\n }\n await saveSession(context, session);\n return session;\n}\n\n/**\n * 保存本地会话和默认站点配置。\n *\n * @param context 命令上下文\n * @param session 本地会话\n */\nasync function saveSession(\n context: CommandContext,\n session: SessionRecord,\n): Promise<void> {\n const config = await context.sessionStore.getConfig();\n await context.sessionStore.saveConfig({\n ...config,\n baseUrl: session.baseUrl,\n ...(session.siteId ? { defaultSiteId: session.siteId } : {}),\n });\n await context.sessionStore.saveSession(session);\n}\n\n/**\n * 输出当前登录状态。\n *\n * @param context 命令上下文\n * @param options 输出选项\n */\nasync function runAuthStatus(\n context: CommandContext,\n options: AuthCommandOptions,\n): Promise<void> {\n const sessionStore = context.sessionStore;\n const config = (await resolveCommandConfig(sessionStore, options)).config;\n const session = await sessionStore.getSession();\n if (!session) {\n writeData(\n {\n loggedIn: false,\n environment: config.environment ?? getDefaultEnvironmentPreset().name,\n hint: \"run `mt-os-cli auth login --username <username> --password <password>`\",\n },\n resolveOutputOptions(options),\n );\n return;\n }\n const client = new MtOsApiClient({ sessionStore });\n const baseUrl = await resolveAuthBaseUrl(context, options);\n try {\n const tokenUser = await client.checkToken(baseUrl, session.token);\n writeData(\n {\n loggedIn: true,\n tokenValid: true,\n userId: session.userId ?? tokenUser.userId,\n userName: session.userName ?? tokenUser.name ?? tokenUser.userName,\n siteId: session.siteId ?? tokenUser.siteId,\n baseUrl,\n tokenExpireTime: session.tokenExpireTime,\n refreshTokenExpireTime: session.refreshTokenExpireTime,\n },\n resolveOutputOptions(options),\n );\n } catch (error) {\n writeData(\n {\n loggedIn: true,\n tokenValid: false,\n userId: session.userId,\n userName: session.userName,\n siteId: session.siteId,\n baseUrl,\n error: error instanceof Error ? error.message : String(error),\n hint: \"run `mt-os-cli auth login --username <username> --password <password>` again\",\n },\n resolveOutputOptions(options),\n );\n }\n}\n\n/**\n * 校验当前 token 是否有效。\n *\n * @param context 命令上下文\n * @param options 输出选项\n */\nasync function runAuthCheck(\n context: CommandContext,\n options: AuthCommandOptions,\n): Promise<void> {\n const { baseUrl, client, session } = await resolveAuthSessionContext(\n context,\n options,\n );\n const tokenUser = await client.checkToken(baseUrl, session.token);\n writeData(\n {\n tokenValid: true,\n userId: tokenUser.userId,\n siteId: tokenUser.siteId,\n name: tokenUser.name ?? tokenUser.userName,\n },\n resolveOutputOptions(options),\n );\n}\n\n/**\n * 输出当前登录用户信息。\n *\n * @param context 命令上下文\n * @param options 输出选项\n */\nasync function runAuthWhoami(\n context: CommandContext,\n options: AuthCommandOptions,\n): Promise<void> {\n const { baseUrl, client, session } = await resolveAuthSessionContext(\n context,\n options,\n );\n const tokenUser = await client.checkToken(baseUrl, session.token);\n writeData(\n {\n loggedIn: true,\n tokenValid: true,\n userId: session.userId ?? tokenUser.userId,\n userName: session.userName ?? tokenUser.name ?? tokenUser.userName,\n siteId: session.siteId ?? tokenUser.siteId,\n baseUrl,\n deviceType: session.deviceType,\n tokenExpireTime: session.tokenExpireTime,\n refreshTokenExpireTime: session.refreshTokenExpireTime,\n },\n resolveOutputOptions(options),\n );\n}\n\n/**\n * 列出本机保存的登录会话。\n *\n * <p>当前 CLI 只保存一份活跃会话,因此返回列表结构但最多一条记录。这样后续扩展\n * 多账号或多环境会话时,Agent 调用协议不需要再改。\n *\n * @param context 命令上下文\n * @param options 输出选项\n */\nasync function runAuthList(\n context: CommandContext,\n options: AuthCommandOptions,\n): Promise<void> {\n const config = (await resolveCommandConfig(\n context.sessionStore,\n options,\n )).config;\n const session = await context.sessionStore.getSession();\n if (!session) {\n writeData(\n {\n sessions: [],\n activeEnvironment:\n config.environment ?? getDefaultEnvironmentPreset().name,\n },\n resolveOutputOptions(options),\n );\n return;\n }\n\n const client = new MtOsApiClient({\n sessionStore: context.sessionStore,\n });\n const baseUrl = await resolveAuthBaseUrl(context, options);\n try {\n const tokenUser = await client.checkToken(baseUrl, session.token);\n writeData(\n {\n sessions: [\n {\n active: true,\n tokenValid: true,\n environment:\n config.environment ?? getDefaultEnvironmentPreset().name,\n baseUrl,\n userId: session.userId ?? tokenUser.userId,\n userName: session.userName ?? tokenUser.name ?? tokenUser.userName,\n siteId: session.siteId ?? tokenUser.siteId,\n deviceType: session.deviceType,\n updatedAt: session.updatedAt,\n tokenExpireTime: session.tokenExpireTime,\n refreshTokenExpireTime: session.refreshTokenExpireTime,\n },\n ],\n },\n resolveOutputOptions(options),\n );\n } catch (error) {\n writeData(\n {\n sessions: [\n {\n active: true,\n tokenValid: false,\n environment:\n config.environment ?? getDefaultEnvironmentPreset().name,\n baseUrl,\n userId: session.userId,\n userName: session.userName,\n siteId: session.siteId,\n deviceType: session.deviceType,\n updatedAt: session.updatedAt,\n error: error instanceof Error ? error.message : String(error),\n },\n ],\n },\n resolveOutputOptions(options),\n );\n }\n}\n\n/**\n * 刷新当前 token。\n *\n * @param targetArgs 保留的目标参数,刷新不再自动写 MCP\n * @param context 命令上下文\n * @param options 输出选项\n */\nasync function runAuthRefresh(\n targetArgs: string[],\n context: CommandContext,\n options: AuthCommandOptions,\n): Promise<void> {\n const session = await requireSession(context);\n const config = (await resolveCommandConfig(\n context.sessionStore,\n options,\n )).config;\n const client = new MtOsApiClient({\n sessionStore: context.sessionStore,\n });\n const baseUrl = await resolveAuthBaseUrl(context, options);\n const refreshedSession = await client.refreshSession({\n ...session,\n baseUrl,\n });\n const syncResult = await syncAfterLogin(\n targetArgs,\n refreshedSession,\n context,\n config.mcpBaseUrl ?? refreshedSession.baseUrl,\n (message) => {\n console.error(message);\n },\n );\n writeData(\n {\n refreshed: true,\n userId: refreshedSession.userId,\n userName: refreshedSession.userName,\n siteId: refreshedSession.siteId,\n baseUrl: refreshedSession.baseUrl,\n tokenExpireTime: refreshedSession.tokenExpireTime,\n refreshTokenExpireTime: refreshedSession.refreshTokenExpireTime,\n mcpSync: \"skipped\",\n clientSync: syncResult.appliedTargets,\n skipped: syncResult.skippedMessages,\n },\n resolveOutputOptions(options),\n );\n}\n\n/**\n * 读取当前 session;缺失时抛出认证错误。\n *\n * @param context 命令上下文\n * @returns 当前会话\n */\nasync function requireSession(context: CommandContext) {\n const session = await context.sessionStore.getSession();\n if (!session) {\n throw new CliExitError(3, {\n type: \"auth\",\n message: \"No local session found.\",\n hint: \"run `mt-os-cli auth login --username <username> --password <password>`\",\n });\n }\n return session;\n}\n\n/**\n * 解析认证命令实际访问的服务地址。\n *\n * @param context 命令上下文\n * @param options 命令环境覆盖参数\n * @returns 实际访问的 MTOS Web 地址\n */\nasync function resolveAuthBaseUrl(\n context: CommandContext,\n options: AuthCommandOptions,\n): Promise<string> {\n const { baseUrl } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n return baseUrl;\n}\n\n/**\n * 解析认证命令需要的 session、客户端和服务地址。\n *\n * @param context 命令上下文\n * @param options 命令环境覆盖参数\n * @returns 认证命令运行上下文\n */\nasync function resolveAuthSessionContext(\n context: CommandContext,\n options: AuthCommandOptions,\n) {\n const session = await requireSession(context);\n const { baseUrl, client } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n return {\n baseUrl,\n client,\n session,\n };\n}\n","import { Command } from \"commander\";\n\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { MtOsApiClient } from \"../http/api-client.js\";\nimport { inspectInstallState, resolveInstallPaths } from \"../install/install.js\";\nimport {\n CLI_NAME,\n CLI_VERSION,\n colorize,\n formatStatus,\n printCliHeader,\n printField,\n printSection,\n resolveCommandConfig,\n type CommandContext,\n} from \"../cli/context.js\";\n\n/**\n * 注册诊断命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerDoctorCommand(\n program: Command,\n context: CommandContext,\n): void {\n program\n .command(\"doctor\")\n .description(\n \"Inspect local config, installation state, and current login session\",\n )\n .action(async () => {\n await runDoctor(context, {});\n });\n}\n\n/**\n * 输出版本和运行时信息。\n *\n * @param context 命令上下文\n */\nexport async function runVersionInfo(context: CommandContext): Promise<void> {\n await runDoctor(context, {\n printHeader: true,\n includeVersionInfo: true,\n includeClientInstallInfo: false,\n });\n}\n\n/**\n * 执行本地诊断。\n *\n * @param context 命令上下文\n * @param options 诊断选项\n */\nexport async function runDoctor(\n context: CommandContext,\n options?: {\n printHeader?: boolean;\n includeVersionInfo?: boolean;\n includeClientInstallInfo?: boolean;\n },\n): Promise<void> {\n const sessionStore = context.sessionStore;\n const config = (await resolveCommandConfig(sessionStore)).config;\n const session = await sessionStore.getSession();\n const installState = await inspectInstallState();\n const paths = resolveInstallPaths();\n\n if (options?.printHeader ?? true) {\n printCliHeader();\n }\n if (options?.includeVersionInfo) {\n printSection(\"Version\", \"1;35\");\n printField(\"mt_os_cli_name\", CLI_NAME);\n printField(\"mt_os_cli_version\", CLI_VERSION);\n printField(\"node_version\", process.version);\n }\n\n printSection(\"Config\", \"1;36\");\n printField(\n \"environment\",\n colorize(config.environment ?? getDefaultEnvironmentPreset().name, \"1;34\"),\n );\n printField(\n \"base_url\",\n config.baseUrl ?? getDefaultEnvironmentPreset().baseUrl,\n );\n printField(\n \"mcp_base_url\",\n config.mcpBaseUrl ?? getDefaultEnvironmentPreset().mcpBaseUrl,\n );\n printField(\"default_site_id\", config.defaultSiteId ?? \"(not set)\");\n printField(\n \"login_callback_port\",\n String(config.loginCallbackPort ?? \"(auto)\"),\n );\n printField(\"timeout_ms\", String(config.timeoutMs ?? 15000));\n\n if (options?.includeClientInstallInfo ?? true) {\n printSection(\"Clients\", \"1;34\");\n printField(\"codex_skill\", formatStatus(installState.codexSkillInstalled));\n printField(\n \"claude_instructions\",\n formatStatus(installState.claudeInstructionsInstalled),\n );\n printField(\n \"shared_claude_skill\",\n formatStatus(installState.claudeSkillsInstalled),\n );\n printField(\n \"openclaw_skill\",\n formatStatus(installState.openClawSkillsInstalled),\n );\n printField(\"codex_cli\", formatStatus(installState.codexCliInstalled));\n printField(\"claude_cli\", formatStatus(installState.claudeCliInstalled));\n printField(\"openclaw_cli\", formatStatus(installState.openClawCliInstalled));\n printField(\"codex_mcp\", formatStatus(installState.codexMcpConfigured));\n printField(\"claude_mcp\", formatStatus(installState.claudeMcpConfigured));\n printField(\"openclaw_mcp\", formatStatus(installState.openClawMcpConfigured));\n printField(\"codex_skill_path\", paths.codexSkillPath);\n printField(\"claude_instructions_path\", paths.claudeInstructionsPath);\n printField(\"claude_skill_path\", paths.claudeSkillPath);\n printField(\"openclaw_skill_path\", paths.openClawSkillPath);\n }\n\n if (!session) {\n printSection(\"Session\", \"1;33\");\n printField(\"session\", colorize(\"missing\", \"1;31\"));\n return;\n }\n\n printSection(\"Session\", \"1;33\");\n printField(\n \"session\",\n colorize(\n `present for ${session.userName ?? session.userId ?? \"unknown user\"}`,\n \"1;32\",\n ),\n );\n printField(\"session_base_url\", session.baseUrl);\n printField(\"session_user_id\", session.userId ?? \"(unknown)\");\n printField(\"session_site_id\", session.siteId ?? \"(unknown)\");\n printField(\n \"token_expire_time\",\n String(session.tokenExpireTime ?? \"(unknown)\"),\n );\n printField(\n \"refresh_token_expire_time\",\n String(session.refreshTokenExpireTime ?? \"(unknown)\"),\n );\n\n try {\n const apiClient = new MtOsApiClient({\n sessionStore,\n ...(config.timeoutMs !== undefined\n ? { timeoutMs: config.timeoutMs }\n : {}),\n });\n const tokenUser = await apiClient.checkToken(\n session.baseUrl,\n session.token,\n );\n printSection(\"API\", \"1;32\");\n printField(\n \"api_check\",\n colorize(\n `ok for user ${tokenUser.userId} / site ${tokenUser.siteId}`,\n \"1;32\",\n ),\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n printSection(\"API\", \"1;31\");\n printField(\"api_check\", colorize(`failed - ${message}`, \"1;31\"));\n }\n}\n","import { Command } from \"commander\";\n\nimport {\n applyEnvironmentPreset,\n buildCustomEnvironmentPreset,\n getDefaultEnvironmentPreset,\n getEnvironmentPresetOrThrow,\n listAvailableEnvironmentPresets,\n normalizeEnvironmentName,\n removeCustomEnvironment,\n upsertCustomEnvironment,\n} from \"../config/environments.js\";\nimport { resolveCommandConfig, type CommandContext } from \"../cli/context.js\";\n\n/**\n * 环境命令选项。\n */\ninterface EnvironmentCommandOptions {\n mcpBaseUrl?: string;\n label?: string;\n description?: string;\n}\n\n/**\n * 注册环境命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerEnvCommand(\n program: Command,\n context: CommandContext,\n): void {\n program\n .command(\"env\")\n .description(\"Inspect, add, remove, and switch environments\")\n .argument(\"[action]\", \"Action: list, current, use, add, remove\")\n .argument(\"[name]\", \"Environment name\")\n .argument(\"[baseUrl]\", \"Base URL for `add`\")\n .option(\"--mcp-base-url <url>\", \"MCP base URL for custom environment\")\n .option(\"--label <label>\", \"Display label for custom environment\")\n .option(\"--description <description>\", \"Description for custom environment\")\n .action(async (\n action: string | undefined,\n name: string | undefined,\n baseUrl: string | undefined,\n options: EnvironmentCommandOptions,\n ) => {\n await runEnvironmentCommand(action, name, baseUrl, options, context);\n });\n}\n\n/**\n * 输出环境列表。\n *\n * @param context 命令上下文\n */\nasync function runEnvironmentList(context: CommandContext): Promise<void> {\n const config = await context.sessionStore.getConfig();\n for (const preset of listAvailableEnvironmentPresets(config)) {\n console.log(\n `${preset.name}: source=${preset.source}, web=${preset.baseUrl}, mcp=${preset.mcpBaseUrl}, desc=${preset.description}`,\n );\n }\n}\n\n/**\n * 输出当前环境。\n *\n * @param context 命令上下文\n */\nasync function runEnvironmentCurrent(context: CommandContext): Promise<void> {\n const config = (await resolveCommandConfig(context.sessionStore)).config;\n console.log(\n `environment: ${config.environment ?? getDefaultEnvironmentPreset().name}`,\n );\n console.log(\n `base_url: ${config.baseUrl ?? getDefaultEnvironmentPreset().baseUrl}`,\n );\n console.log(\n `mcp_base_url: ${config.mcpBaseUrl ?? getDefaultEnvironmentPreset().mcpBaseUrl}`,\n );\n}\n\n/**\n * 切换环境。\n *\n * @param environment 环境名\n * @param context 命令上下文\n */\nasync function runEnvironmentUse(\n environment: string,\n context: CommandContext,\n): Promise<void> {\n const currentConfig = await context.sessionStore.getConfig();\n const currentSession = await context.sessionStore.getSession();\n const preset = getEnvironmentPresetOrThrow(environment, currentConfig);\n const nextConfig = applyEnvironmentPreset(currentConfig, preset);\n await context.sessionStore.saveConfig(nextConfig);\n if (currentSession && currentSession.baseUrl !== preset.baseUrl) {\n await context.sessionStore.clearSession();\n console.log(\n \"session: cleared because the previous login belongs to another environment\",\n );\n }\n console.log(`environment: ${preset.name}`);\n console.log(`base_url: ${preset.baseUrl}`);\n console.log(`mcp_base_url: ${preset.mcpBaseUrl}`);\n}\n\n/**\n * 新增或覆盖用户自定义环境。\n *\n * @param name 环境名\n * @param baseUrl Web/API 地址\n * @param options 命令选项\n * @param context 命令上下文\n */\nasync function runEnvironmentAdd(\n name: string,\n baseUrl: string,\n options: EnvironmentCommandOptions,\n context: CommandContext,\n): Promise<void> {\n const currentConfig = await context.sessionStore.getConfig();\n const preset = buildCustomEnvironmentPreset({\n name,\n baseUrl,\n ...(options.mcpBaseUrl ? { mcpBaseUrl: options.mcpBaseUrl } : {}),\n ...(options.label ? { label: options.label } : {}),\n ...(options.description ? { description: options.description } : {}),\n });\n await context.sessionStore.saveConfig(\n upsertCustomEnvironment(currentConfig, preset),\n );\n console.log(`environment_added: ${preset.name}`);\n console.log(`base_url: ${preset.baseUrl}`);\n console.log(`mcp_base_url: ${preset.mcpBaseUrl}`);\n console.log(`next: mt-os-cli env use ${preset.name}`);\n}\n\n/**\n * 删除用户自定义环境。\n *\n * @param name 环境名\n * @param context 命令上下文\n */\nasync function runEnvironmentRemove(\n name: string,\n context: CommandContext,\n): Promise<void> {\n const currentConfig = await context.sessionStore.getConfig();\n const currentSession = await context.sessionStore.getSession();\n const normalizedName = normalizeEnvironmentName(name);\n const result = removeCustomEnvironment(currentConfig, name);\n if (!result.removed) {\n throw new Error(`Custom environment not found: ${name}`);\n }\n await context.sessionStore.saveConfig(result.config);\n if (currentSession && currentConfig.environment === normalizedName) {\n await context.sessionStore.clearSession();\n console.log(\n \"session: cleared because the current custom environment was removed\",\n );\n }\n console.log(`environment_removed: ${name}`);\n}\n\n/**\n * 执行环境命令。\n *\n * @param action 动作\n * @param environment 环境名\n * @param baseUrl 新增自定义环境时使用的 Web/API 地址\n * @param options 命令选项\n * @param context 命令上下文\n */\nasync function runEnvironmentCommand(\n action: string | undefined,\n environment: string | undefined,\n baseUrl: string | undefined,\n options: EnvironmentCommandOptions,\n context: CommandContext,\n): Promise<void> {\n const normalizedAction = action?.trim().toLowerCase() ?? \"current\";\n if (normalizedAction === \"list\") {\n await runEnvironmentList(context);\n return;\n }\n if (normalizedAction === \"current\") {\n await runEnvironmentCurrent(context);\n return;\n }\n if (normalizedAction === \"use\") {\n if (!environment) {\n throw new Error(\n \"Missing environment name. Use: mt-os-cli env use <name>\",\n );\n }\n await runEnvironmentUse(environment, context);\n return;\n }\n if (normalizedAction === \"add\") {\n if (!environment || !baseUrl) {\n throw new Error(\n \"Missing custom environment. Use: mt-os-cli env add <name> <base-url>\",\n );\n }\n await runEnvironmentAdd(environment, baseUrl, options, context);\n return;\n }\n if (normalizedAction === \"remove\") {\n if (!environment) {\n throw new Error(\n \"Missing environment name. Use: mt-os-cli env remove <name>\",\n );\n }\n await runEnvironmentRemove(environment, context);\n return;\n }\n throw new Error(\n `Unknown env action: ${normalizedAction}. Supported actions: list, current, use, add, remove`,\n );\n}\n","import { Command } from \"commander\";\n\nimport {\n describeInstallTargets,\n parseInstallTargets,\n preconfigureClients,\n readClaudeMcpConfiguration,\n readCodexMcpConfiguration,\n readOpenClawMcpConfiguration,\n resolveRequestedClients,\n syncClientsFromSession,\n} from \"../install/install.js\";\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport {\n parseInteger,\n resolveCommandConfig,\n type CommandContext,\n} from \"../cli/context.js\";\n\n/**\n * 注册 MCP 状态命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerMcpCommand(\n program: Command,\n context: CommandContext,\n): void {\n program\n .command(\"mcp\")\n .description(\"Manage explicit MTOS MCP installation for agent clients\")\n .action(async () => {\n await runMcpStatus(context);\n })\n .command(\"install\")\n .description(\"Install MTOS MCP server into Codex, Claude, or OpenClaw\")\n .argument(\"[targets...]\", \"Targets to install: all, codex, claude, openclaw\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--mcp-base-url <url>\", \"MTOS MCP server base URL\")\n .option(\"--timeout-ms <ms>\", \"Reserved for future MCP health checks\", parseInteger)\n .action(\n async (\n targets: string[],\n options: {\n env?: string;\n environment?: string;\n baseUrl?: string;\n mcpBaseUrl?: string;\n timeoutMs?: number;\n },\n ) => {\n await runMcpInstall(targets, context, options);\n },\n );\n}\n\n/**\n * 显式安装远程 MCP 配置。\n *\n * <p>该命令是唯一会主动写 Codex、Claude、OpenClaw MCP 配置的入口,避免用户只想\n * 使用 HTTP CLI 或其他宿主应用时被默认安装 MCP 服务。\n *\n * @param targetArgs 客户端目标\n * @param context 命令上下文\n * @param options 环境选项\n */\nasync function runMcpInstall(\n targetArgs: string[],\n context: CommandContext,\n options?: {\n env?: string;\n environment?: string;\n baseUrl?: string;\n mcpBaseUrl?: string;\n timeoutMs?: number;\n },\n): Promise<void> {\n void options?.timeoutMs;\n const sessionStore = context.sessionStore;\n const selected = await resolveRequestedClients(parseInstallTargets(targetArgs));\n const resolved = await resolveCommandConfig(sessionStore, options);\n const session = await sessionStore.getSession();\n const syncResult = session\n ? await syncClientsFromSession({\n targets: selected,\n session,\n ...(resolved.mcpBaseUrl ? { mcpBaseUrl: resolved.mcpBaseUrl } : {}),\n onProgress: (message) => console.log(`progress: ${message}`),\n })\n : await preconfigureClients({\n targets: selected,\n ...(resolved.baseUrl ? { baseUrl: resolved.baseUrl } : {}),\n ...(resolved.mcpBaseUrl ? { mcpBaseUrl: resolved.mcpBaseUrl } : {}),\n });\n\n console.log(`mcp_install: ${describeInstallTargets(selected)}`);\n if (syncResult.appliedTargets.length > 0) {\n console.log(\n `mcp_configured: ${describeInstallTargets(syncResult.appliedTargets)}`,\n );\n console.log(\n \"client_restart_hint: 如果目标客户端已经打开,请关闭当前窗口或至少新开会话后再继续使用。\",\n );\n }\n for (const skippedMessage of syncResult.skippedMessages) {\n console.log(`skip: ${skippedMessage}`);\n }\n if (!session) {\n console.log(\"next_step: 如需写入 Bearer header,请先执行 mt-os-cli auth login\");\n }\n}\n\n/**\n * 输出 MCP 配置状态。\n *\n * @param context 命令上下文\n */\nasync function runMcpStatus(context: CommandContext): Promise<void> {\n const config = (await resolveCommandConfig(context.sessionStore)).config;\n const [codexConfig, claudeConfig, openClawConfig] = await Promise.all([\n readCodexMcpConfiguration(),\n readClaudeMcpConfiguration(),\n readOpenClawMcpConfiguration(),\n ]);\n console.log(`mcp_server_name: mt-os`);\n console.log(\n `environment: ${config.environment ?? getDefaultEnvironmentPreset().name}`,\n );\n console.log(\n `mcp_base_url: ${config.mcpBaseUrl ?? getDefaultEnvironmentPreset().mcpBaseUrl}`,\n );\n if (codexConfig) {\n console.log(\"--- codex_mcp ---\");\n console.log(codexConfig);\n } else {\n console.log(\"codex_mcp: missing\");\n }\n if (claudeConfig) {\n console.log(\"--- claude_mcp ---\");\n console.log(claudeConfig);\n } else {\n console.log(\"claude_mcp: missing\");\n }\n if (openClawConfig) {\n console.log(\"--- openclaw_mcp ---\");\n console.log(openClawConfig);\n } else {\n console.log(\"openclaw_mcp: missing\");\n }\n}\n","/**\n * 服务端 Tool 定义中常见的参数描述。\n */\ninterface ToolParameterDefinition {\n name?: string;\n description?: string;\n parameterType?: string;\n genericParameterType?: string;\n required?: boolean;\n}\n\n/**\n * 服务端 Tool 定义中常见的 JSON Schema 片段。\n */\ninterface ToolJsonSchema {\n type?: string;\n required?: string[];\n properties?: Record<\n string,\n {\n type?: string;\n description?: string;\n enum?: unknown[];\n }\n >;\n}\n\n/**\n * 服务端 Tool 定义的宽松结构。\n */\ninterface ToolDefinitionLike {\n name?: string;\n title?: string;\n description?: string;\n domain?: string;\n subjectType?: string;\n confirmPolicy?: string;\n confirmationRequired?: boolean;\n parameterSchema?: ToolJsonSchema;\n parameters?: ToolParameterDefinition[];\n exposureList?: string[];\n permission?: unknown;\n}\n\n/**\n * Agent 友好的参数结构。\n */\nexport interface AgentFriendlyToolParameter {\n name: string;\n required: boolean;\n type?: string;\n description?: string;\n enum?: unknown[];\n}\n\n/**\n * Agent 友好的 Tool schema。\n */\nexport interface AgentFriendlyToolSchema {\n name: string;\n title?: string;\n description?: string;\n domain?: string;\n subjectType?: string;\n risk: {\n confirmationRequired: boolean;\n confirmPolicy?: string;\n level: \"read\" | \"write\" | \"high-risk-write\";\n };\n parameters: AgentFriendlyToolParameter[];\n parameterSchema?: ToolJsonSchema;\n exposureList?: string[];\n permission?: unknown;\n cli: {\n inspect: string;\n dryRun: string;\n call: string;\n };\n}\n\n/**\n * 将服务端 Tool 定义转换为 Agent 更容易理解的 schema。\n *\n * @param definition 服务端 Tool 定义\n * @returns Agent 友好的 schema\n */\nexport function toAgentFriendlyToolSchema(\n definition: unknown,\n): AgentFriendlyToolSchema {\n const tool = asToolDefinition(definition);\n const name = tool.name ?? \"(unknown)\";\n const requiredNames = new Set(tool.parameterSchema?.required ?? []);\n const schemaProperties = tool.parameterSchema?.properties ?? {};\n const parameterNames = new Set<string>([\n ...Object.keys(schemaProperties),\n ...(tool.parameters ?? [])\n .map((parameter) => parameter.name)\n .filter((value): value is string => Boolean(value)),\n ]);\n const parameters: AgentFriendlyToolParameter[] = [...parameterNames].map(\n (parameterName) => {\n const schemaProperty = schemaProperties[parameterName];\n const reflected = tool.parameters?.find(\n (parameter) => parameter.name === parameterName,\n );\n const parameter: AgentFriendlyToolParameter = {\n name: parameterName,\n required: Boolean(\n reflected?.required ?? requiredNames.has(parameterName),\n ),\n };\n const type = schemaProperty?.type ?? reflected?.parameterType;\n if (type !== undefined) {\n parameter.type = type;\n }\n const description = schemaProperty?.description ?? reflected?.description;\n if (description !== undefined) {\n parameter.description = description;\n }\n if (schemaProperty?.enum !== undefined) {\n parameter.enum = schemaProperty.enum;\n }\n return parameter;\n },\n );\n\n const confirmationRequired =\n Boolean(tool.confirmationRequired) || tool.confirmPolicy === \"ALWAYS\";\n return {\n name,\n ...(tool.title ? { title: tool.title } : {}),\n ...(tool.description ? { description: tool.description } : {}),\n ...(tool.domain ? { domain: tool.domain } : {}),\n ...(tool.subjectType ? { subjectType: tool.subjectType } : {}),\n risk: {\n confirmationRequired,\n ...(tool.confirmPolicy ? { confirmPolicy: tool.confirmPolicy } : {}),\n level: confirmationRequired ? \"high-risk-write\" : \"read\",\n },\n parameters,\n ...(tool.parameterSchema ? { parameterSchema: tool.parameterSchema } : {}),\n ...(tool.exposureList ? { exposureList: tool.exposureList } : {}),\n ...(tool.permission ? { permission: tool.permission } : {}),\n cli: {\n inspect: `mt-os-cli schema ${name}`,\n dryRun: `mt-os-cli tool call ${name} --args-json '{}' --dry-run`,\n call: `mt-os-cli tool call ${name} --args-json '{}'`,\n },\n };\n}\n\n/**\n * 从 Tool 列表中提取简要 schema 索引。\n *\n * @param definitions Tool 定义列表\n * @returns 简要索引\n */\nexport function toToolSchemaIndex(definitions: unknown[]): unknown[] {\n return definitions.map((definition) => {\n const schema = toAgentFriendlyToolSchema(definition);\n return {\n name: schema.name,\n title: schema.title,\n domain: schema.domain,\n subjectType: schema.subjectType,\n confirmationRequired: schema.risk.confirmationRequired,\n inspect: schema.cli.inspect,\n };\n });\n}\n\n/**\n * 判断 Tool 是否需要显式确认。\n *\n * @param definition 服务端 Tool 定义\n * @returns 是否需要确认\n */\nexport function isConfirmationRequired(definition: unknown): boolean {\n const tool = asToolDefinition(definition);\n return Boolean(tool.confirmationRequired) || tool.confirmPolicy === \"ALWAYS\";\n}\n\n/**\n * 将未知值安全转换为 Tool 定义。\n *\n * @param definition 原始定义\n * @returns Tool 定义\n */\nfunction asToolDefinition(definition: unknown): ToolDefinitionLike {\n if (!definition || typeof definition !== \"object\") {\n return {};\n }\n return definition as ToolDefinitionLike;\n}\n","import { Command } from \"commander\";\n\nimport { writeData } from \"../output/cli-output.js\";\nimport {\n toAgentFriendlyToolSchema,\n toToolSchemaIndex,\n} from \"../tool/schema.js\";\nimport {\n resolveApiCommandContext,\n resolveOutputOptions,\n type CommandContext,\n type ToolCommandOptions,\n} from \"../cli/context.js\";\n\n/**\n * 注册 schema 命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerSchemaCommand(\n program: Command,\n context: CommandContext,\n): void {\n program\n .command(\"schema\")\n .description(\"Inspect agent-friendly tool schema\")\n .argument(\"[toolName]\", \"Tool name; omit to list schema index\")\n .option(\"--domain <domain>\", \"Filter by tool domain\")\n .option(\"--subject-type <subjectType>\", \"Filter by tool subjectType\")\n .option(\"--keyword <keyword>\", \"Filter by keyword\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(\n async (\n toolName: string | undefined,\n options: ToolCommandOptions,\n ) => {\n await runSchema(context, toolName, options);\n },\n );\n}\n\n/**\n * 输出 Tool schema。\n *\n * @param context 命令上下文\n * @param toolName Tool 名称,为空时输出索引\n * @param options 输出和过滤选项\n */\nasync function runSchema(\n context: CommandContext,\n toolName: string | undefined,\n options: ToolCommandOptions,\n): Promise<void> {\n const { baseUrl, client } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n if (toolName) {\n const definition = await client.getTool(baseUrl, toolName);\n writeData(\n toAgentFriendlyToolSchema(definition),\n resolveOutputOptions(options),\n );\n return;\n }\n const tools = await client.listTools(baseUrl, options);\n writeData(toToolSchemaIndex(tools), resolveOutputOptions(options));\n}\n","import { Command } from \"commander\";\n\nimport {\n installClaudeInstructions,\n installClaudeSkills,\n installCodexSkill,\n installExternalSkillFiles,\n installOpenClawSkills,\n parseInstallTargets,\n inspectInstallState,\n expandInstallTargets,\n} from \"../install/install.js\";\nimport {\n CLAUDE_INSTRUCTIONS_TEMPLATE_PATH,\n loadClaudeInstructionsTemplate,\n loadCodexSkillTemplate,\n loadSharedSkillTemplate,\n SHARED_SKILL_TEMPLATE_PATH,\n SHARED_SKILL_TEMPLATE_ROOT,\n} from \"../install/templates.js\";\nimport {\n formatBoolean,\n resolveCommandConfig,\n type CommandContext,\n} from \"../cli/context.js\";\nimport { MtOsApiClient } from \"../http/api-client.js\";\n\n/**\n * skill 更新来源。\n */\ntype SkillUpdateSource = \"auto\" | \"remote\" | \"bundled\";\n\n/**\n * skill 更新命令选项。\n */\ninterface SkillUpdateOptions {\n source?: string;\n env?: string;\n environment?: string;\n baseUrl?: string;\n}\n\n/**\n * 注册技能模板命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerSkillCommands(\n program: Command,\n context: CommandContext,\n): void {\n const skills = program\n .command(\"skills\")\n .description(\n \"Inspect installed skill assets and their project source files\",\n )\n .argument(\"[targets...]\", \"Targets to inspect: all, codex, claude, openclaw\")\n .action(async (targets: string[]) => {\n await runSkills(targets);\n });\n\n skills\n .command(\"update\")\n .description(\"Update installed skills from remote manifest or bundled bootstrap\")\n .argument(\"[targets...]\", \"Targets to update: all, codex, claude, openclaw\")\n .option(\"--source <source>\", \"Skill source: auto, remote, bundled\", \"auto\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .action(async (targets: string[], options: SkillUpdateOptions) => {\n await runSkillsUpdate(targets, context, options);\n });\n\n program\n .command(\"skill\")\n .description(\"Print the source content of a managed skill template\")\n .argument(\n \"<target>\",\n \"Target template to print: codex, claude, openclaw, agent, bootstrap\",\n )\n .action(async (target: string) => {\n await runSkillContent(target.trim().toLowerCase());\n });\n}\n\n/**\n * 输出已安装技能状态。\n *\n * @param targetArgs 目标客户端\n */\nasync function runSkills(targetArgs: string[]): Promise<void> {\n const targets = parseInstallTargets(targetArgs);\n const selected = expandInstallTargets(targets);\n const installState = await inspectInstallState();\n\n if (selected.includes(\"codex\")) {\n console.log(`shared_skill_template_path: ${SHARED_SKILL_TEMPLATE_PATH}`);\n console.log(`shared_skill_template_root: ${SHARED_SKILL_TEMPLATE_ROOT}`);\n console.log(`codex_skill_path: ${installState.paths.codexSkillPath}`);\n console.log(\n `codex_skill_status: ${formatBoolean(installState.codexSkillInstalled)}`,\n );\n }\n\n if (selected.includes(\"claude\")) {\n console.log(\n `claude_instructions_template_path: ${CLAUDE_INSTRUCTIONS_TEMPLATE_PATH}`,\n );\n console.log(\n `claude_instructions_path: ${installState.paths.claudeInstructionsPath}`,\n );\n console.log(\n `claude_instructions_status: ${formatBoolean(installState.claudeInstructionsInstalled)}`,\n );\n console.log(\n `shared_skill_template_root: ${installState.templatePaths.sharedSkillTemplateRoot}`,\n );\n console.log(`claude_skill_path: ${installState.paths.claudeSkillPath}`);\n console.log(\n `claude_skill_status: ${formatBoolean(installState.claudeSkillsInstalled)}`,\n );\n }\n\n if (selected.includes(\"openclaw\")) {\n console.log(`shared_skill_template_path: ${SHARED_SKILL_TEMPLATE_PATH}`);\n console.log(`shared_skill_template_root: ${SHARED_SKILL_TEMPLATE_ROOT}`);\n console.log(`openclaw_skill_path: ${installState.paths.openClawSkillPath}`);\n console.log(\n `openclaw_skill_status: ${formatBoolean(installState.openClawSkillsInstalled)}`,\n );\n }\n\n}\n\n/**\n * 更新本机技能文件。\n *\n * @param targetArgs 目标客户端\n * @param context 命令上下文\n * @param options 更新选项\n */\nasync function runSkillsUpdate(\n targetArgs: string[],\n context: CommandContext,\n options: SkillUpdateOptions,\n): Promise<void> {\n const targets = parseInstallTargets(targetArgs);\n const selected = expandInstallTargets(targets);\n const source = parseSkillUpdateSource(options.source);\n if (source === \"bundled\") {\n await updateBundledSkills(selected);\n } else {\n const remoteUpdated = await updateRemoteSkills(selected, context, options, source);\n if (!remoteUpdated && source === \"auto\") {\n await updateBundledSkills(selected);\n console.log(\"bootstrap_skills: fallback\");\n }\n }\n console.log(`config_dir: ${context.sessionStore.configDir}`);\n await runSkills(selected);\n}\n\n/**\n * 从当前 npm 包内置模板更新本机技能文件。\n *\n * @param selected 目标客户端\n */\nasync function updateBundledSkills(\n selected: ReturnType<typeof expandInstallTargets>,\n): Promise<void> {\n if (selected.includes(\"codex\")) {\n await installCodexSkill();\n console.log(\"codex_skill: updated\");\n }\n if (selected.includes(\"claude\")) {\n await Promise.all([\n installClaudeInstructions(),\n installClaudeSkills(),\n ]);\n console.log(\"claude_instructions: updated\");\n console.log(\"claude_skill: updated\");\n }\n if (selected.includes(\"openclaw\")) {\n await installOpenClawSkills();\n console.log(\"openclaw_skill: updated\");\n }\n}\n\n/**\n * 从服务端远程 skill 清单更新本机技能文件。\n *\n * @param selected 目标客户端\n * @param context 命令上下文\n * @param options 更新选项\n * @param source 更新来源\n */\nasync function updateRemoteSkills(\n selected: ReturnType<typeof expandInstallTargets>,\n context: CommandContext,\n options: SkillUpdateOptions,\n source: SkillUpdateSource,\n): Promise<boolean> {\n try {\n const resolved = await resolveCommandConfig(context.sessionStore, options);\n if (!resolved.baseUrl) {\n throw new Error(\"Missing base URL for remote skills.\");\n }\n const client = new MtOsApiClient({\n sessionStore: context.sessionStore,\n });\n const manifest = await client.getCliSkillManifest(resolved.baseUrl);\n const files = manifest.files ?? [];\n const resultList = await installExternalSkillFiles(files, selected);\n console.log(\"remote_skills: updated\");\n console.log(`remote_version: ${manifest.version ?? \"(unknown)\"}`);\n console.log(`remote_base_url: ${resolved.baseUrl}`);\n for (const result of resultList) {\n console.log(`${result.target}_remote_files: ${result.writtenFiles}`);\n }\n if (selected.includes(\"claude\")) {\n await installClaudeInstructions();\n console.log(\"claude_instructions: updated\");\n }\n return true;\n } catch (error) {\n if (source === \"remote\") {\n throw error;\n }\n const message = error instanceof Error ? error.message : String(error);\n console.log(`remote_skills: skipped (${message})`);\n return false;\n }\n}\n\n/**\n * 解析 skill 更新来源。\n *\n * @param value 原始来源\n * @returns 标准来源\n */\nfunction parseSkillUpdateSource(value: string | undefined): SkillUpdateSource {\n const normalized = (value ?? \"auto\").trim().toLowerCase();\n if (normalized === \"auto\" || normalized === \"remote\" || normalized === \"bundled\") {\n return normalized;\n }\n throw new Error(`Unknown skills update source: ${value}`);\n}\n\n/**\n * 输出技能模板正文。\n *\n * @param target 技能目标\n */\nasync function runSkillContent(target: string): Promise<void> {\n if (target === \"codex\" || target === \"openclaw\") {\n console.log(await loadCodexSkillTemplate());\n return;\n }\n if (target === \"agent\" || target === \"bootstrap\") {\n console.log(await loadSharedSkillTemplate());\n return;\n }\n if (target === \"claude\") {\n console.log(await loadClaudeInstructionsTemplate());\n return;\n }\n throw new Error(`Unknown skill target: ${target}`);\n}\n","import { Command } from \"commander\";\n\nimport { MtOsApiClient } from \"../http/api-client.js\";\nimport type { AgentToolInvokeRequest, PageResponse } from \"../types.js\";\nimport { parseInteger, type PaginationOptions } from \"./context.js\";\n\n/**\n * Tool 分页调用结果。\n */\nexport interface ToolPaginationResult {\n pageAll: true;\n toolName: string;\n pageNo: number;\n pageSize: number;\n pageLimit?: number;\n pageCountFetched: number;\n entityCount?: number;\n entities: unknown[];\n pages: unknown[];\n}\n\n/**\n * 给命令统一增加分页参数。\n *\n * @param command Commander 命令对象\n * @returns 原命令对象,便于链式调用\n */\nexport function addPaginationOptions<T extends Command>(command: T): T {\n return command\n .option(\"--page-no <number>\", \"Page number, defaults to 1\", parsePositiveInteger)\n .option(\"--page-size <number>\", \"Page size for paged tools\", parsePositiveInteger)\n .option(\"--page-all\", \"Fetch all pages when the result is a page response\")\n .option(\"--page-limit <number>\", \"Maximum entities to return with --page-all\", parsePositiveInteger)\n .option(\"--page-delay-ms <number>\", \"Delay between --page-all requests\", parseNonNegativeInteger) as T;\n}\n\n/**\n * 将统一分页参数合并到 Tool arguments。\n *\n * <p>服务端现有 Tool 主要使用 snake_case 分页字段,因此 CLI 默认写入\n * `page_no`、`page_size`。如果用户在 `--args-json` 中已经传了同名字段,则不覆盖。\n *\n * @param args 原始 Tool arguments\n * @param options 分页选项\n * @returns 合并后的 arguments\n */\nexport function applyPaginationArguments(\n args: Record<string, unknown>,\n options: PaginationOptions,\n): Record<string, unknown> {\n const next = {\n ...args,\n };\n if (\n options.pageNo !== undefined &&\n next.page_no === undefined &&\n next.pageNo === undefined\n ) {\n next.page_no = options.pageNo;\n }\n if (\n options.pageSize !== undefined &&\n next.page_size === undefined &&\n next.pageSize === undefined\n ) {\n next.page_size = options.pageSize;\n }\n return next;\n}\n\n/**\n * 调用 Tool,并在需要时自动翻页。\n *\n * @param client MTOS API 客户端\n * @param baseUrl MTOS 服务基础地址\n * @param toolName Tool 名称\n * @param payload Tool 调用请求\n * @param options 分页选项\n * @returns 单页结果或聚合后的分页结果\n */\nexport async function invokeToolWithOptionalPagination(\n client: MtOsApiClient,\n baseUrl: string,\n toolName: string,\n payload: AgentToolInvokeRequest,\n options: PaginationOptions,\n): Promise<unknown> {\n if (!options.pageAll) {\n return client.invokeTool(baseUrl, toolName, {\n ...payload,\n arguments: applyPaginationArguments(payload.arguments ?? {}, options),\n });\n }\n\n const pageSize = options.pageSize ?? 20;\n const startPageNo = options.pageNo ?? 1;\n const pageLimit = options.pageLimit;\n const pages: unknown[] = [];\n const entities: unknown[] = [];\n let entityCount: number | undefined;\n let currentPageNo = startPageNo;\n\n while (true) {\n const result = await client.invokeTool(baseUrl, toolName, {\n ...payload,\n arguments: {\n ...(payload.arguments ?? {}),\n page_no: currentPageNo,\n page_size: pageSize,\n },\n });\n pages.push(result);\n\n const page = extractPageResponse(result);\n if (!page) {\n return {\n pageAll: true,\n toolName,\n warning:\n \"Tool result is not a recognized page response; returning fetched raw pages.\",\n pages,\n };\n }\n\n entityCount = page.entityCount;\n for (const entity of page.entities) {\n if (pageLimit !== undefined && entities.length >= pageLimit) {\n break;\n }\n entities.push(entity);\n }\n\n const reachedLimit = pageLimit !== undefined && entities.length >= pageLimit;\n const reachedLastPage = page.pageNo >= page.pageCount || page.entities.length === 0;\n if (reachedLimit || reachedLastPage) {\n break;\n }\n\n currentPageNo = page.pageNo + 1;\n if (options.pageDelayMs && options.pageDelayMs > 0) {\n await sleep(options.pageDelayMs);\n }\n }\n\n const response: ToolPaginationResult = {\n pageAll: true,\n toolName,\n pageNo: startPageNo,\n pageSize,\n ...(pageLimit !== undefined ? { pageLimit } : {}),\n pageCountFetched: pages.length,\n ...(entityCount !== undefined ? { entityCount } : {}),\n entities,\n pages,\n };\n return response;\n}\n\n/**\n * 从 Tool 返回值里提取分页对象。\n *\n * <p>不同 Tool 可能直接返回分页对象,也可能包在 `data`、`result.data` 或\n * MCP 文本内容里;这里只做确定性结构解析,不基于自然语言猜测。\n *\n * @param value Tool 返回值\n * @returns 分页对象;无法识别时返回 undefined\n */\nfunction extractPageResponse(value: unknown): PageResponse<unknown> | undefined {\n if (isPageResponse(value)) {\n return value;\n }\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n const candidates = [\n record.data,\n record.result,\n readNested(record, [\"result\", \"data\"]),\n ];\n for (const candidate of candidates) {\n const page = extractPageResponse(candidate);\n if (page) {\n return page;\n }\n }\n const content = record.content;\n if (Array.isArray(content)) {\n for (const item of content) {\n const text = readObjectText(item);\n if (!text) {\n continue;\n }\n try {\n const parsed = JSON.parse(text) as unknown;\n const page = extractPageResponse(parsed);\n if (page) {\n return page;\n }\n } catch {\n continue;\n }\n }\n }\n return undefined;\n}\n\n/**\n * 判断是否是标准分页对象。\n *\n * @param value 待判断值\n * @returns 是否为分页对象\n */\nfunction isPageResponse(value: unknown): value is PageResponse<unknown> {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const record = value as Record<string, unknown>;\n return (\n typeof record.pageNo === \"number\" &&\n typeof record.pageSize === \"number\" &&\n typeof record.pageCount === \"number\" &&\n typeof record.entityCount === \"number\" &&\n Array.isArray(record.entities)\n );\n}\n\n/**\n * 读取嵌套字段。\n *\n * @param value 原始对象\n * @param path 字段路径\n * @returns 字段值\n */\nfunction readNested(value: Record<string, unknown>, path: string[]): unknown {\n return path.reduce<unknown>((current, key) => {\n if (!current || typeof current !== \"object\") {\n return undefined;\n }\n return (current as Record<string, unknown>)[key];\n }, value);\n}\n\n/**\n * 读取 MCP text content 文本。\n *\n * @param value content item\n * @returns 文本内容\n */\nfunction readObjectText(value: unknown): string | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n return typeof record.text === \"string\" ? record.text : undefined;\n}\n\n/**\n * 解析正整数。\n *\n * @param value 原始字符串\n * @returns 正整数\n */\nfunction parsePositiveInteger(value: string): number {\n const parsed = parseInteger(value);\n if (parsed <= 0) {\n throw new Error(`Expected a positive number: ${value}`);\n }\n return parsed;\n}\n\n/**\n * 解析非负整数。\n *\n * @param value 原始字符串\n * @returns 非负整数\n */\nfunction parseNonNegativeInteger(value: string): number {\n const parsed = parseInteger(value);\n if (parsed < 0) {\n throw new Error(`Expected a non-negative number: ${value}`);\n }\n return parsed;\n}\n\n/**\n * 暂停指定毫秒。\n *\n * @param ms 毫秒数\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import {\n parseJsonObject,\n resolveApiCommandContext,\n resolveOutputOptions,\n type ApiTargetOptions,\n type CommandContext,\n type FormattedOutputOptions,\n type PaginationOptions,\n} from \"../cli/context.js\";\nimport {\n applyPaginationArguments,\n invokeToolWithOptionalPagination,\n} from \"../cli/pagination.js\";\nimport { writeData } from \"../output/cli-output.js\";\n\n/**\n * 业务快捷命令通用参数。\n */\nexport interface ShortcutOptions extends FormattedOutputOptions, PaginationOptions, ApiTargetOptions {\n runtimeJson?: string;\n dryRun?: boolean;\n confirm?: boolean;\n}\n\n/**\n * 执行 Tool 快捷命令。\n *\n * <p>业务快捷命令都走正式 `/law/api/v1/cli/tools/{toolName}/invoke` 入口;\n * 这里只统一处理 runtime、分页、dry-run 和输出格式,不绕过服务端鉴权与 Tool schema。\n *\n * @param context 命令上下文\n * @param toolName Tool 名称\n * @param args Tool arguments\n * @param options 命令参数\n */\nexport async function runToolShortcut(\n context: CommandContext,\n toolName: string,\n args: Record<string, unknown>,\n options: ShortcutOptions,\n): Promise<void> {\n const runtimeObject = options.runtimeJson\n ? parseJsonObject(options.runtimeJson)\n : undefined;\n const payload = {\n arguments: applyPaginationArguments(args, options),\n ...(runtimeObject ? { runtime: runtimeObject } : {}),\n ...(options.confirm !== undefined ? { confirm: options.confirm } : {}),\n };\n if (options.dryRun) {\n writeData(\n {\n dryRun: true,\n shortcut: true,\n toolName,\n api: [\n {\n method: \"POST\",\n url: `/law/api/v1/cli/tools/${encodeURIComponent(toolName)}/invoke`,\n body: payload,\n },\n ],\n },\n resolveOutputOptions(options),\n );\n return;\n }\n\n const { baseUrl, client } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n const result = await invokeToolWithOptionalPagination(\n client,\n baseUrl,\n toolName,\n payload,\n options,\n );\n writeData(result, resolveOutputOptions(options));\n}\n","import { Command } from \"commander\";\n\nimport { parseInteger, type CommandContext } from \"../cli/context.js\";\nimport { ConfirmationRequiredError } from \"../output/cli-output.js\";\nimport { runToolShortcut, type ShortcutOptions } from \"./shortcut-common.js\";\n\n/**\n * 日程概览快捷命令参数。\n */\ninterface ScheduleAgendaShortcutOptions extends ShortcutOptions {\n start?: string;\n end?: string;\n type?: string;\n limit?: number;\n}\n\n/**\n * 日程详情快捷命令参数。\n */\ninterface ScheduleDetailShortcutOptions extends ShortcutOptions {\n scheduleTaskId: number;\n}\n\n/**\n * 日程创建快捷命令参数。\n */\ninterface ScheduleCreateShortcutOptions extends ShortcutOptions {\n summary: string;\n start: string;\n end: string;\n description?: string;\n attendeeUserIds?: string;\n conferenceIds?: string;\n place?: string;\n wholeDay?: boolean;\n type?: string;\n busyStatus?: string;\n showType?: string;\n repeatType?: string;\n repeatDeadline?: string;\n alertTypes?: string;\n}\n\n/**\n * 日程更新快捷命令参数。\n */\ninterface ScheduleUpdateShortcutOptions extends ShortcutOptions {\n scheduleTaskId: number;\n summary?: string;\n start?: string;\n end?: string;\n description?: string;\n addAttendeeUserIds?: string;\n removeAttendeeUserIds?: string;\n addConferenceIds?: string;\n removeConferenceIds?: string;\n repeatType?: string;\n repeatDeadline?: string;\n repeatUpdateBy?: string;\n}\n\n/**\n * 日程忙闲快捷命令参数。\n */\ninterface ScheduleFreebusyShortcutOptions extends ShortcutOptions {\n start?: string;\n end?: string;\n userIds?: string;\n}\n\n/**\n * 日程会议室查询快捷命令参数。\n */\ninterface ScheduleRoomFindShortcutOptions extends ShortcutOptions {\n slot?: string[];\n roomName?: string;\n minCapacity?: number;\n maxCapacity?: number;\n}\n\n/**\n * 日程 RSVP 快捷命令参数。\n */\ninterface ScheduleRsvpShortcutOptions extends ShortcutOptions {\n scheduleTaskId: number;\n rsvpStatus: string;\n}\n\n/**\n * 日程时间推荐快捷命令参数。\n */\ninterface ScheduleSuggestionShortcutOptions extends ShortcutOptions {\n start?: string;\n end?: string;\n attendeeUserIds?: string;\n durationMinutes?: number;\n exclude?: string;\n limit?: number;\n}\n\n/**\n * 注册日程快捷命令。\n *\n * <p>这里保持和飞书 CLI 类似的命令组织方式,只负责把命令行参数转换成\n * Agent Tool arguments;日程权限、参与人语义和会议室可用性仍由后端 Tool 校验。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerScheduleCommand(\n program: Command,\n context: CommandContext,\n): void {\n const schedule = program\n .command(\"schedule\")\n .description(\"Schedule shortcuts backed by MTOS tools\");\n\n addReadOptions(\n schedule\n .command(\"+agenda\")\n .description(\"Read current user's schedule agenda\")\n .option(\"--start <time>\", \"Start time, defaults to today\")\n .option(\"--end <time>\", \"End time, defaults to today end\")\n .option(\"--type <type>\", \"Schedule type: work, lawsuit, meeting, out, training, other, all\")\n .option(\"--limit <number>\", \"Maximum schedule rows\", parseInteger),\n ).action(async (options: ScheduleAgendaShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_current_user_schedule_agenda\",\n buildScheduleAgendaArgs(options),\n options,\n );\n });\n\n addReadOptions(\n schedule\n .command(\"+detail\")\n .description(\"Read current user's schedule detail\")\n .requiredOption(\"--schedule-task-id <id>\", \"Schedule task id\", parseInteger),\n ).action(async (options: ScheduleDetailShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_current_user_schedule_detail\",\n { schedule_task_id: options.scheduleTaskId },\n options,\n );\n });\n\n addWriteOptions(\n schedule\n .command(\"+create\")\n .description(\"Create schedule for current user\")\n .requiredOption(\"--summary <text>\", \"Schedule summary\")\n .requiredOption(\"--start <time>\", \"Start time\")\n .requiredOption(\"--end <time>\", \"End time\")\n .option(\"--description <text>\", \"Schedule description\")\n .option(\"--attendee-user-ids <ids>\", \"Comma-separated attendee user ids\")\n .option(\"--conference-ids <ids>\", \"Comma-separated conference room ids\")\n .option(\"--place <text>\", \"Schedule place\")\n .option(\"--whole-day\", \"Create whole-day schedule\")\n .option(\"--type <type>\", \"Schedule type\")\n .option(\"--busy-status <status>\", \"Busy status: busy or idle\")\n .option(\"--show-type <type>\", \"Visibility: public or private\")\n .option(\"--repeat-type <type>\", \"Repeat type\")\n .option(\"--repeat-deadline <time>\", \"Repeat deadline\")\n .option(\"--alert-types <types>\", \"Comma-separated alert types\"),\n \"Confirm creating schedule\",\n ).action(async (options: ScheduleCreateShortcutOptions) => {\n await runScheduleCreateShortcut(context, options);\n });\n\n addWriteOptions(\n schedule\n .command(\"+update\")\n .description(\"Update schedule owned or arranged by current user\")\n .requiredOption(\"--schedule-task-id <id>\", \"Schedule task id\", parseInteger)\n .option(\"--summary <text>\", \"Schedule summary\")\n .option(\"--start <time>\", \"Start time; must be used with --end\")\n .option(\"--end <time>\", \"End time; must be used with --start\")\n .option(\"--description <text>\", \"Schedule description\")\n .option(\"--add-attendee-user-ids <ids>\", \"Comma-separated attendee user ids to add\")\n .option(\"--remove-attendee-user-ids <ids>\", \"Comma-separated attendee user ids to remove\")\n .option(\"--add-conference-ids <ids>\", \"Comma-separated conference room ids to add\")\n .option(\"--remove-conference-ids <ids>\", \"Comma-separated conference room ids to remove\")\n .option(\"--repeat-type <type>\", \"Repeat type\")\n .option(\"--repeat-deadline <time>\", \"Repeat deadline\")\n .option(\"--repeat-update-by <type>\", \"Repeat update scope\"),\n \"Confirm updating schedule\",\n ).action(async (options: ScheduleUpdateShortcutOptions) => {\n await runScheduleUpdateShortcut(context, options);\n });\n\n addReadOptions(\n schedule\n .command(\"+freebusy\")\n .description(\"Read busy blocks for current user and optional users\")\n .option(\"--start <time>\", \"Start time\")\n .option(\"--end <time>\", \"End time\")\n .option(\"--user-ids <ids>\", \"Comma-separated user ids\"),\n ).action(async (options: ScheduleFreebusyShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_schedule_freebusy\",\n buildScheduleFreebusyArgs(options),\n options,\n );\n });\n\n addReadOptions(\n schedule\n .command(\"+room-find\")\n .description(\"Find available conference rooms for explicit slots\")\n .option(\"--slot <start~end>\", \"Candidate slot, repeat for multiple slots\", collectOption, [])\n .option(\"--room-name <keyword>\", \"Conference room name keyword\")\n .option(\"--min-capacity <number>\", \"Minimum room capacity\", parseInteger)\n .option(\"--max-capacity <number>\", \"Maximum room capacity\", parseInteger),\n ).action(async (options: ScheduleRoomFindShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_available_conference_rooms\",\n buildScheduleRoomFindArgs(options),\n options,\n );\n });\n\n addWriteOptions(\n schedule\n .command(\"+rsvp\")\n .description(\"Reply to current user's schedule invitation\")\n .requiredOption(\"--schedule-task-id <id>\", \"Schedule task id\", parseInteger)\n .requiredOption(\"--rsvp-status <status>\", \"RSVP status: accept, decline, tentative\"),\n \"Confirm updating RSVP\",\n ).action(async (options: ScheduleRsvpShortcutOptions) => {\n await runScheduleRsvpShortcut(context, options);\n });\n\n addReadOptions(\n schedule\n .command(\"+suggestion\")\n .description(\"Suggest free schedule slots\")\n .option(\"--start <time>\", \"Search start time\")\n .option(\"--end <time>\", \"Search end time\")\n .option(\"--attendee-user-ids <ids>\", \"Comma-separated attendee user ids\")\n .option(\"--duration-minutes <number>\", \"Meeting duration minutes\", parseInteger)\n .option(\"--exclude <slots>\", \"Comma-separated excluded slots in start~end format\")\n .option(\"--limit <number>\", \"Maximum suggestions\", parseInteger),\n ).action(async (options: ScheduleSuggestionShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_schedule_suggestion\",\n buildScheduleSuggestionArgs(options),\n options,\n );\n });\n}\n\n/**\n * 为只读日程命令追加公共 Tool 选项。\n *\n * @param command 子命令对象\n * @return 追加公共选项后的子命令对象\n */\nfunction addReadOptions(command: Command): Command {\n return command\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--runtime-json <json>\", \"Tool runtime JSON object\")\n .option(\"--dry-run\", \"Print the request preview without executing\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\");\n}\n\n/**\n * 为写入类日程命令追加公共 Tool 选项。\n *\n * @param command 子命令对象\n * @param confirmDescription 确认选项说明\n * @return 追加公共选项后的子命令对象\n */\nfunction addWriteOptions(command: Command, confirmDescription: string): Command {\n return addReadOptions(command.option(\"--confirm\", confirmDescription));\n}\n\n/**\n * 执行当前用户日程创建快捷命令。\n *\n * @param context 命令上下文\n * @param options 日程创建参数\n */\nasync function runScheduleCreateShortcut(\n context: CommandContext,\n options: ScheduleCreateShortcutOptions,\n): Promise<void> {\n requireScheduleConfirmation(options, \"create\");\n await runToolShortcut(\n context,\n \"create_current_user_schedule\",\n buildScheduleCreateArgs(options),\n options,\n );\n}\n\n/**\n * 执行当前用户日程更新快捷命令。\n *\n * @param context 命令上下文\n * @param options 日程更新参数\n */\nasync function runScheduleUpdateShortcut(\n context: CommandContext,\n options: ScheduleUpdateShortcutOptions,\n): Promise<void> {\n requireScheduleConfirmation(options, \"update\");\n await runToolShortcut(\n context,\n \"update_current_user_schedule\",\n buildScheduleUpdateArgs(options),\n options,\n );\n}\n\n/**\n * 执行当前用户日程邀请回复快捷命令。\n *\n * @param context 命令上下文\n * @param options RSVP 参数\n */\nasync function runScheduleRsvpShortcut(\n context: CommandContext,\n options: ScheduleRsvpShortcutOptions,\n): Promise<void> {\n requireScheduleConfirmation(options, \"rsvp\");\n await runToolShortcut(\n context,\n \"update_current_user_schedule_rsvp\",\n {\n schedule_task_id: options.scheduleTaskId,\n rsvp_status: options.rsvpStatus,\n },\n options,\n );\n}\n\n/**\n * 写日程前检查用户确认。\n *\n * @param options 快捷命令参数\n * @param commandName 日程子命令名称\n */\nfunction requireScheduleConfirmation(\n options: ShortcutOptions,\n commandName: string,\n): void {\n if (!options.confirm && !options.dryRun) {\n throw new ConfirmationRequiredError(`mt-os-cli schedule +${commandName}`);\n }\n}\n\n/**\n * 构建日程概览 Tool 参数。\n *\n * @param options 日程概览命令参数\n * @return Tool arguments\n */\nfunction buildScheduleAgendaArgs(\n options: ScheduleAgendaShortcutOptions,\n): Record<string, unknown> {\n return {\n ...(options.start ? { start_time: options.start } : {}),\n ...(options.end ? { end_time: options.end } : {}),\n ...(options.type ? { type: options.type } : {}),\n ...(options.limit !== undefined ? { limit: options.limit } : {}),\n };\n}\n\n/**\n * 构建日程创建 Tool 参数。\n *\n * @param options 日程创建命令参数\n * @return Tool arguments\n */\nfunction buildScheduleCreateArgs(\n options: ScheduleCreateShortcutOptions,\n): Record<string, unknown> {\n const attendeeUserIds = parseCsvOption(options.attendeeUserIds);\n const conferenceIds = parseCsvOption(options.conferenceIds);\n const alertTypes = parseCsvOption(options.alertTypes);\n return {\n summary: options.summary,\n start_time: options.start,\n end_time: options.end,\n ...(options.description ? { description: options.description } : {}),\n ...(attendeeUserIds ? { attendee_user_ids: attendeeUserIds } : {}),\n ...(conferenceIds ? { conference_ids: conferenceIds } : {}),\n ...(options.place ? { place: options.place } : {}),\n ...(options.wholeDay !== undefined ? { whole_day: options.wholeDay } : {}),\n ...(options.type ? { type: options.type } : {}),\n ...(options.busyStatus ? { busy_status: options.busyStatus } : {}),\n ...(options.showType ? { show_type: options.showType } : {}),\n ...(options.repeatType ? { repeat_type: options.repeatType } : {}),\n ...(options.repeatDeadline ? { repeat_deadline: options.repeatDeadline } : {}),\n ...(alertTypes ? { alert_types: alertTypes } : {}),\n };\n}\n\n/**\n * 构建日程更新 Tool 参数。\n *\n * @param options 日程更新命令参数\n * @return Tool arguments\n */\nfunction buildScheduleUpdateArgs(\n options: ScheduleUpdateShortcutOptions,\n): Record<string, unknown> {\n const addAttendeeUserIds = parseCsvOption(options.addAttendeeUserIds);\n const removeAttendeeUserIds = parseCsvOption(options.removeAttendeeUserIds);\n const addConferenceIds = parseCsvOption(options.addConferenceIds);\n const removeConferenceIds = parseCsvOption(options.removeConferenceIds);\n return {\n schedule_task_id: options.scheduleTaskId,\n ...(options.summary ? { summary: options.summary } : {}),\n ...(options.start ? { start_time: options.start } : {}),\n ...(options.end ? { end_time: options.end } : {}),\n ...(options.description ? { description: options.description } : {}),\n ...(addAttendeeUserIds ? { add_attendee_user_ids: addAttendeeUserIds } : {}),\n ...(removeAttendeeUserIds ? { remove_attendee_user_ids: removeAttendeeUserIds } : {}),\n ...(addConferenceIds ? { add_conference_ids: addConferenceIds } : {}),\n ...(removeConferenceIds ? { remove_conference_ids: removeConferenceIds } : {}),\n ...(options.repeatType ? { repeat_type: options.repeatType } : {}),\n ...(options.repeatDeadline ? { repeat_deadline: options.repeatDeadline } : {}),\n ...(options.repeatUpdateBy ? { repeat_update_by: options.repeatUpdateBy } : {}),\n };\n}\n\n/**\n * 构建忙闲查询 Tool 参数。\n *\n * @param options 忙闲查询命令参数\n * @return Tool arguments\n */\nfunction buildScheduleFreebusyArgs(\n options: ScheduleFreebusyShortcutOptions,\n): Record<string, unknown> {\n const userIds = parseCsvOption(options.userIds);\n return {\n ...(options.start ? { start_time: options.start } : {}),\n ...(options.end ? { end_time: options.end } : {}),\n ...(userIds ? { user_ids: userIds } : {}),\n };\n}\n\n/**\n * 构建会议室可用性查询 Tool 参数。\n *\n * @param options 会议室查询命令参数\n * @return Tool arguments\n */\nfunction buildScheduleRoomFindArgs(\n options: ScheduleRoomFindShortcutOptions,\n): Record<string, unknown> {\n const slots = parseRepeatedCsvOption(options.slot);\n return {\n ...(slots ? { slots } : {}),\n ...(options.roomName ? { room_name: options.roomName } : {}),\n ...(options.minCapacity !== undefined ? { min_capacity: options.minCapacity } : {}),\n ...(options.maxCapacity !== undefined ? { max_capacity: options.maxCapacity } : {}),\n };\n}\n\n/**\n * 构建可用时间推荐 Tool 参数。\n *\n * @param options 时间推荐命令参数\n * @return Tool arguments\n */\nfunction buildScheduleSuggestionArgs(\n options: ScheduleSuggestionShortcutOptions,\n): Record<string, unknown> {\n const attendeeUserIds = parseCsvOption(options.attendeeUserIds);\n const excludeSlots = parseCsvOption(options.exclude);\n return {\n ...(options.start ? { start_time: options.start } : {}),\n ...(options.end ? { end_time: options.end } : {}),\n ...(attendeeUserIds ? { attendee_user_ids: attendeeUserIds } : {}),\n ...(options.durationMinutes !== undefined\n ? { duration_minutes: options.durationMinutes }\n : {}),\n ...(excludeSlots ? { exclude_slots: excludeSlots } : {}),\n ...(options.limit !== undefined ? { limit: options.limit } : {}),\n };\n}\n\n/**\n * 解析逗号分隔的命令行参数。\n *\n * @param value 原始参数\n * @return 非空参数数组;没有有效值时返回 undefined\n */\nfunction parseCsvOption(value: string | undefined): string[] | undefined {\n const items = value\n ?.split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n return items && items.length > 0 ? items : undefined;\n}\n\n/**\n * 收集可重复命令行选项。\n *\n * @param value 当前参数值\n * @param previous 已收集参数\n * @return 合并后的参数数组\n */\nfunction collectOption(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\n/**\n * 解析可重复且支持逗号分隔的命令行参数。\n *\n * @param values 原始参数数组\n * @return 非空参数数组;没有有效值时返回 undefined\n */\nfunction parseRepeatedCsvOption(values: string[] | undefined): string[] | undefined {\n const items = values\n ?.flatMap((value) => value.split(\",\"))\n .map((item) => item.trim())\n .filter(Boolean);\n return items && items.length > 0 ? items : undefined;\n}\n","import { Command } from \"commander\";\n\nimport {\n parseJsonObject,\n resolveApiCommandContext,\n resolveOutputOptions,\n type CommandContext,\n} from \"../cli/context.js\";\nimport {\n addPaginationOptions,\n applyPaginationArguments,\n invokeToolWithOptionalPagination,\n} from \"../cli/pagination.js\";\nimport {\n CliExitError,\n ConfirmationRequiredError,\n writeData,\n} from \"../output/cli-output.js\";\nimport { runToolShortcut, type ShortcutOptions } from \"./shortcut-common.js\";\n\nconst PERSONAL_ATTACHMENT_UPLOAD_TOOL_NAME = \"upload_attachment\";\nconst PROJECT_ATTACHMENT_UPLOAD_TOOL_NAME = \"upload_temporary_attachment\";\n\n/**\n * 任务附件命令参数。\n */\ninterface TaskAttachmentOptions extends ShortcutOptions {\n filesJson?: string;\n attachment?: string[];\n}\n\n/**\n * 项目任务创建快捷命令参数。\n */\ninterface TaskProjectCreateShortcutOptions extends TaskAttachmentOptions {\n project: string;\n title: string;\n details?: string;\n assigneeNames?: string;\n deadline?: string;\n checklistItem?: string[];\n taskGrade?: string;\n}\n\n/**\n * 个人任务创建快捷命令参数。\n */\ninterface TaskPersonalCreateShortcutOptions extends TaskAttachmentOptions {\n title: string;\n details?: string;\n assigneeNames?: string;\n deadline?: string;\n checklistItem?: string[];\n taskGrade?: string;\n}\n\n/**\n * 我的待办任务查询快捷命令参数。\n */\ninterface TaskPendingShortcutOptions extends ShortcutOptions {\n keyword?: string;\n project?: string;\n personalOnly?: boolean;\n overdueOnly?: boolean;\n}\n\n/**\n * 任务更新快捷命令参数。\n */\ninterface TaskUpdateShortcutOptions extends TaskAttachmentOptions {\n taskId: string;\n title?: string;\n details?: string;\n assigneeNames?: string;\n deadline?: string;\n checklistItem?: string[];\n taskGrade?: string;\n attachmentScope?: string;\n clearFiles?: boolean;\n}\n\n/**\n * 任务状态快捷命令参数。\n */\ninterface TaskStatusShortcutOptions extends ShortcutOptions {\n taskId: string;\n}\n\n/**\n * 新增检查项快捷命令参数。\n */\ninterface TaskCheckAddShortcutOptions extends ShortcutOptions {\n taskId: string;\n content: string;\n}\n\n/**\n * 检查项状态快捷命令参数。\n */\ninterface TaskCheckStatusShortcutOptions extends ShortcutOptions {\n taskCheckId: string;\n}\n\n/**\n * 注册任务快捷命令。\n *\n * <p>任务命令参考飞书 CLI 的 task shortcut 设计,对外提供明确的\n * `task +...` 高频命令;具体创建、查询、完成和检查项处理仍调用后端 Agent Tool,\n * 避免 CLI 复制 PMS 的任务业务规则。</p>\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerTaskCommand(\n program: Command,\n context: CommandContext,\n): void {\n const task = program\n .command(\"task\")\n .description(\"Task shortcuts backed by MTOS tools\");\n\n addWriteOptions(\n addTaskCreateOptions(\n task\n .command(\"+create-project\")\n .description(\"Create a project task\")\n .requiredOption(\"--project <nameOrNumber>\", \"Project name or number\"),\n ),\n \"Confirm creating project task\",\n ).action(async (options: TaskProjectCreateShortcutOptions) => {\n await runProjectTaskCreateShortcut(context, options);\n });\n\n addWriteOptions(\n addTaskCreateOptions(\n task\n .command(\"+create-personal\")\n .description(\"Create a personal task\"),\n ),\n \"Confirm creating personal task\",\n ).action(async (options: TaskPersonalCreateShortcutOptions) => {\n await runPersonalTaskCreateShortcut(context, options);\n });\n\n const pending = addReadOptions(\n task\n .command(\"+my-pending-tasks\")\n .description(\"Read current user's pending tasks\")\n .option(\"--keyword <text>\", \"Task title keyword\")\n .option(\"--project <nameOrNumber>\", \"Project name or number\")\n .option(\"--personal-only\", \"Only query personal tasks\")\n .option(\"--overdue-only\", \"Only query overdue pending tasks\"),\n );\n addPaginationOptions(pending).action(async (options: TaskPendingShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_my_pending_tasks\",\n buildTaskPendingArgs(options),\n options,\n );\n });\n\n addWriteOptions(\n addTaskAttachmentOptions(\n task\n .command(\"+update\")\n .description(\"Update task attributes\")\n .requiredOption(\"--task-id <id>\", \"Task id\")\n .option(\"--title <text>\", \"New task title\")\n .option(\"--details <text>\", \"New task details\")\n .option(\"--assignee-names <names>\", \"Comma-separated assignee names\")\n .option(\"--deadline <time>\", \"New deadline, for example 2026-05-26 18:00\")\n .option(\"--checklist-item <text>\", \"Checklist item, repeatable\", collectOption, [])\n .option(\"--task-grade <grade>\", \"Task priority grade\")\n .option(\n \"--attachment-scope <scope>\",\n \"Attachment upload scope for local files: project or personal\",\n )\n .option(\"--clear-files\", \"Clear task attachments\"),\n ),\n \"Confirm updating task\",\n ).action(async (options: TaskUpdateShortcutOptions) => {\n await runTaskUpdateShortcut(context, options);\n });\n\n addWriteOptions(\n task\n .command(\"+complete\")\n .description(\"Mark a task as complete\")\n .requiredOption(\"--task-id <id>\", \"Task id\"),\n \"Confirm completing task\",\n ).action(async (options: TaskStatusShortcutOptions) => {\n await runTaskStatusShortcut(context, \"complete_task\", \"+complete\", options);\n });\n\n addWriteOptions(\n task\n .command(\"+reopen\")\n .description(\"Reopen a completed task\")\n .requiredOption(\"--task-id <id>\", \"Task id\"),\n \"Confirm reopening task\",\n ).action(async (options: TaskStatusShortcutOptions) => {\n await runTaskStatusShortcut(context, \"update_task_reopen\", \"+reopen\", options);\n });\n\n addWriteOptions(\n task\n .command(\"+check-add\")\n .description(\"Add a checklist item to a task\")\n .requiredOption(\"--task-id <id>\", \"Task id\")\n .requiredOption(\"--content <text>\", \"Checklist item content\"),\n \"Confirm adding task check item\",\n ).action(async (options: TaskCheckAddShortcutOptions) => {\n await runTaskCheckAddShortcut(context, options);\n });\n\n addWriteOptions(\n task\n .command(\"+check-complete\")\n .description(\"Mark a task checklist item as complete\")\n .requiredOption(\"--task-check-id <id>\", \"Task check item id\"),\n \"Confirm completing task check item\",\n ).action(async (options: TaskCheckStatusShortcutOptions) => {\n await runTaskCheckStatusShortcut(\n context,\n \"complete_task_check\",\n \"+check-complete\",\n options,\n );\n });\n\n addWriteOptions(\n task\n .command(\"+check-reopen\")\n .description(\"Reopen a completed task checklist item\")\n .requiredOption(\"--task-check-id <id>\", \"Task check item id\"),\n \"Confirm reopening task check item\",\n ).action(async (options: TaskCheckStatusShortcutOptions) => {\n await runTaskCheckStatusShortcut(\n context,\n \"update_task_check_reopen\",\n \"+check-reopen\",\n options,\n );\n });\n}\n\n/**\n * 为任务创建命令追加通用业务参数。\n *\n * @param command 子命令对象\n * @return 追加任务创建参数后的子命令对象\n */\nfunction addTaskCreateOptions(command: Command): Command {\n return addTaskAttachmentOptions(\n command\n .requiredOption(\"--title <text>\", \"Task title\")\n .option(\"--details <text>\", \"Task details\")\n .option(\"--assignee-names <names>\", \"Comma-separated assignee names\")\n .option(\"--deadline <time>\", \"Deadline, for example 2026-05-26\")\n .option(\"--checklist-item <text>\", \"Checklist item, repeatable\", collectOption, [])\n .option(\"--task-grade <grade>\", \"Task priority grade\"),\n );\n}\n\n/**\n * 为任务附件写入命令追加附件参数。\n *\n * @param command 子命令对象\n * @return 追加附件参数后的子命令对象\n */\nfunction addTaskAttachmentOptions(command: Command): Command {\n return command\n .option(\n \"--files-json <json>\",\n \"Uploaded file objects JSON array string\",\n )\n .option(\n \"--attachment <filePath>\",\n \"Local attachment path, repeatable\",\n collectOption,\n [],\n );\n}\n\n/**\n * 为只读任务命令追加公共 Tool 选项。\n *\n * @param command 子命令对象\n * @return 追加公共选项后的子命令对象\n */\nfunction addReadOptions(command: Command): Command {\n return command\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--runtime-json <json>\", \"Tool runtime JSON object\")\n .option(\"--dry-run\", \"Print the request preview without executing\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\");\n}\n\n/**\n * 为写入任务命令追加公共 Tool 选项。\n *\n * @param command 子命令对象\n * @param confirmDescription 确认选项说明\n * @return 追加公共选项后的子命令对象\n */\nfunction addWriteOptions(command: Command, confirmDescription: string): Command {\n return addReadOptions(command.option(\"--confirm\", confirmDescription));\n}\n\n/**\n * 执行项目任务创建快捷命令。\n *\n * @param context 命令上下文\n * @param options 项目任务创建参数\n */\nasync function runProjectTaskCreateShortcut(\n context: CommandContext,\n options: TaskProjectCreateShortcutOptions,\n): Promise<void> {\n await runTaskWriteShortcut(\n context,\n \"create_project_task\",\n \"+create-project\",\n {\n project_name_or_number: options.project,\n ...buildTaskCommonWriteArgs(options),\n },\n options,\n PROJECT_ATTACHMENT_UPLOAD_TOOL_NAME,\n );\n}\n\n/**\n * 执行个人任务创建快捷命令。\n *\n * @param context 命令上下文\n * @param options 个人任务创建参数\n */\nasync function runPersonalTaskCreateShortcut(\n context: CommandContext,\n options: TaskPersonalCreateShortcutOptions,\n): Promise<void> {\n await runTaskWriteShortcut(\n context,\n \"create_personal_task\",\n \"+create-personal\",\n buildTaskCommonWriteArgs(options),\n options,\n PERSONAL_ATTACHMENT_UPLOAD_TOOL_NAME,\n );\n}\n\n/**\n * 执行任务更新快捷命令。\n *\n * @param context 命令上下文\n * @param options 任务更新参数\n */\nasync function runTaskUpdateShortcut(\n context: CommandContext,\n options: TaskUpdateShortcutOptions,\n): Promise<void> {\n const uploadToolName = resolveUpdateUploadToolName(options);\n await runTaskWriteShortcut(\n context,\n \"update_task\",\n \"+update\",\n {\n task_id: options.taskId,\n ...buildTaskCommonWriteArgs(options),\n },\n options,\n uploadToolName,\n );\n}\n\n/**\n * 执行任务完成或重新打开快捷命令。\n *\n * @param context 命令上下文\n * @param toolName Tool 名称\n * @param commandName 快捷命令名称\n * @param options 任务状态参数\n */\nasync function runTaskStatusShortcut(\n context: CommandContext,\n toolName: string,\n commandName: string,\n options: TaskStatusShortcutOptions,\n): Promise<void> {\n requireTaskConfirmation(options, commandName);\n await runToolShortcut(\n context,\n toolName,\n { task_id: options.taskId },\n options,\n );\n}\n\n/**\n * 执行新增任务检查项快捷命令。\n *\n * @param context 命令上下文\n * @param options 新增检查项参数\n */\nasync function runTaskCheckAddShortcut(\n context: CommandContext,\n options: TaskCheckAddShortcutOptions,\n): Promise<void> {\n requireTaskConfirmation(options, \"+check-add\");\n await runToolShortcut(\n context,\n \"create_task_check\",\n {\n task_id: options.taskId,\n content: options.content,\n },\n options,\n );\n}\n\n/**\n * 执行检查项完成或重新打开快捷命令。\n *\n * @param context 命令上下文\n * @param toolName Tool 名称\n * @param commandName 快捷命令名称\n * @param options 检查项状态参数\n */\nasync function runTaskCheckStatusShortcut(\n context: CommandContext,\n toolName: string,\n commandName: string,\n options: TaskCheckStatusShortcutOptions,\n): Promise<void> {\n requireTaskConfirmation(options, commandName);\n await runToolShortcut(\n context,\n toolName,\n { task_check_id: options.taskCheckId },\n options,\n );\n}\n\n/**\n * 执行任务写入快捷命令,并在需要时先上传本地附件。\n *\n * <p>项目任务本地附件使用临时附件上传 Tool;个人任务本地附件使用普通附件上传 Tool。\n * 上传结果会提取结构化返回中的文件对象 values,并序列化为后端任务 Tool 所需的 files JSON 数组字符串。</p>\n *\n * @param context 命令上下文\n * @param toolName 任务 Tool 名称\n * @param commandName 快捷命令名称\n * @param args Tool arguments\n * @param options 命令参数\n * @param uploadToolName 附件上传 Tool 名称\n */\nasync function runTaskWriteShortcut(\n context: CommandContext,\n toolName: string,\n commandName: string,\n args: Record<string, unknown>,\n options: TaskAttachmentOptions,\n uploadToolName?: string,\n): Promise<void> {\n requireTaskConfirmation(options, commandName);\n assertFilesOptions(options, uploadToolName);\n const attachmentPaths = normalizeRepeatedOption(options.attachment);\n const explicitFilesJson = normalizeFilesJsonOption(options.filesJson);\n if (!attachmentPaths) {\n await runToolShortcut(\n context,\n toolName,\n appendFilesArg(args, resolveDirectFilesJson(options, explicitFilesJson)),\n options,\n );\n return;\n }\n if (!uploadToolName) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"Local attachments require --attachment-scope project or personal.\",\n hint: \"Use --attachment-scope project for project task attachments, or --attachment-scope personal for personal task attachments.\",\n });\n }\n await runTaskWriteShortcutWithUploads(\n context,\n toolName,\n args,\n options,\n uploadToolName,\n attachmentPaths,\n );\n}\n\n/**\n * 执行带本地附件上传的任务写入命令。\n *\n * @param context 命令上下文\n * @param toolName 任务 Tool 名称\n * @param args Tool arguments\n * @param options 命令参数\n * @param uploadToolName 附件上传 Tool 名称\n * @param attachmentPaths 本地附件路径列表\n */\nasync function runTaskWriteShortcutWithUploads(\n context: CommandContext,\n toolName: string,\n args: Record<string, unknown>,\n options: TaskAttachmentOptions,\n uploadToolName: string,\n attachmentPaths: string[],\n): Promise<void> {\n const runtimeObject = options.runtimeJson\n ? parseJsonObject(options.runtimeJson)\n : undefined;\n const uploadPayload = {\n ...(runtimeObject ? { runtime: runtimeObject } : {}),\n };\n if (options.dryRun) {\n const filesJson = buildUploadedFilesPreviewJson(uploadToolName, attachmentPaths);\n writeData(\n {\n dryRun: true,\n shortcut: true,\n toolName,\n uploadToolName,\n api: [\n ...attachmentPaths.map((filePath) => ({\n method: \"POST\",\n url: `/law/api/v1/cli/tools/${encodeURIComponent(uploadToolName)}/upload`,\n multipart: {\n file: filePath,\n ...uploadPayload,\n },\n })),\n {\n method: \"POST\",\n url: `/law/api/v1/cli/tools/${encodeURIComponent(toolName)}/invoke`,\n body: buildToolPayload(appendFilesArg(args, filesJson), options, runtimeObject),\n },\n ],\n },\n resolveOutputOptions(options),\n );\n return;\n }\n\n const { baseUrl, client } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n const uploadedFiles: Record<string, unknown>[] = [];\n for (const filePath of attachmentPaths) {\n const uploadResult = await client.uploadToolFile(\n baseUrl,\n uploadToolName,\n filePath,\n uploadPayload,\n );\n uploadedFiles.push(extractUploadedFileObject(uploadResult));\n }\n const payload = buildToolPayload(\n appendFilesArg(args, JSON.stringify(uploadedFiles)),\n options,\n runtimeObject,\n );\n const result = await invokeToolWithOptionalPagination(\n client,\n baseUrl,\n toolName,\n payload,\n options,\n );\n writeData(result, resolveOutputOptions(options));\n}\n\n/**\n * 构建任务写入公共参数。\n *\n * @param options 创建或更新命令参数\n * @return Tool arguments\n */\nfunction buildTaskCommonWriteArgs(\n options: TaskProjectCreateShortcutOptions | TaskPersonalCreateShortcutOptions | TaskUpdateShortcutOptions,\n): Record<string, unknown> {\n const assigneeNames = parseCsvOption(options.assigneeNames);\n const checklistItems = normalizeRepeatedOption(options.checklistItem);\n return {\n ...(options.title ? { title: options.title } : {}),\n ...(options.details ? { details: options.details } : {}),\n ...(assigneeNames ? { assignee_names: assigneeNames } : {}),\n ...(options.deadline ? { deadline: options.deadline } : {}),\n ...(checklistItems ? { checklist_items: checklistItems } : {}),\n ...(options.taskGrade ? { task_grade: options.taskGrade } : {}),\n };\n}\n\n/**\n * 构建我的待办任务查询参数。\n *\n * @param options 待办任务查询参数\n * @return Tool arguments\n */\nfunction buildTaskPendingArgs(\n options: TaskPendingShortcutOptions,\n): Record<string, unknown> {\n return {\n ...(options.keyword ? { keyword: options.keyword } : {}),\n ...(options.project ? { project_name_or_number: options.project } : {}),\n ...(options.personalOnly !== undefined ? { personal_only: options.personalOnly } : {}),\n ...(options.overdueOnly !== undefined ? { overdue_only: options.overdueOnly } : {}),\n };\n}\n\n/**\n * 写任务前检查用户确认。\n *\n * @param options 快捷命令参数\n * @param commandName 任务子命令名称\n */\nfunction requireTaskConfirmation(\n options: ShortcutOptions,\n commandName: string,\n): void {\n if (!options.confirm && !options.dryRun) {\n throw new ConfirmationRequiredError(`mt-os-cli task ${commandName}`);\n }\n}\n\n/**\n * 校验附件参数组合。\n *\n * @param options 附件命令参数\n * @param uploadToolName 当前命令可使用的上传 Tool\n */\nfunction assertFilesOptions(\n options: TaskAttachmentOptions,\n uploadToolName?: string,\n): void {\n const attachmentPaths = normalizeRepeatedOption(options.attachment);\n if (options.filesJson && attachmentPaths) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"--files-json cannot be used with --attachment.\",\n hint: \"Use --attachment for local files, or pass already uploaded file objects through --files-json.\",\n });\n }\n if (attachmentPaths && !uploadToolName) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"--attachment requires --attachment-scope for task update.\",\n hint: \"Use --attachment-scope project or --attachment-scope personal.\",\n });\n }\n}\n\n/**\n * 解析更新任务附件上传 Tool。\n *\n * @param options 任务更新参数\n * @return 上传 Tool 名称;没有本地附件时返回 undefined\n */\nfunction resolveUpdateUploadToolName(\n options: TaskUpdateShortcutOptions,\n): string | undefined {\n if (options.clearFiles && (options.filesJson || normalizeRepeatedOption(options.attachment))) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"--clear-files cannot be used with --files-json or --attachment.\",\n hint: \"Use --clear-files to clear attachments, or provide replacement attachments.\",\n });\n }\n if (!normalizeRepeatedOption(options.attachment)) {\n return undefined;\n }\n const normalizedScope = options.attachmentScope?.trim().toLowerCase();\n if (normalizedScope === \"project\") {\n return PROJECT_ATTACHMENT_UPLOAD_TOOL_NAME;\n }\n if (normalizedScope === \"personal\") {\n return PERSONAL_ATTACHMENT_UPLOAD_TOOL_NAME;\n }\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"--attachment-scope must be project or personal when using --attachment.\",\n hint: \"Project task attachments use upload_temporary_attachment; personal task attachments use upload_attachment.\",\n });\n}\n\n/**\n * 解析直接传入的 files 参数。\n *\n * @param options 附件命令参数\n * @param explicitFilesJson 已校验的显式 files JSON\n * @return files 参数值;未传时返回 undefined\n */\nfunction resolveDirectFilesJson(\n options: TaskAttachmentOptions,\n explicitFilesJson: string | undefined,\n): string | undefined {\n if (\"clearFiles\" in options && options.clearFiles) {\n return \"[]\";\n }\n return explicitFilesJson;\n}\n\n/**\n * 追加 files 参数。\n *\n * @param args 原始 Tool arguments\n * @param filesJson 附件 JSON 数组字符串\n * @return 追加后的 Tool arguments\n */\nfunction appendFilesArg(\n args: Record<string, unknown>,\n filesJson: string | undefined,\n): Record<string, unknown> {\n return filesJson === undefined ? args : { ...args, files: filesJson };\n}\n\n/**\n * 构建 Tool 调用请求体。\n *\n * @param args Tool arguments\n * @param options 命令参数\n * @param runtimeObject 运行时上下文\n * @return Tool 调用请求\n */\nfunction buildToolPayload(\n args: Record<string, unknown>,\n options: ShortcutOptions,\n runtimeObject: Record<string, unknown> | undefined,\n): {\n arguments: Record<string, unknown>;\n runtime?: Record<string, unknown>;\n confirm?: boolean;\n} {\n return {\n arguments: applyPaginationArguments(args, options),\n ...(runtimeObject ? { runtime: runtimeObject } : {}),\n ...(options.confirm !== undefined ? { confirm: options.confirm } : {}),\n };\n}\n\n/**\n * 规范化 files JSON 数组字符串。\n *\n * @param value 命令行传入的 JSON 字符串\n * @return 压缩后的 JSON 数组字符串\n */\nfunction normalizeFilesJsonOption(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const parsed = JSON.parse(value) as unknown;\n if (!Array.isArray(parsed)) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"--files-json must be a JSON array string.\",\n hint: 'Example: --files-json \\'[{\"id\":\"file-id\",\"name\":\"file.pdf\"}]\\'',\n });\n }\n return JSON.stringify(parsed);\n}\n\n/**\n * 从上传 Tool 返回结果中提取文件对象。\n *\n * @param uploadResult 上传 Tool 返回结果\n * @return 文件对象\n */\nfunction extractUploadedFileObject(uploadResult: unknown): Record<string, unknown> {\n const candidates = [\n readPath(uploadResult, [\"result\", \"items\", 0, \"values\"]),\n readPath(uploadResult, [\"result\", \"data\"]),\n readPath(uploadResult, [\"data\"]),\n uploadResult,\n ];\n for (const candidate of candidates) {\n const fileObject = normalizeUploadedFileCandidate(candidate);\n if (fileObject) {\n return fileObject;\n }\n }\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"Upload result does not contain a recognizable file object.\",\n hint: \"Inspect the upload result with mt-os-cli tool upload <filePath>.\",\n detail: uploadResult,\n });\n}\n\n/**\n * 规范化上传返回候选对象。\n *\n * @param candidate 候选返回对象\n * @return 文件对象;无法识别时返回 undefined\n */\nfunction normalizeUploadedFileCandidate(\n candidate: unknown,\n): Record<string, unknown> | undefined {\n const value = Array.isArray(candidate) ? candidate[0] : candidate;\n if (!isRecord(value) || value.id === undefined || value.id === null) {\n return undefined;\n }\n return {\n ...value,\n id: String(value.id),\n };\n}\n\n/**\n * 构建 dry-run 中的附件结果占位 JSON。\n *\n * @param uploadToolName 上传 Tool 名称\n * @param attachmentPaths 附件路径列表\n * @return 预览用 files JSON 字符串\n */\nfunction buildUploadedFilesPreviewJson(\n uploadToolName: string,\n attachmentPaths: string[],\n): string {\n return JSON.stringify(\n attachmentPaths.map((filePath, index) => ({\n id: `${uploadToolName}_returned_file_${index + 1}`,\n name: filePath,\n })),\n );\n}\n\n/**\n * 解析逗号分隔的命令行参数。\n *\n * @param value 原始参数\n * @return 非空参数数组;没有有效值时返回 undefined\n */\nfunction parseCsvOption(value: string | undefined): string[] | undefined {\n const items = value\n ?.split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n return items && items.length > 0 ? items : undefined;\n}\n\n/**\n * 收集可重复命令行选项。\n *\n * @param value 当前参数值\n * @param previous 已收集参数\n * @return 合并后的参数数组\n */\nfunction collectOption(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\n/**\n * 规范化可重复命令行参数。\n *\n * @param values 原始参数数组\n * @return 非空参数数组;没有有效值时返回 undefined\n */\nfunction normalizeRepeatedOption(values: string[] | undefined): string[] | undefined {\n const items = values\n ?.map((item) => item.trim())\n .filter(Boolean);\n return items && items.length > 0 ? items : undefined;\n}\n\n/**\n * 按路径读取对象字段。\n *\n * @param value 原始对象\n * @param path 字段路径\n * @return 路径对应的值\n */\nfunction readPath(value: unknown, path: Array<string | number>): unknown {\n return path.reduce<unknown>((current, segment) => {\n if (current === undefined || current === null) {\n return undefined;\n }\n if (typeof segment === \"number\") {\n return Array.isArray(current) ? current[segment] : undefined;\n }\n return isRecord(current) ? current[segment] : undefined;\n }, value);\n}\n\n/**\n * 判断值是否为普通对象。\n *\n * @param value 原始值\n * @return 是否为普通对象\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { Command } from \"commander\";\n\nimport { ConfirmationRequiredError, writeData } from \"../output/cli-output.js\";\nimport { addPaginationOptions } from \"../cli/pagination.js\";\nimport {\n parseInteger,\n parseJsonObject,\n resolveApiCommandContext,\n resolveOutputOptions,\n type CommandContext,\n} from \"../cli/context.js\";\nimport { runToolShortcut, type ShortcutOptions } from \"./shortcut-common.js\";\nimport { registerScheduleCommand } from \"./shortcut-schedule.js\";\nimport { registerTaskCommand } from \"./shortcut-task.js\";\n\nconst DEFAULT_UPLOAD_TOOL_NAME = \"upload_attachment\";\n\n/**\n * 客户快捷命令参数。\n */\ninterface CustomerShortcutOptions extends ShortcutOptions {\n limit?: number;\n}\n\n/**\n * 草稿快捷命令参数。\n */\ninterface DraftShortcutOptions extends ShortcutOptions {\n includeSchema?: boolean;\n}\n\n/**\n * 附件快捷命令参数。\n */\ninterface AttachmentShortcutOptions extends ShortcutOptions {\n toolName?: string;\n}\n\n/**\n * 计时创建快捷命令参数。\n */\ninterface TimingCreateShortcutOptions extends ShortcutOptions {\n project: string;\n date: string;\n startTime?: string;\n endTime?: string;\n duration?: number;\n durationMinutes?: number;\n workDetail: string;\n workType?: string;\n}\n\n/**\n * 计时区间查询快捷命令参数。\n */\ninterface TimingRangeShortcutOptions extends ShortcutOptions {\n from: string;\n to: string;\n targetMinutes?: number;\n project?: string;\n user?: string;\n workType?: string;\n keyword?: string;\n}\n\n/**\n * 注册业务快捷命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerShortcutCommands(\n program: Command,\n context: CommandContext,\n): void {\n registerCustomerCommand(program, context);\n registerProjectCommand(program, context);\n registerTimingCommand(program, context);\n registerScheduleCommand(program, context);\n registerTaskCommand(program, context);\n registerDraftCommand(program, context);\n registerAttachmentCommand(program, context);\n}\n\n/**\n * 注册客户快捷命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nfunction registerCustomerCommand(\n program: Command,\n context: CommandContext,\n): void {\n const customer = program\n .command(\"customer\")\n .description(\"Customer shortcuts backed by MTOS tools\");\n\n customer\n .command(\"+count-by-owner\")\n .description(\"Count customers grouped by owner\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--limit <number>\", \"Maximum owner rows to return\", parseInteger)\n .option(\"--runtime-json <json>\", \"Tool runtime JSON object\")\n .option(\"--dry-run\", \"Print the request preview without executing\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (options: CustomerShortcutOptions) => {\n const args = options.limit !== undefined ? { limit: options.limit } : {};\n await runToolShortcut(\n context,\n \"query_customer_count_by_owner\",\n args,\n options,\n );\n });\n\n const recent = customer\n .command(\"+recent-created\")\n .description(\"List recently created customers\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--runtime-json <json>\", \"Tool runtime JSON object\")\n .option(\"--dry-run\", \"Print the request preview without executing\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\");\n addPaginationOptions(recent).action(async (options: ShortcutOptions) => {\n await runToolShortcut(context, \"query_customer_recent_created\", {}, options);\n });\n}\n\n/**\n * 注册项目快捷命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nfunction registerProjectCommand(\n program: Command,\n context: CommandContext,\n): void {\n const project = program\n .command(\"project\")\n .description(\"Project shortcuts backed by MTOS tools\");\n\n const inProgress = project\n .command(\"+in-progress\")\n .description(\"List in-progress projects related to current user\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--runtime-json <json>\", \"Tool runtime JSON object\")\n .option(\"--dry-run\", \"Print the request preview without executing\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\");\n addPaginationOptions(inProgress).action(async (options: ShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_project_in_progress_current_user\",\n {},\n options,\n );\n });\n}\n\n/**\n * 注册计时快捷命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nfunction registerTimingCommand(\n program: Command,\n context: CommandContext,\n): void {\n const timing = program\n .command(\"timing\")\n .description(\"Timing shortcuts backed by MTOS tools\");\n\n timing\n .command(\"+create\")\n .description(\"Create project timing for current user\")\n .requiredOption(\"--project <nameOrNumber>\", \"Project name or number\")\n .requiredOption(\"--date <yyyy-MM-dd>\", \"Work date\")\n .option(\"--start-time <time>\", \"Start time, for example 09:00\")\n .option(\"--end-time <time>\", \"End time, for example 11:00\")\n .option(\"--duration <minutes>\", \"Duration minutes\", parseInteger)\n .option(\"--duration-minutes <minutes>\", \"Duration minutes\", parseInteger)\n .requiredOption(\"--work-detail <text>\", \"Timing work detail\")\n .option(\"--work-type <name>\", \"Work type name\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--runtime-json <json>\", \"Tool runtime JSON object\")\n .option(\"--confirm\", \"Confirm creating timing\")\n .option(\"--dry-run\", \"Print the request preview without executing\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (options: TimingCreateShortcutOptions) => {\n await runTimingCreateShortcut(context, options);\n });\n\n timingRangeCommand(timing, \"+total\", \"Read current user's timing total\")\n .action(async (options: TimingRangeShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_timing_total_current_user\",\n buildTimingRangeArgs(options),\n options,\n );\n });\n\n timingRangeCommand(timing, \"+day-summary\", \"Read current user's daily timing summary\", {\n target: false,\n })\n .action(async (options: TimingRangeShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_timing_day_summary_current_user\",\n buildTimingRangeArgs(options, { includeTarget: false }),\n options,\n );\n });\n\n const detail = timingRangeCommand(timing, \"+detail\", \"Read current user's timing detail\", {\n target: false,\n })\n .option(\"--project <nameOrNumber>\", \"Project name or number\")\n .option(\"--work-type <name>\", \"Work type name\")\n .option(\"--keyword <keyword>\", \"Work detail keyword\");\n addPaginationOptions(detail).action(async (options: TimingRangeShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_timing_detail_current_user\",\n buildTimingDetailArgs(options),\n options,\n );\n });\n\n timingRangeCommand(timing, \"+user-total\", \"Read timing total by user name\")\n .requiredOption(\"--user <name>\", \"User name\")\n .action(async (options: TimingRangeShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_timing_total_by_user_name\",\n buildTimingRangeArgs(options, { includeUser: true }),\n options,\n );\n });\n\n timingRangeCommand(timing, \"+user-summary\", \"Read timing summary by user name\")\n .requiredOption(\"--user <name>\", \"User name\")\n .action(async (options: TimingRangeShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_timing_summary_by_user_name\",\n buildTimingRangeArgs(options, { includeUser: true }),\n options,\n );\n });\n\n const userDetail = timingRangeCommand(timing, \"+user-detail\", \"Read timing detail by user name\", {\n target: false,\n })\n .requiredOption(\"--user <name>\", \"User name\")\n .option(\"--project <nameOrNumber>\", \"Project name or number\")\n .option(\"--work-type <name>\", \"Work type name\")\n .option(\"--keyword <keyword>\", \"Work detail keyword\");\n addPaginationOptions(userDetail).action(async (options: TimingRangeShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_timing_detail_by_user_name\",\n buildTimingDetailArgs(options, { includeUser: true }),\n options,\n );\n });\n\n timingRangeCommand(timing, \"+project-total\", \"Read timing total by project\", {\n target: false,\n })\n .requiredOption(\"--project <nameOrNumber>\", \"Project name or number\")\n .action(async (options: TimingRangeShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_project_timing_total\",\n buildTimingRangeArgs(options, { includeProject: true, includeTarget: false }),\n options,\n );\n });\n\n const projectDetail = timingRangeCommand(timing, \"+project-detail\", \"Read timing detail by project\", {\n target: false,\n })\n .requiredOption(\"--project <nameOrNumber>\", \"Project name or number\")\n .option(\"--user <name>\", \"User name\")\n .option(\"--work-type <name>\", \"Work type name\")\n .option(\"--keyword <keyword>\", \"Work detail keyword\");\n addPaginationOptions(projectDetail).action(async (options: TimingRangeShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_project_timing_detail\",\n buildTimingDetailArgs(options, { includeProject: true, includeUser: true }),\n options,\n );\n });\n\n timingRangeCommand(timing, \"+project-lawyer-summary\", \"Read project timing summary grouped by lawyer\", {\n target: false,\n })\n .requiredOption(\"--project <nameOrNumber>\", \"Project name or number\")\n .action(async (options: TimingRangeShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_project_timing_summary_by_lawyer\",\n buildTimingRangeArgs(options, { includeProject: true, includeTarget: false }),\n options,\n );\n });\n}\n\n/**\n * 构建计时区间类命令的公共选项。\n *\n * @param parent 父命令\n * @param name 子命令名称\n * @param description 子命令描述\n * @return 子命令对象\n */\nfunction timingRangeCommand(\n parent: Command,\n name: string,\n description: string,\n options: {\n target?: boolean;\n } = {},\n): Command {\n const command = parent\n .command(name)\n .description(description)\n .requiredOption(\"--from <yyyy-MM-dd>\", \"Start date\")\n .requiredOption(\"--to <yyyy-MM-dd>\", \"End date\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--runtime-json <json>\", \"Tool runtime JSON object\")\n .option(\"--dry-run\", \"Print the request preview without executing\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\");\n if (options.target !== false) {\n command.option(\"--target-minutes <minutes>\", \"Target minutes\", parseInteger);\n }\n return command;\n}\n\n/**\n * 执行当前用户补录计时快捷命令。\n *\n * @param context 命令上下文\n * @param options 计时创建参数\n */\nasync function runTimingCreateShortcut(\n context: CommandContext,\n options: TimingCreateShortcutOptions,\n): Promise<void> {\n if (!options.confirm && !options.dryRun) {\n throw new ConfirmationRequiredError(\"mt-os-cli timing +create\");\n }\n const durationMinutes = options.durationMinutes ?? options.duration;\n await runToolShortcut(\n context,\n \"create_project_timing_current_user\",\n {\n project_name_or_number: options.project,\n work_date: options.date,\n ...(options.startTime ? { start_time: options.startTime } : {}),\n ...(options.endTime ? { end_time: options.endTime } : {}),\n ...(durationMinutes !== undefined ? { duration_minutes: durationMinutes } : {}),\n work_detail: options.workDetail,\n ...(options.workType ? { work_type_name: options.workType } : {}),\n },\n options,\n );\n}\n\n/**\n * 构建计时区间 Tool 参数。\n *\n * @param options 计时区间命令参数\n * @param config 参数包含规则\n * @return Tool arguments\n */\nfunction buildTimingRangeArgs(\n options: TimingRangeShortcutOptions,\n config: {\n includeProject?: boolean;\n includeUser?: boolean;\n includeTarget?: boolean;\n } = {},\n): Record<string, unknown> {\n return {\n start_date: options.from,\n end_date: options.to,\n ...(config.includeProject && options.project\n ? { project_name_or_number: options.project }\n : {}),\n ...(config.includeUser && options.user ? { user_name: options.user } : {}),\n ...(config.includeTarget !== false && options.targetMinutes !== undefined\n ? { target_minutes: options.targetMinutes }\n : {}),\n };\n}\n\n/**\n * 构建计时明细 Tool 参数。\n *\n * @param options 计时明细命令参数\n * @param config 参数包含规则\n * @return Tool arguments\n */\nfunction buildTimingDetailArgs(\n options: TimingRangeShortcutOptions,\n config: {\n includeProject?: boolean;\n includeUser?: boolean;\n } = {},\n): Record<string, unknown> {\n return {\n start_date: options.from,\n end_date: options.to,\n ...(config.includeProject && options.project\n ? { project_name_or_number: options.project }\n : {}),\n ...(config.includeUser && options.user ? { user_name: options.user } : {}),\n ...(!config.includeProject && options.project\n ? { project_name_or_number: options.project }\n : {}),\n ...(options.workType ? { work_type_name: options.workType } : {}),\n ...(options.keyword ? { keyword: options.keyword } : {}),\n };\n}\n\n/**\n * 注册草稿快捷命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nfunction registerDraftCommand(\n program: Command,\n context: CommandContext,\n): void {\n const draft = program\n .command(\"draft\")\n .description(\"Draft shortcuts backed by MTOS tools\");\n\n draft\n .command(\"+current\")\n .description(\"Read current active business draft\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--include-schema\", \"Include form schema when supported by the tool\")\n .option(\"--runtime-json <json>\", \"Tool runtime JSON object\")\n .option(\"--dry-run\", \"Print the request preview without executing\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (options: DraftShortcutOptions) => {\n await runToolShortcut(\n context,\n \"query_current_draft\",\n {\n include_schema: Boolean(options.includeSchema),\n },\n options,\n );\n });\n}\n\n/**\n * 注册附件快捷命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nfunction registerAttachmentCommand(\n program: Command,\n context: CommandContext,\n): void {\n const attachment = program\n .command(\"attachment\")\n .description(\"Attachment shortcuts backed by MTOS tools\");\n\n attachment\n .command(\"+upload\")\n .description(\"Upload a local file as an MTOS attachment\")\n .argument(\"<filePath>\", \"Local file path\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\n \"--tool-name <toolName>\",\n \"Upload tool name, defaults to upload_attachment\",\n )\n .option(\"--runtime-json <json>\", \"Tool runtime JSON object\")\n .option(\"--dry-run\", \"Print the request preview without executing\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\")\n .action(async (filePath: string, options: AttachmentShortcutOptions) => {\n await runAttachmentUpload(context, filePath, options);\n });\n}\n\n/**\n * 上传附件快捷命令。\n *\n * @param context 命令上下文\n * @param filePath 本地文件路径\n * @param options 命令参数\n */\nasync function runAttachmentUpload(\n context: CommandContext,\n filePath: string,\n options: AttachmentShortcutOptions,\n): Promise<void> {\n const runtimeObject = options.runtimeJson\n ? parseJsonObject(options.runtimeJson)\n : undefined;\n const toolName = options.toolName ?? DEFAULT_UPLOAD_TOOL_NAME;\n const payload = {\n ...(runtimeObject ? { runtime: runtimeObject } : {}),\n };\n if (options.dryRun) {\n writeData(\n {\n dryRun: true,\n shortcut: true,\n toolName,\n api: [\n {\n method: \"POST\",\n url: `/law/api/v1/cli/tools/${encodeURIComponent(toolName)}/upload`,\n multipart: {\n file: filePath,\n ...payload,\n },\n },\n ],\n },\n resolveOutputOptions(options),\n );\n return;\n }\n const { baseUrl, client } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n const result = await client.uploadToolFile(\n baseUrl,\n toolName,\n filePath,\n payload,\n );\n writeData(result, resolveOutputOptions(options));\n}\n","import { Command } from \"commander\";\n\nimport {\n CliExitError,\n ConfirmationRequiredError,\n writeData,\n} from \"../output/cli-output.js\";\nimport {\n isConfirmationRequired,\n toAgentFriendlyToolSchema,\n} from \"../tool/schema.js\";\nimport {\n addPaginationOptions,\n applyPaginationArguments,\n invokeToolWithOptionalPagination,\n} from \"../cli/pagination.js\";\nimport {\n parseJsonObject,\n resolveApiCommandContext,\n resolveOutputOptions,\n type CommandContext,\n type ToolCommandOptions,\n} from \"../cli/context.js\";\n\nconst DEFAULT_UPLOAD_TOOL_NAME = \"upload_attachment\";\n\n/**\n * 注册 Tool 命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerToolCommand(\n program: Command,\n context: CommandContext,\n): void {\n const tool = program\n .command(\"tool\")\n .description(\"HTTP tool entry: list/get/call/upload\")\n .argument(\"<action>\", \"Action: list, get, call, upload\")\n .argument(\"[target]\", \"Tool name for get/call, or file path for upload\")\n .option(\"--domain <domain>\", \"Filter by tool domain\")\n .option(\"--subject-type <subjectType>\", \"Filter by tool subjectType\")\n .option(\"--keyword <keyword>\", \"Filter by keyword\")\n .option(\"--env <name>\", \"Preset environment: local, dev, test, prod\")\n .option(\"--base-url <url>\", \"MTOS web base URL\")\n .option(\"--args-json <json>\", \"Tool arguments JSON object for call\")\n .option(\"--runtime-json <json>\", \"Tool runtime JSON object for call\")\n .option(\n \"--tool-name <toolName>\",\n \"Upload tool name, defaults to upload_attachment\",\n )\n .option(\"--confirm\", \"Confirm execution for write tools\")\n .option(\"--dry-run\", \"Print the request preview without executing\")\n .option(\n \"--format <format>\",\n \"Output format: json, pretty, table, ndjson, csv\",\n \"json\",\n )\n .option(\"--jq <expr>\", \"Simple jq-style dot path filter\");\n addPaginationOptions(tool)\n .action(\n async (\n action: string,\n target: string | undefined,\n options: ToolCommandOptions,\n ) => {\n await runToolCommand(action, target, options, context);\n },\n );\n}\n\n/**\n * 执行 Tool 子动作。\n *\n * @param action 动作\n * @param target 目标\n * @param options 命令选项\n * @param context 命令上下文\n */\nasync function runToolCommand(\n action: string,\n target: string | undefined,\n options: ToolCommandOptions,\n context: CommandContext,\n): Promise<void> {\n const normalizedAction = action.trim().toLowerCase();\n if (normalizedAction === \"list\") {\n await runToolList(context, options);\n return;\n }\n if (normalizedAction === \"get\") {\n if (!target) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"Missing toolName.\",\n hint: \"Use: mt-os-cli tool get <toolName>\",\n });\n }\n await runToolGet(context, target, options);\n return;\n }\n if (normalizedAction === \"call\") {\n if (!target) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"Missing toolName.\",\n hint: \"Use: mt-os-cli tool call <toolName>\",\n });\n }\n await runToolCall(context, target, options);\n return;\n }\n if (normalizedAction === \"upload\") {\n if (!target) {\n throw new CliExitError(2, {\n type: \"validation\",\n message: \"Missing filePath.\",\n hint: \"Use: mt-os-cli tool upload <filePath>\",\n });\n }\n await runToolUpload(context, target, options);\n return;\n }\n throw new CliExitError(2, {\n type: \"validation\",\n message: `Unknown tool action: ${normalizedAction}`,\n hint: \"Supported actions: list, get, call, upload\",\n });\n}\n\n/**\n * 查询当前登录用户可调用的 Tool 列表。\n *\n * @param context 命令上下文\n * @param options 查询过滤条件\n */\nasync function runToolList(\n context: CommandContext,\n options: ToolCommandOptions,\n): Promise<void> {\n const { baseUrl, client } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n const data = await client.listTools(baseUrl, options);\n writeData(data, resolveOutputOptions(options));\n}\n\n/**\n * 查询单个 Tool 的完整定义。\n *\n * @param context 命令上下文\n * @param toolName Tool 技术名称\n * @param options 输出选项\n */\nasync function runToolGet(\n context: CommandContext,\n toolName: string,\n options: ToolCommandOptions,\n): Promise<void> {\n const { baseUrl, client } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n const data = await client.getTool(baseUrl, toolName);\n writeData(data, resolveOutputOptions(options));\n}\n\n/**\n * 通过正式 HTTP 入口调用 Tool。\n *\n * @param context 命令上下文\n * @param toolName Tool 技术名称\n * @param options 调用参数和运行时上下文\n */\nasync function runToolCall(\n context: CommandContext,\n toolName: string,\n options: ToolCommandOptions,\n): Promise<void> {\n const { baseUrl, client } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n const argumentsObject = options.argsJson\n ? parseJsonObject(options.argsJson)\n : {};\n const runtimeObject = options.runtimeJson\n ? parseJsonObject(options.runtimeJson)\n : undefined;\n const payload = {\n arguments: applyPaginationArguments(argumentsObject, options),\n ...(runtimeObject ? { runtime: runtimeObject } : {}),\n ...(options.confirm !== undefined ? { confirm: options.confirm } : {}),\n };\n if (options.dryRun) {\n const definition = await client.getTool(baseUrl, toolName);\n writeData(\n {\n dryRun: true,\n toolName,\n api: [\n {\n method: \"POST\",\n url: `/law/api/v1/cli/tools/${encodeURIComponent(toolName)}/invoke`,\n body: payload,\n },\n ],\n schema: toAgentFriendlyToolSchema(definition),\n },\n resolveOutputOptions(options),\n );\n return;\n }\n const definition = await client.getTool(baseUrl, toolName);\n if (!options.confirm && isConfirmationRequired(definition)) {\n throw new ConfirmationRequiredError(`mt-os-cli tool call ${toolName}`);\n }\n const result = await invokeToolWithOptionalPagination(\n client,\n baseUrl,\n toolName,\n payload,\n options,\n );\n writeData(result, resolveOutputOptions(options));\n}\n\n/**\n * 上传本地文件并调用服务端上传附件 Tool。\n *\n * @param context 命令上下文\n * @param filePath 本地文件路径\n * @param options 上传选项\n */\nasync function runToolUpload(\n context: CommandContext,\n filePath: string,\n options: ToolCommandOptions,\n): Promise<void> {\n const { baseUrl, client } = await resolveApiCommandContext(\n context.sessionStore,\n options,\n );\n const runtimeObject = options.runtimeJson\n ? parseJsonObject(options.runtimeJson)\n : undefined;\n const toolName = options.toolName ?? DEFAULT_UPLOAD_TOOL_NAME;\n const payload = {\n ...(runtimeObject ? { runtime: runtimeObject } : {}),\n ...(options.confirm !== undefined ? { confirm: options.confirm } : {}),\n };\n if (options.dryRun) {\n writeData(\n {\n dryRun: true,\n toolName,\n api: [\n {\n method: \"POST\",\n url: `/law/api/v1/cli/tools/${encodeURIComponent(toolName)}/upload`,\n multipart: {\n file: filePath,\n ...payload,\n },\n },\n ],\n },\n resolveOutputOptions(options),\n );\n return;\n }\n const result = await client.uploadToolFile(\n baseUrl,\n toolName,\n filePath,\n payload,\n );\n writeData(result, resolveOutputOptions(options));\n}\n","import { spawn } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { CLI_NAME } from \"../cli/context.js\";\n\nconst NPM_INSTALL_TIMEOUT_MS = 10 * 60 * 1000;\nconst SKILLS_UPDATE_TIMEOUT_MS = 2 * 60 * 1000;\nconst VERIFY_TIMEOUT_MS = 10 * 1000;\nconst MAX_COMMAND_OUTPUT_LENGTH = 2000;\n\n/**\n * CLI 安装方式。\n */\nexport type InstallMethod = \"npm\" | \"manual\";\n\n/**\n * 安装方式检测结果。\n */\nexport interface InstallDetection {\n method: InstallMethod;\n resolvedPath?: string;\n npmAvailable: boolean;\n canAutoUpdate: boolean;\n}\n\n/**\n * 子进程执行结果。\n */\nexport interface CommandRunResult {\n command: string;\n args: string[];\n stdout: string;\n stderr: string;\n exitCode: number | null;\n error?: Error;\n timedOut: boolean;\n}\n\n/**\n * 自更新器可替换依赖。\n */\nexport interface SelfUpdaterOptions {\n packageName?: string;\n commandName?: string;\n entryPath?: string;\n commandRunner?: (\n command: string,\n args: string[],\n timeoutMs: number,\n ) => Promise<CommandRunResult>;\n}\n\n/**\n * npm 自更新执行器。\n *\n * <p>这里按飞书 CLI 的做法拆成三步:先判断安装方式,再执行包管理器更新,最后校验本机\n * 安装目录中的 package.json 版本。校验不直接运行 `--version`,因为本项目的 `--version`\n * 是诊断输出,可能读取登录态或访问业务环境。\n */\nexport class SelfUpdater {\n private readonly packageName: string;\n private readonly commandName: string;\n private readonly entryPath: string | undefined;\n private readonly commandRunner: (\n command: string,\n args: string[],\n timeoutMs: number,\n ) => Promise<CommandRunResult>;\n\n constructor(options?: SelfUpdaterOptions) {\n this.packageName = options?.packageName ?? CLI_NAME;\n this.commandName = options?.commandName ?? \"mt-os-cli\";\n this.entryPath = options?.entryPath;\n this.commandRunner = options?.commandRunner ?? runCommand;\n }\n\n /**\n * 判断当前 CLI 是否可通过 npm 自动更新。\n *\n * @returns 安装方式检测结果\n */\n async detectInstallMethod(): Promise<InstallDetection> {\n const resolvedPath = await resolveEntryPath(this.entryPath);\n const method =\n resolvedPath && normalizePath(resolvedPath).includes(\"/node_modules/\")\n ? \"npm\"\n : \"manual\";\n const npmAvailable =\n method === \"npm\" ? await this.isCommandAvailable(\"npm\") : false;\n return {\n method,\n ...(resolvedPath ? { resolvedPath } : {}),\n npmAvailable,\n canAutoUpdate: method === \"npm\" && npmAvailable,\n };\n }\n\n /**\n * 执行 npm 全局安装指定版本。\n *\n * @param version 目标版本\n * @returns 子进程执行结果\n */\n async runNpmInstall(version: string): Promise<CommandRunResult> {\n return this.commandRunner(\n platformCommand(\"npm\"),\n [\"install\", \"-g\", `${this.packageName}@${version}`],\n NPM_INSTALL_TIMEOUT_MS,\n );\n }\n\n /**\n * 更新本机 skill 文件。\n *\n * @returns 子进程执行结果\n */\n async runSkillsUpdate(): Promise<CommandRunResult> {\n return this.commandRunner(\n platformCommand(this.commandName),\n [\"skills\", \"update\"],\n SKILLS_UPDATE_TIMEOUT_MS,\n );\n }\n\n /**\n * 校验当前命令对应的 npm 包版本。\n *\n * @param expectedVersion 期望版本\n * @param preferredEntryPath 优先用于解析包根目录的入口路径\n */\n async verifyInstalledPackageVersion(\n expectedVersion: string,\n preferredEntryPath?: string,\n ): Promise<void> {\n const entryPath =\n preferredEntryPath ?? await resolveEntryPath(this.entryPath);\n if (!entryPath) {\n throw new Error(\"cannot resolve mt-os-cli entry path\");\n }\n const packageJsonPath = await findPackageJson(entryPath, this.packageName);\n if (!packageJsonPath) {\n throw new Error(`cannot locate ${this.packageName} package.json`);\n }\n const content = await fs.readFile(packageJsonPath, \"utf8\");\n const parsed = JSON.parse(content) as {\n version?: unknown;\n };\n if (parsed.version !== expectedVersion) {\n throw new Error(\n `expected ${expectedVersion}, got ${String(parsed.version ?? \"unknown\")}`,\n );\n }\n }\n\n /**\n * 判断命令是否可执行。\n *\n * @param command 命令名\n * @returns 是否可执行\n */\n private async isCommandAvailable(command: string): Promise<boolean> {\n const result = await this.commandRunner(\n platformCommand(command),\n [\"--version\"],\n VERIFY_TIMEOUT_MS,\n );\n return result.exitCode === 0 && !result.error;\n }\n}\n\n/**\n * 执行子进程并收集输出。\n *\n * @param command 命令\n * @param args 参数\n * @param timeoutMs 超时时间\n * @returns 执行结果\n */\nexport function runCommand(\n command: string,\n args: string[],\n timeoutMs: number,\n): Promise<CommandRunResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n let timedOut = false;\n let spawnError: Error | undefined;\n\n const timeout = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n }, timeoutMs);\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout = truncateCommandOutput(stdout + chunk.toString(\"utf8\"));\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr = truncateCommandOutput(stderr + chunk.toString(\"utf8\"));\n });\n child.on(\"error\", (error) => {\n spawnError = error;\n });\n child.on(\"close\", (exitCode) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n resolve({\n command,\n args,\n stdout,\n stderr,\n exitCode,\n ...(spawnError ? { error: spawnError } : {}),\n timedOut,\n });\n });\n });\n}\n\n/**\n * 拼接命令行文本。\n *\n * @param command 命令\n * @param args 参数\n * @returns 便于用户复制的命令文本\n */\nexport function formatCommand(command: string, args: string[]): string {\n return [command, ...args.map(quoteShellArg)].join(\" \");\n}\n\n/**\n * 生成 npm 权限错误提示。\n *\n * @param result npm 执行结果\n * @returns 用户提示;没有明确权限错误时返回空字符串\n */\nexport function buildPermissionHint(result: CommandRunResult): string {\n const combined = `${result.stdout}\\n${result.stderr}`;\n if (combined.includes(\"EACCES\") && process.platform !== \"win32\") {\n return \"npm 全局安装权限不足,可以尝试使用 `sudo mt-os-cli update`,或调整 npm global prefix。\";\n }\n return \"\";\n}\n\n/**\n * 拼接子进程错误详情。\n *\n * @param result 子进程执行结果\n * @returns 适合结构化错误输出的摘要\n */\nexport function summarizeCommandFailure(result: CommandRunResult): string {\n const parts = [\n result.error?.message,\n result.timedOut ? \"command timed out\" : undefined,\n result.stdout.trim(),\n result.stderr.trim(),\n ].filter((part): part is string => Boolean(part));\n return truncateCommandOutput(parts.join(\"\\n\"));\n}\n\n/**\n * 获取手动更新原因。\n *\n * @param detection 安装方式检测结果\n * @returns 原因说明\n */\nexport function manualUpdateReason(detection: InstallDetection): string {\n if (detection.method === \"npm\" && !detection.npmAvailable) {\n return \"当前看起来是 npm 安装,但 PATH 中找不到 npm\";\n }\n return \"当前命令不是通过 npm 包目录启动\";\n}\n\n/**\n * 解析当前 CLI 入口路径。\n *\n * @param explicitEntryPath 显式入口路径\n * @returns 真实入口路径\n */\nasync function resolveEntryPath(\n explicitEntryPath?: string,\n): Promise<string | undefined> {\n const entryPath = explicitEntryPath ?? process.argv[1];\n if (!entryPath) {\n return undefined;\n }\n try {\n return await fs.realpath(entryPath);\n } catch {\n return entryPath;\n }\n}\n\n/**\n * 从入口文件向上查找指定包的 package.json。\n *\n * @param entryPath 入口路径\n * @param packageName 包名\n * @returns package.json 路径\n */\nasync function findPackageJson(\n entryPath: string,\n packageName: string,\n): Promise<string | undefined> {\n let currentDir = path.dirname(entryPath);\n while (true) {\n const candidate = path.join(currentDir, \"package.json\");\n try {\n const content = await fs.readFile(candidate, \"utf8\");\n const parsed = JSON.parse(content) as {\n name?: unknown;\n };\n if (parsed.name === packageName) {\n return candidate;\n }\n } catch {\n // 继续向父目录查找,直到文件系统根目录。\n }\n const parent = path.dirname(currentDir);\n if (parent === currentDir) {\n return undefined;\n }\n currentDir = parent;\n }\n}\n\n/**\n * 按平台生成可执行命令名。\n *\n * @param command 命令名\n * @returns 平台可执行命令名\n */\nfunction platformCommand(command: string): string {\n return process.platform === \"win32\" ? `${command}.cmd` : command;\n}\n\n/**\n * 规范化路径分隔符。\n *\n * @param value 原始路径\n * @returns 使用斜杠的路径\n */\nfunction normalizePath(value: string): string {\n return value.replaceAll(\"\\\\\", \"/\");\n}\n\n/**\n * 截断命令输出,保留最后一段关键信息。\n *\n * @param value 原始输出\n * @returns 截断后的输出\n */\nfunction truncateCommandOutput(value: string): string {\n if (value.length <= MAX_COMMAND_OUTPUT_LENGTH) {\n return value;\n }\n return value.slice(value.length - MAX_COMMAND_OUTPUT_LENGTH);\n}\n\n/**\n * 为展示用 shell 命令参数加引号。\n *\n * @param value 原始参数\n * @returns shell 安全展示值\n */\nfunction quoteShellArg(value: string): string {\n if (/^[A-Za-z0-9_@%+=:,./-]+$/.test(value)) {\n return value;\n }\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n","/**\n * 解析后的语义化版本。\n */\nexport interface ParsedSemver {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[];\n}\n\nconst SEMVER_PATTERN =\n /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/;\nconst GIT_DESCRIBE_PATTERN = /-\\d+-g[0-9a-f]{7,}/i;\n\n/**\n * 解析语义化版本号。\n *\n * <p>这里只实现 CLI 升级判断需要的 SemVer 子集:主版本、次版本、修订版本和预发布标识。\n * 构建元数据不影响版本优先级,会在解析时忽略。\n *\n * @param value 原始版本号\n * @returns 解析后的版本;格式非法时返回 null\n */\nexport function parseSemver(value: string): ParsedSemver | null {\n const match = SEMVER_PATTERN.exec(value.trim());\n if (!match) {\n return null;\n }\n return {\n major: Number.parseInt(match[1] ?? \"0\", 10),\n minor: Number.parseInt(match[2] ?? \"0\", 10),\n patch: Number.parseInt(match[3] ?? \"0\", 10),\n prerelease: match[4]?.split(\".\") ?? [],\n };\n}\n\n/**\n * 判断版本号是否像一个可发布版本。\n *\n * <p>本地开发版本、git describe 版本和空版本不参与自动更新提醒,避免开发环境反复提示。\n *\n * @param value 原始版本号\n * @returns 是否是可发布版本\n */\nexport function isReleaseVersion(value: string): boolean {\n const normalized = value.trim();\n if (!normalized || normalized === \"DEV\" || normalized === \"dev\") {\n return false;\n }\n if (GIT_DESCRIBE_PATTERN.test(normalized)) {\n return false;\n }\n return parseSemver(normalized) !== null;\n}\n\n/**\n * 比较两个语义化版本。\n *\n * @param left 左侧版本\n * @param right 右侧版本\n * @returns left 大于 right 时返回正数,小于时返回负数,相等返回 0\n */\nexport function compareSemver(left: string, right: string): number {\n const parsedLeft = parseSemver(left);\n const parsedRight = parseSemver(right);\n if (!parsedLeft && !parsedRight) {\n return 0;\n }\n if (!parsedLeft) {\n return -1;\n }\n if (!parsedRight) {\n return 1;\n }\n\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n const diff = parsedLeft[key] - parsedRight[key];\n if (diff !== 0) {\n return diff;\n }\n }\n return comparePrerelease(parsedLeft.prerelease, parsedRight.prerelease);\n}\n\n/**\n * 判断 candidate 是否比 current 更新。\n *\n * @param candidate 候选版本\n * @param current 当前版本\n * @returns 候选版本是否更新\n */\nexport function isNewerVersion(candidate: string, current: string): boolean {\n return compareSemver(candidate, current) > 0;\n}\n\n/**\n * 比较预发布版本标识。\n *\n * <p>SemVer 规定正式版本高于同版本号的预发布版本;预发布标识逐段比较,数字段按数字比较,\n * 数字段优先级低于非数字段。\n *\n * @param left 左侧预发布标识\n * @param right 右侧预发布标识\n * @returns left 大于 right 时返回正数,小于时返回负数,相等返回 0\n */\nfunction comparePrerelease(left: string[], right: string[]): number {\n if (left.length === 0 && right.length === 0) {\n return 0;\n }\n if (left.length === 0) {\n return 1;\n }\n if (right.length === 0) {\n return -1;\n }\n\n const maxLength = Math.max(left.length, right.length);\n for (let index = 0; index < maxLength; index += 1) {\n const leftPart = left[index];\n const rightPart = right[index];\n if (leftPart === undefined) {\n return -1;\n }\n if (rightPart === undefined) {\n return 1;\n }\n const diff = comparePrereleasePart(leftPart, rightPart);\n if (diff !== 0) {\n return diff;\n }\n }\n return 0;\n}\n\n/**\n * 比较单段预发布标识。\n *\n * @param left 左侧标识\n * @param right 右侧标识\n * @returns left 大于 right 时返回正数,小于时返回负数,相等返回 0\n */\nfunction comparePrereleasePart(left: string, right: string): number {\n const leftNumber = parseNumericIdentifier(left);\n const rightNumber = parseNumericIdentifier(right);\n if (leftNumber !== undefined && rightNumber !== undefined) {\n return leftNumber - rightNumber;\n }\n if (leftNumber !== undefined) {\n return -1;\n }\n if (rightNumber !== undefined) {\n return 1;\n }\n return left.localeCompare(right);\n}\n\n/**\n * 解析 SemVer 数字标识。\n *\n * @param value 原始标识\n * @returns 数字标识;非纯数字时返回 undefined\n */\nfunction parseNumericIdentifier(value: string): number | undefined {\n if (!/^(0|[1-9]\\d*)$/.test(value)) {\n return undefined;\n }\n return Number.parseInt(value, 10);\n}\n","import fs from \"node:fs/promises\";\nimport https from \"node:https\";\nimport path from \"node:path\";\n\nimport { CLI_NAME, CLI_VERSION } from \"../cli/context.js\";\nimport { isNewerVersion, isReleaseVersion, parseSemver } from \"./semver.js\";\n\nconst REGISTRY_LATEST_URL =\n \"https://registry.npmjs.org/@meritsandtree%2Fmt-os-cli/latest\";\nconst UPDATE_STATE_FILE = \"update-state.json\";\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 5000;\nconst MAX_RESPONSE_BYTES = 256 * 1024;\n\n/**\n * 更新提醒缓存文件内容。\n */\ninterface UpdateState {\n latestVersion: string;\n checkedAt: number;\n}\n\n/**\n * 版本更新信息。\n */\nexport interface UpdateInfo {\n current: string;\n latest: string;\n}\n\n/**\n * npm registry 查询选项。\n */\nexport interface FetchLatestVersionOptions {\n registryUrl?: string;\n timeoutMs?: number;\n unref?: boolean;\n}\n\n/**\n * 判断当前环境是否应跳过自动更新提醒。\n *\n * <p>CI、开发版本和显式禁用环境变量都会跳过提醒,但显式执行 `mt-os-cli update` 时仍然可以\n * 主动检查版本。\n *\n * @param currentVersion 当前 CLI 版本\n * @returns 是否跳过提醒\n */\nexport function shouldSkipUpdateNotifier(\n currentVersion = CLI_VERSION,\n): boolean {\n if (process.env.MT_OS_CLI_NO_UPDATE_NOTIFIER) {\n return true;\n }\n if (process.env.CI || process.env.BUILD_NUMBER || process.env.RUN_ID) {\n return true;\n }\n return !isReleaseVersion(currentVersion);\n}\n\n/**\n * 只读取本地缓存判断是否有新版本。\n *\n * @param currentVersion 当前版本\n * @param configDir CLI 配置目录\n * @returns 有可用新版本时返回更新信息,否则返回 null\n */\nexport async function checkCachedUpdate(\n currentVersion: string,\n configDir: string,\n): Promise<UpdateInfo | null> {\n if (shouldSkipUpdateNotifier(currentVersion)) {\n return null;\n }\n const state = await readUpdateState(configDir);\n if (!state?.latestVersion) {\n return null;\n }\n if (!isNewerVersion(state.latestVersion, currentVersion)) {\n return null;\n }\n return {\n current: currentVersion,\n latest: state.latestVersion,\n };\n}\n\n/**\n * 刷新本地更新缓存。\n *\n * <p>缓存未过期时只读缓存,不访问网络;缓存过期时访问 npm registry,并把最新版本写回配置\n * 目录。网络失败不应影响业务命令,调用方通常会吞掉异常。\n *\n * @param currentVersion 当前版本\n * @param configDir CLI 配置目录\n * @param options registry 查询选项\n * @returns 刷新后发现的新版本信息;没有新版本时返回 null\n */\nexport async function refreshUpdateCache(\n currentVersion: string,\n configDir: string,\n options?: FetchLatestVersionOptions,\n): Promise<UpdateInfo | null> {\n if (shouldSkipUpdateNotifier(currentVersion)) {\n return null;\n }\n const state = await readUpdateState(configDir);\n if (\n state &&\n state.latestVersion &&\n Date.now() - state.checkedAt < CACHE_TTL_MS\n ) {\n return isNewerVersion(state.latestVersion, currentVersion)\n ? {\n current: currentVersion,\n latest: state.latestVersion,\n }\n : null;\n }\n\n const latest = await fetchLatestPackageVersion(options);\n await writeUpdateState(configDir, latest);\n return isNewerVersion(latest, currentVersion)\n ? {\n current: currentVersion,\n latest,\n }\n : null;\n}\n\n/**\n * 查询 npm registry 上的 latest 版本。\n *\n * @param options 查询选项\n * @returns latest 版本号\n */\nexport async function fetchLatestPackageVersion(\n options?: FetchLatestVersionOptions,\n): Promise<string> {\n const registryUrl = options?.registryUrl ?? REGISTRY_LATEST_URL;\n const timeoutMs = options?.timeoutMs ?? FETCH_TIMEOUT_MS;\n const body = await readHttpsText(registryUrl, timeoutMs, Boolean(options?.unref));\n const parsed = JSON.parse(body) as {\n version?: unknown;\n };\n if (typeof parsed.version !== \"string\" || !parseSemver(parsed.version)) {\n throw new Error(\"npm registry returned invalid mt-os-cli version\");\n }\n return parsed.version;\n}\n\n/**\n * 写入更新缓存。\n *\n * @param configDir CLI 配置目录\n * @param latestVersion 最新版本\n */\nexport async function writeUpdateState(\n configDir: string,\n latestVersion: string,\n): Promise<void> {\n const state: UpdateState = {\n latestVersion,\n checkedAt: Date.now(),\n };\n await fs.mkdir(configDir, { recursive: true });\n await fs.writeFile(updateStatePath(configDir), JSON.stringify(state, null, 2), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n}\n\n/**\n * 读取更新缓存。\n *\n * @param configDir CLI 配置目录\n * @returns 缓存内容;不存在或格式异常时返回 null\n */\nasync function readUpdateState(configDir: string): Promise<UpdateState | null> {\n try {\n const content = await fs.readFile(updateStatePath(configDir), \"utf8\");\n const parsed = JSON.parse(content) as Partial<UpdateState>;\n if (\n typeof parsed.latestVersion !== \"string\" ||\n typeof parsed.checkedAt !== \"number\"\n ) {\n return null;\n }\n return {\n latestVersion: parsed.latestVersion,\n checkedAt: parsed.checkedAt,\n };\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\" || error instanceof SyntaxError) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * 生成更新缓存路径。\n *\n * @param configDir CLI 配置目录\n * @returns 更新缓存文件路径\n */\nfunction updateStatePath(configDir: string): string {\n return path.join(configDir, UPDATE_STATE_FILE);\n}\n\n/**\n * 读取 HTTPS 文本响应。\n *\n * <p>普通显式更新会等待响应;后台刷新会把 socket unref,保证检查动作不会把一个已经完成的\n * CLI 进程强行留住。\n *\n * @param url 请求地址\n * @param timeoutMs 超时时间\n * @param unrefSocket 是否释放 socket 对进程退出的引用\n * @returns 响应文本\n */\nfunction readHttpsText(\n url: string,\n timeoutMs: number,\n unrefSocket: boolean,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const request = https.request(\n url,\n {\n headers: {\n Accept: \"application/json\",\n \"User-Agent\": `${CLI_NAME}/${CLI_VERSION}`,\n },\n },\n (response) => {\n const statusCode = response.statusCode ?? 0;\n if (statusCode < 200 || statusCode >= 300) {\n response.resume();\n reject(new Error(`npm registry returned HTTP ${statusCode}`));\n return;\n }\n\n let totalBytes = 0;\n const chunks: Buffer[] = [];\n response.on(\"data\", (chunk: Buffer) => {\n totalBytes += chunk.byteLength;\n if (totalBytes > MAX_RESPONSE_BYTES) {\n request.destroy(\n new Error(\"npm registry response exceeded max body size\"),\n );\n return;\n }\n chunks.push(chunk);\n });\n response.on(\"end\", () => {\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n });\n },\n );\n\n request.setTimeout(timeoutMs, () => {\n request.destroy(new Error(`npm registry request timed out after ${timeoutMs}ms`));\n });\n if (unrefSocket) {\n request.on(\"socket\", (socket) => {\n socket.unref();\n });\n }\n request.on(\"error\", reject);\n request.end();\n });\n}\n","import { Command } from \"commander\";\n\nimport { CLI_VERSION, type CommandContext } from \"../cli/context.js\";\nimport {\n clearPendingNoticeProvider,\n CliExitError,\n} from \"../output/cli-output.js\";\nimport {\n buildPermissionHint,\n formatCommand,\n manualUpdateReason,\n SelfUpdater,\n summarizeCommandFailure,\n type CommandRunResult,\n type InstallDetection,\n} from \"../update/self-update.js\";\nimport {\n isNewerVersion,\n parseSemver,\n} from \"../update/semver.js\";\nimport {\n fetchLatestPackageVersion,\n writeUpdateState,\n} from \"../update/version-check.js\";\n\n/**\n * update 命令参数。\n */\ninterface UpdateCommandOptions {\n json?: boolean;\n force?: boolean;\n check?: boolean;\n}\n\n/**\n * skill 同步结果。\n */\ninterface SkillSyncSummary {\n action: \"synced\" | \"failed\";\n warning?: string;\n detail?: string;\n}\n\n/**\n * update 命令输出结果。\n */\nexport interface UpdateCommandResult {\n previous_version: string;\n current_version: string;\n latest_version: string;\n action:\n | \"already_up_to_date\"\n | \"update_available\"\n | \"manual_required\"\n | \"updated\";\n auto_update?: boolean;\n install_method?: \"npm\" | \"manual\";\n resolved_path?: string;\n message: string;\n command?: string;\n manual_command?: string;\n changelog?: string;\n skills_action?: SkillSyncSummary[\"action\"];\n skills_warning?: string;\n skills_detail?: string;\n}\n\n/**\n * update 流程依赖的自更新能力。\n */\nexport interface UpdateExecutor {\n detectInstallMethod(): Promise<InstallDetection>;\n runNpmInstall(version: string): Promise<CommandRunResult>;\n runSkillsUpdate(): Promise<CommandRunResult>;\n verifyInstalledPackageVersion(\n expectedVersion: string,\n preferredEntryPath?: string,\n ): Promise<void>;\n}\n\n/**\n * update 命令依赖项。\n */\nexport interface UpdateCommandDependencies {\n currentVersion?: string;\n fetchLatestVersion?: () => Promise<string>;\n updater?: UpdateExecutor;\n onProgress?: (message: string) => void;\n}\n\n/**\n * 注册 CLI 自更新命令。\n *\n * @param program 根命令\n * @param context 命令上下文\n */\nexport function registerUpdateCommand(\n program: Command,\n context: CommandContext,\n): void {\n program\n .command(\"update\")\n .description(\"Update mt-os-cli to the latest published npm version\")\n .option(\"--json\", \"Print structured JSON output\")\n .option(\"--force\", \"Reinstall even when the current version is latest\")\n .option(\"--check\", \"Only check for updates without installing\")\n .action(async (options: UpdateCommandOptions) => {\n await runUpdateCommand(context, options);\n });\n}\n\n/**\n * 执行并输出 update 命令。\n *\n * @param context 命令上下文\n * @param options 命令参数\n */\nasync function runUpdateCommand(\n context: CommandContext,\n options: UpdateCommandOptions,\n): Promise<void> {\n clearPendingNoticeProvider();\n const dependencies: UpdateCommandDependencies = options.json\n ? {}\n : {\n onProgress: (message) => {\n console.error(message);\n },\n };\n const result = await executeUpdateCommand(context, options, dependencies);\n if (options.json) {\n console.log(JSON.stringify({ ok: true, ...result }, null, 2));\n return;\n }\n writeTextResult(result);\n}\n\n/**\n * 执行 update 命令主流程。\n *\n * <p>显式 `--check` 必须是纯检查,不执行 npm 安装,也不刷新本机 skill。真正的\n * `mt-os-cli update` 才允许执行高风险写入,并且在包更新后尽力同步本机 skill。\n *\n * @param context 命令上下文\n * @param options 命令参数\n * @param dependencies 可替换依赖,主要供测试注入\n * @returns update 命令结果\n */\nexport async function executeUpdateCommand(\n context: CommandContext,\n options: UpdateCommandOptions,\n dependencies?: UpdateCommandDependencies,\n): Promise<UpdateCommandResult> {\n const currentVersion = dependencies?.currentVersion ?? CLI_VERSION;\n const updater = dependencies?.updater ?? new SelfUpdater();\n const latestVersion = await fetchLatestVersionOrThrow(dependencies);\n await writeUpdateState(context.sessionStore.configDir, latestVersion);\n\n if (!options.force && !isNewerVersion(latestVersion, currentVersion)) {\n const skills = options.check\n ? undefined\n : await syncSkills(updater, dependencies?.onProgress);\n return withSkills(\n {\n previous_version: currentVersion,\n current_version: currentVersion,\n latest_version: latestVersion,\n action: \"already_up_to_date\",\n message: `mt-os-cli ${currentVersion} is already up to date`,\n changelog: changelogUrl(),\n },\n skills,\n );\n }\n\n const detection = await updater.detectInstallMethod();\n if (options.check) {\n return {\n previous_version: currentVersion,\n current_version: currentVersion,\n latest_version: latestVersion,\n action: \"update_available\",\n auto_update: detection.canAutoUpdate,\n install_method: detection.method,\n ...(detection.resolvedPath ? { resolved_path: detection.resolvedPath } : {}),\n message: `mt-os-cli ${currentVersion} -> ${latestVersion} available`,\n ...(detection.canAutoUpdate ? { command: \"mt-os-cli update\" } : {}),\n manual_command: manualInstallCommand(latestVersion),\n changelog: changelogUrl(),\n };\n }\n\n if (!detection.canAutoUpdate) {\n const skills = await syncSkills(updater, dependencies?.onProgress);\n return withSkills(\n {\n previous_version: currentVersion,\n current_version: currentVersion,\n latest_version: latestVersion,\n action: \"manual_required\",\n auto_update: false,\n install_method: detection.method,\n ...(detection.resolvedPath ? { resolved_path: detection.resolvedPath } : {}),\n message: `Automatic update unavailable: ${manualUpdateReason(detection)}`,\n manual_command: manualInstallCommand(latestVersion),\n changelog: changelogUrl(),\n },\n skills,\n );\n }\n\n dependencies?.onProgress?.(\n `Updating mt-os-cli ${currentVersion} -> ${latestVersion} via npm ...`,\n );\n const npmResult = await updater.runNpmInstall(latestVersion);\n assertCommandSucceeded(npmResult, \"npm install failed\");\n await verifyInstalledVersion(updater, latestVersion, detection);\n const skills = await syncSkills(updater, dependencies?.onProgress);\n\n return withSkills(\n {\n previous_version: currentVersion,\n current_version: latestVersion,\n latest_version: latestVersion,\n action: \"updated\",\n auto_update: true,\n install_method: detection.method,\n ...(detection.resolvedPath ? { resolved_path: detection.resolvedPath } : {}),\n message: `mt-os-cli updated from ${currentVersion} to ${latestVersion}`,\n command: \"mt-os-cli update\",\n changelog: changelogUrl(),\n },\n skills,\n );\n}\n\n/**\n * 查询 latest 版本并转换为结构化错误。\n *\n * @param dependencies 可替换依赖\n * @returns latest 版本\n */\nasync function fetchLatestVersionOrThrow(\n dependencies?: UpdateCommandDependencies,\n): Promise<string> {\n try {\n const latest =\n await (dependencies?.fetchLatestVersion ?? fetchLatestPackageVersion)();\n if (!parseSemver(latest)) {\n throw new Error(`invalid version: ${latest}`);\n }\n return latest;\n } catch (error) {\n throw new CliExitError(4, {\n type: \"network\",\n message:\n error instanceof Error\n ? `failed to check latest mt-os-cli version: ${error.message}`\n : \"failed to check latest mt-os-cli version\",\n });\n }\n}\n\n/**\n * 校验 npm 安装结果。\n *\n * @param updater 自更新器\n * @param latestVersion 目标版本\n * @param detection 安装方式检测结果\n */\nasync function verifyInstalledVersion(\n updater: UpdateExecutor,\n latestVersion: string,\n detection: InstallDetection,\n): Promise<void> {\n try {\n await updater.verifyInstalledPackageVersion(\n latestVersion,\n detection.resolvedPath,\n );\n } catch (error) {\n throw new CliExitError(4, {\n type: \"update_error\",\n message:\n error instanceof Error\n ? `new package verification failed: ${error.message}`\n : \"new package verification failed\",\n hint: `可以手动执行 ${manualInstallCommand(latestVersion)} 后再重试 mt-os-cli --version。`,\n });\n }\n}\n\n/**\n * 断言子进程执行成功。\n *\n * @param result 子进程结果\n * @param message 错误消息\n */\nfunction assertCommandSucceeded(\n result: CommandRunResult,\n message: string,\n): void {\n if (result.exitCode === 0 && !result.error && !result.timedOut) {\n return;\n }\n const hint = buildPermissionHint(result);\n throw new CliExitError(4, {\n type: \"update_error\",\n message,\n ...(hint ? { hint } : {}),\n detail: summarizeCommandFailure(result),\n });\n}\n\n/**\n * 尽力同步本机 skill。\n *\n * @param updater 自更新器\n * @param onProgress 进度输出回调\n * @returns skill 同步结果\n */\nasync function syncSkills(\n updater: UpdateExecutor,\n onProgress?: (message: string) => void,\n): Promise<SkillSyncSummary> {\n onProgress?.(\"Updating mt-os-cli skills ...\");\n const result = await updater.runSkillsUpdate();\n if (result.exitCode === 0 && !result.error && !result.timedOut) {\n return {\n action: \"synced\",\n };\n }\n return {\n action: \"failed\",\n warning: \"skills update failed\",\n detail: summarizeCommandFailure(result),\n };\n}\n\n/**\n * 把 skill 同步结果合并到 update 输出。\n *\n * @param result 原始结果\n * @param skills skill 同步结果\n * @returns 合并后的结果\n */\nfunction withSkills(\n result: UpdateCommandResult,\n skills: SkillSyncSummary | undefined,\n): UpdateCommandResult {\n if (!skills) {\n return result;\n }\n return {\n ...result,\n skills_action: skills.action,\n ...(skills.warning ? { skills_warning: skills.warning } : {}),\n ...(skills.detail ? { skills_detail: skills.detail } : {}),\n };\n}\n\n/**\n * 输出文本格式结果。\n *\n * @param result update 结果\n */\nfunction writeTextResult(result: UpdateCommandResult): void {\n if (result.action === \"update_available\") {\n console.error(\n `Update available: ${result.previous_version} -> ${result.latest_version}`,\n );\n console.error(` Changelog: ${result.changelog}`);\n if (result.auto_update) {\n console.error(\"Run `mt-os-cli update` to install.\");\n } else {\n console.error(`Run manually: ${result.manual_command}`);\n }\n return;\n }\n if (result.action === \"manual_required\") {\n console.error(result.message);\n if (result.resolved_path) {\n console.error(` Path: ${result.resolved_path}`);\n }\n console.error(`Run manually: ${result.manual_command}`);\n writeSkillsText(result);\n return;\n }\n console.error(result.message);\n if (result.changelog) {\n console.error(` Changelog: ${result.changelog}`);\n }\n writeSkillsText(result);\n}\n\n/**\n * 输出 skill 同步文本结果。\n *\n * @param result update 结果\n */\nfunction writeSkillsText(result: UpdateCommandResult): void {\n if (!result.skills_action) {\n return;\n }\n if (result.skills_action === \"synced\") {\n console.error(\"Skills updated\");\n return;\n }\n console.error(`Skills update failed: ${result.skills_detail ?? \"unknown error\"}`);\n}\n\n/**\n * 生成手动安装命令。\n *\n * @param version 目标版本\n * @returns 手动安装命令\n */\nfunction manualInstallCommand(version: string): string {\n return formatCommand(\"npm\", [\n \"install\",\n \"-g\",\n `@meritsandtree/mt-os-cli@${version}`,\n ]);\n}\n\n/**\n * 生成变更日志地址。\n *\n * @returns changelog 地址\n */\nfunction changelogUrl(): string {\n return \"https://www.npmjs.com/package/@meritsandtree/mt-os-cli\";\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport keytar from \"keytar\";\n\nexport interface SecretStore {\n getPassword(service: string, account: string): Promise<string | null>;\n setPassword(\n service: string,\n account: string,\n password: string,\n ): Promise<void>;\n deletePassword(service: string, account: string): Promise<boolean>;\n}\n\nexport interface LocalConfig {\n environment?: string;\n baseUrl?: string;\n mcpBaseUrl?: string;\n defaultSiteId?: string;\n loginCallbackPort?: number;\n timeoutMs?: number;\n customEnvironments?: Record<string, CustomEnvironmentConfig>;\n}\n\n/**\n * 用户自定义环境配置。\n */\nexport interface CustomEnvironmentConfig {\n label?: string;\n description?: string;\n baseUrl: string;\n mcpBaseUrl?: string;\n}\n\nexport interface SessionRecord {\n baseUrl: string;\n token: string;\n refreshToken: string;\n tokenExpireTime?: number;\n refreshTokenExpireTime?: number;\n siteId?: string;\n userId?: string;\n userName?: string;\n deviceType: string;\n updatedAt: string;\n}\n\nexport const SERVICE_NAME = \"@meritsandtree/mt-os-cli\";\nconst SESSION_ACCOUNT = \"session\";\n\nfunction defaultConfigDir(): string {\n return (\n process.env.MT_OS_CONFIG_DIR ??\n path.join(os.homedir(), \".config\", \"mt-os-cli\")\n );\n}\n\nexport class SessionStore {\n readonly configDir: string;\n readonly configPath: string;\n private readonly secretStore: SecretStore;\n\n constructor(options?: { configDir?: string; secretStore?: SecretStore }) {\n this.configDir = options?.configDir ?? defaultConfigDir();\n this.configPath = path.join(this.configDir, \"config.json\");\n this.secretStore = options?.secretStore ?? keytar;\n }\n\n async getConfig(): Promise<LocalConfig> {\n try {\n const content = await fs.readFile(this.configPath, \"utf8\");\n return JSON.parse(content) as LocalConfig;\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n return {};\n }\n throw error;\n }\n }\n\n async saveConfig(patch: LocalConfig): Promise<LocalConfig> {\n const current = await this.getConfig();\n const next = {\n ...current,\n ...patch,\n };\n await fs.mkdir(this.configDir, { recursive: true });\n await fs.writeFile(this.configPath, JSON.stringify(next, null, 2), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n return next;\n }\n\n async getSession(): Promise<SessionRecord | null> {\n const raw = await this.secretStore.getPassword(\n SERVICE_NAME,\n SESSION_ACCOUNT,\n );\n if (!raw) {\n return null;\n }\n return JSON.parse(raw) as SessionRecord;\n }\n\n async saveSession(session: SessionRecord): Promise<void> {\n await this.secretStore.setPassword(\n SERVICE_NAME,\n SESSION_ACCOUNT,\n JSON.stringify(session),\n );\n }\n\n async clearSession(): Promise<void> {\n await this.secretStore.deletePassword(SERVICE_NAME, SESSION_ACCOUNT);\n }\n}\n","import { CLI_VERSION } from \"../cli/context.js\";\nimport { setPendingNoticeProvider } from \"../output/cli-output.js\";\nimport {\n checkCachedUpdate,\n refreshUpdateCache,\n type UpdateInfo,\n} from \"./version-check.js\";\n\nlet pendingUpdateInfo: UpdateInfo | undefined;\n\n/**\n * 初始化 CLI 更新提醒。\n *\n * <p>启动时只同步读取本地缓存,不把网络检查放进命令主链路。后台刷新使用 unref socket,\n * 即使网络慢也不会阻止 CLI 进程退出。\n *\n * @param configDir CLI 配置目录\n * @param currentVersion 当前 CLI 版本\n */\nexport async function setupUpdateNotice(\n configDir: string,\n currentVersion = CLI_VERSION,\n): Promise<void> {\n pendingUpdateInfo =\n (await checkCachedUpdate(currentVersion, configDir)) ?? undefined;\n void refreshUpdateCache(currentVersion, configDir, { unref: true })\n .then((info) => {\n if (!pendingUpdateInfo && info) {\n pendingUpdateInfo = info;\n }\n })\n .catch(() => {\n // 更新提醒是辅助信息,网络或缓存异常不能影响真实命令执行。\n });\n\n setPendingNoticeProvider(() => {\n if (!pendingUpdateInfo) {\n return undefined;\n }\n return {\n update: {\n current: pendingUpdateInfo.current,\n latest: pendingUpdateInfo.latest,\n message: `mt-os-cli ${pendingUpdateInfo.latest} available, current ${pendingUpdateInfo.current}, run: mt-os-cli update`,\n command: \"mt-os-cli update\",\n },\n };\n });\n}\n","#!/usr/bin/env node\nimport { Command } from \"commander\";\n\nimport { type CommandContext } from \"./cli/context.js\";\nimport { registerApiCommand } from \"./commands/api.js\";\nimport { registerAuthCommand } from \"./commands/auth.js\";\nimport {\n registerDoctorCommand,\n runVersionInfo,\n} from \"./commands/doctor.js\";\nimport { registerEnvCommand } from \"./commands/env.js\";\nimport { registerInstallCommands } from \"./commands/install.js\";\nimport { registerMcpCommand } from \"./commands/mcp.js\";\nimport { registerSchemaCommand } from \"./commands/schema.js\";\nimport { registerSkillCommands } from \"./commands/skills.js\";\nimport { registerShortcutCommands } from \"./commands/shortcuts.js\";\nimport { registerToolCommand } from \"./commands/tool.js\";\nimport { registerUpdateCommand } from \"./commands/update.js\";\nimport { writeError } from \"./output/cli-output.js\";\nimport { SessionStore } from \"./session/store.js\";\nimport { setupUpdateNotice } from \"./update/notice.js\";\n\n/**\n * 启动 MTOS CLI。\n *\n * <p>根入口只负责装配命令树,具体业务逻辑放在 `commands/*` 模块内,避免新增命令时\n * 继续膨胀入口文件。当前 CLI 是新开发形态,不保留旧版顶层 `login/logout` 兼容命令。\n */\nasync function main(): Promise<void> {\n const context: CommandContext = {\n sessionStore: new SessionStore(),\n };\n const rawArgs = process.argv.slice(2);\n if (!isCompletionCommand(rawArgs)) {\n await setupUpdateNotice(context.sessionStore.configDir);\n }\n if (rawArgs.length === 1 && (rawArgs[0] === \"-v\" || rawArgs[0] === \"--version\")) {\n await runVersionInfo(context);\n return;\n }\n\n const program = new Command();\n program\n .name(\"mt-os-cli\")\n .description(\"MTOS CLI for agent-friendly Law tool access\")\n .option(\"-v, --version\", \"Print detailed version and runtime information\");\n\n registerInstallCommands(program, context);\n registerAuthCommand(program, context);\n registerDoctorCommand(program, context);\n registerEnvCommand(program, context);\n registerSkillCommands(program, context);\n registerMcpCommand(program, context);\n registerSchemaCommand(program, context);\n registerToolCommand(program, context);\n registerApiCommand(program, context);\n registerUpdateCommand(program, context);\n registerShortcutCommands(program, context);\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((error: unknown) => {\n process.exitCode = writeError(error);\n});\n\n/**\n * 判断当前调用是否是 shell completion。\n *\n * <p>补全输出是机器可解析内容,不能注入更新提醒,也不能启动后台检查。\n *\n * @param rawArgs 命令行参数\n * @returns 是否是补全调用\n */\nfunction isCompletionCommand(rawArgs: string[]): boolean {\n return rawArgs.some((arg) =>\n arg === \"completion\" ||\n arg === \"__complete\" ||\n arg === \"__completeNoDesc\"\n );\n}\n"]}
|