{"version":3,"file":"install.mjs","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,OAAO,EAAE,KAAK,EAAE,2BAA2B;AAC3C,OAAO,EAAE,UAAU,EAAE,oBAAoB;AACzC,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,QAAQ,EACT,gBAAgB;AACjB,OAAO,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,EAAE,EACF,MAAM,EACN,SAAS,EACV,yBAAyB;AAC1B,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,kBAAkB;AACnD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,mBAAmB;AACrD,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,gBAAgB;AAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB;AACnD,OAAO,EAAE,QAAQ,EAAE,6BAA6B;AAEhD,MAAM,+BAA+B,GAAG,oBAAoB,CAAC;AAC7D,MAAM,4BAA4B,GAAG,cAAc,CAAC;AAgDpD,MAAM,CAAC,MAAM,4BAA4B,GAAiC;IACxE,OAAO,EAAE,MAAM;IACf,SAAS,EAAE;QACT,cAAc,EAAE;YACd,QAAQ,EACN,kEAAkE;YACpE,GAAG,EAAE,sFAAsF;SAC5F;QACD,YAAY,EAAE;YACZ,QAAQ,EACN,kEAAkE;YACpE,GAAG,EAAE,uFAAuF;SAC7F;QACD,aAAa,EAAE;YACb,QAAQ,EACN,kEAAkE;YACpE,GAAG,EAAE,qFAAqF;SAC3F;QACD,WAAW,EAAE;YACX,QAAQ,EACN,kEAAkE;YACpE,GAAG,EAAE,oFAAoF;SAC1F;KACF;CACF,CAAC;AAEF,MAAM,UAAU,+BAA+B,CAAC,EAC9C,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,aAAa,GAAG,OAAO,EAAE,MAIvB,EAAE;IACJ,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,qCAAqC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CACV,0BAA0B,UAAU,yCAAyC,EAC7E,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,+CAA+C,CAAC,EAC9D,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,MAIzC,EAAE;IACJ,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CACT,CAAC;IAC/B,MAAM,MAAM,GACV,WAAW,CAAC,gBAAgB;QAC5B,WAAW,CAAC,gBAAgB;QAC5B,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACpC,MAAM,OAAO,GAAiC,EAAE,CAAC;IAEjD,IAAI,MAAM,EAAE,YAAY,EAAE,CAAC;QACzB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC7C,CAAC;IACD,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;QACxB,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAC3C,CAAC;IACD,IAAI,MAAM,EAAE,cAAc,EAAE,CAAC;QAC3B,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;IACjD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oCAAoC,CAClD,IAAc;IAEd,MAAM,OAAO,GAAiC,EAAE,CAAC;IACjD,MAAM,WAAW,GAAkD,EAAE,CAAC;IAEtE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAE9B,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,iBAAiB;gBACpB,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAChD,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,KAAK,yBAAyB;gBAC5B,WAAW,CAAC,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAChD,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,KAAK,oBAAoB;gBACvB,WAAW,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC3C,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,KAAK,mBAAmB;gBACtB,OAAO,CAAC,cAAc,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClD,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,KAAK,YAAY;gBACf,OAAO,CAAC,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC5C,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,8CAA8C,GAAG,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC5C,OAAO,CAAC,WAAW,GAAG;YACpB,SAAS,EAAE;gBACT,OAAO,EAAE,6BAA6B,CACpC,WAAW,EACX,0BAA0B,CAC3B;aACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAAwC,EAAE,EAC1C,eAAkD,EAAE;IAEpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,cAAc,GAClB,OAAO,CAAC,cAAc,IAAI,+BAA+B,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACrE,MAAM,YAAY,GAChB,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,IAAI,cAAc,EAAE,CAAC;IACzD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,4BAA4B,CAAC;IACxE,MAAM,iBAAiB,GAAG,qBAAqB,CAC7C,WAAW,EACX,WAAW,EACX,sBAAsB,CACvB,CAAC;IACF,MAAM,iBAAiB,GAAG,MAAM,yBAAyB,CACvD,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAC7C,YAAY,CACb,CAAC;IACF,MAAM,cAAc,GAAG,MAAM,wBAAwB,CAAC;QACpD,YAAY;QACZ,WAAW,EAAE,UAAU;QACvB,cAAc,EAAE,iBAAiB,CAAC,kBAAkB;QACpD,cAAc,EAAE,iBAAiB,CAAC,oBAAoB;KACvD,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,MAAM,wBAAwB,CAAC;QACtD,YAAY;QACZ,WAAW,EAAE,aAAa;QAC1B,cAAc,EAAE,iBAAiB,CAAC,sBAAsB;KACzD,CAAC,CAAC;IAEH,OAAO;QACL,gBAAgB;QAChB,cAAc;QACd,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;QACpC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;QACpC,kBAAkB,EAAE,iBAAiB,CAAC,kBAAkB;QACxD,sBAAsB,EAAE,iBAAiB,CAAC,sBAAsB;QAChE,oBAAoB,EAAE,iBAAiB,CAAC,oBAAoB;QAC5D,OAAO,EAAE,WAAW,CAAC,OAAO;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,UAAwE,EAAE;IAE1E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,cAAc,GAClB,OAAO,CAAC,cAAc,IAAI,+BAA+B,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAErE,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,+BAA+B,CAAC,EAAE;QAC9D,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,EACE,cAAc,EACd,MAAM,GAIP,EACD,YAA+C;IAO/C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CACpB,cAAc,EACd,+BAA+B,EAC/B,4BAA4B,EAC5B,QAAQ,CACT,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAElD,IACE,MAAM;QACN,UAAU,CAAC,YAAY,CAAC;QACxB,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,QAAQ;QACtD,CAAC,MAAM,8BAA8B,CAAC,MAAM,CAAC,CAAC,EAC9C,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,SAAS,cAAc,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,IAAI,mBAAmB,CAAC;IACtE,MAAM,cAAc,GAAG,YAAY,CAAC,cAAc,IAAI,mBAAmB,CAAC;IAE1E,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,kBAAkB,CACtB,WAAW,EACX,MAAM,CAAC,QAAQ,EACf,yBAAyB,CAC1B,CAAC;QACF,MAAM,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE5C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,8GAA8G,CAC/G,CAAC;QACJ,CAAC;QACD,MAAM,iCAAiC,CAAC,QAAQ,CAAC,CAAC;QAElD,MAAM,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAElC,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;YAC/C,sBAAsB,EAAE,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAC7D,QAAQ,EACR,SAAS,CACV;YACD,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CACzD,QAAQ,EACR,SAAS,CACV;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,EACtC,YAAY,EACZ,WAAW,EACX,cAAc,GAAG,EAAE,EACnB,cAAc,GAMf;IACC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEvD,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACvC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,CACb,UAAU,EACV;;;yBAGqB,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC;2CACpB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;;;;;;;;;;;;;;CAcxE,CACE,CAAC;IACF,MAAM,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAE/B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,8BAA8B,CAAC,QAI7C;IACC,IAAI,CAAC;QACH,MAAM,iCAAiC,CAAC,QAAQ,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iCAAiC,CAAC,QAIhD;IACC,MAAM,UAAU,CAAC,QAAQ,CAAC,oBAAoB,EAAE;QAC9C,GAAG,QAAQ,CAAC,kBAAkB;QAC9B,UAAU;KACX,CAAC,CAAC;IACH,MAAM,UAAU,CAAC,QAAQ,CAAC,sBAAsB,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAO3C,MAAM,sBAAsB,GAAG,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACnE,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAE/D,IAAI,CAAC,oBAAoB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACrD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,kBAAkB,EAAE,oBAAoB,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QAC3E,sBAAsB;QACtB,oBAAoB,EAAE,oBAAoB,CAAC,IAAI;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAClC,IAAY;IAEZ,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,IAAY;IAChD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAAoC,EACpC,QAAgB,EAChB,KAAa;IAEb,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;IAE9E,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,sBAAsB,QAAQ,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,6BAA6B,CACpC,MAAqD,EACrD,KAAa;IAEb,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,qCAAqC,CAAC,CAAC;IACjE,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,EAAE,MAAM,CAAC,GAAG;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAA4C;IAC/D,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;SAC1C,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,QAAgB,EAChB,gBAAwB,EACxB,KAAa;IAEb,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;SAClC,MAAM,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;SAChC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjB,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,gCAAgC,gBAAgB,SAAS,QAAQ,GAAG,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,GAAW,EACX,WAAmB;IAEnB,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,QAAQ,CACZ,MAAM,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,EACtC,iBAAiB,CAAC,WAAW,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,GAAQ,EACR,kBAAkB,GAAG,CAAC;IAEtB,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;IAEtE,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;YACpC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;YAExD,IACE,UAAU;gBACV,UAAU,IAAI,GAAG;gBACjB,UAAU,GAAG,GAAG;gBAChB,OAAO,CAAC,QAAQ,EAChB,CAAC;gBACD,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAClB,IAAI,kBAAkB,IAAI,CAAC,EAAE,CAAC;oBAC5B,aAAa,CAAC,IAAI,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAClE,OAAO;gBACT,CAAC;gBAED,kBAAkB,CAChB,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAC9B,kBAAkB,GAAG,CAAC,CACvB;qBACE,IAAI,CAAC,cAAc,CAAC;qBACpB,KAAK,CAAC,aAAa,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,UAAU,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;gBACzD,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAClB,aAAa,CACX,IAAI,KAAK,CACP,cAAc,GAAG,gBAAgB,UAAU,IAAI,SAAS,IACtD,aAAa,IAAI,EACnB,EAAE,CAAC,IAAI,EAAE,CACV,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YAED,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC/B,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,WAAmB,EACnB,WAAmB;IAEnB,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,IAAc;IACvD,MAAM,IAAI,OAAO,CAAO,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;SACpC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACjC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACjC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,cAAc,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1E,aAAa,CACX,IAAI,KAAK,CACP,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,UAAU,KAAK,MAAM,EAAE,CACpE,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC;IAEtB,IAAI,QAAQ,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9C,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,QAAQ,KAAK,QAAQ,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC5C,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7C,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,KAAyB;IAC1D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,oBAAoB,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;QAClD,KAA+B,CAAC,IAAI,KAAK,QAAQ,CACnD,CAAC;AACJ,CAAC","sourcesContent":["/* eslint-disable import-x/no-nodejs-modules, no-restricted-globals */\nimport { spawn } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport {\n  createWriteStream,\n  existsSync,\n  readdirSync,\n  readFileSync,\n  statSync,\n} from 'node:fs';\nimport {\n  chmod,\n  mkdir,\n  readFile,\n  rename,\n  rm,\n  unlink,\n  writeFile,\n} from 'node:fs/promises';\nimport { request as requestHttp } from 'node:http';\nimport { request as requestHttps } from 'node:https';\nimport { arch as osArch, homedir, platform as osPlatform } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { pipeline } from 'node:stream/promises';\n\nconst BITCOIN_REGTEST_CACHE_NAMESPACE = 'bitcoin-regtest-up';\nconst BITCOIN_CORE_CACHE_NAMESPACE = 'bitcoin-core';\n\nexport type BitcoinRegtestArtifactConfig = {\n  platforms: Record<string, BitcoinRegtestArtifactPlatformConfig | undefined>;\n  version?: string;\n};\n\nexport type BitcoinRegtestArtifactPlatformConfig = {\n  checksum: string;\n  size?: number;\n  url: string;\n};\n\nexport type BitcoinRegtestInstallOptions = {\n  binDirectory?: string;\n  bitcoinCore?: BitcoinRegtestArtifactConfig;\n  cacheDirectory?: string;\n  cwd?: string;\n  platform?: string;\n};\n\nexport type BitcoinRegtestInstallResult = {\n  bitcoinCliBinary: string;\n  bitcoindBinary: string;\n  cacheHit: boolean;\n  checksum: string;\n  sourceBitcoindArgs: string[];\n  sourceBitcoinCliBinary: string;\n  sourceBitcoindBinary: string;\n  version?: string;\n};\n\nexport type BitcoinRegtestInstallDependencies = {\n  downloadFile?: (url: string, destination: string) => Promise<void>;\n  extractArchive?: (archivePath: string, destination: string) => Promise<void>;\n};\n\ntype BitcoinRegtestPackageJson = {\n  'bitcoin-regtest-up'?: BitcoinRegtestPackageJsonConfig;\n  bitcoinRegtestUp?: BitcoinRegtestPackageJsonConfig;\n  bitcoinregtestup?: BitcoinRegtestPackageJsonConfig;\n};\n\ntype BitcoinRegtestPackageJsonConfig = Pick<\n  BitcoinRegtestInstallOptions,\n  'binDirectory' | 'bitcoinCore' | 'cacheDirectory'\n>;\n\nexport const BITCOIN_REGTEST_DEFAULT_CORE: BitcoinRegtestArtifactConfig = {\n  version: '30.2',\n  platforms: {\n    'darwin-arm64': {\n      checksum:\n        'c2ecab62891de22228043815cb6211549a32272be3d5d052ff19847d3420bd10',\n      url: 'https://bitcoincore.org/bin/bitcoin-core-30.2/bitcoin-30.2-arm64-apple-darwin.tar.gz',\n    },\n    'darwin-x64': {\n      checksum:\n        '99d5cee9b9c37be506396c30837a4b98e320bfea71c474d6120a7e8eb6075c7b',\n      url: 'https://bitcoincore.org/bin/bitcoin-core-30.2/bitcoin-30.2-x86_64-apple-darwin.tar.gz',\n    },\n    'linux-arm64': {\n      checksum:\n        '73e76c14edc79808a0511c744d102ffbb494807ee90cbcba176568243254b532',\n      url: 'https://bitcoincore.org/bin/bitcoin-core-30.2/bitcoin-30.2-aarch64-linux-gnu.tar.gz',\n    },\n    'linux-x64': {\n      checksum:\n        '6aa7bb4feb699c4c6262dd23e4004191f6df7f373b5d5978b5bcdd4bb72f75d8',\n      url: 'https://bitcoincore.org/bin/bitcoin-core-30.2/bitcoin-30.2-x86_64-linux-gnu.tar.gz',\n    },\n  },\n};\n\nexport function getBitcoinRegtestCacheDirectory({\n  cwd = process.cwd(),\n  homeDirectory = homedir(),\n}: {\n  cwd?: string;\n  homeDirectory?: string;\n} = {}): string {\n  const yarnRcPath = join(cwd, '.yarnrc.yml');\n\n  try {\n    const yarnRc = readFileSync(yarnRcPath, 'utf8');\n    if (/^\\s*enableGlobalCache:\\s*true\\s*$/mu.test(yarnRc)) {\n      return join(homeDirectory, '.cache', 'metamask');\n    }\n  } catch (error) {\n    if (!isFileMissingError(error)) {\n      console.warn(\n        `Warning: Error reading ${yarnRcPath}, using local bitcoin-regtest-up cache:`,\n        error,\n      );\n    }\n  }\n\n  return join(cwd, '.metamask', 'cache');\n}\n\nexport function readBitcoinRegtestInstallOptionsFromPackageJson({\n  cwd = process.cwd(),\n  packageJsonPath = join(cwd, 'package.json'),\n}: {\n  cwd?: string;\n  packageJsonPath?: string;\n} = {}): BitcoinRegtestInstallOptions {\n  const packageJson = JSON.parse(\n    readFileSync(packageJsonPath, 'utf8'),\n  ) as BitcoinRegtestPackageJson;\n  const config =\n    packageJson.bitcoinRegtestUp ??\n    packageJson.bitcoinregtestup ??\n    packageJson['bitcoin-regtest-up'];\n  const options: BitcoinRegtestInstallOptions = {};\n\n  if (config?.binDirectory) {\n    options.binDirectory = config.binDirectory;\n  }\n  if (config?.bitcoinCore) {\n    options.bitcoinCore = config.bitcoinCore;\n  }\n  if (config?.cacheDirectory) {\n    options.cacheDirectory = config.cacheDirectory;\n  }\n\n  return options;\n}\n\nexport function parseBitcoinRegtestInstallCliOptions(\n  args: string[],\n): BitcoinRegtestInstallOptions {\n  const options: BitcoinRegtestInstallOptions = {};\n  const bitcoinCore: Partial<BitcoinRegtestArtifactPlatformConfig> = {};\n\n  for (let index = 0; index < args.length; index += 1) {\n    const arg = args[index];\n    const value = args[index + 1];\n\n    switch (arg) {\n      case '--bin-directory':\n        options.binDirectory = readCliValue(arg, value);\n        index += 1;\n        break;\n      case '--bitcoin-core-checksum':\n        bitcoinCore.checksum = readCliValue(arg, value);\n        index += 1;\n        break;\n      case '--bitcoin-core-url':\n        bitcoinCore.url = readCliValue(arg, value);\n        index += 1;\n        break;\n      case '--cache-directory':\n        options.cacheDirectory = readCliValue(arg, value);\n        index += 1;\n        break;\n      case '--platform':\n        options.platform = readCliValue(arg, value);\n        index += 1;\n        break;\n      default:\n        throw new Error(`Unknown bitcoin-regtest-up install option: ${arg}`);\n    }\n  }\n\n  if (bitcoinCore.url || bitcoinCore.checksum) {\n    options.bitcoinCore = {\n      platforms: {\n        current: requireCompletePlatformConfig(\n          bitcoinCore,\n          'Bitcoin Core CLI options',\n        ),\n      },\n    };\n  }\n\n  return options;\n}\n\nexport async function installBitcoinRegtest(\n  options: BitcoinRegtestInstallOptions = {},\n  dependencies: BitcoinRegtestInstallDependencies = {},\n): Promise<BitcoinRegtestInstallResult> {\n  const cwd = options.cwd ?? process.cwd();\n  const cacheDirectory =\n    options.cacheDirectory ?? getBitcoinRegtestCacheDirectory({ cwd });\n  const binDirectory =\n    options.binDirectory ?? join(cwd, 'node_modules', '.bin');\n  const platformKey = options.platform ?? getPlatformKey();\n  const bitcoinCore = options.bitcoinCore ?? BITCOIN_REGTEST_DEFAULT_CORE;\n  const bitcoinCoreConfig = resolvePlatformConfig(\n    bitcoinCore,\n    platformKey,\n    'Bitcoin Core archive',\n  );\n  const bitcoinCoreResult = await installBitcoinCoreArchive(\n    { cacheDirectory, config: bitcoinCoreConfig },\n    dependencies,\n  );\n  const bitcoindBinary = await installExecutableWrapper({\n    binDirectory,\n    commandName: 'bitcoind',\n    executableArgs: bitcoinCoreResult.sourceBitcoindArgs,\n    executablePath: bitcoinCoreResult.sourceBitcoindBinary,\n  });\n  const bitcoinCliBinary = await installExecutableWrapper({\n    binDirectory,\n    commandName: 'bitcoin-cli',\n    executablePath: bitcoinCoreResult.sourceBitcoinCliBinary,\n  });\n\n  return {\n    bitcoinCliBinary,\n    bitcoindBinary,\n    cacheHit: bitcoinCoreResult.cacheHit,\n    checksum: bitcoinCoreConfig.checksum,\n    sourceBitcoindArgs: bitcoinCoreResult.sourceBitcoindArgs,\n    sourceBitcoinCliBinary: bitcoinCoreResult.sourceBitcoinCliBinary,\n    sourceBitcoindBinary: bitcoinCoreResult.sourceBitcoindBinary,\n    version: bitcoinCore.version,\n  };\n}\n\nexport async function cleanBitcoinRegtestCache(\n  options: Pick<BitcoinRegtestInstallOptions, 'cacheDirectory' | 'cwd'> = {},\n): Promise<void> {\n  const cwd = options.cwd ?? process.cwd();\n  const cacheDirectory =\n    options.cacheDirectory ?? getBitcoinRegtestCacheDirectory({ cwd });\n\n  await rm(join(cacheDirectory, BITCOIN_REGTEST_CACHE_NAMESPACE), {\n    force: true,\n    recursive: true,\n  });\n}\n\nasync function installBitcoinCoreArchive(\n  {\n    cacheDirectory,\n    config,\n  }: {\n    cacheDirectory: string;\n    config: BitcoinRegtestArtifactPlatformConfig;\n  },\n  dependencies: BitcoinRegtestInstallDependencies,\n): Promise<{\n  cacheHit: boolean;\n  sourceBitcoindArgs: string[];\n  sourceBitcoinCliBinary: string;\n  sourceBitcoindBinary: string;\n}> {\n  const cacheKey = getCacheKey(config);\n  const cacheRoot = join(\n    cacheDirectory,\n    BITCOIN_REGTEST_CACHE_NAMESPACE,\n    BITCOIN_CORE_CACHE_NAMESPACE,\n    cacheKey,\n  );\n  const checksumPath = join(cacheRoot, '.source-checksum');\n  const cached = findBitcoinCoreBinaries(cacheRoot);\n\n  if (\n    cached &&\n    existsSync(checksumPath) &&\n    readFileSync(checksumPath, 'utf8') === config.checksum &&\n    (await areBitcoinCoreBinariesRunnable(cached))\n  ) {\n    return { cacheHit: true, ...cached };\n  }\n\n  const tempRoot = `${cacheRoot}.downloading`;\n  const archivePath = join(tempRoot, 'bitcoin-core.tar.gz');\n  const downloadFile = dependencies.downloadFile ?? downloadFileFromUrl;\n  const extractArchive = dependencies.extractArchive ?? extractTarGzArchive;\n\n  await rm(tempRoot, { force: true, recursive: true });\n  await rm(cacheRoot, { force: true, recursive: true });\n  await mkdir(tempRoot, { recursive: true });\n\n  try {\n    await downloadFile(config.url, archivePath);\n    await verifyFileChecksum(\n      archivePath,\n      config.checksum,\n      'Downloaded Bitcoin Core',\n    );\n    await extractArchive(archivePath, tempRoot);\n\n    const binaries = findBitcoinCoreBinaries(tempRoot);\n    if (!binaries) {\n      throw new Error(\n        'Bitcoin Core archive did not contain a node daemon (bitcoind, bitcoin-node, or bitcoin) and bin/bitcoin-cli.',\n      );\n    }\n    await assertBitcoinCoreBinariesRunnable(binaries);\n\n    await writeFile(checksumPath.replace(cacheRoot, tempRoot), config.checksum);\n    await mkdir(dirname(cacheRoot), { recursive: true });\n    await rename(tempRoot, cacheRoot);\n\n    return {\n      cacheHit: false,\n      sourceBitcoindArgs: binaries.sourceBitcoindArgs,\n      sourceBitcoinCliBinary: binaries.sourceBitcoinCliBinary.replace(\n        tempRoot,\n        cacheRoot,\n      ),\n      sourceBitcoindBinary: binaries.sourceBitcoindBinary.replace(\n        tempRoot,\n        cacheRoot,\n      ),\n    };\n  } catch (error) {\n    await rm(tempRoot, { force: true, recursive: true });\n    await rm(cacheRoot, { force: true, recursive: true });\n    throw error;\n  }\n}\n\nasync function installExecutableWrapper({\n  binDirectory,\n  commandName,\n  executableArgs = [],\n  executablePath,\n}: {\n  binDirectory: string;\n  commandName: string;\n  executableArgs?: string[];\n  executablePath: string;\n}): Promise<string> {\n  const binaryPath = join(binDirectory, commandName);\n  const resolvedExecutablePath = resolve(executablePath);\n\n  await mkdir(binDirectory, { recursive: true });\n  await unlink(binaryPath).catch((error) => {\n    if (!isFileMissingError(error)) {\n      throw error;\n    }\n  });\n  await writeFile(\n    binaryPath,\n    `#!/usr/bin/env node\nconst { spawnSync } = require('node:child_process');\n\nconst executablePath = ${JSON.stringify(resolvedExecutablePath)};\nconst result = spawnSync(executablePath, ${JSON.stringify(executableArgs)}.concat(process.argv.slice(2)), {\n  stdio: 'inherit',\n});\n\nif (result.error) {\n  console.error(result.error.message);\n  process.exit(1);\n}\n\nif (result.signal) {\n  process.kill(process.pid, result.signal);\n}\n\nprocess.exit(result.status ?? 0);\n`,\n  );\n  await chmod(binaryPath, 0o755);\n\n  return binaryPath;\n}\n\nasync function areBitcoinCoreBinariesRunnable(binaries: {\n  sourceBitcoindArgs: string[];\n  sourceBitcoinCliBinary: string;\n  sourceBitcoindBinary: string;\n}): Promise<boolean> {\n  try {\n    await assertBitcoinCoreBinariesRunnable(binaries);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nasync function assertBitcoinCoreBinariesRunnable(binaries: {\n  sourceBitcoindArgs: string[];\n  sourceBitcoinCliBinary: string;\n  sourceBitcoindBinary: string;\n}): Promise<void> {\n  await runCommand(binaries.sourceBitcoindBinary, [\n    ...binaries.sourceBitcoindArgs,\n    '-version',\n  ]);\n  await runCommand(binaries.sourceBitcoinCliBinary, ['-version']);\n}\n\nfunction findBitcoinCoreBinaries(root: string):\n  | {\n      sourceBitcoindArgs: string[];\n      sourceBitcoinCliBinary: string;\n      sourceBitcoindBinary: string;\n    }\n  | undefined {\n  const sourceBitcoinCliBinary = findExecutable(root, 'bitcoin-cli');\n  const sourceBitcoindBinary = findBitcoinCoreDaemonBinary(root);\n\n  if (!sourceBitcoindBinary || !sourceBitcoinCliBinary) {\n    return undefined;\n  }\n\n  return {\n    sourceBitcoindArgs: sourceBitcoindBinary.name === 'bitcoin' ? ['node'] : [],\n    sourceBitcoinCliBinary,\n    sourceBitcoindBinary: sourceBitcoindBinary.path,\n  };\n}\n\nfunction findBitcoinCoreDaemonBinary(\n  root: string,\n): { name: string; path: string } | undefined {\n  for (const name of ['bitcoind', 'bitcoin-node', 'bitcoin']) {\n    const path = findExecutable(root, name);\n    if (path) {\n      return { name, path };\n    }\n  }\n\n  return undefined;\n}\n\nfunction findExecutable(root: string, name: string): string | undefined {\n  if (!existsSync(root)) {\n    return undefined;\n  }\n\n  for (const entry of readdirSync(root)) {\n    const entryPath = join(root, entry);\n    const stat = statSync(entryPath);\n    if (stat.isDirectory()) {\n      const found = findExecutable(entryPath, name);\n      if (found) {\n        return found;\n      }\n    } else if (entry === name) {\n      return entryPath;\n    }\n  }\n\n  return undefined;\n}\n\nfunction resolvePlatformConfig(\n  config: BitcoinRegtestArtifactConfig,\n  platform: string,\n  label: string,\n): BitcoinRegtestArtifactPlatformConfig {\n  const platformConfig = config.platforms[platform] ?? config.platforms.current;\n\n  if (!platformConfig) {\n    throw new Error(`No ${label} is configured for ${platform}.`);\n  }\n\n  return platformConfig;\n}\n\nfunction requireCompletePlatformConfig(\n  config: Partial<BitcoinRegtestArtifactPlatformConfig>,\n  label: string,\n): BitcoinRegtestArtifactPlatformConfig {\n  if (!config.url || !config.checksum) {\n    throw new Error(`${label} require both a URL and a checksum.`);\n  }\n\n  return {\n    checksum: config.checksum,\n    url: config.url,\n  };\n}\n\nfunction getCacheKey(config: BitcoinRegtestArtifactPlatformConfig): string {\n  return createHash('sha256')\n    .update(`${config.url}:${config.checksum}`)\n    .digest('hex');\n}\n\nasync function verifyFileChecksum(\n  filePath: string,\n  expectedChecksum: string,\n  label: string,\n): Promise<void> {\n  const checksum = createHash('sha256')\n    .update(await readFile(filePath))\n    .digest('hex');\n\n  if (checksum !== expectedChecksum) {\n    throw new Error(\n      `${label} checksum mismatch. Expected ${expectedChecksum}, got ${checksum}.`,\n    );\n  }\n}\n\nasync function downloadFileFromUrl(\n  url: string,\n  destination: string,\n): Promise<void> {\n  await mkdir(dirname(destination), { recursive: true });\n  await pipeline(\n    await openDownloadStream(new URL(url)),\n    createWriteStream(destination),\n  );\n}\n\nasync function openDownloadStream(\n  url: URL,\n  redirectsRemaining = 5,\n): Promise<NodeJS.ReadableStream> {\n  const request = url.protocol === 'http:' ? requestHttp : requestHttps;\n\n  return await new Promise((resolvePromise, rejectPromise) => {\n    const req = request(url, (response) => {\n      const { headers, statusCode, statusMessage } = response;\n\n      if (\n        statusCode &&\n        statusCode >= 300 &&\n        statusCode < 400 &&\n        headers.location\n      ) {\n        response.resume();\n        if (redirectsRemaining <= 0) {\n          rejectPromise(new Error(`Too many redirects downloading ${url}`));\n          return;\n        }\n\n        openDownloadStream(\n          new URL(headers.location, url),\n          redirectsRemaining - 1,\n        )\n          .then(resolvePromise)\n          .catch(rejectPromise);\n        return;\n      }\n\n      if (!statusCode || statusCode < 200 || statusCode >= 300) {\n        response.resume();\n        rejectPromise(\n          new Error(\n            `Request to ${url} failed with ${statusCode ?? 'unknown'} ${\n              statusMessage ?? ''\n            }`.trim(),\n          ),\n        );\n        return;\n      }\n\n      resolvePromise(response);\n    });\n\n    req.on('error', rejectPromise);\n    req.end();\n  });\n}\n\nasync function extractTarGzArchive(\n  archivePath: string,\n  destination: string,\n): Promise<void> {\n  await runCommand('tar', ['-xzf', archivePath, '-C', destination]);\n}\n\nasync function runCommand(command: string, args: string[]): Promise<void> {\n  await new Promise<void>((resolvePromise, rejectPromise) => {\n    const child = spawn(command, args, {\n      shell: false,\n      stdio: ['ignore', 'ignore', 'pipe'],\n    });\n    let stderr = '';\n\n    child.stderr.on('data', (chunk) => {\n      stderr += chunk.toString();\n    });\n    child.on('error', rejectPromise);\n    child.on('close', (code, signal) => {\n      if (code === 0) {\n        resolvePromise();\n        return;\n      }\n      const exitStatus = signal ? `signal ${signal}` : `code ${code ?? 'null'}`;\n      rejectPromise(\n        new Error(\n          `${command} ${args.join(' ')} failed with ${exitStatus}: ${stderr}`,\n        ),\n      );\n    });\n  });\n}\n\nfunction getPlatformKey(): string {\n  const platform = osPlatform();\n  const arch = osArch();\n\n  if (platform === 'darwin' && arch === 'arm64') {\n    return 'darwin-arm64';\n  }\n  if (platform === 'darwin' && arch === 'x64') {\n    return 'darwin-x64';\n  }\n  if (platform === 'linux' && arch === 'arm64') {\n    return 'linux-arm64';\n  }\n  if (platform === 'linux' && arch === 'x64') {\n    return 'linux-x64';\n  }\n\n  return `${platform}-${arch}`;\n}\n\nfunction readCliValue(arg: string, value: string | undefined): string {\n  if (!value || value.startsWith('--')) {\n    throw new Error(`${arg} requires a value.`);\n  }\n\n  return value;\n}\n\nfunction isFileMissingError(error: unknown): boolean {\n  return (\n    typeof error === 'object' &&\n    error !== null &&\n    Object.prototype.hasOwnProperty.call(error, 'code') &&\n    (error as NodeJS.ErrnoException).code === 'ENOENT'\n  );\n}\n"]}