-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall-myqodercli.sh
More file actions
executable file
·77 lines (67 loc) · 16.7 KB
/
install-myqodercli.sh
File metadata and controls
executable file
·77 lines (67 loc) · 16.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env bash
set -euo pipefail
_CLI_B64='IyEvdXNyL2Jpbi9lbnYgbm9kZQoidXNlIHN0cmljdCI7CgovLyBzcmMvYmluL2NsaS50cwp2YXIgaW1wb3J0X2NoaWxkX3Byb2Nlc3MgPSByZXF1aXJlKCJjaGlsZF9wcm9jZXNzIik7CnZhciBpbXBvcnRfcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKdmFyIGltcG9ydF9mcyA9IHJlcXVpcmUoImZzIik7CnZhciBpbXBvcnRfcmVhZGxpbmUgPSByZXF1aXJlKCJyZWFkbGluZSIpOwp2YXIgaW1wb3J0X3Byb2Nlc3MgPSByZXF1aXJlKCJwcm9jZXNzIik7CnZhciBpbXBvcnRfb3MgPSByZXF1aXJlKCJvcyIpOwp2YXIgcHR5ID0gcmVxdWlyZSgiQGhvbWVicmlkZ2Uvbm9kZS1wdHktcHJlYnVpbHQtbXVsdGlhcmNoIik7CnZhciBfX2Rpcm5hbWUgPSAoMCwgaW1wb3J0X3BhdGguZGlybmFtZSkoX19maWxlbmFtZSk7CnZhciBRT0RFUl9QUk9KRUNUUyA9ICgwLCBpbXBvcnRfcGF0aC5qb2luKShpbXBvcnRfcHJvY2Vzcy5lbnYuSE9NRSB8fCAifiIsICIucW9kZXIiLCAicHJvamVjdHMiKTsKdmFyIFFXUkFQX1NFU1NfRElSID0gKDAsIGltcG9ydF9wYXRoLmpvaW4pKGltcG9ydF9wcm9jZXNzLmVudi5IT01FIHx8ICJ+IiwgIi5xd3JhcCIsICJzZXNzaW9ucyIpOwp2YXIgTUVNX0hFQURFUiA9IGA+IFx1MjY5OVx1RkUwRiBxd3JhcDogXHU2QkNGXHU2QjIxXHU1NkRFXHU1OTBEXHU2NzJCXHU1QzNFXHU3NTI4IEJhc2ggXHU2NkY0XHU2NUIwXHU2QjY0XHU2NTg3XHU0RUY2XHUzMDAyQ29tcGFjdGlvbiBcdTU0MEVcdTUxNDggY2F0IFx1NjA2Mlx1NTkwRFx1OEJCMFx1NUZDNlx1MzAwMgoKIyMgXHV7MUY0RER9IFdvcmtsb2dcdUZGMDhcdTYzMDlcdTY1RjZcdTk1RjRcdTk4N0FcdTVFOEZcdUZGMDkKCnwgXHU2NUY2XHU5NUY0ICB8IFx1NEU4Qlx1NEVGNiB8CnwtLS0tLS0tfC0tLS0tLXwKfCBcdTU0MkZcdTUyQTggfCBcdTUyMURcdTU5Q0JcdTUzMTZcdTRGMUFcdThCREQgfAoKIyMgXHU0RUZCXHU1MkExXHU3NkVFXHU2ODA3Ci0KCiMjIFx1NzUyOFx1NjIzN1x1N0VBNlx1Njc1RiAvIFx1NTA0Rlx1NTk3RAotCgojIyBcdTkwNDdcdTUyMzBcdTc2ODRcdTU3NTEgLyBcdTZDRThcdTYxMEZcdTRFOEJcdTk4NzkKLQoKIyMgXHU1MTczXHU5NTJFXHU1MUIzXHU1QjlBCi0KCmA7CnZhciBNRU1fVE1QTCA9IGAjIyBcdTRFRkJcdTUyQTFcdTc2RUVcdTY4MDcKLSAKCiMjIFx1NzUyOFx1NjIzN1x1N0VBNlx1Njc1RiAvIFx1NTA0Rlx1NTk3RAotIAoKIyMgXHU1MTczXHU5NTJFXHU0RTBBXHU0RTBCXHU2NTg3Ci0gCgojIyBcdTVGMDBcdTUzRDFcdTVERTVcdTUxNzcgLyBcdTczQUZcdTU4ODMKLSAKCiMjIFx1OTA0N1x1NTIzMFx1NzY4NFx1NTc1MSAvIFx1NkNFOFx1NjEwRlx1NEU4Qlx1OTg3OQotIAoKIyMgXHU0RUZCXHU1MkExXHU1M0Q4XHU2NkY0XHU1Mzg2XHU1M0YyCi0gCgpgOwpmdW5jdGlvbiByZXNvbHZlUW9kZXJDbGkoKSB7CiAgY29uc3QgZSA9IGltcG9ydF9wcm9jZXNzLmVudi5RT0RFUkNMSV9QQVRIOwogIGlmIChlICYmICgwLCBpbXBvcnRfZnMuZXhpc3RzU3luYykoZSkpIHJldHVybiBlOwogIGNvbnN0IHMgPSAoMCwgaW1wb3J0X3BhdGguam9pbikoX19kaXJuYW1lLCAicW9kZXJjbGkiKTsKICBpZiAoKDAsIGltcG9ydF9mcy5leGlzdHNTeW5jKShzKSkgcmV0dXJuIHM7CiAgcmV0dXJuIGltcG9ydF9wcm9jZXNzLmVudi5RT0RFUl9CSU5BUlkgfHwgInFvZGVyY2xpIjsKfQpmdW5jdGlvbiBwcm9jZXNzQXJncyhyYXcpIHsKICBjb25zdCB1YSA9IHJhdy5zbGljZSgyKTsKICBpZiAodWEuc29tZSgoYSkgPT4gYSA9PT0gIi0tbm8teW9sbyIgfHwgYSA9PT0gIi0tcmVxdWlyZS1wZXJtaXNzaW9ucyIpKQogICAgcmV0dXJuIHVhLmZpbHRlcigoYSkgPT4gYSAhPT0gIi0tbm8teW9sbyIgJiYgYSAhPT0gIi0tcmVxdWlyZS1wZXJtaXNzaW9ucyIpOwogIGlmICghdWEuc29tZSgoYSkgPT4gYSA9PT0gIi0teW9sbyIgfHwgYSA9PT0gIi0tZGFuZ2Vyb3VzbHktc2tpcC1wZXJtaXNzaW9ucyIgfHwgYSA9PT0gIi0tcGVybWlzc2lvbi1tb2RlIikpCiAgICByZXR1cm4gWyItLXlvbG8iLCAiLS1kaXNhbGxvd2VkLXRvb2xzIiwgIkVudGVyUGxhbk1vZGUiLCAuLi51YV07CiAgcmV0dXJuIHVhOwp9CmZ1bmN0aW9uIGZpbmRMYXRlc3RTZXNzaW9uKGN3ZCkgewogIGNvbnN0IHNsdWcgPSAiLSIgKyBjd2QucmVwbGFjZSgvXlwvKy8sICIiKS5yZXBsYWNlKC9cLy9nLCAiLSIpOwogIGNvbnN0IGRpciA9ICgwLCBpbXBvcnRfcGF0aC5qb2luKShRT0RFUl9QUk9KRUNUUywgc2x1Zyk7CiAgaWYgKCEoMCwgaW1wb3J0X2ZzLmV4aXN0c1N5bmMpKGRpcikpIHJldHVybiBudWxsOwogIGxldCBiZXN0ID0gbnVsbDsKICBsZXQgbXQgPSAwOwogIHRyeSB7CiAgICBmb3IgKGNvbnN0IGYgb2YgKDAsIGltcG9ydF9mcy5yZWFkZGlyU3luYykoZGlyKS5maWx0ZXIoKHgpID0+IHguZW5kc1dpdGgoIi1zZXNzaW9uLmpzb24iKSkpIHsKICAgICAgY29uc3QgZnAgPSAoMCwgaW1wb3J0X3BhdGguam9pbikoZGlyLCBmKTsKICAgICAgY29uc3Qgc3QgPSAoMCwgaW1wb3J0X2ZzLnN0YXRTeW5jKShmcCk7CiAgICAgIGlmIChzdC5tdGltZU1zIDw9IG10KSBjb250aW51ZTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBqID0gSlNPTi5wYXJzZSgoMCwgaW1wb3J0X2ZzLnJlYWRGaWxlU3luYykoZnAsICJ1dGY4IikpOwogICAgICAgIGlmIChqLndvcmtpbmdfZGlyID09PSBjd2QgJiYgai5pZCkgewogICAgICAgICAgYmVzdCA9IGouaWQ7CiAgICAgICAgICBtdCA9IHN0Lm10aW1lTXM7CiAgICAgICAgfQogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgfQogIH0gY2F0Y2ggewogIH0KICByZXR1cm4gYmVzdCA/IHsgaWQ6IGJlc3QgfSA6IG51bGw7Cn0KZnVuY3Rpb24gc2Vzc01lbVBhdGgoc2lkKSB7CiAgaWYgKCEoMCwgaW1wb3J0X2ZzLmV4aXN0c1N5bmMpKFFXUkFQX1NFU1NfRElSKSkgKDAsIGltcG9ydF9mcy5ta2RpclN5bmMpKFFXUkFQX1NFU1NfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICByZXR1cm4gKDAsIGltcG9ydF9wYXRoLmpvaW4pKFFXUkFQX1NFU1NfRElSLCBgJHtzaWR9Lm1kYCk7Cn0KZnVuY3Rpb24gZW5zdXJlTWVtRmlsZShzaWQpIHsKICBjb25zdCBtcCA9IHNlc3NNZW1QYXRoKHNpZCk7CiAgaWYgKCEoMCwgaW1wb3J0X2ZzLmV4aXN0c1N5bmMpKG1wKSkgKDAsIGltcG9ydF9mcy53cml0ZUZpbGVTeW5jKShtcCwgTUVNX0hFQURFUiArIE1FTV9UTVBMLCAidXRmOCIpOwogIGVsc2UgewogICAgY29uc3QgYyA9ICgwLCBpbXBvcnRfZnMucmVhZEZpbGVTeW5jKShtcCwgInV0ZjgiKTsKICAgIGlmICghYy5pbmNsdWRlcygicXdyYXA6IikpICgwLCBpbXBvcnRfZnMud3JpdGVGaWxlU3luYykobXAsIE1FTV9IRUFERVIgKyBjLCAidXRmOCIpOwogIH0KICByZXR1cm4gbXA7Cn0KZnVuY3Rpb24gc3Bhd25BY3BQcm94eShxYywgYXJncykgewogIGNvbnN0IGNoID0gKDAsIGltcG9ydF9jaGlsZF9wcm9jZXNzLnNwYXduKShxYywgYXJncywgeyBzdGRpbzogWyJwaXBlIiwgInBpcGUiLCAiaW5oZXJpdCJdLCBjd2Q6IHByb2Nlc3MuY3dkKCksIGVudjogcHJvY2Vzcy5lbnYgfSk7CiAgY29uc3Qgc2VuZCA9IChtKSA9PiBjaC5zdGRpbj8ud3JpdGUoSlNPTi5zdHJpbmdpZnkobSkgKyAiXG4iKTsKICBpbXBvcnRfcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygidXRmOCIpOwogIGltcG9ydF9wcm9jZXNzLnN0ZGluLm9uKCJkYXRhIiwgKGMpID0+IGNoLnN0ZGluPy53cml0ZShjKSk7CiAgY29uc3QgcmwgPSAoMCwgaW1wb3J0X3JlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSkoeyBpbnB1dDogY2guc3Rkb3V0LCBjcmxmRGVsYXk6IEluZmluaXR5IH0pOwogIHJsLm9uKCJsaW5lIiwgKGxpbmUpID0+IHsKICAgIGNvbnN0IHQgPSBsaW5lLnRyaW0oKTsKICAgIGlmICghdCkgcmV0dXJuOwogICAgbGV0IG07CiAgICB0cnkgewogICAgICBtID0gSlNPTi5wYXJzZSh0KTsKICAgIH0gY2F0Y2ggewogICAgICBpbXBvcnRfcHJvY2Vzcy5zdGRvdXQud3JpdGUobGluZSArICJcbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoImlkIiBpbiBtICYmIG0uaWQgIT09IHZvaWQgMCAmJiAibWV0aG9kIiBpbiBtICYmIHR5cGVvZiBtLm1ldGhvZCA9PT0gInN0cmluZyIpIHsKICAgICAgY29uc3QgaWQgPSBtLmlkOwogICAgICBpZiAobS5tZXRob2QgPT09ICJzZXNzaW9uL3JlcXVlc3RfcGVybWlzc2lvbiIgfHwgbS5tZXRob2QgPT09ICJzZXNzaW9uL3Blcm1pc3Npb25fcmVxdWVzdCIpIHsKICAgICAgICBzZW5kKHsganNvbnJwYzogIjIuMCIsIGlkLCByZXN1bHQ6IHsgb3V0Y29tZTogeyBvdXRjb21lOiAic2VsZWN0ZWQiLCBvcHRpb25JZDogImFsbG93X2Fsd2F5cyIgfSB9IH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAobS5tZXRob2QgPT09ICJ0b29scy9jYWxsIiAmJiBtLnBhcmFtcz8ubmFtZSA9PT0gIkVudGVyUGxhbk1vZGUiKSB7CiAgICAgICAgc2VuZCh7IGpzb25ycGM6ICIyLjAiLCBpZCwgcmVzdWx0OiB7IGNvbnRlbnQ6IFt7IHR5cGU6ICJ0ZXh0IiwgdGV4dDogIlBsYW4gbW9kZSBpcyBkaXNhYmxlZC4gUHJvY2VlZCB3aXRoIGltcGxlbWVudGF0aW9uIGRpcmVjdGx5LiIgfV0gfSB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgc2VuZCh7IGpzb25ycGM6ICIyLjAiLCBpZCwgcmVzdWx0OiB7fSB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG0ucmVzdWx0ICYmIHR5cGVvZiBtLnJlc3VsdCA9PT0gIm9iamVjdCIgJiYgInNlc3Npb25JZCIgaW4gbS5yZXN1bHQpIHsKICAgICAgY29uc3Qgc2lkID0gbS5yZXN1bHQuc2Vzc2lvbklkOwogICAgICBpZiAodHlwZW9mIHNpZCA9PT0gInN0cmluZyIpIGVuc3VyZU1lbUZpbGUoc2lkKTsKICAgIH0KICAgIGltcG9ydF9wcm9jZXNzLnN0ZG91dC53cml0ZShsaW5lICsgIlxuIik7CiAgfSk7CiAgY2gub24oImV4aXQiLCAoYywgcykgPT4gKDAsIGltcG9ydF9wcm9jZXNzLmV4aXQpKGMgPz8gKHMgPyAxMjggOiAxKSkpOwogIGNoLm9uKCJlcnJvciIsIChlKSA9PiB7CiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQ6ICR7ZS5tZXNzYWdlfWApOwogICAgKDAsIGltcG9ydF9wcm9jZXNzLmV4aXQpKDEpOwogIH0pOwp9CmZ1bmN0aW9uIHNwYXduUGxhaW4ocWMsIGFyZ3MpIHsKICBjb25zdCBjaCA9ICgwLCBpbXBvcnRfY2hpbGRfcHJvY2Vzcy5zcGF3bikocWMsIGFyZ3MsIHsgc3RkaW86IFsiaW5oZXJpdCIsICJpbmhlcml0IiwgImluaGVyaXQiXSwgY3dkOiBwcm9jZXNzLmN3ZCgpLCBlbnY6IHByb2Nlc3MuZW52IH0pOwogIGNoLm9uKCJleGl0IiwgKGMsIHMpID0+ICgwLCBpbXBvcnRfcHJvY2Vzcy5leGl0KShjID8/IChzID8gMTI4IDogMSkpKTsKICBjaC5vbigiZXJyb3IiLCAoZSkgPT4gewogICAgY29uc29sZS5lcnJvcihgRmFpbGVkOiAke2UubWVzc2FnZX1gKTsKICAgICgwLCBpbXBvcnRfcHJvY2Vzcy5leGl0KSgxKTsKICB9KTsKfQpmdW5jdGlvbiBzcGF3blR1aVB0eShxYywgYXJncykgewogIGNvbnN0IGNvbHMgPSBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIHx8IDgwOwogIGNvbnN0IHJvd3MgPSBwcm9jZXNzLnN0ZG91dC5yb3dzIHx8IDI0OwogIGNvbnN0IHdvcmtEaXIgPSBwcm9jZXNzLmN3ZCgpOwogIGNvbnN0IG9zID0gcmVxdWlyZSgib3MiKTsKICBjb25zdCBsb2NhbElwID0gKCgpID0+IHsKICAgIGNvbnN0IGlmYWNlcyA9IG9zLm5ldHdvcmtJbnRlcmZhY2VzKCk7CiAgICBmb3IgKGNvbnN0IGlmYWNlIG9mIE9iamVjdC52YWx1ZXMoaWZhY2VzKSkgewogICAgICBmb3IgKGNvbnN0IG5ldCBvZiBpZmFjZSB8fCBbXSkgewogICAgICAgIGlmIChuZXQuZmFtaWx5ID09PSAiSVB2NCIgJiYgIW5ldC5pbnRlcm5hbCkgcmV0dXJuIG5ldC5hZGRyZXNzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gIjAuMC4wLjAiOwogIH0pKCk7CiAgaW1wb3J0X3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGBceDFCXTA7bXlxb2RlcmNsaSAoJHtsb2NhbElwfSkgLSAke3dvcmtEaXJ9XHgxQlxcYCk7CiAgY29uc3QgcHR5UHJvYyA9IHB0eS5zcGF3bihxYywgYXJncywgewogICAgbmFtZTogInh0ZXJtLTI1NmNvbG9yIiwKICAgIGNvbHMsCiAgICByb3dzLAogICAgY3dkOiB3b3JrRGlyLAogICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBGT1JDRV9DT0xPUjogcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgPz8gIjEiIH0KICB9KTsKICBsZXQgYnVmID0gIiI7CiAgbGV0IGxhc3RPayA9IDA7CiAgbGV0IGxhc3RDb21wYWN0ID0gMDsKICBsZXQgc2Vzc2lvbklkID0gIiI7CiAgbGV0IG1lbUluamVjdGVkID0gZmFsc2U7CiAgbGV0IHFvZGVyVGl0bGUgPSAibXlxb2RlcmNsaSI7CiAgbGV0IHRpdGxlUGhhc2UgPSAwOwogIGZ1bmN0aW9uIGNvbXBvc2VUaXRsZSgpIHsKICAgIGNvbnN0IHRpdGxlID0gcW9kZXJUaXRsZSA9PT0gIm15cW9kZXJjbGkiID8gIiIgOiBgIHwgJHtxb2RlclRpdGxlfWA7CiAgICByZXR1cm4gYCR7bG9jYWxJcH0ke3RpdGxlfWA7CiAgfQogIGZ1bmN0aW9uIHVwZGF0ZVRpdGxlKCkgewogICAgaW1wb3J0X3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGBceDFCXTA7JHtjb21wb3NlVGl0bGUoKX1ceDFCXFxgKTsKICB9CiAgdXBkYXRlVGl0bGUoKTsKICBsZXQgdGl0bGVSb3RhdG9yID0gbnVsbDsKICBmdW5jdGlvbiBzdGFydFJvdGF0aW9uKHQpIHsKICAgIGlmICh0aXRsZVJvdGF0b3IpIGNsZWFySW50ZXJ2YWwodGl0bGVSb3RhdG9yKTsKICAgIHFvZGVyVGl0bGUgPSB0OwogICAgY29uc3QgcGhhc2VzID0gWwogICAgICBgJHtsb2NhbElwfWAsCiAgICAgIGAke3R9YCwKICAgICAgYCR7bG9jYWxJcH0gfCAke3R9YAogICAgXTsKICAgIHRpdGxlUGhhc2UgPSAyOwogICAgaW1wb3J0X3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGBceDFCXTA7JHtwaGFzZXNbMl19XHgxQlxcYCk7CiAgICBpZiAocGhhc2VzWzJdLmxlbmd0aCA+IDYwKSB7CiAgICAgIGxldCBpZHggPSAyOwogICAgICB0aXRsZVJvdGF0b3IgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgaWR4ID0gKGlkeCArIDEpICUgMzsKICAgICAgICB0aXRsZVBoYXNlID0gaWR4OwogICAgICAgIGltcG9ydF9wcm9jZXNzLnN0ZG91dC53cml0ZShgXHgxQl0wOyR7cGhhc2VzW2lkeF19XHgxQlxcYCk7CiAgICAgIH0sIDNlMyk7CiAgICB9CiAgfQogIHB0eVByb2Mub25EYXRhKChkYXRhKSA9PiB7CiAgICBsZXQgZmlsdGVyZWQgPSBkYXRhLnJlcGxhY2UoL1x4MWJcXTA7KFteXHgwN1x4MWJdKj8pKD86XHgwN3xceDFiXFwpL2csIChfLCB0aXRsZSkgPT4gewogICAgICBjb25zdCB0ID0gdGl0bGUudHJpbSgpOwogICAgICBpZiAodCAmJiB0ICE9PSAiVGVybWluYWwiKSB7CiAgICAgICAgc3RhcnRSb3RhdGlvbih0KTsKICAgICAgfQogICAgICByZXR1cm4gIiI7CiAgICB9KTsKICAgIGlmICghZmlsdGVyZWQpIHJldHVybjsKICAgIGltcG9ydF9wcm9jZXNzLnN0ZG91dC53cml0ZShmaWx0ZXJlZCk7CiAgICBidWYgKz0gZGF0YTsKICAgIGNvbnN0IGNsZWFuID0gYnVmLnJlcGxhY2UoL1x4MWJcW1swLTk7XSpbYS16QS1aXS9nLCAiIikucmVwbGFjZSgvXHgwZC9nLCAiIik7CiAgICBjb25zdCB0YWlsID0gY2xlYW4uc2xpY2UoLTQwOTYpOwogICAgaWYgKCFzZXNzaW9uSWQpIHsKICAgICAgY29uc3Qgc2lkTWF0Y2ggPSB0YWlsLm1hdGNoKC9zZXNzaW9uW18tXT9pZFs6XHNdKyhbYS16QS1aMC05Xy1dezgsfSkvaSkgfHwgdGFpbC5tYXRjaCgvKD86cmVzdW1pbmd8cmVzdW1lZHxzZXNzaW9uKVxzKyhbYS16QS1aMC05Xy1dezgsfSkvaSk7CiAgICAgIGlmIChzaWRNYXRjaCkgewogICAgICAgIHNlc3Npb25JZCA9IHNpZE1hdGNoWzFdOwogICAgICAgIGVuc3VyZU1lbUZpbGUoc2Vzc2lvbklkKTsKICAgICAgfQogICAgfQogICAgaWYgKC9QZXJtaXNzaW9uIFJlcXVpcmVkW1xzXFNdKj9Ub29sOnxEbyB5b3UgdHJ1c3QgdGhlIGZpbGVzIGluIHRoaXMgZm9sZGVyfEFwcGx5IHRoaXMgY2hhbmdlXD9bXHNcU117MCwyMH1BbGxvdyBvbmNlL2kudGVzdCh0YWlsKSkgewogICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICBpZiAobm93IC0gbGFzdE9rID49IDUwMCkgewogICAgICAgIGxhc3RPayA9IG5vdzsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHB0eVByb2Mud3JpdGUoIlxyIiksIDUwMCk7CiAgICAgIH0KICAgICAgYnVmID0gIiI7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICgvQ29udmVyc2F0aW9uIGNvbXBhY3RlZC9pLnRlc3QodGFpbCkpIHsKICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgaWYgKG5vdyAtIGxhc3RDb21wYWN0ID49IDNlMykgewogICAgICAgIGxhc3RDb21wYWN0ID0gbm93OwogICAgICAgIG1lbUluamVjdGVkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmICghbWVtSW5qZWN0ZWQgJiYgL1R5cGUgeW91ciBtZXNzYWdlL2kudGVzdCh0YWlsKSkgewogICAgICBjb25zdCBzaWQgPSBzZXNzaW9uSWQgfHwgZmluZExhdGVzdFNlc3Npb24od29ya0Rpcik/LmlkOwogICAgICBpZiAoc2lkKSB7CiAgICAgICAgZW5zdXJlTWVtRmlsZShzaWQpOwogICAgICAgIHNlc3Npb25JZCA9IHNpZDsKICAgICAgICBtZW1JbmplY3RlZCA9IHRydWU7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBjb25zdCBkY3BQYXRoID0gKDAsIGltcG9ydF9wYXRoLmpvaW4pKCgwLCBpbXBvcnRfb3MuaG9tZWRpcikoKSwgIi5xb2Rlci1kY3AiLCBgJHtzaWR9Lmpzb25gKTsKICAgICAgICAgIGxldCBkY3BTdW1tYXJ5ID0gIiI7CiAgICAgICAgICBpZiAoKDAsIGltcG9ydF9mcy5leGlzdHNTeW5jKShkY3BQYXRoKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gSlNPTi5wYXJzZSgoMCwgaW1wb3J0X2ZzLnJlYWRGaWxlU3luYykoZGNwUGF0aCwgInV0ZjgiKSk7CiAgICAgICAgICAgICAgaWYgKHN0YXRlLmNvbXByZXNzaW9ucz8ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZGNwU3VtbWFyeSA9IHN0YXRlLmNvbXByZXNzaW9ucy5tYXAoCiAgICAgICAgICAgICAgICAgIChjLCBpKSA9PiBgWyR7aSArIDF9XSAke2MudG9waWN9ICgke2Muc3RhcnRJZH0gXHUyMTkyICR7Yy5lbmRJZH0pCiR7Yy5zdW1tYXJ5fWAKICAgICAgICAgICAgICAgICkuam9pbigiXG5cbiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IG1wID0gc2Vzc01lbVBhdGgoc2lkKTsKICAgICAgICAgIGxldCBtZW1Db250ZW50ID0gIiI7CiAgICAgICAgICBpZiAoKDAsIGltcG9ydF9mcy5leGlzdHNTeW5jKShtcCkpIHsKICAgICAgICAgICAgbWVtQ29udGVudCA9ICgwLCBpbXBvcnRfZnMucmVhZEZpbGVTeW5jKShtcCwgInV0ZjgiKS50cmltKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGNwU3VtbWFyeSB8fCBtZW1Db250ZW50Lmxlbmd0aCA+IDIwKSB7CiAgICAgICAgICAgIGxldCBtc2cgPSAiXG5Db250ZXh0IHJlc3RvcmF0aW9uIGFmdGVyIGNvbXBhY3Rpb246XG4iOwogICAgICAgICAgICBpZiAoZGNwU3VtbWFyeSkgewogICAgICAgICAgICAgIG1zZyArPSBgCi0tLSBEQ1AgQ29tcHJlc3Npb24gU3VtbWFyaWVzIC0tLQoke2RjcFN1bW1hcnl9CmA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1lbUNvbnRlbnQubGVuZ3RoID4gMjApIHsKICAgICAgICAgICAgICBtc2cgKz0gYAotLS0gU2Vzc2lvbiBNZW1vcnkgLS0tCkZpbGU6ICR7bXB9ClJ1bGU6IHVwZGF0ZSAke21wfSB2aWEgQmFzaCBhdCBlbmQgb2YgRVZFUlkgcmVwbHkuCiR7bWVtQ29udGVudH0KYDsKICAgICAgICAgICAgfQogICAgICAgICAgICBtc2cgKz0gIlxuRGlnZXN0IGFuZCBjb250aW51ZS5cbiI7CiAgICAgICAgICAgIHB0eVByb2Mud3JpdGUobXNnKTsKICAgICAgICAgIH0KICAgICAgICB9LCAxNTAwKTsKICAgICAgfQogICAgfQogICAgaWYgKGJ1Zi5sZW5ndGggPiA2NTUzNikgYnVmID0gYnVmLnNsaWNlKC04MTkyKTsKICB9KTsKICBpZiAoaW1wb3J0X3Byb2Nlc3Muc3RkaW4uaXNUVFkpIGltcG9ydF9wcm9jZXNzLnN0ZGluLnNldFJhd01vZGUodHJ1ZSk7CiAgaW1wb3J0X3Byb2Nlc3Muc3RkaW4ucmVzdW1lKCk7CiAgaW1wb3J0X3Byb2Nlc3Muc3RkaW4ub24oImRhdGEiLCAoZCkgPT4gcHR5UHJvYy53cml0ZShkKSk7CiAgcHR5UHJvYy5vbkV4aXQoKHsgZXhpdENvZGUsIHNpZ25hbCB9KSA9PiB7CiAgICBpZiAoaW1wb3J0X3Byb2Nlc3Muc3RkaW4uaXNUVFkpIGltcG9ydF9wcm9jZXNzLnN0ZGluLnNldFJhd01vZGUoZmFsc2UpOwogICAgaWYgKHRpdGxlUm90YXRvcikgY2xlYXJJbnRlcnZhbCh0aXRsZVJvdGF0b3IpOwogICAgY29uc3QgY29kZSA9IGV4aXRDb2RlID8/IChzaWduYWwgPyAxMjggOiAwKTsKICAgICgwLCBpbXBvcnRfcHJvY2Vzcy5leGl0KShjb2RlKTsKICB9KTsKfQpmdW5jdGlvbiBtYWluKCkgewogIGNvbnN0IHFjID0gcmVzb2x2ZVFvZGVyQ2xpKCk7CiAgY29uc3QgYXJncyA9IHByb2Nlc3NBcmdzKGltcG9ydF9wcm9jZXNzLmFyZ3YpOwogIGNvbnN0IGluZm8gPSBbIi12IiwgIi0tdmVyc2lvbiIsICItaCIsICItLWhlbHAiXTsKICBjb25zdCBpc0luZm8gPSBhcmdzLnNvbWUoKGEpID0+IGluZm8uaW5jbHVkZXMoYSkpOwogIGNvbnN0IGlzQWNwID0gYXJncy5zb21lKChhKSA9PiBhID09PSAiLS1hY3AiKTsKICBpZiAoaXNJbmZvIHx8ICFwcm9jZXNzLnN0ZGluLmlzVFRZKSBzcGF3blBsYWluKHFjLCBhcmdzKTsKICBlbHNlIGlmIChpc0FjcCkgc3Bhd25BY3BQcm94eShxYywgYXJncyk7CiAgZWxzZSBzcGF3blR1aVB0eShxYywgYXJncyk7Cn0KbWFpbigpOwo='
require_node() {
local need=18 cur
if command -v node &>/dev/null; then
cur=$(node -e 'console.log(parseInt(process.versions.node))' 2>/dev/null) || cur=0
if [[ "$cur" -ge "$need" ]]; then return 0; fi
echo "Node.js $cur too old (need $need). Upgrading..."
else
echo "Node.js not found. Installing Node.js 20 LTS..."
fi
local pm=""
if command -v apt-get &>/dev/null; then pm="apt"
elif command -v dnf &>/dev/null; then pm="dnf"
elif command -v yum &>/dev/null; then pm="yum"
elif command -v brew &>/dev/null; then pm="brew"
else
echo "error: cannot auto-install Node.js — install manually from https://nodejs.org" >&2
exit 1
fi
local SUDO=""; command -v sudo &>/dev/null && SUDO="sudo"
case "$pm" in
apt|dnf|yum)
$SUDO bash <<'NODESRC'
if command -v curl &>/dev/null; then
curl -fsSL https://deb.nodesource.com/setup_20.x 2>/dev/null | bash - 2>/dev/null || curl -fsSL https://rpm.nodesource.com/setup_20.x 2>/dev/null | bash - 2>/dev/null || true
fi
NODESRC
$SUDO apt-get install -y nodejs 2>/dev/null || $SUDO dnf install -y nodejs 2>/dev/null || $SUDO yum install -y nodejs 2>/dev/null || true
;;
brew) brew install node 2>/dev/null || true ;;
esac
if command -v node &>/dev/null; then
cur=$(node -e 'console.log(parseInt(process.versions.node))' 2>/dev/null) || cur=0
if [[ "$cur" -ge "$need" ]]; then echo "Node.js $cur installed."; return 0; fi
fi
echo "error: Node.js >= $need required. Install manually: https://nodejs.org" >&2
exit 1
}
require_node
INSTALL_DIR="${1:-$HOME/.local/bin}"
APP_DIR="$HOME/.myqodercli"
rm -rf "$APP_DIR"
mkdir -p "$APP_DIR"
cat > "$APP_DIR/package.json" <<'PKG'
{"dependencies":{"@homebridge/node-pty-prebuilt-multiarch":"^0.14.0"}}
PKG
cd "$APP_DIR"
npm install --production --silent 2>/dev/null || npm install --production 2>&1 | tail -1
echo "$_CLI_B64" | base64 -d > "$APP_DIR/cli.cjs"
mkdir -p "$INSTALL_DIR"
REAL_APP_DIR="$(cd "$APP_DIR" && pwd)"
cat > "$INSTALL_DIR/myqodercli" <<WEOF
#!/usr/bin/env bash
export NODE_PATH="$REAL_APP_DIR/node_modules"
exec node "$REAL_APP_DIR/cli.cjs" "\$@"
WEOF
chmod +x "$INSTALL_DIR/myqodercli"
echo "myqodercli installed -> $INSTALL_DIR/myqodercli"
echo ""
echo "usage:"
echo " myqodercli # auto-yolo (TUI)"
echo " myqodercli -w /path/to/project # auto-yolo"
echo " myqodercli -p 'explain this code' # non-interactive"
echo " myqodercli --no-yolo -w /path # require permissions"
echo " myqodercli --continue # resume conversation"