mindwire 0.1.38 → 0.1.40
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 +16 -0
- package/dist/{chunk-CKTVMUS4.js → chunk-BJL5K6M7.js} +50 -16
- package/dist/chunk-BJL5K6M7.js.map +1 -0
- package/dist/chunk-ZP7F7LP7.js +306 -0
- package/dist/chunk-ZP7F7LP7.js.map +1 -0
- package/dist/cli.js +499 -250
- package/dist/cli.js.map +1 -1
- package/dist/computer/dashboard.d.ts +1 -0
- package/dist/computer/desktop.d.ts +17 -0
- package/dist/computer/directory-http.d.ts +1 -1
- package/dist/computer/discovery.d.ts +22 -0
- package/dist/computer/inspection.d.ts +30 -0
- package/dist/computer/lifecycle.d.ts +4 -2
- package/dist/computer/runtime-version.d.ts +6 -0
- package/dist/computer/service-update.d.ts +26 -0
- package/dist/computer/setup-prompt.d.ts +2 -0
- package/dist/computer/startup.d.ts +7 -0
- package/dist/computer/terminal-ui.d.ts +9 -0
- package/dist/computer.d.ts +2 -0
- package/dist/{connection-change-5F4WNCYV.js → connection-change-7ZV6O75Q.js} +3 -3
- package/dist/{connection-change-5F4WNCYV.js.map → connection-change-7ZV6O75Q.js.map} +1 -1
- package/dist/{controller-3SZI7TBW.js → controller-FBMGMSLM.js} +67 -9
- package/dist/controller-FBMGMSLM.js.map +1 -0
- package/dist/{controller-handoff-KV7WRDAI.js → controller-handoff-CJKXUFQI.js} +3 -3
- package/dist/{controller-handoff-KV7WRDAI.js.map → controller-handoff-CJKXUFQI.js.map} +1 -1
- package/dist/daemon-binary.d.ts +2 -0
- package/dist/index.cjs +41 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +41 -7
- package/dist/index.js.map +1 -1
- package/dist/project-sync.d.ts +29 -0
- package/dist/surfaces.d.ts +20 -1
- package/dist/types.d.ts +2 -0
- package/package.json +1 -1
- package/dist/chunk-CKTVMUS4.js.map +0 -1
- package/dist/chunk-QODJKRFK.js +0 -20
- package/dist/chunk-QODJKRFK.js.map +0 -1
- package/dist/controller-3SZI7TBW.js.map +0 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/computer/pairing-display.ts","../src/computer/startup.ts","../src/computer/connection-flow.ts","../src/computer/connection-progress.ts","../src/computer/directory-http.ts","../src/computer/discovery.ts","../src/computer/oblien-auth.ts","../src/computer/provider-setup.ts","../src/computer/setup-prompt.ts","../src/computer/managed-relay.ts","../src/cli.ts"],"names":["resolve","delay","safeName","path","join","path2","homedir","client","rm","execute","promisify","execFile","randomUUID","tunnel","saved","spawn","path3","fs2","createInterface","path4","question","createHash","command"],"mappings":";;;;;;;;;;;;;;;;;;;;AAiBA,IAAM,WAAA,GAAc,sBAAA;AACpB,IAAM,WAAA,GAAc,6BAAA;AACpB,IAAM,WAAA,GAAc,eAAA;AACpB,SAAS,gBAAgB,UAAA,EAA4C;AACnE,EAAA,OAAO,MAAA,IAAU,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,cAC/C,uFAAA,GACA,kDAAA;AACN;AAIA,eAAsB,gBAAgB,UAAA,EAAoC;AACxE,EAAA,MAAM,EAAA,GAAK,MAAM,OAAO,QAAQ,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,sBAAsB,UAAU,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,EAAE,oBAAA,EAAsB,GAAA,EAAc,QAAQ,CAAA,EAAE;AAChE,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,EAAA,CAAG,MAAA,CAAO,MAAM,OAAO,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,MAAA,GAAS,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,CAAA,KAAuB,KAAK,CAAA,IAAK,CAAA,IAAK,KAAK,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,GAAI,OAAA,CAAQ,QAChG,CAAC,CAAC,QAAQ,IAAA,CAAK,CAAA,GAAI,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA;AACxC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,CAAA,GAAI,QAAQ,IAAA,GAAO,OAAA,CAAQ,MAAA,EAAQ,CAAA,IAAK,CAAA,EAAG;AACvE,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,IAAI,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAA,EAAK;AACpE,MAAA,MAAM,GAAA,GAAM,MAAM,CAAA,EAAG,CAAC,GAAG,MAAA,GAAS,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAChD,MAAA,IAAA,IAAQ,GAAA,GAAO,MAAA,GAAS,QAAA,GAAM,QAAA,GAAQ,SAAS,QAAA,GAAM,GAAA;AAAA,IACvD;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,cAAA,GAAiB,IAAA,GAAO,SAAS,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,QAAA,CAAS,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,CAAA;AAE/D,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,OAAO,eAAA,CAAgB,UAAU,CAAA,CAAE,MAAM,IAAI,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,MAAA,GAAS,GAAG,GAAA,EAAI;AAChH;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,MAAM,OAAA,CAAQ,UAAA,EAAY,CAAA,EAAA,KAAA,CAAO,EAAE,KAAK,OAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,QAAQ,GAAA,EAAK,QAAA,EAAU,KAAK,OAAA,EAAQ,EAAG,EAAE,CAAE,CAAA;AACvH;AAEA,SAAS,WAAA,CAAY,YAAoC,GAAA,EAAqB;AAC5E,EAAA,MAAM,SAAA,GAAY,MAAA,IAAU,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,WAAA;AAC9D,EAAA,MAAM,KAAA,GAAQ,YAAY,sBAAA,GAAyB,oBAAA;AACnD,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA,OAAA,EAGA,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAA,EAYe,KAAK,CAAA,QAAA,EAAW,UAAA,CAAW,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,gFAAA,EACU,GAAG,CAAA;AAAA,6BAAA,EACtD,UAAA,CAAW,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA,sBAAA,EACvC,SAAA,GAClB,0IACA,2DAA2D,CAAA;AAAA,GAAA,EAC5D,SAAA,GAAY,+EAA+E,6EAA6E,CAAA;AAAA,qCAAA,EACtI,SAAA,GAAY,cAAc,SAAS,CAAA;AAAA,8DAAA,EACV,UAAA,CAAW,kBAAA,CAAmB,UAAU,CAAC,CAAC,CAAA;AAAA,sCAAA,EAClE,SAAA,GAAY,iBAAiB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,CAAA;AAU9E;AAEA,eAAe,YAAY,GAAA,EAA+B;AACxD,EAAA,MAAM,CAAC,OAAA,EAAS,IAAI,CAAA,GAAwB,OAAA,CAAQ,QAAA,KAAa,QAAA,GAAW,CAAC,MAAA,EAAQ,CAAC,GAAG,CAAC,CAAA,GACtF,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,CAAC,cAAA,EAAgB,CAAC,6BAAA,EAA+B,GAAG,CAAC,CAAA,GAAI,CAAC,UAAA,EAAY,CAAC,GAAG,CAAC,CAAA;AAC9G,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAAA,QAAAA,KAAW;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,EAAS,IAAA,EAAM,EAAE,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,CAAA;AACzE,IAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAgB;AAAE,MAAA,YAAA,CAAa,KAAK,CAAA;AAAG,MAAAA,SAAQ,EAAE,CAAA;AAAA,IAAG,CAAA;AACpE,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAAE,MAAA,KAAA,CAAM,IAAA,EAAK;AAAG,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA,IAAG,GAAG,GAAI,CAAA;AACrE,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,MAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACvC,IAAA,KAAA,CAAM,KAAK,MAAA,EAAQ,CAAA,IAAA,KAAQ,MAAA,CAAO,IAAA,KAAS,CAAC,CAAC,CAAA;AAAA,EAC/C,CAAC,CAAA;AACH;AAGA,eAAsB,qBAAA,CAAsB,UAAA,EAAoC,OAAA,GAA0B,EAAC,EAA4B;AACrI,EAAA,MAAM,SAAA,GAAY,MAAA,IAAU,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,WAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,gBAAgB,UAAU,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,YAAY,0BAAA,GAA6B,yCAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,YAAY,oCAAA,GAAuC,8BAAA;AACnE,EAAA,MAAM,OAAA,GAAU,kBAAA;AAChB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA;AACzC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,GAAA;AACnD,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,MAAA;AAC7B,EAAA,MAAM,cAAc,CAAC,CAAC,MAAA,CAAO,KAAA,IAAS,YAAY,IAAA,KAAS,MAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,MAAA,IAAW,CAAC,eAAe,IAAA,KAAS,SAAA;AAC9D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,WAAA,GAAc,YAAY,2DAAA,GAAoD,cAAA;AACpF,IAAA,MAAA,CAAO,KAAA,CAAM,sCAAiC,WAAW,CAAA;AAAA,EAA6B,kBAAA,CAAmB,UAAU,CAAC;;AAAA,EAAO,OAAO;AAAA,CAAI,CAAA;AACtI,IAAA,OAAO,EAAE,KAAA,GAAQ;AAAA,IAAC,CAAA,EAAE;AAAA,EACtB;AAEA,EAAA,MAAM,EAAA,GAAK,MAAM,eAAA,CAAgB,UAAU,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,eAAe,IAAA,KAAS,SAAA;AAC1C,EAAA,IAAI,SAAS,KAAA,EAAO,aAAA;AACpB,EAAA,IAAI,OAAA,GAAoD,MAAA;AACxD,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,cAAA;AACJ,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,OAAA,IAAW,CAAA,KAAM,GAAG,OAAA,IAAA,CAAY,MAAA,CAAO,IAAA,IAAQ,CAAA,KAAM,EAAA,CAAG,IAAA;AACnF,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAI,MAAA,IAAU,CAAC,SAAA,EAAW;AAC1B,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,MAAK,EAAG;AACV,MAAA,KAAA,GAAQ,CAAC,WAAA,EAAa,EAAA,EAAI,GAAG,EAAA,CAAG,KAAA,EAAO,IAAI,OAAO,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,MAAM,OAAO,CAAA,kBAAA,EAAqB,EAAA,CAAG,OAAO,CAAA,cAAA,EAAc,GAAG,IAAI,CAAA,MAAA,CAAA;AACjE,MAAA,KAAA,GAAQ,OAAA,KAAY,QAAA,GAAW,CAAC,4BAAA,EAA8B,WAAA,EAAa,QAAQ,CAAA,GAC/E,OAAA,KAAY,SAAA,GAAY,CAAC,8CAAA,EAA2C,QAAQ,IAC5E,OAAA,KAAY,QAAA,GAAW,CAAC,+BAAA,EAAiC,IAAA,EAAM,gCAAA,EAAkC,CAAA,EAAG,OAAO,CAAA,QAAA,CAAU,CAAA,GACrH,CAAC,IAAA,EAAM,6CAA6C,CAAA;AAExD,MAAA,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,MAAA,CAAO,OAAA,IAAW,EAAA,IAAM,CAAC,CAAC,CAAC,CAAA,CAC7E,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,EAAA,IAAM,CAAC,CAAC,CAAA;AAAA,IAClD;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EAC/C,CAAA;AACA,EAAA,MAAM,gBAAgB,MAAqB;AACzC,IAAA,IAAI,gBAAgB,OAAO,cAAA;AAC3B,IAAA,OAAA,GAAU,SAAA;AACV,IAAA,IAAA,EAAK;AACL,IAAA,cAAA,GAAA,CAAkB,YAAY;AAC5B,MAAA,IAAI;AACF,QAAA,aAAA,GAAgB,WAAA,CAAY,IAAA,CAAK,MAAA,EAAO,EAAG,gBAAgB,CAAC,CAAA;AAC5D,QAAA,SAAA,CAAU,eAAe,GAAK,CAAA;AAC9B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,EAAe,WAAW,CAAA;AAC5C,QAAA,aAAA,CAAc,IAAA,EAAM,YAAY,UAAA,EAAY,EAAA,CAAG,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACpE,QAAA,OAAA,GAAU,aAAA,CAAc,IAAI,CAAA,CAAE,IAAA;AAE9B,QAAA,MAAM,cAAc,CAAC,EAAE,YAAY,cAAA,IAAkB,WAAA,CAAY,cAAc,WAAA,CAAY,OAAA,CAAA;AAC3F,QAAA,MAAM,MAAA,GAAA,CAAU,SAAS,SAAA,IAAa,CAAC,gBAAgB,MAAA,CAAO,OAAA,CAAQ,WAAA,IAAe,WAAA,EAAa,OAAO,CAAA;AACzG,QAAA,OAAA,GAAU,SAAS,QAAA,GAAW,QAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,GAAU,QAAA;AAAA,MACZ;AACA,MAAA,IAAI,MAAA,EAAQ;AACZ,MAAA,IAAI,WAAW,IAAA,EAAK;AAAA,WACf,MAAA,CAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GAC1B,CAAA;AAAA,EAA+B,WAAW;AAAA,EAAK,QAAQ;AAAA,CAAA,GACvD,CAAA;AAAA,EAA0C,OAAA,IAAW,CAAA,sBAAA,EAAyB,OAAO,CAAA,oBAAA,CAAsB;;AAAA,EAAO,OAAO;AAAA,CAAI,CAAA;AAAA,IACnI,CAAA,GAAG;AACH,IAAA,OAAO,cAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAA,EAAK;AACL,IAAA,IAAI,CAAC,UAAU,IAAA,KAAS,MAAA,IAAU,CAAC,IAAA,EAAK,OAAQ,aAAA,EAAc;AAAA,EAChE,CAAA;AACA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,MAAA,EAAQ;AACZ,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,MAAA,CAAO,GAAA,CAAI,UAAU,MAAM,CAAA;AAC3B,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,KAAK,CAAA;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,SAAS,CAAA;AAC/B,IAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,SAAS,CAAA;AAChC,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,MAAM,CAAA;AAC5B,IAAA,IAAI,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AACvC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAI;AAAE,QAAA,MAAA,CAAO,eAAe,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAqC;AAAA,IAC9G;AAAA,EACF,CAAA;AACA,EAAA,MAAM,YAAY,MAAM;AAAE,IAAA,KAAA,EAAM;AAAG,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAAG,CAAA;AACtD,EAAA,MAAM,YAAY,MAAM;AAAE,IAAA,KAAA,EAAM;AAAG,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAAG,CAAA;AACtD,EAAA,MAAM,SAAS,MAAM;AAAE,IAAA,KAAA,EAAM;AAAG,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAAG,CAAA;AACnD,EAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,KAAK,CAAA;AAC1B,EAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,SAAS,CAAA;AAChC,EAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,SAAS,CAAA;AACjC,EAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,MAAM,CAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,CAAO,MAAM,WAAW,CAAA;AACxB,IAAA,MAAA,CAAO,EAAA,CAAG,UAAU,MAAM,CAAA;AAC1B,IAAA,IAAA,EAAK;AAAA,EACP;AACA,EAAA,IAAI;AACF,IAAA,IAAI,IAAA,KAAS,aAAc,IAAA,KAAS,MAAA,IAAU,CAAC,IAAA,EAAK,QAAU,aAAA,EAAc;AAC5E,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB,SAAS,KAAA,EAAO;AACd,IAAA,KAAA,EAAM;AACN,IAAA,MAAM,KAAA;AAAA,EACR;AACF;ACvMA,IAAM,OAAA,GAAU,UAAU,QAAQ,CAAA;AAQlC,IAAM,GAAA,GAAM,CAAC,KAAA,KAAkB,KAAA,CAAM,QAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,EAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAQ,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA;AACtJ,IAAM,OAAA,GAAU,CAAC,KAAA,EAAe,iBAAA,GAAoB,KAAA,KAAU,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,CACrI,OAAA,CAAQ,KAAA,EAAO,MAAM,iBAAA,GAAoB,IAAA,GAAO,GAAG,CAAA,GAAI,GAAA;AAC1D,IAAM,UAAA,GAAa,CAAC,KAAA,KAAkB,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,MAAM,CAAA,GAAI,GAAA;AAGtG,SAAS,YAAY,OAAA,EAGZ;AACd,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAQ,GAAI,OAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,OAAA,CAAQ,UAAU,IAAA,GAAO,OAAA,CAAQ,QAAQ,OAAA,EAAQ;AAC1F,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,QAAA;AAC7C,EAAA,MAAM,kBAAkB,OAAA,CAAQ,eAAA,IAAmB,QAAQ,GAAA,CAAI,IAAA,IAAa,aAAQ,UAAU,CAAA;AAC9F,EAAA,KAAA,MAAW,SAAS,CAAC,SAAA,EAAW,SAAS,UAAA,EAAY,IAAA,EAAM,eAAe,CAAA,EAAG;AAC3E,IAAA,IAAI,aAAa,IAAA,CAAK,KAAK,GAAG,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EAClG;AACA,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC3E,EAAA,MAAM,IAAA,GAAO,wBAAwB,EAAE,CAAA,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,CAAC,OAAA,EAAS,QAAA,EAAU,eAAe,SAAS,CAAA;AACzD,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,MAAM,SAAS,CAAA,IAAA,EAAO,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,UAAU,CAAA,CAAA;AACvD,IAAA,MAAM,OAAY,IAAA,CAAA,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,cAAA,EAAgB,OAAO,QAAQ,CAAA;AACvE,IAAA,OAAO;AAAA,MAAE,IAAA,EAAM,SAAA;AAAA,MAAW,IAAA;AAAA,MAAM,IAAA;AAAA,MAC9B,OAAA,EAAS,CAAA;AAAA;AAAA;AAAA,wBAAA,EAGW,IAAI,CAAA;AAAA,kCAAA,EACM,CAAC,UAAA,EAAY,GAAG,IAAI,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,QAAA,EAAW,GAAA,CAAI,CAAC,CAAC,CAAA,SAAA,CAAW,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,mCAAA,EACpE,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,4DAAA,EACgB,GAAA,CAAI,eAAe,CAAC,CAAA;AAAA;AAAA;AAAA,kCAAA,EAG9C,GAAA,CAAS,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAC,CAAC,CAAA;AAAA,oCAAA,EACtC,GAAA,CAAS,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAC,CAAC,CAAA;AAAA;AAAA,CAAA;AAAA,MAE3E,KAAA,EAAO,CAAC,WAAA,EAAa,OAAA,EAAS,GAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,MAC9C,QAAQ,CAAC,CAAC,WAAA,EAAa,QAAA,EAAU,GAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,GAAG,CAAC,WAAA,EAAa,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,MAC/F,OAAA,EAAS,CAAC,CAAC,WAAA,EAAa,SAAA,EAAW,GAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAC;AAAA,KAAE;AAAA,EAC7D;AACA,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,MAAM,OAAY,IAAA,CAAA,IAAA,CAAK,IAAA,EAAM,WAAW,SAAA,EAAW,MAAA,EAAQ,OAAO,UAAU,CAAA;AAC5E,IAAA,OAAO;AAAA,MAAE,IAAA,EAAM,SAAA;AAAA,MAAW,IAAA;AAAA,MAAM,IAAA;AAAA,MAC9B,OAAA,EAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAKH,CAAC,UAAA,EAAY,GAAG,IAAI,EAAE,GAAA,CAAI,CAAA,KAAA,KAAS,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC;AAAA,iBAAA,EAC3D,OAAA,CAAQ,IAAI,CAAC;AAAA,YAAA,EAClB,OAAA,CAAQ,OAAA,GAAU,eAAe,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,MAM7C,OAAO,CAAC,WAAA,EAAa,QAAA,EAAU,WAAA,EAAa,OAAO,UAAU,CAAA;AAAA,MAC1D,MAAA,EAAQ,CAAC,CAAC,WAAA,EAAa,UAAU,eAAe,CAAA,EAAG,CAAC,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,IAAA,GAAO,UAAU,CAAC,CAAA;AAAA,MAChH,OAAA,EAAS,CAAC,CAAC,WAAA,EAAa,UAAU,SAAA,EAAW,OAAA,EAAS,IAAA,GAAO,UAAU,CAAA,EAAG,CAAC,WAAA,EAAa,QAAA,EAAU,eAAe,CAAC;AAAA,KAAE;AAAA,EACxH;AACA,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAM,MAAM,IAAI,MAAM,kDAAkD,CAAA;AACrF,IAAA,MAAM,IAAA,GAAY,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,kBAAkB,CAAA;AACpD,IAAA,OAAO;AAAA,MAAE,IAAA,EAAM,gBAAA;AAAA,MAAkB,IAAA;AAAA,MAAM,IAAA;AAAA,MACrC,OAAA,EAAS,CAAA;AAAA;AAAA,uDAAA,EAE0C,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,0CAAA,EAC9B,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA;AAAA,wCAAA,EAEnB,IAAI,UAAU,CAAC,CAAA,qBAAA,EAAwB,GAAA,CAAI,KAAK,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA,8BAAA,EAAiC,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA;AAAA,CAAA;AAAA,MAE3J,KAAA,EAAO,CAAC,cAAA,EAAgB,QAAA,EAAU,OAAO,IAAI,CAAA;AAAA,MAC1C,QAAQ,CAAC,CAAC,cAAA,EAAgB,SAAA,EAAW,OAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAI,GAAG,CAAC,cAAA,EAAgB,MAAA,EAAQ,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,MAC5G,OAAA,EAAS,CAAC,CAAC,cAAA,EAAgB,QAAQ,KAAA,EAAO,IAAI,CAAA,EAAG,CAAC,cAAA,EAAgB,SAAA,EAAW,KAAA,EAAO,IAAA,EAAM,IAAI,CAAC;AAAA,KAAE;AAAA,EACrG;AACA,EAAA,MAAM,IAAI,MAAM,uGAAuG,CAAA;AACzH;AAEA,IAAM,GAAA,GAAM,OAAO,CAAC,OAAA,EAAY,OAAI,CAAA,KAAe;AAAE,EAAA,MAAM,OAAA,CAAQ,SAAS,IAAA,EAAM,EAAE,SAAS,IAAA,EAAQ,WAAA,EAAa,MAAM,CAAA;AAAG,CAAA;AAC3H,eAAsB,cAAc,SAAA,EAA0C;AAC5E,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAA4B,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,uBAAuB,CAAC,CAAA,IAAK,EAAE,OAAA,EAAS,KAAA,EAAM;AAC9G,EAAA,MAAM,WAAW,MAAM,QAAA,CAA4B,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,wBAAwB,CAAC,CAAA;AAC5F,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,MAAM,OAAA,IAAW,MAAM,iBAAA,CAAkB,QAAQ,CAAA,EAAE;AACjF;AAEA,eAAsB,iBAAiB,SAAA,EAAmB,OAAA,EAAiB,OAAA,EAAkB,OAAA,GAEzF,EAAC,EAA0B;AAC7B,EAAA,MAAS,SAAM,SAAA,EAAW,EAAE,WAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAC1D,EAAA,MAAM,QAAA,GAAgB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,cAAc,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,QAAQ,CAAA;AAC9C,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,yDAAyD,CAAA;AACpF,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,QAAQ,QAAA,KAAa,OAAA,IAAW,CAAC,OAAA,CAAQ,IAAA,GAAA,CACjD,MAAM,OAAA,CAAQ,YAAA,EAAc,EAAC,EAAG,EAAE,SAAS,GAAA,EAAM,WAAA,EAAa,MAAM,CAAA,EAAG,MAAA,CAAO,IAAA,EAAK,GAAI,KAAA,CAAA;AAC5F,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,WAAA,CAAY,EAAE,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AACrE,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,IAAO,GAAA;AAC/B,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,IAAI;AAAE,MAAA,MAAM,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAG,MAAA,MAAA,GAAS,IAAA;AAAA,IAAM,CAAA,CAAA,MAAQ;AAAA,IAA8B;AACtF,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAA,GAAW,MAAS,EAAA,CAAA,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAA,KAAS,gBAAA,GAAmB,SAAA,GAAY,MAAM,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACjH,MAAA,MAAM,OAAA,GAAU,aAAa,IAAA,CAAK,OAAA;AAClC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAS,EAAA,CAAA,KAAA,CAAW,IAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,GAAA,EAAO,CAAA;AACxE,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,GAAO,CAAA,KAAA,EAAQ,QAAQ,GAAG,CAAA,CAAA;AACjD,QAAA,IAAI;AACF,UAAA,MAAS,EAAA,CAAA,SAAA,CAAU,SAAA,EAAW,IAAA,CAAK,OAAA,EAAS,EAAE,IAAA,EAAM,GAAA,EAAO,QAAA,EAAU,IAAA,CAAK,IAAA,KAAS,gBAAA,GAAmB,SAAA,GAAY,QAAQ,CAAA;AAC1H,UAAA,MAAS,EAAA,CAAA,MAAA,CAAO,SAAA,EAAW,IAAA,CAAK,IAAI,CAAA;AAAA,QACtC,CAAA,SAAE;AAAU,UAAA,MAAS,EAAA,CAAA,EAAA,CAAG,SAAA,EAAW,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,QAAG;AAAA,MACvD;AAGA,MAAA,IAAI,CAAC,MAAA,IAAU,OAAA,IAAW,IAAA,CAAK,SAAS,SAAA,EAAW;AACjD,QAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,MAAA,EAAQ,MAAM,QAAQ,MAAM,CAAA;AAAA,MACxD;AACA,MAAA,MAAM,OAAA,CAAQ,KAAK,KAAK,CAAA;AACxB,MAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAM,OAAA,CAAQ,MAAA,EAAO;AAAA,WACpC;AACH,QAAA,IAAI,OAAA,GAAU,KAAA;AACd,QAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,EAAA,EAAI,OAAA,EAAA,EAAW;AAC7C,UAAA,MAAM,WAAW,MAAM,QAAA,CAA4B,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,wBAAwB,CAAC,CAAA;AAC5F,UAAA,IAAI,MAAM,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAAE,YAAA,OAAA,GAAU,IAAA;AAAM,YAAA;AAAA,UAAO;AAChE,UAAA,MAAMC,aAAM,GAAG,CAAA;AAAA,QACjB;AACA,QAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,2EAAgF,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MACjJ;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,MAAA,IAAU,MAAS,EAAA,CAAA,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,MAAM,IAAA,EAAM,MAAM,KAAK,CAAA,EAAG;AACpE,QAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,UAAA,IAAI;AAAE,YAAA,MAAM,QAAQ,MAAM,CAAA;AAAA,UAAG,SACtB,KAAA,EAAO;AAAE,YAAA,IAAI,MAAA,CAAO,SAAS,MAAM,CAAA,IAAK,OAAO,QAAA,CAAS,SAAS,CAAA,IAAK,CAAC,MAAA,EAAQ;AAAU,YAAA,MAAM,KAAA;AAAA,UAAO;AAAA,QAC/G;AAAA,MACF;AACA,MAAA,MAAS,MAAG,IAAA,CAAK,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,KAAA,GAAsB,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK;AACzF,IAAA,MAAM,SAAA,CAAe,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,uBAAuB,GAAG,KAAK,CAAA;AACpE,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,OAAA,EAAQ;AAAA,EACtC,CAAA,SAAE;AAAU,IAAA,MAAM,KAAK,KAAA,EAAM;AAAA,EAAG;AAClC;AAIA,eAAsB,aAAA,CAAc,WAAmB,OAAA,EAAgC;AACrF,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,MAAM,OAAO,MAAM;AAAE,IAAA,QAAA,GAAW,IAAA;AAAM,IAAA,KAAA,CAAM,KAAA,EAAM;AAAA,EAAG,CAAA;AACrD,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,IAAI,CAAA;AAAG,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AACtD,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,MAAM,YAAA,GAAoB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,wBAAwB,CAAA;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,CAAU,YAAA,EAAc,MAAM,sBAAA,EAAwB,CAAA;AAC5D,IAAA,OAAO,CAAC,QAAA,EAAU;AAChB,MAAA,MAAM,SAAS,MAAM,QAAA,CAAoC,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,uBAAuB,CAAC,CAAA;AACjG,MAAA,MAAM,aAAa,MAAM,QAAA,CAA+B,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,0BAA0B,CAAC,CAAA;AACnG,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,IAAW,CAAC,MAAM,iBAAA,CAAkB,UAAU,CAAA,EAAG;AAC5D,QAAA,IAAI;AAAE,UAAA,MAAM,cAAA,CAAe,SAAA,EAAW,OAAA,EAAS,EAAC,EAAG,KAAA,CAAA,EAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAG,UAAA,aAAA,GAAgB,EAAA;AAAA,QAAI,SACrH,KAAA,EAAO;AACZ,UAAA,IAAI,QAAA,EAAU;AACd,UAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,2BAAA;AACzD,UAAA,IAAI,YAAY,aAAA,EAAe;AAAE,YAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,mBAAA,EAAsB,OAAO;AAAA,CAAI,CAAA;AAAG,YAAA,aAAA,GAAgB,OAAA;AAAA,UAAS;AAAA,QACrH;AAAA,MACF;AAEA,MAAA,KAAA,IAAS,IAAA,GAAO,GAAG,IAAA,GAAO,EAAA,IAAM,CAAC,QAAA,EAAU,IAAA,EAAA,EAAQ,MAAMA,YAAA,CAAM,GAAG,CAAA;AAAA,IACpE;AAAA,EACF,CAAA,SAAE;AACA,IAAA,IAAA,CAAK,MAAM,QAAA,CAA0B,YAAY,CAAA,GAAI,GAAA,KAAQ,OAAA,CAAQ,GAAA,EAAK,MAAM,SAAA,CAAU,YAAA,EAAc,EAAE,GAAA,EAAK,GAAG,CAAA;AAClH,IAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,IAAI,CAAA;AAAG,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,IAAI,CAAA;AAAA,EAC1D;AACF;;;ACzLO,SAAS,iBAAiB,KAAA,EAAyD;AACxF,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAChC,EAAA,IAAI,UAAU,QAAA,IAAY,KAAA,KAAU,WAAA,IAAe,KAAA,KAAU,QAAQ,OAAO,KAAA;AAC5E,EAAA,MAAM,IAAI,MAAM,8FAA8F,CAAA;AAChH;AAIO,SAAS,eAAA,CAAgB,WAAmB,SAAA,EAA2B;AAC5E,EAAA,IAAI,CAAC,CAAC,SAAA,EAAW,SAAS,CAAA,CAAE,KAAA,CAAM,CAAA,EAAA,KAAM,wBAAA,CAAyB,IAAA,CAAK,EAAE,CAAC,CAAA,EAAG;AAC1E,IAAA,MAAM,IAAI,MAAM,2EAA2E,CAAA;AAAA,EAC7F;AACA,EAAA,OAAO,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACtD;AAIA,eAAsB,uBAAuB,OAAA,EAIf;AAC5B,EAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ,OAAO,MAAA;AACzC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,KAAU,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,eAAe,CAAA;AAClH,EAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,WAAA,IAAe,CAAC,aAAa,OAAO,MAAA;AAC9D,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,KAAU,CAAC,MAAA,CAAO,OAAA,KAAY,MAAA,CAAO,SAAA,IAAa,WAAA,CAAY,CAAA,GAAI,QAAA,GAAW,MAAA;AAC3G;AAIA,eAAsB,sBAAsB,OAAA,EAGmB;AAC7D,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,MAAA,KAAU,CAAC,OAAO,OAAO,CAAA;AAC1E,EAAA,MAAM,MAAA,GAAS,aAAa,MAAA,GACxB;AAAA;AAAA,EAAyC,aAAA,CAAc,YAAA,EAAc,IAAI,CAAC;;AAAA,sFAAA,CAAA,GAC1E,kDAAA;AACJ,EAAA,WAAS;AACP,IAAA,MAAM,MAAA,GAAA,CAAU,MAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG,IAAA,GAAO,WAAA,EAAY;AACnE,IAAA,IAAI,CAAC,EAAA,EAAI,GAAA,EAAK,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,EAAE,OAAA,EAAS,KAAA,EAAM;AAC9D,IAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,MAAA,IAAI,CAAC,GAAA,EAAK,SAAS,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,EAAE,OAAA,EAAS,MAAM,gBAAA,EAAkB,YAAA,CAAa,IAAI,CAAA,MAAA,KAAU,MAAA,CAAO,EAAE,CAAA,EAAE;AACvH,MAAA,IAAI,CAAC,GAAA,EAAK,KAAK,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,IAC5D,CAAA,MAAA,IAAW,CAAC,GAAA,EAAK,KAAK,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,EACnE;AACF;AAGA,eAAsB,oBAAoB,OAAA,EAKT;AAC/B,EAAA,IAAI,QAAQ,OAAA,IAAW,OAAA,CAAQ,WAAW,MAAM,IAAI,MAAM,0CAA0C,CAAA;AACpG,EAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAC,OAAA,CAAQ,KAAA,CAAM,OAAA,IAAW,CAAC,OAAA,CAAQ,KAAA,CAAM,OAAA,GAAU,IAAA,GAAO,MAAA;AACtF,EAAA,IAAI,QAAQ,SAAA,EAAW,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,MAAA,GAAY,KAAA;AAC/D,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAA,IAAW,CAAC,OAAA,CAAQ,KAAA,CAAM,OAAA,GAAU,IAAA,GAAO,MAAA;AACxF,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,EAAU,OAAO,MAAA;AAC9B,EAAA,WAAS;AACP,IAAA,MAAM,MAAA,GAAA,CAAU,MAAM,OAAA,CAAQ,QAAA;AAAA,MAC5B;AAAA,KAA2E,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY;AACnG,IAAA,IAAI,CAAC,IAAI,GAAA,EAAK,KAAK,EAAE,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AAC9C,IAAA,IAAI,CAAC,GAAA,EAAK,IAAI,EAAE,QAAA,CAAS,MAAM,GAAG,OAAO,KAAA;AAAA,EAC3C;AACF;AASO,SAAS,aAAA,CAAc,OAAA,EAA2B,QAAA,GAAW,KAAA,EAAe;AACjF,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,CAAC,OAAO,OAAO,CAAA;AACtD,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,MAAMC,YAAW,CAAC,MAAA,KAA2B,OAAO,IAAA,CAAK,OAAA,CAAQ,yBAAyB,EAAE,CAAA;AAC5F,EAAA,KAAA,MAAW,MAAA,IAAU,KAAA,EAAO,KAAA,CAAM,GAAA,CAAIA,UAAS,MAAM,CAAA,EAAA,CAAI,KAAA,CAAM,GAAA,CAAIA,SAAAA,CAAS,MAAM,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAC9F,EAAA,OAAO,MACJ,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA,CAAE,GAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAC,CAAA,CACvE,IAAI,CAAA,MAAA,KAAU;AACb,IAAA,MAAM,IAAA,GAAOA,UAAS,MAAM,CAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,KAAc,IAAA,GAAO,WAAA,GAAc,QAAA;AACzD,IAAA,MAAM,QAAA,GAAW,QAAA,IAAA,CAAa,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,CAAA,UAAA,EAAU,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,GAAK,EAAA;AAC9F,IAAA,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,MAAA,EAAM,MAAM,GAAG,QAAQ,CAAA,CAAA;AAAA,EACzC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAChB;ACxFO,IAAM,qBAAN,MAAyB;AAAA,EAO9B,YAA6B,MAAA,EAA4B;AAA5B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,IAAA,CAAK,QAAQ,WAAA,CAAY,MAAM,IAAA,CAAK,MAAA,IAAU,GAAI,CAAA;AAClD,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA;AAAA,EACnC;AAAA,EAL6B,MAAA;AAAA,EANZ,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,EACrB,KAAA;AAAA,EACT,OAAA,GAAU,yBAAA;AAAA,EACV,MAAA,GAAS,KAAA;AAAA,EACA,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,EAAM;AAAA,EAS5C,OAAO,OAAA,EAAuB;AAAE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAS,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EAAG;AAAA,EAEvE,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AACxB,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA;AAChC,IAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAC,CAAA;AACvB,IAAA,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,EAC1B;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAA,CAAO,IAAA,CAAK,KAAI,GAAI,IAAA,CAAK,aAAa,GAAI,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,OAAA,GAAU,CAAA,GAAI,CAAA,MAAA,EAAM,OAAO,CAAA,CAAA,CAAA,GAAM,EAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,IAAA,CAAK,OAAO,OAAA,IAAW,EAAA,IAAM,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC1E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,yBAAyB,EAAE,CAAA;AAChE,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,GAAS,KAAA,GAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,GAAI,QAAA,GAAM,OAAA;AAC1E,IAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAC,CAAA;AACvB,IAAA,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAC,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,OAAO,CAAA;AAAA,EAClC;AACF,CAAA;;;ACvCO,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EAC/C,WAAA,CACW,MAAA,EACA,IAAA,EACA,UAAA,GAAa,CAAA,EACtB;AACA,IAAA,KAAA;AAAA,MACE,MAAA,KAAW,CAAA,GACP,mFAAA,GACA,CAAA,4CAAA,EAA+C,IAAI,CAAA,EAAA;AAAA,KACzD;AARS,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAOX;AAAA,EATW,MAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAQb,CAAA;AAGA,eAAsB,gBAAA,CAAoB,GAAA,EAAaC,KAAAA,EAAc,IAAA,EAA2B;AAC9F,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,GAAMA,KAAAA,EAAM;AAAA,MACjC,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,OAAA;AAAA,MACV,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,GAAM,CAAA;AAAA,MAClC,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,qBAAA,CAAsB,CAAA,EAAG,aAAa,CAAA;AAAA,EAClD;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI;AACF,IAAA,IAAI,MAAA;AACF,MAAA,WAAS;AACP,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAChB,QAAA,IAAI,SAAS,EAAA,GAAK,IAAA,EAAM,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAC/F,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAAA,EACJ,CAAA,SAAE;AACA,IAAA,KAAK,MAAA,EAAQ,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,IAAA,CAAK,MAAM,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,qBAAA,CAAsB,QAAA,CAAS,MAAA,EAAQ,kBAAkB,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,QAAS,IAAA,EAAqC,KAAA;AACpD,IAAA,MAAM,IAAA,GAAO,OAAO,KAAA,KAAU,QAAA,GAAW,QAAS,KAAA,EAAqC,IAAA;AACvF,IAAA,MAAM,aAAa,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA;AAC7D,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,QAAA,CAAS,MAAA;AAAA,MACT,OAAO,IAAA,KAAS,QAAA,IAAY,iBAAiB,IAAA,CAAK,IAAI,IAAI,IAAA,GAAO,iBAAA;AAAA,MACjE,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,UAAU,CAAC,CAAA,GAAI;AAAA,KACxE;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;;;ACvDO,IAAM,kBAAA,GAAqB,4BAAA;AAC3B,IAAM,aAAA,GAAgB,8BAA8B,kBAAkB,CAAA,CAAA;AAEtE,SAAS,aAAa,KAAA,EAAuB;AAClD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAI,IAAI,KAAK,CAAA;AAAA,EACrB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EACxD;AACA,EAAA,IACE,KAAA,CAAM,MAAA,GAAS,IAAA,IACf,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,IACrB,GAAA,CAAI,QAAA,IACJ,GAAA,CAAI,QAAA,IACJ,GAAA,CAAI,UACJ,GAAA,CAAI,IAAA,IACH,GAAA,CAAI,QAAA,KAAa,QAAA,IAChB,EAAE,GAAA,CAAI,QAAA,KAAa,OAAA,IAAW,CAAC,WAAA,EAAa,WAAA,EAAa,OAAO,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,CAAA,EACzF;AACA,IAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAAA,EAC3F;AACA,EAAA,IAAI,GAAA,CAAI,QAAA,KAAa,GAAA,EAAK,GAAA,CAAI,QAAA,GAAW,kBAAA;AACzC,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,GAAG,KAAK,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3F,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,GAAA,CAAI,IAAA;AACb;AAEA,eAAsB,uBAAuB,OAAA,EAKR;AACnC,EAAA,MAAM,OAAO,MAAM,kBAAA,CAAmBC,KAAK,OAAA,CAAQ,SAAA,EAAW,sBAAsB,CAAC,CAAA;AACrF,EAAA,IAAI;AACF,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,SAAA,EAAU;AAAA,IACrD,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,MAA8B,MAAA,KAAW,GAAA;AAC5C,QAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAC3F,MAAA,MAAM,KAAA;AAAA,IACR;AAGA,IAAA,MAAM,GAAA,GAAM,YAAA;AAAA,MACV,QAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,CAAI,sBAAA,IAA0B,OAAO,GAAA,IAAO;AAAA,KACrE;AACA,IAAA,IACE,MAAA,CAAO,GAAA,IACP,MAAA,CAAO,GAAA,KAAQ,GAAA,KACd,MAAA,CAAO,OAAA,IAAA,CAAY,MAAA,CAAO,QAAA,IAAY,CAAA,OAAQ,MAAA,CAAO,iBAAA,IAAqB,CAAA,CAAA,CAAA,EAC3E;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,GAAA,KAAQ,OAAO,MAAA,CAAO,KAAA,EAAO,QAAA,CAAS,YAAY,CAAA,EAAG;AACjF,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,yCAAA,EAA4C,IAAI,IAAI,GAAG,CAAA,CAAE,IAAI,CAAA,MAAA,CAAG,CAAA;AACrF,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAwC,GAAA,EAAK,0BAAA,EAA4B;AAAA,UAC/F,aAAa,MAAA,CAAO;AAAA,SACrB,CAAA;AACD,QAAA,IACE,OAAO,SAAA,EAAW,SAAA,KAAc,QAAA,IAChC,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,EAAA,IAC7B,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,IAAA,EAC7B;AACA,UAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,QACnF;AACA,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,mBAAA,CAAoB,GAAA,EAAK,UAAU,SAAS,CAAA;AAC1F,QAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAA0C,GAAA,EAAK,kBAAkB,KAAK,CAAA;AAC7F,QAAA,IAAI,QAAA,EAAU,gBAAgB,MAAA,CAAO,WAAA;AACnC,UAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,MACtE,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,iBAAiB,qBAAA,EAAuB;AAC1C,UAAA,IAAI,KAAA,CAAM,MAAA,KAAW,GAAA,IAAO,KAAA,CAAM,MAAA,KAAW,GAAA;AAC3C,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AACF,UAAA,IAAI,MAAM,MAAA,KAAW,GAAA;AACnB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AACF,UAAA,IAAI,MAAM,IAAA,KAAS,kBAAA;AACjB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AACF,UAAA,IAAI,KAAA,CAAM,MAAA,KAAW,GAAA,IAAO,KAAA,CAAM,MAAA,KAAW,GAAA;AAC3C,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AACF,UAAA,IAAI,MAAM,MAAA,KAAW,GAAA;AACnB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AACF,UAAA,IAAI,MAAM,MAAA,KAAW,GAAA;AACnB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AAAA,QACJ;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAA,GAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,MAAA,MAAA,GAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,SAAA,EAAU;AACnD,MAAA,IAAI,MAAA,CAAO,WAAW,MAAA,CAAO,QAAA,IAAY,OAAO,iBAAA,KAAsB,MAAA,CAAO,UAAU,OAAO,MAAA;AAC9F,MAAA,IAAI,MAAA,CAAO,OAAO,QAAA,CAAS,YAAY,KAAK,MAAA,CAAO,KAAA,EAAO,SAAS,gBAAgB,CAAA;AACjF,QAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAC9B,MAAA,MAAMH,aAAM,GAAG,CAAA;AAAA,IACjB;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAM,MAAM,KAAA,EAAM;AAAA,EACpB;AACF;AAEO,SAAS,qBAAqB,MAAA,EAAqD;AACxF,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,8EAAA;AAC7B,EAAA,IAAI,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA;AAChC,EAAA,OAAO,OAAO,QAAA,IAAY,MAAA,CAAO,iBAAA,KAAsB,MAAA,CAAO,WAC1D,wGAAA,GACA,mDAAA;AACN;AC9HA,IAAM,IAAA,GAAO,wBAAA;AACb,IAAM,eAAA,GAAkB,KAAK,EAAA,GAAK,GAAA;AAE3B,IAAM,sBAAA,GAAN,cAAqC,KAAA,CAAM;AAAA,EACvC,IAAA,GAAO,kBAAA;AAAA,EAChB,WAAA,CAAY,WAAW,QAAA,EAAU;AAAE,IAAA,KAAA,CAAM,cAAc,QAAQ,CAAA,gCAAA,EAAmC,QAAA,CAAS,WAAA,EAAa,CAAA,6CAAA,CAA+C,CAAA;AAAA,EAAG;AAC5K,CAAA;AAEO,SAAS,YAAY,KAAA,EAAmC;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,EAAI,WAAW,CAAA,CAAE,UAAU,CAAA;AACvF,IAAA,OAAO,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,CAAM,GAAA,GAAM,GAAA,GAAO,KAAA,CAAA;AAAA,EAC1F,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,MAAA;AAAA,EAAW;AAC9B;AAEO,SAAS,aAAa,WAAA,EAAwC;AACnE,EAAA,MAAM,OAAA,GAAU,YAAY,OAAA,IAAW,IAAA;AACvC,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAO,CAAA;AAC3B,EAAA,IAAI,GAAA,CAAI,QAAA,KAAa,QAAA,IAAY,GAAA,CAAI,QAAA,IAAY,IAAI,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,oEAAoE,CAAA;AACnJ,EAAA,IAAI,YAAY,QAAA,IAAY,WAAA,CAAY,YAAA,EAAc,OAAO,oBAAoB,IAAI,MAAA,CAAO,EAAE,OAAA,EAAS,UAAU,WAAA,CAAY,QAAA,EAAU,cAAc,WAAA,CAAY,YAAA,EAAc,CAAC,CAAA;AAChL,EAAA,IAAI,WAAA,CAAY,KAAA,EAAO,OAAO,mBAAA,CAAoB,IAAI,MAAA,CAAO,EAAE,OAAA,EAAS,KAAA,EAAO,WAAA,CAAY,KAAA,EAAO,CAAC,CAAA;AACnG,EAAA,MAAM,IAAI,sBAAA,EAAuB;AACnC;AAKO,SAAS,mBAAA,CAAoB,MAAA,EAAgB,SAAA,GAAY,IAAA,EAAgB;AAC9E,EAAA,MAAM,UAAU,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,KAAK,CAAA;AACtD,EAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,OAAU,OAAA,KAAmE;AAClG,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAS,MAAM,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,CAAM,IAAI,KAAA,CAAM,uCAAuC,CAAC,CAAA,EAAG,SAAS,CAAA;AAC9G,IAAA,OAAA,CAAQ,QAAQ,gBAAA,CAAiB,OAAA,EAAS,QAAQ,EAAE,IAAA,EAAM,MAAM,CAAA;AAChE,IAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAO;AACpC,IAAA,IAAI;AAAE,MAAA,OAAO,MAAM,QAAW,EAAE,GAAG,SAAS,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AAAA,IAAG,CAAA,SAC1E;AAAU,MAAA,YAAA,CAAa,KAAK,CAAA;AAAG,MAAA,OAAA,CAAQ,MAAA,EAAQ,mBAAA,CAAoB,OAAA,EAAS,MAAM,CAAA;AAAA,IAAG;AAAA,EACvF,CAAA;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAyB;AAC/C,EAAA,OAAO,KAAA,YAAiB,0BAA0B,CAAC,GAAA,EAAK,GAAG,CAAA,CAAE,QAAA,CAAU,KAAA,EAA+B,MAAA,IAAU,CAAC,CAAA;AACnH;AAIA,eAAsB,mBAAA,CAAoB,IAAA,EAAc,OAAA,GAEpD,EAAC,EAAoB;AACvB,EAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,IAAA,GAAO,OAAO,CAAA;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAA4B,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,sBAAA,EAAuB;AACnD,IAAA,MAAM,MAAA,GAAA,CAAU,OAAA,CAAQ,MAAA,IAAU,YAAA,EAAc,WAAW,CAAA;AAC3D,IAAA,IAAI,CAAC,WAAA,CAAY,KAAA,IAAS,YAAY,QAAA,IAAY,WAAA,CAAY,cAAc,OAAO,MAAA;AACnF,IAAA,MAAM,GAAA,GAAA,CAAO,QAAQ,GAAA,IAAO,IAAA,CAAK,MAAK,EAAG,OAAA,GAAU,WAAA,CAAY,WAAA,CAAY,KAAK,CAAA;AAChF,IAAA,IAAI,YAAY,KAAA,CAAA,IAAa,OAAA,IAAW,GAAA,EAAK,MAAM,IAAI,sBAAA,EAAuB;AAC9E,IAAA,IAAI,OAAA,KAAY,KAAA,CAAA,IAAa,OAAA,GAAU,GAAA,GAAM,iBAAiB,OAAO,MAAA;AACrE,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,KAAA,CAAM,OAAA,CAA8C;AAAA,QAC/E,MAAA,EAAQ,MAAA;AAAA,QAAQ,IAAA,EAAM,aAAA;AAAA,QAAe,IAAA,EAAM,EAAE,SAAA,EAAW,WAAA,CAAY,KAAA,EAAM;AAAA,QAAG,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAM;AAAA,OAChH,CAAA;AACD,MAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,EAAO,MAAM,IAAI,sBAAA,EAAuB;AACrD,MAAA,MAAM,IAAA,GAAA,CAAQ,OAAA,CAAQ,MAAA,IAAU,YAAA,EAAc,EAAE,GAAG,WAAA,EAAa,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AACtF,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,mBAAA,EAAqB,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAM,GAAG,CAAA;AAC1G,MAAA,MAAM,SAAA,CAAU,MAAM,EAAE,GAAG,aAAa,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAC9D,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG,MAAM,IAAI,sBAAA,EAAuB;AAC5D,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA,SAAE;AAAU,IAAA,MAAM,MAAM,KAAA,EAAM;AAAA,EAAG;AACnC;AAEA,eAAsB,YAAA,CAAa,MAAc,MAAA,EAAsC;AAGrF,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IAAC,SAA4B,IAAI,CAAA;AAAA,IACpE,SAAiCI,IAAA,CAAA,IAAA,CAAKC,OAAAA,EAAQ,EAAG,SAAA,EAAW,kBAAkB,CAAC;AAAA,GAAE,CAAA;AACnF,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,IAAI,CAAC,YAAY,EAAE,QAAA,CAAS,SAAS,QAAA,CAAS,QAAA,IAAY,SAAS,YAAA,CAAA,EAAe;AAClF,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,IAAI,CAAA,OAAA,EAAU,YAAY,CAAA,KAAA,CAAA;AAC/C,IAAA,MAAM,SAAA,CAAU,WAAW,QAAQ,CAAA;AACnC,IAAA,IAAI;AACF,MAAA,MAAMC,OAAAA,GAAS,MAAM,mBAAA,CAAoB,SAAS,CAAA;AAClD,MAAA,MAAMA,OAAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,mBAAA,EAAqB,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAM,GAAG,CAAA;AAC5G,MAAA,MAAM,SAAA,CAAU,IAAA,EAAM,MAAM,QAAA,CAA4B,SAAS,CAAC,CAAA;AAClE,MAAA,OAAOA,OAAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAAE,MAAA,IAAI,CAAC,cAAA,CAAe,KAAK,CAAA,EAAG,MAAM,KAAA;AAAA,IAAO,CAAA,SAC3D;AAAU,MAAA,MAAMC,EAAAA,CAAG,SAAA,EAAW,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IAAG;AAAA,EAClD;AACA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,IAAI,MAAA,CAAO,EAAE,OAAO,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3E,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,KAAA,CAAM,QAA2B,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,eAAe,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAM,GAAG,CAAA;AAC1I,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,EAAO,MAAM,IAAI,MAAM,mDAAmD,CAAA;AACvF,EAAA,MAAA,CAAO,QAAA,CAAS,QAAQ,KAAK,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,KAAA,CAAM,OAAA,CAAyB;AAAA,IAAE,MAAA,EAAQ,MAAA;AAAA,IAAQ,IAAA,EAAM,eAAA;AAAA,IAChF,IAAA,EAAM,EAAE,GAAA,EAAK,QAAA,EAAU,cAAc,sCAAA,EAAuC;AAAA,IAAG,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAM;AAAA,GAAG,CAAA;AACtH,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,IAAI,GAAA,CAAI,QAAA,KAAa,QAAA,IAAY,GAAA,CAAI,QAAA,KAAa,iBAAA,IAAqB,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,QAAA,EAAU,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAC/J,EAAA,MAAM,EAAA,GAAK,IAAI,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,EAAI;AACvD,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAAA;AAC9F,EAAA,MAAA,CAAO,KAAA,CAAM;AAAA;AAAA,EAAyC,IAAI,IAAI;;AAAA,yBAAA,CAA0B,CAAA;AACxF,EAAA,MAAA,CAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AACpB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA,GAAQ,EAAA;AACtC,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAMP,aAAM,GAAI,CAAA;AAChB,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,KAAA,CAAM,OAAA,CAA4B,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,cAAA,EAAiB,EAAE,CAAA,KAAA,CAAA,EAAS,MAAA,EAAQ,YAAY,OAAA,CAAQ,IAAM,GAAG,CAAA;AACtJ,IAAA,IAAI,OAAO,MAAA,KAAW,SAAA,EAAW,MAAM,IAAI,MAAM,kEAAkE,CAAA;AACnH,IAAA,IAAI,MAAA,CAAO,WAAW,eAAA,EAAiB;AACvC,IAAA,MAAM,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,mBAAA,EAAqB,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAM,GAAG,CAAA;AAC5G,IAAA,MAAM,UAAU,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAmC,CAAA;AAC1E,IAAA,MAAA,CAAO,MAAM,sBAAsB,CAAA;AACnC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AACtF;;;AChHA,IAAMQ,QAAAA,GAAUC,UAAUC,QAAQ,CAAA;AAElC,eAAsB,eAAe,MAAA,EAAkD;AACrF,EAAA,MAAA,CAAO,MAAM,8YAAgX,CAAA;AAC7X,EAAA,WAAS;AACP,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,QAAA,CAAS,kBAAkB,GAAG,IAAA,EAAK;AAChE,IAAA,MAAM,QAAA,GAAY,CAAC,WAAA,EAAa,QAAA,EAAU,cAAc,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,WAAW,CAAA,CAAY,MAAA,CAAO,MAAA,IAAU,GAAG,IAAI,CAAC,CAAA;AAClI,IAAA,IAAI,UAAU,OAAO,QAAA;AACrB,IAAA,MAAA,CAAO,MAAM,kBAAa,CAAA;AAAA,EAC5B;AACF;AAEO,SAAS,mBAAmB,KAAA,EAAmC;AACpE,EAAA,IAAI,CAAC,QAAA,EAAU,YAAA,EAAc,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,WAAW,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AACzG,EAAA,MAAM,IAAI,MAAM,wEAAwE,CAAA;AAC1F;AAEO,SAAS,iBAAiB,KAAA,EAAuB;AACtD,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE,CAAC,CAAA;AACpF,EAAA,IAAI,IAAI,IAAA,IAAQ,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,aAAa,MAAA,IAAU,CAAC,GAAA,CAAI,QAAA,CAAS,SAAS,GAAG,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1G,IAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAAA,EAC3F;AACA,EAAA,OAAO,GAAA,CAAI,QAAA;AACb;AAGA,eAAsB,mBAAA,CAAoB,MAAA,EAAgB,SAAA,EAAmB,IAAA,EAAoD;AAC/H,EAAA,IAAI,KAAA,GAAQ,MAAM,QAAA,CAAwB,SAAS,CAAA;AACnD,EAAA,IAAI,CAAC,KAAA,EAAO;AAAE,IAAA,KAAA,GAAQ,EAAE,cAAA,EAAgBC,UAAAA,EAAW,EAAE;AAAG,IAAA,MAAM,SAAA,CAAU,WAAW,KAAK,CAAA;AAAA,EAAG;AAC3F,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAA,EAAAC,OAAAA,EAAO,GAAI,MAAM,OAAO,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAC9D,MAAA,IAAIA,QAAO,MAAA,KAAW,QAAA,EAAU,MAAM,IAAI,MAAM,4FAA4F,CAAA;AAC5I,MAAA,IAAIA,OAAAA,CAAO,IAAA,KAAS,IAAA,EAAM,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,CAAOA,OAAAA,CAAO,EAAA,EAAI,EAAE,IAAA,EAAM,CAAA;AAC5E,MAAA,MAAMC,MAAAA,GAAQ,EAAE,EAAA,EAAID,OAAAA,CAAO,IAAI,GAAA,EAAK,YAAA,CAAaA,OAAAA,CAAO,GAAG,CAAA,EAAE;AAC7D,MAAA,MAAM,UAAU,SAAA,EAAW,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQC,QAAO,CAAA;AACtD,MAAA,OAAOA,MAAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAGd,MAAA,IAAK,KAAA,EAA+B,MAAA,KAAW,GAAA,EAAK,MAAM,KAAA;AAAA,IAC5D;AAAA,EACF;AACA,EAAA,MAAM,OAAO,CAAA,GAAA,EAAM,KAAA,CAAM,eAAe,UAAA,CAAW,GAAA,EAAK,EAAE,CAAC,CAAA,CAAA;AAG3D,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,MAAA,CAAO,WAAW,IAAA,EAAK;AACjD,EAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CAAK,CAAAD,OAAAA,KAAUA,OAAAA,CAAO,SAAS,IAAI,CAAA;AAC5D,EAAA,MAAM,MAAA,GAAS,QAAA,IAAA,CAAa,MAAM,MAAA,CAAO,WAAW,MAAA,CAAO,EAAE,IAAA,EAAM,CAAA,cAAA,EAAc,UAAU,CAAA,CAAA,EAAI,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,MAAA;AAC9G,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAC/F,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,IAAA,EAAM,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,MAAA,CAAO,EAAA,EAAI,EAAE,IAAA,EAAM,CAAA;AAC5E,EAAA,MAAM,KAAA,GAAQ,EAAE,EAAA,EAAI,MAAA,CAAO,IAAI,GAAA,EAAK,YAAA,CAAa,MAAA,CAAO,GAAG,CAAA,EAAE;AAC7D,EAAA,MAAM,UAAU,SAAA,EAAW,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AACtD,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,UAAA,CAAW,SAAiB,IAAA,EAA+B;AACxE,EAAA,MAAM,IAAI,OAAA,CAAc,CAACb,QAAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAM,KAAA,GAAQe,MAAM,OAAA,EAAS,IAAA,EAAM,EAAE,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,CAAA;AAC1E,IAAA,KAAA,CAAM,IAAA,CAAK,SAAS,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,uDAAuD,CAAC,CAAC,CAAA;AACpG,IAAA,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,CAAA,IAAA,KAAQ,IAAA,KAAS,CAAA,GAAIf,QAAAA,EAAQ,GAAI,MAAA,CAAO,IAAI,KAAA,CAAM,sEAAsE,CAAC,CAAC,CAAA;AAAA,EAC/I,CAAC,CAAA;AACH;AAEA,eAAe,eAAA,CAAgB,SAAA,EAAmB,SAAA,EAAmB,MAAA,EAA4C;AAC/G,EAAA,MAAM,KAAA,GAAS,MAAM,QAAA,CAAwB,SAAS,CAAA;AACtD,EAAA,MAAM,SAAS,gBAAA,CAAiB,MAAM,MAAA,CAAO,QAAA,CAAS,0DAA0D,CAAC,CAAA;AACjH,EAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,EAAE,UAAegB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA,EAAG,YAAY,CAAA,IAAA,KAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AAC3H,EAAA,IAAI,QAAQ,KAAA,CAAM,UAAA;AAClB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,YAAA,GAAe,QAAQ,GAAA,CAAI,kBAAA,GAAqB,CAAC,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,GACjF,CAAMA,UAAKV,OAAAA,EAAQ,EAAG,gBAAgB,UAAU,CAAA,EAAQU,UAAKV,OAAAA,EAAQ,EAAG,kBAAA,EAAoB,UAAU,CAAC,CAAA;AAC3G,IAAA,MAAM,QAAA,GAAA,CAAY,MAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,GAAA,CAAI,CAAA,IAAA,KAAWW,QAAK,IAAI,CAAA,CAAE,KAAK,CAAA,KAAA,KAAS,KAAA,CAAM,QAAO,EAAG,MAAM,KAAK,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA;AACrI,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAA,CAAO,MAAM,+HAA+H,CAAA;AAC5I,MAAA,MAAM,UAAA,CAAW,OAAA,EAAS,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,IAC/C,CAAA,MAAO,MAAA,CAAO,KAAA,CAAM,oCAAoC,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,CAAA,SAAA,EAAY,KAAA,CAAM,cAAc,CAAA,CAAA;AAC7C,IAAA,MAAM,eAAA,GAAuBD,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,WAAA,EAAa,wBAAwB,CAAA;AAElF,IAAA,IAAI,WAAA,GAAc,MAAM,QAAA,CAAgC,eAAe,CAAA;AACvE,IAAA,IAAI,CAAC,aAAa,QAAA,EAAU;AAC1B,MAAA,IAAI;AACF,QAAA,MAAMP,QAAAA,CAAQ,OAAA,EAAS,CAAC,QAAA,EAAU,UAAU,oBAAA,EAAsB,eAAA,EAAiB,IAAI,CAAA,EAAG,EAAE,OAAA,EAAS,GAAA,EAAQ,SAAA,EAAW,OAAQ,CAAA;AAAA,MAClI,CAAA,CAAA,MAAQ;AAAE,QAAA,MAAM,IAAI,MAAM,+GAA+G,CAAA;AAAA,MAAG;AAC5I,MAAA,WAAA,GAAc,MAAM,SAAgC,eAAe,CAAA;AAAA,IACrE;AACA,IAAA,IAAI,CAAC,WAAA,EAAa,QAAA,IAAY,CAAC,kBAAA,CAAmB,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,6DAA6D,CAAA;AAC3J,IAAA,MAASQ,EAAA,CAAA,KAAA,CAAM,iBAAiB,GAAK,CAAA;AACrC,IAAA,KAAA,GAAQ,EAAE,EAAA,EAAI,WAAA,CAAY,QAAA,EAAU,eAAA,EAAgB;AACpD,IAAA,MAAM,UAAU,SAAA,EAAW,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI;AAAE,IAAA,MAAMR,QAAAA,CAAQ,OAAA,EAAS,CAAC,QAAA,EAAU,SAAS,KAAA,EAAO,KAAA,CAAM,EAAA,EAAI,MAAM,GAAG,EAAE,OAAA,EAAS,GAAA,EAAQ,SAAA,EAAW,OAAQ,CAAA;AAAA,EAAG,CAAA,CAAA,MAC9G;AAAE,IAAA,MAAM,IAAI,MAAM,kJAAkJ,CAAA;AAAA,EAAG;AAC7K,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,GAAA,EAAK,CAAA,MAAA,EAAS,MAAM,CAAA,IAAA,CAAA,EAAQ,kBAAA,EAAoB,KAAA,CAAM,EAAA,EAAI,yBAAA,EAA2B,KAAA,CAAM,eAAA,EAAgB;AAC1I;AAIA,eAAsB,cAAc,OAAA,EAGC;AACnC,EAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,MAAA,EAAO,GAAI,OAAA;AACxC,EAAA,MAASQ,EAAA,CAAA,KAAA,CAAWD,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,GAAA,EAAO,CAAA;AAClF,EAAA,MAAM,OAAO,MAAM,kBAAA,CAAwBA,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,uBAAuB,CAAC,CAAA;AACnF,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,qBAAA,EAAsB;AACvD,IAAA,MAAM,SAAA,GAAiBA,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,yBAAyB,CAAA;AAChE,IAAA,IAAI,CAAC,MAAM,QAAA,CAAS,SAAS,CAAA,EAAG,MAAM,SAAA,CAAU,SAAA,EAAW,EAAE,cAAA,EAAgBJ,UAAAA,EAAW,EAA2B,CAAA;AACnH,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,WAAA;AACH,QAAA,MAAA,CAAO,MAAM,2PAA2P,CAAA;AACxQ,QAAA,OAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,cAAa,EAAE;AAAA,MACzC,KAAK,WAAA;AAAa,QAAA,OAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,cAAa,EAAE;AAAA,MACzD,KAAK,KAAA,EAAO;AACV,QAAA,MAAA,CAAO,MAAM,0IAA0I,CAAA;AACvJ,QAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,QAAA,CAAS,iCAAiC,GAAG,IAAA,EAAK;AAC7E,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,GAAA,IAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,2CAA2C,CAAA;AACtH,QAAA,OAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,IAAU,IAAA,EAAK;AAAA,MACzC;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,MAAA,CAAO,KAAA,CAAM,CAAA,8CAAA,EAAiD,MAAA,CAAO,aAAA,IAAiB,IAAI,CAAA,0DAAA,CAA4D,CAAA;AACtJ,QAAA,OAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,YAAA,CAAa,MAAM,MAAA,CAAO,QAAA,CAAS,qBAAqB,CAAC,GAAE,EAAE;AAAA,MACtG;AAAA,MACA,KAAK,YAAA;AAAc,QAAA,OAAO,EAAE,KAAA,EAAO,MAAM,gBAAgB,SAAA,EAAW,SAAA,EAAW,MAAM,CAAA,EAAE;AAAA,MACvF,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,GAAA,GAAM,wDAAA;AACZ,QAAA,MAAA,CAAO,KAAA,CAAM;AAAA;AAAA,EAAyD,GAAG;AAAA,iEAAA,CAAqE,CAAA;AAC9I,QAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AACf,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,MAAA,CAAO,4BAA4B,CAAA;AAC9D,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,gCAAgC,CAAA;AACvG,QAAA,MAAA,CAAO,MAAM,0HAA0H,CAAA;AACvI,QAAA,MAAM,OAAO,gBAAA,CAAiB,MAAM,MAAA,CAAO,QAAA,CAAS,gBAAgB,CAAC,CAAA;AACrE,QAAA,MAAM,YAAiBI,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA,MAAA,EAASJ,UAAAA,EAAY,CAAA,KAAA,CAAO,CAAA;AAChF,QAAA,MAAM,SAAA,CAAU,SAAA,EAAW,EAAE,KAAA,EAAO,CAAA;AACpC,QAAA,OAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,CAAA,MAAA,EAAS,IAAI,CAAA,IAAA,CAAA,EAAQ,cAAA,EAAgB,SAAA,EAAU,EAAE;AAAA,MACzF;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,kBAAuBI,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA,OAAA,EAAUJ,UAAAA,EAAY,CAAA,KAAA,CAAO,CAAA;AACvF,QAAA,MAAM,QAAA,GAAW,OAAO,KAAA,CAAM,qBAAA,IAAyB,MAAM,QAAA,CAA4B,MAAA,CAAO,MAAM,qBAAqB,CAAA;AAC3H,QAAA,IAAI,QAAA,EAAU,MAAM,SAAA,CAAU,eAAA,EAAiB,QAAQ,CAAA;AACvD,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,eAAA,EAAiB,MAAM,CAAA;AACzD,UAAA,MAAM,UAAU,MAAM,QAAA,CAA0CI,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,uBAAuB,CAAC,CAAA;AACxG,UAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,MAAA,EAAQ,WAAW,OAAA,EAAS,aAAA,IAAiB,MAAA,CAAO,aAAA,IAAiB,IAAI,CAAA;AAClH,UAAA,OAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,cAAA,EAAgB,MAAA,CAAO,EAAA,EAAI,qBAAA,EAAuB,iBAAgB,EAAE;AAAA,QACzH,SAAS,KAAA,EAAO;AAAE,UAAA,MAASC,EAAA,CAAA,EAAA,CAAG,eAAA,EAAiB,EAAE,KAAA,EAAO,MAAM,CAAA;AAAG,UAAA,MAAM,KAAA;AAAA,QAAO;AAAA,MAChF;AAAA;AAEF,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,EACpD,CAAA,SAAE;AAAU,IAAA,MAAM,MAAM,KAAA,EAAM;AAAA,EAAG;AACnC;AC5JO,SAAS,aAAa,KAAA,EAAqB;AAChD,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAK,CAAA;AACzB,EAAA,IAAI,GAAA,CAAI,QAAA,KAAa,QAAA,IAAY,GAAA,CAAI,QAAA,IAAY,IAAI,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,6BAA6B,CAAA;AAC5G,EAAA,MAAM,CAAC,OAAA,EAAS,IAAI,CAAA,GAAI,OAAA,CAAQ,QAAA,KAAa,QAAA,GAAW,CAAC,MAAA,EAAQ,CAAC,GAAA,CAAI,IAAI,CAAC,CAAA,GACvE,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,CAAC,cAAA,EAAgB,CAAC,6BAAA,EAA+B,GAAA,CAAI,IAAI,CAAC,CAAA,GACzF,CAAC,UAAA,EAAY,CAAC,GAAA,CAAI,IAAI,CAAC,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQF,KAAAA,CAAM,OAAA,EAAS,CAAC,GAAG,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,CAAA;AAC9E,EAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM;AAAA,EAAC,CAAC,CAAA;AAC1B,EAAA,KAAA,CAAM,KAAA,EAAM;AACd;AAEA,SAAS,QAAA,CAAS,MAAc,MAAA,EAAkC;AAChE,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,OAAO,MAAM,IAAI,MAAM,+EAA+E,CAAA;AACzH,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AAGzB,EAAA,MAAM,MAAA,GAAS,SAAS,IAAI,QAAA,CAAS,EAAE,KAAA,CAAM,MAAA,EAAQ,WAAW,IAAA,EAAM;AAAE,IAAA,IAAA,EAAK;AAAA,EAAG,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,MAAA;AAC/F,EAAA,MAAM,KAAA,GAAQG,kBAAgB,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAA;AAC9E,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAClB,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,KAAA,CAAM,IAAA,CAAK,UAAU,MAAM;AAAE,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IAAG,CAAC,CAAA;AAC7C,IAAA,KAAA,CAAM,IAAA,CAAK,SAAS,MAAM;AAAE,MAAA,IAAI,CAAC,QAAA,EAAU,MAAA,CAAO,IAAI,KAAA,CAAM,6BAA6B,CAAC,CAAA;AAAA,IAAG,CAAC,CAAA;AAC9F,IAAA,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,KAAA,KAAS;AAC1B,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,KAAA,CAAM,KAAA,EAAM;AACZ,MAAA,IAAI,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AACrC,MAAAA,QAAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,IACtB,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEO,IAAM,mBAAA,GAAmC;AAAA,EAC9C,QAAA,EAAU,CAAA,IAAA,KAAQ,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AAAA,EAAG,MAAA,EAAQ,CAAA,IAAA,KAAQ,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AAAA,EAC5E,OAAO,CAAA,IAAA,KAAQ;AAAE,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,IAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,IAAA,EAAM;AAC/D,CAAA;ACjCO,IAAM,oBAAN,MAAwB;AAAA,EAG7B,WAAA,CAA6B,QAAA,EAAmC,MAAA,EAAgD,GAAA,GAAM,KAAK,GAAA,EAAK;AAAnG,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAmC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAgD,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAiB;AAAA,EAApG,QAAA;AAAA,EAAmC,MAAA;AAAA,EAAgD,GAAA;AAAA,EAFxG,KAAA;AAAA,EACA,OAAA;AAAA,EAER,GAAA,CAAI,QAAQ,KAAA,EAA6B;AACvC,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA,CAAK,OAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,IAAK,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA,CAAA;AACrG,IAAA,IAAI,CAAC,KAAA,IAAS,IAAA,CAAK,KAAA,IAAS,UAAW,IAAA,CAAK,GAAA,EAAI,GAAI,CAAA,GAAI,GAAA,EAAQ,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,KAAK,CAAA;AACjG,IAAA,MAAM,WAAW,YAAY;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,EAAO;AACjC,MAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC9D,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AACrC,MAAA,IAAI,GAAA,CAAI,aAAa,MAAA,IAAU,GAAA,CAAI,YAAY,GAAA,CAAI,QAAA,IAAY,IAAI,IAAA,EAAM;AACvE,QAAA,MAAM,IAAI,uBAAA,CAAwB,wBAAA,EAA0B,4CAA4C,CAAA;AAAA,MAC1G;AACA,MAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,KAAA,CAAM,UAAU,CAAA,IAAK,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA;AAC3E,MAAA,IAAI,CAAC,KAAA,CAAM,KAAA,IAAS,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,6DAA6D,CAAA;AAC/H,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,GAAG;AACH,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,KAAK,OAAA,CAAQ,QAAQ,MAAM;AAAE,MAAA,IAAI,IAAA,CAAK,OAAA,KAAY,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,IAAW,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACtG,IAAA,OAAO,OAAA;AAAA,EACT;AACF,CAAA;AAMA,eAAe,SAAA,CAAU,OAAA,EAAuB,IAAA,EAAc,MAAA,EAAoC;AAChG,EAAA,IAAI,CAAC,OAAA,CAAQ,qBAAA,IAAyB,CAAC,OAAA,CAAQ,cAAA,IAAkB,CAAC,OAAA,CAAQ,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,6DAA6D,CAAA;AAC5J,EAAA,MAAM,kBAAkB,OAAA,CAAQ,qBAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,IAAI,iBAAA,CAAkB,OAAA,CAAQ,gBAAgB,MAAM,mBAAA,CAAoB,eAAe,CAAC,CAAA;AACtG,EAAA,IAAI,QAAA,GAAW,CAAA,EAAG,YAAA,GAAe,CAAA,EAAG,UAAA,GAAa,KAAA;AACjD,EAAA,OAAO,CAAC,OAAO,OAAA,EAAS;AACtB,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AACxC,MAAA,UAAA,GAAa,KAAA;AACb,MAAA,MAAA,CAAO,cAAA,EAAe;AACtB,MAAA,OAAA,GAAU,IAAI,YAAA,CAAa,EAAE,UAAA,EAAY,MAAM,WAAA,EAAa,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,cAAA,EAAgB,KAAA,CAAM,YAAY,CAAA;AACnI,MAAA,MAAM,MAAA,GAAS,OAAA;AACf,MAAA,IAAI,MAAA,GAAS,KAAA;AACb,MAAA,IAAI,eAAA;AACJ,MAAA,IAAI,MAAA;AACJ,MAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAc,CAAAA,QAAAA,KAAW;AAAE,QAAA,MAAA,GAASA,QAAAA;AAAA,MAAS,CAAC,CAAA;AAChE,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,MAAM,MAAM,MAAM;AAAE,QAAA,UAAA,GAAa,IAAA;AAAM,QAAA,MAAA,EAAO;AAAA,MAAG,CAAA;AACjD,MAAA,MAAA,CAAO,EAAA,CAAG,QAAQ,MAAM;AACtB,QAAA,MAAA,GAAS,IAAA;AAAM,QAAA,QAAA,GAAW,CAAA;AAAG,QAAA,YAAA,GAAe,CAAA;AAC5C,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,aAAA,EAAe,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,CAAA,GAAI,IAAI,CAAA;AAAA,MACxF,CAAC,CAAA;AACD,MAAA,MAAA,CAAO,EAAA,CAAG,cAAc,GAAG,CAAA;AAC3B,MAAA,MAAA,CAAO,EAAA,CAAG,eAAe,MAAM;AAAE,QAAA,eAAA,GAAkB,IAAI,sBAAA,EAAuB;AAAG,QAAA,GAAA,EAAI;AAAA,MAAG,CAAC,CAAA;AAEzF,MAAA,MAAA,CAAO,EAAA,CAAG,SAAS,CAAA,KAAA,KAAS;AAAE,QAAA,eAAA,GAAkB,KAAA;AAAO,QAAA,GAAA,EAAI;AAAA,MAAG,CAAC,CAAA;AAC/D,MAAA,MAAM,QAAQ,MAAM;AAAE,QAAA,MAAA,CAAO,KAAA,EAAM;AAAG,QAAA,GAAA,EAAI;AAAA,MAAG,CAAA;AAC7C,MAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AACtD,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,OAAA,EAAQ;AACf,QAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,QAAA,OAAO,CAAC,UAAA,IAAc,CAAC,MAAA,CAAO,OAAA,EAAS;AACrC,UAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,UAAA,IAAI;AAAE,YAAA,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,EAAOC,aAAM,MAAA,GAAS,GAAA,GAAS,GAAA,EAAM,KAAA,CAAA,EAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAC,CAAA;AAAA,UAAG,CAAA,SACtG;AAAU,YAAA,IAAA,CAAK,KAAA,EAAM;AAAA,UAAG;AACxB,UAAA,IAAI,CAAC,MAAA,IAAU,IAAA,CAAK,GAAA,EAAI,GAAI,UAAU,GAAA,EAAQ;AAC9C,UAAA,IAAI,MAAA,IAAU,CAAC,UAAA,EAAY;AAGzB,YAAA,MAAM,KAAA,CAAM,GAAA,EAAI,CAAE,KAAA,CAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UAClC;AAAA,QACF;AACA,QAAA,IAAI,iBAAiB,MAAM,eAAA;AAAA,MAC7B,CAAA,SAAE;AAAU,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,KAAK,CAAA;AAAA,MAAG;AAAA,IAC1D,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,OAAO,OAAA,EAAS;AACpB,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA;AAC/C,MAAA,IAAI,QAAQ,IAAA,KAAS,kBAAA,IAAsB,WAAW,EAAE,YAAA,KAAiB,GAAG,UAAA,GAAa,IAAA;AAAA,WAAA,IAChF,mBAAA,CAAoB,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAM,OAAA;AAAA,IACpD,CAAA,SAAE;AAAU,MAAA,OAAA,EAAS,KAAA,EAAM;AAAA,IAAG;AAC9B,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,QAAeA,YAAAA,CAAM,IAAA,CAAK,IAAI,GAAA,EAAQ,GAAA,GAAO,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,EAAU,CAAC,GAAG,MAAA,EAAW,EAAE,QAAQ,CAAA;AAAA,EAC/G;AACF;AAEA,eAAe,QAAA,CAAS,OAAA,EAAuB,IAAA,EAAc,MAAA,EAAoC;AAC/F,EAAA,IAAI,CAAC,QAAQ,cAAA,IAAkB,CAAC,QAAQ,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,2DAA2D,CAAA;AACxH,EAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAA4B,OAAA,CAAQ,cAAc,CAAA;AAC5E,EAAA,IAAI,CAAC,WAAA,EAAa,KAAA,EAAO,MAAM,IAAI,uBAAuB,OAAO,CAAA;AACjE,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAO,cAAc,CAAA;AACzC,EAAA,MAAM,SAAS,IAAI,GAAA,CAAI,aAAa,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAE,QAAA;AAGlD,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,CAAQ;AAAA,IAAE,IAAA,EAAM,oBAAoB,IAAI,CAAA,CAAA;AAAA,IAAI,WAAW,WAAA,CAAY,KAAA;AAAA,IAAO,MAAA;AAAA,IACrG,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,IAAG,gBAAgB,MAAM;AAAA,IAAC;AAAA,GAAG,CAAA;AAChD,EAAA,IAAI;AACF,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAA,EAAI,IAAK,EAAE,CAAA,KAAM,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA,EAAG,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAC3H,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,aAAA,EAAe,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,CAAA,GAAI,IAAI,CAAA;AACtF,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,QAAe,IAAI,OAAA,CAAc,CAAAD,QAAAA,KAAW,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAMA,QAAAA,EAAQ,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,EAC3H,CAAA,SAAE;AAAU,IAAA,MAAM,SAAS,KAAA,EAAM;AAAG,IAAA,MAAM,MAAM,UAAA,EAAW;AAAA,EAAG;AAChE;AAIA,eAAsB,gBAAgB,IAAA,EAA6B;AACjE,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAA4B,IAAI,CAAA;AACrD,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,SAAA,CAAU,OAAO,IAAI,CAAA,IAAK,MAAA,CAAO,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA,GAAO,OAAO,MAAM,IAAI,MAAM,8BAA8B,CAAA;AACvI,EAAA,MAAM,QAAQ,IAAI,eAAA,IAAmB,IAAA,GAAO,MAAM,MAAM,KAAA,EAAM;AAC9D,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,IAAI,CAAA;AAAG,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AACtD,EAAA,IAAI;AACF,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU,MAAM,SAAA,CAAU,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAAA,SAAA,IACtF,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS,MAAM,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAAA,SAC7F,MAAM,IAAI,KAAA,CAAM,4BAA4B,CAAA;AAAA,EACnD,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS;AACzB,MAAA,MAAM,OAAA,GAAU,gBAAgB,KAAA,EAAO,MAAA,CAAO,QAAQ,IAAA,KAAS,QAAA,GAAW,WAAW,OAAO,CAAA;AAC5F,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,aAAA,EAAe,OAAA,EAAS,OAAA,CAAQ,SAAS,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,IAAI,CAAA;AAClH,MAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,SAAE;AAAU,IAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,IAAI,CAAA;AAAG,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,IAAI,CAAA;AAAA,EAAG;AACzE;;;AC9GA,IAAM,IAAA,GAAO,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAsDb,SAAS,SAAS,IAAA,EAAsB;AAAE,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AAAG;AAE5F,eAAsB,KAAK,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAkB;AACtE,EAAA,MAAM,EAAE,QAAQ,WAAA,EAAY,GAAI,UAAU,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAM,OAAA,EAAS;AAAA,IACjF,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,GAAA,EAAI;AAAA,IAAG,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IAAG,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IAAG,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACrH,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAAG,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAAG,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACvF,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAAG,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAAG,uBAAA,EAAyB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACtG,kBAAA,EAAoB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAAG,yBAAA,EAA2B,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAAG,kBAAA,EAAoB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAC5H,cAAA,EAAgB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACjC,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAClC,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAAG,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAAG,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAAG,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACzH,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAAG,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IAAG,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IAAG,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IACvH,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA;AAAK,KAClD,CAAA;AACH,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,CAAA,IAAK,MAAA;AAClC,EAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAQ;AAAE,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AAAG,IAAA;AAAA,EAAQ;AAC7E,EAAA,IAAI,MAAA,CAAO,EAAA,IAAM,CAAC,CAAC,QAAQ,UAAA,EAAY,SAAS,CAAA,CAAE,QAAA,CAAS,OAAO,EAAE,CAAA,EAAG,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAC/H,EAAA,IAAI,MAAA,CAAO,WAAW,MAAA,CAAO,YAAY,GAAG,MAAM,IAAI,MAAM,0CAA0C,CAAA;AACtG,EAAA,MAAM,YAAiBmB,IAAA,CAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAA,IAAK,uBAAuB,CAAA;AAC7E,EAAA,MAAM,gBAAA,GAAmB,EAAE,GAAA,EAAK,MAAA,CAAO,eAAe,CAAA,EAAE;AACxD,EAAA,MAAM,OAAO,CAAC,KAAA,EAAe,IAAA,GAAe,IAAI,IAAA,KAAkB;AAChE,IAAA,IAAI,MAAA,CAAO,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,GAAG,IAAA,EAAM,IAAI,IAAI,CAAA;AAAA,SAAA,IACtE,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,EACjD,CAAA;AACA,EAAA,IAAI,YAAY,QAAA,EAAU;AAAE,IAAA,MAAM,kBAAkB,SAAS,CAAA;AAAG,IAAA;AAAA,EAAQ;AACxE,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,cAAc,GAAG,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAC3E,IAAA,MAAM,eAAA,CAAqBA,IAAA,CAAA,OAAA,CAAQ,MAAA,CAAO,cAAc,CAAC,CAAC,CAAA;AAAG,IAAA;AAAA,EAC/D;AACA,EAAA,IAAI,YAAY,QAAA,EAAU;AAAE,IAAA,MAAM,aAAA,CAAc,SAAA,EAAW,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAAG,IAAA;AAAA,EAAQ;AACpG,EAAA,IAAI,YAAY,SAAA,EAAW;AACzB,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAC,CAAA,IAAK,QAAA;AACjC,IAAA,IAAI,CAAC,CAAC,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,iDAAiD,CAAA;AACxH,IAAA,MAAM,KAAA,GAAQ,MAAA,KAAW,QAAA,GAAW,MAAM,cAAc,SAAS,CAAA,GAC7D,MAAM,gBAAA,CAAiB,WAAW,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,EAAG,WAAW,QAAQ,CAAA;AACzF,IAAA,IAAA,CAAK,SAAA,EAAW,KAAA,EAAO,KAAA,CAAM,OAAA,GAAU,mFACnC,kEAAkE,CAAA;AACtE,IAAA;AAAA,EACF;AACA,EAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAC,CAAA,IAAK,QAAA;AACjC,IAAA,IAAI,CAAC,CAAC,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,mDAAmD,CAAA;AAC1H,IAAA,MAAMZ,OAAAA,GAAS,WAAW,QAAA,GAAW,MAAM,eAAe,SAAS,CAAA,GAC/D,MAAM,cAAA,CAAe,SAAA,EAAW,cAAc,MAAA,CAAA,IAAA,CAAY,GAAG,GAAG,EAAC,EAAG,QAAW,EAAE,aAAA,EAAe,OAAO,CAAA;AAC3G,IAAA,MAAM,MAAA,GAAS,MAAA,KAAW,QAAA,GACtB,MAAM,sBAAA,CAAuB,EAAE,SAAA,EAAW,QAAA,EAAUA,OAAAA,EAAQ,MAAA,EAAQ,mBAAA,EAAqB,GAAG,gBAAA,EAAkB,CAAA,GAC9G,MAAA,KAAW,SAAA,GAAY,MAAMA,OAAAA,CAAO,QAAA,CAAS,kBAAA,CAAmB,KAAK,CAAA,GAAI,MAAMA,OAAAA,CAAO,QAAA,CAAS,SAAA,EAAU;AAC7G,IAAA,IAAA,CAAK,WAAA,EAAa,MAAA,EAAQ,oBAAA,CAAqB,MAAM,CAAC,CAAA;AACtD,IAAA,IAAI,WAAW,QAAA,EAAU,IAAA,CAAK,gBAAA,EAAkB,IAAI,yGAAyG,CAAA;AAC7J,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,WAAW,OAAA,EAAS,WAAA,EAAa,YAAY,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,EAAG;AACrE,IAAA,IAAI,eAAA,GAAkB,OAAA,KAAY,WAAA,GAAc,WAAA,GAAuB,OAAA,KAAY,YAAY,gBAAA,CAAiB,WAAA,CAAY,CAAC,CAAC,CAAA,GAAI,MAAA;AAClI,IAAA,IAAI,kBAAA,GAAqB,OAAO,cAAA,GAAiB,KAAA;AACjD,IAAA,MAAM,QAAiC,EAAC;AACxC,IAAA,MAAM,WAAW,MAAM,QAAA,CAA8BY,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,sBAAsB,CAAC,CAAA;AAC5F,IAAA,IAAI,OAAO,SAAA,EAAW,KAAA,CAAM,SAAA,GAAiBA,IAAA,CAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AACrE,IAAA,IAAI,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,IAAA,GAAO,MAAA,CAAO,IAAA;AACrC,IAAA,IAAI,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,IAAA,GAAO,MAAA,CAAO,IAAA;AACrC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,CAAC,CAAC,MAAA,EAAQ,SAAS,CAAA,EAAG,CAAC,gBAAA,EAAkB,eAAe,CAAC,CAAA,EAAY;AAC/F,MAAA,IAAI,MAAA,CAAO,IAAI,CAAA,KAAM,MAAA,EAAW;AAC9B,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7B,QAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,KAAK,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA,CAAG,CAAA;AACpF,QAAA,KAAA,CAAM,KAAK,CAAA,GAAI,CAAA;AAAA,MACjB;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,YAAY,CAAA,IAAK,OAAA,CAAQ,IAAI,eAAA,EAAiB,KAAA,CAAM,SAAA,GAAiBA,IAAA,CAAA,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA,IAAK,OAAA,CAAQ,IAAI,eAAgB,CAAA;AAC5I,IAAA,IAAI,MAAA,CAAO,SAAS,KAAA,CAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,EAAE,CAAA;AACnE,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,uBAAuB,CAAA,IAAK,MAAA,CAAO,kBAAkB,CAAA,IAAK,MAAA,CAAO,yBAAyB,CAAA,EAAG;AAC7I,MAAA,MAAM,IAAA,GAAO,OAAO,KAAA,IAAS,QAAA;AAC7B,MAAA,IAAI,CAAC,CAAC,MAAA,EAAQ,QAAA,EAAU,cAAc,OAAA,EAAS,QAAQ,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAClJ,MAAA,MAAM,QAAA,GAAW,OAAO,kBAAkB,CAAA,KAAM,SAAY,MAAA,GAAY,MAAA,CAAO,MAAA,CAAO,kBAAkB,CAAC,CAAA;AACzG,MAAA,IAAI,QAAA,KAAa,MAAA,KAAc,CAAC,MAAA,CAAO,aAAA,CAAc,QAAQ,CAAA,IAAK,QAAA,IAAY,CAAA,CAAA,EAAI,MAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA;AAC7H,MAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,QAAE,IAAA;AAAA,QAAoC,GAAA,EAAK,OAAO,WAAW,CAAA;AAAA,QACzE,mBAAA,EAAqB,OAAO,uBAAuB,CAAA,GAASA,aAAQ,MAAA,CAAO,uBAAuB,CAAC,CAAA,GAAI,MAAA;AAAA,QACvG,cAAA,EAAgB,OAAO,kBAAkB,CAAA,GAASA,aAAQ,MAAA,CAAO,kBAAkB,CAAC,CAAA,GAAI,MAAA;AAAA,QACxF,qBAAA,EAAuB,OAAO,yBAAyB,CAAA,GAASA,aAAQ,MAAA,CAAO,yBAAyB,CAAC,CAAA,GAAI,MAAA;AAAA,QAC7G,cAAA,EAAgB;AAAA,OAAS;AAAA,IAC7B;AACA,IAAA,MAAM,cAAc,CAAC,MAAA,CAAO,QAAQ,CAAC,CAAC,QAAQ,KAAA,CAAM,KAAA;AACpD,IAAA,MAAM,aAAa,OAAA,KAAY,YAAA,IAAgB,OAAA,KAAY,SAAA,IAAa,CAAC,QAAA,IAAY,CAAC,KAAA,CAAM,KAAA,IAAS,eAChG,KAAA,CAAM,KAAA,EAAO,SAAS,QAAA,IAAY,CAAC,MAAM,KAAA,CAAM,qBAAA;AACpD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,QAAA,GAAW,OAAA,KAAY,YAAA,IAAgB,WAAA,CAAY,CAAC,IAAI,kBAAA,CAAmB,WAAA,CAAY,CAAC,CAAC,CAAA,GAAI,MAAA;AACnG,MAAA,IAAI,CAAC,WAAA,IAAe,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,WAAA;AAC3D,QAAA,MAAM,IAAI,MAAM,qHAAqH,CAAA;AACvI,MAAA,MAAM,QAAA,GAAW,aAAa,KAAA,CAAM,KAAA,EAAO,SAAS,QAAA,GAAW,QAAA,GAAW,MAAM,cAAA,CAAe,mBAAmB,CAAA,CAAA;AAClH,MAAA,kBAAA,GAAqB,QAAA,KAAa,WAAA;AAClC,MAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,MAAM,aAAA,CAAc;AAAA,QAAE,SAAA;AAAA,QAAW,QAAA;AAAA,QAAU,MAAA,EAAQ,mBAAA;AAAA,QACtE,MAAA,EAAQ,EAAE,GAAG,qBAAA,IAAyB,GAAG,QAAA,EAAU,GAAG,KAAA;AAAM,OAAG,CAAC,CAAA;AAClE,MAAA,IAAI,CAAC,QAAA,IAAY,iBAAA,CAAkB,MAAM,KAAA,IAAS,QAAA,CAAS,OAAO,KAAA,CAAM,IAAA,IAAQ,QAAA,CAAS,IAAI,MACrF,iBAAA,CAAkB,QAAA,CAAS,OAAO,QAAA,CAAS,IAAI,GAAG,cAAA,GAAiB,IAAA;AAAA,IAC7E;AAGA,IAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,SAAA,EAAW,cAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,EAAG,EAAC,EAAG,MAAA,EAAW,EAAE,aAAA,EAAe,OAAO,CAAA;AACvH,MAAA,MAAM,sBAAA,CAAuB,EAAE,SAAA,EAAW,QAAA,EAAU,SAAS,MAAA,EAAQ,mBAAA,EAAqB,GAAG,gBAAA,EAAkB,CAAA;AAAA,IACjH;AACA,IAAA,MAAM,QAAA,GAAW,CAAC,MAAA,CAAO,IAAA,IAAQ,QAAQ,MAAA,CAAO,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,MAAA,GAAS,IAAI,kBAAA,CAAmB,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA;AAChI,IAAA,IAAA,CAAK,UAAA,EAAY,EAAC,EAAG,QAAA,GAAW,SAAY,yBAAoB,CAAA;AAChE,IAAA,MAAMZ,OAAAA,GAAS,MAAM,cAAA,CAAe,SAAA,EAAW,cAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,KAAA,KAAS;AAC7F,MAAA,IAAI,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA,gBACzB,UAAA,EAAY,EAAE,OAAA,EAAS,KAAA,IAAS,KAAK,CAAA;AAAA,IACjD,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAA,EAAU,OAAO,CAAA;AAClC,IAAA,IAAI,kBAAA,IAAsB,CAAC,QAAA,EAAU,MAAM,sBAAA,CAAuB,EAAE,SAAA,EAAW,QAAA,EAAUA,OAAAA,EAAQ,MAAA,EAAQ,mBAAA,EAAqB,GAAG,kBAAkB,CAAA;AACnJ,IAAA,MAAM,IAAA,GAAO,MAAMA,OAAAA,CAAO,QAAA,CAAS,IAAA,EAAK;AACxC,IAAA,MAAM,cAAc,MAAM,QAAA,CAA8BY,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,sBAAsB,CAAC,CAAA;AAC/F,IAAA,MAAM,UAAA,GAAa,eAAe,WAAA,EAAa,KAAA,IAAS,EAAE,IAAA,EAAM,YAAA,EAAa,EAAG,WAAA,EAAa,IAAI,CAAA;AACjG,IAAA,IAAA,CAAK,OAAA,EAAS,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,QAAQ,IAAA,CAAK,MAAA,EAAQ,UAAA,EAAW,EAAG,wCAAwC,CAAA;AACxH,IAAA,IAAA,CAAK,YAAA,EAAc,UAAA,EAAY,qBAAA,CAAsB,UAAU,CAAC,CAAA;AAChE,IAAA,IAAI,YAAY,OAAA,EAAS;AACzB,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,CAAK,WAAS,KAAA,CAAM,IAAA,KAAS,WAAW,CAAA,EAAG;AACzD,MAAA,IAAA,CAAK,mBAAA,EAAqB,EAAC,EAAG,+HAA+H,CAAA;AAAA,IAC/J;AACA,IAAA,MAAM,OAAA,GAAU,MAAMZ,OAAAA,CAAO,QAAA,CAAS,OAAA,EAAQ;AAC9C,IAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,CAAC,OAAO,OAAO,CAAA;AACtD,IAAA,IAAI,cAAA,IAAkB,CAAC,KAAA,CAAM,IAAA,CAAK,YAAU,MAAA,CAAO,eAAe,GAAG,eAAA,GAAkB,MAAA;AACvF,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAA,EAAS,IAAA,CAAK,WAAA,EAAa,KAAK,SAAA,EAAW,oBAAA,CAAqB,IAAA,CAAK,SAAS,CAAC,CAAA;AACnG,IAAA,IAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,iBAAiB,EAAE,OAAA,EAAS,OAAM,EAAG;AAAA;AAAA,EAAuC,aAAA,CAAc,KAAK,CAAC,CAAA,CAAE,CAAA;AACzH,IAAA,MAAMa,SAAAA,GAAW,CAAC,MAAA,CAAO,IAAA,IAAQ,QAAQ,KAAA,CAAM,KAAA,GAAQ,OAAO,MAAA,KAAoC;AAChG,MAAA,MAAM,KAAA,GAAQF,gBAAgB,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAC9E,MAAA,IAAI;AAAE,QAAA,OAAO,MAAM,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAAA,MAAG,CAAA,SAAE;AAAU,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MAAG;AAAA,IACxE,CAAA,GAAI,MAAA;AACJ,IAAA,MAAM,MAAA,GAAS,MAAM,sBAAA,CAAuB,EAAE,SAAA,EAAW,eAAA,EAAiB,OAAA,EAAS,UAAA,EAAY,UAAA,CAAW,OAAA,KAAY,YAAA,EAAc,CAAA;AACpI,IAAA,MAAM,iBAAA,GAAoB,MAAM,aAAA,CAAc,SAAS,CAAA;AACvD,IAAA,MAAM,aAAA,GAAgB,MAAM,mBAAA,CAAoB;AAAA,MAAE,KAAA,EAAO,iBAAA;AAAA,MACvD,SAAS,MAAA,CAAO,OAAA;AAAA,MAAS,SAAA,EAAW,OAAO,YAAY,CAAA;AAAA,MACvD,UAAU,MAAA,KAAW,MAAA,IAAU,KAAA,CAAM,MAAA,KAAW,IAAIE,SAAAA,GAAW;AAAA,KAAW,CAAA;AAC5E,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAiB,SAAA,EAAW,cAAc,MAAA,CAAA,IAAA,CAAY,GAAG,GAAG,aAAa,CAAA;AAC/F,QAAA,IAAA,CAAK,SAAA,EAAW,OAAA,EAAS,OAAA,CAAQ,OAAA,GAC7B,8FACA,6GAA6G,CAAA;AAAA,MACnH,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,CAAK,qBAAA,EAAuB,EAAC,EAAG,6HAA6H,CAAA;AAAA,MAC/J;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,EAAW,iBAAA,EAAmB,iBAAA,CAAkB,OAAA,GACjD,sEACA,mEAAmE,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,CAAA,MAAA,KAAU,OAAO,SAAS,CAAA;AACzD,MAAA,IAAI,SAAA,CAAU,MAAA,EAAQ,IAAA,CAAK,WAAA,EAAa,EAAE,YAAY,IAAA,CAAK,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,EAAG;AAAA;AAAA,EAAiB,aAAA,CAAc,SAAS,CAAC;AAAA,6CAAA,CAAiD,CAAA;AAAA,gBAC7K,mBAAA,EAAqB,EAAE,YAAY,IAAA,CAAK,UAAA,IAAc,8FAA8F,CAAA;AAC9J,MAAA,IAAA,CAAK,cAAA,EAAgB,EAAC,EAAG,yFAAyF,CAAA;AAClH,MAAA;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,MAAMb,OAAAA,CAAO,QAAA,CAAS,MAAA,CAAA,CAAQ,MAAMA,OAAAA,CAAO,QAAA,CAAS,IAAA,EAAK,EAAG,MAAM,CAAA;AACrF,IAAA,MAAM,GAAA,GAAM,mBAAmB,UAAU,CAAA;AACzC,IAAA,IAAA,CAAK,YAAA,EAAc,EAAE,UAAA,EAAY,GAAA,EAAK,CAAA;AACtC,IAAA,MAAM,UAAU,MAAA,CAAO,IAAA,GAAO,MAAA,GAAY,MAAM,sBAAsB,UAAA,EAAY;AAAA,MAChF,MAAM,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA,GAAU,OAAO,EAAA,IAAM;AAAA,KAChD,CAAA;AACD,IAAA,IAAI;AACF,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,OAAO,KAAK,GAAA,EAAI,GAAI,KAAK,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AACpD,QAAA,MAAM,UAAU,MAAMA,OAAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,WAAW,SAAS,CAAA;AAClE,QAAA,IAAI,QAAQ,MAAA,KAAW,SAAA,IAAa,eAAA,KAAoB,MAAA,IAAU,oBAAoB,WAAA,EAAa;AACjG,UAAA,MAAM,SAAA,GAAA,CAAa,MAAMA,OAAAA,CAAO,QAAA,CAAS,OAAA,EAAQ,EAAG,MAAA,CAAO,CAAA,MAAA,KAAU,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,SAAS,CAAA;AACxG,UAAA,IAAI,SAAA,CAAU,MAAA,KAAA,CAAY,IAAA,CAAK,cAAA,IAAkB,CAAA,IAAK,CAAA,IAAA,CAAM,MAAMA,OAAAA,CAAO,QAAA,CAAS,kBAAA,CAAmB,UAAA,CAAW,SAAS,GAAG,SAAA,CAAA,EAAY;AACtI,YAAA,OAAA,EAAS,KAAA,EAAM;AACf,YAAA,IAAA,CAAK,aAAa,EAAE,UAAA,EAAY,KAAK,UAAA,EAAY,OAAA,EAAS,WAAU,EAAG,CAAA;AAAA,EAAe,aAAA,CAAc,SAAS,CAAC;AAAA,6CAAA,CAAiD,CAAA;AAC/J,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,OAAA,CAAQ,WAAW,UAAA,EAAY;AACjC,UAAA,OAAA,EAAS,KAAA,EAAM;AACf,UAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,YAAA,IAAA,CAAK,QAAA,EAAU,EAAE,UAAA,EAAY,IAAA,CAAK,YAAY,SAAA,EAAW,IAAA,IAAQ,iFAAiF,CAAA;AAClJ,YAAA;AAAA,UACF;AACA,UAAA,IAAI,CAAC,UAAA,EAAY;AACf,YAAA,UAAA,GAAa,IAAA;AACb,YAAA,IAAA,CAAK,YAAA,EAAc,EAAC,EAAG,sFAAiF,CAAA;AAAA,UAC1G;AACA,UAAA,MAAMN,aAAM,GAAG,CAAA;AACf,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAA,CAAQ,WAAW,UAAA,EAAY;AAAE,UAAA,OAAA,EAAS,KAAA,EAAM;AAAG,UAAA,IAAA,CAAK,UAAA,EAAY,EAAC,EAAG,mBAAmB,CAAA;AAAG,UAAA;AAAA,QAAQ;AAC1G,QAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,YAAA,KAAiB,OAAA,CAAQ,QAAQ,EAAA,EAAI;AAC1D,UAAA,OAAA,EAAS,KAAA,EAAM;AACf,UAAA,YAAA,GAAe,QAAQ,OAAA,CAAQ,EAAA;AAC/B,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,EAAI,QAAQ,CAAA;AAC/E,UAAA,MAAM,WAAA,GAAc,SAAA,GAAYoB,UAAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnG,UAAA,MAAM,QAAA,GAAWA,WAAW,QAAQ,CAAA,CAAE,OAAO,GAAG,CAAA,CAAE,OAAO,WAAW,CAAA;AACpE,UAAA,MAAM,YAAA,GAAA,CAAgB,IAAA,CAAK,cAAA,IAAkB,CAAA,KAAM,CAAA,GAAA,CAAK,MAAMd,OAAAA,CAAO,QAAA,CAAS,OAAA,EAAQ,EAAG,MAAA,CAAO,CAAA,MAAA,KAC9F,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,EAAA,KAAO,QAAA,IAAY,MAAA,CAAO,SAAS,OAAA,CAAQ,OAAA,CAAS,IAAI,CAAA,GAAI,EAAC;AACzF,UAAA,IAAA;AAAA,YAAK,mBAAA;AAAA,YAAqB,EAAE,WAAW,UAAA,CAAW,SAAA,EAAW,SAAS,OAAA,CAAQ,OAAA,EAAS,aAAa,YAAA,EAAa;AAAA,YAC/G;AAAA,EAAK,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,YAAA,EAAmC,WAAW;AAAA,oDAAA;AAAA,WAAwD;AAC3I,UAAA,IAAI,CAACa,SAAAA,EAAU;AACb,YAAA,MAAME,WAAU,eAAA,CAAgB,UAAA,CAAW,SAAA,EAAW,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACxE,YAAA,IAAA,CAAK,kBAAA,EAAoB,EAAE,OAAA,EAAAA,QAAAA,EAAQ,EAAG,CAAA;AAAA,EAAkCA,QAAO,CAAA,CAAE,CAAA;AAAA,UACnF,CAAA,MAAO;AACL,YAAA,MAAM,WAAW,MAAM,qBAAA,CAAsB,EAAE,YAAA,EAAc,QAAA,EAAAF,WAAU,CAAA;AACvE,YAAA,MAAMb,QAAO,QAAA,CAAS,MAAA;AAAA,cAAO,UAAA,CAAW,SAAA;AAAA,cAAW,QAAQ,OAAA,CAAQ,EAAA;AAAA,cAAI,QAAA,CAAS,OAAA;AAAA,cAC9E,SAAS,gBAAA,GAAmB,EAAE,kBAAkB,QAAA,CAAS,gBAAA,KAAqB;AAAC,aAAC;AAAA,UACpF;AAAA,QACF;AACA,QAAA,MAAMN,aAAM,GAAG,CAAA;AAAA,MACjB;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,UAAA,GACZ,sHAAA,GACA,sEAAsE,CAAA;AAAA,IAC5E,CAAA,SAAE;AAAU,MAAA,OAAA,EAAS,KAAA,EAAM;AAAA,IAAG;AAAA,EAChC;AACA,EAAA,IAAI,YAAY,MAAA,EAAQ;AAAE,IAAA,MAAM,YAAA,CAAa,SAAA,EAAW,MAAA,CAAO,KAAA,KAAU,IAAI,CAAA;AAAG,IAAA,IAAA,CAAK,SAAA,EAAW,EAAC,EAAG,mBAAmB,CAAA;AAAG,IAAA;AAAA,EAAQ;AAClI,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,SAAS,CAAA;AAC7C,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QAAC,MAAA,CAAO,SAAS,IAAA,EAAK;AAAA,QAAG,OAAO,MAAA,EAAO;AAAA,QAAG,MAAA,CAAO,QAAQ,YAAA,EAAa;AAAA,QACxJ,QAAA,CAA4FkB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,0BAA0B,CAAC,CAAA;AAAA,QAAG,cAAc,SAAS,CAAA;AAAA,QACjK,QAAA,CAA8BA,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,sBAAsB,CAAC,CAAA;AAAA,QAAG,QAAA,CAAwCA,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,iCAAiC,CAAC;AAAA,OAAE,CAAA;AACtK,MAAA,MAAM,UAAA,GAAa,KAAK,UAAA,KAAe,MAAA,IAAU,eAAe,MAAA,CAAO,KAAA,EAAO,OAAO,IAAI,CAAA,CAAA;AACzF,MAAA,MAAM,gBAAA,GAAmB,UAAU,EAAE,MAAA,EAAQ,OAAO,MAAA,EAAQ,OAAA,EAAS,OAAO,OAAA,EAAQ;AACpF,MAAA,IAAA;AAAA,QAAK,QAAA;AAAA,QAAU;AAAA,UAAE,GAAG,IAAA;AAAA,UAAM,UAAA;AAAA,UAAY,eAAe,MAAA,CAAO,OAAA;AAAA,UAAS,GAAG,IAAA;AAAA,UAAM,OAAA;AAAA,UAAS,gBAAA;AAAA,UACrF,YAAY,UAAA,EAAY,UAAA;AAAA,UAAY,YAAY,UAAA,EAAY,KAAA;AAAA,UAAO,gBAAgB,UAAA,EAAY;AAAA,SAAU;AAAA,QACzG,YAAY,MAAA,CAAO,OAAO,SAAM,IAAA,CAAK,IAAA,GAAO,SAAS,SAAS;AAAA,SAAA,EAAc,OAAA,CAAQ,OAAA,GAAU,IAAA,GAAO,KAAK;AAAA,EAAK,UAAA,GAAa,qBAAA,CAAsB,UAAU,CAAA,GAAI,IAAA,GAAO,EAAE,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS,KAAA,CAAM,IAAA,KAAS,KAAA,GAAQ,CAAA,IAAA,EAAO,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAA,GAAK,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,YAAY,KAAA,GAAQ;AAAA,EAAK,UAAA,CAAW,KAAK,CAAA,CAAA,GAAK,EAAE,GAAG,MAAA,IAAU,MAAA,CAAO,WAAW,UAAA,GAAa;AAAA,mBAAA,EAAwB,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,CAAO,OAAA,GAAU,WAAQ,MAAA,CAAO,OAAA,GAAU,EAAE,CAAA,CAAA,GAAK,EAAE,CAAA;AAAA,OAAE;AACnd,MAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAA,IAAW,CAAC,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,SAAA,EAAW,oBAAA,CAAqB,IAAA,CAAK,SAAS,CAAC,CAAA;AACnH,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,QAAA,CAAS,OAAA,EAAQ;AAC9C,MAAA,IAAA,CAAK,SAAA,EAAW,EAAE,OAAA,EAAQ,EAAG,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,aAAA,GAAgB,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,6CAA6C,CAAA;AAC1L,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,CAAC,WAAA,CAAY,CAAC,GAAG,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAC7F,MAAA,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,WAAA,CAAY,CAAC,CAAC,CAAA;AAAG,MAAA,IAAA,CAAK,SAAA,EAAW,EAAC,EAAG,kCAAkC,CAAA;AAAG,MAAA;AAAA,IACzG;AAAA,IACA,KAAK,SAAA;AAAA,IAAW,KAAK,QAAA,EAAU;AAC7B,MAAA,IAAI,CAAC,WAAA,CAAY,CAAC,CAAA,IAAK,CAAC,WAAA,CAAY,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,OAAO,CAAA,uBAAA,CAAyB,CAAA;AACxG,MAAA,MAAM,OAAO,QAAA,CAAS,MAAA;AAAA,QAAO,YAAY,CAAC,CAAA;AAAA,QAAG,YAAY,CAAC,CAAA;AAAA,QAAG,OAAA,KAAY,SAAA;AAAA,QACvE,MAAA,CAAO,gBAAgB,CAAA,GAAI,EAAE,kBAAkB,MAAA,CAAO,gBAAgB,CAAA,EAAE,GAAI;AAAC,OAAC;AAChF,MAAA,IAAA,CAAK,SAAS,EAAC,EAAG,OAAA,KAAY,SAAA,GAAY,2DAA2D,iBAAiB,CAAA;AAAG,MAAA;AAAA,IAC3H;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,WAAW,MAAA,CAAO,OAAA,IAAW,WAAA,EAAa,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChE,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,EAAO;AACnC,MAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,EAAE,MAAM,OAAA,EAAS;AAAE,QAAA,IAAA,CAAK,WAAW,EAAE,OAAA,EAAQ,EAAG,CAAA,SAAA,EAAY,OAAO,CAAA,sBAAA,CAAwB,CAAA;AAAG,QAAA;AAAA,MAAQ;AACvI,MAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,QAAA,CAAS,cAAc,OAAO,CAAA;AAC7D,MAAA,IAAA,CAAK,eAAA,EAAiB,WAAW,wEAAwE,CAAA;AACzG,MAAA,IAAI,IAAA,GAAO,EAAA;AACX,MAAA,WAAS;AACP,QAAA,MAAM,SAAS,MAAM,QAAA,CAA8BA,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,sBAAsB,CAAC,CAAA;AAC1F,QAAA,IAAI,QAAQ,EAAA,KAAO,SAAA,CAAU,IAAI,MAAM,IAAI,MAAM,kDAAkD,CAAA;AACnG,QAAA,IAAI,MAAA,CAAO,WAAW,IAAA,EAAM;AAAE,UAAA,IAAA,GAAO,MAAA,CAAO,MAAA;AAAQ,UAAA,IAAA,CAAK,QAAA,EAAU,MAAA,EAAQ,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAAA,QAAG;AACxG,QAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAClC,QAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,SAAS,gBAAgB,CAAA;AAChF,QAAA,MAAMlB,aAAM,GAAG,CAAA;AAAA,MACjB;AAAA,IACF;AAAA,IACA;AAAS,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,OAAO,CAAA,sBAAA,CAAwB,CAAA;AAAA;AAE/E;AAEA,SAAS,UAAA,GAAsB;AAC7B,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAG,OAAO,KAAA;AAC7B,EAAA,IAAI;AAEF,IAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,MAAM,YAAA,CAAa,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAAA,EACtF,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,IAAI,YAAW,EAAG;AAChB,EAAA,KAAK,IAAA,EAAK,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AACzB,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,IAAI,QAAQ,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,UAAW,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,IAAI,IAAI,CAAA;AAAA,SACvG,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,UAAA,EAAa,OAAO;AAAA,CAAI,CAAA;AAClD,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAAA,EACrB,CAAC,CAAA;AACH","file":"cli.js","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdtempSync, chmodSync, writeFileSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { computerPairingQRData, computerPairingURI, type ComputerConnectionCode } from \"../computer.js\";\n\nexport type PairingQRMode = \"auto\" | \"terminal\" | \"browser\" | \"none\";\ntype Output = Pick<NodeJS.WriteStream, \"isTTY\" | \"columns\" | \"rows\" | \"write\" | \"on\" | \"off\">;\ninterface DisplayOptions {\n mode?: PairingQRMode;\n output?: Output;\n environment?: NodeJS.ProcessEnv;\n openBrowser?: (url: string) => Promise<boolean>;\n}\nexport interface PairingDisplay { close(): void }\n\nconst enterScreen = \"\\x1b[?1049h\\x1b[?25l\";\nconst leaveScreen = \"\\x1b[0m\\x1b[?25h\\x1b[?1049l\";\nconst clearScreen = \"\\x1b[H\\x1b[2J\";\nfunction scanInstruction(invitation: ComputerConnectionCode): string {\n return \"mode\" in invitation && invitation.mode === \"reconnect\"\n ? \"Workspaces → your computer → Reconnect Computer → Scan Connection Code\"\n : \"Mindwire → Add computer → Scan QR code\";\n}\n\n/** qrcode's small terminal renderer ignores margin/width. Render its matrix with\n * a four-module quiet zone, two square QR modules per terminal character. */\nexport async function createPairingQR(invitation: ComputerConnectionCode) {\n const QR = await import(\"qrcode\");\n const data = computerPairingQRData(invitation);\n const options = { errorCorrectionLevel: \"L\" as const, margin: 4 };\n const { modules } = QR.create(data, options);\n const width = modules.size + options.margin * 2;\n const black = (x: number, y: number): boolean => x >= 0 && y >= 0 && x < modules.size && y < modules.size\n && !!modules.data[y * modules.size + x];\n const lines: string[] = [];\n for (let y = -options.margin; y < modules.size + options.margin; y += 2) {\n let line = \"\";\n for (let x = -options.margin; x < modules.size + options.margin; x++) {\n const top = black(x, y), bottom = black(x, y + 1);\n line += top ? (bottom ? \"█\" : \"▀\") : (bottom ? \"▄\" : \" \");\n }\n // Explicit bright white background; a terminal's dark theme must not invert the QR.\n lines.push(\"\\x1b[30;107m\" + line + \"\\x1b[0m\");\n }\n const svg = await QR.toString(data, { ...options, type: \"svg\" });\n // Leave one column for auto-wrap and rows for instructions and the cursor.\n return { lines, columns: Math.max(width, scanInstruction(invitation).length) + 1, rows: lines.length + 5, svg };\n}\n\nfunction escapeHTML(value: string): string {\n return value.replace(/[&<>\"']/g, ch => ({ \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\", \"'\": \"'\" })[ch]!);\n}\n\nfunction browserPage(invitation: ComputerConnectionCode, svg: string): string {\n const reconnect = \"mode\" in invitation && invitation.mode === \"reconnect\";\n const title = reconnect ? \"Reconnect your phone\" : \"Connect your phone\";\n return `<!doctype html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; base-uri 'none'; form-action 'none'\">\n<title>${title} · Mindwire</title>\n<style>\n*{box-sizing:border-box}body{margin:0;background:#141416;color:#f5f5f7;font:16px/1.5 system-ui,sans-serif}\nmain{width:min(100% - 40px,520px);margin:32px auto;text-align:center}small{color:#a6a6af;letter-spacing:.16em}\nh1{font-size:28px;letter-spacing:-.04em;line-height:1.2;margin:16px 0 6px}p{color:#b7b7bf;margin:8px 0;overflow-wrap:anywhere}\n.code{width:min(100%,480px);margin:24px auto 16px;background:#fff;border-radius:16px;padding:8px}\nsvg{display:block;width:100%;height:auto}.steps{margin:20px 0}.steps p{color:#e1e1e6}\nbutton{font:inherit;font-weight:600;color:#f5f5f7;border:1px solid #45454b;background:#252528;border-radius:10px;padding:10px 18px;cursor:pointer}\nbutton:disabled{opacity:.45;cursor:default}button:focus-visible{outline:3px solid #a4b8ef;outline-offset:3px}\ntextarea{width:100%;margin-top:12px;padding:8px;color:inherit;background:#252528;border:1px solid #45454b;border-radius:8px}\n[hidden]{display:none!important}#expiry{font-size:14px}footer{font-size:13px;color:#93939d;margin:18px 0}\n</style></head><body><main>\n<small>MINDWIRE</small><h1>${title}</h1><p>${escapeHTML(invitation.name)}</p>\n<div class=\"code\" id=\"code\" role=\"img\" aria-label=\"Mindwire connection QR code\">${svg}</div>\n<p id=\"expiry\" data-expires=\"${escapeHTML(invitation.expiresAt)}\" aria-live=\"off\"></p>\n<div class=\"steps\"><p>${reconnect\n ? \"In Mindwire, open your computer in <strong>Workspaces</strong>, then <strong>Reconnect Computer → Scan Connection Code</strong>.\"\n : \"In Mindwire, open <strong>Add computer</strong> and scan.\"}</p>\n<p>${reconnect ? \"Your saved pairing and workspace stay the same. No new approval is needed.\" : \"Saved keys reconnect automatically. Approve on this computer only if asked.\"}</p></div>\n<button type=\"button\" id=\"copy\">Copy ${reconnect ? \"reconnect\" : \"pairing\"} link</button>\n<textarea id=\"link\" readonly hidden aria-label=\"Pairing link\">${escapeHTML(computerPairingURI(invitation))}</textarea>\n<footer>You can close this page after ${reconnect ? \"reconnecting\" : \"pairing\"}.</footer>\n</main><script>\nconst expiry=document.getElementById('expiry'),code=document.getElementById('code'),copy=document.getElementById('copy'),link=document.getElementById('link');\nfunction tick(){const seconds=Math.max(0,Math.ceil((Date.parse(expiry.dataset.expires)-Date.now())/1000));\nif(!seconds){code.remove();copy.disabled=true;link.value='';link.hidden=true;expiry.textContent='Code expired. Run mindwire connect for a new code.';return;}\nexpiry.textContent='Expires in '+Math.floor(seconds/60)+':'+String(seconds%60).padStart(2,'0');}\ntick();setInterval(tick,1000);\ncopy.addEventListener('click',async()=>{try{await navigator.clipboard.writeText(link.value);copy.textContent='Copied';}\ncatch{link.hidden=false;link.focus();link.select();copy.textContent='Select and copy the link';}});\n</script></body></html>`;\n}\n\nasync function openBrowser(url: string): Promise<boolean> {\n const [command, args]: [string, string[]] = process.platform === \"darwin\" ? [\"open\", [url]]\n : process.platform === \"win32\" ? [\"rundll32.exe\", [\"url.dll,FileProtocolHandler\", url]] : [\"xdg-open\", [url]];\n return new Promise(resolve => {\n const child = spawn(command, args, { stdio: \"ignore\", windowsHide: true });\n const finish = (ok: boolean) => { clearTimeout(timer); resolve(ok); };\n const timer = setTimeout(() => { child.kill(); finish(false); }, 5000);\n child.once(\"error\", () => finish(false));\n child.once(\"exit\", code => finish(code === 0));\n });\n}\n\n/** Display one existing invitation. Resizing never starts another service or pairing. */\nexport async function showPairingInvitation(invitation: ComputerConnectionCode, options: DisplayOptions = {}): Promise<PairingDisplay> {\n const reconnect = \"mode\" in invitation && invitation.mode === \"reconnect\";\n const instruction = scanInstruction(invitation);\n const nextStep = reconnect ? \"Scan with a saved phone.\" : \"Approve on this computer only if asked.\";\n const waiting = reconnect ? \"Your saved pairing stays the same.\" : \"Waiting for your phone…\";\n const command = \"mindwire connect\";\n const output = options.output ?? process.stdout;\n const environment = options.environment ?? process.env;\n const mode = options.mode ?? \"auto\";\n const interactive = !!output.isTTY && environment.TERM !== \"dumb\";\n const linkOnly = mode === \"none\" || (!interactive && mode !== \"browser\");\n if (linkOnly) {\n const destination = reconnect ? \"Workspaces → your computer → Reconnect Computer\" : \"Add computer\";\n output.write(`Paste this link in Mindwire → ${destination} (expires in 5 minutes):\\n${computerPairingURI(invitation)}\\n\\n${waiting}\\n`);\n return { close() {} };\n }\n\n const qr = await createPairingQR(invitation);\n const useScreen = interactive && mode !== \"browser\";\n let closed = false, pageDirectory: string | undefined;\n let browser: \"idle\" | \"opening\" | \"opened\" | \"failed\" = \"idle\";\n let pageURL: string | undefined;\n let browserAttempt: Promise<void> | undefined;\n const fits = () => (output.columns ?? 0) >= qr.columns && (output.rows ?? 0) >= qr.rows;\n const draw = () => {\n if (closed || !useScreen) return;\n let lines: string[];\n if (fits()) {\n lines = [instruction, \"\", ...qr.lines, \"\", waiting];\n } else {\n const size = `Terminal QR needs ${qr.columns} columns × ${qr.rows} rows.`;\n lines = browser === \"opened\" ? [\"QR opened in your browser.\", instruction, nextStep]\n : browser === \"opening\" ? [\"Opening a resizable QR in your browser…\", nextStep]\n : browser === \"failed\" ? [\"Couldn't open a browser here.\", size, \"Enlarge this terminal, or run:\", `${command} --no-qr`]\n : [size, \"Enlarge this terminal, or use --qr browser.\"];\n // Tiny windows may clip instructions; they must never wrap a QR or scroll the display.\n lines = lines.map(line => line.slice(0, Math.max(0, (output.columns ?? 80) - 1)))\n .slice(0, Math.max(0, (output.rows ?? 24) - 1));\n }\n output.write(clearScreen + lines.join(\"\\r\\n\"));\n };\n const ensureBrowser = (): Promise<void> => {\n if (browserAttempt) return browserAttempt;\n browser = \"opening\";\n draw();\n browserAttempt = (async () => {\n try {\n pageDirectory = mkdtempSync(join(tmpdir(), \"mindwire-pair-\"));\n chmodSync(pageDirectory, 0o700);\n const file = join(pageDirectory, \"pair.html\");\n writeFileSync(file, browserPage(invitation, qr.svg), { mode: 0o600 });\n pageURL = pathToFileURL(file).href;\n // An SSH session's browser would be on the remote machine. Keep auto mode local.\n const remoteShell = !!(environment.SSH_CONNECTION || environment.SSH_CLIENT || environment.SSH_TTY);\n const opened = (mode === \"browser\" || !remoteShell) && await (options.openBrowser ?? openBrowser)(pageURL);\n browser = opened ? \"opened\" : \"failed\";\n } catch {\n browser = \"failed\";\n }\n if (closed) return;\n if (useScreen) draw();\n else output.write(browser === \"opened\"\n ? `QR opened in your browser.\\n${instruction}\\n${nextStep}\\n`\n : `Open this local QR page in a browser:\\n${pageURL ?? `Page unavailable. Run ${command} --no-qr for a link.`}\\n\\n${waiting}\\n`);\n })();\n return browserAttempt;\n };\n const resize = () => {\n draw();\n if (!closed && mode === \"auto\" && !fits()) void ensureBrowser();\n };\n const close = () => {\n if (closed) return;\n closed = true;\n output.off(\"resize\", resize);\n process.off(\"exit\", close);\n process.off(\"SIGINT\", interrupt);\n process.off(\"SIGTERM\", terminate);\n process.off(\"SIGHUP\", hangup);\n if (useScreen) output.write(leaveScreen);\n if (pageDirectory) {\n try { rmSync(pageDirectory, { recursive: true, force: true }); } catch { /* Best effort on process exit. */ }\n }\n };\n const interrupt = () => { close(); process.exit(130); };\n const terminate = () => { close(); process.exit(143); };\n const hangup = () => { close(); process.exit(129); };\n process.once(\"exit\", close);\n process.once(\"SIGINT\", interrupt);\n process.once(\"SIGTERM\", terminate);\n process.once(\"SIGHUP\", hangup);\n if (useScreen) {\n output.write(enterScreen);\n output.on(\"resize\", resize);\n draw();\n }\n try {\n if (mode === \"browser\" || (mode === \"auto\" && !fits())) await ensureBrowser();\n return { close };\n } catch (error) {\n close();\n throw error;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { ensureComputer, readJSON, writeJSON, type ControllerState } from \"./lifecycle.js\";\nimport { currentProcessIdentity, processStateAlive, type ProcessState } from \"./process.js\";\nimport { acquireProcessLock } from \"./lock.js\";\n\nconst execute = promisify(execFile);\ntype Command = [string, ...string[]];\nexport interface StartupPlan {\n kind: \"launchd\" | \"systemd\" | \"task-scheduler\";\n name: string; file: string; content: string;\n query: Command; enable: Command[]; disable: Command[];\n}\nexport interface StartupState { enabled: boolean; running?: boolean; kind?: StartupPlan[\"kind\"]; name?: string; file?: string }\nconst xml = (value: string) => value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\");\nconst systemd = (value: string, expandEnvironment = false) => '\"' + value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/%/g, \"%%\")\n .replace(/\\$/g, () => expandEnvironment ? \"$$\" : \"$\") + '\"';\nconst windowsArg = (value: string) => '\"' + value.replace(/(\\\\*)\"/g, '$1$1\\\\\"').replace(/(\\\\+)$/g, \"$1$1\") + '\"';\n\n/** Per-user startup, with no root service, password, or copied pairing secret. */\nexport function startupPlan(options: {\n directory: string; cliPath: string; executable?: string; platform?: NodeJS.Platform;\n home?: string; uid?: number; user?: string; environmentPath?: string;\n}): StartupPlan {\n const { directory, cliPath } = options;\n const executable = options.executable ?? process.execPath, home = options.home ?? homedir();\n const platform = options.platform ?? process.platform;\n const environmentPath = options.environmentPath ?? process.env.PATH ?? path.dirname(executable);\n for (const value of [directory, cliPath, executable, home, environmentPath]) {\n if (/[\\r\\n\\x00]/.test(value)) throw new Error(\"Startup paths cannot contain control characters.\");\n }\n const id = createHash(\"sha256\").update(directory).digest(\"hex\").slice(0, 12);\n const name = `sh.mindwire.computer.${id}`;\n const args = [cliPath, \"_watch\", \"--state-dir\", directory];\n if (platform === \"darwin\") {\n const domain = `gui/${options.uid ?? process.getuid?.()}`;\n const file = path.join(home, \"Library\", \"LaunchAgents\", name + \".plist\");\n return { kind: \"launchd\", name, file,\n content: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\"><dict>\n<key>Label</key><string>${name}</string>\n<key>ProgramArguments</key><array>${[executable, ...args].map(v => `<string>${xml(v)}</string>`).join(\"\")}</array>\n<key>WorkingDirectory</key><string>${xml(home)}</string>\n<key>EnvironmentVariables</key><dict><key>PATH</key><string>${xml(environmentPath)}</string></dict>\n<key>RunAtLoad</key><true/><key>KeepAlive</key><true/>\n<key>ThrottleInterval</key><integer>10</integer>\n<key>StandardOutPath</key><string>${xml(path.join(directory, \"startup.log\"))}</string>\n<key>StandardErrorPath</key><string>${xml(path.join(directory, \"startup.log\"))}</string>\n</dict></plist>\n`, query: [\"launchctl\", \"print\", `${domain}/${name}`],\n enable: [[\"launchctl\", \"enable\", `${domain}/${name}`], [\"launchctl\", \"bootstrap\", domain, file]],\n disable: [[\"launchctl\", \"bootout\", `${domain}/${name}`]] };\n }\n if (platform === \"linux\") {\n const file = path.join(home, \".config\", \"systemd\", \"user\", name + \".service\");\n return { kind: \"systemd\", name, file,\n content: `[Unit]\nDescription=Mindwire computer connection\nAfter=network-online.target\n[Service]\nType=simple\nExecStart=${[executable, ...args].map(value => systemd(value, true)).join(\" \")}\nWorkingDirectory=${systemd(home)}\nEnvironment=${systemd(\"PATH=\" + environmentPath)}\nRestart=always\nRestartSec=10\nKillMode=process\n[Install]\nWantedBy=default.target\n`, query: [\"systemctl\", \"--user\", \"is-active\", name + \".service\"],\n enable: [[\"systemctl\", \"--user\", \"daemon-reload\"], [\"systemctl\", \"--user\", \"enable\", \"--now\", name + \".service\"]],\n disable: [[\"systemctl\", \"--user\", \"disable\", \"--now\", name + \".service\"], [\"systemctl\", \"--user\", \"daemon-reload\"]] };\n }\n if (platform === \"win32\") {\n if (!options.user) throw new Error(\"Couldn't determine the Windows user for startup.\");\n const file = path.join(directory, \"startup-task.xml\");\n return { kind: \"task-scheduler\", name, file,\n content: `<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<Task version=\"1.2\" xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n<Triggers><LogonTrigger><Enabled>true</Enabled><UserId>${xml(options.user)}</UserId></LogonTrigger></Triggers>\n<Principals><Principal id=\"Owner\"><UserId>${xml(options.user)}</UserId><LogonType>InteractiveToken</LogonType><RunLevel>LeastPrivilege</RunLevel></Principal></Principals>\n<Settings><MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy><DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries><StopIfGoingOnBatteries>false</StopIfGoingOnBatteries><StartWhenAvailable>true</StartWhenAvailable><ExecutionTimeLimit>PT0S</ExecutionTimeLimit><RestartOnFailure><Interval>PT1M</Interval><Count>999</Count></RestartOnFailure></Settings>\n<Actions Context=\"Owner\"><Exec><Command>${xml(executable)}</Command><Arguments>${xml(args.map(windowsArg).join(\" \"))}</Arguments><WorkingDirectory>${xml(home)}</WorkingDirectory></Exec></Actions>\n</Task>\n`, query: [\"schtasks.exe\", \"/Query\", \"/TN\", name],\n enable: [[\"schtasks.exe\", \"/Create\", \"/TN\", name, \"/XML\", file, \"/F\"], [\"schtasks.exe\", \"/Run\", \"/TN\", name]],\n disable: [[\"schtasks.exe\", \"/End\", \"/TN\", name], [\"schtasks.exe\", \"/Delete\", \"/TN\", name, \"/F\"]] };\n }\n throw new Error(\"Automatic startup supports macOS, Linux with systemd, and Windows. Run mindwire start on this system.\");\n}\n\nconst run = async ([command, ...args]: Command) => { await execute(command, args, { timeout: 15_000, windowsHide: true }); };\nexport async function startupStatus(directory: string): Promise<StartupState> {\n const state = await readJSON<StartupState>(path.join(directory, \"computer-startup.json\")) ?? { enabled: false };\n const guardian = await readJSON<ProcessState>(path.join(directory, \"computer-guardian.json\"));\n return { ...state, running: state.enabled && await processStateAlive(guardian) };\n}\n\nexport async function configureStartup(directory: string, cliPath: string, enabled: boolean, runtime: {\n plan?: StartupPlan; run?: (command: Command) => Promise<void>; verify?: () => Promise<void>;\n} = {}): Promise<StartupState> {\n await fs.mkdir(directory, { recursive: true, mode: 0o700 });\n const lockPath = path.join(directory, \"startup.lock\");\n const lock = await acquireProcessLock(lockPath);\n if (!lock) throw new Error(\"Startup is already being configured. Try again shortly.\");\n try {\n const user = process.platform === \"win32\" && !runtime.plan\n ? (await execute(\"whoami.exe\", [], { timeout: 3000, windowsHide: true })).stdout.trim() : undefined;\n const plan = runtime.plan ?? startupPlan({ directory, cliPath, user });\n const command = runtime.run ?? run;\n let loaded = false;\n try { await command(plan.query); loaded = true; } catch { /* Not installed/loaded. */ }\n if (enabled) {\n const previous = await fs.readFile(plan.file, plan.kind === \"task-scheduler\" ? \"utf16le\" : \"utf8\").catch(() => \"\");\n const changed = previous !== plan.content;\n if (changed) {\n await fs.mkdir(path.dirname(plan.file), { recursive: true, mode: 0o700 });\n const temporary = plan.file + `.tmp-${process.pid}`;\n try {\n await fs.writeFile(temporary, plan.content, { mode: 0o600, encoding: plan.kind === \"task-scheduler\" ? \"utf16le\" : \"utf8\" });\n await fs.rename(temporary, plan.file);\n } finally { await fs.rm(temporary, { force: true }); }\n }\n // Never restart the controller to update its login registration. The\n // currently running service and its terminal processes remain untouched.\n if (!loaded || changed && plan.kind !== \"launchd\") {\n for (const action of plan.enable) await command(action);\n }\n await command(plan.query); // Report success only after native registration.\n if (runtime.verify) await runtime.verify();\n else {\n let running = false;\n for (let attempt = 0; attempt < 60; attempt++) {\n const guardian = await readJSON<ProcessState>(path.join(directory, \"computer-guardian.json\"));\n if (await processStateAlive(guardian)) { running = true; break; }\n await delay(250);\n }\n if (!running) throw new Error(`Automatic startup was registered but its guardian didn't start. Inspect ${path.join(directory, \"startup.log\")}.`);\n }\n } else {\n if (loaded || await fs.stat(plan.file).then(() => true, () => false)) {\n for (const action of plan.disable) {\n try { await command(action); }\n catch (error) { if (action.includes(\"/End\") || action.includes(\"bootout\") && !loaded) continue; throw error; }\n }\n }\n await fs.rm(plan.file, { force: true });\n }\n const state: StartupState = { enabled, kind: plan.kind, name: plan.name, file: plan.file };\n await writeJSON(path.join(directory, \"computer-startup.json\"), state);\n return { ...state, running: enabled };\n } finally { await lock.close(); }\n}\n\n/** Native startup managers supervise this small guardian. It adopts an existing\n * controller and honours an explicit stop; it never owns or kills user work. */\nexport async function watchComputer(directory: string, cliPath: string): Promise<void> {\n let stopping = false;\n const abort = new AbortController();\n const stop = () => { stopping = true; abort.abort(); };\n process.on(\"SIGTERM\", stop); process.on(\"SIGINT\", stop);\n let reportedError = \"\";\n const guardianPath = path.join(directory, \"computer-guardian.json\");\n try {\n await writeJSON(guardianPath, await currentProcessIdentity());\n while (!stopping) {\n const paused = await readJSON<{ stopped: boolean }>(path.join(directory, \"computer-stopped.json\"));\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (!paused?.stopped && !await processStateAlive(controller)) {\n try { await ensureComputer(directory, cliPath, {}, undefined, { resume: false, signal: abort.signal }); reportedError = \"\"; }\n catch (error) {\n if (stopping) break;\n const message = error instanceof Error ? error.message : \"Computer recovery failed.\";\n if (message !== reportedError) { process.stderr.write(`Mindwire recovery: ${message}\\n`); reportedError = message; }\n }\n }\n // A user stop is durable; a reboot or repeated guardian launch won't undo it.\n for (let tick = 0; tick < 10 && !stopping; tick++) await delay(500);\n }\n } finally {\n if ((await readJSON<{ pid: number }>(guardianPath))?.pid === process.pid) await writeJSON(guardianPath, { pid: 0 });\n process.off(\"SIGTERM\", stop); process.off(\"SIGINT\", stop);\n }\n}\n","import type { ComputerReconnectCode, ComputerDevice, ComputerInfo } from \"../computer.js\";\n\nexport type ConnectionAction = \"resume\" | \"reconnect\" | \"pair\";\n\nexport function connectionAction(value: string | undefined): ConnectionAction | undefined {\n if (value === undefined) return undefined;\n if (value === \"resume\" || value === \"reconnect\" || value === \"pair\") return value;\n throw new Error(\"Use mindwire connect, mindwire connect resume, mindwire reconnect, or mindwire connect pair.\");\n}\n\n/** Safe to copy into either a Unix shell or PowerShell, even when an ID starts\n * with a dash. Validate old daemons too; these values originated on a phone. */\nexport function approvalCommand(pairingId: string, requestId: string): string {\n if (![pairingId, requestId].every(id => /^[A-Za-z0-9_-]{8,128}$/.test(id))) {\n throw new Error(\"Invalid phone pairing request. Run mindwire connect to create a new code.\");\n }\n return `mindwire approve -- ${pairingId} ${requestId}`;\n}\n\n/** Stable endpoints need no new invitation after network loss or restart.\n * An approval means ready to reconnect, never proof of current connectivity. */\nexport async function chooseConnectionAction(options: {\n requested?: ConnectionAction;\n devices: ComputerDevice[];\n persistent?: boolean;\n}): Promise<ConnectionAction> {\n if (options.requested === \"pair\") return \"pair\";\n const recoverable = options.persistent || options.devices.some(device => !device.revoked && device.addressRecovery);\n if (options.requested === \"reconnect\" && !recoverable) return \"pair\";\n return options.devices.some(device => !device.revoked && (device.connected || recoverable)) ? \"resume\" : \"pair\";\n}\n\n/** A fresh key is never merged by name. Replacement requires the owner's explicit\n * choice of the exact approvals shown here; a different same-name phone can be added. */\nexport async function choosePairingDecision(options: {\n replacements: ComputerDevice[];\n question: (prompt: string) => Promise<string>;\n}): Promise<{ approve: boolean; replaceDeviceIds?: string[] }> {\n const replacements = options.replacements.filter(device => !device.revoked);\n const prompt = replacements.length\n ? `\\nPrevious approvals with this name:\\n${deviceSummary(replacements, true)}\\n\\nAllow this phone? [r = replace these approvals, a = add a different phone, N = deny]: `\n : \"Allow this phone to access this computer? [y/N] \";\n for (;;) {\n const answer = (await options.question(prompt)).trim().toLowerCase();\n if ([\"\", \"n\", \"no\"].includes(answer)) return { approve: false };\n if (replacements.length) {\n if ([\"r\", \"replace\"].includes(answer)) return { approve: true, replaceDeviceIds: replacements.map(device => device.id) };\n if ([\"a\", \"add\"].includes(answer)) return { approve: true };\n } else if ([\"y\", \"yes\"].includes(answer)) return { approve: true };\n }\n}\n\n/** Ask once; preserve existing opt-outs. Scripts must opt in with --startup. */\nexport async function chooseStartupAction(options: {\n state: { enabled: boolean; running?: boolean; kind?: string };\n startup?: boolean;\n noStartup?: boolean;\n question?: (prompt: string) => Promise<string>;\n}): Promise<boolean | undefined> {\n if (options.startup && options.noStartup) throw new Error(\"Choose either --startup or --no-startup.\");\n if (options.startup) return !options.state.enabled || !options.state.running ? true : undefined;\n if (options.noStartup) return options.state.kind ? undefined : false;\n if (options.state.kind) return options.state.enabled && !options.state.running ? true : undefined;\n if (!options.question) return undefined;\n for (;;) {\n const answer = (await options.question(\n \"\\nStart Mindwire automatically after you sign in to this computer? [Y/n] \")).trim().toLowerCase();\n if ([\"\", \"y\", \"yes\"].includes(answer)) return true;\n if ([\"n\", \"no\"].includes(answer)) return false;\n }\n}\n\nexport function reconnectCode(info: ComputerInfo, name: string, now = new Date()): ComputerReconnectCode {\n if (info.routes.length === 0) throw new Error(\"No connection address is ready. Run mindwire status and retry once the tunnel is online.\");\n return { version: 1, mode: \"reconnect\", computerId: info.computerId, registryId: info.registryId,\n fingerprint: info.fingerprint, name, routes: info.routes,\n expiresAt: new Date(now.getTime() + 5 * 60_000).toISOString() };\n}\n\nexport function deviceSummary(devices: ComputerDevice[], showKeys = false): string {\n const saved = devices.filter(device => !device.revoked);\n const names = new Map<string, number>();\n const safeName = (device: ComputerDevice) => device.name.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \"\");\n for (const device of saved) names.set(safeName(device), (names.get(safeName(device)) ?? 0) + 1);\n return saved\n .sort((a, b) => a.name.localeCompare(b.name) || a.id.localeCompare(b.id))\n .map(device => {\n const name = safeName(device);\n const status = device.connected === true ? \"connected\" : \"paired\";\n const identity = showKeys || (names.get(name) ?? 0) > 1 ? ` · key ${device.id.slice(0, 8)}` : \"\";\n return ` ${name} · ${status}${identity}`;\n }).join(\"\\n\");\n}\n","import { clearLine, cursorTo } from \"node:readline\";\n\n/** One terminal line for one connection attempt. JSON and redirected output\n * keep their normal events; interactive retries don't accumulate a wall of logs. */\nexport class ConnectionProgress {\n private readonly startedAt = Date.now();\n private readonly timer: ReturnType<typeof setInterval>;\n private message = \"Starting Mindwire…\";\n private closed = false;\n private readonly exiting = () => this.close();\n\n constructor(private readonly stream: NodeJS.WriteStream) {\n this.render();\n this.timer = setInterval(() => this.render(), 1000);\n this.timer.unref();\n process.once(\"exit\", this.exiting);\n }\n\n update(message: string): void { this.message = message; this.render(); }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n clearInterval(this.timer);\n process.off(\"exit\", this.exiting);\n cursorTo(this.stream, 0);\n clearLine(this.stream, 0);\n }\n\n private render(): void {\n const seconds = Math.floor((Date.now() - this.startedAt) / 1000);\n const elapsed = seconds > 0 ? ` · ${seconds}s` : \"\";\n const width = Math.max(1, (this.stream.columns || 80) - elapsed.length - 1);\n const message = this.message.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \"\");\n const text = message.length > width ? message.slice(0, width - 1) + \"…\" : message;\n cursorTo(this.stream, 0);\n clearLine(this.stream, 0);\n this.stream.write(text + elapsed);\n }\n}\n","export class DirectoryRequestError extends Error {\n constructor(\n readonly status: number,\n readonly code: string,\n readonly retryAfter = 0,\n ) {\n super(\n status === 0\n ? \"Couldn't reach the address directory securely. Check its HTTPS address and retry.\"\n : `The address directory rejected the request (${code}).`,\n );\n }\n}\n\n/** Bounded, same-origin requests. No redirects, cookie jar or retained credentials. */\nexport async function directoryRequest<T>(url: string, path: string, body: unknown): Promise<T> {\n let response: Response;\n try {\n response = await fetch(url + path, {\n method: \"POST\",\n redirect: \"error\",\n signal: AbortSignal.timeout(10_000),\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify(body),\n });\n } catch {\n throw new DirectoryRequestError(0, \"unreachable\");\n }\n const reader = response.body?.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n try {\n if (reader)\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n length += value.byteLength;\n if (length > 64 * 1024) throw new Error(\"The address directory returned an oversized response.\");\n chunks.push(value);\n }\n } finally {\n void reader?.cancel().catch(() => {});\n }\n let data: unknown;\n try {\n data = JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\n } catch {\n throw new DirectoryRequestError(response.status, \"invalid_response\");\n }\n if (!response.ok) {\n const error = (data as { error?: unknown } | null)?.error;\n const code = typeof error === \"string\" ? error : (error as { code?: unknown } | null)?.code;\n const retryAfter = Number(response.headers.get(\"Retry-After\"));\n throw new DirectoryRequestError(\n response.status,\n typeof code === \"string\" && /^[a-z_]{1,64}$/.test(code) ? code : \"directory_error\",\n Number.isFinite(retryAfter) ? Math.max(0, Math.min(60, retryAfter)) : 0,\n );\n }\n return data as T;\n}\n","import { join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport type { Mindwire } from \"../client.js\";\nimport type { ComputerDiscoveryStatus } from \"../computer.js\";\nimport { acquireProcessLock } from \"./lock.js\";\nimport type { SetupPrompt } from \"./setup-prompt.js\";\nimport { directoryRequest, DirectoryRequestError } from \"./directory-http.js\";\n\nexport const DIRECTORY_API_PATH = \"/api/computer-directory/v1\";\nexport const DIRECTORY_URL = `https://console.mindwire.sh${DIRECTORY_API_PATH}`;\n\nexport function directoryURL(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"Enter the directory's HTTPS API URL.\");\n }\n if (\n value.length > 2048 ||\n /[\\s\\x00]/.test(value) ||\n url.username ||\n url.password ||\n url.search ||\n url.hash ||\n (url.protocol !== \"https:\" &&\n !(url.protocol === \"http:\" && [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname)))\n ) {\n throw new Error(\"Use an HTTPS directory URL without credentials, a query, or a fragment.\");\n }\n if (url.pathname === \"/\") url.pathname = DIRECTORY_API_PATH;\n if (url.pathname.endsWith(\"/\") || url.pathname.includes(\"//\") || url.pathname.includes(\"%\")) {\n throw new Error(\"Use the exact directory API URL without a trailing slash.\");\n }\n return url.href;\n}\n\nexport async function enableAddressDiscovery(options: {\n directory: string;\n computer: Mindwire;\n prompt: SetupPrompt;\n url?: string;\n}): Promise<ComputerDiscoveryStatus> {\n const lock = await acquireProcessLock(join(options.directory, \"discovery-setup.lock\"));\n try {\n let status: ComputerDiscoveryStatus;\n try {\n status = await options.computer.computer.discovery();\n } catch (error) {\n if ((error as { status?: number }).status === 404)\n throw new Error(\"Update the Mindwire service before enabling automatic address recovery.\");\n throw error;\n }\n // Preserve a saved private directory across upgrades. Credentials belonging\n // to another provider are never read by this flow.\n const url = directoryURL(\n options.url ?? process.env.MINDWIRE_DIRECTORY_URL ?? status.url ?? DIRECTORY_URL,\n );\n if (\n status.url &&\n status.url !== url &&\n (status.enabled || (status.sequence ?? 0) !== (status.publishedSequence ?? 0))\n ) {\n throw new Error(\n \"Disable the current directory with mindwire discovery disable and wait for its withdrawal before changing the directory URL.\",\n );\n }\n if (!status.enabled || status.url !== url || status.error?.includes(\"enrollment\")) {\n options.prompt.print(`Enabling encrypted address recovery with ${new URL(url).host}…`);\n try {\n const challenge = await directoryRequest<{ challenge: string }>(url, \"/registrations/challenge\", {\n directoryId: status.directoryId,\n });\n if (\n typeof challenge?.challenge !== \"string\" ||\n challenge.challenge.length < 16 ||\n challenge.challenge.length > 2048\n ) {\n throw new Error(\"The address directory returned an invalid enrollment challenge.\");\n }\n const proof = await options.computer.computer.directoryEnrollment(url, challenge.challenge);\n const enrolled = await directoryRequest<{ directoryId: string }>(url, \"/registrations\", proof);\n if (enrolled?.directoryId !== status.directoryId)\n throw new Error(\"The directory acknowledged a different computer.\");\n } catch (error) {\n if (error instanceof DirectoryRequestError) {\n if (error.status === 404 || error.status === 501)\n throw new Error(\n \"The address directory isn't available at this URL. Your existing connection still works; retry after the backend is deployed.\",\n );\n if (error.status === 409)\n throw new Error(\n \"This computer's directory registration is revoked or conflicts with its saved identity. Contact the directory operator.\",\n );\n if (error.code === \"account_required\")\n throw new Error(\n \"This directory still requires an account. Update its Mindwire backend to enable key-based registration, or choose another directory with --directory-url.\",\n );\n if (error.status === 401 || error.status === 403)\n throw new Error(\n \"The directory couldn't verify this computer's key or challenge. Retry enrollment.\",\n );\n if (error.status === 429)\n throw new Error(\n \"The directory's registration limit was reached. Retry later or use another directory.\",\n );\n if (error.status === 503)\n throw new Error(\n \"The directory is temporarily unavailable or at capacity. Your existing connection still works.\",\n );\n }\n throw error;\n }\n status = await options.computer.computer.configureDiscovery(true, url);\n }\n const deadline = Date.now() + 15_000;\n while (Date.now() < deadline) {\n status = await options.computer.computer.discovery();\n if (status.enabled && status.sequence && status.publishedSequence === status.sequence) return status;\n if (status.error?.includes(\"enrollment\") || status.error?.includes(\"older revision\"))\n throw new Error(status.error);\n await delay(250);\n }\n throw new Error(\n \"Address recovery is configured and will retry in the background. Run mindwire discovery status to check publication.\",\n );\n } finally {\n await lock?.close();\n }\n}\n\nexport function discoveryDescription(status: ComputerDiscoveryStatus | undefined): string {\n if (!status?.enabled) return \"Automatic address recovery is off. Enable it with mindwire discovery enable.\";\n if (status.error) return status.error;\n return status.sequence && status.publishedSequence === status.sequence\n ? \"Encrypted address recovery is on. Saved phones can find this computer when its tunnel address changes.\"\n : \"Publishing the computer's encrypted address…\";\n}\n","import { homedir } from \"node:os\";\nimport * as path from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport { rm } from \"node:fs/promises\";\nimport { Oblien } from \"oblien\";\nimport { readJSON, writeJSON } from \"./lifecycle.js\";\nimport { acquireProcessLock } from \"./lock.js\";\nimport type { SetupPrompt } from \"./setup-prompt.js\";\n\nexport interface OblienCredentials { token?: string; clientId?: string; clientSecret?: string; baseUrl?: string }\nconst BASE = \"https://api.oblien.com\";\nconst RENEW_BEFORE_MS = 24 * 60 * 60_000;\n\nexport class ProviderSignInRequired extends Error {\n readonly code = \"provider_sign_in\";\n constructor(provider = \"Oblien\") { super(`Sign in to ${provider} again with mindwire connection ${provider.toLowerCase()}. Your computer and phone keys are unchanged.`); }\n}\n\nexport function tokenExpiry(token: string): number | undefined {\n try {\n const value = JSON.parse(Buffer.from(token.split(\".\")[1] ?? \"\", \"base64url\").toString()) as { exp?: number };\n return typeof value.exp === \"number\" && Number.isFinite(value.exp) ? value.exp * 1000 : undefined;\n } catch { return undefined; }\n}\n\nexport function oblienClient(credentials: OblienCredentials): Oblien {\n const baseUrl = credentials.baseUrl ?? BASE;\n const url = new URL(baseUrl);\n if (url.protocol !== \"https:\" || url.username || url.password) throw new Error(\"Oblien requires an HTTPS API address without embedded credentials.\");\n if (credentials.clientId && credentials.clientSecret) return boundedOblienClient(new Oblien({ baseUrl, clientId: credentials.clientId, clientSecret: credentials.clientSecret }));\n if (credentials.token) return boundedOblienClient(new Oblien({ baseUrl, token: credentials.token }));\n throw new ProviderSignInRequired();\n}\n\n/** The SDK's resource methods share this transport but do not yet accept a\n * timeout. Bound every request, including tunnel creation and token renewal,\n * without bypassing the official resource API or retrying mutations. */\nexport function boundedOblienClient(client: Oblien, timeoutMs = 15_000): Oblien {\n const request = client._http.request.bind(client._http);\n client._http.request = async <T>(options: Parameters<Oblien[\"_http\"][\"request\"]>[0]): Promise<T> => {\n const controller = new AbortController();\n const cancel = () => controller.abort(options.signal?.reason);\n const timer = setTimeout(() => controller.abort(new Error(\"Oblien's API did not respond in time.\")), timeoutMs);\n options.signal?.addEventListener(\"abort\", cancel, { once: true });\n if (options.signal?.aborted) cancel();\n try { return await request<T>({ ...options, signal: controller.signal }); }\n finally { clearTimeout(timer); options.signal?.removeEventListener(\"abort\", cancel); }\n };\n return client;\n}\n\nfunction requiresSignIn(error: unknown): boolean {\n return error instanceof ProviderSignInRequired || [401, 403].includes((error as { status?: number })?.status ?? 0);\n}\n\n/** Auth is not yet a public SDK resource. Use the SDK's authenticated transport\n * for the documented browser-session endpoints; all tunnel calls use edgeTunnel. */\nexport async function authenticatedOblien(file: string, options: {\n now?: () => number; client?: typeof oblienClient;\n} = {}): Promise<Oblien> {\n const lock = await acquireProcessLock(file + \".lock\");\n try {\n const credentials = await readJSON<OblienCredentials>(file);\n if (!credentials) throw new ProviderSignInRequired();\n const client = (options.client ?? oblienClient)(credentials);\n if (!credentials.token || credentials.clientId && credentials.clientSecret) return client;\n const now = (options.now ?? Date.now)(), expires = tokenExpiry(credentials.token);\n if (expires !== undefined && expires <= now) throw new ProviderSignInRequired();\n if (expires !== undefined && expires - now > RENEW_BEFORE_MS) return client;\n try {\n // Never exchange an expired token: the API would create an anonymous session.\n const renewed = await client._http.request<{ success: boolean; token?: string }>({\n method: \"POST\", path: \"/auth/token\", body: { old_token: credentials.token }, signal: AbortSignal.timeout(15_000),\n });\n if (!renewed.token) throw new ProviderSignInRequired();\n const next = (options.client ?? oblienClient)({ ...credentials, token: renewed.token });\n await next._http.request({ method: \"GET\", path: \"/settings/profile\", signal: AbortSignal.timeout(15_000) });\n await writeJSON(file, { ...credentials, token: renewed.token });\n return next;\n } catch (error) {\n if (requiresSignIn(error)) throw new ProviderSignInRequired();\n throw error; // Transient failure: retain the last credential for the next retry.\n }\n } finally { await lock?.close(); }\n}\n\nexport async function signInOblien(file: string, prompt: SetupPrompt): Promise<Oblien> {\n // Reuse the user's official CLI login once; do not modify its shared config or\n // inherit credentials in startup jobs. Mindwire owns a private renewable copy.\n const candidates = await Promise.all([readJSON<OblienCredentials>(file),\n readJSON<OblienCredentials>(path.join(homedir(), \".oblien\", \"credentials.json\"))]);\n for (const existing of candidates) {\n if (!existing || !(existing.token || existing.clientId && existing.clientSecret)) continue;\n const temporary = `${file}.login-${randomUUID()}.json`;\n await writeJSON(temporary, existing);\n try {\n const client = await authenticatedOblien(temporary);\n await client._http.request({ method: \"GET\", path: \"/settings/profile\", signal: AbortSignal.timeout(15_000) });\n await writeJSON(file, await readJSON<OblienCredentials>(temporary));\n return client;\n } catch (error) { if (!requiresSignIn(error)) throw error; }\n finally { await rm(temporary, { force: true }); }\n }\n const client = boundedOblienClient(new Oblien({ token: \"\", baseUrl: BASE }));\n const session = await client._http.request<{ token: string }>({ method: \"POST\", path: \"/auth/token\", signal: AbortSignal.timeout(15_000) });\n if (!session.token) throw new Error(\"Oblien couldn't start sign-in. Try again shortly.\");\n client.setToken(session.token);\n const login = await client._http.request<{ url: string }>({ method: \"POST\", path: \"/auth/session\",\n body: { app: \"oblien\", redirect_url: \"https://oblien.com/cli?login=success\" }, signal: AbortSignal.timeout(15_000) });\n const url = new URL(login.url);\n if (url.protocol !== \"https:\" || url.hostname !== \"auth.oblien.com\" || url.username || url.password) throw new Error(\"Oblien returned an invalid sign-in link.\");\n const id = url.pathname.split(\"/\").filter(Boolean).pop();\n if (!id || !/^[\\w-]+$/.test(id)) throw new Error(\"Oblien returned an invalid sign-in session.\");\n prompt.print(`\\nSign in to Oblien in your browser:\\n${url.href}\\n\\nWaiting for sign-in…`);\n prompt.open(url.href);\n const deadline = Date.now() + 5_000 * 60;\n while (Date.now() < deadline) {\n await delay(2000);\n const result = await client._http.request<{ status: string }>({ method: \"GET\", path: `/auth/session/${id}/poll`, signal: AbortSignal.timeout(15_000) });\n if (result.status === \"expired\") throw new Error(\"Oblien sign-in expired. Run mindwire connection oblien to retry.\");\n if (result.status !== \"authenticated\") continue;\n await client._http.request({ method: \"GET\", path: \"/settings/profile\", signal: AbortSignal.timeout(15_000) });\n await writeJSON(file, { token: session.token } satisfies OblienCredentials);\n prompt.print(\"Signed in to Oblien.\");\n return client;\n }\n throw new Error(\"Oblien sign-in timed out. Run mindwire connection oblien to retry.\");\n}\n","import { execFile, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport { hostname, homedir } from \"node:os\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { Oblien } from \"oblien\";\nimport { cloudflareCommand } from \"./cloudflare-binary.js\";\nimport { defaultComputerConfig, readJSON, writeJSON, type ComputerConfig } from \"./lifecycle.js\";\nimport { acquireProcessLock } from \"./lock.js\";\nimport { signInOblien, type OblienCredentials } from \"./oblien-auth.js\";\nimport { websocketURL, type RelayOptions } from \"./relay.js\";\nimport type { SetupPrompt } from \"./setup-prompt.js\";\n\nexport type ConnectionProvider = \"oblien\" | \"cloudflare\" | \"ngrok\" | \"vpn\" | \"custom\" | \"temporary\" | \"automatic\";\ninterface ProviderState { installationId: string; oblien?: { id: number; url: string }; cloudflare?: { id: string; credentialsFile: string } }\nconst execute = promisify(execFile);\n\nexport async function chooseProvider(prompt: SetupPrompt): Promise<ConnectionProvider> {\n prompt.print(\"\\nConnect this computer\\n\\n 1 Automatic — free Cloudflare tunnel + Mindwire address recovery, no account\\n 2 Oblien — persistent address, browser sign-in\\n 3 Cloudflare — your account and domain\\n 4 ngrok — your account and reserved domain\\n 5 Your VPN — direct SSH\\n 6 Existing secure tunnel\\n 7 Temporary Cloudflare connection — no address recovery\\n\");\n for (;;) {\n const answer = (await prompt.question(\"Connection [1]: \")).trim();\n const provider = ([\"automatic\", \"oblien\", \"cloudflare\", \"ngrok\", \"vpn\", \"custom\", \"temporary\"] as const)[Number(answer || \"1\") - 1];\n if (provider) return provider;\n prompt.print(\"Choose 1–7.\");\n }\n}\n\nexport function connectionProvider(value: string): ConnectionProvider {\n if ([\"oblien\", \"cloudflare\", \"ngrok\", \"vpn\", \"custom\", \"temporary\", \"automatic\"].includes(value)) return value as ConnectionProvider;\n throw new Error(\"Choose automatic, oblien, cloudflare, ngrok, vpn, custom or temporary.\");\n}\n\nexport function providerHostname(value: string): string {\n const url = new URL(websocketURL(value.includes(\"://\") ? value : `https://${value}`));\n if (url.port || url.search || url.pathname !== \"/ssh\" || !url.hostname.includes(\".\") || /[\\s]/.test(value)) {\n throw new Error(\"Enter the configured public hostname, for example computer.example.com.\");\n }\n return url.hostname;\n}\n\n/** No port-based account-wide reuse: two computers commonly use the same port. */\nexport async function prepareOblienTunnel(client: Oblien, stateFile: string, port: number): Promise<{ id: number; url: string }> {\n let state = await readJSON<ProviderState>(stateFile);\n if (!state) { state = { installationId: randomUUID() }; await writeJSON(stateFile, state); }\n if (state.oblien) {\n try {\n const { tunnel } = await client.edgeTunnel.get(state.oblien.id);\n if (tunnel.status !== \"active\") throw new Error(\"This computer's Oblien tunnel is disabled. Enable it in your Oblien dashboard, then retry.\");\n if (tunnel.port !== port) await client.edgeTunnel.update(tunnel.id, { port });\n const saved = { id: tunnel.id, url: websocketURL(tunnel.url) };\n await writeJSON(stateFile, { ...state, oblien: saved });\n return saved;\n } catch (error) {\n // Only an explicit setup can replace a deleted tunnel. Background startup\n // never recreates a revoked provider resource or invents a new address.\n if ((error as { status?: number })?.status !== 404) throw error;\n }\n }\n const slug = `mw-${state.installationId.replaceAll(\"-\", \"\")}`;\n // Recover a create whose response was lost. The installation ID is persisted\n // before calling the provider and survives retries/crashes.\n const { tunnels } = await client.edgeTunnel.list();\n const existing = tunnels.find(tunnel => tunnel.slug === slug);\n const tunnel = existing ?? (await client.edgeTunnel.create({ name: `Mindwire · ${hostname()}`, slug, port })).tunnel;\n if (tunnel.status !== \"active\") throw new Error(\"This computer's tunnel is disabled in Oblien.\");\n if (tunnel.port !== port) await client.edgeTunnel.update(tunnel.id, { port });\n const saved = { id: tunnel.id, url: websocketURL(tunnel.url) };\n await writeJSON(stateFile, { ...state, oblien: saved });\n return saved;\n}\n\nasync function runVisible(command: string, args: string[]): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { stdio: \"inherit\", windowsHide: true });\n child.once(\"error\", () => reject(new Error(\"Couldn't open the provider's login helper. Try again.\")));\n child.once(\"exit\", code => code === 0 ? resolve() : reject(new Error(\"Provider setup didn't finish. Your existing connection is unchanged.\")));\n });\n}\n\nasync function setupCloudflare(directory: string, stateFile: string, prompt: SetupPrompt): Promise<RelayOptions> {\n const state = (await readJSON<ProviderState>(stateFile))!;\n const domain = providerHostname(await prompt.question(\"Cloudflare hostname (for example computer.example.com): \"));\n const command = await cloudflareCommand({ cacheDir: path.join(directory, \"tools\"), onProgress: text => prompt.print(text) });\n let saved = state.cloudflare;\n if (!saved) {\n const certificates = process.env.TUNNEL_ORIGIN_CERT ? [process.env.TUNNEL_ORIGIN_CERT]\n : [path.join(homedir(), \".cloudflared\", \"cert.pem\"), path.join(homedir(), \".cloudflare-warp\", \"cert.pem\")];\n const hasLogin = (await Promise.all(certificates.map(file => fs.stat(file).then(value => value.isFile(), () => false)))).some(Boolean);\n if (!hasLogin) {\n prompt.print(\"\\nSign in to Cloudflare and select the zone for this hostname.\\nCloudflare will store its login certificate on this computer.\");\n await runVisible(command, [\"tunnel\", \"login\"]);\n } else prompt.print(\"Using your saved Cloudflare login.\");\n const name = `mindwire-${state.installationId}`;\n const credentialsFile = path.join(directory, \"providers\", \"cloudflare-tunnel.json\");\n // A interrupted setup can already have created the tunnel credentials.\n let credentials = await readJSON<{ TunnelID?: string }>(credentialsFile);\n if (!credentials?.TunnelID) {\n try {\n await execute(command, [\"tunnel\", \"create\", \"--credentials-file\", credentialsFile, name], { timeout: 60_000, maxBuffer: 65_536 });\n } catch { throw new Error(\"Cloudflare couldn't create the named tunnel. Check your account and run mindwire connection cloudflare again.\"); }\n credentials = await readJSON<{ TunnelID?: string }>(credentialsFile);\n }\n if (!credentials?.TunnelID || !/^[a-f0-9-]{36}$/i.test(credentials.TunnelID)) throw new Error(\"Cloudflare didn't save the tunnel credentials. Retry setup.\");\n await fs.chmod(credentialsFile, 0o600);\n saved = { id: credentials.TunnelID, credentialsFile };\n await writeJSON(stateFile, { ...state, cloudflare: saved });\n }\n try { await execute(command, [\"tunnel\", \"route\", \"dns\", saved.id, domain], { timeout: 60_000, maxBuffer: 65_536 }); }\n catch { throw new Error(\"Cloudflare couldn't assign this hostname. Check the zone and existing DNS record, then retry. Mindwire does not overwrite another service's DNS.\"); }\n return { kind: \"cloudflare\", url: `wss://${domain}/ssh`, cloudflareTunnelId: saved.id, cloudflareCredentialsFile: saved.credentialsFile };\n}\n\n/** Setup is explicit and serialized. Background startup only consumes the saved\n * result: it never opens a browser, changes provider, or creates another tunnel. */\nexport async function setupProvider(options: {\n directory: string; provider: ConnectionProvider; prompt: SetupPrompt;\n config?: ComputerConfig;\n}): Promise<Partial<ComputerConfig>> {\n const { directory, provider, prompt } = options;\n await fs.mkdir(path.join(directory, \"providers\"), { recursive: true, mode: 0o700 });\n const lock = await acquireProcessLock(path.join(directory, \"connection-setup.lock\"));\n try {\n const config = options.config ?? defaultComputerConfig();\n const stateFile = path.join(directory, \"computer-providers.json\");\n if (!await readJSON(stateFile)) await writeJSON(stateFile, { installationId: randomUUID() } satisfies ProviderState);\n switch (provider) {\n case \"automatic\":\n prompt.print(\"No Mindwire or Oblien account is needed. Cloudflare carries encrypted SSH traffic; the Mindwire directory helps your paired phone find this computer when its address changes. Use --directory-url or MINDWIRE_DIRECTORY_URL for a self-hosted directory.\");\n return { relay: { kind: \"cloudflare\" } };\n case \"temporary\": return { relay: { kind: \"cloudflare\" } };\n case \"vpn\": {\n prompt.print(\"Use a hostname reachable from your phone's VPN, such as your Tailscale or WireGuard network. Mindwire still checks your paired SSH keys.\");\n const host = (await prompt.question(\"Computer's VPN hostname or IP: \")).trim();\n if (!host || host.length > 255 || /[\\s/\\\\?#@]/.test(host)) throw new Error(\"Enter a valid VPN hostname or IP address.\");\n return { relay: { kind: \"none\" }, host };\n }\n case \"custom\": {\n prompt.print(`Forward WebSocket traffic to http://127.0.0.1:${config.websocketPort || 8792}. Keep your tunnel running at a persistent HTTPS hostname.`);\n return { relay: { kind: \"custom\", url: websocketURL(await prompt.question(\"Secure tunnel URL: \")) } };\n }\n case \"cloudflare\": return { relay: await setupCloudflare(directory, stateFile, prompt) };\n case \"ngrok\": {\n const url = \"https://dashboard.ngrok.com/get-started/your-authtoken\";\n prompt.print(`\\nSign in to ngrok to get this computer's authtoken:\\n${url}\\nThe token stays on this computer and is never sent to your phone.`);\n prompt.open(url);\n const token = await prompt.secret(\"ngrok authtoken (hidden): \");\n if (!token || token.length > 4096 || /\\s/.test(token)) throw new Error(\"Enter a valid ngrok authtoken.\");\n prompt.print(\"Use the dev domain or reserved domain shown at https://dashboard.ngrok.com/domains. Each computer needs its own address.\");\n const host = providerHostname(await prompt.question(\"ngrok domain: \"));\n const tokenFile = path.join(directory, \"providers\", `ngrok-${randomUUID()}.json`);\n await writeJSON(tokenFile, { token });\n return { relay: { kind: \"ngrok\", url: `wss://${host}/ssh`, ngrokTokenFile: tokenFile } };\n }\n case \"oblien\": {\n const credentialsFile = path.join(directory, \"providers\", `oblien-${randomUUID()}.json`);\n const existing = config.relay.oblienCredentialsFile && await readJSON<OblienCredentials>(config.relay.oblienCredentialsFile);\n if (existing) await writeJSON(credentialsFile, existing);\n try {\n const client = await signInOblien(credentialsFile, prompt);\n const runtime = await readJSON<{ websocketPort?: number }>(path.join(directory, \"computer-runtime.json\"));\n const tunnel = await prepareOblienTunnel(client, stateFile, runtime?.websocketPort || config.websocketPort || 8792);\n return { relay: { kind: \"oblien\", url: tunnel.url, oblienTunnelId: tunnel.id, oblienCredentialsFile: credentialsFile } };\n } catch (error) { await fs.rm(credentialsFile, { force: true }); throw error; }\n }\n }\n throw new Error(\"Unsupported connection provider.\");\n } finally { await lock?.close(); }\n}\n","import { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport { Writable } from \"node:stream\";\n\nexport interface SetupPrompt {\n question(text: string): Promise<string>;\n secret(text: string): Promise<string>;\n print(text: string): void;\n open(url: string): void;\n}\n\n/** No shell interpolation, even for a URL returned by a provider. */\nexport function openSetupURL(value: string): void {\n const url = new URL(value);\n if (url.protocol !== \"https:\" || url.username || url.password) throw new Error(\"Invalid provider login URL.\");\n const [command, args] = process.platform === \"darwin\" ? [\"open\", [url.href]] as const\n : process.platform === \"win32\" ? [\"rundll32.exe\", [\"url.dll,FileProtocolHandler\", url.href]] as const\n : [\"xdg-open\", [url.href]] as const;\n const child = spawn(command, [...args], { stdio: \"ignore\", windowsHide: true });\n child.on(\"error\", () => {}); // The printed link remains usable on headless computers.\n child.unref();\n}\n\nfunction question(text: string, hidden: boolean): Promise<string> {\n if (!process.stdin.isTTY) throw new Error(\"Connection setup needs an interactive terminal, or explicit provider options.\");\n process.stderr.write(text);\n // readline handles paste, backspace, Ctrl-C and terminal restoration. A hidden\n // answer is never echoed, logged, or passed as a process argument.\n const output = hidden ? new Writable({ write(_chunk, _encoding, done) { done(); } }) : process.stderr;\n const input = createInterface({ input: process.stdin, output, terminal: true });\n return new Promise((resolve, reject) => {\n let answered = false;\n input.once(\"SIGINT\", () => { input.close(); });\n input.once(\"close\", () => { if (!answered) reject(new Error(\"Connection setup cancelled.\")); });\n input.question(\"\", value => {\n answered = true;\n input.close();\n if (hidden) process.stderr.write(\"\\n\");\n resolve(value.trim());\n });\n });\n}\n\nexport const terminalSetupPrompt: SetupPrompt = {\n question: text => question(text, false), secret: text => question(text, true),\n print: text => { process.stderr.write(text + \"\\n\"); }, open: openSetupURL,\n};\n","import { setTimeout as delay } from \"node:timers/promises\";\nimport type { Oblien } from \"oblien\";\nimport { TunnelClient } from \"oblien\";\nimport { readJSON } from \"./lifecycle.js\";\nimport { authenticatedOblien, ProviderSignInRequired, tokenExpiry } from \"./oblien-auth.js\";\nimport { websocketURL, type RelayOptions } from \"./relay.js\";\nimport { providerFailure, providerNeedsAction, ProviderConnectionError } from \"./provider-errors.js\";\n\nexport interface RelayWorkerConfig { options: RelayOptions; port: number }\ninterface TunnelToken { token: string; connect_url: string; expires_at: string }\n\n/** Cache only the short-lived broker token. Renew early without disconnecting a\n * healthy carrier; a later reconnect uses the newest token for the same tunnel. */\nexport class OblienTunnelLease {\n private value?: TunnelToken;\n private pending?: Promise<TunnelToken>;\n constructor(private readonly tunnelId: number, private readonly client: () => Promise<Oblien>, private readonly now = Date.now) {}\n get(force = false): Promise<TunnelToken> {\n if (this.pending) return this.pending;\n const expires = this.value && (Date.parse(this.value.expires_at) || tokenExpiry(this.value.token) || 0);\n if (!force && this.value && expires! - this.now() > 5 * 60_000) return Promise.resolve(this.value);\n const pending = (async () => {\n const client = await this.client();\n const value = await client.edgeTunnel.issueToken(this.tunnelId);\n const url = new URL(value.connect_url);\n if (url.protocol !== \"wss:\" || url.username || url.password || url.hash) {\n throw new ProviderConnectionError(\"provider_configuration\", \"Oblien returned an invalid broker address.\");\n }\n const expiry = Date.parse(value.expires_at) || tokenExpiry(value.token) || 0;\n if (!value.token || expiry - this.now() < 30_000) throw new Error(\"Oblien returned a token too close to expiry. Retry shortly.\");\n this.value = value;\n return value;\n })();\n this.pending = pending;\n void pending.finally(() => { if (this.pending === pending) this.pending = undefined; }).catch(() => {});\n return pending;\n }\n}\n\nexport function relayFailureMessage(error: unknown, provider: string): string {\n return providerFailure(error, provider).message;\n}\n\nasync function runOblien(options: RelayOptions, port: number, signal: AbortSignal): Promise<void> {\n if (!options.oblienCredentialsFile || !options.oblienTunnelId || !options.url) throw new Error(\"Oblien setup is incomplete. Run mindwire connection oblien.\");\n const credentialsFile = options.oblienCredentialsFile;\n const lease = new OblienTunnelLease(options.oblienTunnelId, () => authenticatedOblien(credentialsFile));\n let failures = 0, authFailures = 0, forceToken = false;\n while (!signal.aborted) {\n let carrier: TunnelClient | undefined;\n try {\n const token = await lease.get(forceToken);\n forceToken = false;\n signal.throwIfAborted();\n carrier = new TunnelClient({ connectUrl: token.connect_url, token: token.token, localPort: port, tokenExpiresAt: token.expires_at });\n const tunnel = carrier;\n let opened = false;\n let connectionError: unknown;\n let finish!: () => void;\n const ended = new Promise<void>(resolve => { finish = resolve; });\n let endedValue = false;\n const end = () => { endedValue = true; finish(); };\n tunnel.on(\"open\", () => {\n opened = true; failures = 0; authFailures = 0;\n process.stdout.write(JSON.stringify({ event: \"relay_ready\", url: options.url }) + \"\\n\");\n });\n tunnel.on(\"disconnect\", end);\n tunnel.on(\"auth-failed\", () => { connectionError = new ProviderSignInRequired(); end(); });\n // Never forward raw SDK errors: a transport can include headers/tokens.\n tunnel.on(\"error\", error => { connectionError = error; end(); });\n const abort = () => { tunnel.close(); end(); };\n signal.addEventListener(\"abort\", abort, { once: true });\n try {\n tunnel.connect();\n const started = Date.now();\n while (!endedValue && !signal.aborted) {\n const tick = new AbortController();\n try { await Promise.race([ended, delay(opened ? 60_000 : 1000, undefined, { signal: tick.signal })]); }\n finally { tick.abort(); }\n if (!opened && Date.now() - started > 20_000) break;\n if (opened && !endedValue) {\n // A renewal outage must not close a working connection. The next\n // maintenance tick or disconnected attempt will retry the issuer.\n await lease.get().catch(() => {});\n }\n }\n if (connectionError) throw connectionError;\n } finally { signal.removeEventListener(\"abort\", abort); }\n } catch (error) {\n if (signal.aborted) return;\n const failure = providerFailure(error, \"Oblien\");\n if (failure.code === \"provider_sign_in\" && carrier && ++authFailures === 1) forceToken = true;\n else if (providerNeedsAction(failure.code)) throw failure;\n } finally { carrier?.close(); }\n if (!signal.aborted) await delay(Math.min(30_000, 1000 * 2 ** Math.min(5, failures++)), undefined, { signal });\n }\n}\n\nasync function runNgrok(options: RelayOptions, port: number, signal: AbortSignal): Promise<void> {\n if (!options.ngrokTokenFile || !options.url) throw new Error(\"ngrok setup is incomplete. Run mindwire connection ngrok.\");\n const credentials = await readJSON<{ token: string }>(options.ngrokTokenFile);\n if (!credentials?.token) throw new ProviderSignInRequired(\"ngrok\");\n const ngrok = await import(\"@ngrok/ngrok\");\n const domain = new URL(websocketURL(options.url)).hostname;\n // The official agent maintains its own heartbeats/reconnect. It forwards only\n // the loopback SSH WebSocket bridge and reuses this exact reserved domain.\n const listener = await ngrok.forward({ addr: `http://127.0.0.1:${port}`, authtoken: credentials.token, domain,\n schemes: [\"https\"], onStatusChange: () => {} });\n try {\n if (websocketURL(listener.url() ?? \"\") !== websocketURL(options.url)) throw new Error(\"ngrok returned a different address.\");\n process.stdout.write(JSON.stringify({ event: \"relay_ready\", url: options.url }) + \"\\n\");\n if (!signal.aborted) await new Promise<void>(resolve => signal.addEventListener(\"abort\", () => resolve(), { once: true }));\n } finally { await listener.close(); await ngrok.disconnect(); }\n}\n\n/** A separate owned process survives controller updates just like cloudflared.\n * It does not own the daemon, terminals, identity, or phone authorization. */\nexport async function runManagedRelay(file: string): Promise<void> {\n const config = await readJSON<RelayWorkerConfig>(file);\n if (!config || !Number.isInteger(config.port) || config.port < 1 || config.port > 65535) throw new Error(\"Invalid relay configuration.\");\n const abort = new AbortController(), stop = () => abort.abort();\n process.on(\"SIGTERM\", stop); process.on(\"SIGINT\", stop);\n try {\n if (config.options.kind === \"oblien\") await runOblien(config.options, config.port, abort.signal);\n else if (config.options.kind === \"ngrok\") await runNgrok(config.options, config.port, abort.signal);\n else throw new Error(\"Unsupported managed relay.\");\n } catch (error) {\n if (!abort.signal.aborted) {\n const failure = providerFailure(error, config.options.kind === \"oblien\" ? \"Oblien\" : \"ngrok\");\n process.stdout.write(JSON.stringify({ event: \"relay_error\", message: failure.message, code: failure.code }) + \"\\n\");\n process.exitCode = 1;\n }\n } finally { process.off(\"SIGTERM\", stop); process.off(\"SIGINT\", stop); }\n}\n","#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport { fileURLToPath } from \"node:url\";\nimport { realpathSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { createInterface } from \"node:readline/promises\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { computerPairingURI, type ComputerUpdate } from \"./computer.js\";\nimport { SDK_VERSION } from \"./version.js\";\nimport { computerClient, defaultComputerConfig, defaultStateDirectory, ensureComputer, readJSON, stopComputer, superviseComputer, type ComputerConfig } from \"./computer/lifecycle.js\";\nimport type { RelayOptions } from \"./computer/relay.js\";\nimport { showPairingInvitation, type PairingQRMode } from \"./computer/pairing-display.js\";\nimport { configureStartup, startupStatus, watchComputer } from \"./computer/startup.js\";\nimport { approvalCommand, chooseConnectionAction, choosePairingDecision, chooseStartupAction, connectionAction, deviceSummary } from \"./computer/connection-flow.js\";\nimport { ConnectionProgress } from \"./computer/connection-progress.js\";\nimport { enableAddressDiscovery, discoveryDescription } from \"./computer/discovery.js\";\nimport { connectionAddress, connectionDescription, connectionInfo } from \"./computer/provider-info.js\";\nimport { chooseProvider, connectionProvider, setupProvider } from \"./computer/provider-setup.js\";\nimport { terminalSetupPrompt } from \"./computer/setup-prompt.js\";\nimport { runManagedRelay } from \"./computer/managed-relay.js\";\nimport type { ComputerConnectionChange } from \"./computer/connection-change.js\";\n\nconst help = `Mindwire — connect this computer to your phone\n\n npm install -g mindwire\n mindwire connect Connect your phone; saved keys reconnect automatically\n mindwire reconnect Retry the saved connection\n mindwire connect pair Pair a phone, or repair a lost phone key/address\n mindwire connection Choose a persistent connection provider\n mindwire connection automatic Cloudflare traffic with encrypted Mindwire address recovery\n mindwire connection oblien Sign in and use an Oblien tunnel\n mindwire connection cloudflare Sign in and configure your Cloudflare domain\n mindwire connection ngrok Connect your ngrok account and reserved domain\n mindwire discovery enable Enable encrypted address recovery (no account)\n mindwire discovery status Check encrypted address recovery\n mindwire discovery disable Withdraw the saved address directory\n mindwire connect --relay none --host laptop.tailnet Use your existing VPN\n mindwire connect --relay none Direct SSH only (reachable network required)\n mindwire connect --relay cloudflare Cloudflare quick tunnel\n mindwire connect --relay ngrok ngrok (uses its configured account)\n mindwire connect --relay custom --relay-url wss://computer.example/ssh\n\n mindwire start Start the saved connection in the background\n mindwire startup enable|disable Manage automatic startup after computer login\n mindwire startup status Check automatic startup\n mindwire status Show connection and running service\n mindwire devices List paired phones\n mindwire revoke DEVICE_ID Disconnect and revoke one phone\n mindwire update [--version VERSION] Download a verified release; wait until idle\n mindwire stop Stop when no work or terminals are running\n\nOptions:\n --directory PATH Initial workspace directory (default: home)\n --host HOST Reachable LAN, public or VPN hostname\n --relay none|oblien|cloudflare|ngrok|custom Explicit provider (skips the setup menu)\n --relay-url URL Stable configured WebSocket hostname\n --cloudflare-token-file PATH Named Cloudflare tunnel token file\n --ngrok-token-file PATH Private JSON file containing {\"token\":\"…\"}\n --oblien-credentials-file PATH Private Oblien session/API credential JSON\n --oblien-tunnel-id ID This computer's existing Oblien tunnel ID\n --directory-url URL Directory HTTPS API URL (or MINDWIRE_DIRECTORY_URL)\n --state-dir PATH Private state directory\n --json Structured output (QR invitation includes a secret)\n --qr auto|terminal|browser Fit the QR to your terminal or open a local page\n --no-qr Print only the pairing link\n --startup Enable automatic startup without a prompt\n --no-startup Skip automatic startup setup\n --replace-device DEVICE_ID With approve: replace a lost phone key (repeatable)\n\nInteractive setup offers persistent addresses across Wi-Fi and mobile networks.\nProvider logins and tokens stay on your computer. Relays carry encrypted SSH;\nthey can see connection metadata, but cannot decrypt files, commands or chats.\nQuick Cloudflare tunnels remain available for temporary use. Direct SSH needs a reachable network or VPN.\nNothing changes your system SSH login.\n`;\n\nfunction safeName(text: string): string { return text.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \"\"); }\n\nexport async function main(args = process.argv.slice(2)): Promise<void> {\n const { values, positionals } = parseArgs({ args, allowPositionals: true, options: {\n help: { type: \"boolean\", short: \"h\" }, json: { type: \"boolean\" }, \"no-qr\": { type: \"boolean\" }, qr: { type: \"string\" },\n \"state-dir\": { type: \"string\" }, directory: { type: \"string\" }, host: { type: \"string\" },\n relay: { type: \"string\" }, \"relay-url\": { type: \"string\" }, \"cloudflare-token-file\": { type: \"string\" },\n \"ngrok-token-file\": { type: \"string\" }, \"oblien-credentials-file\": { type: \"string\" }, \"oblien-tunnel-id\": { type: \"string\" },\n \"relay-config\": { type: \"string\" },\n \"directory-url\": { type: \"string\" },\n \"daemon-bin\": { type: \"string\" }, bind: { type: \"string\" }, port: { type: \"string\" }, \"websocket-port\": { type: \"string\" },\n version: { type: \"string\" }, force: { type: \"boolean\" }, startup: { type: \"boolean\" }, \"no-startup\": { type: \"boolean\" },\n \"replace-device\": { type: \"string\", multiple: true },\n } });\n const command = positionals[0] ?? \"help\";\n if (values.help || command === \"help\") { process.stdout.write(help); return; }\n if (values.qr && ![\"auto\", \"terminal\", \"browser\"].includes(values.qr)) throw new Error(\"Choose --qr auto, terminal or browser.\");\n if (values.startup && values[\"no-startup\"]) throw new Error(\"Choose either --startup or --no-startup.\");\n const directory = path.resolve(values[\"state-dir\"] ?? defaultStateDirectory());\n const discoveryOptions = { url: values[\"directory-url\"] };\n const emit = (event: string, data: object = {}, text?: string) => {\n if (values.json) process.stdout.write(JSON.stringify({ event, ...data }) + \"\\n\");\n else if (text) process.stdout.write(text + \"\\n\");\n };\n if (command === \"_serve\") { await superviseComputer(directory); return; }\n if (command === \"_relay\") {\n if (!values[\"relay-config\"]) throw new Error(\"Missing relay configuration.\");\n await runManagedRelay(path.resolve(values[\"relay-config\"])); return;\n }\n if (command === \"_watch\") { await watchComputer(directory, fileURLToPath(import.meta.url)); return; }\n if (command === \"startup\") {\n const action = positionals[1] ?? \"status\";\n if (![\"enable\", \"disable\", \"status\"].includes(action)) throw new Error(\"Use mindwire startup enable, disable or status.\");\n const state = action === \"status\" ? await startupStatus(directory)\n : await configureStartup(directory, fileURLToPath(import.meta.url), action === \"enable\");\n emit(\"startup\", state, state.enabled ? \"Mindwire starts after you sign in to this computer and recovers automatically.\"\n : \"Automatic startup is off. Use mindwire start to run the service.\");\n return;\n }\n if (command === \"discovery\") {\n const action = positionals[1] ?? \"status\";\n if (![\"enable\", \"disable\", \"status\"].includes(action)) throw new Error(\"Use mindwire discovery enable, disable or status.\");\n const client = action === \"status\" ? await computerClient(directory)\n : await ensureComputer(directory, fileURLToPath(import.meta.url), {}, undefined, { waitForRoutes: false });\n const status = action === \"enable\"\n ? await enableAddressDiscovery({ directory, computer: client, prompt: terminalSetupPrompt, ...discoveryOptions })\n : action === \"disable\" ? await client.computer.configureDiscovery(false) : await client.computer.discovery();\n emit(\"discovery\", status, discoveryDescription(status));\n if (action === \"enable\") emit(\"discovery_hint\", {}, \"Open each saved phone once while its current address works. Pair new phones with mindwire connect pair.\");\n return;\n }\n if ([\"connect\", \"start\", \"reconnect\", \"connection\"].includes(command)) {\n let requestedAction = command === \"reconnect\" ? \"reconnect\" as const : command === \"connect\" ? connectionAction(positionals[1]) : undefined;\n let automaticDiscovery = false, addressChanged = false;\n const patch: Partial<ComputerConfig> = {};\n const previous = await readJSON<ComputerConfig>(path.join(directory, \"computer-config.json\"));\n if (values.directory) patch.directory = path.resolve(values.directory);\n if (values.host) patch.host = values.host;\n if (values.bind) patch.bind = values.bind;\n for (const [flag, field] of [[\"port\", \"sshPort\"], [\"websocket-port\", \"websocketPort\"]] as const) {\n if (values[flag] !== undefined) {\n const n = Number(values[flag]);\n if (!Number.isInteger(n) || n < 0 || n > 65535) throw new Error(`Invalid --${flag}.`);\n patch[field] = n;\n }\n }\n if (values[\"daemon-bin\"] || process.env.MINDWIRE_DAEMON) patch.daemonBin = path.resolve(values[\"daemon-bin\"] ?? process.env.MINDWIRE_DAEMON!);\n if (values.version) patch.version = values.version.replace(/^v/, \"\");\n if (values.relay || values[\"relay-url\"] || values[\"cloudflare-token-file\"] || values[\"ngrok-token-file\"] || values[\"oblien-credentials-file\"]) {\n const kind = values.relay ?? \"custom\";\n if (![\"none\", \"oblien\", \"cloudflare\", \"ngrok\", \"custom\"].includes(kind)) throw new Error(\"Choose relay none, oblien, cloudflare, ngrok or custom.\");\n const tunnelId = values[\"oblien-tunnel-id\"] === undefined ? undefined : Number(values[\"oblien-tunnel-id\"]);\n if (tunnelId !== undefined && (!Number.isSafeInteger(tunnelId) || tunnelId <= 0)) throw new Error(\"Invalid Oblien tunnel ID.\");\n patch.relay = { kind: kind as RelayOptions[\"kind\"], url: values[\"relay-url\"],\n cloudflareTokenFile: values[\"cloudflare-token-file\"] ? path.resolve(values[\"cloudflare-token-file\"]) : undefined,\n ngrokTokenFile: values[\"ngrok-token-file\"] ? path.resolve(values[\"ngrok-token-file\"]) : undefined,\n oblienCredentialsFile: values[\"oblien-credentials-file\"] ? path.resolve(values[\"oblien-credentials-file\"]) : undefined,\n oblienTunnelId: tunnelId };\n }\n const interactive = !values.json && !!process.stdin.isTTY;\n const needsSetup = command === \"connection\" || command === \"connect\" && !previous && !patch.relay && interactive\n || patch.relay?.kind === \"oblien\" && !patch.relay.oblienCredentialsFile;\n if (needsSetup) {\n const selected = command === \"connection\" && positionals[1] ? connectionProvider(positionals[1]) : undefined;\n if (!interactive && selected !== \"automatic\" && selected !== \"temporary\")\n throw new Error(\"Run mindwire connection in an interactive terminal, or supply the provider's saved URL and credential-file options.\");\n const provider = selected ?? (patch.relay?.kind === \"oblien\" ? \"oblien\" : await chooseProvider(terminalSetupPrompt));\n automaticDiscovery = provider === \"automatic\";\n Object.assign(patch, await setupProvider({ directory, provider, prompt: terminalSetupPrompt,\n config: { ...defaultComputerConfig(), ...previous, ...patch } }));\n if (!previous || connectionAddress(patch.relay ?? previous.relay, patch.host ?? previous.host)\n !== connectionAddress(previous.relay, previous.host)) addressChanged = true;\n }\n // Enroll before replacing a working provider. An unavailable directory must\n // not turn an existing connected computer into an unreachable one.\n if (automaticDiscovery && previous) {\n const running = await ensureComputer(directory, fileURLToPath(import.meta.url), {}, undefined, { waitForRoutes: false });\n await enableAddressDiscovery({ directory, computer: running, prompt: terminalSetupPrompt, ...discoveryOptions });\n }\n const progress = !values.json && process.stderr.isTTY && process.env.TERM !== \"dumb\" ? new ConnectionProgress(process.stderr) : undefined;\n emit(\"starting\", {}, progress ? undefined : \"Starting Mindwire…\");\n const client = await ensureComputer(directory, fileURLToPath(import.meta.url), patch, phase => {\n if (progress) progress.update(phase);\n else emit(\"progress\", { message: phase }, phase);\n }).finally(() => progress?.close());\n if (automaticDiscovery && !previous) await enableAddressDiscovery({ directory, computer: client, prompt: terminalSetupPrompt, ...discoveryOptions });\n const info = await client.computer.info();\n const savedConfig = await readJSON<ComputerConfig>(path.join(directory, \"computer-config.json\"));\n const connection = connectionInfo(savedConfig?.relay ?? { kind: \"cloudflare\" }, savedConfig?.host);\n emit(\"ready\", { computerId: info.computerId, routes: info.routes, connection }, \"Mindwire is running in the background.\");\n emit(\"connection\", connection, connectionDescription(connection));\n if (command === \"start\") return;\n if (info.routes.some(route => route.kind === \"websocket\")) {\n emit(\"secure_connection\", {}, \"Your phone connects over end-to-end encrypted SSH. The tunnel carries encrypted traffic; only phones you approve can connect.\");\n }\n const devices = await client.computer.devices();\n const saved = devices.filter(device => !device.revoked);\n if (addressChanged && !saved.some(device => device.addressRecovery)) requestedAction = \"pair\";\n if (info.discovery?.enabled) emit(\"discovery\", info.discovery, discoveryDescription(info.discovery));\n if (saved.length) emit(\"saved_devices\", { devices: saved }, `\\nSaved approvals on this computer\\n${deviceSummary(saved)}`);\n const question = !values.json && process.stdin.isTTY ? async (prompt: string): Promise<string> => {\n const input = createInterface({ input: process.stdin, output: process.stderr });\n try { return await input.question(prompt); } finally { input.close(); }\n } : undefined;\n const action = await chooseConnectionAction({ requested: requestedAction, devices, persistent: connection.address === \"persistent\" });\n const startupPreference = await startupStatus(directory);\n const startupAction = await chooseStartupAction({ state: startupPreference,\n startup: values.startup, noStartup: values[\"no-startup\"],\n question: action === \"pair\" && saved.length === 0 ? question : undefined });\n if (startupAction !== undefined) {\n try {\n const startup = await configureStartup(directory, fileURLToPath(import.meta.url), startupAction);\n emit(\"startup\", startup, startup.enabled\n ? \"Automatic startup enabled. Saved phones can reconnect after you sign in to this computer.\"\n : \"Automatic startup is off. Run mindwire connect after restarting, or mindwire startup enable to change this.\");\n } catch {\n emit(\"startup_unavailable\", {}, \"Mindwire is running, but startup setup didn't complete. Run mindwire startup enable to check your system's startup service.\");\n }\n } else {\n emit(\"startup\", startupPreference, startupPreference.enabled\n ? \"Automatic startup is on. Change it with mindwire startup disable.\"\n : \"Automatic startup is off. Enable it with mindwire startup enable.\");\n }\n if (action === \"resume\") {\n const connected = saved.filter(device => device.connected);\n if (connected.length) emit(\"connected\", { computerId: info.computerId, devices: connected }, `\\nConnected:\\n${deviceSummary(connected)}\\nMindwire continues running in the background.`);\n else emit(\"waiting_for_phone\", { computerId: info.computerId }, \"\\nReady for your saved phone. Open Mindwire; it will retry this computer's saved connection.\");\n emit(\"connect_hint\", {}, \"If the connection was removed from your phone, run mindwire connect pair to scan again.\");\n return;\n }\n const invitation = await client.computer.invite((await client.computer.info()).routes);\n const uri = computerPairingURI(invitation);\n emit(\"invitation\", { invitation, uri });\n const display = values.json ? undefined : await showPairingInvitation(invitation, {\n mode: values[\"no-qr\"] ? \"none\" : (values.qr ?? \"auto\") as PairingQRMode,\n });\n try {\n let shownRequest: string | undefined;\n let authorized = false;\n while (Date.now() < Date.parse(invitation.expiresAt)) {\n const pairing = await client.computer.pairing(invitation.pairingId);\n if (pairing.status === \"waiting\" && requestedAction !== \"pair\" && requestedAction !== \"reconnect\") {\n const connected = (await client.computer.devices()).filter(device => !device.revoked && device.connected);\n if (connected.length && ((info.pairingVersion ?? 0) < 2 || (await client.computer.closeUnusedPairing(invitation.pairingId)).cancelled)) {\n display?.close();\n emit(\"connected\", { computerId: info.computerId, devices: connected }, `Connected:\\n${deviceSummary(connected)}\\nMindwire continues running in the background.`);\n return;\n }\n }\n if (pairing.status === \"approved\") {\n display?.close();\n if (pairing.completed) {\n emit(\"paired\", { computerId: info.computerId, completed: true }, \"Phone connected and saved. You can close this terminal; Mindwire keeps running.\");\n return;\n }\n if (!authorized) {\n authorized = true;\n emit(\"authorized\", {}, \"Phone approved. Keep Mindwire open on your phone while it saves the connection…\");\n }\n await delay(750);\n continue;\n }\n if (pairing.status === \"rejected\") { display?.close(); emit(\"rejected\", {}, \"Pairing declined.\"); return; }\n if (pairing.request && shownRequest !== pairing.request.id) {\n display?.close();\n shownRequest = pairing.request.id;\n const key = Buffer.from(pairing.request.publicKey.split(\" \")[1] ?? \"\", \"base64\");\n const fingerprint = \"SHA256:\" + createHash(\"sha256\").update(key).digest(\"base64\").replace(/=+$/, \"\");\n const deviceId = createHash(\"sha256\").update(key).digest(\"base64url\");\n const replacements = (info.pairingVersion ?? 0) >= 2 ? (await client.computer.devices()).filter(device =>\n !device.revoked && device.id !== deviceId && device.name === pairing.request!.name) : [];\n emit(\"approval_required\", { pairingId: invitation.pairingId, request: pairing.request, fingerprint, replacements },\n `\\n${safeName(pairing.request.name)} wants to connect.\\nDevice key: ${fingerprint}\\nAccess: files and commands as your computer account.`);\n if (!question) {\n const command = approvalCommand(invitation.pairingId, pairing.request.id);\n emit(\"approval_command\", { command }, `Review this device, then run:\\n${command}`);\n } else {\n const decision = await choosePairingDecision({ replacements, question });\n await client.computer.decide(invitation.pairingId, pairing.request.id, decision.approve,\n decision.replaceDeviceIds ? { replaceDeviceIds: decision.replaceDeviceIds } : {});\n }\n }\n await delay(750);\n }\n throw new Error(authorized\n ? \"The phone was approved but did not finish saving. Run mindwire connect and scan again; its saved key will be reused.\"\n : \"Connection code expired. Run mindwire connect to show a new QR code.\");\n } finally { display?.close(); }\n }\n if (command === \"stop\") { await stopComputer(directory, values.force === true); emit(\"stopped\", {}, \"Mindwire stopped.\"); return; }\n const client = await computerClient(directory);\n switch (command) {\n case \"status\": {\n const [info, health, work, controller, startup, config, change] = await Promise.all([client.computer.info(), client.health(), client.service.updateStatus(),\n readJSON<{ error?: string; errorCode?: string; phase?: string; recovering?: boolean }>(path.join(directory, \"computer-controller.json\")), startupStatus(directory),\n readJSON<ComputerConfig>(path.join(directory, \"computer-config.json\")), readJSON<ComputerConnectionChange>(path.join(directory, \"computer-connection-change.json\"))]);\n const connection = info.connection ?? (config && connectionInfo(config.relay, config.host));\n const connectionChange = change && { status: change.status, message: change.message };\n emit(\"status\", { ...info, connection, daemonVersion: health.version, ...work, startup, connectionChange,\n recovering: controller?.recovering, relayError: controller?.error, relayErrorCode: controller?.errorCode },\n `Mindwire ${health.version} · ${work.idle ? \"idle\" : \"working\"}\\nStartup: ${startup.enabled ? \"on\" : \"off\"}\\n${connection ? connectionDescription(connection) + \"\\n\" : \"\"}${info.routes.map(route => route.kind === \"ssh\" ? `SSH ${route.host}:${route.port}` : route.url).join(\"\\n\")}${controller?.error ? `\\n${controller.error}` : \"\"}${change && change.status !== \"complete\" ? `\\nConnection change: ${change.status}${change.message ? \" · \" + change.message : \"\"}` : \"\"}`);\n if (info.discovery?.enabled && !values.json) emit(\"discovery\", info.discovery, discoveryDescription(info.discovery));\n break;\n }\n case \"devices\": {\n const devices = await client.computer.devices();\n emit(\"devices\", { devices }, devices.length ? devices.map(d => `${safeName(d.name)} ${d.id}${d.revoked ? \" (revoked)\" : \"\"}`).join(\"\\n\") : \"No paired phones yet. Run mindwire connect.\");\n break;\n }\n case \"revoke\": {\n if (!positionals[1]) throw new Error(\"Use mindwire revoke DEVICE_ID (from mindwire devices).\");\n await client.computer.revoke(positionals[1]); emit(\"revoked\", {}, \"Device revoked and disconnected.\"); break;\n }\n case \"approve\": case \"reject\": {\n if (!positionals[1] || !positionals[2]) throw new Error(`Use mindwire ${command} PAIRING_ID REQUEST_ID.`);\n await client.computer.decide(positionals[1], positionals[2], command === \"approve\",\n values[\"replace-device\"] ? { replaceDeviceIds: values[\"replace-device\"] } : {});\n emit(command, {}, command === \"approve\" ? \"Phone approved. Waiting for it to save the connection.\" : \"Phone declined.\"); break;\n }\n case \"update\": {\n const version = (values.version ?? SDK_VERSION).replace(/^v/, \"\");\n const health = await client.health();\n if (health.version.replace(/^v/, \"\") === version) { emit(\"updated\", { version }, `Mindwire ${version} is already installed.`); return; }\n const requested = await client.computer.requestUpdate(version);\n emit(\"update_queued\", requested, \"Update queued. It will wait until all work and terminals are finished.\");\n let last = \"\";\n for (;;) {\n const update = await readJSON<ComputerUpdate>(path.join(directory, \"computer-update.json\"));\n if (update?.id !== requested.id) throw new Error(\"The update request changed. Run mindwire status.\");\n if (update.status !== last) { last = update.status; emit(\"update\", update, `Update: ${update.status}`); }\n if (update.status === \"complete\") return;\n if (update.status === \"failed\") throw new Error(update.error ?? \"Update failed.\");\n await delay(750);\n }\n }\n default: throw new Error(`Unknown command ${command}. Run mindwire --help.`);\n }\n}\n\nfunction isCLIEntry(): boolean {\n if (!process.argv[1]) return false;\n try {\n // npm links its bin command: argv keeps the link, while ESM resolves the module.\n return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));\n } catch {\n // Importing the CLI from an eval or another program must not start a service.\n return false;\n }\n}\n\nif (isCLIEntry()) {\n void main().catch(error => {\n const message = error instanceof Error ? error.message : String(error);\n if (process.argv.includes(\"--json\")) process.stderr.write(JSON.stringify({ event: \"error\", message }) + \"\\n\");\n else process.stderr.write(`Mindwire: ${message}\\n`);\n process.exitCode = 1;\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/computer/pairing-display.ts","../src/computer/startup.ts","../src/computer/connection-flow.ts","../src/computer/connection-progress.ts","../src/computer/oblien-auth.ts","../src/computer/provider-setup.ts","../src/computer/terminal-ui.ts","../src/computer/setup-prompt.ts","../src/computer/managed-relay.ts","../src/computer/inspection.ts","../src/computer/dashboard.ts","../src/computer/desktop.ts","../src/cli.ts"],"names":["resolve","delay","safeName","path2","homedir","client","rm","execute","promisify","execFile","randomUUID","tunnel","saved","spawn","path3","fs2","createInterface","join","hostname","run","device","readFile","path4","path5","question","createHash","command"],"mappings":"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","file":"cli.js","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdtempSync, chmodSync, writeFileSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { computerPairingQRData, computerPairingURI, type ComputerConnectionCode } from \"../computer.js\";\n\nexport type PairingQRMode = \"auto\" | \"terminal\" | \"browser\" | \"none\";\ntype Output = Pick<NodeJS.WriteStream, \"isTTY\" | \"columns\" | \"rows\" | \"write\" | \"on\" | \"off\">;\ninterface DisplayOptions {\n mode?: PairingQRMode;\n output?: Output;\n environment?: NodeJS.ProcessEnv;\n openBrowser?: (url: string) => Promise<boolean>;\n}\nexport interface PairingDisplay { close(): void }\n\nconst enterScreen = \"\\x1b[?1049h\\x1b[?25l\";\nconst leaveScreen = \"\\x1b[0m\\x1b[?25h\\x1b[?1049l\";\nconst clearScreen = \"\\x1b[H\\x1b[2J\";\nfunction scanInstruction(invitation: ComputerConnectionCode): string {\n return \"mode\" in invitation && invitation.mode === \"reconnect\"\n ? \"Workspaces → your computer → Reconnect Computer → Scan Connection Code\"\n : \"Mindwire → Add computer → Scan QR code\";\n}\n\n/** qrcode's small terminal renderer ignores margin/width. Render its matrix with\n * a four-module quiet zone, two square QR modules per terminal character. */\nexport async function createPairingQR(invitation: ComputerConnectionCode) {\n const QR = await import(\"qrcode\");\n const data = computerPairingQRData(invitation);\n const options = { errorCorrectionLevel: \"L\" as const, margin: 4 };\n const { modules } = QR.create(data, options);\n const width = modules.size + options.margin * 2;\n const black = (x: number, y: number): boolean => x >= 0 && y >= 0 && x < modules.size && y < modules.size\n && !!modules.data[y * modules.size + x];\n const lines: string[] = [];\n for (let y = -options.margin; y < modules.size + options.margin; y += 2) {\n let line = \"\";\n for (let x = -options.margin; x < modules.size + options.margin; x++) {\n const top = black(x, y), bottom = black(x, y + 1);\n line += top ? (bottom ? \"█\" : \"▀\") : (bottom ? \"▄\" : \" \");\n }\n // Explicit bright white background; a terminal's dark theme must not invert the QR.\n lines.push(\"\\x1b[30;107m\" + line + \"\\x1b[0m\");\n }\n const svg = await QR.toString(data, { ...options, type: \"svg\" });\n // Leave one column for auto-wrap and rows for instructions and the cursor.\n return { lines, columns: Math.max(width, scanInstruction(invitation).length) + 1, rows: lines.length + 5, svg };\n}\n\nfunction escapeHTML(value: string): string {\n return value.replace(/[&<>\"']/g, ch => ({ \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\", \"'\": \"'\" })[ch]!);\n}\n\nfunction browserPage(invitation: ComputerConnectionCode, svg: string): string {\n const reconnect = \"mode\" in invitation && invitation.mode === \"reconnect\";\n const title = reconnect ? \"Reconnect your phone\" : \"Connect your phone\";\n return `<!doctype html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; base-uri 'none'; form-action 'none'\">\n<title>${title} · Mindwire</title>\n<style>\n*{box-sizing:border-box}body{margin:0;background:#141416;color:#f5f5f7;font:16px/1.5 system-ui,sans-serif}\nmain{width:min(100% - 40px,520px);margin:32px auto;text-align:center}small{color:#a6a6af;letter-spacing:.16em}\nh1{font-size:28px;letter-spacing:-.04em;line-height:1.2;margin:16px 0 6px}p{color:#b7b7bf;margin:8px 0;overflow-wrap:anywhere}\n.code{width:min(100%,480px);margin:24px auto 16px;background:#fff;border-radius:16px;padding:8px}\nsvg{display:block;width:100%;height:auto}.steps{margin:20px 0}.steps p{color:#e1e1e6}\nbutton{font:inherit;font-weight:600;color:#f5f5f7;border:1px solid #45454b;background:#252528;border-radius:10px;padding:10px 18px;cursor:pointer}\nbutton:disabled{opacity:.45;cursor:default}button:focus-visible{outline:3px solid #a4b8ef;outline-offset:3px}\ntextarea{width:100%;margin-top:12px;padding:8px;color:inherit;background:#252528;border:1px solid #45454b;border-radius:8px}\n[hidden]{display:none!important}#expiry{font-size:14px}footer{font-size:13px;color:#93939d;margin:18px 0}\n</style></head><body><main>\n<small>MINDWIRE</small><h1>${title}</h1><p>${escapeHTML(invitation.name)}</p>\n<div class=\"code\" id=\"code\" role=\"img\" aria-label=\"Mindwire connection QR code\">${svg}</div>\n<p id=\"expiry\" data-expires=\"${escapeHTML(invitation.expiresAt)}\" aria-live=\"off\"></p>\n<div class=\"steps\"><p>${reconnect\n ? \"In Mindwire, open your computer in <strong>Workspaces</strong>, then <strong>Reconnect Computer → Scan Connection Code</strong>.\"\n : \"In Mindwire, open <strong>Add computer</strong> and scan.\"}</p>\n<p>${reconnect ? \"Your saved pairing and workspace stay the same. No new approval is needed.\" : \"Saved keys reconnect automatically. Approve on this computer only if asked.\"}</p></div>\n<button type=\"button\" id=\"copy\">Copy ${reconnect ? \"reconnect\" : \"pairing\"} link</button>\n<textarea id=\"link\" readonly hidden aria-label=\"Pairing link\">${escapeHTML(computerPairingURI(invitation))}</textarea>\n<footer>You can close this page after ${reconnect ? \"reconnecting\" : \"pairing\"}.</footer>\n</main><script>\nconst expiry=document.getElementById('expiry'),code=document.getElementById('code'),copy=document.getElementById('copy'),link=document.getElementById('link');\nfunction tick(){const seconds=Math.max(0,Math.ceil((Date.parse(expiry.dataset.expires)-Date.now())/1000));\nif(!seconds){code.remove();copy.disabled=true;link.value='';link.hidden=true;expiry.textContent='Code expired. Run mindwire connect for a new code.';return;}\nexpiry.textContent='Expires in '+Math.floor(seconds/60)+':'+String(seconds%60).padStart(2,'0');}\ntick();setInterval(tick,1000);\ncopy.addEventListener('click',async()=>{try{await navigator.clipboard.writeText(link.value);copy.textContent='Copied';}\ncatch{link.hidden=false;link.focus();link.select();copy.textContent='Select and copy the link';}});\n</script></body></html>`;\n}\n\nasync function openBrowser(url: string): Promise<boolean> {\n const [command, args]: [string, string[]] = process.platform === \"darwin\" ? [\"open\", [url]]\n : process.platform === \"win32\" ? [\"rundll32.exe\", [\"url.dll,FileProtocolHandler\", url]] : [\"xdg-open\", [url]];\n return new Promise(resolve => {\n const child = spawn(command, args, { stdio: \"ignore\", windowsHide: true });\n const finish = (ok: boolean) => { clearTimeout(timer); resolve(ok); };\n const timer = setTimeout(() => { child.kill(); finish(false); }, 5000);\n child.once(\"error\", () => finish(false));\n child.once(\"exit\", code => finish(code === 0));\n });\n}\n\n/** Display one existing invitation. Resizing never starts another service or pairing. */\nexport async function showPairingInvitation(invitation: ComputerConnectionCode, options: DisplayOptions = {}): Promise<PairingDisplay> {\n const reconnect = \"mode\" in invitation && invitation.mode === \"reconnect\";\n const instruction = scanInstruction(invitation);\n const nextStep = reconnect ? \"Scan with a saved phone.\" : \"Approve on this computer only if asked.\";\n const waiting = reconnect ? \"Your saved pairing stays the same.\" : \"Waiting for your phone…\";\n const command = \"mindwire connect\";\n const output = options.output ?? process.stdout;\n const environment = options.environment ?? process.env;\n const mode = options.mode ?? \"auto\";\n const interactive = !!output.isTTY && environment.TERM !== \"dumb\";\n const linkOnly = mode === \"none\" || (!interactive && mode !== \"browser\");\n if (linkOnly) {\n const destination = reconnect ? \"Workspaces → your computer → Reconnect Computer\" : \"Add computer\";\n output.write(`Paste this link in Mindwire → ${destination} (expires in 5 minutes):\\n${computerPairingURI(invitation)}\\n\\n${waiting}\\n`);\n return { close() {} };\n }\n\n const qr = await createPairingQR(invitation);\n const useScreen = interactive && mode !== \"browser\";\n let closed = false, pageDirectory: string | undefined;\n let browser: \"idle\" | \"opening\" | \"opened\" | \"failed\" = \"idle\";\n let pageURL: string | undefined;\n let browserAttempt: Promise<void> | undefined;\n const fits = () => (output.columns ?? 0) >= qr.columns && (output.rows ?? 0) >= qr.rows;\n const draw = () => {\n if (closed || !useScreen) return;\n let lines: string[];\n if (fits()) {\n lines = [instruction, \"\", ...qr.lines, \"\", waiting];\n } else {\n const size = `Terminal QR needs ${qr.columns} columns × ${qr.rows} rows.`;\n lines = browser === \"opened\" ? [\"QR opened in your browser.\", instruction, nextStep]\n : browser === \"opening\" ? [\"Opening a resizable QR in your browser…\", nextStep]\n : browser === \"failed\" ? [\"Couldn't open a browser here.\", size, \"Enlarge this terminal, or run:\", `${command} --no-qr`]\n : [size, \"Enlarge this terminal, or use --qr browser.\"];\n // Tiny windows may clip instructions; they must never wrap a QR or scroll the display.\n lines = lines.map(line => line.slice(0, Math.max(0, (output.columns ?? 80) - 1)))\n .slice(0, Math.max(0, (output.rows ?? 24) - 1));\n }\n output.write(clearScreen + lines.join(\"\\r\\n\"));\n };\n const ensureBrowser = (): Promise<void> => {\n if (browserAttempt) return browserAttempt;\n browser = \"opening\";\n draw();\n browserAttempt = (async () => {\n try {\n pageDirectory = mkdtempSync(join(tmpdir(), \"mindwire-pair-\"));\n chmodSync(pageDirectory, 0o700);\n const file = join(pageDirectory, \"pair.html\");\n writeFileSync(file, browserPage(invitation, qr.svg), { mode: 0o600 });\n pageURL = pathToFileURL(file).href;\n // An SSH session's browser would be on the remote machine. Keep auto mode local.\n const remoteShell = !!(environment.SSH_CONNECTION || environment.SSH_CLIENT || environment.SSH_TTY);\n const opened = (mode === \"browser\" || !remoteShell) && await (options.openBrowser ?? openBrowser)(pageURL);\n browser = opened ? \"opened\" : \"failed\";\n } catch {\n browser = \"failed\";\n }\n if (closed) return;\n if (useScreen) draw();\n else output.write(browser === \"opened\"\n ? `QR opened in your browser.\\n${instruction}\\n${nextStep}\\n`\n : `Open this local QR page in a browser:\\n${pageURL ?? `Page unavailable. Run ${command} --no-qr for a link.`}\\n\\n${waiting}\\n`);\n })();\n return browserAttempt;\n };\n const resize = () => {\n draw();\n if (!closed && mode === \"auto\" && !fits()) void ensureBrowser();\n };\n const close = () => {\n if (closed) return;\n closed = true;\n output.off(\"resize\", resize);\n process.off(\"exit\", close);\n process.off(\"SIGINT\", interrupt);\n process.off(\"SIGTERM\", terminate);\n process.off(\"SIGHUP\", hangup);\n if (useScreen) output.write(leaveScreen);\n if (pageDirectory) {\n try { rmSync(pageDirectory, { recursive: true, force: true }); } catch { /* Best effort on process exit. */ }\n }\n };\n const interrupt = () => { close(); process.exit(130); };\n const terminate = () => { close(); process.exit(143); };\n const hangup = () => { close(); process.exit(129); };\n process.once(\"exit\", close);\n process.once(\"SIGINT\", interrupt);\n process.once(\"SIGTERM\", terminate);\n process.once(\"SIGHUP\", hangup);\n if (useScreen) {\n output.write(enterScreen);\n output.on(\"resize\", resize);\n draw();\n }\n try {\n if (mode === \"browser\" || (mode === \"auto\" && !fits())) await ensureBrowser();\n return { close };\n } catch (error) {\n close();\n throw error;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { CONTROLLER_PROTOCOL, ensureComputer, readJSON, writeJSON, type ControllerState } from \"./lifecycle.js\";\nimport { SDK_VERSION, versionAtLeast } from \"../version.js\";\nimport { currentProcessIdentity, processStateAlive, type ProcessState } from \"./process.js\";\nimport { acquireProcessLock } from \"./lock.js\";\n\nconst execute = promisify(execFile);\ntype Command = [string, ...string[]];\nexport interface StartupPlan {\n kind: \"launchd\" | \"systemd\" | \"task-scheduler\";\n name: string; file: string; content: string;\n query: Command; enable: Command[]; disable: Command[];\n}\nexport interface StartupState { enabled: boolean; running?: boolean; registered?: boolean; kind?: StartupPlan[\"kind\"]; name?: string; file?: string }\nconst xml = (value: string) => value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\");\nconst systemd = (value: string, expandEnvironment = false) => '\"' + value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/%/g, \"%%\")\n .replace(/\\$/g, () => expandEnvironment ? \"$$\" : \"$\") + '\"';\nconst windowsArg = (value: string) => '\"' + value.replace(/(\\\\*)\"/g, '$1$1\\\\\"').replace(/(\\\\+)$/g, \"$1$1\") + '\"';\n\n/** Homebrew resolves execPath to a versioned Cellar file. Prefer a stable alias\n * only after verifying it points at this exact interpreter. Never run a different\n * executable just because it appeared first on PATH. */\nexport async function startupExecutable(executable = process.execPath, environmentPath = process.env.PATH ?? \"\"): Promise<string> {\n const homebrew = executable.match(/^(.*)\\/Cellar\\/([^/]+)\\/[^/]+\\/(.+)$/);\n const candidates = [\n ...(homebrew ? [`${homebrew[1]}/opt/${homebrew[2]}/${homebrew[3]}`] : []),\n ...environmentPath.split(path.delimiter).filter(part => path.isAbsolute(part)).map(part => path.join(part, path.basename(executable))),\n ];\n const target = await fs.realpath(executable);\n for (const candidate of candidates) {\n if (candidate !== executable && await fs.realpath(candidate).catch(() => undefined) === target) return candidate;\n }\n return executable;\n}\n\n/** Per-user startup, with no root service, password, or copied pairing secret. */\nexport function startupPlan(options: {\n directory: string; cliPath: string; executable?: string; platform?: NodeJS.Platform;\n home?: string; uid?: number; user?: string; environmentPath?: string;\n}): StartupPlan {\n const { directory, cliPath } = options;\n const executable = options.executable ?? process.execPath, home = options.home ?? homedir();\n const platform = options.platform ?? process.platform;\n const environmentPath = options.environmentPath ?? process.env.PATH ?? path.dirname(executable);\n for (const value of [directory, cliPath, executable, home, environmentPath]) {\n if (/[\\r\\n\\x00]/.test(value)) throw new Error(\"Startup paths cannot contain control characters.\");\n }\n const id = createHash(\"sha256\").update(directory).digest(\"hex\").slice(0, 12);\n const name = `sh.mindwire.computer.${id}`;\n const args = [cliPath, \"_watch\", \"--state-dir\", directory];\n if (platform === \"darwin\") {\n const domain = `gui/${options.uid ?? process.getuid?.()}`;\n const file = path.join(home, \"Library\", \"LaunchAgents\", name + \".plist\");\n return { kind: \"launchd\", name, file,\n content: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\"><dict>\n<key>Label</key><string>${name}</string>\n<key>ProgramArguments</key><array>${[executable, ...args].map(v => `<string>${xml(v)}</string>`).join(\"\")}</array>\n<key>WorkingDirectory</key><string>${xml(home)}</string>\n<key>EnvironmentVariables</key><dict><key>PATH</key><string>${xml(environmentPath)}</string></dict>\n<key>RunAtLoad</key><true/><key>KeepAlive</key><true/>\n<key>ThrottleInterval</key><integer>10</integer>\n<key>StandardOutPath</key><string>${xml(path.join(directory, \"startup.log\"))}</string>\n<key>StandardErrorPath</key><string>${xml(path.join(directory, \"startup.log\"))}</string>\n</dict></plist>\n`, query: [\"launchctl\", \"print\", `${domain}/${name}`],\n enable: [[\"launchctl\", \"enable\", `${domain}/${name}`], [\"launchctl\", \"bootstrap\", domain, file]],\n disable: [[\"launchctl\", \"bootout\", `${domain}/${name}`]] };\n }\n if (platform === \"linux\") {\n const file = path.join(home, \".config\", \"systemd\", \"user\", name + \".service\");\n return { kind: \"systemd\", name, file,\n content: `[Unit]\nDescription=Mindwire computer connection\nAfter=network-online.target\n[Service]\nType=simple\nExecStart=${[executable, ...args].map(value => systemd(value, true)).join(\" \")}\nWorkingDirectory=${systemd(home)}\nEnvironment=${systemd(\"PATH=\" + environmentPath)}\nRestart=always\nRestartSec=10\nKillMode=process\n[Install]\nWantedBy=default.target\n`, query: [\"systemctl\", \"--user\", \"is-active\", name + \".service\"],\n enable: [[\"systemctl\", \"--user\", \"daemon-reload\"], [\"systemctl\", \"--user\", \"enable\", \"--now\", name + \".service\"]],\n disable: [[\"systemctl\", \"--user\", \"disable\", \"--now\", name + \".service\"], [\"systemctl\", \"--user\", \"daemon-reload\"]] };\n }\n if (platform === \"win32\") {\n if (!options.user) throw new Error(\"Couldn't determine the Windows user for startup.\");\n const file = path.join(directory, \"startup-task.xml\");\n return { kind: \"task-scheduler\", name, file,\n content: `<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<Task version=\"1.2\" xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n<Triggers><LogonTrigger><Enabled>true</Enabled><UserId>${xml(options.user)}</UserId></LogonTrigger></Triggers>\n<Principals><Principal id=\"Owner\"><UserId>${xml(options.user)}</UserId><LogonType>InteractiveToken</LogonType><RunLevel>LeastPrivilege</RunLevel></Principal></Principals>\n<Settings><MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy><DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries><StopIfGoingOnBatteries>false</StopIfGoingOnBatteries><StartWhenAvailable>true</StartWhenAvailable><ExecutionTimeLimit>PT0S</ExecutionTimeLimit><RestartOnFailure><Interval>PT1M</Interval><Count>999</Count></RestartOnFailure></Settings>\n<Actions Context=\"Owner\"><Exec><Command>${xml(executable)}</Command><Arguments>${xml(args.map(windowsArg).join(\" \"))}</Arguments><WorkingDirectory>${xml(home)}</WorkingDirectory></Exec></Actions>\n</Task>\n`, query: [\"schtasks.exe\", \"/Query\", \"/TN\", name],\n enable: [[\"schtasks.exe\", \"/Create\", \"/TN\", name, \"/XML\", file, \"/F\"], [\"schtasks.exe\", \"/Run\", \"/TN\", name]],\n disable: [[\"schtasks.exe\", \"/End\", \"/TN\", name], [\"schtasks.exe\", \"/Delete\", \"/TN\", name, \"/F\"]] };\n }\n throw new Error(\"Automatic startup supports macOS, Linux with systemd, and Windows. Run mindwire start on this system.\");\n}\n\nconst run = async ([command, ...args]: Command) => { await execute(command, args, { timeout: 15_000, windowsHide: true }); };\nexport async function startupStatus(directory: string): Promise<StartupState> {\n const state = await readJSON<StartupState>(path.join(directory, \"computer-startup.json\")) ?? { enabled: false };\n const guardian = await readJSON<ProcessState>(path.join(directory, \"computer-guardian.json\"));\n let registered = false;\n if (state.enabled && state.name && state.kind) {\n const query: Command = state.kind === \"launchd\" ? [\"launchctl\", \"print\", `gui/${process.getuid?.()}/${state.name}`]\n : state.kind === \"systemd\" ? [\"systemctl\", \"--user\", \"is-enabled\", state.name + \".service\"]\n : [\"schtasks.exe\", \"/Query\", \"/TN\", state.name];\n try { await run(query); registered = true; } catch { /* Missing/disabled registration needs repair. */ }\n }\n return { ...state, registered, running: state.enabled && registered && await processStateAlive(guardian) };\n}\n\nexport async function configureStartup(directory: string, cliPath: string, enabled: boolean, runtime: {\n plan?: StartupPlan; run?: (command: Command) => Promise<void>; verify?: () => Promise<void>;\n isRunning?: () => Promise<boolean>;\n repair?: boolean;\n} = {}): Promise<StartupState> {\n await fs.mkdir(directory, { recursive: true, mode: 0o700 });\n const lockPath = path.join(directory, \"startup.lock\");\n const lock = await acquireProcessLock(lockPath);\n if (!lock) throw new Error(\"Startup is already being configured. Try again shortly.\");\n try {\n const user = process.platform === \"win32\" && !runtime.plan\n ? (await execute(\"whoami.exe\", [], { timeout: 3000, windowsHide: true })).stdout.trim() : undefined;\n const plan = runtime.plan ?? startupPlan({ directory, cliPath, user, executable: await startupExecutable() });\n const command = runtime.run ?? run;\n let loaded = false;\n try { await command(plan.query); loaded = true; } catch { /* Not installed/loaded. */ }\n if (enabled) {\n const previous = await fs.readFile(plan.file, plan.kind === \"task-scheduler\" ? \"utf16le\" : \"utf8\").catch(() => \"\");\n const changed = previous !== plan.content;\n if (changed) {\n await fs.mkdir(path.dirname(plan.file), { recursive: true, mode: 0o700 });\n const temporary = plan.file + `.tmp-${process.pid}`;\n try {\n await fs.writeFile(temporary, plan.content, { mode: 0o600, encoding: plan.kind === \"task-scheduler\" ? \"utf16le\" : \"utf8\" });\n await fs.rename(temporary, plan.file);\n } finally { await fs.rm(temporary, { force: true }); }\n }\n const guardianRunning = loaded && (runtime.isRunning ? await runtime.isRunning()\n : await processStateAlive(await readJSON<ProcessState>(path.join(directory, \"computer-guardian.json\"))));\n // Reload only the guardian, not the detached controller or its terminals.\n // launchd keeps old ProgramArguments until its job is booted out/reloaded.\n const reload = loaded && (runtime.repair || changed || !guardianRunning);\n if (reload && plan.kind === \"launchd\") await command(plan.disable[0]!);\n if (reload && plan.kind === \"task-scheduler\") {\n try { await command(plan.disable[0]!); } catch { /* A stopped task has nothing to end. */ }\n }\n if (!loaded || reload) {\n for (const action of plan.enable) {\n // bootout can return before launchd finishes unloading the label.\n // A following bootstrap briefly returns EIO even for a valid plist.\n // Retry that native race without escalating privileges or touching\n // the detached daemon. Persistent registration failures still surface.\n for (let attempt = 0; ; attempt++) {\n try { await command(action); break; }\n catch (error) {\n if (plan.kind !== \"launchd\" || !action.includes(\"bootstrap\")\n || (error as { code?: number }).code !== 5 || attempt >= 7) throw error;\n await delay(100 * (attempt + 1));\n }\n }\n }\n if (reload && plan.kind === \"systemd\") await command([\"systemctl\", \"--user\", \"restart\", plan.name + \".service\"]);\n }\n await command(plan.query); // Report success only after native registration.\n if (runtime.verify) await runtime.verify();\n else {\n let running = false;\n for (let attempt = 0; attempt < 60; attempt++) {\n const guardian = await readJSON<ProcessState>(path.join(directory, \"computer-guardian.json\"));\n if (await processStateAlive(guardian)) { running = true; break; }\n await delay(250);\n }\n if (!running) throw new Error(`Automatic startup was registered but its guardian didn't start. Inspect ${path.join(directory, \"startup.log\")}.`);\n }\n } else {\n if (loaded || await fs.stat(plan.file).then(() => true, () => false)) {\n for (const action of plan.disable) {\n try { await command(action); }\n catch (error) { if (action.includes(\"/End\") || action.includes(\"bootout\") && !loaded) continue; throw error; }\n }\n }\n await fs.rm(plan.file, { force: true });\n }\n const state: StartupState = { enabled, kind: plan.kind, name: plan.name, file: plan.file };\n await writeJSON(path.join(directory, \"computer-startup.json\"), state);\n return { ...state, registered: enabled, running: enabled };\n } finally { await lock.close(); }\n}\n\n/** Native startup managers supervise this small guardian. It adopts an existing\n * controller and honours an explicit stop; it never owns or kills user work. */\nexport async function watchComputer(directory: string, cliPath: string): Promise<void> {\n let stopping = false;\n const abort = new AbortController();\n const stop = () => { stopping = true; abort.abort(); };\n process.on(\"SIGTERM\", stop); process.on(\"SIGINT\", stop);\n let reportedError = \"\";\n const guardianPath = path.join(directory, \"computer-guardian.json\");\n const lock = await acquireProcessLock(path.join(directory, \"guardian.lock\"), { signal: abort.signal });\n if (!lock) { process.off(\"SIGTERM\", stop); process.off(\"SIGINT\", stop); return; }\n try {\n await writeJSON(guardianPath, await currentProcessIdentity());\n while (!stopping) {\n const paused = await readJSON<{ stopped: boolean }>(path.join(directory, \"computer-stopped.json\"));\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (!paused?.stopped && (!await processStateAlive(controller)\n || (controller?.protocol ?? 0) < CONTROLLER_PROTOCOL || !versionAtLeast(controller?.cliVersion, SDK_VERSION))) {\n try { await ensureComputer(directory, cliPath, {}, undefined, { resume: false, signal: abort.signal }); reportedError = \"\"; }\n catch (error) {\n if (stopping) break;\n const message = error instanceof Error ? error.message : \"Computer recovery failed.\";\n if (message !== reportedError) { process.stderr.write(`Mindwire recovery: ${message}\\n`); reportedError = message; }\n }\n }\n // A user stop is durable; a reboot or repeated guardian launch won't undo it.\n for (let tick = 0; tick < 10 && !stopping; tick++) await delay(500);\n }\n } finally {\n if ((await readJSON<{ pid: number }>(guardianPath))?.pid === process.pid) await writeJSON(guardianPath, { pid: 0 });\n process.off(\"SIGTERM\", stop); process.off(\"SIGINT\", stop);\n await lock.close();\n }\n}\n","import type { ComputerReconnectCode, ComputerDevice, ComputerInfo } from \"../computer.js\";\n\nexport type ConnectionAction = \"resume\" | \"reconnect\" | \"pair\";\n\nexport function connectionAction(value: string | undefined): ConnectionAction | undefined {\n if (value === undefined) return undefined;\n if (value === \"resume\" || value === \"reconnect\" || value === \"pair\") return value;\n throw new Error(\"Use mindwire connect, mindwire connect resume, mindwire reconnect, or mindwire connect pair.\");\n}\n\n/** Safe to copy into either a Unix shell or PowerShell, even when an ID starts\n * with a dash. Validate old daemons too; these values originated on a phone. */\nexport function approvalCommand(pairingId: string, requestId: string): string {\n if (![pairingId, requestId].every(id => /^[A-Za-z0-9_-]{8,128}$/.test(id))) {\n throw new Error(\"Invalid phone pairing request. Run mindwire connect to create a new code.\");\n }\n return `mindwire approve -- ${pairingId} ${requestId}`;\n}\n\n/** Stable endpoints need no new invitation after network loss or restart.\n * An approval means ready to reconnect, never proof of current connectivity. */\nexport async function chooseConnectionAction(options: {\n requested?: ConnectionAction;\n devices: ComputerDevice[];\n persistent?: boolean;\n}): Promise<ConnectionAction> {\n if (options.requested === \"pair\") return \"pair\";\n const recoverable = options.persistent || options.devices.some(device => !device.revoked && device.addressRecovery);\n if (options.requested === \"reconnect\" && !recoverable) return \"pair\";\n return options.devices.some(device => !device.revoked && (device.connected || recoverable)) ? \"resume\" : \"pair\";\n}\n\n/** A fresh key is never merged by name. Replacement requires the owner's explicit\n * choice of the exact approvals shown here; a different same-name phone can be added. */\nexport async function choosePairingDecision(options: {\n replacements: ComputerDevice[];\n question: (prompt: string) => Promise<string>;\n}): Promise<{ approve: boolean; replaceDeviceIds?: string[] }> {\n const replacements = options.replacements.filter(device => !device.revoked);\n const prompt = replacements.length\n ? `\\nPrevious approvals with this name:\\n${deviceSummary(replacements, true)}\\n\\nAllow this phone? [r = replace these approvals, a = add a different phone, N = deny]: `\n : \"Allow this phone to access this computer? [y/N] \";\n for (;;) {\n const answer = (await options.question(prompt)).trim().toLowerCase();\n if ([\"\", \"n\", \"no\"].includes(answer)) return { approve: false };\n if (replacements.length) {\n if ([\"r\", \"replace\"].includes(answer)) return { approve: true, replaceDeviceIds: replacements.map(device => device.id) };\n if ([\"a\", \"add\"].includes(answer)) return { approve: true };\n } else if ([\"y\", \"yes\"].includes(answer)) return { approve: true };\n }\n}\n\n/** Ask once; preserve existing opt-outs. Scripts must opt in with --startup. */\nexport async function chooseStartupAction(options: {\n state: { enabled: boolean; running?: boolean; kind?: string };\n startup?: boolean;\n noStartup?: boolean;\n question?: (prompt: string) => Promise<string>;\n}): Promise<boolean | undefined> {\n if (options.startup && options.noStartup) throw new Error(\"Choose either --startup or --no-startup.\");\n if (options.startup) return !options.state.enabled || !options.state.running ? true : undefined;\n if (options.noStartup) return options.state.kind ? undefined : false;\n if (options.state.kind) return options.state.enabled && !options.state.running ? true : undefined;\n if (!options.question) return undefined;\n for (;;) {\n const answer = (await options.question(\n \"\\nStart Mindwire automatically after you sign in to this computer? [Y/n] \")).trim().toLowerCase();\n if ([\"\", \"y\", \"yes\"].includes(answer)) return true;\n if ([\"n\", \"no\"].includes(answer)) return false;\n }\n}\n\nexport function reconnectCode(info: ComputerInfo, name: string, now = new Date()): ComputerReconnectCode {\n if (info.routes.length === 0) throw new Error(\"No connection address is ready. Run mindwire status and retry once the tunnel is online.\");\n return { version: 1, mode: \"reconnect\", computerId: info.computerId, registryId: info.registryId,\n fingerprint: info.fingerprint, name, routes: info.routes,\n expiresAt: new Date(now.getTime() + 5 * 60_000).toISOString() };\n}\n\nexport function deviceSummary(devices: ComputerDevice[], showKeys = false): string {\n const saved = devices.filter(device => !device.revoked);\n const names = new Map<string, number>();\n const safeName = (device: ComputerDevice) => device.name.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \"\");\n for (const device of saved) names.set(safeName(device), (names.get(safeName(device)) ?? 0) + 1);\n return saved\n .sort((a, b) => a.name.localeCompare(b.name) || a.id.localeCompare(b.id))\n .map(device => {\n const name = safeName(device);\n const status = device.connected === true ? \"connected\" : \"paired\";\n const identity = showKeys || (names.get(name) ?? 0) > 1 ? ` · key ${device.id.slice(0, 8)}` : \"\";\n return ` ${name} · ${status}${identity}`;\n }).join(\"\\n\");\n}\n","import { clearLine, cursorTo } from \"node:readline\";\n\n/** One terminal line for one connection attempt. JSON and redirected output\n * keep their normal events; interactive retries don't accumulate a wall of logs. */\nexport class ConnectionProgress {\n private readonly startedAt = Date.now();\n private readonly timer: ReturnType<typeof setInterval>;\n private message = \"Starting Mindwire…\";\n private closed = false;\n private readonly exiting = () => this.close();\n\n constructor(private readonly stream: NodeJS.WriteStream) {\n this.render();\n this.timer = setInterval(() => this.render(), 1000);\n this.timer.unref();\n process.once(\"exit\", this.exiting);\n }\n\n update(message: string): void { this.message = message; this.render(); }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n clearInterval(this.timer);\n process.off(\"exit\", this.exiting);\n cursorTo(this.stream, 0);\n clearLine(this.stream, 0);\n }\n\n private render(): void {\n const seconds = Math.floor((Date.now() - this.startedAt) / 1000);\n const elapsed = seconds > 0 ? ` · ${seconds}s` : \"\";\n const width = Math.max(1, (this.stream.columns || 80) - elapsed.length - 1);\n const message = this.message.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \"\");\n const text = message.length > width ? message.slice(0, width - 1) + \"…\" : message;\n cursorTo(this.stream, 0);\n clearLine(this.stream, 0);\n this.stream.write(text + elapsed);\n }\n}\n","import { homedir } from \"node:os\";\nimport * as path from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport { rm } from \"node:fs/promises\";\nimport { Oblien } from \"oblien\";\nimport { readJSON, writeJSON } from \"./lifecycle.js\";\nimport { acquireProcessLock } from \"./lock.js\";\nimport type { SetupPrompt } from \"./setup-prompt.js\";\n\nexport interface OblienCredentials { token?: string; clientId?: string; clientSecret?: string; baseUrl?: string }\nconst BASE = \"https://api.oblien.com\";\nconst RENEW_BEFORE_MS = 24 * 60 * 60_000;\n\nexport class ProviderSignInRequired extends Error {\n readonly code = \"provider_sign_in\";\n constructor(provider = \"Oblien\") { super(`Sign in to ${provider} again with mindwire connection ${provider.toLowerCase()}. Your computer and phone keys are unchanged.`); }\n}\n\nexport function tokenExpiry(token: string): number | undefined {\n try {\n const value = JSON.parse(Buffer.from(token.split(\".\")[1] ?? \"\", \"base64url\").toString()) as { exp?: number };\n return typeof value.exp === \"number\" && Number.isFinite(value.exp) ? value.exp * 1000 : undefined;\n } catch { return undefined; }\n}\n\nexport function oblienClient(credentials: OblienCredentials): Oblien {\n const baseUrl = credentials.baseUrl ?? BASE;\n const url = new URL(baseUrl);\n if (url.protocol !== \"https:\" || url.username || url.password) throw new Error(\"Oblien requires an HTTPS API address without embedded credentials.\");\n if (credentials.clientId && credentials.clientSecret) return boundedOblienClient(new Oblien({ baseUrl, clientId: credentials.clientId, clientSecret: credentials.clientSecret }));\n if (credentials.token) return boundedOblienClient(new Oblien({ baseUrl, token: credentials.token }));\n throw new ProviderSignInRequired();\n}\n\n/** The SDK's resource methods share this transport but do not yet accept a\n * timeout. Bound every request, including tunnel creation and token renewal,\n * without bypassing the official resource API or retrying mutations. */\nexport function boundedOblienClient(client: Oblien, timeoutMs = 15_000): Oblien {\n const request = client._http.request.bind(client._http);\n client._http.request = async <T>(options: Parameters<Oblien[\"_http\"][\"request\"]>[0]): Promise<T> => {\n const controller = new AbortController();\n const cancel = () => controller.abort(options.signal?.reason);\n const timer = setTimeout(() => controller.abort(new Error(\"Oblien's API did not respond in time.\")), timeoutMs);\n options.signal?.addEventListener(\"abort\", cancel, { once: true });\n if (options.signal?.aborted) cancel();\n try { return await request<T>({ ...options, signal: controller.signal }); }\n finally { clearTimeout(timer); options.signal?.removeEventListener(\"abort\", cancel); }\n };\n return client;\n}\n\nfunction requiresSignIn(error: unknown): boolean {\n return error instanceof ProviderSignInRequired || [401, 403].includes((error as { status?: number })?.status ?? 0);\n}\n\n/** Auth is not yet a public SDK resource. Use the SDK's authenticated transport\n * for the documented browser-session endpoints; all tunnel calls use edgeTunnel. */\nexport async function authenticatedOblien(file: string, options: {\n now?: () => number; client?: typeof oblienClient;\n} = {}): Promise<Oblien> {\n const lock = await acquireProcessLock(file + \".lock\");\n try {\n const credentials = await readJSON<OblienCredentials>(file);\n if (!credentials) throw new ProviderSignInRequired();\n const client = (options.client ?? oblienClient)(credentials);\n if (!credentials.token || credentials.clientId && credentials.clientSecret) return client;\n const now = (options.now ?? Date.now)(), expires = tokenExpiry(credentials.token);\n if (expires !== undefined && expires <= now) throw new ProviderSignInRequired();\n if (expires !== undefined && expires - now > RENEW_BEFORE_MS) return client;\n try {\n // Never exchange an expired token: the API would create an anonymous session.\n const renewed = await client._http.request<{ success: boolean; token?: string }>({\n method: \"POST\", path: \"/auth/token\", body: { old_token: credentials.token }, signal: AbortSignal.timeout(15_000),\n });\n if (!renewed.token) throw new ProviderSignInRequired();\n const next = (options.client ?? oblienClient)({ ...credentials, token: renewed.token });\n await next._http.request({ method: \"GET\", path: \"/settings/profile\", signal: AbortSignal.timeout(15_000) });\n await writeJSON(file, { ...credentials, token: renewed.token });\n return next;\n } catch (error) {\n if (requiresSignIn(error)) throw new ProviderSignInRequired();\n throw error; // Transient failure: retain the last credential for the next retry.\n }\n } finally { await lock?.close(); }\n}\n\nexport async function signInOblien(file: string, prompt: SetupPrompt): Promise<Oblien> {\n // Reuse the user's official CLI login once; do not modify its shared config or\n // inherit credentials in startup jobs. Mindwire owns a private renewable copy.\n const candidates = await Promise.all([readJSON<OblienCredentials>(file),\n readJSON<OblienCredentials>(path.join(homedir(), \".oblien\", \"credentials.json\"))]);\n for (const existing of candidates) {\n if (!existing || !(existing.token || existing.clientId && existing.clientSecret)) continue;\n const temporary = `${file}.login-${randomUUID()}.json`;\n await writeJSON(temporary, existing);\n try {\n const client = await authenticatedOblien(temporary);\n await client._http.request({ method: \"GET\", path: \"/settings/profile\", signal: AbortSignal.timeout(15_000) });\n await writeJSON(file, await readJSON<OblienCredentials>(temporary));\n return client;\n } catch (error) { if (!requiresSignIn(error)) throw error; }\n finally { await rm(temporary, { force: true }); }\n }\n const client = boundedOblienClient(new Oblien({ token: \"\", baseUrl: BASE }));\n const session = await client._http.request<{ token: string }>({ method: \"POST\", path: \"/auth/token\", signal: AbortSignal.timeout(15_000) });\n if (!session.token) throw new Error(\"Oblien couldn't start sign-in. Try again shortly.\");\n client.setToken(session.token);\n const login = await client._http.request<{ url: string }>({ method: \"POST\", path: \"/auth/session\",\n body: { app: \"oblien\", redirect_url: \"https://oblien.com/cli?login=success\" }, signal: AbortSignal.timeout(15_000) });\n const url = new URL(login.url);\n if (url.protocol !== \"https:\" || url.hostname !== \"auth.oblien.com\" || url.username || url.password) throw new Error(\"Oblien returned an invalid sign-in link.\");\n const id = url.pathname.split(\"/\").filter(Boolean).pop();\n if (!id || !/^[\\w-]+$/.test(id)) throw new Error(\"Oblien returned an invalid sign-in session.\");\n prompt.print(`\\nSign in to Oblien in your browser:\\n${url.href}\\n\\nWaiting for sign-in…`);\n prompt.open(url.href);\n const deadline = Date.now() + 5_000 * 60;\n while (Date.now() < deadline) {\n await delay(2000);\n const result = await client._http.request<{ status: string }>({ method: \"GET\", path: `/auth/session/${id}/poll`, signal: AbortSignal.timeout(15_000) });\n if (result.status === \"expired\") throw new Error(\"Oblien sign-in expired. Run mindwire connection oblien to retry.\");\n if (result.status !== \"authenticated\") continue;\n await client._http.request({ method: \"GET\", path: \"/settings/profile\", signal: AbortSignal.timeout(15_000) });\n await writeJSON(file, { token: session.token } satisfies OblienCredentials);\n prompt.print(\"Signed in to Oblien.\");\n return client;\n }\n throw new Error(\"Oblien sign-in timed out. Run mindwire connection oblien to retry.\");\n}\n","import { execFile, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport { hostname, homedir } from \"node:os\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { Oblien } from \"oblien\";\nimport { cloudflareCommand } from \"./cloudflare-binary.js\";\nimport { defaultComputerConfig, readJSON, writeJSON, type ComputerConfig } from \"./lifecycle.js\";\nimport { acquireProcessLock } from \"./lock.js\";\nimport { signInOblien, type OblienCredentials } from \"./oblien-auth.js\";\nimport { websocketURL, type RelayOptions } from \"./relay.js\";\nimport type { SetupPrompt } from \"./setup-prompt.js\";\n\nexport type ConnectionProvider = \"oblien\" | \"cloudflare\" | \"ngrok\" | \"vpn\" | \"custom\" | \"temporary\" | \"automatic\";\ninterface ProviderState { installationId: string; oblien?: { id: number; url: string }; cloudflare?: { id: string; credentialsFile: string } }\nconst execute = promisify(execFile);\n\nexport async function chooseProvider(prompt: SetupPrompt): Promise<ConnectionProvider> {\n if (prompt.select) {\n const selected = await prompt.select<ConnectionProvider>(\"Connection provider\", [\n { value: \"automatic\", label: \"Automatic · Cloudflare + Mindwire recovery, no account\" },\n { value: \"oblien\", label: \"Oblien · persistent address\" },\n { value: \"cloudflare\", label: \"Cloudflare · your account and domain\" },\n { value: \"ngrok\", label: \"ngrok · your account and reserved domain\" },\n { value: \"vpn\", label: \"Your VPN · direct SSH\" },\n { value: \"custom\", label: \"Existing secure tunnel\" },\n { value: \"temporary\", label: \"Temporary Cloudflare · no address recovery\" },\n ]);\n if (!selected) throw new Error(\"Connection setup cancelled.\");\n return selected;\n }\n prompt.print(\"\\nConnect this computer\\n\\n 1 Automatic — free Cloudflare tunnel + Mindwire address recovery, no account\\n 2 Oblien — persistent address, browser sign-in\\n 3 Cloudflare — your account and domain\\n 4 ngrok — your account and reserved domain\\n 5 Your VPN — direct SSH\\n 6 Existing secure tunnel\\n 7 Temporary Cloudflare connection — no address recovery\\n\");\n for (;;) {\n const answer = (await prompt.question(\"Connection [1]: \")).trim();\n const provider = ([\"automatic\", \"oblien\", \"cloudflare\", \"ngrok\", \"vpn\", \"custom\", \"temporary\"] as const)[Number(answer || \"1\") - 1];\n if (provider) return provider;\n prompt.print(\"Choose 1–7.\");\n }\n}\n\nexport function connectionProvider(value: string): ConnectionProvider {\n if ([\"oblien\", \"cloudflare\", \"ngrok\", \"vpn\", \"custom\", \"temporary\", \"automatic\"].includes(value)) return value as ConnectionProvider;\n throw new Error(\"Choose automatic, oblien, cloudflare, ngrok, vpn, custom or temporary.\");\n}\n\nexport function providerHostname(value: string): string {\n const url = new URL(websocketURL(value.includes(\"://\") ? value : `https://${value}`));\n if (url.port || url.search || url.pathname !== \"/ssh\" || !url.hostname.includes(\".\") || /[\\s]/.test(value)) {\n throw new Error(\"Enter the configured public hostname, for example computer.example.com.\");\n }\n return url.hostname;\n}\n\n/** No port-based account-wide reuse: two computers commonly use the same port. */\nexport async function prepareOblienTunnel(client: Oblien, stateFile: string, port: number): Promise<{ id: number; url: string }> {\n let state = await readJSON<ProviderState>(stateFile);\n if (!state) { state = { installationId: randomUUID() }; await writeJSON(stateFile, state); }\n if (state.oblien) {\n try {\n const { tunnel } = await client.edgeTunnel.get(state.oblien.id);\n if (tunnel.status !== \"active\") throw new Error(\"This computer's Oblien tunnel is disabled. Enable it in your Oblien dashboard, then retry.\");\n if (tunnel.port !== port) await client.edgeTunnel.update(tunnel.id, { port });\n const saved = { id: tunnel.id, url: websocketURL(tunnel.url) };\n await writeJSON(stateFile, { ...state, oblien: saved });\n return saved;\n } catch (error) {\n // Only an explicit setup can replace a deleted tunnel. Background startup\n // never recreates a revoked provider resource or invents a new address.\n if ((error as { status?: number })?.status !== 404) throw error;\n }\n }\n const slug = `mw-${state.installationId.replaceAll(\"-\", \"\")}`;\n // Recover a create whose response was lost. The installation ID is persisted\n // before calling the provider and survives retries/crashes.\n const { tunnels } = await client.edgeTunnel.list();\n const existing = tunnels.find(tunnel => tunnel.slug === slug);\n const tunnel = existing ?? (await client.edgeTunnel.create({ name: `Mindwire · ${hostname()}`, slug, port })).tunnel;\n if (tunnel.status !== \"active\") throw new Error(\"This computer's tunnel is disabled in Oblien.\");\n if (tunnel.port !== port) await client.edgeTunnel.update(tunnel.id, { port });\n const saved = { id: tunnel.id, url: websocketURL(tunnel.url) };\n await writeJSON(stateFile, { ...state, oblien: saved });\n return saved;\n}\n\nasync function runVisible(command: string, args: string[]): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { stdio: \"inherit\", windowsHide: true });\n child.once(\"error\", () => reject(new Error(\"Couldn't open the provider's login helper. Try again.\")));\n child.once(\"exit\", code => code === 0 ? resolve() : reject(new Error(\"Provider setup didn't finish. Your existing connection is unchanged.\")));\n });\n}\n\nasync function setupCloudflare(directory: string, stateFile: string, prompt: SetupPrompt): Promise<RelayOptions> {\n const state = (await readJSON<ProviderState>(stateFile))!;\n const domain = providerHostname(await prompt.question(\"Cloudflare hostname (for example computer.example.com): \"));\n const command = await cloudflareCommand({ cacheDir: path.join(directory, \"tools\"), onProgress: text => prompt.print(text) });\n let saved = state.cloudflare;\n if (!saved) {\n const certificates = process.env.TUNNEL_ORIGIN_CERT ? [process.env.TUNNEL_ORIGIN_CERT]\n : [path.join(homedir(), \".cloudflared\", \"cert.pem\"), path.join(homedir(), \".cloudflare-warp\", \"cert.pem\")];\n const hasLogin = (await Promise.all(certificates.map(file => fs.stat(file).then(value => value.isFile(), () => false)))).some(Boolean);\n if (!hasLogin) {\n prompt.print(\"\\nSign in to Cloudflare and select the zone for this hostname.\\nCloudflare will store its login certificate on this computer.\");\n await runVisible(command, [\"tunnel\", \"login\"]);\n } else prompt.print(\"Using your saved Cloudflare login.\");\n const name = `mindwire-${state.installationId}`;\n const credentialsFile = path.join(directory, \"providers\", \"cloudflare-tunnel.json\");\n // A interrupted setup can already have created the tunnel credentials.\n let credentials = await readJSON<{ TunnelID?: string }>(credentialsFile);\n if (!credentials?.TunnelID) {\n try {\n await execute(command, [\"tunnel\", \"create\", \"--credentials-file\", credentialsFile, name], { timeout: 60_000, maxBuffer: 65_536 });\n } catch { throw new Error(\"Cloudflare couldn't create the named tunnel. Check your account and run mindwire connection cloudflare again.\"); }\n credentials = await readJSON<{ TunnelID?: string }>(credentialsFile);\n }\n if (!credentials?.TunnelID || !/^[a-f0-9-]{36}$/i.test(credentials.TunnelID)) throw new Error(\"Cloudflare didn't save the tunnel credentials. Retry setup.\");\n await fs.chmod(credentialsFile, 0o600);\n saved = { id: credentials.TunnelID, credentialsFile };\n await writeJSON(stateFile, { ...state, cloudflare: saved });\n }\n try { await execute(command, [\"tunnel\", \"route\", \"dns\", saved.id, domain], { timeout: 60_000, maxBuffer: 65_536 }); }\n catch { throw new Error(\"Cloudflare couldn't assign this hostname. Check the zone and existing DNS record, then retry. Mindwire does not overwrite another service's DNS.\"); }\n return { kind: \"cloudflare\", url: `wss://${domain}/ssh`, cloudflareTunnelId: saved.id, cloudflareCredentialsFile: saved.credentialsFile };\n}\n\n/** Setup is explicit and serialized. Background startup only consumes the saved\n * result: it never opens a browser, changes provider, or creates another tunnel. */\nexport async function setupProvider(options: {\n directory: string; provider: ConnectionProvider; prompt: SetupPrompt;\n config?: ComputerConfig;\n}): Promise<Partial<ComputerConfig>> {\n const { directory, provider, prompt } = options;\n await fs.mkdir(path.join(directory, \"providers\"), { recursive: true, mode: 0o700 });\n const lock = await acquireProcessLock(path.join(directory, \"connection-setup.lock\"));\n try {\n const config = options.config ?? defaultComputerConfig();\n const stateFile = path.join(directory, \"computer-providers.json\");\n if (!await readJSON(stateFile)) await writeJSON(stateFile, { installationId: randomUUID() } satisfies ProviderState);\n switch (provider) {\n case \"automatic\":\n prompt.print(\"No Mindwire or Oblien account is needed. Cloudflare carries encrypted SSH traffic; the Mindwire directory helps your paired phone find this computer when its address changes. Use --directory-url or MINDWIRE_DIRECTORY_URL for a self-hosted directory.\");\n return { relay: { kind: \"cloudflare\" } };\n case \"temporary\": return { relay: { kind: \"cloudflare\" } };\n case \"vpn\": {\n prompt.print(\"Use a hostname reachable from your phone's VPN, such as your Tailscale or WireGuard network. Mindwire still checks your paired SSH keys.\");\n const host = (await prompt.question(\"Computer's VPN hostname or IP: \")).trim();\n if (!host || host.length > 255 || /[\\s/\\\\?#@]/.test(host)) throw new Error(\"Enter a valid VPN hostname or IP address.\");\n return { relay: { kind: \"none\" }, host };\n }\n case \"custom\": {\n prompt.print(`Forward WebSocket traffic to http://127.0.0.1:${config.websocketPort || 8792}. Keep your tunnel running at a persistent HTTPS hostname.`);\n return { relay: { kind: \"custom\", url: websocketURL(await prompt.question(\"Secure tunnel URL: \")) } };\n }\n case \"cloudflare\": return { relay: await setupCloudflare(directory, stateFile, prompt) };\n case \"ngrok\": {\n const url = \"https://dashboard.ngrok.com/get-started/your-authtoken\";\n prompt.print(`\\nSign in to ngrok to get this computer's authtoken:\\n${url}\\nThe token stays on this computer and is never sent to your phone.`);\n prompt.open(url);\n const token = await prompt.secret(\"ngrok authtoken (hidden): \");\n if (!token || token.length > 4096 || /\\s/.test(token)) throw new Error(\"Enter a valid ngrok authtoken.\");\n prompt.print(\"Use the dev domain or reserved domain shown at https://dashboard.ngrok.com/domains. Each computer needs its own address.\");\n const host = providerHostname(await prompt.question(\"ngrok domain: \"));\n const tokenFile = path.join(directory, \"providers\", `ngrok-${randomUUID()}.json`);\n await writeJSON(tokenFile, { token });\n return { relay: { kind: \"ngrok\", url: `wss://${host}/ssh`, ngrokTokenFile: tokenFile } };\n }\n case \"oblien\": {\n const credentialsFile = path.join(directory, \"providers\", `oblien-${randomUUID()}.json`);\n const existing = config.relay.oblienCredentialsFile && await readJSON<OblienCredentials>(config.relay.oblienCredentialsFile);\n if (existing) await writeJSON(credentialsFile, existing);\n try {\n const client = await signInOblien(credentialsFile, prompt);\n const runtime = await readJSON<{ websocketPort?: number }>(path.join(directory, \"computer-runtime.json\"));\n const tunnel = await prepareOblienTunnel(client, stateFile, runtime?.websocketPort || config.websocketPort || 8792);\n return { relay: { kind: \"oblien\", url: tunnel.url, oblienTunnelId: tunnel.id, oblienCredentialsFile: credentialsFile } };\n } catch (error) { await fs.rm(credentialsFile, { force: true }); throw error; }\n }\n }\n throw new Error(\"Unsupported connection provider.\");\n } finally { await lock?.close(); }\n}\n","import { emitKeypressEvents } from \"node:readline\";\n\nexport interface TerminalChoice<T extends string = string> { value: T; label: string }\nexport const terminalText = (value: string) => value.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \"\");\n\nexport function accent(value: string): string {\n return process.stderr.isTTY && !process.env.NO_COLOR && process.env.TERM !== \"dumb\"\n ? `\\x1b[38;5;208m${value}\\x1b[0m` : value;\n}\n\n/** Small native-terminal selector, without a UI dependency or an alternate\n * screen. Every exit restores raw mode, the cursor, listeners and input flow. */\nexport async function chooseTerminal<T extends string>(title: string | string[], choices: TerminalChoice<T>[]): Promise<T | undefined> {\n if (!choices.length) return;\n if (!process.stdin.isTTY || !process.stderr.isTTY) throw new Error(\"Open mindwire in an interactive terminal, or use a command from mindwire --help.\");\n const input = process.stdin, output = process.stderr;\n const wasRaw = !!input.isRaw, wasFlowing = input.readableFlowing === true;\n emitKeypressEvents(input);\n let selected = 0, lines = 0, finished = false;\n const clear = () => {\n if (lines) output.write(`\\x1b[${lines}A\\r\\x1b[J`);\n lines = 0;\n };\n const draw = () => {\n clear();\n const width = Math.max(8, (output.columns || 80) - 4);\n const headings = typeof title === \"string\" ? [title] : title;\n const visible = Math.max(1, Math.min(choices.length, (output.rows || 24) - headings.length - 4));\n const first = Math.max(0, Math.min(selected - visible + 1, choices.length - visible));\n const clip = (text: string) => {\n const chars = [...terminalText(text)];\n return chars.length > width ? chars.slice(0, width - 1).join(\"\") + \"…\" : chars.join(\"\");\n };\n const rows = [...headings.map(clip), ...choices.slice(first, first + visible).map((choice, index) =>\n index + first === selected ? accent(`› ${clip(choice.label)}`) : ` ${clip(choice.label)}`),\n \"\", clip(\"↑/↓ choose · Enter select · Esc back\")];\n output.write(rows.join(\"\\n\") + \"\\n\"); lines = rows.length;\n };\n return await new Promise<T | undefined>((resolve, reject) => {\n const cleanup = () => {\n if (finished) return;\n finished = true;\n input.off(\"keypress\", onKey); input.off(\"end\", onEnd); output.off(\"resize\", draw);\n clear(); output.write(\"\\x1b[?25h\");\n input.setRawMode(wasRaw);\n if (!wasFlowing) input.pause();\n };\n const finish = (value?: T) => { cleanup(); resolve(value); };\n const onEnd = () => finish();\n const onKey = (_text: string, key: { name?: string; ctrl?: boolean }) => {\n if (key.name === \"escape\" || key.ctrl && [\"c\", \"d\"].includes(key.name ?? \"\")) return finish();\n if (key.name === \"return\") return finish(choices[selected]?.value);\n if (key.name === \"up\" || key.name === \"k\") selected = (selected + choices.length - 1) % choices.length;\n else if (key.name === \"down\" || key.name === \"j\") selected = (selected + 1) % choices.length;\n else return;\n draw();\n };\n try {\n input.setRawMode(true); input.resume(); output.write(\"\\x1b[?25l\");\n input.on(\"keypress\", onKey); input.once(\"end\", onEnd); output.on(\"resize\", draw);\n draw();\n } catch (error) { cleanup(); reject(error); }\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport { Writable } from \"node:stream\";\nimport { chooseTerminal, type TerminalChoice } from \"./terminal-ui.js\";\n\nexport interface SetupPrompt {\n question(text: string): Promise<string>;\n secret(text: string): Promise<string>;\n print(text: string): void;\n open(url: string): void;\n select?<T extends string>(title: string, choices: TerminalChoice<T>[]): Promise<T | undefined>;\n}\n\n/** No shell interpolation, even for a URL returned by a provider. */\nexport function openSetupURL(value: string): void {\n const url = new URL(value);\n if (url.protocol !== \"https:\" || url.username || url.password) throw new Error(\"Invalid provider login URL.\");\n const [command, args] = process.platform === \"darwin\" ? [\"open\", [url.href]] as const\n : process.platform === \"win32\" ? [\"rundll32.exe\", [\"url.dll,FileProtocolHandler\", url.href]] as const\n : [\"xdg-open\", [url.href]] as const;\n const child = spawn(command, [...args], { stdio: \"ignore\", windowsHide: true });\n child.on(\"error\", () => {}); // The printed link remains usable on headless computers.\n child.unref();\n}\n\nfunction question(text: string, hidden: boolean): Promise<string> {\n if (!process.stdin.isTTY) throw new Error(\"Connection setup needs an interactive terminal, or explicit provider options.\");\n process.stderr.write(text);\n // readline handles paste, backspace, Ctrl-C and terminal restoration. A hidden\n // answer is never echoed, logged, or passed as a process argument.\n const output = hidden ? new Writable({ write(_chunk, _encoding, done) { done(); } }) : process.stderr;\n const input = createInterface({ input: process.stdin, output, terminal: true });\n return new Promise((resolve, reject) => {\n let answered = false;\n input.once(\"SIGINT\", () => { input.close(); });\n input.once(\"close\", () => { if (!answered) reject(new Error(\"Connection setup cancelled.\")); });\n input.question(\"\", value => {\n answered = true;\n input.close();\n if (hidden) process.stderr.write(\"\\n\");\n resolve(hidden ? value : value.trim());\n });\n });\n}\n\nexport const terminalSetupPrompt: SetupPrompt = {\n question: text => question(text, false), secret: text => question(text, true),\n print: text => { process.stderr.write(text + \"\\n\"); }, open: openSetupURL,\n select: chooseTerminal,\n};\n","import { setTimeout as delay } from \"node:timers/promises\";\nimport type { Oblien } from \"oblien\";\nimport { TunnelClient } from \"oblien\";\nimport { readJSON } from \"./lifecycle.js\";\nimport { authenticatedOblien, ProviderSignInRequired, tokenExpiry } from \"./oblien-auth.js\";\nimport { websocketURL, type RelayOptions } from \"./relay.js\";\nimport { providerFailure, providerNeedsAction, ProviderConnectionError } from \"./provider-errors.js\";\n\nexport interface RelayWorkerConfig { options: RelayOptions; port: number }\ninterface TunnelToken { token: string; connect_url: string; expires_at: string }\n\n/** Cache only the short-lived broker token. Renew early without disconnecting a\n * healthy carrier; a later reconnect uses the newest token for the same tunnel. */\nexport class OblienTunnelLease {\n private value?: TunnelToken;\n private pending?: Promise<TunnelToken>;\n constructor(private readonly tunnelId: number, private readonly client: () => Promise<Oblien>, private readonly now = Date.now) {}\n get(force = false): Promise<TunnelToken> {\n if (this.pending) return this.pending;\n const expires = this.value && (Date.parse(this.value.expires_at) || tokenExpiry(this.value.token) || 0);\n if (!force && this.value && expires! - this.now() > 5 * 60_000) return Promise.resolve(this.value);\n const pending = (async () => {\n const client = await this.client();\n const value = await client.edgeTunnel.issueToken(this.tunnelId);\n const url = new URL(value.connect_url);\n if (url.protocol !== \"wss:\" || url.username || url.password || url.hash) {\n throw new ProviderConnectionError(\"provider_configuration\", \"Oblien returned an invalid broker address.\");\n }\n const expiry = Date.parse(value.expires_at) || tokenExpiry(value.token) || 0;\n if (!value.token || expiry - this.now() < 30_000) throw new Error(\"Oblien returned a token too close to expiry. Retry shortly.\");\n this.value = value;\n return value;\n })();\n this.pending = pending;\n void pending.finally(() => { if (this.pending === pending) this.pending = undefined; }).catch(() => {});\n return pending;\n }\n}\n\nexport function relayFailureMessage(error: unknown, provider: string): string {\n return providerFailure(error, provider).message;\n}\n\nasync function runOblien(options: RelayOptions, port: number, signal: AbortSignal): Promise<void> {\n if (!options.oblienCredentialsFile || !options.oblienTunnelId || !options.url) throw new Error(\"Oblien setup is incomplete. Run mindwire connection oblien.\");\n const credentialsFile = options.oblienCredentialsFile;\n const lease = new OblienTunnelLease(options.oblienTunnelId, () => authenticatedOblien(credentialsFile));\n let failures = 0, authFailures = 0, forceToken = false;\n while (!signal.aborted) {\n let carrier: TunnelClient | undefined;\n try {\n const token = await lease.get(forceToken);\n forceToken = false;\n signal.throwIfAborted();\n carrier = new TunnelClient({ connectUrl: token.connect_url, token: token.token, localPort: port, tokenExpiresAt: token.expires_at });\n const tunnel = carrier;\n let opened = false;\n let connectionError: unknown;\n let finish!: () => void;\n const ended = new Promise<void>(resolve => { finish = resolve; });\n let endedValue = false;\n const end = () => { endedValue = true; finish(); };\n tunnel.on(\"open\", () => {\n opened = true; failures = 0; authFailures = 0;\n process.stdout.write(JSON.stringify({ event: \"relay_ready\", url: options.url }) + \"\\n\");\n });\n tunnel.on(\"disconnect\", end);\n tunnel.on(\"auth-failed\", () => { connectionError = new ProviderSignInRequired(); end(); });\n // Never forward raw SDK errors: a transport can include headers/tokens.\n tunnel.on(\"error\", error => { connectionError = error; end(); });\n const abort = () => { tunnel.close(); end(); };\n signal.addEventListener(\"abort\", abort, { once: true });\n try {\n tunnel.connect();\n const started = Date.now();\n while (!endedValue && !signal.aborted) {\n const tick = new AbortController();\n try { await Promise.race([ended, delay(opened ? 60_000 : 1000, undefined, { signal: tick.signal })]); }\n finally { tick.abort(); }\n if (!opened && Date.now() - started > 20_000) break;\n if (opened && !endedValue) {\n // A renewal outage must not close a working connection. The next\n // maintenance tick or disconnected attempt will retry the issuer.\n await lease.get().catch(() => {});\n }\n }\n if (connectionError) throw connectionError;\n } finally { signal.removeEventListener(\"abort\", abort); }\n } catch (error) {\n if (signal.aborted) return;\n const failure = providerFailure(error, \"Oblien\");\n if (failure.code === \"provider_sign_in\" && carrier && ++authFailures === 1) forceToken = true;\n else if (providerNeedsAction(failure.code)) throw failure;\n } finally { carrier?.close(); }\n if (!signal.aborted) await delay(Math.min(30_000, 1000 * 2 ** Math.min(5, failures++)), undefined, { signal });\n }\n}\n\nasync function runNgrok(options: RelayOptions, port: number, signal: AbortSignal): Promise<void> {\n if (!options.ngrokTokenFile || !options.url) throw new Error(\"ngrok setup is incomplete. Run mindwire connection ngrok.\");\n const credentials = await readJSON<{ token: string }>(options.ngrokTokenFile);\n if (!credentials?.token) throw new ProviderSignInRequired(\"ngrok\");\n const ngrok = await import(\"@ngrok/ngrok\");\n const domain = new URL(websocketURL(options.url)).hostname;\n // The official agent maintains its own heartbeats/reconnect. It forwards only\n // the loopback SSH WebSocket bridge and reuses this exact reserved domain.\n const listener = await ngrok.forward({ addr: `http://127.0.0.1:${port}`, authtoken: credentials.token, domain,\n schemes: [\"https\"], onStatusChange: () => {} });\n try {\n if (websocketURL(listener.url() ?? \"\") !== websocketURL(options.url)) throw new Error(\"ngrok returned a different address.\");\n process.stdout.write(JSON.stringify({ event: \"relay_ready\", url: options.url }) + \"\\n\");\n if (!signal.aborted) await new Promise<void>(resolve => signal.addEventListener(\"abort\", () => resolve(), { once: true }));\n } finally { await listener.close(); await ngrok.disconnect(); }\n}\n\n/** A separate owned process survives controller updates just like cloudflared.\n * It does not own the daemon, terminals, identity, or phone authorization. */\nexport async function runManagedRelay(file: string): Promise<void> {\n const config = await readJSON<RelayWorkerConfig>(file);\n if (!config || !Number.isInteger(config.port) || config.port < 1 || config.port > 65535) throw new Error(\"Invalid relay configuration.\");\n const abort = new AbortController(), stop = () => abort.abort();\n process.on(\"SIGTERM\", stop); process.on(\"SIGINT\", stop);\n try {\n if (config.options.kind === \"oblien\") await runOblien(config.options, config.port, abort.signal);\n else if (config.options.kind === \"ngrok\") await runNgrok(config.options, config.port, abort.signal);\n else throw new Error(\"Unsupported managed relay.\");\n } catch (error) {\n if (!abort.signal.aborted) {\n const failure = providerFailure(error, config.options.kind === \"oblien\" ? \"Oblien\" : \"ngrok\");\n process.stdout.write(JSON.stringify({ event: \"relay_error\", message: failure.message, code: failure.code }) + \"\\n\");\n process.exitCode = 1;\n }\n } finally { process.off(\"SIGTERM\", stop); process.off(\"SIGINT\", stop); }\n}\n","import { hostname } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ComputerConnectionInfo, ComputerDevice, ComputerDiscoveryStatus, ComputerInfo, ComputerUpdate } from \"../computer.js\";\nimport { SDK_VERSION } from \"../version.js\";\nimport { computerClient, readJSON, type ComputerConfig, type ControllerState } from \"./lifecycle.js\";\nimport { startupStatus, type StartupState } from \"./startup.js\";\nimport { processStateAlive } from \"./process.js\";\nimport { connectionInfo } from \"./provider-info.js\";\nimport { discoveryPreference, type DiscoveryPreference } from \"./discovery.js\";\nimport type { ComputerConnectionChange } from \"./connection-change.js\";\nimport { terminalText } from \"./terminal-ui.js\";\n\nexport interface ComputerInspection {\n name: string;\n cliVersion: string;\n service: \"not-configured\" | \"stopped\" | \"starting\" | \"running\" | \"unavailable\";\n daemonVersion?: string;\n online: boolean;\n startup: StartupState;\n connection?: ComputerConnectionInfo;\n discovery?: ComputerDiscoveryStatus;\n discoveryPreference?: DiscoveryPreference;\n devices: ComputerDevice[];\n update?: ComputerUpdate;\n activeOperations?: number;\n info?: ComputerInfo;\n problem?: string;\n recoveryProblem?: string;\n recovering?: boolean;\n relayError?: string;\n relayErrorCode?: string;\n connectionChange?: Pick<ComputerConnectionChange, \"status\" | \"message\">;\n}\n\n/** Inspection never starts a service or requires it to be reachable. Keep\n * credentials/configuration files out of both human and JSON output. */\nexport async function inspectComputer(directory: string): Promise<ComputerInspection> {\n const [config, controller, startup, preference, stopped, update, change] = await Promise.all([\n readJSON<ComputerConfig>(join(directory, \"computer-config.json\")),\n readJSON<ControllerState>(join(directory, \"computer-controller.json\")),\n startupStatus(directory), discoveryPreference(directory),\n readJSON<{ stopped: boolean }>(join(directory, \"computer-stopped.json\")),\n readJSON<ComputerUpdate>(join(directory, \"computer-update.json\")),\n readJSON<ComputerConnectionChange>(join(directory, \"computer-connection-change.json\")),\n ]);\n const alive = await processStateAlive(controller).catch(() => false);\n const result: ComputerInspection = { name: hostname(), cliVersion: SDK_VERSION,\n service: !config ? \"not-configured\" : stopped?.stopped ? \"stopped\" : alive ? \"starting\" : \"unavailable\",\n online: false, startup, discoveryPreference: preference, devices: [], update,\n connection: config && connectionInfo(config.relay, config.host),\n problem: controller?.error, recoveryProblem: controller?.discoveryError,\n recovering: controller?.recovering, relayError: controller?.error, relayErrorCode: controller?.errorCode,\n connectionChange: change && { status: change.status, message: change.message } };\n if (!config || stopped?.stopped) return result;\n try {\n const client = await computerClient(directory);\n const [info, health, work, devices] = await Promise.all([\n client.computer.info(), client.health(), client.service.updateStatus(), client.computer.devices(),\n ]);\n return { ...result, service: \"running\", online: alive && !!controller?.ready,\n info, daemonVersion: health.version, activeOperations: work.activeOperations,\n connection: info.connection ?? result.connection, discovery: info.discovery, devices };\n } catch {\n return { ...result, problem: result.problem ?? (alive ? \"The service is starting.\" : \"The background service is not running.\") };\n }\n}\n\nexport function recoverySummary(state: ComputerInspection): string {\n if (state.discoveryPreference?.enabled === false) return \"Off\";\n if (state.discovery?.enabled) {\n if (state.discovery.error) return \"Needs attention\";\n if (!state.discovery.sequence || state.discovery.sequence !== state.discovery.publishedSequence) return \"Publishing address\";\n const saved = state.devices.filter(device => !device.revoked);\n if (saved.length && saved.some(device => !device.addressRecovery)) return \"Finish setup on your phone\";\n return \"Ready\";\n }\n if (state.connection?.address === \"persistent\") return \"Persistent address\";\n if (state.connection?.provider === \"direct\") return \"Direct / VPN\";\n if (state.recoveryProblem) return \"Needs attention\";\n return state.discoveryPreference?.enabled ? \"Setting up\" : \"Not set up\";\n}\n\nexport function inspectionText(state: ComputerInspection, detailed = false): string {\n const devices = state.devices.filter(device => !device.revoked);\n const connected = devices.filter(device => device.connected).length;\n const running = state.service === \"running\";\n const startup = state.startup.enabled ? state.startup.running ? \"On\" : \"Needs repair\" : \"Off\";\n const lines = [\n `Mindwire ${state.cliVersion} · ${state.name}`,\n \"\",\n ` Service ${running ? `${state.daemonVersion} · running` : state.service.replaceAll(\"-\", \" \")}`,\n ` Connection ${state.online ? connected ? `${connected} phone${connected === 1 ? \"\" : \"s\"} connected` : \"Ready for your phone\" : \"Offline\"}`,\n ` Auto reconnect ${recoverySummary(state)}`,\n ` Start at login ${startup}`,\n ];\n if (state.update && [\"queued\", \"downloading\", \"waiting\", \"restarting\"].includes(state.update.status)) {\n lines.push(` Update ${state.update.version} · ${state.update.status === \"waiting\" ? `waiting for ${state.activeOperations ?? \"active\"} operation(s)` : state.update.status}`);\n }\n if (detailed) {\n if (state.connection) lines.push(` Carrier ${state.connection.provider}`);\n if (state.discovery?.url) lines.push(` Directory ${state.discovery.url}`);\n if (state.info) {\n lines.push(` Service PID ${state.info.pid}`, ` Computer ${state.info.computerId}`, ` Host key ${state.info.fingerprint}`);\n for (const route of state.info.routes) lines.push(` Address ${route.kind === \"ssh\" ? `${route.host}:${route.port}` : route.url}`);\n }\n if (state.problem) lines.push(\"\", state.problem);\n if (state.recoveryProblem) lines.push(\"\", state.recoveryProblem);\n if (state.discovery?.error) lines.push(\"\", state.discovery.error);\n if (state.connectionChange?.status === \"failed\") lines.push(\"\", state.connectionChange.message ?? \"Connection provider change failed.\");\n }\n return lines.map(terminalText).join(\"\\n\");\n}\n","import { inspectComputer, inspectionText, recoverySummary } from \"./inspection.js\";\nimport { chooseTerminal, terminalText, type TerminalChoice } from \"./terminal-ui.js\";\nimport { terminalSetupPrompt } from \"./setup-prompt.js\";\nimport { deviceSummary } from \"./connection-flow.js\";\nimport { activeUpdate } from \"./service-update.js\";\n\nexport async function computerDashboard(directory: string, run: (args: string[]) => Promise<void>): Promise<void> {\n for (;;) {\n const state = await inspectComputer(directory);\n const saved = state.devices.filter(device => !device.revoked);\n const running = state.service === \"running\";\n const action = await chooseTerminal([...inspectionText(state).split(\"\\n\"), \"\", \"Manage this computer\"], [\n { value: \"reconnect\", label: running ? \"Reconnect\" : \"Start connection\" },\n { value: \"pair\", label: \"Pair or repair a phone\" },\n { value: \"devices\", label: `Phones${saved.length ? ` · ${saved.length} paired` : \"\"}` },\n { value: \"startup\", label: `Start at login · ${state.startup.enabled ? state.startup.running ? \"On\" : \"Needs repair\" : \"Off\"}` },\n { value: \"connection\", label: \"Connection provider\" },\n ...(process.platform === \"darwin\" ? [{ value: \"desktop\", label: \"Desktop access\" }] : []),\n { value: \"recovery\", label: `Automatic reconnection · ${recoverySummary(state)}` },\n { value: \"update\", label: activeUpdate(state.update) ? `Service update · ${state.update!.status}` : \"Update service\" },\n { value: \"inspect\", label: \"Connection details\" },\n ...(running ? [{ value: \"stop\", label: \"Stop Mindwire\" }] : []),\n { value: \"exit\", label: \"Exit\" },\n ]);\n if (!action || action === \"exit\") return;\n try {\n switch (action) {\n case \"reconnect\": await run([\"reconnect\"]); break;\n case \"pair\": await run([\"connect\", \"pair\"]); break;\n case \"connection\": await run([\"connection\"]); break;\n case \"desktop\": await run([\"desktop\"]); break;\n case \"inspect\": await run([\"inspect\"]); break;\n case \"devices\": {\n if (!saved.length) { process.stdout.write(\"No paired phones. Choose Pair or repair a phone to connect one.\\n\"); break; }\n const id = await chooseTerminal(\"Paired phones\", saved.map(device => ({ value: device.id, label: deviceSummary([device], true).trim() })));\n const device = saved.find(value => value.id === id);\n if (!device) break;\n const decision = await chooseTerminal([\n terminalText(device.name),\n `Key ${terminalText(device.id)}`,\n `Address recovery: ${device.addressRecovery ? \"Ready\" : \"Open this phone to finish setup\"}`,\n \"\",\n ], [{ value: \"back\", label: \"Back\" }, { value: \"revoke\", label: \"Revoke access and disconnect this phone\" }]);\n if (decision === \"revoke\") await run([\"revoke\", \"--\", id!]);\n break;\n }\n case \"startup\": {\n const options: TerminalChoice[] = state.startup.enabled\n ? [{ value: \"repair\", label: \"Repair automatic startup\" }, { value: \"disable\", label: \"Turn off automatic startup\" }]\n : [{ value: \"enable\", label: \"Start Mindwire when I sign in\" }];\n const choice = await chooseTerminal(\"Start at login\", [...options, { value: \"back\", label: \"Back\" }]);\n if (choice && choice !== \"back\") await run([\"startup\", choice]);\n break;\n }\n case \"recovery\": {\n const enabled = state.discovery?.enabled;\n const choice = await chooseTerminal([\n \"Automatic reconnection\",\n \"Encrypted addresses only. No account needed.\",\n \"Files, commands and chats stay inside your SSH connection.\", \"\",\n ], [\n { value: \"enable\", label: enabled ? \"Check and repair address recovery\" : \"Enable address recovery\" },\n { value: \"directory\", label: \"Use a self-hosted directory\" },\n ...(enabled ? [{ value: \"disable\", label: \"Turn off address recovery\" }] : []),\n { value: \"back\", label: \"Back\" },\n ]);\n if (choice === \"directory\") {\n const url = await terminalSetupPrompt.question(\"Directory HTTPS URL: \");\n if (url) await run([\"discovery\", \"enable\", \"--directory-url\", url]);\n } else if (choice === \"enable\") await run([\"discovery\", \"enable\"]);\n else if (choice === \"disable\") {\n const decision = await chooseTerminal(\"A temporary address may need another scan after a restart.\", [\n { value: \"back\", label: \"Keep automatic recovery\" }, { value: \"disable\", label: \"Turn off recovery\" },\n ]);\n if (decision === \"disable\") await run([\"discovery\", \"disable\"]);\n }\n break;\n }\n case \"update\": await run([\"update\"]); break;\n case \"stop\": {\n const decision = await chooseTerminal(state.activeOperations\n ? \"Stopping Mindwire closes its terminals and active sessions.\"\n : \"Stop Mindwire until you choose Start again?\", [\n { value: \"back\", label: \"Keep running\" }, { value: \"stop\", label: \"Stop Mindwire\" },\n ]);\n if (decision === \"stop\") await run([\"stop\", ...(state.activeOperations ? [\"--force\"] : [])]);\n break;\n }\n }\n } catch (error) {\n process.stderr.write(`Mindwire: ${terminalText(error instanceof Error ? error.message : String(error))}\\n`);\n }\n if (!await chooseTerminal(\"\", [{ value: \"continue\", label: \"Back to Mindwire\" }])) return;\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { Mindwire } from \"../client.js\";\nimport type { LocalDesktopInfo } from \"../surfaces.js\";\nimport { terminalSetupPrompt, type SetupPrompt } from \"./setup-prompt.js\";\nimport { terminalText } from \"./terminal-ui.js\";\n\nexport function desktopSummary(info: LocalDesktopInfo): string {\n if (!info.supported) return \"Desktop control is available on macOS.\";\n if (!info.enabled) return \"Desktop access is off. Enable it with mindwire desktop enable.\";\n if (!info.screenSharing) return \"Desktop access needs Screen Sharing. Run mindwire desktop enable to finish setup.\";\n return \"Desktop access is on · paired SSH connection\";\n}\n\nexport function openScreenSharingSettings(): void {\n const child = spawn(\"/usr/bin/open\", [\"x-apple.systempreferences:com.apple.Sharing-Settings.extension?ScreenSharing\"], { stdio: \"ignore\" });\n child.on(\"error\", () => {});\n child.unref();\n}\n\n/** All activation happens here, on the Mac. Connecting/refreshing in the phone\n * can only observe this state; it cannot enable sharing or retrieve a password. */\nexport async function manageDesktop(options: {\n client: Mindwire; directory: string; action?: string; interactive: boolean; json?: boolean;\n prompt?: SetupPrompt; openSettings?: () => void; readControlToken?: () => Promise<string>;\n}): Promise<LocalDesktopInfo> {\n const { client, directory, interactive } = options;\n const prompt = options.prompt ?? terminalSetupPrompt;\n let action = options.action ?? (interactive ? \"menu\" : \"status\");\n if (![\"menu\", \"status\", \"enable\", \"disable\"].includes(action)) throw new Error(\"Use mindwire desktop, or mindwire desktop enable, disable or status.\");\n let info = await client.surfaces.localStatus();\n if (!info.supported) throw new Error(\"Desktop control is currently available on paired Macs.\");\n if (action === \"menu\") {\n const choices = [\n { value: \"enable\", label: info.enabled ? \"Check setup or update Mac login\" : \"Enable desktop access\" },\n ...(info.enabled ? [{ value: \"disable\", label: \"Disable desktop access\" }] : []),\n { value: \"status\", label: \"Back\" },\n ];\n action = await prompt.select?.(desktopSummary(info), choices) ?? \"status\";\n }\n if (action === \"status\") return info;\n if (action === \"enable\" && !interactive) throw new Error(\"Run mindwire desktop enable in an interactive terminal on your Mac. The password is entered privately there.\");\n const localToken = (await (options.readControlToken?.() ?? readFile(path.join(directory, \"desktop-control.token\"), \"utf8\"))).trim();\n if (!/^[a-f0-9]{64}$/.test(localToken)) throw new Error(\"Update and restart Mindwire on this Mac before setting up desktop access.\");\n if (action === \"disable\") {\n await client.surfaces.configureLocal({ enabled: false }, localToken);\n if (!options.json) prompt.print(\"Desktop access is off. Its active viewers and controls were closed.\\nApple Screen Sharing is unchanged; you can turn it off in Mac settings too.\");\n return client.surfaces.localStatus();\n }\n prompt.print(\"Desktop access\\nYour paired phones can view and control this Mac. Agents still need desktop approval.\\nThe display uses your existing encrypted SSH connection. The Mac login stays in Mindwire’s private credentials on this Mac.\");\n const decision = prompt.select ? await prompt.select(\"Allow desktop access?\", [\n { value: \"cancel\", label: \"Keep current settings\" }, { value: \"allow\", label: \"Allow desktop access\" },\n ]) : ((await prompt.question(\"Allow desktop access? [y/N]: \")).toLowerCase() === \"y\" ? \"allow\" : \"cancel\");\n if (decision !== \"allow\") return info;\n while (!info.screenSharing) {\n prompt.print(`In System Settings → General → Sharing, enable Screen Sharing.\\nAllow only ${terminalText(info.username)}. Leave password-only VNC access off.`);\n const choice = await prompt.select?.(\"Finish the Mac permission step\", [\n { value: \"open\", label: \"Open Screen Sharing settings\" },\n { value: \"check\", label: \"I enabled it — check again\" },\n { value: \"cancel\", label: \"Cancel setup\" },\n ]) ?? \"cancel\";\n if (choice === \"cancel\") return info;\n if (choice === \"open\") {\n (options.openSettings ?? openScreenSharingSettings)();\n await prompt.question(\"Enable Screen Sharing, then press Return to check: \");\n }\n info = await client.surfaces.localStatus();\n }\n const password = await prompt.secret(`Mac password for ${terminalText(info.username)} (hidden): `);\n if (!password || Buffer.byteLength(password) > 63 || password.includes(\"\\0\")) throw new Error(\"Enter your Mac password (up to 63 UTF-8 bytes). Desktop settings were not changed.\");\n await client.surfaces.configureLocal({ enabled: true, username: info.username, password }, localToken);\n prompt.print(\"Desktop access is on. Open Desktop in Mindwire on your phone.\\nTurn it off anytime with mindwire desktop disable.\");\n return client.surfaces.localStatus();\n}\n","#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport { fileURLToPath } from \"node:url\";\nimport { realpathSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { createInterface } from \"node:readline/promises\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { computerPairingURI } from \"./computer.js\";\nimport { SDK_VERSION } from \"./version.js\";\nimport { computerClient, defaultComputerConfig, defaultStateDirectory, ensureComputer, readJSON, stopComputer, superviseComputer, type ComputerConfig } from \"./computer/lifecycle.js\";\nimport type { RelayOptions } from \"./computer/relay.js\";\nimport { showPairingInvitation, type PairingQRMode } from \"./computer/pairing-display.js\";\nimport { configureStartup, startupStatus, watchComputer } from \"./computer/startup.js\";\nimport { approvalCommand, chooseConnectionAction, choosePairingDecision, chooseStartupAction, connectionAction, deviceSummary } from \"./computer/connection-flow.js\";\nimport { ConnectionProgress } from \"./computer/connection-progress.js\";\nimport { enableAddressDiscovery, disableAddressDiscovery, saveDiscoveryPreference, discoveryPreference, reconcileAddressDiscovery, discoveryDescription } from \"./computer/discovery.js\";\nimport { connectionAddress, connectionDescription, connectionInfo } from \"./computer/provider-info.js\";\nimport { chooseProvider, connectionProvider, setupProvider } from \"./computer/provider-setup.js\";\nimport { terminalSetupPrompt } from \"./computer/setup-prompt.js\";\nimport { runManagedRelay } from \"./computer/managed-relay.js\";\nimport { inspectComputer, inspectionText } from \"./computer/inspection.js\";\nimport { computerDashboard } from \"./computer/dashboard.js\";\nimport { chooseTerminal } from \"./computer/terminal-ui.js\";\nimport { updateComputer, updateProgress } from \"./computer/service-update.js\";\nimport { manageDesktop, desktopSummary } from \"./computer/desktop.js\";\n\nconst help = `Mindwire — connect this computer to your phone\n\n npm install -g mindwire\n mindwire Interactive status and connection controls\n mindwire connect Connect your phone; saved keys reconnect automatically\n mindwire reconnect Retry the saved connection\n mindwire connect pair Pair a phone, or repair a lost phone key/address\n mindwire connection Choose a persistent connection provider\n mindwire connection automatic Cloudflare traffic with encrypted Mindwire address recovery\n mindwire connection oblien Sign in and use an Oblien tunnel\n mindwire connection cloudflare Sign in and configure your Cloudflare domain\n mindwire connection ngrok Connect your ngrok account and reserved domain\n mindwire discovery enable Enable encrypted address recovery (no account)\n mindwire discovery status Check encrypted address recovery\n mindwire discovery disable Withdraw the saved address directory\n mindwire connect --relay none --host laptop.tailnet Use your existing VPN\n mindwire connect --relay none Direct SSH only (reachable network required)\n mindwire connect --relay cloudflare Cloudflare quick tunnel\n mindwire connect --relay ngrok ngrok (uses its configured account)\n mindwire connect --relay custom --relay-url wss://computer.example/ssh\n\n mindwire start Start the saved connection in the background\n mindwire startup enable|disable|repair Manage automatic startup after computer login\n mindwire startup status Check automatic startup\n mindwire status Show connection and running service\n mindwire inspect Connection details, recovery and diagnostics\n mindwire devices List paired phones\n mindwire desktop Desktop status and Mac permission setup\n mindwire desktop enable|disable Allow or stop desktop access from this Mac\n mindwire desktop status Check desktop setup\n mindwire revoke DEVICE_ID Disconnect and revoke one phone\n mindwire update [--version VERSION] Download a verified release; wait until idle\n mindwire update --force Restart now, closing active terminals and sessions\n mindwire stop Stop when no work or terminals are running\n\nOptions:\n --directory PATH Initial workspace directory (default: home)\n --host HOST Reachable LAN, public or VPN hostname\n --relay none|oblien|cloudflare|ngrok|custom Explicit provider (skips the setup menu)\n --relay-url URL Stable configured WebSocket hostname\n --cloudflare-token-file PATH Named Cloudflare tunnel token file\n --ngrok-token-file PATH Private JSON file containing {\"token\":\"…\"}\n --oblien-credentials-file PATH Private Oblien session/API credential JSON\n --oblien-tunnel-id ID This computer's existing Oblien tunnel ID\n --directory-url URL Directory HTTPS API URL (or MINDWIRE_DIRECTORY_URL)\n --state-dir PATH Private state directory\n --json Structured output (QR invitation includes a secret)\n --qr auto|terminal|browser Fit the QR to your terminal or open a local page\n --no-qr Print only the pairing link\n --startup Enable automatic startup without a prompt\n --no-startup Skip automatic startup setup\n --replace-device DEVICE_ID With approve: replace a lost phone key (repeatable)\n\nInteractive setup offers persistent addresses across Wi-Fi and mobile networks.\nProvider logins and tokens stay on your computer. Relays carry encrypted SSH;\nthey can see connection metadata, but cannot decrypt files, commands or chats.\nQuick Cloudflare tunnels remain available for temporary use. Direct SSH needs a reachable network or VPN.\nNothing changes your system SSH login.\n`;\n\nfunction safeName(text: string): string { return text.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \"\"); }\n\nexport async function main(args = process.argv.slice(2)): Promise<void> {\n if (args.some(value => [\"--version\", \"-v\", \"version\"].includes(value))\n && args.every(value => [\"--version\", \"-v\", \"version\", \"--json\"].includes(value))) {\n process.stdout.write(args.includes(\"--json\") ? JSON.stringify({ version: SDK_VERSION }) + \"\\n\" : SDK_VERSION + \"\\n\");\n return;\n }\n const { values, positionals } = parseArgs({ args, allowPositionals: true, options: {\n help: { type: \"boolean\", short: \"h\" }, json: { type: \"boolean\" }, \"no-qr\": { type: \"boolean\" }, qr: { type: \"string\" },\n \"state-dir\": { type: \"string\" }, directory: { type: \"string\" }, host: { type: \"string\" },\n relay: { type: \"string\" }, \"relay-url\": { type: \"string\" }, \"cloudflare-token-file\": { type: \"string\" },\n \"ngrok-token-file\": { type: \"string\" }, \"oblien-credentials-file\": { type: \"string\" }, \"oblien-tunnel-id\": { type: \"string\" },\n \"relay-config\": { type: \"string\" },\n \"directory-url\": { type: \"string\" },\n \"daemon-bin\": { type: \"string\" }, bind: { type: \"string\" }, port: { type: \"string\" }, \"websocket-port\": { type: \"string\" },\n version: { type: \"string\" }, force: { type: \"boolean\" }, startup: { type: \"boolean\" }, \"no-startup\": { type: \"boolean\" },\n \"replace-device\": { type: \"string\", multiple: true },\n } });\n const interactive = !values.json && !!process.stdin.isTTY && !!process.stderr.isTTY && process.env.TERM !== \"dumb\";\n const command = positionals[0] ?? (interactive ? \"dashboard\" : \"help\");\n if (values.help || command === \"help\") { process.stdout.write(help); return; }\n if (![\"dashboard\", \"connect\", \"start\", \"reconnect\", \"connection\", \"startup\", \"discovery\", \"desktop\", \"status\", \"inspect\", \"devices\", \"revoke\", \"approve\", \"reject\", \"update\", \"stop\", \"_serve\", \"_watch\", \"_relay\"].includes(command))\n throw new Error(`Unknown command ${safeName(command)}. Run mindwire --help.`);\n if (values.qr && ![\"auto\", \"terminal\", \"browser\"].includes(values.qr)) throw new Error(\"Choose --qr auto, terminal or browser.\");\n if (values.startup && values[\"no-startup\"]) throw new Error(\"Choose either --startup or --no-startup.\");\n const directory = path.resolve(values[\"state-dir\"] ?? defaultStateDirectory());\n const discoveryOptions = { url: values[\"directory-url\"] };\n const emit = (event: string, data: object = {}, text?: string) => {\n if (values.json) process.stdout.write(JSON.stringify({ event, ...data }) + \"\\n\");\n else if (text) process.stdout.write(text + \"\\n\");\n };\n if (command === \"desktop\") {\n if (process.platform !== \"darwin\") throw new Error(\"Desktop setup is currently available on macOS. Your other Mindwire features are unchanged.\");\n const client = await computerClient(directory, 30_000);\n const health = await client.health();\n if ((health.localDesktopVersion ?? 0) < 1) throw new Error(\"Update the Mindwire service on this Mac before setting up desktop access: mindwire update\");\n const info = await manageDesktop({ client, directory, action: positionals[1], interactive, json: values.json });\n emit(\"desktop\", info, desktopSummary(info));\n return;\n }\n if (command === \"dashboard\") {\n await computerDashboard(directory, next => main([\"--state-dir\", directory,\n ...(values[\"directory-url\"] && !next.includes(\"--directory-url\") ? [\"--directory-url\", values[\"directory-url\"]] : []), ...next]));\n return;\n }\n if (command === \"status\" || command === \"inspect\") {\n const state = await inspectComputer(directory);\n emit(command, { ...state.info, ...state, idle: state.activeOperations === 0 }, inspectionText(state, command === \"inspect\"));\n return;\n }\n if (command === \"_serve\") { await superviseComputer(directory); return; }\n if (command === \"_relay\") {\n if (!values[\"relay-config\"]) throw new Error(\"Missing relay configuration.\");\n await runManagedRelay(path.resolve(values[\"relay-config\"])); return;\n }\n if (command === \"_watch\") { await watchComputer(directory, fileURLToPath(import.meta.url)); return; }\n if (command === \"startup\") {\n const action = positionals[1] ?? \"status\";\n if (![\"enable\", \"disable\", \"repair\", \"status\"].includes(action)) throw new Error(\"Use mindwire startup enable, disable, repair or status.\");\n const state = action === \"status\" ? await startupStatus(directory)\n : await configureStartup(directory, fileURLToPath(import.meta.url), action !== \"disable\", { repair: action === \"repair\" });\n emit(\"startup\", state, state.enabled ? state.running ? \"Mindwire starts after you sign in to this computer.\"\n : \"Automatic startup needs repair. Run mindwire startup repair.\"\n : \"Automatic startup is off. Use mindwire start to run the service.\");\n return;\n }\n if (command === \"discovery\") {\n const action = positionals[1] ?? \"status\";\n if (![\"enable\", \"disable\", \"status\"].includes(action)) throw new Error(\"Use mindwire discovery enable, disable or status.\");\n const client = action === \"status\" ? await computerClient(directory)\n : await ensureComputer(directory, fileURLToPath(import.meta.url), {}, undefined, { waitForRoutes: false });\n const status = action === \"enable\"\n ? await enableAddressDiscovery({ directory, computer: client, prompt: terminalSetupPrompt, ...discoveryOptions })\n : action === \"disable\" ? await disableAddressDiscovery(directory, client) : await client.computer.discovery();\n emit(\"discovery\", status, discoveryDescription(status));\n if (action === \"enable\") emit(\"discovery_hint\", {}, \"Open each saved phone once while its current address works. Pair new phones with mindwire connect pair.\");\n return;\n }\n if ([\"connect\", \"start\", \"reconnect\", \"connection\"].includes(command)) {\n let requestedAction = command === \"reconnect\" ? \"reconnect\" as const : command === \"connect\" ? connectionAction(positionals[1]) : undefined;\n let automaticDiscovery = false, temporaryConnection = false, addressChanged = false;\n const patch: Partial<ComputerConfig> = {};\n const previous = await readJSON<ComputerConfig>(path.join(directory, \"computer-config.json\"));\n if (values.directory) patch.directory = path.resolve(values.directory);\n if (values.host) patch.host = values.host;\n if (values.bind) patch.bind = values.bind;\n for (const [flag, field] of [[\"port\", \"sshPort\"], [\"websocket-port\", \"websocketPort\"]] as const) {\n if (values[flag] !== undefined) {\n const n = Number(values[flag]);\n if (!Number.isInteger(n) || n < 0 || n > 65535) throw new Error(`Invalid --${flag}.`);\n patch[field] = n;\n }\n }\n if (values[\"daemon-bin\"] || process.env.MINDWIRE_DAEMON) patch.daemonBin = path.resolve(values[\"daemon-bin\"] ?? process.env.MINDWIRE_DAEMON!);\n if (values.version) {\n patch.version = values.version.replace(/^v/, \"\");\n if (!previous) patch.versionPinned = true;\n }\n if (values.relay || values[\"relay-url\"] || values[\"cloudflare-token-file\"] || values[\"ngrok-token-file\"] || values[\"oblien-credentials-file\"]) {\n const kind = values.relay ?? \"custom\";\n if (![\"none\", \"oblien\", \"cloudflare\", \"ngrok\", \"custom\"].includes(kind)) throw new Error(\"Choose relay none, oblien, cloudflare, ngrok or custom.\");\n const tunnelId = values[\"oblien-tunnel-id\"] === undefined ? undefined : Number(values[\"oblien-tunnel-id\"]);\n if (tunnelId !== undefined && (!Number.isSafeInteger(tunnelId) || tunnelId <= 0)) throw new Error(\"Invalid Oblien tunnel ID.\");\n patch.relay = { kind: kind as RelayOptions[\"kind\"], url: values[\"relay-url\"],\n cloudflareTokenFile: values[\"cloudflare-token-file\"] ? path.resolve(values[\"cloudflare-token-file\"]) : undefined,\n ngrokTokenFile: values[\"ngrok-token-file\"] ? path.resolve(values[\"ngrok-token-file\"]) : undefined,\n oblienCredentialsFile: values[\"oblien-credentials-file\"] ? path.resolve(values[\"oblien-credentials-file\"]) : undefined,\n oblienTunnelId: tunnelId };\n }\n const needsSetup = command === \"connection\" || command === \"connect\" && !previous && !patch.relay && interactive\n || patch.relay?.kind === \"oblien\" && !patch.relay.oblienCredentialsFile;\n if (needsSetup) {\n const selected = command === \"connection\" && positionals[1] ? connectionProvider(positionals[1]) : undefined;\n if (!interactive && selected !== \"automatic\" && selected !== \"temporary\")\n throw new Error(\"Run mindwire connection in an interactive terminal, or supply the provider's saved URL and credential-file options.\");\n const provider = selected ?? (patch.relay?.kind === \"oblien\" ? \"oblien\" : await chooseProvider(terminalSetupPrompt));\n automaticDiscovery = provider === \"automatic\";\n temporaryConnection = provider === \"temporary\";\n Object.assign(patch, await setupProvider({ directory, provider, prompt: terminalSetupPrompt,\n config: { ...defaultComputerConfig(), ...previous, ...patch } }));\n if (!previous || connectionAddress(patch.relay ?? previous.relay, patch.host ?? previous.host)\n !== connectionAddress(previous.relay, previous.host)) addressChanged = true;\n }\n if (temporaryConnection) await saveDiscoveryPreference(directory, { enabled: false });\n if (automaticDiscovery) await saveDiscoveryPreference(directory, {\n enabled: true, url: values[\"directory-url\"] ?? (await discoveryPreference(directory))?.url,\n });\n // Enroll before replacing a working provider. An unavailable directory must\n // not turn an existing connected computer into an unreachable one.\n if (automaticDiscovery && previous) {\n const running = await ensureComputer(directory, fileURLToPath(import.meta.url), {}, undefined, { waitForRoutes: false });\n await enableAddressDiscovery({ directory, computer: running, prompt: terminalSetupPrompt, ...discoveryOptions });\n }\n const progress = !values.json && process.stderr.isTTY && process.env.TERM !== \"dumb\" ? new ConnectionProgress(process.stderr) : undefined;\n emit(\"starting\", {}, progress ? undefined : \"Starting Mindwire…\");\n const client = await ensureComputer(directory, fileURLToPath(import.meta.url), patch, phase => {\n if (progress) progress.update(phase);\n else emit(\"progress\", { message: phase }, phase);\n }).finally(() => progress?.close());\n const savedConfig = await readJSON<ComputerConfig>(path.join(directory, \"computer-config.json\"));\n try {\n if (temporaryConnection) await disableAddressDiscovery(directory, client);\n else if (savedConfig) await reconcileAddressDiscovery({ directory, config: savedConfig, computer: client });\n } catch (error) {\n emit(\"recovery_pending\", {}, `Automatic reconnection: ${safeName(error instanceof Error ? error.message : \"Setup will retry in the background.\")}`);\n }\n const info = await client.computer.info();\n const connection = connectionInfo(savedConfig?.relay ?? { kind: \"cloudflare\" }, savedConfig?.host);\n emit(\"ready\", { computerId: info.computerId, routes: info.routes, connection }, \"Mindwire is running in the background.\");\n emit(\"connection\", connection, info.discovery?.enabled && connection.address === \"temporary\"\n ? \"Cloudflare · encrypted Mindwire address recovery\" : connectionDescription(connection));\n if (command === \"start\") return;\n if (info.routes.some(route => route.kind === \"websocket\")) {\n emit(\"secure_connection\", {}, \"Your phone connects over end-to-end encrypted SSH. The tunnel carries encrypted traffic; only phones you approve can connect.\");\n }\n const devices = await client.computer.devices();\n const saved = devices.filter(device => !device.revoked);\n if (addressChanged && !saved.some(device => device.addressRecovery)) requestedAction = \"pair\";\n if (info.discovery?.enabled) emit(\"discovery\", info.discovery, discoveryDescription(info.discovery));\n if (saved.length) emit(\"saved_devices\", { devices: saved }, `\\nSaved approvals on this computer\\n${deviceSummary(saved)}`);\n const question = !values.json && process.stdin.isTTY ? async (prompt: string): Promise<string> => {\n const input = createInterface({ input: process.stdin, output: process.stderr });\n try { return await input.question(prompt); } finally { input.close(); }\n } : undefined;\n const action = await chooseConnectionAction({ requested: requestedAction, devices, persistent: connection.address === \"persistent\" });\n const startupPreference = await startupStatus(directory);\n const startupAction = await chooseStartupAction({ state: startupPreference,\n startup: values.startup, noStartup: values[\"no-startup\"],\n question: action === \"pair\" && saved.length === 0 ? question : undefined });\n if (startupAction !== undefined) {\n try {\n const startup = await configureStartup(directory, fileURLToPath(import.meta.url), startupAction);\n emit(\"startup\", startup, startup.enabled\n ? \"Automatic startup enabled. Saved phones can reconnect after you sign in to this computer.\"\n : \"Automatic startup is off. Run mindwire connect after restarting, or mindwire startup enable to change this.\");\n } catch {\n emit(\"startup_unavailable\", {}, \"Mindwire is running, but startup setup didn't complete. Run mindwire startup enable to check your system's startup service.\");\n }\n } else {\n emit(\"startup\", startupPreference, startupPreference.enabled\n ? startupPreference.running ? \"Automatic startup is on. Change it with mindwire startup disable.\"\n : \"Automatic startup needs repair. Run mindwire startup repair.\"\n : \"Automatic startup is off. Enable it with mindwire startup enable.\");\n }\n if (action === \"resume\") {\n const connected = saved.filter(device => device.connected);\n if (connected.length) emit(\"connected\", { computerId: info.computerId, devices: connected }, `\\nConnected:\\n${deviceSummary(connected)}\\nMindwire continues running in the background.`);\n else emit(\"waiting_for_phone\", { computerId: info.computerId }, \"\\nReady for your saved phone. Open Mindwire; it will retry this computer's saved connection.\");\n emit(\"connect_hint\", {}, \"If the connection was removed from your phone, run mindwire connect pair to scan again.\");\n return;\n }\n const invitation = await client.computer.invite((await client.computer.info()).routes);\n const uri = computerPairingURI(invitation);\n emit(\"invitation\", { invitation, uri });\n const display = values.json ? undefined : await showPairingInvitation(invitation, {\n mode: values[\"no-qr\"] ? \"none\" : (values.qr ?? \"auto\") as PairingQRMode,\n });\n try {\n let shownRequest: string | undefined;\n let authorized = false;\n while (Date.now() < Date.parse(invitation.expiresAt)) {\n const pairing = await client.computer.pairing(invitation.pairingId);\n if (pairing.status === \"waiting\" && requestedAction !== \"pair\" && requestedAction !== \"reconnect\") {\n const connected = (await client.computer.devices()).filter(device => !device.revoked && device.connected);\n if (connected.length && ((info.pairingVersion ?? 0) < 2 || (await client.computer.closeUnusedPairing(invitation.pairingId)).cancelled)) {\n display?.close();\n emit(\"connected\", { computerId: info.computerId, devices: connected }, `Connected:\\n${deviceSummary(connected)}\\nMindwire continues running in the background.`);\n return;\n }\n }\n if (pairing.status === \"approved\") {\n display?.close();\n if (pairing.completed) {\n emit(\"paired\", { computerId: info.computerId, completed: true }, \"Phone connected and saved. You can close this terminal; Mindwire keeps running.\");\n return;\n }\n if (!authorized) {\n authorized = true;\n emit(\"authorized\", {}, \"Phone approved. Keep Mindwire open on your phone while it saves the connection…\");\n }\n await delay(750);\n continue;\n }\n if (pairing.status === \"rejected\") { display?.close(); emit(\"rejected\", {}, \"Pairing declined.\"); return; }\n if (pairing.request && shownRequest !== pairing.request.id) {\n display?.close();\n shownRequest = pairing.request.id;\n const key = Buffer.from(pairing.request.publicKey.split(\" \")[1] ?? \"\", \"base64\");\n const fingerprint = \"SHA256:\" + createHash(\"sha256\").update(key).digest(\"base64\").replace(/=+$/, \"\");\n const deviceId = createHash(\"sha256\").update(key).digest(\"base64url\");\n const replacements = (info.pairingVersion ?? 0) >= 2 ? (await client.computer.devices()).filter(device =>\n !device.revoked && device.id !== deviceId && device.name === pairing.request!.name) : [];\n emit(\"approval_required\", { pairingId: invitation.pairingId, request: pairing.request, fingerprint, replacements },\n `\\n${safeName(pairing.request.name)} wants to connect.\\nDevice key: ${fingerprint}\\nAccess: files and commands as your computer account.`);\n if (!question) {\n const command = approvalCommand(invitation.pairingId, pairing.request.id);\n emit(\"approval_command\", { command }, `Review this device, then run:\\n${command}`);\n } else {\n const decision = await choosePairingDecision({ replacements, question });\n await client.computer.decide(invitation.pairingId, pairing.request.id, decision.approve,\n decision.replaceDeviceIds ? { replaceDeviceIds: decision.replaceDeviceIds } : {});\n }\n }\n await delay(750);\n }\n throw new Error(authorized\n ? \"The phone was approved but did not finish saving. Run mindwire connect and scan again; its saved key will be reused.\"\n : \"Connection code expired. Run mindwire connect to show a new QR code.\");\n } finally { display?.close(); }\n }\n if (command === \"stop\") { await stopComputer(directory, values.force === true); emit(\"stopped\", {}, \"Mindwire stopped.\"); return; }\n if (command === \"update\") {\n const client = await ensureComputer(directory, fileURLToPath(import.meta.url), {}, undefined, { waitForRoutes: false });\n let force = values.force === true;\n if (interactive && !force && !(await client.service.updateStatus()).idle) {\n const choice = await chooseTerminal(\"An update can restart Mindwire while work is open.\", [\n { value: \"wait\", label: \"Update when idle\" },\n { value: \"restart\", label: \"Restart now — close terminals and active sessions\" },\n { value: \"cancel\", label: \"Cancel\" },\n ]);\n if (!choice || choice === \"cancel\") return;\n force = choice === \"restart\";\n }\n const result = await updateComputer({ directory, version: values.version ?? SDK_VERSION, force,\n allowDowngrade: !!values.version, onProgress: update => emit(\"update\", update, updateProgress(update)) });\n emit(result.complete ? \"updated\" : \"update_pending\", result, result.complete\n ? `Mindwire service ${result.version} is installed.`\n : `${result.update?.version} is ${result.update?.status === \"waiting\" ? \"waiting for active work to finish\" : \"updating in the background\"}.${result.update?.version !== result.version ? ` Run mindwire update again after it completes to check ${result.version}.` : \" You can close this terminal.\"} Run mindwire inspect for status.`);\n return;\n }\n const client = await computerClient(directory);\n switch (command) {\n case \"devices\": {\n const devices = await client.computer.devices();\n emit(\"devices\", { devices }, devices.length ? devices.map(d => `${safeName(d.name)} ${d.id}${d.revoked ? \" (revoked)\" : \"\"}`).join(\"\\n\") : \"No paired phones yet. Run mindwire connect.\");\n break;\n }\n case \"revoke\": {\n if (!positionals[1]) throw new Error(\"Use mindwire revoke DEVICE_ID (from mindwire devices).\");\n await client.computer.revoke(positionals[1]); emit(\"revoked\", {}, \"Device revoked and disconnected.\"); break;\n }\n case \"approve\": case \"reject\": {\n if (!positionals[1] || !positionals[2]) throw new Error(`Use mindwire ${command} PAIRING_ID REQUEST_ID.`);\n await client.computer.decide(positionals[1], positionals[2], command === \"approve\",\n values[\"replace-device\"] ? { replaceDeviceIds: values[\"replace-device\"] } : {});\n emit(command, {}, command === \"approve\" ? \"Phone approved. Waiting for it to save the connection.\" : \"Phone declined.\"); break;\n }\n default: throw new Error(`Unknown command ${command}. Run mindwire --help.`);\n }\n}\n\nfunction isCLIEntry(): boolean {\n if (!process.argv[1]) return false;\n try {\n // npm links its bin command: argv keeps the link, while ESM resolves the module.\n return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));\n } catch {\n // Importing the CLI from an eval or another program must not start a service.\n return false;\n }\n}\n\nif (isCLIEntry()) {\n void main().catch(error => {\n const message = error instanceof Error ? error.message : String(error);\n if (process.argv.includes(\"--json\")) process.stderr.write(JSON.stringify({ event: \"error\", message }) + \"\\n\");\n else process.stderr.write(`Mindwire: ${message}\\n`);\n process.exitCode = 1;\n });\n}\n"]}
|