a few minor fixes
Larry Tordsen <[email protected]> Mon, 22 Apr 2013 23:39:08 -0500
| Newsgroups | gmane.comp.statistics.dap.bugs |
|---|---|
| Message-ID | <CAL_1DNo-UwB2mcZrQkMXYiLci7t7LkBc8G3zuc5g+yuEZU8_Nw@mail.gmail.com> |
--089e015369141cc8d104daffc484 Content-Type: multipart/alternative; boundary=089e015369141cc8cc04daffc482 --089e015369141cc8cc04daffc482 Content-Type: text/plain; charset=ISO-8859-1 Hi, I had a few problems compiling dap. -->dap0.c: getline conflicts with the stdio.h getline, so I renamed it dap_getline. --> sbstrans3.c: included string.h & stdlib.h to get rid of a bunch of warnings. Here are the fixes, incase anyone else has problems. Sorry for the spam if its just me. --Larry --089e015369141cc8cc04daffc482 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div><div><div>Hi,<br><br></div>I had a few problems compi= ling dap.<br>-->dap0.c: getline conflicts with the stdio.h getline, so I= renamed it dap_getline.<br></div>--> sbstrans3.c:=A0 included string.h = & stdlib.h to get rid of a bunch of warnings.<br> <br></div><br>Here are the fixes, incase anyone else has problems.=A0 Sorry= for the spam if its just me.<br><br>--Larry<br><div><div><br></div></div><= /div> --089e015369141cc8cc04daffc482-- --089e015369141cc8d104daffc484 Content-Type: text/x-csrc; charset=US-ASCII; name="dap0.c" Content-Disposition: attachment; filename="dap0.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hfukvibg0 LyogQ29udGFpbnMgdGhlIGJhc2ljIEkvTyBhbmQgc2V0dXAgcm91dGluZXMuICAqLwoKLyogIENv cHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24sIEluYy4KICoKICogIERhcCBpcyBhIEdOVSBwcm9ncmFtLgogKgogKiAgVGhpcyBmaWxlIGlz IHBhcnQgb2YgRGFwLgogKgogKiAgRGFwIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAg KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIERhcCBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAq ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZQogKiAgYWxvbmcgd2l0aCBEYXAuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5n bnUub3JnL2xpY2Vuc2VzLz4uCiAqLwoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8 dGltZS5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVk ZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAiZGFwX21ha2UuaCIKI2lu Y2x1ZGUgImV4dGVybnMuaCIKCi8qIGRhdGFvYnMgc3RydWN0dXJlcyBjb250YWluIHRoZSBuYW1l cyBhbmQgdmFsdWVzIG9mIHRoZSB2YXJpYWJsZXMuICAKICogQWxzbyBjb250YWluIG51bWJlciBv ZiB2YXJpYWJsZXMsIGV0Yy46IHNlZSBkYXBfbWFrZS5oLiAgCiAqLwoKLyogVGhlIHZhbHVlcyBy ZWFkIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgbGluZS4gICovCmRhdGFvYnMgZGFwX29ic1szXTsJ Lyogbm9ybWFsbHkgdXNlIDAgZm9yIGluIGFuZCBvdXQ7IHNlbGVjdCBieSBkYXBfb25vICovCgov KiBUaGUgdmFsdWVzIHJlYWQgZnJvbSB0aGUgcHJldmlvdXMgaW5wdXQgbGluZS4gICovCmRhdGFv YnMgZGFwX3ByZXZbMl07CS8qIG9ubHkgdXNlIDAgb3IgMSBmb3IgaW5wdXQgKi8KCi8qIEZvciBz YXZpbmcgdmFsdWVzIHJlYWQgZnJvbSBjdXJyZW50IGlucHV0IGxpbmUuICAqLwpzdGF0aWMgZGF0 YW9icyBkb3NhdmU7CgpzdGF0aWMgUkZJTEUgKnJmaWxlOwkJLyogdGhlIGFycmF5IG9mIHJhbSBm aWxlcyAoc2VlIGRhcF9tYWtlLmgpICovCgovKiBBIERGSUxFIGNhbiBiZSBlaXRoZXIgYSBkaXNr IGZpbGUgb3IgYSByYW1maWxlOiAwLCAxLCAyIGFyZSB1c2VkIGZvciBkaXNrCiAqIGZpbGVzLCA+ IDIgZm9yIHJhbWZpbGVzLiAgCiAqLwoKI2RlZmluZSBOREZJTEVTIDQJLyogbnVtYmVyIG9mIGFj dHVhbCBkaXNrIGZpbGVzICovCgpzdGF0aWMgREZJTEUgKmRmaWxlOwoKREZJTEUgKmRhcF9pblsz XTsJLyogaW5wdXQgZmlsZXMgKi8KREZJTEUgKmRhcF9vdXRbM107CS8qIG91dHB1dCBmaWxlcyAq LwpGSUxFICpkYXBfbHN0OwkJLyogLmxzdCBmaWxlICovCkZJTEUgKmRhcF9sb2c7CQkvKiAubG9n IGZpbGUsIGZvciBsaW5lcyByZWFkLCB3cml0dGVuICovCkZJTEUgKmRhcF9lcnI7CQkvKiAuZXJy IGZpbGUsIGZvciBlcnJvcnMgKi8KaW50IGRhcF9vbm87CQkvKiBzcGVjaWZpZXMgd2hpY2ggc2V0 IG9mIHZhcmlhYmxlIHZhbHVlcyAoZGF0YW9icykgdG8gdXNlICovCmludCBkYXBfZGVsaW07CQkv KiBkZWxpbWl0ZXIgZm9yIHJlYWRpbmcgZGF0YSBmaWxlcyAobm90IGRhdGFzZXRzKSAqLwpzdGF0 aWMgaW50ICpmaWVsZHdkOwkvKiB3aWR0aCBvZiBmaXhlZCB3aWR0aCBpbnB1dCBkYXRhIGZpZWxk cyAqLwpzdGF0aWMgaW50IG5maWVsZHM7CQkvKiBudW1iZXIgb2YgZml4ZWQgd2lkdGggaW5wdXQg ZGF0YSBmaWVsZHMgKi8Kc3RhdGljIGludCBsaW5lbm9bMl07CQkvKiBsaW5lIG51bWJlciBmb3Ig dXAgdG8gMiBpbnB1dCBkYXRhc2V0cyAqLwpzdGF0aWMgaW50IG91dGxpbmU7CQkvKiBudW1iZXIg b2YgbGluZXMgd3JpdHRlbiAqLwpzdGF0aWMgaW50IHBhZ2VubzsJCS8qIG91dHB1dCBwYWdlIG51 bWJlciAqLwpzdGF0aWMgaW50IGVvZlsyXTsJCS8qIGZsYWdzOiBoYXMgRU9GIGJlZW4gcmVhY2hl ZCBvbiBpbnB1dCBmaWxlKHMpPyAqLwpzdGF0aWMgbG9uZyBmaWxlcG9zWzJdOwkJLyogZmlsZSBw b3NpdGlvbnMgb2YgaW5wdXQgZmlsZShzKSAqLwoKLyogVGhlc2UgYXJlIHRoZSB0eXBlcyBvZiBp bnB1dCBkYXRhIGZpbGVzIChub3QgZGF0YXNldHMpIHJlY29nbml6ZWQuICAqLwojZGVmaW5lIFRF WFQgMAkJLyogb3JkaW5hcnkgdGV4dCwgZmllbGRzIGVpdGhlciBmaXhlZCB3aWR0aCBvciBkZWxp bWl0ZWQgKi8KI2RlZmluZSBEQkFTRSAxCQkvKiBkQmFzZSAqLwojZGVmaW5lIERTRVQgMgkJLyog ZGFwIGRhdGFzZXQgKi8KCnN0YXRpYyBpbnQgaW50eXBlOwkvKiB0eXBlIG9mIGlucHV0IGZpbGUg Ki8Kc3RhdGljIGludCBpbmxlbjsJLyogbGluZSBsZW5ndGggZm9yIGZpbGVzIHdpdGggZEJhc2Ug ZmlsZXMgKi8Kc3RhdGljIGludCB0b29sb25nOwkvKiBjb3VudDogc3RyaW5nIGRhdGEgbG9uZ2Vy IHRoYW4gc3BlY2lmaWVkIGVuY291bnRlcmVkPyAqLwoKY2hhciAqZGFwX3RpdGxlID0gTlVMTDsJ LyogdGl0bGUgZm9yIC5sc3QgcGFnZXMsIGNhcHRpb24gZm9yIC5wcyBwYWdlcyAqLwoKY2hhciAq ZGFwX2RhcG5hbWU7CS8qIG5hbWUgb2YgcHJvZ3JhbSBydW5uaW5nICovCmNoYXIgKmRhcF9wc25h bWU7CS8qIG5hbWUgb2YgdGhlIC5wcyBmaWxlICovCgpleHRlcm4gaW50IGRhcF9kYmxoaWdoOwkv KiBmb3IgY29kaW5nIGRvdWJsZXMgKi8KZXh0ZXJuIGludCBkYXBfZGJsbG93OwkvKiBmb3IgY29k aW5nIGRvdWJsZXMgKi8KZXh0ZXJuIGRvdWJsZSBkYXBfZG91YmxlOwkvKiB0byBnZXQgYXJvdW5k IHdlaXJkIHJldHVybnM7IHNlZSBtYWNoZGVwLmMgKi8KCnN0YXRpYyBpbnQgbm1hbGxvY3MgPSAw OwpzdGF0aWMgaW50IG5mcmVlcyA9IDA7CgpjaGFyICpkYXBfbWFsbG9jKGludCBuYnl0ZXMsIGNo YXIgKm1lc2cpCnsKICBjaGFyICptOwoKICBubWFsbG9jcysrOwogIGlmICghKG0gPSBtYWxsb2Mo bmJ5dGVzKSkpCiAgICB7CiAgICAgIHBlcnJvcihkYXBfZGFwbmFtZSk7CiAgICAgIGV4aXQoMSk7 CiAgICB9CiAgaWYgKGRhcF9tZW10cmFjZSkKICAgIHsKICAgICAgZnByaW50ZihkYXBfbG9nLCAi bWFsbG9jICV4ICVzXG4iLCAodW5zaWduZWQgaW50KSBtLCBtZXNnKTsKICAgICAgZmZsdXNoKGRh cF9sb2cpOwogICAgICBpZiAoZGFwX21hYm9ydCAmJiBtID09IGRhcF9tZW10cmFjZSkKCWFib3J0 KCk7CiAgICB9CiAgcmV0dXJuIG07Cn0KCnZvaWQgZGFwX2ZyZWUodm9pZCAqcHRyLCBjaGFyICpt ZXNnKQp7CiAgbmZyZWVzKys7CiAgaWYgKGRhcF9tZW10cmFjZSkKICAgIHsKICAgICAgZnByaW50 ZihkYXBfbG9nLCAiZnJlZSAleCAlc1xuIiwgKHVuc2lnbmVkIGludCkgcHRyLCBtZXNnKTsKICAg ICAgZmZsdXNoKGRhcF9sb2cpOwogICAgICBpZiAoZGFwX2ZhYm9ydCAmJiBwdHIgPT0gZGFwX21l bXRyYWNlKQoJYWJvcnQoKTsKICAgIH0KICBmcmVlKHB0cik7Cn0KCnN0YXRpYyB2b2lkIGluaXRk byhkYXRhb2JzICpkYXRvKQp7CiAgaW50IGQ7CgogIGRhdG8tPmRvX2ludCA9IChpbnQgKikgZGFw X21hbGxvYyhzaXplb2YoaW50KSAqIGRhcF9tYXh2YXIsICJpbml0ZG86IGRhdG8tPmRvX2ludCIp OwogIGRhdG8tPmRvX2lsID0gKGludCAqKikgZGFwX21hbGxvYyhzaXplb2YoaW50ICopICogZGFw X21heHZhciwgImluaXRkbzogZGF0by0+ZG9faWwiKTsKICBkYXRvLT5kb19kYmwgPSAoZG91Ymxl ICopIGRhcF9tYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBkYXBfbWF4dmFyLCAiaW5pdGRvOiBkYXRv LT5kb19kYmwiKTsKICBkYXRvLT5kb19kbCA9IChkb3VibGUgKiopIGRhcF9tYWxsb2Moc2l6ZW9m KGRvdWJsZSAqKSAqIGRhcF9tYXh2YXIsICJpbml0ZG86IGRhdG8tPmRvX2RsIik7CiAgZGF0by0+ ZG9fc3RyID0gKGNoYXIgKiopIGRhcF9tYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBkYXBfbWF4dmFy LCAiaW5pdGRvOiBkYXRvLT5kb19zdHIiKTsKICBkYXRvLT5kb19zbCA9IChpbnQgKikgZGFwX21h bGxvYyhzaXplb2YoaW50KSAqIGRhcF9tYXh2YXIsICJpbml0ZG86IGRhdG8tPmRvX3NsIik7CiAg ZGF0by0+ZG9fbmFtID0gKGNoYXIgKiopIGRhcF9tYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBkYXBf bWF4dmFyLCAiaW5pdGRvOiBkYXRvLT5kb19uYW0iKTsKICBkYXRvLT5kb19sZW4gPSAoaW50ICop IGRhcF9tYWxsb2Moc2l6ZW9mKGludCkgKiBkYXBfbWF4dmFyLCAiaW5pdGRvOiBkYXRvLT5kb19s ZW4iKTsKICBkYXRvLT5kb19pbiA9IChpbnQgKikgZGFwX21hbGxvYyhzaXplb2YoaW50KSAqIGRh cF9tYXh2YXIsICJpbml0ZG86IGRhdG8tPmRvX2luIik7CiAgZGF0by0+ZG9fb3V0ID0gKGludCAq KSBkYXBfbWFsbG9jKHNpemVvZihpbnQpICogZGFwX21heHZhciwgImluaXRkbzogZGF0by0+ZG9f b3V0Iik7CiAgZm9yIChkID0gMDsgZCA8IGRhcF9tYXh2YXI7IGQrKykKICAgIHsKICAgICAgZGF0 by0+ZG9fc3RyW2RdID0gTlVMTDsKICAgICAgZGF0by0+ZG9fbmFtW2RdID0gTlVMTDsKICAgIH0K fQoKLyogdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIGZvciBkZXRlcm1pbmluZyBlbmRpYW5u ZXNzICovCnN0YXRpYyBkb3VibGUgdGVzdGQ7IC8qIGEgZG91YmxlLCBoYWxmIG9mIHdob3NlIGNv bnRlbnRzIHdpbGwgYmUgY29udmVydGVkIHRvIGFuLi4uICovCnN0YXRpYyB1bnNpZ25lZCBpbnQg KnB0ZXN0aTsgLyogdW5zaWduZWQgaW50IHRvIHNlZSBpZiB0aGV5IGFyZQoJCQkgICAgICAvKiB6 ZXJvIChtYW50aXNzYSkgb3Igbm90IChleHBvbmVudCBhbmQgc2lnbgoJCQkgICAgICAgKi8KCmlu dCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogIGNoYXIgKmxzdG5hbWU7CQkvKiBuYW1l IG9mIC5sc3QgZmlsZSAqLwogIGNoYXIgKmxvZ25hbWU7CQkvKiBuYW1lIG9mIC5sb2cgZmlsZSAq LwogIGNoYXIgKmVycm5hbWU7CQkvKiBuYW1lIG9mIC5lcnIgZmlsZSAqLwogIGludCBsZW47CQkv KiBsZW5ndGggb2YgbHN0bmFtZSwgbG9nbmFtZSwgZXJybmFtZSAqLwogIGludCB2OwkJCS8qIGlu ZGV4IHRvIHZhcmlhYmxlcyAqLwoKICBkYXBfZGFwbmFtZSA9IGFyZ3ZbMF07CiAgbGVuID0gc3Ry bGVuKGFyZ3ZbMF0pOwogIGxzdG5hbWUgPSBtYWxsb2MobGVuICsgNSk7CS8qIHJvb20gZm9yIHN1 ZmZpeCAqLwogIHN0cmNweShsc3RuYW1lLCBhcmd2WzBdKTsKICBpZiAobGVuID49IDQgJiYgIXN0 cmNtcChsc3RuYW1lICsgbGVuIC0gNCwgIi5kYXAiKSkKICAgIHN0cmNweShsc3RuYW1lICsgbGVu IC0gMywgImxzdCIpOwogIGVsc2UKICAgIHsKICAgICAgc3RyY2F0KGxzdG5hbWUsICIubHN0Iik7 CiAgICAgIGxlbiArPSA0OwogICAgfQogIGlmICghKGRhcF9sc3QgPSBmb3Blbihsc3RuYW1lLCAi YSIpKSkKICAgIHsKICAgICAgcGVycm9yKGRhcF9kYXBuYW1lKTsKICAgICAgZXhpdCgxKTsKICAg IH0KICBsb2duYW1lID0gbWFsbG9jKGxlbiArIDEpOwogIHN0cmNweShsb2duYW1lLCBsc3RuYW1l KTsKICBzdHJjcHkobG9nbmFtZSArIGxlbiAtIDMsICJsb2ciKTsKICBpZiAoIShkYXBfbG9nID0g Zm9wZW4obG9nbmFtZSwgInciKSkpCiAgICB7CiAgICAgIHBlcnJvcihkYXBfZGFwbmFtZSk7CiAg ICAgIGV4aXQoMSk7CiAgICB9CiAgZXJybmFtZSA9IG1hbGxvYyhsZW4gKyAxKTsKICBzdHJjcHko ZXJybmFtZSwgbHN0bmFtZSk7CiAgc3RyY3B5KGVycm5hbWUgKyBsZW4gLSAzLCAiZXJyIik7CiAg aWYgKCEoZGFwX2VyciA9IGZvcGVuKGVycm5hbWUsICJ3IikpKQogICAgewogICAgICBwZXJyb3Io ZGFwX2RhcG5hbWUpOwogICAgICBleGl0KDEpOwogICAgfQogIGluaXRkbyhkYXBfb2JzKTsKICBp bml0ZG8oZGFwX29icyArIDEpOwogIGluaXRkbyhkYXBfb2JzICsgMik7CiAgaW5pdGRvKGRhcF9w cmV2KTsKICBpbml0ZG8oZGFwX3ByZXYgKyAxKTsKICBpbml0ZG8oJmRvc2F2ZSk7CiAgcmZpbGUg PSAoUkZJTEUgKikgZGFwX21hbGxvYyhzaXplb2YoUkZJTEUpICogZGFwX25yZmlsZXMsICJtYWlu OiByZmlsZSIpOwogIGRmaWxlID0gKERGSUxFICopIGRhcF9tYWxsb2Moc2l6ZW9mKERGSUxFKSAq IChkYXBfbnJmaWxlcyArIE5ERklMRVMpLCAibWFpbjogZGZpbGUiKTsKICBwYWdlbm8gPSAxOwog IGRhcF9wc25hbWUgPSBkYXBfbWFsbG9jKGxlbiArIDEsICJtYWluOiBkYXBfcHNuYW1lIik7CiAg c3RyY3B5KGRhcF9wc25hbWUsIGxzdG5hbWUpOwogIHN0cmNweShkYXBfcHNuYW1lICsgbGVuIC0g MywgInBzIik7CiAgZGFwX2luaXRwaWN0KCk7CiAgZm9yICh2ID0gMDsgdiA8IGRhcF9tYXh2YXI7 IHYrKykKICAgIHsKICAgICAgZm9yIChkYXBfb25vID0gMDsgZGFwX29ubyA8IDM7IGRhcF9vbm8r KykKCXsKCSAgZGFwX29ic1tkYXBfb25vXS5kb19uYW1bdl0gPSBOVUxMOwoJICBkYXBfb2JzW2Rh cF9vbm9dLmRvX2RsW3ZdID0gTlVMTDsKCSAgZGFwX29ic1tkYXBfb25vXS5kb19pbFt2XSA9IE5V TEw7CgkgIGRhcF9vYnNbZGFwX29ub10uZG9fc3RyW3ZdID0gTlVMTDsKCSAgZGFwX29ic1tkYXBf b25vXS5kb19zbFt2XSA9IDA7CgkgIGlmIChkYXBfb25vIDwgMikKCSAgICBkYXBfcHJldltkYXBf b25vXS5kb19zdHJbdl0gPSBOVUxMOwoJfQogICAgICBkb3NhdmUuZG9fc3RyW3ZdID0gTlVMTDsK ICAgIH0KICBkYXBfb25vID0gMDsKICB0ZXN0ZCA9IC0yLjA7IC8qIHRoaXMgc2hvdWxkIGhhdmUg dGhlIHNpZ24gYml0IHNldCBhbmQgbm9uLXplcm8gZXhwb25lbnQsIGJ1dAoJCSAgIC8qIHplcm8g bWFudGlzc2EKCQkgICAgKi8KICBwdGVzdGkgPSAoaW50ICopICZ0ZXN0ZDsgLyogKnB0ZXN0aSBp cyB0aGUgbG93IG9yZGVyIHdvcmQgb2YgdGVzdGQgKi8KICBpZiAoISgqcHRlc3RpKSkKICAgIHsg LyogaWYgdGhhdCdzIHplcm8sIHRoZW4gdGhlIHNpZ24gYW5kIGV4cG9uZW50IGFyZSBpbiB0aGUg aGlnaC1vcmRlciB3b3JkICovCiAgICAgIGRhcF9kYmxsb3cgPSAwOwogICAgICBkYXBfZGJsaGln aCA9IDE7CiAgICB9CiAgZWxzZQogICAgeyAvKiBlbHNlIHRoZXkncmUgaW4gdGhlIGxvdy1vcmRl ciB3b3JkICovCiAgICAgIGRhcF9kYmxsb3cgPSAxOwogICAgICBkYXBfZGJsaGlnaCA9IDA7CiAg ICB9CiAgZm9yICh2ID0gMDsgdiA8IDM7IHYrKykKICAgIHsKICAgICAgZGFwX2luW3ZdID0gKERG SUxFICopIE5VTEw7CiAgICAgIGRhcF9vdXRbdl0gPSAoREZJTEUgKikgTlVMTDsKICAgIH0KICBk YXBfbWFpbihhcmdjLCBhcmd2KTsKICByZXR1cm4gMDsKfQoKLyogT3BlbiBhIGRpc2sgZmlsZSBk YXRhc2V0ICovCnN0YXRpYyBGSUxFICpkb3BlbihjaGFyIGZuYW1lW10sIGNoYXIgbW9kZVtdKQp7 CiAgY2hhciAqZG5hbWU7CiAgRklMRSAqZjsKCiAgZG5hbWUgPSBkYXBfbWFsbG9jKHN0cmxlbihm bmFtZSkgKyBzdHJsZW4oZGFwX3NldGRpcikgKyAyLCAiZG9wZW46IGRuYW1lIik7CiAgZGFwX25h bWUoZG5hbWUsIGZuYW1lKTsKICBmID0gZm9wZW4oZG5hbWUsIG1vZGUpOwogIGRhcF9mcmVlKGRu YW1lLCAiZG9wZW46IGRuYW1lIik7CiAgcmV0dXJuIGY7Cn0KCi8qIGlmIG1vZGVbMV0gPT0gJ2Yn LCBpdCdzIGEgZmlsZSwgbm90IGEgZGF0YXNldCwgc28gZG9uJ3QgcHJlcGVuZCBkaXJlY3Rvcnkg Ki8Kc3RhdGljIERGSUxFICpkZm9wZW4oY2hhciAqZm5hbWUsIGNoYXIgKm1vZGUpCnsKICBzdGF0 aWMgaW50IHJmaWxlaW5pdCA9IDA7CS8qIGZsYWc6IGhhcyB0aGUgcmFtZmlsZSBhcnJheSBiZWVu IGluaXRpYWxpemVkPyAqLwogIGludCBmOwogIGNoYXIgdHJ1ZW1vZGVbMl07CgogIGlmICghcmZp bGVpbml0KQogICAgewogICAgICByZmlsZWluaXQgPSAxOwogICAgICBmb3IgKGYgPSAwOyBmIDwg ZGFwX25yZmlsZXM7IGYrKykKCXsKCSAgZGZpbGVbTkRGSUxFUyArIGZdLmRmaWxlX25hbWUgPSBO VUxMOwoJICBkZmlsZVtOREZJTEVTICsgZl0uZGZpbGVfcmFtID0gcmZpbGUgKyBmOwoJICBkZmls ZVtOREZJTEVTICsgZl0uZGZpbGVfZGlzayA9IE5VTEw7CgkgIHJmaWxlW2ZdLnJmaWxlX3N0ciA9 IE5VTEw7Cgl9CiAgICAgIGZvciAoZiA9IDA7IGYgPCBOREZJTEVTOyBmKyspCgl7CgkgIGRmaWxl W2ZdLmRmaWxlX2Rpc2sgPSBOVUxMOwoJICBkZmlsZVtmXS5kZmlsZV9yYW0gPSBOVUxMOwoJfQog ICAgfQogIGlmICghZm5hbWUpCiAgICB7CiAgICAgIGZwdXRzKCIoZGZvcGVuKSBubyBmaWxlIG5h bWUgZ2l2ZW5cbiIsIGRhcF9lcnIpOwogICAgICBleGl0KDEpOwogICAgfQogIGlmIChmbmFtZVsw XSA9PSAnPCcpCiAgICB7CiAgICAgIGlmICghc3RyY21wKG1vZGUsICJyIikpCgl7CgkgIGZvciAo ZiA9IDA7IGYgPCBkYXBfbnJmaWxlczsgZisrKQoJICAgIHsKCSAgICAgIGlmIChkZmlsZVtOREZJ TEVTICsgZl0uZGZpbGVfbmFtZSAmJgoJCSAgIXN0cmNtcChkZmlsZVtOREZJTEVTICsgZl0uZGZp bGVfbmFtZSwgZm5hbWUgKyAxKSkKCQl7CgkJICByZmlsZVtmXS5yZmlsZV9wb3MgPSByZmlsZVtm XS5yZmlsZV9zdHI7CgkJICByZXR1cm4gZGZpbGUgKyBOREZJTEVTICsgZjsKCQl9CgkgICAgfQoJ ICByZXR1cm4gTlVMTDsKCX0KICAgICAgZWxzZSBpZiAoIXN0cmNtcChtb2RlLCAidyIpKQoJewoJ ICBmb3IgKGYgPSAwOyBmIDwgZGFwX25yZmlsZXM7IGYrKykKCSAgICB7CgkgICAgICBpZiAoZGZp bGVbTkRGSUxFUyArIGZdLmRmaWxlX25hbWUgJiYKCQkgICFzdHJjbXAoZGZpbGVbTkRGSUxFUyAr IGZdLmRmaWxlX25hbWUsIGZuYW1lICsgMSkpCgkJewoJCSAgcmZpbGVbZl0ucmZpbGVfZW5kID0g cmZpbGVbZl0ucmZpbGVfc3RyOwoJCSAgcmZpbGVbZl0ucmZpbGVfcG9zID0gcmZpbGVbZl0ucmZp bGVfc3RyOwoJCSAgcmV0dXJuIGRmaWxlICsgTkRGSUxFUyArIGY7CgkJfQoJICAgIH0KCSAgZm9y IChmID0gMDsgZiA8IGRhcF9ucmZpbGVzOyBmKyspCgkgICAgewoJICAgICAgaWYgKCFkZmlsZVtO REZJTEVTICsgZl0uZGZpbGVfbmFtZSkKCQl7CgkJICByZmlsZVtmXS5yZmlsZV9zdHIgPSBkYXBf bWFsbG9jKGRhcF9yZmlsZXNpemUsCgkJCQkJCSAgImRmb3BlbjogcmZpbGVbZl0ucmZpbGVfc3Ry Iik7CgkJICBkZmlsZVtOREZJTEVTICsgZl0uZGZpbGVfbmFtZSA9CgkJICAgIGRhcF9tYWxsb2Mo c3RybGVuKGZuYW1lKSwgImRmb3BlbjogZGZpbGVbTkRGSUxFUyArIGZdLmRmaWxlX25hbWUiKTsK CQkgIHN0cmNweShkZmlsZVtOREZJTEVTICsgZl0uZGZpbGVfbmFtZSwgZm5hbWUgKyAxKTsKCQkg IHJmaWxlW2ZdLnJmaWxlX2VuZCA9IHJmaWxlW2ZdLnJmaWxlX3N0cjsKCQkgIHJmaWxlW2ZdLnJm aWxlX3BvcyA9IHJmaWxlW2ZdLnJmaWxlX3N0cjsKCQkgIHJldHVybiBkZmlsZSArIE5ERklMRVMg KyBmOwoJCX0KCSAgICB9CgkgIHJldHVybiBOVUxMOwoJfQogICAgICBlbHNlIGlmICghc3RyY21w KG1vZGUsICJhIikpCgl7CgkgIGZvciAoZiA9IDA7IGYgPCBkYXBfbnJmaWxlczsgZisrKQoJICAg IHsKCSAgICAgIGlmICghc3RyY21wKGRmaWxlW05ERklMRVMgKyBmXS5kZmlsZV9uYW1lLCBmbmFt ZSArIDEpKQoJCXsKCQkgIHJmaWxlW2ZdLnJmaWxlX3BvcyA9IHJmaWxlW2ZdLnJmaWxlX2VuZDsK CQkgIHJldHVybiBkZmlsZSArIE5ERklMRVMgKyBmOwoJCX0KCSAgICB9CgkgIHJldHVybiBOVUxM OwoJfQogICAgICBlbHNlCgl7CgkgIGZwcmludGYoZGFwX2VyciwgIihkZm9wZW4pIGJhZCBtb2Rl OiAlc1xuIiwgbW9kZSk7CgkgIGV4aXQoMSk7Cgl9CiAgICB9CiAgZm9yIChmID0gMDsgZiA8IE5E RklMRVM7IGYrKykKICAgIHsKICAgICAgaWYgKCFkZmlsZVtmXS5kZmlsZV9kaXNrKQoJewoJICBp ZiAobW9kZVsxXSA9PSAnZicpCgkgICAgewoJICAgICAgdHJ1ZW1vZGVbMF0gPSBtb2RlWzBdOwoJ ICAgICAgdHJ1ZW1vZGVbMV0gPSAnXDAnOwoJICAgICAgZGZpbGVbZl0uZGZpbGVfZGlzayA9IGZv cGVuKGZuYW1lLCB0cnVlbW9kZSk7CgkgICAgfQoJICBlbHNlCgkgICAgZGZpbGVbZl0uZGZpbGVf ZGlzayA9IGRvcGVuKGZuYW1lLCBtb2RlKTsKCSAgaWYgKGRmaWxlW2ZdLmRmaWxlX2Rpc2spCgkg ICAgewoJICAgICAgZGZpbGVbZl0uZGZpbGVfbmFtZSA9CgkJZGFwX21hbGxvYyhzdHJsZW4oZm5h bWUpICsgMSwgImRmb3BlbjogZGZpbGVbZl0uZGZpbGVfbmFtZSIpOwoJICAgICAgc3RyY3B5KGRm aWxlW2ZdLmRmaWxlX25hbWUsIGZuYW1lKTsKCSAgICAgIHJldHVybiBkZmlsZSArIGY7CgkgICAg fQoJICBlbHNlCgkgICAgcmV0dXJuIE5VTEw7Cgl9CiAgICB9CiAgcmV0dXJuIE5VTEw7Cn0KCnN0 YXRpYyB2b2lkIGRmY2xvc2UoREZJTEUgKmZwKQp7CiAgaWYgKGZwLT5kZmlsZV9kaXNrKQogICAg ewogICAgICBmY2xvc2UoZnAtPmRmaWxlX2Rpc2spOwogICAgICBmcC0+ZGZpbGVfZGlzayA9IE5V TEw7CiAgICB9CiAgZWxzZQogICAgZnAtPmRmaWxlX3JhbS0+cmZpbGVfcG9zID0gZnAtPmRmaWxl X3JhbS0+cmZpbGVfc3RyOwp9CgpzdGF0aWMgaW50IGRnZXRjKERGSUxFICpmcCkKewogIGludCBj OwoKICBpZiAoZnAtPmRmaWxlX2Rpc2spCiAgICBjID0gZ2V0YyhmcC0+ZGZpbGVfZGlzayk7CiAg ZWxzZSBpZiAoZnAtPmRmaWxlX3JhbS0+cmZpbGVfcG9zIDwgZnAtPmRmaWxlX3JhbS0+cmZpbGVf ZW5kKQogICAgYyA9ICpmcC0+ZGZpbGVfcmFtLT5yZmlsZV9wb3MrKzsKICBlbHNlCiAgICBjID0g RU9GOwogIHJldHVybiBjOwp9CgpzdGF0aWMgdm9pZCB1bmRnZXRjKGludCBjLCBERklMRSAqZnAp CnsKICBpZiAoZnAtPmRmaWxlX2Rpc2spCiAgICB1bmdldGMoYywgZnAtPmRmaWxlX2Rpc2spOwog IGVsc2UgaWYgKGZwLT5kZmlsZV9yYW0tPnJmaWxlX3BvcyA+IGZwLT5kZmlsZV9yYW0tPnJmaWxl X3N0cikKICAgIHsKICAgICAgLS1mcC0+ZGZpbGVfcmFtLT5yZmlsZV9wb3M7CiAgICAgICpmcC0+ ZGZpbGVfcmFtLT5yZmlsZV9wb3MgPSBjOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgZnByaW50 ZihkYXBfZXJyLCAiKHVuZGdldGMpIGNhbid0IHVuZ2V0IHBhc3QgYmVnaW5uaW5nIG9mIGZpbGUg JXNcbiIsCgkgICAgICBmcC0+ZGZpbGVfbmFtZSk7CiAgICAgIGV4aXQoMSk7CiAgICB9Cn0KCnZv aWQgZGFwX3B1dGMoaW50IGMsIERGSUxFICpmcCkKewogIGlmIChmcC0+ZGZpbGVfZGlzaykKICAg IHB1dGMoYywgZnAtPmRmaWxlX2Rpc2spOwogIGVsc2UgaWYgKGZwLT5kZmlsZV9yYW0tPnJmaWxl X3BvcyA8IGZwLT5kZmlsZV9yYW0tPnJmaWxlX3N0ciArIGRhcF9yZmlsZXNpemUpCiAgICB7CiAg ICAgICpmcC0+ZGZpbGVfcmFtLT5yZmlsZV9wb3MrKyA9IGM7CiAgICAgIGZwLT5kZmlsZV9yYW0t PnJmaWxlX2VuZCsrOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgZnByaW50ZihkYXBfZXJyLCAi KGRhcF9wdXRjKSB0b28gbWFueSBjaGFyYWN0ZXJzOiAlc1xuIiwKCSAgICAgIGZwLT5kZmlsZV9u YW1lKTsKICAgICAgZXhpdCgxKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgZHB1dHMoY2hhciAqcywg Y2hhciAqc3VmZiwgREZJTEUgKmZwKQp7CiAgaWYgKGZwLT5kZmlsZV9kaXNrKQogICAgewogICAg ICBmcHV0cyhzLCBmcC0+ZGZpbGVfZGlzayk7CiAgICAgIGZwdXRzKHN1ZmYsIGZwLT5kZmlsZV9k aXNrKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHdoaWxlICgqcykKCWRhcF9wdXRjKCpzKyss IGZwKTsKICAgICAgd2hpbGUgKCpzdWZmKQoJZGFwX3B1dGMoKnN1ZmYrKywgZnApOwogICAgfQp9 CgpzdGF0aWMgdm9pZCBkcHV0aShpbnQgaSwgREZJTEUgKmZwKQp7CiAgc3RhdGljIGNoYXIgKmlz dHIgPSBOVUxMOwogIGludCBzOwoKICBpZiAoIWlzdHIpCiAgICBpc3RyID0gZGFwX21hbGxvYyhk YXBfaW50bGVuICsgMSwgImRwdXRpOiBpc3RyIik7CiAgaWYgKGZwLT5kZmlsZV9kaXNrKQogICAg ZnByaW50ZihmcC0+ZGZpbGVfZGlzaywgIiVkIiwgaSk7CiAgZWxzZQogICAgewogICAgICBzcHJp bnRmKGlzdHIsICIlZCIsIGkpOwogICAgICBmb3IgKHMgPSAwOyBzIDwgc3RybGVuKGlzdHIpOyBz KyspCglkYXBfcHV0Yyhpc3RyW3NdLCBmcCk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIGRmbHVzaChE RklMRSAqZnApCnsKICBmZmx1c2goZnAtPmRmaWxlX2Rpc2spOwp9CgovKiBBcHBlbmQgb3IgcmVw bGFjZSBzdWZmaXguIElmIHN1ZmZbMF0gPT0gJzwnLCB0aGVuIHN1ZmYgcmVwbGFjZXMKICogY2hh cmFjdGVycyBmb2xsb3dpbmcgbGFzdCAnLicsIG90aGVyd2lzZSBpcyBhcHBlbmRlZAogKi8Kdm9p ZCBkYXBfc3VmZml4KGNoYXIgZHN0W10sIGNoYXIgc3JjW10sIGNoYXIgc3VmZltdKQp7CiAgaW50 IG4sIHM7CgogIGZvciAobiA9IDA7IHNyY1tuXTsgbisrKQogICAgZHN0W25dID0gc3JjW25dOwog IGlmIChzdWZmWzBdID09ICc8JykKICAgIHsKICAgICAgd2hpbGUgKC0tbiA+PSAwKQoJewoJICBp ZiAoZHN0W25dID09ICcuJykKCSAgICBicmVhazsKCX0KICAgICAgaWYgKG4gPCAwKQoJewoJICBm cHJpbnRmKGRhcF9lcnIsICIoZGFwX3N1ZmZpeCkgc291cmNlIG5hbWUgaGFzIG5vICcuJzogJXNc biIsIHNyYyk7CgkgIGV4aXQoMSk7Cgl9CiAgICAgIG4rKzsKICAgICAgcyA9IDE7CiAgICB9CiAg ZWxzZQogICAgcyA9IDA7CiAgZm9yICggOyBzdWZmW3NdOyBzKyspCiAgICBkc3RbbisrXSA9IHN1 ZmZbc107CiAgZHN0W25dID0gJ1wwJzsKfQoKLyogZ2V0IHRoZSBpbmRleCBvZiBhIHZhcmlhYmxl ICovCmludCBkYXBfdmFybnVtKGNoYXIgKnZuYW1lKQp7CiAgaW50IHY7CiAgaW50IG5vbmJsYW5r OyAvKiBudW1iZXIgb2Ygbm9uLWJsYW5rIGNoYXJhY3RlcnMgaW4gdm5hbWUgKi8KCiAgd2hpbGUg KCp2bmFtZSA9PSAnICcpCiAgICB2bmFtZSsrOwogIGZvciAobm9uYmxhbmsgPSAwOyB2bmFtZVtu b25ibGFua10gJiYgdm5hbWVbbm9uYmxhbmtdICE9ICcgJzsgbm9uYmxhbmsrKykKICAgIDsKICBp ZiAodm5hbWUpCiAgICB7CiAgICAgIGZvciAodiA9IDA7IHYgPCBkYXBfb2JzW2RhcF9vbm9dLmRv X252YXI7IHYrKykKCXsKCSAgaWYgKCFzdHJuY21wKHZuYW1lLCBkYXBfb2JzW2RhcF9vbm9dLmRv X25hbVt2XSwgbm9uYmxhbmspICYmCgkgICAgICAhZGFwX29ic1tkYXBfb25vXS5kb19uYW1bdl1b bm9uYmxhbmtdKQoJICAgIHJldHVybiB2OwoJfQogICAgfQogIHJldHVybiAtMTsKfQoKaW50IGRh cF9hcnJudW0oY2hhciB2bmFtZVtdLCBpbnQgKmRpbSkKewogIGludCB2OwogIGludCBuOwogIGlu dCBkOwoKICBmb3IgKHYgPSAwOyB2IDwgZGFwX29ic1tkYXBfb25vXS5kb19udmFyOyB2KyspCiAg ICB7CiAgICAgIGZvciAobiA9IDA7IHZuYW1lW25dICYmIHZuYW1lW25dID09IGRhcF9vYnNbZGFw X29ub10uZG9fbmFtW3ZdW25dOyBuKyspCgk7CiAgICAgIGlmICghdm5hbWVbbl0gJiYgZGFwX29i c1tkYXBfb25vXS5kb19uYW1bdl1bbl0gPT0gJ1snKQoJewoJICBmb3IgKGQgPSAxOyB2ICsgZCA8 IGRhcF9vYnNbZGFwX29ub10uZG9fbnZhcjsgZCsrKQoJICAgIHsKCSAgICAgIGZvciAobiA9IDA7 IHZuYW1lW25dICYmCgkJICAgICB2bmFtZVtuXSA9PSBkYXBfb2JzW2RhcF9vbm9dLmRvX25hbVt2 ICsgZF1bbl07IG4rKykKCQk7CgkgICAgICBpZiAodm5hbWVbbl0gfHwgZGFwX29ic1tkYXBfb25v XS5kb19uYW1bdiArIGRdW25dICE9ICdbJykKCQlicmVhazsKCSAgICB9CgkgICpkaW0gPSBkOwoJ ICByZXR1cm4gdjsKCX0KICAgIH0KICByZXR1cm4gLTE7Cn0KCnN0YXRpYyBpbnQgZGFwX2dldGxp bmUoREZJTEUgKmZwLCBjaGFyICpsaW5lKQp7CiAgaW50IGw7CiAgaW50IGM7CiAgaW50IGNjOwoK ICBjID0gRU9GOwogIHN3aXRjaCAoaW50eXBlKQogICAgewogICAgY2FzZSBURVhUOgogICAgY2Fz ZSBEU0VUOgogICAgICBmb3IgKGwgPSAwOyAoYyA9IGRnZXRjKGZwKSkgIT0gRU9GOyApCgl7Cgkg IGlmIChjID09ICdcbicpCgkgICAgYnJlYWs7CgkgIGVsc2UgaWYgKGMgPT0gJ1xyJykKCSAgICB7 CgkgICAgICBpZiAoKGNjID0gZGdldGMoZnApKSAhPSAnXG4nKQoJCXVuZGdldGMoY2MsIGZwKTsK CSAgICAgIGJyZWFrOwoJICAgIH0KCSAgaWYgKGwgPCBkYXBfbGluZWxlbikKCSAgICBsaW5lW2wr K10gPSBjOwoJICBlbHNlCgkgICAgewoJICAgICAgbGluZVtsXSA9ICdcMCc7CgkgICAgICBmcHJp bnRmKGRhcF9lcnIsICIoZGFwX2dldGxpbmUpIGxpbmUgdG9vIGxvbmc6XG4lc1xuIiwgbGluZSk7 CgkgICAgICBleGl0KDEpOwoJICAgIH0KCX0KICAgICAgbGluZVtsXSA9ICdcMCc7CiAgICAgIGJy ZWFrOwogICAgY2FzZSBEQkFTRToKICAgICAgZGdldGMoZnApOyAgICAgIC8qIGR1bXAgc3BhY2Ug Ki8KICAgICAgZm9yIChsID0gMDsgbCA8IGlubGVuOyBsKyspCgl7CgkgIGlmICgoYyA9IGRnZXRj KGZwKSkgPT0gRU9GKQoJICAgIGJyZWFrOwoJICBlbHNlCgkgICAgbGluZVtsXSA9IGM7Cgl9CiAg ICAgIGlmIChsIDwgaW5sZW4pCglsID0gMDsKICAgICAgbGluZVtsXSA9ICdcMCc7CiAgICAgIGJy ZWFrOwogICAgZGVmYXVsdDoKICAgICAgZnByaW50ZihkYXBfZXJyLCAiKGRhcF9nZXRsaW5lKSBi YWQgaW5maWxlIHR5cGU6ICVkXG4iLCBpbnR5cGUpOwogICAgICBleGl0KDEpOwogICAgfQogIGlm ICghbCAmJiBjID09IEVPRikKICAgIHJldHVybiAtMTsKICByZXR1cm4gbDsKfQp2b2lkIGRhcF9z d2FwKCkKewogIGludCBpdjsJCS8qIGluZGV4IG9mIGlucHV0IHZhcmlhYmxlICovCiAgZG91Ymxl IGRibHRtcDsJLyogdGVtcCBmb3Igc3dhcHBpbmcgZG91YmxlcyAqLwogIGludCBpbnR0bXA7CS8q IHRlbXAgZm9yIHN3YXBwaW5nIGludCAqLwogIGNoYXIgc3RydG1wOwkvKiB0ZW1wIGNoYXIgZm9y IHN3YXBwaW5nIHN0cmluZ3MgKi8KICBpbnQgczsJCS8qIGluZGV4IHRvIHN0cmluZ3MgKi8KICBj aGFyICpzbywgKnNwOwkvKiBwb2ludGVycyB0byBzdHJpbmdzIGZvciBvYnMsIHByZXYgKi8KCiAg Zm9yIChpdiA9IDA7IGl2IDwgZGFwX29ic1tkYXBfb25vXS5kb19pdmFyOyBpdisrKQogICAgewog ICAgICBzd2l0Y2ggKGRhcF9vYnNbZGFwX29ub10uZG9fbGVuW2RhcF9vYnNbZGFwX29ub10uZG9f aW5baXZdXSkKCXsKCWNhc2UgREJMOgoJICBkYmx0bXAgPSBkYXBfb2JzW2RhcF9vbm9dLmRvX2Ri bFtkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV07CgkgIGRhcF9vYnNbZGFwX29ub10uZG9fZGJs W2RhcF9vYnNbZGFwX29ub10uZG9faW5baXZdXSA9CgkgICAgZGFwX3ByZXZbZGFwX29ub10uZG9f ZGJsW2RhcF9vYnNbZGFwX29ub10uZG9faW5baXZdXTsKCSAgZGFwX3ByZXZbZGFwX29ub10uZG9f ZGJsW2RhcF9vYnNbZGFwX29ub10uZG9faW5baXZdXSA9IGRibHRtcDsKCSAgaWYgKGRhcF9vYnNb ZGFwX29ub10uZG9fZGxbZGFwX29ic1tkYXBfb25vXS5kb19pbltpdl1dKQoJICAgICpkYXBfb2Jz W2RhcF9vbm9dLmRvX2RsW2RhcF9vYnNbZGFwX29ub10uZG9faW5baXZdXSA9CgkgICAgICBkYXBf b2JzW2RhcF9vbm9dLmRvX2RibFtkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV07CgkgIGJyZWFr OwoJY2FzZSBJTlQ6CgkgIGludHRtcCA9IGRhcF9vYnNbZGFwX29ub10uZG9faW50W2RhcF9vYnNb ZGFwX29ub10uZG9faW5baXZdXTsKCSAgZGFwX29ic1tkYXBfb25vXS5kb19pbnRbZGFwX29ic1tk YXBfb25vXS5kb19pbltpdl1dID0KCSAgICBkYXBfcHJldltkYXBfb25vXS5kb19pbnRbZGFwX29i c1tkYXBfb25vXS5kb19pbltpdl1dOwoJICBkYXBfcHJldltkYXBfb25vXS5kb19pbnRbZGFwX29i c1tkYXBfb25vXS5kb19pbltpdl1dID0gaW50dG1wOwoJICBpZiAoZGFwX29ic1tkYXBfb25vXS5k b19pbFtkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV0pCgkgICAgKmRhcF9vYnNbZGFwX29ub10u ZG9faWxbZGFwX29ic1tkYXBfb25vXS5kb19pbltpdl1dID0KCSAgICAgIGRhcF9vYnNbZGFwX29u b10uZG9faW50W2RhcF9vYnNbZGFwX29ub10uZG9faW5baXZdXTsKCSAgYnJlYWs7CglkZWZhdWx0 OgoJICBzbyA9IGRhcF9vYnNbZGFwX29ub10uZG9fc3RyW2RhcF9vYnNbZGFwX29ub10uZG9faW5b aXZdXTsKCSAgc3AgPSBkYXBfcHJldltkYXBfb25vXS5kb19zdHJbZGFwX29ic1tkYXBfb25vXS5k b19pbltpdl1dOwoJICBmb3IgKHMgPSAwOyBzIDwgZGFwX29ic1tkYXBfb25vXS5kb19sZW5bZGFw X29ic1tkYXBfb25vXS5kb19pbltpdl1dOyBzKyspCgkgICAgewoJICAgICAgc3RydG1wID0gc29b c107CgkgICAgICBzb1tzXSA9IHNwW3NdOwoJICAgICAgc3Bbc10gPSBzdHJ0bXA7CgkgICAgfQoJ ICBicmVhazsKCX0KICAgIH0KfQoKdm9pZCBkYXBfc2F2ZSgpCnsKICBpbnQgaXY7CgogIGZvciAo aXYgPSAwOyBpdiA8IGRhcF9vYnNbZGFwX29ub10uZG9faXZhcjsgaXYrKykKICAgIHsKICAgICAg c3dpdGNoIChkYXBfb2JzW2RhcF9vbm9dLmRvX2xlbltkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2 XV0pCgl7CgljYXNlIERCTDoKCSAgZG9zYXZlLmRvX2RibFtkYXBfb2JzW2RhcF9vbm9dLmRvX2lu W2l2XV0gPQoJICAgIGRhcF9vYnNbZGFwX29ub10uZG9fZGJsW2RhcF9vYnNbZGFwX29ub10uZG9f aW5baXZdXTsKCSAgYnJlYWs7CgljYXNlIElOVDoKCSAgZG9zYXZlLmRvX2ludFtkYXBfb2JzW2Rh cF9vbm9dLmRvX2luW2l2XV0gPQoJICAgIGRhcF9vYnNbZGFwX29ub10uZG9faW50W2RhcF9vYnNb ZGFwX29ub10uZG9faW5baXZdXTsKCSAgYnJlYWs7CglkZWZhdWx0OgoJICBpZiAoZG9zYXZlLmRv X3N0cltkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV0pCgkgICAgZGFwX2ZyZWUoZG9zYXZlLmRv X3N0cltkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV0sCgkJICAgICAiZGFwX3NhdmU6IGRvc2F2 ZS5kb19zdHJbZGFwX29ic1tkYXBfb25vXS5kb19pbltpdl1dIik7CgkgIGRvc2F2ZS5kb19zdHJb ZGFwX29ic1tkYXBfb25vXS5kb19pbltpdl1dID0KCSAgICBkYXBfbWFsbG9jKGRhcF9vYnNbZGFw X29ub10uZG9fbGVuW2RhcF9vYnNbZGFwX29ub10uZG9faW5baXZdXSArIDEsCgkJICAgICAgICJk YXBfc2F2ZTogZGFwX29ic1tkYXBfb25vXS5kb19uYW1bZGFwX29ic1tkYXBfb25vXS5kb19pbltp dl1dIik7CgkgIHN0cm5jcHkoZG9zYXZlLmRvX3N0cltkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2 XV0sCgkJICBkYXBfb2JzW2RhcF9vbm9dLmRvX3N0cltkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2 XV0sCgkJICBkYXBfb2JzW2RhcF9vbm9dLmRvX2xlbltkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2 XV0gKyAxKTsKCSAgYnJlYWs7Cgl9CiAgICB9Cn0KCnZvaWQgZGFwX3Jlc3QoKQp7CiAgaW50IGl2 OwoKICBmb3IgKGl2ID0gMDsgaXYgPCBkYXBfb2JzW2RhcF9vbm9dLmRvX2l2YXI7IGl2KyspCiAg ICB7CiAgICAgIHN3aXRjaCAoZGFwX29ic1tkYXBfb25vXS5kb19sZW5bZGFwX29ic1tkYXBfb25v XS5kb19pbltpdl1dKQoJewoJY2FzZSBEQkw6CgkgIGRhcF9vYnNbZGFwX29ub10uZG9fZGJsW2Rh cF9vYnNbZGFwX29ub10uZG9faW5baXZdXSA9CgkgICAgZG9zYXZlLmRvX2RibFtkYXBfb2JzW2Rh cF9vbm9dLmRvX2luW2l2XV07CgkgIGlmIChkYXBfb2JzW2RhcF9vbm9dLmRvX2RsW2RhcF9vYnNb ZGFwX29ub10uZG9faW5baXZdXSkKCSAgICAqZGFwX29ic1tkYXBfb25vXS5kb19kbFtkYXBfb2Jz W2RhcF9vbm9dLmRvX2luW2l2XV0gPQoJICAgICAgZGFwX29ic1tkYXBfb25vXS5kb19kYmxbZGFw X29ic1tkYXBfb25vXS5kb19pbltpdl1dOwoJICBicmVhazsKCWNhc2UgSU5UOgoJICBkYXBfb2Jz W2RhcF9vbm9dLmRvX2ludFtkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV0gPQoJICAgIGRvc2F2 ZS5kb19pbnRbZGFwX29ic1tkYXBfb25vXS5kb19pbltpdl1dOwoJICBpZiAoZGFwX29ic1tkYXBf b25vXS5kb19pbFtkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV0pCgkgICAgKmRhcF9vYnNbZGFw X29ub10uZG9faWxbZGFwX29ic1tkYXBfb25vXS5kb19pbltpdl1dID0KCSAgICAgIGRhcF9vYnNb ZGFwX29ub10uZG9faW50W2RhcF9vYnNbZGFwX29ub10uZG9faW5baXZdXTsKCSAgYnJlYWs7Cglk ZWZhdWx0OgoJICBzdHJuY3B5KGRhcF9vYnNbZGFwX29ub10uZG9fc3RyW2RhcF9vYnNbZGFwX29u b10uZG9faW5baXZdXSwKCQkgIGRvc2F2ZS5kb19zdHJbZGFwX29ic1tkYXBfb25vXS5kb19pbltp dl1dLAoJCSAgZGFwX29ic1tkYXBfb25vXS5kb19sZW5bZGFwX29ic1tkYXBfb25vXS5kb19pbltp dl1dICsgMSk7CgkgIGJyZWFrOwoJfQogICAgfQp9Cgpsb25nIGRhcF9mdGVsbChERklMRSAqZnAp CnsKICBpZiAoZnAtPmRmaWxlX2Rpc2spCiAgICByZXR1cm4gZnRlbGwoZnAtPmRmaWxlX2Rpc2sp OwogIHJldHVybiBmcC0+ZGZpbGVfcmFtLT5yZmlsZV9wb3MgLSBmcC0+ZGZpbGVfcmFtLT5yZmls ZV9zdHI7Cn0KCnZvaWQgZGFwX21hcmsoKQp7CiAgZmlsZXBvc1tkYXBfb25vXSA9IGRhcF9mdGVs bChkYXBfaW5bZGFwX29ub10pOwp9CgpzdGF0aWMgdm9pZCBkZnNlZWsoREZJTEUgKmZwLCBsb25n IHBvcywgaW50IG1vZGUpCnsKICBpZiAoZnAtPmRmaWxlX2Rpc2spCiAgICBmc2VlayhmcC0+ZGZp bGVfZGlzaywgcG9zLCBtb2RlKTsKICBlbHNlCiAgICB7CiAgICAgIGlmIChmcC0+ZGZpbGVfcmFt LT5yZmlsZV9zdHIgKyBwb3MgPCBmcC0+ZGZpbGVfcmFtLT5yZmlsZV9lbmQpCglmcC0+ZGZpbGVf cmFtLT5yZmlsZV9wb3MgPSBmcC0+ZGZpbGVfcmFtLT5yZmlsZV9zdHIgKyBwb3M7CiAgICAgIGVs c2UKCXsKCSAgZnByaW50ZihkYXBfZXJyLCAiKGRmc2Vlaykgc2VlayBwYXN0IGVuZCBvZiByYW1m aWxlICVzXG4iLAoJCSAgZnAtPmRmaWxlX25hbWUpOwoJICBleGl0KDEpOwoJfQogICAgfQp9Cgp2 b2lkIGRhcF9yZXdpbmQoKQp7CiAgaWYgKGRhcF9pbltkYXBfb25vXSkKICAgIHsKICAgICAgaWYg KGZpbGVwb3NbZGFwX29ub10gPCBkYXBfZnRlbGwoZGFwX2luW2RhcF9vbm9dKSkKCWVvZltkYXBf b25vXSA9IDA7CiAgICAgIGRmc2VlayhkYXBfaW5bZGFwX29ub10sIGZpbGVwb3NbZGFwX29ub10s IFNFRUtfU0VUKTsKICAgICAgZGFwX29ic1tkYXBfb25vXS5kb192YWxpZCA9IDA7CiAgICB9CiAg ZWxzZQogICAgewogICAgICBmcHJpbnRmKGRhcF9lcnIsICIoZGFwX3Jld2luZCkgZmlsZSAoJWQp IGlzIGNsb3NlZC5cbiIsIGRhcF9vbm8pOwogICAgICBleGl0KDEpOwogICAgfQp9CgppbnQgZGFw X2JsYW5rKGNoYXIgc3RyW10pCnsKICBpbnQgYjsKCiAgZm9yIChiID0gMDsgc3RyW2JdID09ICcg JzsgYisrKQogICAgOwogIGlmIChzdHJbYl0pCiAgICByZXR1cm4gMDsKICByZXR1cm4gMTsKfQoK dm9pZCBza2lwKGludCBubGluZXMpCnsKICBjaGFyICpsaW5lOwoKICBsaW5lID0gZGFwX21hbGxv YyhkYXBfbGluZWxlbiArIDEsICJza2lwOiBsaW5lIik7CiAgd2hpbGUgKC0tbmxpbmVzID49IDAp CiAgICB7CiAgICAgIGlmICghZGFwX2luW2RhcF9vbm9dIHx8IGVvZltkYXBfb25vXSkKCXsKCSAg ZnByaW50ZihkYXBfZXJyLCAiKHNraXApIHRyaWVkIHRvIHJlYWQgcGFzdCBlbmQgb2YgZmlsZSAo JWQpLlxuIiwKCQkgIGRhcF9vbm8pOwoJICBleGl0KDEpOwoJfQogICAgICBpZiAoZGFwX2dldGxp bmUoZGFwX2luW2RhcF9vbm9dLCBsaW5lKSA8IDApCgllb2ZbZGFwX29ub10gPSAxOwogICAgICBs aW5lbm9bZGFwX29ub10rKzsKICAgIH0KICBkYXBfZnJlZShsaW5lLCAic2tpcDogbGluZSIpOwp9 CgppbnQgc3RlcCgpCnsKICBzdGF0aWMgaW50IHN0ZXBpbml0ID0gMDsgLyogbmVlZCB0byBpbml0 aWFsaXplICJsaW5lIiBhbmQgInZhbHVlIiAqLwogIHN0YXRpYyBjaGFyICpsaW5lID0gTlVMTDsg LyogbGluZSByZWFkICovCiAgc3RhdGljIGNoYXIgKnZhbHVlID0gTlVMTDsKICBpbnQgdjsJCQkJ LyogaW5kZXggdG8gdmFyaWFibGVzICovCiAgaW50IGw7CiAgaW50IGk7CiAgaW50IGl2OwogIGlu dCBucmVhZDsJLyogbnVtYmVyIG9mIGNoYXJzIHJlYWQgYnkgZGFwX2dldGxpbmUgKi8KCiAgaWYg KCFzdGVwaW5pdCkKICAgIHsKICAgICAgc3RlcGluaXQgPSAxOwogICAgICBsaW5lID0gZGFwX21h bGxvYyhkYXBfbGluZWxlbiArIDEsICJzdGVwOiBsaW5lIik7CiAgICAgIHZhbHVlID0gZGFwX21h bGxvYyhkYXBfbGluZWxlbiArIDEsICJzdGVwOiB2YWx1ZSIpOwogICAgfQogIGlmICghZGFwX2lu W2RhcF9vbm9dIHx8IGVvZltkYXBfb25vXSkKICAgIHsKICAgICAgZnByaW50ZihkYXBfZXJyLCAi KHN0ZXApIEVSUk9SOiB0cmllZCB0byByZWFkIHBhc3QgZW5kIG9mIGZpbGUgKCVzKS5cbiIsCgkg ICAgICAoZGFwX2luW2RhcF9vbm9dID8gZGFwX2luW2RhcF9vbm9dLT5kZmlsZV9uYW1lIDogIj8i KSk7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgLyogY29weSBtb3N0IHJlY2VudGx5IHJlYWQgbGlu ZSB0byBwcmV2ICovCiAgZm9yIChpdiA9IDA7IGl2IDwgZGFwX29ic1tkYXBfb25vXS5kb19pdmFy OyBpdisrKQogICAgewogICAgICBzd2l0Y2ggKGRhcF9vYnNbZGFwX29ub10uZG9fbGVuW2RhcF9v YnNbZGFwX29ub10uZG9faW5baXZdXSkKCXsKCWNhc2UgREJMOgoJICBkYXBfcHJldltkYXBfb25v XS5kb19kYmxbZGFwX29ic1tkYXBfb25vXS5kb19pbltpdl1dID0KCSAgICBkYXBfb2JzW2RhcF9v bm9dLmRvX2RibFtkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV07CgkgIGJyZWFrOwoJY2FzZSBJ TlQ6CgkgIGRhcF9wcmV2W2RhcF9vbm9dLmRvX2ludFtkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2 XV0gPQoJICAgIGRhcF9vYnNbZGFwX29ub10uZG9faW50W2RhcF9vYnNbZGFwX29ub10uZG9faW5b aXZdXTsKCSAgYnJlYWs7CglkZWZhdWx0OgoJICBzdHJuY3B5KGRhcF9wcmV2W2RhcF9vbm9dLmRv X3N0cltkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV0sCgkJICBkYXBfb2JzW2RhcF9vbm9dLmRv X3N0cltkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV0sCgkJICBkYXBfb2JzW2RhcF9vbm9dLmRv X2xlbltkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2l2XV0gKyAxKTsKCX0KICAgIH0KICBkYXBfcHJl dltkYXBfb25vXS5kb192YWxpZCA9IGRhcF9vYnNbZGFwX29ub10uZG9fdmFsaWQ7CiAgaWYgKChu cmVhZCA9IGRhcF9nZXRsaW5lKGRhcF9pbltkYXBfb25vXSwgbGluZSkpIDw9IDApCiAgICB7CiAg ICAgIGVvZltkYXBfb25vXSA9IDE7CiAgICAgIGRhcF9vYnNbZGFwX29ub10uZG9fdmFsaWQgPSAw OwogICAgICBmcHJpbnRmKHN0ZGVyciwgIihzdGVwKSAlZCBsaW5lcyByZWFkIGZyb20gJXNcbiIs CgkgICAgICBsaW5lbm9bZGFwX29ub10gLSAxLCBkYXBfaW5bZGFwX29ub10tPmRmaWxlX25hbWUp OwogICAgICBpZiAoIW5yZWFkKQoJZnB1dHMoIihzdGVwKSBXQVJOSU5HOiB0ZXJtaW5hdGVkIG9u IG51bGwgbGluZVxuIiwgc3RkZXJyKTsKICAgICAgZmZsdXNoKHN0ZGVycik7CiAgICAgIGZwcmlu dGYoZGFwX2xvZywgIihzdGVwKSAlZCBsaW5lcyByZWFkIGZyb20gICVzXG4iLAoJICAgICAgbGlu ZW5vW2RhcF9vbm9dIC0gMSwgZGFwX2luW2RhcF9vbm9dLT5kZmlsZV9uYW1lKTsKICAgICAgaWYg KCFucmVhZCkKCWZwdXRzKCIoc3RlcCkgV0FSTklORzogdGVybWluYXRlZCBvbiBudWxsIGxpbmVc biIsIGRhcF9sb2cpOwogICAgICByZXR1cm4gMDsKICAgIH0KICBpZiAobmZpZWxkcyAmJiBkYXBf b2JzW2RhcF9vbm9dLmRvX2l2YXIgIT0gbmZpZWxkcykKICAgIHsKICAgICAgZnByaW50ZihkYXBf ZXJyLAoJICAgICAgIihzdGVwKSBFUlJPUjogbnVtYmVyIG9mIGlucHV0IHZhcmlhYmxlcyAlZCBk aWZmZXJlbnQgZnJvbSBudW1iZXIgb2YgZmllbGRzIHNwZWNpZmllZCAlZCBmb3IgJXMuXG4iLAoJ ICAgICAgZGFwX29ic1tkYXBfb25vXS5kb19pdmFyLCBuZmllbGRzLCBkYXBfaW5bZGFwX29ub10t PmRmaWxlX25hbWUpOwogICAgICBleGl0KDEpOwogICAgfQogIC8qIGNvbnZlcnQgaW5wdXQgdmFy aWFibGVzICovCiAgZm9yICh2ID0gMCwgbCA9IDA7IHYgPCBkYXBfb2JzW2RhcF9vbm9dLmRvX2l2 YXI7IHYrKykKICAgIHsKICAgICAgaWYgKG5maWVsZHMpCgl7CgkgIGZvciAoaSA9IDA7IGxpbmVb bCArIGldICYmIGkgPCBmaWVsZHdkW3ZdOyBpKyspCgkgICAgdmFsdWVbaV0gPSBsaW5lW2wgKyBp XTsKCSAgdmFsdWVbaV0gPSAnXDAnOwoJICBpZiAoaSA8IGZpZWxkd2Rbdl0pCgkgICAgewoJICAg ICAgZnByaW50ZihkYXBfbG9nLAoJCSAgICAgICIoc3RlcCAoJXM6JWQpKSBFUlJPUjogZ290ICVk IG9mICVkIGNoYXJhY3RlcnMgZm9yIGZpeGVkIGxlbmd0aCBmaWVsZCBmb3IgJXM6ICVzXG4iLAoJ CSAgICAgIGRhcF9pbltkYXBfb25vXS0+ZGZpbGVfbmFtZSwKCQkgICAgICBsaW5lbm9bZGFwX29u b10sIGksIGZpZWxkd2Rbdl0sCgkJICAgICAgZGFwX29ic1tkYXBfb25vXS5kb19uYW1bZGFwX29i c1tkYXBfb25vXS5kb19pblt2XV0sCgkJICAgICAgdmFsdWUpOwoJICAgICAgZnByaW50ZihkYXBf ZXJyLAoJCSAgICAgICIoc3RlcCAoJXM6JWQpKSBFUlJPUjogZ290ICVkIG9mICVkIGNoYXJhY3Rl cnMgZm9yIGZpeGVkIGxlbmd0aCBmaWVsZCBmb3IgJXM6ICVzXG4iLAoJCSAgICAgIGRhcF9pbltk YXBfb25vXS0+ZGZpbGVfbmFtZSwKCQkgICAgICBsaW5lbm9bZGFwX29ub10sIGksIGZpZWxkd2Rb dl0sCgkJICAgICAgZGFwX29ic1tkYXBfb25vXS5kb19uYW1bZGFwX29ic1tkYXBfb25vXS5kb19p blt2XV0sCgkJICAgICAgdmFsdWUpOwoJICAgICAgZXhpdCgxKTsKCSAgICB9Cgl9CiAgICAgIGVs c2UKCXsKCSAgZm9yIChpID0gMDsgbGluZVtsICsgaV0gJiYgbGluZVtsICsgaV0gIT0gZGFwX2Rl bGltOyBpKyspCgkgICAgdmFsdWVbaV0gPSBsaW5lW2wgKyBpXTsKCSAgdmFsdWVbaV0gPSAnXDAn OwoJfQogICAgICBpZiAoZGFwX29ic1tkYXBfb25vXS5kb19sZW5bZGFwX29ic1tkYXBfb25vXS5k b19pblt2XV0gPT0gSU5UKQoJewoJICBpZiAoaW50eXBlID09IERTRVQpCgkgICAgZGFwX29ic1tk YXBfb25vXS5kb19pbnRbZGFwX29ic1tkYXBfb25vXS5kb19pblt2XV0gPSBkYXBfZ2V0aW50KHZh bHVlKTsKCSAgZWxzZSBpZiAoc3NjYW5mKHZhbHVlLCAiICVkIiwKCQkJICBkYXBfb2JzW2RhcF9v bm9dLmRvX2ludCArIGRhcF9vYnNbZGFwX29ub10uZG9faW5bdl0pICE9IDEpCgkgICAgewoJICAg ICAgaWYgKGRhcF9ibGFuayh2YWx1ZSkpCgkJZGFwX29ic1tkYXBfb25vXS5kb19pbnRbZGFwX29i c1tkYXBfb25vXS5kb19pblt2XV0gPSAwOwoJICAgICAgZWxzZQoJCXsKCQkgIGZwcmludGYoZGFw X2VyciwKCQkJICAiKHN0ZXAgKCVzOiVkKSkgRVJST1I6IGludmFsaWQgaW50ZWdlciBkYXRhIGZv ciAlczogJXNcbiIsCgkJCSAgZGFwX2luW2RhcF9vbm9dLT5kZmlsZV9uYW1lLAoJCQkgIGxpbmVu b1tkYXBfb25vXSwKCQkJICBkYXBfb2JzW2RhcF9vbm9dLmRvX25hbVtkYXBfb2JzW2RhcF9vbm9d LmRvX2luW3ZdXSwKCQkJICB2YWx1ZSk7CgkJICBleGl0KDEpOwoJCX0KCSAgICB9CgkgIC8qIGlm IHdlJ3JlIGluIGFuIGluZmlsZSBzdGF0ZW1lbnQsIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGUgdmFs dWUKCSAgICogZnJvbSB0aGUgdmFsdWUgaW4gdGhlIHVzZXIncyBwcm9ncmFtCgkgICAqLwoJICBp ZiAoIWRhcF9vbm8gJiYgZGFwX29ic1tkYXBfb25vXS5kb19pbFtkYXBfb2JzWzBdLmRvX2luW3Zd XSkKCSAgICAqZGFwX29ic1tkYXBfb25vXS5kb19pbFtkYXBfb2JzWzBdLmRvX2luW3ZdXSA9Cgkg ICAgICBkYXBfb2JzWzBdLmRvX2ludFtkYXBfb2JzWzBdLmRvX2luW3ZdXTsKCX0KICAgICAgZWxz ZSBpZiAoZGFwX29ic1tkYXBfb25vXS5kb19sZW5bZGFwX29ic1tkYXBfb25vXS5kb19pblt2XV0g PT0gREJMKQoJewoJICBpZiAoaW50eXBlID09IERTRVQpCgkgICAgewoJICAgICAgZGFwX2dldGRv dWJsZSh2YWx1ZSk7CgkgICAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX2RibFtkYXBfb2JzW2RhcF9v bm9dLmRvX2luW3ZdXSA9IGRhcF9kb3VibGU7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAg aWYgKCFpIHx8IChuZmllbGRzICYmIGRhcF9ibGFuayh2YWx1ZSkpIHx8ICFzdHJjbXAodmFsdWUs ICIuIikpCgkJZGFwX29ic1tkYXBfb25vXS5kb19kYmxbZGFwX29ic1tkYXBfb25vXS5kb19pblt2 XV0gPSAwLjAgLyAwLjA7CgkgICAgICBlbHNlIGlmIChzc2NhbmYodmFsdWUsICIgJWxmIiwKCQkJ ICAgICAgZGFwX29ic1tkYXBfb25vXS5kb19kYmwgKyBkYXBfb2JzW2RhcF9vbm9dLmRvX2luW3Zd KSAhPSAxKQoJCXsKCQkgIGZwcmludGYoZGFwX2VyciwKCQkJICAiKHN0ZXAgKCVzOiVkKSkgRVJS T1I6IGludmFsaWQgZG91YmxlIGRhdGEgZm9yICVzOiAlc1xuIiwKCQkJICBkYXBfaW5bZGFwX29u b10tPmRmaWxlX25hbWUsCgkJCSAgbGluZW5vW2RhcF9vbm9dLAoJCQkgIGRhcF9vYnNbZGFwX29u b10uZG9fbmFtW2RhcF9vYnNbZGFwX29ub10uZG9faW5bdl1dLAoJCQkgIHZhbHVlKTsKCQkgIGV4 aXQoMSk7CgkJfQoJICAgIH0KCSAgLyogaWYgd2UncmUgaW4gYW4gaW5maWxlIHN0YXRlbWVudCwg bWF5IG5lZWQgdG8gdXBkYXRlIHRoZSB2YWx1ZQoJICAgKiBmcm9tIHRoZSB2YWx1ZSBpbiB0aGUg dXNlcidzIHByb2dyYW0KCSAgICovCgkgIGlmICghZGFwX29ubyAmJiBkYXBfb2JzW2RhcF9vbm9d LmRvX2RsW2RhcF9vYnNbMF0uZG9faW5bdl1dKQoJICAgICpkYXBfb2JzW2RhcF9vbm9dLmRvX2Rs W2RhcF9vYnNbMF0uZG9faW5bdl1dID0KCSAgICAgIGRhcF9vYnNbMF0uZG9fZGJsW2RhcF9vYnNb MF0uZG9faW5bdl1dOwoJfQogICAgICBlbHNlCgl7CgkgIGlmIChpIDw9IGRhcF9vYnNbZGFwX29u b10uZG9fbGVuW2RhcF9vYnNbZGFwX29ub10uZG9faW5bdl1dKQoJICAgIHN0cmNweShkYXBfb2Jz W2RhcF9vbm9dLmRvX3N0cltkYXBfb2JzW2RhcF9vbm9dLmRvX2luW3ZdXSwgdmFsdWUpOwoJICBl bHNlCgkgICAgewoJICAgICAgc3RybmNweShkYXBfb2JzW2RhcF9vbm9dLmRvX3N0cltkYXBfb2Jz W2RhcF9vbm9dLmRvX2luW3ZdXSwKCQkgICAgICB2YWx1ZSwgZGFwX29ic1tkYXBfb25vXS5kb19s ZW5bZGFwX29ic1tkYXBfb25vXS5kb19pblt2XV0pOwoJICAgICAgZGFwX29ic1tkYXBfb25vXS5k b19zdHJbZGFwX29ic1tkYXBfb25vXS5kb19pblt2XV0KCQlbZGFwX29ic1tkYXBfb25vXS5kb19s ZW5bZGFwX29ic1tkYXBfb25vXS5kb19pblt2XV1dID0gJ1wwJzsKCSAgICAgIGlmICh0b29sb25n IDwgZGFwX3Rvb2xvbmcpCgkJewoJCSAgZnByaW50ZihkYXBfbG9nLAoJCQkgICIoc3RlcCAoJXM6 JWQpKSBXQVJOSU5HOiBzdHJpbmcgZGF0YSB0b28gbG9uZyAoJWQpIGZvciAlcyAoJWQpOiAlc1xu IiwKCQkJICBkYXBfaW5bZGFwX29ub10tPmRmaWxlX25hbWUsCgkJCSAgbGluZW5vW2RhcF9vbm9d LCBpLAoJCQkgIGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW2RhcF9vYnNbZGFwX29ub10uZG9faW5b dl1dLAoJCQkgIGRhcF9vYnNbZGFwX29ub10uZG9fbGVuW2RhcF9vYnNbZGFwX29ub10uZG9faW5b dl1dLAoJCQkgIHZhbHVlKTsKCQkgIHRvb2xvbmcrKzsKCQl9CgkgICAgfQoJfQogICAgICBsICs9 IGk7CiAgICAgIGlmICghbmZpZWxkcyAmJiBsaW5lW2xdID09IGRhcF9kZWxpbSkKCWwrKzsKICAg IH0KICBkYXBfb2JzW2RhcF9vbm9dLmRvX3ZhbGlkID0gMTsKICBsaW5lbm9bZGFwX29ub10rKzsK ICByZXR1cm4gMTsKfQoKLyogY3JlYXRlIG5ldyB2YXJpYWJsZSBpbiBkYXRhb2JzCiAqIHZhcnNw ZWMgPSAibmFtZSBsZW5ndGgiIChtYXkgYmUgcmVwZWF0ZWQpLAogKgl3aGVyZSBsZW5ndGggPSAt MSBmb3IgZG91YmxlLCAwIGZvciBpbnQsIG90aGVyd2lzZSBsZW5ndGggb2Ygc3RyaW5nCiAqIGlu dmFyID0gaXMgdmFyaWFibGUgdG8gYmUgcmVhZCBmcm9tIGlucHV0IGRhdGFzZXQ/CiAqLwppbnQg ZGFwX3ZkKGNoYXIgKnZhcnNwZWMsIGludCBpbnZhcikKewogIGludCBzOwkJLyogYmFzZSBpbmRl eCB0byB2YXJzcGVjICovCiAgaW50IGk7CQkvKiBzdXBwbGVtZW50YWwgaW5kZXggdG8gdmFyc3Bl YyAqLwogIGNoYXIgKnZhcm5hbTsJLyogbmFtZSBvZiB2YXJpYWJsZSwgZXh0cmFjdGVkIGZyb20g dmFyc3BlYyAqLwogIGludCBzaWduOwkvKiBmb3IgZ2V0dGluZyBuZWdhdGl2ZSBudW1iZXIgKi8K ICBpbnQgdjsJCS8qIGluZGV4IG9mIHZhcmlhYmxlICovCiAgaW50IHZsZW47CS8qIGxlbmd0aCBw YXJhbWV0ZXIgZm9yIHZhcmlhYmxlICovCiAgaW50IHJlZGVjbGFyZTsJLyogaXMgdmFyaWFibGUg YmVpbmcgcmVkZWNsYXJlZD8gKi8KCiAgdiA9IC0xOwkJLyogbm9uLWV4aXN0ZW50IHVudGlsIHBy b3ZlbiBvdGhlcndpc2UgKi8KICB2YXJuYW0gPSBkYXBfbWFsbG9jKHN0cmxlbih2YXJzcGVjKSwg ImRhcF92ZDogdmFybmFtIik7CS8qIGFsbG9jYXRlIHN0cmluZyBmb3IgbmFtZXMgKi8KICBmb3Ig KHMgPSAwOyB2YXJzcGVjW3NdID09ICcgJzsgKQkvKiBza2lwIGxlYWRpbmcgc3BhY2VzICovCiAg ICBzKys7CiAgd2hpbGUgKHZhcnNwZWNbc10pCS8qIHdoaWxlIG1vcmUgc3BlY3MgdG8gcHJvY2Vz cyAqLwogICAgewogICAgICBpZiAoZGFwX29ic1tkYXBfb25vXS5kb19udmFyIDwgZGFwX21heHZh cikKCXsJCS8qIGlzIHRoZXJlIHJvb20gZm9yIGFub3RoZXIgdmFyaWFibGU/ICovCgkgIC8qKioq KiBzZWVtcyBhcyB0aG91Z2ggYSByZWRlY2xhcmUgc2hvdWxkbid0IGhhdmUgdG8gY2hlY2sgdGhp cywgbm90IHJlYWxseQoJICAgKioqKiogYSBwcm9ibGVtLCBidXQgY291bGQgd2FzdGUgc29tZSBz cGFjZQoJICAgKioqKiovCgkgIGZvciAoaSA9IDA7IHZhcnNwZWNbcyArIGldICYmIHZhcnNwZWNb cyArIGldICE9ICcgJzsgaSsrKQoJICAgIHZhcm5hbVtpXSA9IHZhcnNwZWNbcyArIGldOwoJICB2 YXJuYW1baV0gPSAnXDAnOwkvKiBuYW1lIGNvcGllZCwgaSA9IGxlbmd0aCAqLwoJICBpZiAoKHYg PSBkYXBfdmFybnVtKHZhcm5hbSkpIDwgMCkKCSAgICB7CS8qIGlmIGl0IGRvZXNuJ3QgYWxyZWFk eSBleGlzdCAqLwoJICAgICAgcmVkZWNsYXJlID0gMDsJLyogbm90IGJlaW5nIHJlZGVjbGFyZWQg Ki8KCSAgICAgIHYgPSBkYXBfb2JzW2RhcF9vbm9dLmRvX252YXI7CS8qIGl0cyBpbmRleCBpcyBj dXJyZW50IG52YXIgKi8KCSAgICAgIC8qIHZhcmlhYmxlIHdpdGggdGhhdCBpbmRleCBpcyBub3Qg YmVpbmcgdXNlZCwgYnV0IGVudHJ5IG1heQoJICAgICAgICogc3RpbGwgaGF2ZSBhIG5hbWUgZnJv bSBiZWZvcmUsIHNvIGNsZWFyIGl0CgkgICAgICAgKi8KCSAgICAgIGlmIChkYXBfb2JzW2RhcF9v bm9dLmRvX25hbVt2XSkKCQlkYXBfZnJlZShkYXBfb2JzW2RhcF9vbm9dLmRvX25hbVt2XSwKCQkJ ICJkYXBfdmQ6IGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW3ZdIik7CgkgICAgICAvKiBhbGxvY2F0 ZSBzcGFjZSBmb3IgbmV3IG5hbWUgKi8KCSAgICAgIGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW3Zd ID0KCQlkYXBfbWFsbG9jKGkgKyAxLAoJCQkgICAiZGFwX3ZkOiBkYXBfb2JzW2RhcF9vbm9dLmRv X25hbVt2XSIpOwoJICAgICAgLyogYW5kIGVudGVyIHRoZSBuYW1lICovCgkgICAgICBzdHJjcHko ZGFwX29ic1tkYXBfb25vXS5kb19uYW1bdl0sIHZhcm5hbSk7CgkgICAgICAvKiBpZiBpdCdzIGdv aW5nIHRvIGJlIHJlYWQgZnJvbSBmaWxlLCBpbmRpY2F0ZSBpbiB0aGUKCSAgICAgICAqIGRvX2lu IGFycmF5IGFuZCBjb3VudAoJICAgICAgICovCgkgICAgICBpZiAoaW52YXIpCgkJZGFwX29ic1tk YXBfb25vXS5kb19pbltkYXBfb2JzW2RhcF9vbm9dLmRvX2l2YXIrK10gPSB2OwoJICAgIH0KCSAg ZWxzZQoJICAgIHJlZGVjbGFyZSA9IDE7CS8qIHZhcmlhYmxlIGFscmVhZHkgZXhpc3RzICovCgkg IC8qIG5vdyBnZXQgdGhlIGxlbmd0aCBzcGVjaWZpY2F0aW9uOyBmaXJzdCBza2lwIHNwYWNlcywg aWYgYW55ICovCgkgIHdoaWxlICh2YXJzcGVjW3MgKyBpXSAmJiB2YXJzcGVjW3MgKyBpXSA9PSAn ICcpCgkgICAgaSsrOwoJICBpZiAoIXZhcnNwZWNbcyArIGldKQoJICAgIHsJLyogb29vcHMsIG5v dGhpbmcgdGhlcmUgKi8KCSAgICAgIGZwcmludGYoZGFwX2VyciwgIihkYXBfdmQpIG1pc3Npbmcg dmFyaWFibGUgbGVuZ3RoOiAlc1xuIiwKCQkgICAgICB2YXJzcGVjICsgcyk7CgkgICAgICBleGl0 KDEpOwoJICAgIH0KCSAgcyArPSBpOwoJICBpZiAodmFyc3BlY1tzXSA9PSAnLScpCgkgICAgewkv KiBuZWdhdGl2ZSB2YWx1ZSAqLwoJICAgICAgc2lnbiA9IC0xOwoJICAgICAgZm9yIChzKys7IHZh cnNwZWNbc10gPT0gJyAnOyBzKyspCgkJOwkvKiBza2lwIHNwYWNlcywgaWYgYW55ICovCgkgICAg fQoJICBlbHNlCgkgICAgc2lnbiA9IDE7CS8qIHBvc2l0aXZlIHZhbHVlICovCgkgIC8qIG5vdyBj b252ZXJ0IGNoYXJhY3RlciBzdHJpbmcgdG8gaW50ZWdlciAqLwoJICBmb3IgKGkgPSAwLCB2bGVu ID0gMDsgJzAnIDw9IHZhcnNwZWNbcyArIGldICYmIHZhcnNwZWNbcyArIGldIDw9ICc5JzsgaSsr KQoJICAgIHZsZW4gPSAxMCAqIHZsZW4gKyB2YXJzcGVjW3MgKyBpXSAtICcwJzsKCSAgdmxlbiAq PSBzaWduOwkvKiBhbmQgaW5jb3Jwb3JhdGUgc2lnbiAqLwoJICBpZiAocmVkZWNsYXJlKQoJICAg IHsJLyogY2hlY2sgdGhhdCByZWRlY2xhcmF0aW9uIGRvZXNuJ3QgY2hhbmdlIGxlbmd0aCAqLwoJ ICAgICAgaWYgKGRhcF9vYnNbZGFwX29ub10uZG9fbGVuW3ZdICE9IHZsZW4pCgkJewoJCSAgaWYg KHZsZW4gPiAwICYmIGRhcF9vYnNbZGFwX29ub10uZG9fbGVuW3ZdID4gMCkKCQkgICAgZnByaW50 ZihkYXBfZXJyLAoJCQkgICAgIihkYXBfdmQpIHJlc3BlY2lmaWNhdGlvbiBvZiBsZW5ndGggb2Yg JXMgZnJvbSAlZCB0byAlZFxuIiwKCQkJICAgIHZhcm5hbSwgZGFwX29ic1tkYXBfb25vXS5kb19s ZW5bdl0gKyAxLCB2bGVuICsgMSk7CgkJICBlbHNlCgkJICAgIGZwcmludGYoZGFwX2VyciwKCQkJ ICAgICIoZGFwX3ZkKSByZXNwZWNpZmljYXRpb24gb2YgdHlwZSBvZiAlc1xuIiwKCQkJICAgIHZh cm5hbSk7CgkJICBleGl0KDEpOwoJCX0KCSAgICB9CgkgIGVsc2UJLyogZm9yIG5ldyBkZWNsYXJh dGlvbiwgdXNlIHNwZWNpZmllZCBsZW5ndGggKi8KCSAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX2xl blt2XSA9IHZsZW47CgkgIGlmICh2YXJzcGVjW3MgKyBpXSAmJiB2YXJzcGVjW3MgKyBpXSAhPSAn ICcpCgkgICAgewkvKiBub3RoaW5nIHNob3VsZCBmb2xsb3cgbGVuZ3RoIGJ1dCBhIHNwYWNlICov CgkgICAgICBmcHJpbnRmKGRhcF9lcnIsCgkJICAgICAgIihkYXBfdmQpIGludmFsaWQgdmFyaWFi bGUgbGVuZ3RoIGZvciAlczogJXNcbiIsCgkJICAgICAgdmFybmFtLCB2YXJzcGVjICsgcyk7Cgkg ICAgICBleGl0KDEpOwoJICAgIH0KCSAgaWYgKCFyZWRlY2xhcmUgJiYgdmxlbiA+IDApCgkgICAg ewkvKiBib29ra2VlcGluZyBmb3Igc2V0dGluZyB1cCBuZXcgc3RyaW5nIHZhcmlhYmxlICovCgkg ICAgICAvKiBpZiBpdCdzIG5vdCBsaW5rZWQgdG8gInVzZXIiIHByb2dyYW0gbmFtZSBhbmQgdGhl cmUncwoJICAgICAgICogYSBsZWZ0LW92ZXIgc3RyaW5nIGZyb20gcHJldmlvdXMgdXNlLCBmcmVl IGl0CgkgICAgICAgKi8KCSAgICAgIGlmICghZGFwX29ic1tkYXBfb25vXS5kb19zbFt2XSAmJiBk YXBfb2JzW2RhcF9vbm9dLmRvX3N0clt2XSkKCQlkYXBfZnJlZShkYXBfb2JzW2RhcF9vbm9dLmRv X3N0clt2XSwKCQkJICJkYXBfdmQ6IGRhcF9vYnNbZGFwX29ub10uZG9fc3RyW3ZdIik7CgkgICAg ICAvKiBpZiBuZWVkIHRvIGZyZWUgc3RyaW5nIGZyb20gcHJldmlvdXMgbGluZSBkYXRhb2JzLCBk byBpdCAqLwoJICAgICAgaWYgKGRhcF9vbm8gPCAyICYmIGRhcF9wcmV2W2RhcF9vbm9dLmRvX3N0 clt2XSkKCQlkYXBfZnJlZShkYXBfcHJldltkYXBfb25vXS5kb19zdHJbdl0sCgkJCSAiZGFwX3Zk OiBkYXBfcHJldltkYXBfb25vXS5kb19zdHJbdl0iKTsKCSAgICAgIC8qIGFsbG9jYXRlIHNwYWNl IGZvciBuZXcgc3RyaW5nIHZhcmlhYmxlICovCgkgICAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX3N0 clt2XSA9CgkJZGFwX21hbGxvYyh2bGVuICsgMSwKCQkJICAgImRhcF92ZDogZGFwX29ic1tkYXBf b25vXS5kb19zdHJbdl0iKTsKCSAgICAgIC8qIGluZGljYXRlIG5vdCBsaW5rZWQgdG8gInVzZXIi IHByb2dyYW0gdmFyaWFibGUgKi8KCSAgICAgIGRhcF9vYnNbZGFwX29ub10uZG9fc2xbdl0gPSAw OwoJICAgICAgLyogYWxsb2NhdGUgc3BhY2UgaW4gcHJldmlvdXMgbGluZSBkYXRhb2JzICovCgkg ICAgICBpZiAoZGFwX29ubyA8IDIpCgkJZGFwX3ByZXZbZGFwX29ub10uZG9fc3RyW3ZdID0KCQkg IGRhcF9tYWxsb2ModmxlbiArIDEsCgkJCSAgICAgImRhcF92ZDogZGFwX3ByZXZbZGFwX29ub10u ZG9fc3RyW3ZdIik7CgkgICAgfQoJICBpZiAodmxlbiA9PSBEQkwpCS8qIGluaXRpYWxpemUgZG91 YmxlcyB0byBOYU4gKi8KCSAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX2RibFt2XSA9IDAuMCAvIDAu MDsKCSAgZWxzZSBpZiAodmxlbiA9PSBJTlQpCS8qIGluaXRpYWxpemUgaW50cyB0byAwICovCgkg ICAgZGFwX29ic1tkYXBfb25vXS5kb19pbnRbdl0gPSAwOwoJICBlbHNlCQkJLyogaW5pdGlhbGl6 ZSBzdHJpbmdzIHRvIG51bGwgKi8KCSAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX3N0clt2XVswXSA9 ICdcMCc7CgkgIHMgKz0gaTsJCS8qIGFkdmFuY2UgdG8gbmV4dCBzcGVjLCBpZiBhbnkgKi8KCSAg d2hpbGUgKHZhcnNwZWNbc10gPT0gJyAnKQkvKiBhbmQgc2tpcCBzcGFjZXMgKi8KCSAgICBzKys7 Cgl9CiAgICAgIGVsc2UJCS8qIG5vIHJvb20gZm9yIGFub3RoZXIgdmFyaWFibGUgKi8KCXsKCSAg ZnByaW50ZihkYXBfZXJyLCAiKGRhcF92ZCkgdG9vIG1hbnkgdmFyaWFibGVzOiAlc1xuIiwgdmFy c3BlYyArIHMpOwoJICBleGl0KDEpOwoJfQogICAgICBpZiAoIXJlZGVjbGFyZSkJCS8qIGlmIG5v dCBqdXN0IHJlZGVjbGFyYXRpb24gb2Ygb25lIGFscmVhZHkgdGhlcmUgKi8KCWRhcF9vYnNbZGFw X29ub10uZG9fbnZhcisrOwkvKiB1cGRhdGUgbnVtYmVyIG9mIHZhcmlhYmxlcyAqLwogICAgfQog IGRhcF9mcmVlKHZhcm5hbSwgImRhcF92ZDogdmFybmFtIik7CS8qIGZyZWUgbWVtb3J5IGFsbG9j YXRpb24gKi8KICByZXR1cm4gdjsJCS8qIGFuZCByZXR1cm4gaW5kZXggb2YgbGFzdCAob3Igb25s eSkgdmFyaWFibGUgKi8KfQoKLyogbGluayBhIGRvdWJsZSBmcm9tIGEgZGF0YW9icyB0byAidXNl ciIgdmFyaWFibGUgKi8Kdm9pZCBkYXBfZGwoY2hhciB2YXJuYW1lW10sIGRvdWJsZSAqZGJsKQp7 CiAgaW50IHY7CiAgaW50IGRpbTsKICBpbnQgZDsKCiAgaWYgKCh2ID0gZGFwX3Zhcm51bSh2YXJu YW1lKSkgPj0gMCkKICAgIHsKICAgICAgZGFwX29ic1tkYXBfb25vXS5kb19kbFt2XSA9IGRibDsK ICAgICAgKmRibCA9IDAuMCAvIDAuMDsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGlmICgodiA9 IGRhcF9hcnJudW0odmFybmFtZSwgJmRpbSkpID4gMCkKCXsKCSAgZm9yIChkID0gMDsgZCA8IGRp bTsgZCsrKQoJICAgIHsKCSAgICAgIGRhcF9vYnNbZGFwX29ub10uZG9fZGxbdiArIGRdID0gZGJs ICsgZDsKCSAgICAgIGRibFtkXSA9IDAuMCAvIDAuMDsKCSAgICB9Cgl9CiAgICAgIGVsc2UKCXsK CSAgZnByaW50ZihkYXBfZXJyLCAiKGRhcF9kbCkgdW5rbm93biB2YXJpYWJsZSAlc1xuIiwgdmFy bmFtZSk7CgkgIGV4aXQoMSk7Cgl9CiAgICB9Cn0KCi8qIGxpbmsgYW4gaW50IGZyb20gYSBkYXRh b2JzIHRvICJ1c2VyIiB2YXJpYWJsZSAqLwp2b2lkIGRhcF9pbChjaGFyIHZhcm5hbWVbXSwgaW50 ICppKQp7CiAgaW50IHY7CiAgaW50IGRpbTsKICBpbnQgZDsKCiAgaWYgKCh2ID0gZGFwX3Zhcm51 bSh2YXJuYW1lKSkgPiAwKQogICAgewogICAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX2lsW3ZdID0g aTsKICAgICAgKmkgPSAwOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgaWYgKCh2ID0gZGFwX2Fy cm51bSh2YXJuYW1lLCAmZGltKSkgPiAwKQoJewoJICBmb3IgKGQgPSAwOyBkIDwgZGltOyBkKysp CgkgICAgewoJICAgICAgZGFwX29ic1tkYXBfb25vXS5kb19pbFt2ICsgZF0gPSBpICsgZDsKCSAg ICAgIGlbZF0gPSAwOwoJICAgIH0KCX0KICAgICAgZWxzZQoJewoJICBmcHJpbnRmKGRhcF9lcnIs ICIoZGFwX2lsKSB1bmtub3duIHZhcmlhYmxlICVzXG4iLCB2YXJuYW1lKTsKCSAgZXhpdCgxKTsK CX0KICAgIH0KfQoKLyogbGluayBhIHN0cmluZyBmcm9tIGEgZGF0YW9icyB0byAidXNlciIgdmFy aWFibGUgKi8Kdm9pZCBkYXBfc2woY2hhciB2YXJuYW1lW10sIGNoYXIgKnMpCnsKICBpbnQgdjsK CiAgaWYgKCh2ID0gZGFwX3Zhcm51bSh2YXJuYW1lKSkgPj0gMCkKICAgIHsKICAgICAgZGFwX2Zy ZWUoZGFwX29ic1tkYXBfb25vXS5kb19zdHJbdl0sICJkYXBfc2w6IGRhcF9vYnNbZGFwX29ub10u ZG9fc3RyW3ZdIik7CiAgICAgIGRhcF9vYnNbZGFwX29ub10uZG9fc3RyW3ZdID0gczsKICAgICAg ZGFwX29ic1tkYXBfb25vXS5kb19zbFt2XSA9IDE7CiAgICAgIHNbMF0gPSAnXDAnOwogICAgfQog IGVsc2UKICAgIHsKICAgICAgZnByaW50ZihkYXBfZXJyLCAiKGRhcF9zbCkgdW5rbm93biB2YXJp YWJsZSAlc1xuIiwgdmFybmFtZSk7CiAgICAgIGV4aXQoMSk7CiAgICB9Cn0KCnZvaWQgZGFwX25h bWUoY2hhciBkbmFtZVtdLCBjaGFyICpmbmFtZSkKewogIHN0cnVjdCBzdGF0IHN0YXRidWY7Cgog IGlmICghZm5hbWUgfHwgIWZuYW1lWzBdKQogICAgewogICAgICBzdHJjcHkoZG5hbWUsICIvZGV2 L251bGwiKTsKICAgICAgcmV0dXJuOwogICAgfQogIHN0cmNweShkbmFtZSwgZGFwX3NldGRpcik7 CiAgaWYgKHN0YXQoZG5hbWUsICZzdGF0YnVmKSA8IDApCiAgICB7CiAgICAgIGlmIChta2Rpcihk bmFtZSwgKG1vZGVfdCkgMDcwMCkgPCAwKQoJewoJICBwZXJyb3IoZGFwX2RhcG5hbWUpOwoJICBl eGl0KDEpOwoJfQogICAgfQogIGVsc2UgaWYgKCEoc3RhdGJ1Zi5zdF9tb2RlICYgU19JRkRJUikp CiAgICB7CiAgICAgIGZwcmludGYoZGFwX2VyciwgIiVzOiBub24tZGlyZWN0b3J5IGZpbGUgZXhp c3RzOiAlc1xuIiwgZGFwX2RhcG5hbWUsIGRuYW1lKTsKICAgICAgZXhpdCgxKTsKICAgIH0KICBz dHJjYXQoZG5hbWUsICIvIik7CiAgc3RyY2F0KGRuYW1lLCBmbmFtZSk7Cn0KCnN0YXRpYyBpbnQg ZGJsY21wKGRvdWJsZSAqZDEsIGRvdWJsZSAqZDIpCnsKICBpZiAoKmQxIDwgKmQyKQogICAgcmV0 dXJuIC0xOwogIGVsc2UgaWYgKCpkMSA+ICpkMikKICAgIHJldHVybiAxOwogIHJldHVybiAwOwp9 CgpzdGF0aWMgaW50IGludGNtcChpbnQgKmkxLCBpbnQgKmkyKQp7CiAgaWYgKCppMSA8ICppMikK ICAgIHJldHVybiAtMTsKICBlbHNlIGlmICgqaTEgPiAqaTIpCiAgICByZXR1cm4gMTsKICByZXR1 cm4gMDsKfQoKc3RhdGljIGludCBzdGNtcChjaGFyICoqczEsIGNoYXIgKipzMikKewogIHJldHVy biBzdHJjbXAoKnMxLCAqczIpOwp9CgpzdGF0aWMgaW50IGZpbmRsZXYoaW50IGNsYXNzLCBkb3Vi bGUgZGxldmVsW10sIGludCBpbGV2ZWxbXSwgY2hhciAqc2xldmVsW10sIGludCBubGV2ZWxzKQp7 CiAgaW50IHY7CgogIGlmIChkYXBfb2JzW2RhcF9vbm9dLmRvX2xlbltjbGFzc10gPT0gREJMKQog ICAgewogICAgICBmb3IgKHYgPSAwOyB2IDwgbmxldmVsczsgdisrKQoJewkvKiBzZWFyY2ggZm9y IGxldmVsICovCgkgIGlmIChkYXBfb2JzW2RhcF9vbm9dLmRvX2RibFtjbGFzc10gPT0KCSAgICAg IGRsZXZlbFt2XSkKCSAgICBicmVhazsKCX0KICAgIH0KICBlbHNlIGlmIChkYXBfb2JzW2RhcF9v bm9dLmRvX2xlbltjbGFzc10gPT0gSU5UKQogICAgewogICAgICBmb3IgKHYgPSAwOyB2IDwgbmxl dmVsczsgdisrKQoJewkvKiBzZWFyY2ggZm9yIGxldmVsICovCgkgIGlmIChkYXBfb2JzW2RhcF9v bm9dLmRvX2ludFtjbGFzc10gPT0KCSAgICAgIGlsZXZlbFt2XSkKCSAgICBicmVhazsKCX0KICAg IH0KICBlbHNlCiAgICB7CiAgICAgIGZvciAodiA9IDA7IHYgPCBubGV2ZWxzOyB2KyspCgl7CS8q IHNlYXJjaCBmb3IgbGV2ZWwgKi8KCSAgaWYgKCFzdHJjbXAoZGFwX29ic1tkYXBfb25vXS5kb19z dHJbY2xhc3NdLAoJCSAgICAgIHNsZXZlbFt2XSkpCgkgICAgYnJlYWs7Cgl9CiAgICB9CiAgaWYg KHYgPCBubGV2ZWxzKQogICAgcmV0dXJuIHY7CiAgcmV0dXJuIC0xOwp9CgppbnQgaW5jbGV2KGlu dCBsZXZbXSwgaW50IG5sZXZlbHNbXSwgaW50IG5jbGFzcykKewogIGludCBjOwoKICBmb3IgKGMg PSBuY2xhc3MgLSAxOyBjID49IDA7IC0tYykKICAgIHsKICAgICAgaWYgKGxldltjXSA8IG5sZXZl bHNbY10gLSAxKQkvKiBub3QgbWF4ZWQgb3V0ICovCglicmVhazsKICAgIH0KICBpZiAoYyA8IDAp CS8qIGFsbCBtYXhlZCBvdXQgKi8KICAgIHJldHVybiAwOwogIGxldltjXSsrOwogIHdoaWxlICgr K2MgPCBuY2xhc3MpCiAgICBsZXZbY10gPSAwOwogIHJldHVybiAxOwp9CgovKiBUaGlzIGdyYWIt YmFnIGZ1bmN0aW9uIGlzIHdheSB0b28gYmlnLCBzaG91bGQgYmUgYnJva2VuIHVwCiAqIGludG8g ZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBlYWNoIGFjdGlvbgogKi8Kdm9pZCBkYXRhc2V0KGNoYXIg b2xkbmFtZVtdLCBjaGFyIG5ld25hbWVbXSwgY2hhciBhY3Rpb25bXSkKewogIHN0YXRpYyBpbnQg ZGF0c2V0aW5pdCA9IDA7CS8qIG5lZWQgdG8gaW5pdGlhbGl6ZSAnYmFzZW9icycgb24gZmlyc3Qg Y2FsbCAqLwogIGNoYXIgKmRvbGQsICpkbmV3OwkJLyogb2xkbmFtZSwgbmV3bmFtZSB3aXRoIGRp cmVjdG9yeSBwcmVwZW5kZWQgKi8KICBpbnQgZm9sZCwgZm5ldzsJCQkvKiBmaWxlIG51bWJlcnMg Zm9yIG1lbW9yeSBmaWxlcyAqLwogIERGSUxFICpkb2xkZiwgKmRuZXdmOwogIGludCBjOwkJCQkv KiBpbmRleCBmb3IgdmFyaW91cyBwdXJwb3NlcyAob3VjaCEpICovCiAgaW50IHY7CQkJCS8qIGlu ZGV4IGZvciB2YXJpb3VzIHB1cnBvc2VzIChvdWNoISkgKi8KICBpbnQgb251bTsKICBpbnQgbWF4 bmFtbGVuOwkJCS8qIG1heCBsZW5ndGggb2YgdmFyaWFibGUgbmFtZSBpbiBkYXRhc2V0ICovCiAg c3RhdGljIGRhdGFvYnMgYmFzZW9iczsJCS8qIGRhdGFvYnMgZm9yIGFwcGVuZCAqLwogIGNoYXIg KnZhcnNwZWM7CiAgY2hhciAqb2xkdm1lbTsKICBjaGFyICpuZXd2bWVtOwogIGNoYXIgKipvbGR2 YXI7CiAgY2hhciAqKm5ld3ZhcjsKICBpbnQgbnZhcjsJCS8qIG51bWJlciBvZiB2YXJpYWJsZXMg aW4gYWN0aW9uIGZvciBDT1BZICovCiAgaW50IG5jZWxsLCBuY2xhc3M7CS8qIG51bWJlciBvZiBj ZWxsLCBjbGFzcyB2YXJpYWJsZXMgZm9yIEZJTEwgKi8KICBjaGFyICpjZWxsbGlzdDsJCS8qIGxp c3Qgb2YgY2VsbCwgY2xhc3MgdmFyaWFibGVzIGZvciBGSUxMICovCiAgaW50ICpjZWxsdiwgKmNs YXNzdjsJLyogaW5kaWNlcyBvZiB2YXJpYWJsZXMgZm9yIEZJTEwgKi8KICBjaGFyICoqc2xldmVs bWVtOwkvKiBmb3Igc3RvcmluZyBwdHJzIHRvIG5hbWVzIG9mIHRoZSBsZXZlbHMgb2YgdGhlIHN0 cmluZyBjbGFzcyB2YXJzICovCiAgY2hhciAqKipzbGV2ZWw7CQkvKiBwb2ludGVycyB0byB0aGUg bGV2ZWwgbmFtZXMgKi8KICBkb3VibGUgKmRsZXZlbG1lbTsJLyogZm9yIHN0b3JpbmcgdmFsdWVz IG9mIHRoZSBsZXZlbHMgb2YgdGhlIGRvdWJsZSBjbGFzcyB2YXJzICovCiAgZG91YmxlICoqZGxl dmVsOwkvKiBwb2ludGVycyB0byB0aGUgZG91YmxlIGxldmVsIHZhbHVlcyAqLwogIGludCAqaWxl dmVsbWVtOwkJLyogZm9yIHN0b3JpbmcgdmFsdWVzIG9mIHRoZSBsZXZlbHMgb2YgdGhlIGludCBj bGFzcyB2YXJzICovCiAgaW50ICoqaWxldmVsOwkJLyogcG9pbnRlcnMgdG8gdGhlIGludCBsZXZl bCB2YWx1ZXMgKi8KICBpbnQgKmlubGV2OwkJLyogY3VycmVudCBsZXZlbCByZWFkIGluIGZvciBl YWNoIGNsYXNzIHZhciAqLwogIGludCAqb3V0bGV2OwkJLyogY3VycmVudCBsZXZlbCB3cml0dGVu IG91dCBmb3IgZWFjaCBjbGFzcyB2YXIgKi8KICBpbnQgKm5sZXZlbHM7CQkvKiBudW1iZXIgb2Yg bGV2ZWxzIGZvciBlYWNoIGNsYXNzIHZhciAqLwogIGludCAoKmRjbXApKCkgPSAmZGJsY21wOwkv KiB0byB0cmljayB0aGUgY29tcGlsZXI/ICovCiAgaW50ICgqaWNtcCkoKSA9ICZpbnRjbXA7CS8q IHRvIHRyaWNrIHRoZSBjb21waWxlcj8gKi8KICBpbnQgKCpzY21wKSgpID0gJnN0Y21wOwkJLyog dG8gdHJpY2sgdGhlIGNvbXBpbGVyPyAqLwogIGludCB2biwgbnY7CiAgaW50IGRpbSwgbmRpbTsK ICBjaGFyICpvdXRsaXN0OwogIHN0YXRpYyBjaGFyIGRpbXN0cls3XTsJLyogZGVwZW5kcyBvbiBk YXBfbWF4dmFyIDw9IDEwLDAwMCAqLwogIGludCAqY2xlYXJ2YXI7CQkvKiBpbmRpY2VzIG9mIHZh cmlhYmxlcyB0byBjbGVhciBpbiBBUFBFTkQgKi8KICBpbnQgbmNsZWFyOwkJLyogbnVtYmVyIG9m IHZhcmlhYmxlcyB0byBjbGVhciAqLwoKICBpZiAoIWRhdHNldGluaXQpCS8qIG5lZWQgdG8gYWxs b2NhdGUgYW5kIGluaXRpYXRlIGJhc2VvYnM/ICovCiAgICB7CiAgICAgIGRhdHNldGluaXQgPSAx OwogICAgICBpbml0ZG8oJmJhc2VvYnMpOwogICAgfQogIGlmIChkYXBfaW5bMF0pCQkvKiBpZiBp bnB1dCBmaWxlIGxlZnQgaGFuZ2luZy4uLiAqLwogICAgewkJLyogLi4uIGZpbmlzaCBpdCB1cCAq LwogICAgICBkZmNsb3NlKGRhcF9pblswXSk7CiAgICAgIGRhcF9pblswXSA9IChERklMRSAqKSBO VUxMOwogICAgfQogIGlmIChkYXBfb3V0WzBdKQkJLyogaWYgb3V0cHV0IGZpbGUgbGVmdCBoYW5n aW5nLi4uICovCiAgICB7CQkvKiAuLi4gZmluaXNoIGl0IHVwICovCiAgICAgIGRmY2xvc2UoZGFw X291dFswXSk7CiAgICAgIGRhcF9vdXRbMF0gPSAoREZJTEUgKikgTlVMTDsKICAgIH0KICBjZWxs bGlzdCA9IChjaGFyICopIE5VTEw7CS8qIHRvIHByZXZlbnQgZnJlZWluZyBpZiBub3QgYXNzaWdu ZWQgKi8KICBzbGV2ZWxtZW0gPSAoY2hhciAqKikgTlVMTDsJLyogdG8gcHJldmVudCBmcmVlaW5n IGlmIG5vdCBhc3NpZ25lZCAqLwogIGNlbGx2ID0gKGludCAqKSBOVUxMOwkJLyogdG8gcHJldmVu dCBmcmVlaW5nIGlmIG5vdCBhc3NpZ25lZCAqLwogIGNsYXNzdiA9IChpbnQgKikgTlVMTDsJCS8q IHRvIHByZXZlbnQgZnJlZWluZyBpZiBub3QgYXNzaWduZWQgKi8KICBvdXRsaXN0ID0gZGFwX21h bGxvYyhkYXBfbGlzdGxlbiwgImRhdGFzZXQ6IG91dGxpc3QiKTsKICBvbGR2bWVtID0gZGFwX21h bGxvYyhkYXBfbWF4dmFyICogKGRhcF9uYW1lbGVuICsgMSksICJkYXRhc2V0OiBvbGR2bWVtIik7 CiAgb2xkdmFyID0gKGNoYXIgKiopIGRhcF9tYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBkYXBfbWF4 dmFyLCAiZGF0YXNldDogb2xkdmFyIik7CiAgZm9yICh2ID0gMDsgdiA8IGRhcF9tYXh2YXI7IHYr KykKICAgIG9sZHZhclt2XSA9IG9sZHZtZW0gKyB2ICogKGRhcF9uYW1lbGVuICsgMSk7CiAgbmV3 dm1lbSA9IGRhcF9tYWxsb2MoZGFwX21heHZhciAqIChkYXBfbmFtZWxlbiArIDEpLCAiZGF0YXNl dDogbmV3dm1lbSIpOwogIG5ld3ZhciA9IChjaGFyICoqKSBkYXBfbWFsbG9jKHNpemVvZihjaGFy ICopICogZGFwX21heHZhciwgImRhdGFzZXQ6IG5ld3ZhciIpOwogIGZvciAodiA9IDA7IHYgPCBk YXBfbWF4dmFyOyB2KyspCiAgICBuZXd2YXJbdl0gPSBuZXd2bWVtICsgdiAqIChkYXBfbmFtZWxl biArIDEpOwogIGRvbGQgPSBkYXBfbWFsbG9jKHN0cmxlbihvbGRuYW1lKSArIHN0cmxlbihkYXBf c2V0ZGlyKSArIDIsICJkYXRhc2V0OiBkb2xkIik7CiAgZG5ldyA9IGRhcF9tYWxsb2Moc3RybGVu KG5ld25hbWUpICsgc3RybGVuKGRhcF9zZXRkaXIpICsgMiwgImRhdGFzZXQ6IGRuZXciKTsKICBk YXBfbmFtZShkb2xkLCBvbGRuYW1lKTsJLyogc2V0IHVwIGRhdGFzZXQgbmFtZXMgKi8KICBkYXBf bmFtZShkbmV3LCBuZXduYW1lKTsKICBjbGVhcnZhciA9IE5VTEw7CiAgaWYgKCFzdHJjbXAoYWN0 aW9uLCAiUkVOQU1FIikpCiAgICB7CiAgICAgIGlmIChvbGRuYW1lWzBdID09ICc8JykKCXsKCSAg aWYgKG5ld25hbWVbMF0gPT0gJzwnKQoJICAgIHsKCSAgICAgIGZvciAoZm9sZCA9IDA7IGZvbGQg PCBkYXBfbnJmaWxlczsgZm9sZCsrKQoJCXsKCQkgIGlmICghc3RyY21wKGRmaWxlW05ERklMRVMg KyBmb2xkXS5kZmlsZV9uYW1lLCBvbGRuYW1lICsgMSkpCgkJICAgIGJyZWFrOwoJCX0KCSAgICAg IGlmIChmb2xkIDwgZGFwX25yZmlsZXMpCgkJewoJCSAgZm9yIChmbmV3ID0gMDsgZm5ldyA8IGRh cF9ucmZpbGVzOyBmbmV3KyspCgkJICAgIHsKCQkgICAgICBpZiAoIXN0cmNtcChkZmlsZVtOREZJ TEVTICsgZm5ld10uZGZpbGVfbmFtZSwKCQkJCSAgbmV3bmFtZSArIDEpKQoJCQlicmVhazsKCQkg ICAgfQoJCSAgaWYgKGZuZXcgPCBkYXBfbnJmaWxlcykKCQkgICAgZGZpbGVbTkRGSUxFUyArIGZu ZXddLmRmaWxlX25hbWVbMF0gPSAnXDAnOwoJCSAgc3RyY3B5KGRmaWxlW05ERklMRVMgKyBmb2xk XS5kZmlsZV9uYW1lLCBuZXduYW1lICsgMSk7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgIGZwcmlu dGYoZGFwX2VyciwKCQkJICAiKGRhdGFzZXQpIGNhbid0IGZpbmQgcmFtZmlsZSAlc1xuIiwgb2xk bmFtZSk7CgkJICBleGl0KDEpOwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBmcHJp bnRmKGRhcF9lcnIsCgkJICAgICAgIihkYXRhc2V0KSBjYW4ndCByZW5hbWUgcmFtZmlsZSAlcyB0 byBkaXNrIGZpbGUgJXNcbiIsCgkJICAgICAgb2xkbmFtZSwgbmV3bmFtZSk7CgkgICAgICBleGl0 KDEpOwoJICAgIH0KCX0KICAgICAgZWxzZSBpZiAobmV3bmFtZVswXSA9PSAnPCcpCgl7CgkgIGZw cmludGYoZGFwX2VyciwgIihkYXRhc2V0KSBjYW4ndCByZW5hbWUgZGlzayBmaWxlICVzIHRvIHJh bWZpbGUgJXNcbiIsCgkJICBvbGRuYW1lLCBuZXduYW1lKTsKCSAgZXhpdCgxKTsKCX0KICAgICAg ZWxzZQoJcmVuYW1lKGRvbGQsIGRuZXcpOwogICAgfQogIGVsc2UgaWYgKCFzdHJuY21wKGFjdGlv biwgIkNPUFkiLCA0KSkKICAgIHsKICAgICAgZm9yICh2ID0gNDsgYWN0aW9uW3ZdID09ICcgJzsg disrKQkvKiBnZXQgcGFzdCBDT1BZICovCgk7CiAgICAgIGZvciAobnZhciA9IDA7IGFjdGlvblt2 XTsgbnZhcisrKQoJewoJICBmb3IgKGMgPSAwOyBhY3Rpb25bdl0gJiYgYWN0aW9uW3ZdICE9ICcg JyAmJiBhY3Rpb25bdl0gIT0gJz4nOyApCgkgICAgewoJICAgICAgaWYgKGMgPCBkYXBfbmFtZWxl bikKCQlvbGR2YXJbbnZhcl1bYysrXSA9IGFjdGlvblt2KytdOwoJICAgICAgZWxzZQoJCXsKCQkg IGZwcmludGYoZGFwX2VyciwgIihkYXRhc2V0KSB2YXJpYWJsZSBuYW1lIHRvbyBsb25nOiAlc1xu IiwKCQkJICBhY3Rpb24pOwoJCSAgZXhpdCgxKTsKCQl9CgkgICAgfQoJICBvbGR2YXJbbnZhcl1b Y10gPSAnXDAnOwkJLyogbm93IG9sZHZhcltudmFyXSBpcyBuYW1lZCB2YXJpYWJsZSAqLwoJICB3 aGlsZSAoYWN0aW9uW3ZdID09ICcgJykKCSAgICB2Kys7CgkgIGlmIChhY3Rpb25bdl0gPT0gJz4n KQkJLyogaWYgY2hhbmdpbmcgbmFtZSAqLwoJICAgIHsKCSAgICAgIGZvciAodisrOyBhY3Rpb25b dl0gPT0gJyAnOyB2KyspCgkJOwoJICAgICAgZm9yIChjID0gMDsgYWN0aW9uW3ZdICYmIGFjdGlv blt2XSAhPSAnICc7ICkKCQl7CgkJICBpZiAoYyA8IGRhcF9uYW1lbGVuKQoJCSAgICBuZXd2YXJb bnZhcl1bYysrXSA9IGFjdGlvblt2KytdOwoJCSAgZWxzZQoJCSAgICB7CgkJICAgICAgZnByaW50 ZihkYXBfZXJyLAoJCQkgICAgICAiKGRhdGFzZXQpIG5ldyB2YXJpYWJsZSBuYW1lIHRvbyBsb25n OiAlc1xuIiwKCQkJICAgICAgYWN0aW9uKTsKCQkgICAgICBleGl0KDEpOwoJCSAgICB9CgkJfQoJ ICAgICAgbmV3dmFyW252YXJdW2NdID0gJ1wwJzsJLyogbm93IG5ld3ZhcltudmFyXSBpcyBuZXcg bmFtZSAqLwoJICAgICAgd2hpbGUgKGFjdGlvblt2XSA9PSAnICcpCgkJdisrOwoJICAgIH0KCSAg ZWxzZQoJICAgIHN0cmNweShuZXd2YXJbbnZhcl0sIG9sZHZhcltudmFyXSk7Cgl9CiAgICAgIGlm IChudmFyKQkJLyogaWYgdGhlcmUgYXJlIHZhcmlhYmxlcyB0byBjb3B5ICovCgl7CgkgIGluc2V0 KG9sZG5hbWUpOwoJICBmb3IgKHYgPSAwLCBvdXRsaXN0WzBdID0gJ1wwJzsgdiA8IG52YXI7IHYr KykKCSAgICB7CgkgICAgICBpZiAodikKCQlzdHJjYXQob3V0bGlzdCwgIiAiKTsKCSAgICAgIHN0 cmNhdChvdXRsaXN0LCBuZXd2YXJbdl0pOwkvKiBvdXRwdXQgbGlzdCBoYXMgbmV3dmFycyAqLwoJ ICAgICAgaWYgKHN0cmNtcChvbGR2YXJbdl0sIG5ld3Zhclt2XSkpCS8qIGlmIGNoYW5naW5nIG5h bWUgKi8KCQl7CgkJICBpZiAoKHZuID0gZGFwX3Zhcm51bShvbGR2YXJbdl0pKSA+PSAwKQoJCSAg ICB7CgkJCQkvKiBpZiBuZXd2YXIgZXhpc3RzIGluIG9sZG5hbWUsIHphcCBpdHMgZmlyc3QgY2hh ciB0byAnMCcgKi8KCQkgICAgICBpZiAoKG52ID0gZGFwX3Zhcm51bShuZXd2YXJbdl0pKSA+PSAw KQoJCQlkYXBfb2JzWzBdLmRvX25hbVtudl1bMF0gPSAnMCc7CgkJCQkvKiBhbmQgY2hhbmdlIHRo ZSBuYW1lIG9mIG9sZHZhciB0byBuZXd2YXIgKi8KCQkgICAgICBkYXBfZnJlZShkYXBfb2JzWzBd LmRvX25hbVt2bl0sCgkJCSAgICAgICAiZGF0YXNldDogZGFwX29ic1swXS5kb19uYW1bdm5dIik7 CgkJICAgICAgZGFwX29ic1swXS5kb19uYW1bdm5dID0KCQkJZGFwX21hbGxvYyhzdHJsZW4obmV3 dmFyW3ZdKSArIDEsCgkJCQkgICAiZGF0YXNldDogZGFwX29ic1swXS5kb19uYW1bdm5dIik7CgkJ ICAgICAgc3RyY3B5KGRhcF9vYnNbMF0uZG9fbmFtW3ZuXSwgbmV3dmFyW3ZdKTsKCQkgICAgfQoJ CSAgZWxzZSBpZiAoKHZuID0gZGFwX2Fycm51bShvbGR2YXJbdl0sICZkaW0pKSA+PSAwKQoJCSAg ICB7CgkJCQkvKiBkbyB0aGUgc2FtZSBmb3IgYXJyYXlzICovCgkJICAgICAgaWYgKChudiA9IGRh cF9hcnJudW0obmV3dmFyW3ZdLCAmbmRpbSkpID49IDApCgkJCXsKCQkJICBmb3IgKGMgPSAwOyBj IDwgbmRpbTsgYysrKQoJCQkgICAgewoJCQkgICAgICBkYXBfb2JzWzBdLmRvX25hbVtudiArIGNd WzBdID0gJzAnOwoJCQkgICAgICBzcHJpbnRmKGRpbXN0ciwgIlslZF0iLCBjKTsKCQkJICAgICAg c3RyY2F0KGRhcF9vYnNbMF0uZG9fbmFtW3ZuICsgY10sIGRpbXN0cik7CgkJCSAgICB9CgkJCX0K CQkgICAgICBmb3IgKGMgPSAwOyBjIDwgZGltOyBjKyspCgkJCXsKCQkJICBzcHJpbnRmKGRpbXN0 ciwgIlslZF0iLCBjKTsKCQkJICBkYXBfZnJlZShkYXBfb2JzWzBdLmRvX25hbVt2biArIGNdLAoJ CQkJICAgImRhdGFzZXQ6IGRhcF9vYnNbMF0uZG9fbmFtW3ZuICsgY10iKTsKCQkJICBkYXBfb2Jz WzBdLmRvX25hbVt2biArIGNdID0KCQkJICAgIGRhcF9tYWxsb2Moc3RybGVuKG5ld3Zhclt2XSkg KwoJCQkJICAgICAgIHN0cmxlbihkaW1zdHIpICsgMSwKCQkJCSAgICAgICAiZGF0YXNldDogZGFw X29ic1swXS5kb19uYW1bdm4gKyBjXSIpOwoJCQkgIHN0cmNweShkYXBfb2JzWzBdLmRvX25hbVt2 biArIGNdLCBuZXd2YXJbdl0pOwoJCQkgIHN0cmNhdChkYXBfb2JzWzBdLmRvX25hbVt2biArIGNd LCBkaW1zdHIpOwoJCQl9CgkJICAgIH0KCQkgIGVsc2UKCQkgICAgewoJCSAgICAgIGZwcmludGYo ZGFwX2VyciwgIihkYXRhc2V0KSB1bmtub3duIHZhcmlhYmxlICVzXG4iLAoJCQkgICAgICBvbGR2 YXJbdl0pOwoJCSAgICAgIGV4aXQoMSk7CgkJICAgIH0KCQl9CgkgICAgfQoJICBvdXRzZXQobmV3 bmFtZSwgb3V0bGlzdCk7CgkgIHdoaWxlIChzdGVwKCkpCgkgICAgb3V0cHV0KCk7Cgl9CiAgICAg IGVsc2UKCXsKCSAgaWYgKCEoZG9sZGYgPSBkZm9wZW4ob2xkbmFtZSwgInIiKSkpCgkgICAgewoJ ICAgICAgZnByaW50ZihkYXBfZXJyLCAiKGRhdGFzZXQpIGNhbid0IHJlYWQgJXMgZm9yIGNvcHku XG4iLAoJCSAgICAgIG9sZG5hbWUpOwoJICAgICAgZXhpdCgxKTsKCSAgICB9CgkgIGlmICghKGRu ZXdmID0gZGZvcGVuKG5ld25hbWUsICJ3IikpKQoJICAgIHsKCSAgICAgIGZwcmludGYoZGFwX2Vy ciwgIihkYXRhc2V0KSBjYW4ndCB3cml0ZSAlcyBmb3IgY29weS5cbiIsCgkJICAgICAgbmV3bmFt ZSk7CgkgICAgICBleGl0KDEpOwoJICAgIH0KCSAgd2hpbGUgKChjID0gZGdldGMoZG9sZGYpKSAh PSBFT0YpCgkgICAgZGFwX3B1dGMoYywgZG5ld2YpOwoJICBkZmNsb3NlKGRuZXdmKTsKCSAgZGZj bG9zZShkb2xkZik7Cgl9CiAgICB9CiAgZWxzZSBpZiAoIXN0cm5jbXAoYWN0aW9uLCAiRklMTCIs IDQpKQogICAgewogICAgICBpbnNldChvbGRuYW1lKTsKICAgICAgLyogbWFrZSBjb3B5IG9mIGNl bGwgdmFyaWFibGUgbmFtZXMgZm9yIGRhcF9saXN0ICovCiAgICAgIGNlbGxsaXN0ID0gZGFwX21h bGxvYyhzdHJsZW4oYWN0aW9uKSwgImRhdGFzZXQ6IGNlbGxsaXN0Iik7CiAgICAgIGZvciAodiA9 IDQsIGMgPSAwOyBhY3Rpb25bdl0gJiYgYWN0aW9uW3ZdICE9ICc6JzsgKQkvKiBnZXQgdG8gOiAq LwoJY2VsbGxpc3RbYysrXSA9IGFjdGlvblt2KytdOwogICAgICBjZWxsbGlzdFtjXSA9ICdcMCc7 CiAgICAgIGlmICghYWN0aW9uW3ZdKQoJewoJICBmcHJpbnRmKGRhcF9lcnIsCgkJICAiKGRhdGFz ZXQpIG1pc3NpbmcgJzonIGJldHdlZW4gdmFyaWFibGUgbGlzdHMgaW4gJXNcbiIsIGFjdGlvbik7 CgkgIGV4aXQoMSk7Cgl9CiAgICAgIG5jZWxsID0gYyAvIDI7CS8qIHRlbnRhdGl2ZSwgb3ZlcmVz dGltYXRlICovCiAgICAgIGNlbGx2ID0gKGludCAqKSBkYXBfbWFsbG9jKHNpemVvZihpbnQpICog bmNlbGwsICJkYXRhc2V0OiBjZWxsdiIpOwogICAgICBuY2VsbCA9IGRhcF9saXN0KGNlbGxsaXN0 LCBjZWxsdiwgbmNlbGwpOwogICAgICBuY2xhc3MgPSAoc3RybGVuKGFjdGlvbikgLSB2KSAvIDI7 CS8qIHRlbnRhdGl2ZSwgb3ZlcmVzdGltYXRlICovCiAgICAgIGNsYXNzdiA9IChpbnQgKikgZGFw X21hbGxvYyhzaXplb2YoaW50KSAqIG5jbGFzcywgImRhdGFzZXQ6IGNsYXNzdiIpOwogICAgICBu Y2xhc3MgPSBkYXBfbGlzdChhY3Rpb24gKyB2ICsgMSwgY2xhc3N2LCBuY2xhc3MpOwogICAgICBp bmxldiA9IChpbnQgKikgZGFwX21hbGxvYyhzaXplb2YoaW50KSAqIG5jbGFzcywgImRhdGFzZXQ6 IGlubGV2Iik7CiAgICAgIG91dGxldiA9IChpbnQgKikgZGFwX21hbGxvYyhzaXplb2YoaW50KSAq IG5jbGFzcywgImRhdGFzZXQ6IG91dGxldiIpOwogICAgICBzbGV2ZWxtZW0gPSAoY2hhciAqKikg ZGFwX21hbGxvYyhzaXplb2YoY2hhciAqKSAqIG5jbGFzcyAqIGRhcF9tYXhsZXYsCgkJCQkgICAg ICAgImRhdGFzZXQ6IHNsZXZlbG1lbSIpOwogICAgICBzbGV2ZWwgPSAoY2hhciAqKiopIGRhcF9t YWxsb2Moc2l6ZW9mKGNoYXIgKiopICogbmNsYXNzLCAiZGF0YXNldDogc2xldmVsIik7CiAgICAg IGRsZXZlbG1lbSA9IChkb3VibGUgKikgZGFwX21hbGxvYyhzaXplb2YoZG91YmxlKSAqIG5jbGFz cyAqIGRhcF9tYXhsZXYsCgkJCQkJImRhdGFzZXQ6IGRsZXZlbG1lbSIpOwogICAgICBkbGV2ZWwg PSAoZG91YmxlICoqKSBkYXBfbWFsbG9jKHNpemVvZihkb3VibGUgKikgKiBuY2xhc3MsCgkJCQkg ICAgICAiZGF0YXNldDogZGxldmVsIik7CiAgICAgIGlsZXZlbG1lbSA9IChpbnQgKikgZGFwX21h bGxvYyhzaXplb2YoaW50KSAqIG5jbGFzcyAqIGRhcF9tYXhsZXYsCgkJCQkgICAgICJkYXRhc2V0 OiBpbGV2ZWxtZW0iKTsKICAgICAgaWxldmVsID0gKGludCAqKikgZGFwX21hbGxvYyhzaXplb2Yo aW50ICopICogbmNsYXNzLCAiZGF0YXNldDogaWxldmVsIik7CiAgICAgIG5sZXZlbHMgPSAoaW50 ICopIGRhcF9tYWxsb2Moc2l6ZW9mKGludCkgKiBuY2xhc3MsICJkYXRhc2V0OiBubGV2ZWxzIik7 CiAgICAgIGZvciAoYyA9IDA7IGMgPCBuY2xhc3M7IGMrKykKCXsKCSAgc2xldmVsW2NdID0gc2xl dmVsbWVtICsgYyAqIGRhcF9tYXhsZXY7CgkgIGRsZXZlbFtjXSA9IGRsZXZlbG1lbSArIGMgKiBk YXBfbWF4bGV2OwoJICBpbGV2ZWxbY10gPSBpbGV2ZWxtZW0gKyBjICogZGFwX21heGxldjsKCX0K ICAgICAgb3V0c2V0KG5ld25hbWUsICIiKTsKICAgICAgZm9yIChjID0gMDsgYyA8IG5jbGFzczsg YysrKQkvKiBzdGFydCB3aXRoIGVtcHR5IGxldmVsIGxpc3RzICovCglubGV2ZWxzW2NdID0gMDsK ICAgICAgZm9yIChkYXBfbWFyaygpOyBzdGVwKCk7ICkKCXsKCSAgZm9yIChjID0gMDsgYyA8IG5j bGFzczsgYysrKQoJICAgIHsKCSAgICAgIGlmICgodiA9IGZpbmRsZXYoY2xhc3N2W2NdLAoJCQkg ICAgICAgZGxldmVsW2NdLCBpbGV2ZWxbY10sIHNsZXZlbFtjXSwgbmxldmVsc1tjXSkpIDwgMCkK CQl7CS8qIGlmIG5vdCBmb3VuZCAqLwoJCSAgaWYgKG5sZXZlbHNbY10gPCBkYXBfbWF4bGV2KQoJ CSAgICB7CgkJICAgICAgaWYgKGRhcF9vYnNbZGFwX29ub10uZG9fbGVuW2NsYXNzdltjXV0gPT0g REJMKQoJCQl7CgkJCSAgZGxldmVsW2NdW25sZXZlbHNbY10rK10gPQoJCQkgICAgZGFwX29ic1tk YXBfb25vXS5kb19kYmxbY2xhc3N2W2NdXTsKCQkJfQoJCSAgICAgIGVsc2UgaWYgKGRhcF9vYnNb ZGFwX29ub10uZG9fbGVuW2NsYXNzdltjXV0gPT0gSU5UKQoJCQl7CgkJCSAgaWxldmVsW2NdW25s ZXZlbHNbY10rK10gPQoJCQkgICAgZGFwX29ic1tkYXBfb25vXS5kb19pbnRbY2xhc3N2W2NdXTsK CQkJfQoJCSAgICAgIGVsc2UKCQkJewoJCQkgIHNsZXZlbFtjXVtubGV2ZWxzW2NdXSA9CgkJCSAg ICBkYXBfbWFsbG9jKHN0cmxlbihkYXBfb2JzW2RhcF9vbm9dLmRvX3N0cltjbGFzc3ZbY11dKSAr IDEsCgkJCQkgICAgICAgImRhdGFzZXQ6IHNsZXZlbFtjXVtubGV2ZWxzW2NdXSIpOwoJCQkgIHN0 cmNweShzbGV2ZWxbY11bbmxldmVsc1tjXSsrXSwKCQkJCSBkYXBfb2JzW2RhcF9vbm9dLmRvX3N0 cltjbGFzc3ZbY11dKTsKCQkJfQoJCSAgICB9CgkJICBlbHNlCgkJICAgIHsKCQkgICAgICBmcHJp bnRmKGRhcF9lcnIsCgkJCSAgICAgICIoZGF0YXNldCkgdG9vIG1hbnkgbGV2ZWxzIGZvciBcJXNc biIsCgkJCSAgICAgIGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW2NsYXNzdltjXV0pOwoJCSAgICAg IGV4aXQoMSk7CgkJICAgIH0KCQl9CgkgICAgfQoJfQogICAgICBmb3IgKGMgPSAwOyBjIDwgbmNs YXNzOyBjKyspCgl7CgkgIGlmIChkYXBfb2JzW2RhcF9vbm9dLmRvX2xlbltjbGFzc3ZbY11dID09 IERCTCkKCSAgICBxc29ydChkbGV2ZWxbY10sIG5sZXZlbHNbY10sIHNpemVvZihkb3VibGUpLCBk Y21wKTsKCSAgZWxzZSBpZiAoZGFwX29ic1tkYXBfb25vXS5kb19sZW5bY2xhc3N2W2NdXSA9PSBJ TlQpCgkgICAgcXNvcnQoaWxldmVsW2NdLCBubGV2ZWxzW2NdLCBzaXplb2YoaW50KSwgaWNtcCk7 CgkgIGVsc2UKCSAgICBxc29ydChzbGV2ZWxbY10sIG5sZXZlbHNbY10sIHNpemVvZihjaGFyICop LCBzY21wKTsKCSAgb3V0bGV2W2NdID0gMDsKCX0KICAgICAgZGFwX3Jld2luZCgpOwkvKiBnbyBi YWNrIHRvIGJlZ2lubmluZyBvZiBwYXJ0ICovCiAgICAgIHdoaWxlIChzdGVwKCkpCgl7CgkgIGZv ciAoYyA9IDA7IGMgPCBuY2xhc3M7IGMrKykKCSAgICB7CgkgICAgICBpbmxldltjXSA9IGZpbmRs ZXYoY2xhc3N2W2NdLCBkbGV2ZWxbY10sIGlsZXZlbFtjXSwgc2xldmVsW2NdLAoJCQkJIG5sZXZl bHNbY10pOwoJICAgIH0KCSAgZm9yIChjID0gMDsgYyA8IG5jbGFzczsgYysrKQoJICAgIHsKCSAg ICAgIGlmIChvdXRsZXZbY10gPCBpbmxldltjXSkKCQlicmVhazsKCSAgICB9CgkgIGlmIChjIDwg bmNsYXNzKQkvKiBza2lwcGVkIHZhbHVlcyBmb3IgY2xhc3MgYyAqLwoJICAgIHsKCSAgICAgIGRh cF9zYXZlKCk7CgkgICAgICBmb3IgKHYgPSAwOyB2IDwgbmNlbGw7IHYrKykJLyogc2V0IGNlbGwg dmFscyAqLwoJCXsJLyogc2V0IHZhbHVlcyB0byAwLjAsIDAsIG9yICIiICovCgkJICBpZiAoZGFw X29ic1tkYXBfb25vXS5kb19sZW5bY2VsbHZbdl1dID09IERCTCkKCQkgICAgZGFwX29ic1tkYXBf b25vXS5kb19kYmxbY2VsbHZbdl1dID0gMC4wOwoJCSAgZWxzZSBpZiAoZGFwX29ic1tkYXBfb25v XS5kb19sZW5bY2VsbHZbdl1dID09IElOVCkKCQkgICAgZGFwX29ic1tkYXBfb25vXS5kb19pbnRb Y2VsbHZbdl1dID0gMDsKCQkgIGVsc2UKCQkgICAgZGFwX29ic1tkYXBfb25vXS5kb19zdHJbY2Vs bHZbdl1dWzBdID0gJ1wwJzsKCQl9CgkgICAgICBkbwl7CgkJZm9yIChjID0gMDsgYyA8IG5jbGFz czsgYysrKQoJCSAgewoJCSAgICBpZiAob3V0bGV2W2NdIDwgaW5sZXZbY10pCgkJICAgICAgYnJl YWs7CgkJICB9CgkJaWYgKGMgPT0gbmNsYXNzKQkvKiBjYXVnaHQgdXAgKi8KCQkgIGJyZWFrOwoJ CWZvciAodiA9IGM7IHYgPCBuY2xhc3M7IHYrKykKCQkgIHsKCQkgICAgaWYgKGRhcF9vYnNbZGFw X29ub10uZG9fbGVuW2NsYXNzdlt2XV0gPT0gREJMKQoJCSAgICAgIGRhcF9vYnNbZGFwX29ub10u ZG9fZGJsW2NsYXNzdlt2XV0gPQoJCQlkbGV2ZWxbdl1bb3V0bGV2W3ZdXTsKCQkgICAgZWxzZSBp ZiAoZGFwX29ic1tkYXBfb25vXS5kb19sZW5bY2xhc3N2W3ZdXSA9PSBJTlQpCgkJICAgICAgZGFw X29ic1tkYXBfb25vXS5kb19pbnRbY2xhc3N2W3ZdXSA9CgkJCWlsZXZlbFt2XVtvdXRsZXZbdl1d OwoJCSAgICBlbHNlCgkJICAgICAgc3RyY3B5KGRhcF9vYnNbZGFwX29ub10uZG9fc3RyW2NsYXNz dlt2XV0sCgkJCSAgICAgc2xldmVsW3ZdW291dGxldlt2XV0pOwoJCSAgfQoJCW91dHB1dCgpOwoJ ICAgICAgfSB3aGlsZSAoaW5jbGV2KG91dGxldiwgbmxldmVscywgbmNsYXNzKSk7CgkgICAgICBk YXBfcmVzdCgpOwoJICAgIH0KCSAgb3V0cHV0KCk7CgkgIGluY2xldihvdXRsZXYsIG5sZXZlbHMs IG5jbGFzcyk7Cgl9CiAgICAgIGZvciAoYyA9IDA7IGMgPCBuY2xhc3M7IGMrKykJLyogZW1wdHkg dGhlIGxldmVsIGxpc3RzICovCgl7CgkgIGZvciAodiA9IDA7IHYgPCBubGV2ZWxzW2NdOyB2Kysp CgkgICAgewoJICAgICAgaWYgKGRhcF9vYnNbZGFwX29ub10uZG9fbGVuW2NsYXNzdltjXV0gPiAw KQoJCWRhcF9mcmVlKHNsZXZlbFtjXVt2XSwgImRhdGFzZXQ6IHNsZXZlbFtjXVt2XSIpOwoJICAg IH0KCSAgbmxldmVsc1tjXSA9IDA7Cgl9CiAgICB9CiAgZWxzZSBpZiAoIXN0cmNtcChhY3Rpb24s ICJSRU1PVkUiKSkKICAgIHsKICAgICAgaWYgKG9sZG5hbWVbMF0gPT0gJzwnKQoJewoJICBmb3Ig KGZvbGQgPSAwOyBmb2xkIDwgZGFwX25yZmlsZXM7IGZvbGQrKykKCSAgICB7CgkgICAgICBpZiAo IXN0cmNtcChkZmlsZVtOREZJTEVTICsgZm9sZF0uZGZpbGVfbmFtZSwgb2xkbmFtZSArIDEpKQoJ CXsKCQkgIGRhcF9mcmVlKGRmaWxlW05ERklMRVMgKyBmb2xkXS5kZmlsZV9uYW1lLAoJCQkgICAi ZGF0YXNldDogZGZpbGVbTkRGSUxFUyArIGZvbGRdLmRmaWxlX25hbWUiKTsKCQkgIGRmaWxlW05E RklMRVMgKyBmb2xkXS5kZmlsZV9uYW1lID0gTlVMTDsKCQkgIGRhcF9mcmVlKHJmaWxlW2ZvbGRd LnJmaWxlX3N0ciwKCQkJICAgImRhdGFzZXQ6IHJmaWxlW2ZvbGRdLnJmaWxlX3N0ciIpOwoJCSAg YnJlYWs7CgkJfQoJICAgIH0KCX0KICAgICAgZWxzZQoJdW5saW5rKGRvbGQpOwogICAgfQogIGVs c2UgaWYgKCFzdHJjbXAoYWN0aW9uLCAiQVBQRU5EIikpCiAgICB7CiAgICAgIGlmICghKGRhcF9v dXRbMF0gPSBkZm9wZW4obmV3bmFtZSwgInIiKSkpCS8qIG5vIGRhdGFzZXQgdG8gYXBwZW5kIHRv Li4uICovCgl7CQkJCS8qIC4uLnNvIGp1c3QgY29weS4gKi8KCSAgaWYgKCEoZGFwX291dFswXSA9 IGRmb3BlbihuZXduYW1lLCAidyIpKSkKCSAgICB7CgkgICAgICBmcHJpbnRmKGRhcF9lcnIsCgkJ ICAgICAgIihkYXRhc2V0KSBDYW4ndCBjcmVhdGUgbmV3IGRhdGEgc2V0IGZvciBhcHBlbmQ6ICVz XG4iLAoJCSAgICAgIG5ld25hbWUpOwoJICAgICAgZXhpdCgxKTsKCSAgICB9CgkgIGlmICghKGRh cF9pblswXSA9IGRmb3BlbihvbGRuYW1lLCAiciIpKSkKCSAgICB7CgkgICAgICBmcHJpbnRmKGRh cF9lcnIsCgkJICAgICAgIihkYXRhc2V0KSBjYW4ndCByZWFkIG9sZCBkYXRhIHNldCBmb3IgYXBw ZW5kOiAlc1xuIiwKCQkgICAgICBvbGRuYW1lKTsKCSAgICAgIGV4aXQoMSk7CgkgICAgfQoJICB3 aGlsZSAoKGMgPSBkZ2V0YyhkYXBfaW5bMF0pKSAhPSBFT0YpCgkgICAgZGFwX3B1dGMoYywgZGFw X291dFswXSk7CgkgIGRmY2xvc2UoZGFwX2luWzBdKTsKCSAgZGFwX2luWzBdID0gKERGSUxFICop IE5VTEw7CgkgIGRmY2xvc2UoZGFwX291dFswXSk7CgkgIGRhcF9vdXRbMF0gPSAoREZJTEUgKikg TlVMTDsKCSAgcmV0dXJuOwoJfQogICAgICBlbHNlCQkJCS8qIHJlYWxseSBhcHBlbmQgKi8KCXsK CSAgaW5zZXQobmV3bmFtZSk7CQkJLyogdG8gZ2V0IHZhcmlhYmxlIGxpc3QgKi8KCSAgb3V0c2V0 KCJkYXBfbnVsbCIsICIiKTsJCS8qIHNvIGRvbid0IG91dHB1dCBhbnl3aGVyZSAqLwoJICBiYXNl b2JzLmRvX252YXIgPSBkYXBfb2JzWzBdLmRvX252YXI7CS8qIHNhdmUgbmV3bmFtZSdzIG52YXIg Ki8KCSAgZm9yICh2ID0gMDsgdiA8IGJhc2VvYnMuZG9fbnZhcjsgdisrKQoJICAgIHsJCQkvKiBj b3B5IG5hbWVzLCBsZW5zIGZyb20gbmV3bmFtZSAqLwoJICAgICAgYmFzZW9icy5kb19sZW5bdl0g PSBkYXBfb2JzWzBdLmRvX2xlblt2XTsKCSAgICAgIGJhc2VvYnMuZG9fbmFtW3ZdID0gZGFwX21h bGxvYyhzdHJsZW4oZGFwX29ic1swXS5kb19uYW1bdl0pICsgMSwKCQkJCQkgICAgICJkYXRhc2V0 OiBiYXNlb2JzLmRvX25hbVt2XSIpOwoJICAgICAgc3RyY3B5KGJhc2VvYnMuZG9fbmFtW3ZdLCBk YXBfb2JzWzBdLmRvX25hbVt2XSk7CgkgICAgfQoJICBkZmNsb3NlKGRhcF9vdXRbMF0pOwoJICBk YXBfb3V0WzBdID0gKERGSUxFICopIE5VTEw7CgkgIGluc2V0KG9sZG5hbWUpOwkJLyogb3BlbiAi b2xkIiBkYXRhc2V0IHRvIGFwcGVuZCB0byBuZXduYW1lICovCgkgIGRhcF9vYnNbMF0uZG9fb3Zh ciA9IDA7CgkgIGZvciAodiA9IDAsIG1heG5hbWxlbiA9IDA7IHYgPCBiYXNlb2JzLmRvX252YXI7 IHYrKykKCSAgICB7CQkvKiBmaW5kIGxvbmdlc3QgbmFtZSBsZW5ndGggaW4gbmV3bmFtZSAqLwoJ ICAgICAgaWYgKG1heG5hbWxlbiA8IHN0cmxlbihiYXNlb2JzLmRvX25hbVt2XSkpCgkJbWF4bmFt bGVuID0gc3RybGVuKGJhc2VvYnMuZG9fbmFtW3ZdKTsKCSAgICB9CgkgIC8qIHNldCB1cCBmb3Ig c3BlY2lmaWNhdGlvbiBmb3IgZGVjbGFyYXRpb24gb2YgdGhvc2UgdmFyaWFibGVzIGluCgkgICAq IG5ld25hbWUgdGhhdCBhcmUgbm90IGluIG9sZG5hbWUKCSAgICovCgkgIHZhcnNwZWMgPSBkYXBf bWFsbG9jKG1heG5hbWxlbiArIGRhcF9pbnRsZW4gKyAyLAoJCQkgICAgICAgImRhdGFzZXQ6IHZh cnNwZWMiKTsKCSAgY2xlYXJ2YXIgPSAoaW50ICopIGRhcF9tYWxsb2Moc2l6ZW9mKGludCkgKiBi YXNlb2JzLmRvX252YXIsCgkJCQkJImRhdGFzZXQ6IGNsZWFydmFyIik7CgkgIGZvciAodiA9IDAs IG5jbGVhciA9IDA7IHYgPCBiYXNlb2JzLmRvX252YXI7IHYrKykKCSAgICB7CgkgICAgICBpZiAo KG9udW0gPSBkYXBfdmFybnVtKGJhc2VvYnMuZG9fbmFtW3ZdKSkgPCAwKQoJCXsJLyogZ2V0IGlu ZGV4IGluIG9sZG5hbWUgKi8KCQkJCS8qIGlmIG5vbmUgZ2l2ZSBpdCBuZXduYW1lJ3Mgc3BlY3Mg Zm9yIGl0ICovCgkJICBzcHJpbnRmKHZhcnNwZWMsICIlcyAlZCIsIGJhc2VvYnMuZG9fbmFtW3Zd LAoJCQkgIGJhc2VvYnMuZG9fbGVuW3ZdKTsKCQkgIG9udW0gPSBkYXBfdmQodmFyc3BlYywgMCk7 CgkJCQkvKiBtYXJrIGZvciBzZXR0aW5nIHRvICIiLCAwLCBhbmQgMC4wICovCgkJICBjbGVhcnZh cltuY2xlYXIrK10gPSBvbnVtOwoJCX0KCSAgICAgIGVsc2UJCS8qIGlmIGl0J3MgdGhlcmUsIGNo ZWNrIHR5cGUsIGxlbiAqLwoJCXsKCQkgIGlmIChkYXBfb2JzWzBdLmRvX2xlbltvbnVtXSAhPSBi YXNlb2JzLmRvX2xlblt2XSkKCQkgICAgewoJCSAgICAgIGZwcmludGYoc3RkZXJyLAoJCQkgICAg ICAiKGRhdGFzZXQpIHZhcmlhYmxlICVzIGhhcyBkaWZmZXJlbnQgbGVuZ3RocyAoJWQgYXBwZW5k ZWQgdG8gJWQpIGluIGRhdGFzZXRzXG4iLAoJCQkgICAgICBiYXNlb2JzLmRvX25hbVt2XSwgZGFw X29ic1swXS5kb19sZW5bb251bV0sCgkJCSAgICAgIGJhc2VvYnMuZG9fbGVuW3ZdKTsKCQkgICAg ICBleGl0KDEpOwoJCSAgICB9CgkJfQoJICAgICAgZGFwX29ic1swXS5kb19vdXRbZGFwX29ic1sw XS5kb19vdmFyKytdID0gb251bTsKCSAgICB9CgkgIGlmICghKGRhcF9vdXRbMF0gPSBkZm9wZW4o bmV3bmFtZSwgImEiKSkpCgkgICAgewoJICAgICAgZnByaW50ZihkYXBfZXJyLCAiKGRhdGFzZXQp IGNhbid0IGFwcGVuZCB0byBuZXcgZGF0YSBzZXQ6ICVzXG4iLAoJCSAgICAgIG5ld25hbWUpOwoJ ICAgICAgZXhpdCgxKTsKCSAgICB9CgkgIHdoaWxlIChzdGVwKCkpCgkgICAgewoJICAgICAgLyog YW5kIHNldCB0byAiIiwgMCwgYW5kIDAuMCAqLwoJICAgICAgZm9yICh2ID0gMDsgdiA8IG5jbGVh cjsgdisrKQoJCXsKCQkgIGlmIChkYXBfb2JzWzBdLmRvX3N0cltjbGVhcnZhclt2XV0pCgkJICAg IGRhcF9vYnNbMF0uZG9fc3RyW2NsZWFydmFyW3ZdXVswXSA9ICdcMCc7CgkJICBkYXBfb2JzWzBd LmRvX3NsW2NsZWFydmFyW3ZdXSA9IDA7CgkJICBkYXBfb2JzWzBdLmRvX2ludFtjbGVhcnZhclt2 XV0gPSAwOwoJCSAgZGFwX29ic1swXS5kb19kYmxbY2xlYXJ2YXJbdl1dID0gMC4wOwoJCX0KCSAg ICAgIG91dHB1dCgpOwoJICAgIH0KCSAgZm9yICh2ID0gMDsgdiA8IGJhc2VvYnMuZG9fbnZhcjsg disrKQoJICAgIHsKCSAgICAgIGRhcF9mcmVlKGJhc2VvYnMuZG9fbmFtW3ZdLCAiZGF0YXNldDog YmFzZW9icy5kb19uYW1bdl0iKTsKCSAgICAgIGJhc2VvYnMuZG9fbmFtW3ZdID0gTlVMTDsKCSAg ICB9CgkgIGRhcF9mcmVlKHZhcnNwZWMsICJkYXRhc2V0OiB2YXJzcGVjIik7Cgl9CiAgICB9CiAg ZWxzZQogICAgewogICAgICBmcHJpbnRmKGRhcF9lcnIsICIoZGF0YXNldCkgdW5rbm93biBhY3Rp b246ICVzXG4iLCBhY3Rpb24pOwogICAgICBleGl0KDEpOwogICAgfQogIGRhcF9mcmVlKGRvbGQs ICJkYXRhc2V0OiBkb2xkIik7CiAgZGFwX2ZyZWUoZG5ldywgImRhdGFzZXQ6IGRuZXciKTsKICBk YXBfZnJlZShvbGR2bWVtLCAiZGF0YXNldDogb2xkdm1lbSIpOwogIGRhcF9mcmVlKG9sZHZhciwg ImRhdGFzZXQ6IG9sZHZhciIpOwogIGRhcF9mcmVlKG5ld3ZtZW0sICJkYXRhc2V0OiBuZXd2bWVt Iik7CiAgZGFwX2ZyZWUobmV3dmFyLCAiZGF0YXNldDogbmV3dmFyIik7CiAgZGFwX2ZyZWUob3V0 bGlzdCwgImRhdGFzZXQ6IG91dGxpc3QiKTsKICBpZiAoY2xlYXJ2YXIpCiAgICBkYXBfZnJlZShj bGVhcnZhciwgImRhdGFzZXQ6IGNsZWFydmFyIik7CiAgaWYgKGNlbGxsaXN0KQogICAgZGFwX2Zy ZWUoY2VsbGxpc3QsICJkYXRhc2V0OiBjZWxsbGlzdCIpOwogIGlmIChjZWxsdikKICAgIGRhcF9m cmVlKGNlbGx2LCAiZGF0YXNldDogY2VsbHYiKTsKICBpZiAoY2xhc3N2KQogICAgZGFwX2ZyZWUo Y2xhc3N2LCAiZGF0YXNldDogY2xhc3N2Iik7CiAgaWYgKHNsZXZlbG1lbSkJLyogYWxsIG9mIHRo ZXNlIGFsbG9jYXRlZCBmb3IgRklMTCAqLwogICAgewogICAgICBkYXBfZnJlZShzbGV2ZWxtZW0s ICJkYXRhc2V0OiBzbGV2ZWxtZW0iKTsKICAgICAgZGFwX2ZyZWUoc2xldmVsLCAiZGF0YXNldDog c2xldmVsIik7CiAgICAgIGRhcF9mcmVlKGRsZXZlbG1lbSwgImRhdGFzZXQ6IGRsZXZlbG1lbSIp OwogICAgICBkYXBfZnJlZShkbGV2ZWwsICJkYXRhc2V0OiBkbGV2ZWwiKTsKICAgICAgZGFwX2Zy ZWUoaWxldmVsbWVtLCAiZGF0YXNldDogaWxldmVsbWVtIik7CiAgICAgIGRhcF9mcmVlKGlsZXZl bCwgImRhdGFzZXQ6IGlsZXZlbCIpOwogICAgICBkYXBfZnJlZShpbmxldiwgImRhdGFzZXQ6IGlu bGV2Iik7CiAgICAgIGRhcF9mcmVlKG91dGxldiwgImRhdGFzZXQ6IG91dGxldiIpOwogICAgICBk YXBfZnJlZShubGV2ZWxzLCAiZGF0YXNldDogbmxldmVscyIpOwogICAgfQp9CgojZGVmaW5lIEJM T0NLTEVOIDMyCgpzdGF0aWMgaW50IGdldGJsb2NrKERGSUxFICpmcCkKewogIGNoYXIgYmxvY2tb QkxPQ0tMRU5dOwogIGludCBiOwoKICBpZiAoKGJsb2NrWzBdID0gZGdldGMoZnApKSA9PSAnXHIn KQogICAgcmV0dXJuIDA7CiAgZm9yIChiID0gMTsgYiA8IEJMT0NLTEVOOyBiKyspCiAgICBibG9j a1tiXSA9IGRnZXRjKGZwKTsKICByZXR1cm4gKGJsb2NrWzE2XSAmIDB4ZmYpOwp9CgppbnQgZGFw X2NsZWFyb2JzKGNoYXIgKnZhcnNwZWMpCnsKICBpbnQgdjsKCiAgaWYgKGRhcF9vbm8gPCAyKQog ICAgewogICAgICBkYXBfcHJldltkYXBfb25vXS5kb19pdmFyID0gMDsKICAgICAgZW9mW2RhcF9v bm9dID0gMDsKICAgICAgZm9yICh2ID0gMDsgdiA8IGRhcF9tYXh2YXI7IHYrKykKCXsKCSAgaWYg KGRhcF9wcmV2W2RhcF9vbm9dLmRvX3N0clt2XSkKCSAgICBkYXBfZnJlZShkYXBfcHJldltkYXBf b25vXS5kb19zdHJbdl0sCgkJICAgICAiY2xlYXJvYnM6IGRhcF9wcmV2W2RhcF9vbm9dLmRvX3N0 clt2XSIpOwoJICBkYXBfcHJldltkYXBfb25vXS5kb19zdHJbdl0gPSBOVUxMOwoJfQogICAgfQog IGRhcF9vYnNbZGFwX29ub10uZG9faXZhciA9IDA7CiAgZGFwX29ic1tkYXBfb25vXS5kb19vdmFy ID0gMDsKICBkYXBfb2JzW2RhcF9vbm9dLmRvX252YXIgPSAwOwogIGRhcF9vYnNbZGFwX29ub10u ZG9fdmFsaWQgPSAwOwogIGZvciAodiA9IDA7IHYgPCBkYXBfbWF4dmFyOyB2KyspCiAgICB7CiAg ICAgIGlmIChkYXBfb2JzW2RhcF9vbm9dLmRvX25hbVt2XSkKCWRhcF9mcmVlKGRhcF9vYnNbZGFw X29ub10uZG9fbmFtW3ZdLAoJCSAiY2xlYXJvYnM6IGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW3Zd Iik7CiAgICAgIGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW3ZdID0gTlVMTDsKICAgICAgZGFwX29i c1tkYXBfb25vXS5kb19kbFt2XSA9IE5VTEw7CiAgICAgIGRhcF9vYnNbZGFwX29ub10uZG9faWxb dl0gPSBOVUxMOwogICAgICBpZiAoIWRhcF9vYnNbZGFwX29ub10uZG9fc2xbdl0gJiYgZGFwX29i c1tkYXBfb25vXS5kb19zdHJbdl0pCglkYXBfZnJlZShkYXBfb2JzW2RhcF9vbm9dLmRvX3N0clt2 XSwKCQkgImNsZWFyb2JzOiBkYXBfb2JzW2RhcF9vbm9dLmRvX3N0clt2XSIpOwogICAgICBkYXBf b2JzW2RhcF9vbm9dLmRvX3N0clt2XSA9IE5VTEw7CiAgICAgIGRhcF9vYnNbZGFwX29ub10uZG9f c2xbdl0gPSAwOwogICAgfQogIGlmICh2YXJzcGVjKQogICAgZGFwX3ZkKHZhcnNwZWMsIDEpOwog IGVsc2UKICAgIGRhcF92ZCgiX3R5cGVfIDgiLCAwKTsKICBpZiAoKHYgPSBkYXBfdmFybnVtKCJf dHlwZV8iKSkgPCAwKQogICAgewogICAgICBmcHV0cygiKGNsZWFyb2JzKSBtaXNzaW5nIF90eXBl XyB2YXJpYWJsZVxuIiwgZGFwX2Vycik7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgZGFwX29ic1tk YXBfb25vXS5kb19vdXRbZGFwX29ic1tkYXBfb25vXS5kb19vdmFyKytdID0gdjsKICByZXR1cm4g djsKfQoKdm9pZCBpbmZpbGUoY2hhciAqaWZuYW1lLCBjaGFyICppZGVsaW0pCnsKICBzdGF0aWMg aW50IGluZmluaXQgPSAwOwogIGludCB2OwogIGludCBkOwogIGludCBpbmZsZGxlbjsKICBjaGFy ICpmbmFtZTsKICBzdGF0aWMgY2hhciAqZGVsaW07CiAgc3RhdGljIGludCBkZWxpbWxlbjsKCiAg aWYgKCFpbmZpbml0KQogICAgewogICAgICBpbmZpbml0ID0gMTsKICAgICAgZGVsaW1sZW4gPSAo ZGFwX2xpbmVsZW4gKyAxKSAvIDggLSAxOwogICAgICBkZWxpbSA9IGRhcF9tYWxsb2MoZGVsaW1s ZW4gKyAxLCAiaW5maWxlOiBkZWxpbSIpOwogICAgICBmaWVsZHdkID0gKGludCAqKSBkYXBfbWFs bG9jKHNpemVvZihpbnQpICogZGFwX21heHZhciwgImluZmlsZTogZmllbGR3ZCIpOwogICAgfQog IGlmIChkYXBfaW5bZGFwX29ub10pCiAgICB7CiAgICAgIGRmY2xvc2UoZGFwX2luW2RhcF9vbm9d KTsKICAgICAgZGFwX2luW2RhcF9vbm9dID0gKERGSUxFICopIE5VTEw7CiAgICB9CiAgaWYgKGRh cF9vdXRbZGFwX29ub10pCiAgICB7CiAgICAgIGRmY2xvc2UoZGFwX291dFtkYXBfb25vXSk7CiAg ICAgIGRhcF9vdXRbZGFwX29ub10gPSAoREZJTEUgKikgTlVMTDsKICAgIH0KICBpZiAoIWlmbmFt ZSB8fCAhaWZuYW1lWzBdKQogICAgewogICAgICBmbmFtZSA9ICIvZGV2L251bGwiOwogICAgICBz dHJjcHkoZGVsaW0sICJ8Iik7CiAgICB9CiAgZWxzZQogICAgewogICAgICBmbmFtZSA9IGlmbmFt ZTsKICAgICAgaWYgKCFpZGVsaW0gfHwgIWlkZWxpbVswXSkKCXsKCSAgZnByaW50ZihkYXBfZXJy LAoJCSAgIihpbmZpbGUpIERlbGltaXRlciBzdHJpbmcgbXVzdCBiZSBhdCBsZWFzdCBvbmUgY2hh cmFjdGVyOiAlc1xuIiwKCQkgIGRlbGltKTsKCSAgZXhpdCgxKTsKCX0KICAgICAgZWxzZSBpZiAo c3RybGVuKGlkZWxpbSkgPD0gZGVsaW1sZW4pCglzdHJjcHkoZGVsaW0sIGlkZWxpbSk7CiAgICAg IGVsc2UKCXsKCSAgZnByaW50ZihkYXBfZXJyLAoJCSAgIihpbmZpbGUpIERlbGltaXRlciBzdHJp bmcgdG9vIGxvbmc6ICVzXG4iLCBpZGVsaW0pOwoJICBleGl0KDEpOwoJfQogICAgfQogIC8qIHRo ZSAnZicgc2F5cyB0aGF0IGl0J3Mgbm90IGEgZGF0YXNldCwgc28gZG9uJ3QgbmVlZCB0byBwcmVw ZW5kIGRpcmVjdG9yeSAqLwogIGlmICghKGRhcF9pbltkYXBfb25vXSA9IGRmb3BlbihmbmFtZSwg InJmIikpKQogICAgewogICAgICBmcHJpbnRmKGRhcF9lcnIsICIoaW5maWxlKSBjYW4ndCByZWFk IGRhdGEgZmlsZTogJXNcbiIsIGZuYW1lKTsKICAgICAgZXhpdCgxKTsKICAgIH0KICBpbnR5cGUg PSBURVhUOwogIGlmICghc3RyY21wKGZuYW1lICsgc3RybGVuKGZuYW1lKSAtIDQsICIuZGJmIikp CiAgICB7CiAgICAgIGludHlwZSA9IERCQVNFOwogICAgICBnZXRibG9jayhkYXBfaW5bZGFwX29u b10pOyAgICAgLyogZHVtcCBoZWFkZXIgKi8KICAgICAgZm9yIChpbmxlbiA9IDA7IChpbmZsZGxl biA9IGdldGJsb2NrKGRhcF9pbltkYXBfb25vXSkpOyBpbmxlbiArPSBpbmZsZGxlbikKCTsKICAg IH0KICBkYXBfZGVsaW0gPSBkZWxpbVswXTsKICBmb3IgKG5maWVsZHMgPSAwLCBkID0gMTsgZGVs aW1bZF07IG5maWVsZHMrKykKICAgIHsKICAgICAgaWYgKG5maWVsZHMgPCBkYXBfbWF4dmFyKQoJ ewoJICBmb3IgKGZpZWxkd2RbbmZpZWxkc10gPSAwOyBkZWxpbVtkXSAmJiBkZWxpbVtkXSAhPSBk YXBfZGVsaW07ICkKCSAgICBmaWVsZHdkW25maWVsZHNdID0gMTAgKiBmaWVsZHdkW25maWVsZHNd ICsgZGVsaW1bZCsrXSAtICcwJzsKCSAgaWYgKGRlbGltW2RdKQoJICAgIGQrKzsKCX0KICAgICAg ZWxzZQoJewoJICBmcHV0cygiKGluZmlsZSkgdG9vIG1hbnkgZmllbGQgd2lkdGggc3BlY2lmaWVy cy5cbiIsIGRhcF9lcnIpOwoJICBleGl0KDEpOwoJfQogICAgfQogIHYgPSBkYXBfY2xlYXJvYnMo KGNoYXIgKikgTlVMTCk7CiAgc3RyY3B5KGRhcF9vYnNbZGFwX29ub10uZG9fc3RyW3ZdLCAiT0JT Iik7CiAgbGluZW5vW2RhcF9vbm9dID0gMTsKICB0b29sb25nID0gMDsKfQoKdm9pZCBpbnB1dChj aGFyIHZhcmxpc3RbXSkKewogIGludCB2OwogIGludCBsOwogIGludCBpOwogIHN0YXRpYyBjaGFy ICp2bmFtZSA9IE5VTEw7CiAgaW50IGRpbTsKICBpbnQgZDsKCiAgaWYgKCF2bmFtZSkKICAgIHZu YW1lID0gZGFwX21hbGxvYyhkYXBfbmFtZWxlbiArIDEsICJpbnB1dDogdm5hbWUiKTsKICBmb3Ig KGwgPSAwOyB2YXJsaXN0W2xdID09ICcgJzsgbCsrKQogICAgOwogIHdoaWxlICh2YXJsaXN0W2xd KQogICAgewogICAgICBmb3IgKGkgPSAwOyB2YXJsaXN0W2wgKyBpXSAmJiB2YXJsaXN0W2wgKyBp XSAhPSAnICc7IGkrKykKCXsKCSAgaWYgKGkgPCBkYXBfbmFtZWxlbikKCSAgICB2bmFtZVtpXSA9 IHZhcmxpc3RbbCArIGldOwoJICBlbHNlCgkgICAgewoJICAgICAgdm5hbWVbaV0gPSAnXDAnOwoJ ICAgICAgZnByaW50ZihkYXBfZXJyLCAiKGlucHV0KSB2YXJpYWJsZSBuYW1lIHRvbyBsb25nOiAl c1xuIiwgdm5hbWUpOwoJICAgICAgZXhpdCgxKTsKCSAgICB9Cgl9CiAgICAgIHZuYW1lW2ldID0g J1wwJzsKICAgICAgaWYgKCh2ID0gZGFwX3Zhcm51bSh2bmFtZSkpID49IDApCglkYXBfb2JzW2Rh cF9vbm9dLmRvX2luW2RhcF9vYnNbZGFwX29ub10uZG9faXZhcisrXSA9IHY7CiAgICAgIGVsc2Ug aWYgKCh2ID0gZGFwX2Fycm51bSh2bmFtZSwgJmRpbSkpID49IDApCgl7CgkgIGZvciAoZCA9IDA7 IGQgPCBkaW07IGQrKykKCSAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX2luW2RhcF9vYnNbZGFwX29u b10uZG9faXZhcisrXSA9IHYgKyBkOwoJfQogICAgICBlbHNlCgl7CgkgIGZwcmludGYoZGFwX2Vy ciwgIihpbnB1dCkgdW5rbm93biB2YXJpYWJsZTogJXNcbiIsIHZuYW1lKTsKCSAgZXhpdCgxKTsK CX0KICAgICAgbCArPSBpOwogICAgICB3aGlsZSAodmFybGlzdFtsXSA9PSAnICcpCglsKys7CiAg ICB9Cn0KCi8qIG9wZW4gYW4gaW5wdXQgZGF0YXNldCBuYW1lZCBmbmFtZTsgaWYgZm5hbWUgaXMg TlVMTCwganVzdCBjbG9zZSB0aGUgb3BlbiBpbnB1dCBkYXRhc2V0ICovCnZvaWQgaW5zZXQoY2hh ciAqZm5hbWUpCnsKICBpbnQgdjsKICBzdGF0aWMgY2hhciAqdmFyc3BlYyA9IE5VTEw7CiAgZG91 YmxlIHRlc3RkOwoKICBpZiAoIXZhcnNwZWMpCiAgICB2YXJzcGVjID0gZGFwX21hbGxvYyhkYXBf bGluZWxlbiArIDEsICJpbnNldDogdmFyc3BlYyIpOwogIGlmIChkYXBfaW5bZGFwX29ub10pCiAg ICB7CiAgICAgIGRmY2xvc2UoZGFwX2luW2RhcF9vbm9dKTsKICAgICAgZGFwX2luW2RhcF9vbm9d ID0gKERGSUxFICopIE5VTEw7CiAgICB9CiAgaWYgKGRhcF9vdXRbZGFwX29ub10pCiAgICB7CiAg ICAgIGRmY2xvc2UoZGFwX291dFtkYXBfb25vXSk7CiAgICAgIGRhcF9vdXRbZGFwX29ub10gPSAo REZJTEUgKikgTlVMTDsKICAgIH0KICBpZiAoIWZuYW1lKQogICAgcmV0dXJuOwogIGlmICghKGRh cF9pbltkYXBfb25vXSA9IGRmb3BlbihmbmFtZSwgInIiKSkpCiAgICB7CiAgICAgIGZwcmludGYo ZGFwX2VyciwgIihpbnNldCkgY2FuJ3QgcmVhZCBkYXRhIHNldDogJXNcbiIsIGZuYW1lKTsKICAg ICAgZXhpdCgxKTsKICAgIH0KICBpbnR5cGUgPSBEU0VUOwogIGRhcF9kZWxpbSA9ICdcMCc7CiAg aWYgKGRhcF9nZXRsaW5lKGRhcF9pbltkYXBfb25vXSwgdmFyc3BlYykgPCAwKQogICAgewogICAg ICBmcHJpbnRmKGRhcF9lcnIsICIoaW5zZXQpIGRhdGEgc2V0IGVtcHR5OiAlc1xuIiwgZm5hbWUp OwogICAgICBleGl0KDEpOwogICAgfQogIG5maWVsZHMgPSAwOwogIGRhcF9jbGVhcm9icyh2YXJz cGVjKTsKICBkYXBfZGVsaW0gPSBTRVRERUxJTTsKICBsaW5lbm9bZGFwX29ub10gPSAxOwp9Cgov KiBSZW1vdmUgYnJhY2tldGVkIGluZGljZXMgZnJvbSBleHBsaWNpdCBlbnRyeSByZWZlcmVuY2Vz CiAqIGJ1dCBkbyBub3QgY3JlYXRlIGR1cGxpY2F0aW9ucyBvZiB2YXJpYWJsZSBuYW1lcwogKi8K c3RhdGljIHZvaWQgZml4bGlzdChjaGFyICp2YXJsLCBjaGFyICp2YXJsaXN0KQp7CiAgc3RhdGlj IGludCBmaXhpbml0ID0gMDsKICBpbnQgbDsJCQkvKiBpbmRleCB0byB2YXIgbGlzdHMgKi8KICBp bnQgZjsKICBpbnQgaW5icmFjazsKICBzdGF0aWMgY2hhciAqdm5hbWU7CiAgaW50IGRpbTsKICBz dGF0aWMgaW50ICpvdXR2OwogIGludCBsMDsKICBpbnQgbDE7CiAgaW50IGYxOwogIGludCBudjsK ICBpbnQgdjsKICBpbnQgdm47CgogIGlmICghZml4aW5pdCkKICAgIHsKICAgICAgZml4aW5pdCA9 IDE7CiAgICAgIHZuYW1lID0gZGFwX21hbGxvYyhkYXBfbmFtZWxlbiArIDEsICJmaXhsaXN0OiB2 bmFtZSIpOwogICAgICBvdXR2ID0gKGludCAqKSBkYXBfbWFsbG9jKHNpemVvZihpbnQpICogZGFw X21heHZhciwgImZpeGxpc3Q6IG91dHYiKTsKICAgIH0KICBpZiAoIXZhcmwpCiAgICB7CiAgICAg IGZwdXRzKCIoZml4bGlzdCkgbWlzc2luZyB2YXJpYWJsZSBsaXN0LlxuIiwgZGFwX2Vycik7CiAg ICAgIGV4aXQoMSk7CiAgICB9CiAgaWYgKCF2YXJsaXN0KQogICAgewogICAgICBmcHV0cygiKGZp eGxpc3QpIG1pc3Npbmcgc3RyaW5nIGZvciBmaXhlZCB2YXJpYWJsZSBsaXN0LlxuIiwgZGFwX2Vy cik7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgLyogRmlyc3QgY29weSB2YXJsIHRvIHZhcmxpc3Qs IGVsaW1pbmF0aW5nIGJyYWNrZXRlZCBpbmRpY2VzICovCiAgZm9yIChpbmJyYWNrID0gMCwgbCA9 IDAsIGYgPSAwOyB2YXJsW2xdOyBsKyspCiAgICB7CiAgICAgIGlmIChpbmJyYWNrKQoJewoJICBp ZiAodmFybFtsXSA9PSAnXScpCgkgICAgaW5icmFjayA9IDA7Cgl9CiAgICAgIGVsc2UgaWYgKHZh cmxbbF0gPT0gJ1snKQoJaW5icmFjayA9IDE7CiAgICAgIGVsc2UKCXZhcmxpc3RbZisrXSA9IHZh cmxbbF07CiAgICB9CiAgdmFybGlzdFtmXSA9ICdcMCc7CiAgZm9yIChsID0gMDsgdmFybGlzdFts XSA9PSAnICc7IGwrKykKICAgIDsKICBsMCA9IDA7CiAgaWYgKHZhcmxpc3RbbF0gPT0gJyEnKQog ICAgewogICAgICBmb3IgKGwrKzsgdmFybGlzdFtsXSA9PSAnICc7IGwrKykKCTsKICAgICAgdmFy bGlzdFtsMCsrXSA9ICchJzsKICAgIH0KICBmb3IgKG52ID0gMCwgbDEgPSBsMDsgdmFybGlzdFts XTsgKQogICAgewogICAgICBmb3IgKGYgPSAwOyB2YXJsaXN0W2wgKyBmXSAmJiB2YXJsaXN0W2wg KyBmXSAhPSAnICc7IGYrKykKCXsKCSAgaWYgKGYgPCBkYXBfbmFtZWxlbikKCSAgICB2bmFtZVtm XSA9IHZhcmxpc3RbbCArIGZdOwoJICBlbHNlCgkgICAgewoJICAgICAgdm5hbWVbZl0gPSAnXDAn OwoJICAgICAgZnByaW50ZihkYXBfZXJyLCAiKGZpeGxpc3QpIHZhcmlhYmxlIG5hbWUgdG9vIGxv bmc6ICVzXG4iLCB2bmFtZSk7CgkgICAgICBleGl0KDEpOwoJICAgIH0KCX0KICAgICAgdm5hbWVb Zl0gPSAnXDAnOwogICAgICBpZiAoKCh2ID0gZGFwX3Zhcm51bSh2bmFtZSkpIDwgMCkgJiYgKCh2 ID0gZGFwX2Fycm51bSh2bmFtZSwgJmRpbSkpIDwgMCkpCgl7CgkgIGZwcmludGYoZGFwX2Vyciwg IihmaXhsaXN0KSB1bmtub3duIHZhcmlhYmxlOiAlc1xuIiwgdm5hbWUpOwoJICBleGl0KDEpOwoJ fQogICAgICBmb3IgKHZuID0gMDsgdm4gPCBudjsgdm4rKykJLyogc2VlIGlmIHZhcmlhYmxlIGFs cmVhZHkgYXBwZWFyZWQgKi8KCXsKCSAgaWYgKG91dHZbdm5dID09IHYpCgkgICAgYnJlYWs7Cgl9 CiAgICAgIGlmICh2biA9PSBudikJCQkJLyogaWYgbm90ICovCgl7CgkgIG91dHZbbnYrK10gPSB2 OwkJCS8qIGVudGVyIGl0IGluIGxpc3Qgb2YgaW5kaWNlcyAqLwoJICBpZiAobDEgPiBsMCkKCSAg ICB2YXJsaXN0W2wxKytdID0gJyAnOwoJICBmb3IgKGYxID0gMDsgZjEgPCBmOyBmMSsrKQkvKiBj b3B5IG5hbWUgZnJvbSB2YXJsaXN0IHRvIHZhcmxpc3QgKi8KCSAgICB2YXJsaXN0W2wxKytdID0g dmFybGlzdFtsKytdOwoJfQogICAgICBlbHNlCglsICs9IGY7CiAgICAgIHdoaWxlICh2YXJsaXN0 W2xdID09ICcgJykKCWwrKzsKICAgIH0KICB2YXJsaXN0W2wxXSA9ICdcMCc7Cn0KCi8qIFNldCBu YW1lIGFuZCB2YXJpYWJsZXMgb2Ygb3V0cHV0IGRhdGFzZXQKICogdmFybCA9IGxpc3Qgb2YgdmFy aWFibGVzIHRvIGluY2x1ZGUgZXhjZXB0IHRoYXQgaWYgaXQgaGFzICchJyBiZWZvcmUKICoJdGhl IHZhcmlhYmxlIG5hbWVzLCB0aGVuIHRoZSB2YXJpYWJsZXMgYXJlIHRvIGJlIGV4Y2x1ZGVkIGlu c3RlYWQKICovCnZvaWQgb3V0c2V0KGNoYXIgKmZuYW1lLCBjaGFyICp2YXJsKQp7CiAgc3RhdGlj IGludCBvdXRpbml0ID0gMDsJLyogaW5pdGlhbGl6ZWQgZGF0YSBmb3Igb3V0c2V0PyAqLwogIGlu dCBsOwogIGludCBpOwogIHN0YXRpYyBjaGFyICp2YXJsaXN0OwogIHN0YXRpYyBjaGFyICp2bmFt ZTsKICBpbnQgdjsKICBpbnQgdzsKICBpbnQgZmlyc3Q7CiAgaW50IGRpbTsKICBpbnQgZDsKICBk b3VibGUgdGVzdGQ7CgogIGlmIChkYXBfb3V0W2RhcF9vbm9dKQogICAgewogICAgICBkZmNsb3Nl KGRhcF9vdXRbZGFwX29ub10pOwogICAgICBkYXBfb3V0W2RhcF9vbm9dID0gKERGSUxFICopIE5V TEw7CiAgICB9CiAgaWYgKCFmbmFtZSkKICAgIHsKICAgICAgZnB1dHMoIihvdXRzZXQpIG5vIGRh dGFzZXQgbmFtZS5cbiIsIGRhcF9lcnIpOwogICAgICBleGl0KDEpOwogICAgfQogIGlmICghb3V0 aW5pdCkKICAgIHsKICAgICAgb3V0aW5pdCA9IDE7CiAgICAgIHZhcmxpc3QgPSBkYXBfbWFsbG9j KGRhcF9saXN0bGVuLCAib3V0c2V0OiB2YXJsaXN0Iik7CiAgICAgIHZuYW1lID0gZGFwX21hbGxv YyhkYXBfbGlzdGxlbiwgIm91dHNldDogdm5hbWUiKTsKICAgIH0KICBpZiAoIShkYXBfb3V0W2Rh cF9vbm9dID0gZGZvcGVuKGZuYW1lLCAidyIpKSkKICAgIHsKICAgICAgZnByaW50ZihkYXBfZXJy LCAiKG91dHNldCkgQ2FuJ3Qgd3JpdGUgZGF0YSBzZXQ6ICVzXG4iLCBmbmFtZSk7CiAgICAgIGV4 aXQoMSk7CiAgICB9CiAgaWYgKCF2YXJsKQogICAgewogICAgICBmcHJpbnRmKGRhcF9lcnIsICIo b3V0c2V0ICglcykpIE1pc3NpbmcgdmFyaWFibGUgbGlzdC5cbiIsIGZuYW1lKTsKICAgICAgZXhp dCgxKTsKICAgIH0KICBmaXhsaXN0KHZhcmwsIHZhcmxpc3QpOwogIGlmICh2YXJsaXN0WzBdKQog ICAgewogICAgICBmb3IgKGwgPSAwOyB2YXJsaXN0W2xdID09ICcgJzsgbCsrKQoJOwogICAgICBp ZiAodmFybGlzdFtsXSA9PSAnIScpCS8qIGxpc3RpbmcgdmFyaWFibGVzIE5PVCB0byBpbmNsdWRl ICovCgl7CQkvKiBmaXJzdCBwdXQgdGhlbSBhbGwgaW4gKi8KCSAgZm9yIChsKys7IHZhcmxpc3Rb bF0gPT0gJyAnOyBsKyspCgkgICAgOwoJICBkYXBfb2JzW2RhcF9vbm9dLmRvX292YXIgPSBkYXBf b2JzW2RhcF9vbm9dLmRvX252YXI7CgkgIGZvciAodiA9IDA7IHYgPCBkYXBfb2JzW2RhcF9vbm9d LmRvX252YXI7IHYrKykKCSAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX291dFt2XSA9IHY7CgkgIHdo aWxlICh2YXJsaXN0W2xdKQkvKiB0aGVuIHRha2UgdGhlbSBvdXQgKi8KCSAgICB7CgkgICAgICBm b3IgKGkgPSAwOyB2YXJsaXN0W2wgKyBpXSAmJiB2YXJsaXN0W2wgKyBpXSAhPSAnICc7IGkrKykK CQl2bmFtZVtpXSA9IHZhcmxpc3RbbCArIGldOwoJICAgICAgdm5hbWVbaV0gPSAnXDAnOwoJICAg ICAgaWYgKCh3ID0gZGFwX3Zhcm51bSh2bmFtZSkpID49IDApCgkJewoJCSAgZm9yICh2ID0gMDsg diA8IGRhcF9vYnNbZGFwX29ub10uZG9fb3ZhcjsgdisrKQoJCSAgICB7CgkJICAgICAgaWYgKGRh cF9vYnNbZGFwX29ub10uZG9fb3V0W3ZdID09IHcpCgkJCWJyZWFrOwoJCSAgICB9CgkJICBpZiAo diA9PSBkYXBfb2JzW2RhcF9vbm9dLmRvX292YXIpCgkJICAgIHsKCQkgICAgICBmcHJpbnRmKGRh cF9lcnIsCgkJCSAgICAgICIob3V0c2V0ICglcykpIHZhcmlhYmxlIG5vdCBpbiBsaXN0IG9mIHZh cmlhYmxlcyB0byBleGNsdWRlOiAlc1xuIiwKCQkJICAgICAgZm5hbWUsIHZuYW1lKTsKCQkgICAg ICBleGl0KDEpOwoJCSAgICB9CgkJICB3aGlsZSAodiA8IGRhcF9vYnNbZGFwX29ub10uZG9fb3Zh ciAtIDEpCgkJICAgIHsKCQkgICAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX291dFt2XSA9CgkJCWRh cF9vYnNbZGFwX29ub10uZG9fb3V0W3YgKyAxXTsKCQkgICAgICB2Kys7CgkJICAgIH0KCQkgIGRh cF9vYnNbZGFwX29ub10uZG9fb3Zhci0tOwoJCX0KCSAgICAgIGVsc2UgaWYgKCh3ID0gZGFwX2Fy cm51bSh2bmFtZSwgJmRpbSkpID49IDApCgkJewoJCSAgZm9yICh2ID0gMDsgdiA8IGRhcF9vYnNb ZGFwX29ub10uZG9fb3ZhcjsgdisrKQoJCSAgICB7CgkJICAgICAgaWYgKGRhcF9vYnNbZGFwX29u b10uZG9fb3V0W3ZdID09IHcpCgkJCWJyZWFrOwoJCSAgICB9CgkJICB3aGlsZSAodiA8IGRhcF9v YnNbZGFwX29ub10uZG9fb3ZhciAtIGRpbSkKCQkgICAgewoJCSAgICAgIGRhcF9vYnNbZGFwX29u b10uZG9fb3V0W3ZdID0KCQkJZGFwX29ic1tkYXBfb25vXS5kb19vdXRbdiArIGRpbV07CgkJICAg ICAgdisrOwoJCSAgICB9CgkJICBkYXBfb2JzW2RhcF9vbm9dLmRvX292YXIgLT0gZGltOwoJCX0K CSAgICAgIGVsc2UKCQl7CgkJICBmcHJpbnRmKGRhcF9lcnIsICIob3V0c2V0KCVzKSkgdW5rbm93 biB2YXJpYWJsZTogJXNcbiIsCgkJCSAgZm5hbWUsIHZuYW1lKTsKCQkgIGV4aXQoMSk7CgkJfQoJ ICAgICAgbCArPSBpOwoJICAgICAgd2hpbGUgKHZhcmxpc3RbbF0gPT0gJyAnKQoJCWwrKzsKCSAg ICB9Cgl9CiAgICAgIGVsc2UKCXsKCSAgd2hpbGUgKHZhcmxpc3RbbF0pCgkgICAgewoJICAgICAg Zm9yIChpID0gMDsgdmFybGlzdFtsICsgaV0gJiYgdmFybGlzdFtsICsgaV0gIT0gJyAnOyBpKysp CgkJdm5hbWVbaV0gPSB2YXJsaXN0W2wgKyBpXTsKCSAgICAgIHZuYW1lW2ldID0gJ1wwJzsKCSAg ICAgIGlmICgodiA9IGRhcF92YXJudW0odm5hbWUpKSA+PSAwKQoJCWRhcF9vYnNbZGFwX29ub10u ZG9fb3V0W2RhcF9vYnNbZGFwX29ub10uZG9fb3ZhcisrXSA9IHY7CgkgICAgICBlbHNlIGlmICgo diA9IGRhcF9hcnJudW0odm5hbWUsICZkaW0pKSA+PSAwKQoJCXsKCQkgIGZvciAoZCA9IDA7IGQg PCBkaW07IGQrKykKCQkgICAgZGFwX29ic1tkYXBfb25vXS5kb19vdXRbZGFwX29ic1tkYXBfb25v XS5kb19vdmFyKytdID0gdiArIGQ7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgIGZwcmludGYoZGFw X2VyciwgIihvdXRzZXQoJXMpKSB1bmtub3duIHZhcmlhYmxlOiAlc1xuIiwKCQkJICBmbmFtZSwg dm5hbWUpOwoJCSAgZXhpdCgxKTsKCQl9CgkgICAgICBsICs9IGk7CgkgICAgICB3aGlsZSAodmFy bGlzdFtsXSA9PSAnICcpCgkJbCsrOwoJICAgIH0KCX0KICAgIH0KICBlbHNlCiAgICB7CiAgICAg IGRhcF9vYnNbZGFwX29ub10uZG9fb3ZhciA9IGRhcF9vYnNbZGFwX29ub10uZG9fbnZhcjsKICAg ICAgZm9yICh2ID0gMDsgdiA8IGRhcF9vYnNbZGFwX29ub10uZG9fbnZhcjsgdisrKQoJZGFwX29i c1tkYXBfb25vXS5kb19vdXRbdl0gPSB2OwogICAgfQogIGlmIChkYXBfdmFybnVtKCJfdHlwZV8i KSA8IDApCiAgICB7CiAgICAgIGZwcmludGYoZGFwX2VyciwgIihvdXRzZXQgKCVzKSkgbWlzc2lu ZyBfdHlwZV8gdmFyaWFibGVcbiIsIGZuYW1lKTsKICAgICAgZXhpdCgxKTsKICAgIH0KICBmb3Ig KHYgPSAwOyB2IDwgZGFwX29ic1tkYXBfb25vXS5kb19vdmFyOyB2KyspCiAgICB7CiAgICAgIGZv ciAodyA9IHYgKyAxOyB3IDwgZGFwX29ic1tkYXBfb25vXS5kb19vdmFyOyB3KyspCgl7CgkgIGlm IChkYXBfb2JzW2RhcF9vbm9dLmRvX291dFt2XSA9PSBkYXBfb2JzW2RhcF9vbm9dLmRvX291dFt3 XSkKCSAgICB7CgkgICAgICBmcHJpbnRmKGRhcF9lcnIsCgkJICAgICAgIihvdXRzZXQgKCVzKSkg ZHVwbGljYXRlIHZhcmlhYmxlIGluIG91dHB1dCBsaXN0OiAlc1xuIiwKCQkgICAgICBmbmFtZSwg ZGFwX29ic1tkYXBfb25vXS5kb19uYW1bZGFwX29ic1tkYXBfb25vXS5kb19vdXRbd11dKTsKCSAg ICAgIGV4aXQoMSk7CgkgICAgfQoJfQogICAgfQogIGZvciAodiA9IDAsIGZpcnN0ID0gMTsgdiA8 IGRhcF9vYnNbZGFwX29ub10uZG9fb3ZhcjsgdisrKQogICAgewogICAgICBpZiAoIWZpcnN0KQoJ ZGFwX3B1dGMoJyAnLCBkYXBfb3V0W2RhcF9vbm9dKTsKICAgICAgZHB1dHMoZGFwX29ic1tkYXBf b25vXS5kb19uYW1bZGFwX29ic1tkYXBfb25vXS5kb19vdXRbdl1dLCAiICIsIGRhcF9vdXRbZGFw X29ub10pOwogICAgICBkcHV0aShkYXBfb2JzW2RhcF9vbm9dLmRvX2xlbltkYXBfb2JzW2RhcF9v bm9dLmRvX291dFt2XV0sIGRhcF9vdXRbZGFwX29ub10pOwogICAgICBmaXJzdCA9IDA7CiAgICB9 CiAgZGFwX3B1dGMoJ1xuJywgZGFwX291dFtkYXBfb25vXSk7CiAgZGZsdXNoKGRhcF9vdXRbZGFw X29ub10pOwogIG91dGxpbmUgPSAwOwp9CgovKiB3cml0ZSBhIGxpbmUgdG8gdGhlIG91dHB1dCBk YXRhc2V0ICovCnZvaWQgb3V0cHV0KCkKewogIGludCB2OwogIGludCBmaXJzdDsKCiAgaWYgKCh2 ID0gZGFwX3Zhcm51bSgiX3R5cGVfIikpIDwgMCkKICAgIHsKICAgICAgZnByaW50ZihkYXBfZXJy LCAiKG91dHB1dCkgbWlzc2luZyBfdHlwZV8gdmFyaWFibGVcbiIpOwogICAgICBleGl0KDEpOwog ICAgfQogIGZvciAodiA9IDAsIGZpcnN0ID0gMTsgdiA8IGRhcF9vYnNbZGFwX29ub10uZG9fb3Zh cjsgdisrKQogICAgewogICAgICBpZiAoIWZpcnN0KQoJZGFwX3B1dGMoU0VUREVMSU0sIGRhcF9v dXRbZGFwX29ub10pOwogICAgICBpZiAoZGFwX29ic1tkYXBfb25vXS5kb19sZW5bZGFwX29ic1tk YXBfb25vXS5kb19vdXRbdl1dID09IElOVCkKCXsKCSAgLyogaWYgd2UncmUgaW4gYW4gaW5maWxl IHN0YXRlbWVudCwgbWF5IG5lZWQgdG8gdXBkYXRlIHRoZSB2YWx1ZQoJICAgKiBmcm9tIHRoZSB2 YWx1ZSBpbiB0aGUgdXNlcidzIHByb2dyYW0KCSAgICovCgkgIGlmICghZGFwX29ubyAmJiBkYXBf b2JzW2RhcF9vbm9dLmRvX2lsW2RhcF9vYnNbMF0uZG9fb3V0W3ZdXSkKCSAgICBkYXBfb2JzWzBd LmRvX2ludFtkYXBfb2JzWzBdLmRvX291dFt2XV0gPQoJICAgICAgKmRhcF9vYnNbZGFwX29ub10u ZG9faWxbZGFwX29ic1swXS5kb19vdXRbdl1dOwoJICBkYXBfcHV0aW50KGRhcF9vYnNbZGFwX29u b10uZG9faW50W2RhcF9vYnNbZGFwX29ub10uZG9fb3V0W3ZdXSwKCQkgICAgIGRhcF9vdXRbZGFw X29ub10pOwoJfQogICAgICBlbHNlIGlmIChkYXBfb2JzW2RhcF9vbm9dLmRvX2xlbltkYXBfb2Jz W2RhcF9vbm9dLmRvX291dFt2XV0gPT0gREJMKQoJewoJICAvKiBpZiB3ZSdyZSBpbiBhbiBpbmZp bGUgc3RhdGVtZW50LCBtYXkgbmVlZCB0byB1cGRhdGUgdGhlIHZhbHVlCgkgICAqIGZyb20gdGhl IHZhbHVlIGluIHRoZSB1c2VyJ3MgcHJvZ3JhbQoJICAgKi8KCSAgaWYgKCFkYXBfb25vICYmIGRh cF9vYnNbZGFwX29ub10uZG9fZGxbZGFwX29ic1swXS5kb19vdXRbdl1dKQoJICAgIGRhcF9vYnNb MF0uZG9fZGJsW2RhcF9vYnNbMF0uZG9fb3V0W3ZdXSA9CgkgICAgICAqZGFwX29ic1tkYXBfb25v XS5kb19kbFtkYXBfb2JzWzBdLmRvX291dFt2XV07CgkgIGRhcF9kb3VibGUgPSBkYXBfb2JzW2Rh cF9vbm9dLmRvX2RibFtkYXBfb2JzW2RhcF9vbm9dLmRvX291dFt2XV07CgkgIGRhcF9wdXRkb3Vi bGUoZGFwX291dFtkYXBfb25vXSk7Cgl9CiAgICAgIGVsc2UKCXsKCSAgZHB1dHMoZGFwX29ic1tk YXBfb25vXS5kb19zdHJbZGFwX29ic1tkYXBfb25vXS5kb19vdXRbdl1dLCAiIiwKCQlkYXBfb3V0 W2RhcF9vbm9dKTsKCX0KICAgICAgZmlyc3QgPSAwOwogICAgfQogIGRhcF9wdXRjKCdcbicsIGRh cF9vdXRbZGFwX29ub10pOwogIGRmbHVzaChkYXBfb3V0W2RhcF9vbm9dKTsKICBpZiAoZGFwX291 dHJlcG9ydCAmJiAhKCsrb3V0bGluZSAlIGRhcF9vdXRyZXBvcnQpKQogICAgewogICAgICBmcHJp bnRmKHN0ZGVyciwgIihvdXRwdXQpICVkIGxpbmVzIHdyaXR0ZW4gdG8gJXMuLi5cbiIsCgkgICAg ICBvdXRsaW5lLCBkYXBfb3V0W2RhcF9vbm9dLT5kZmlsZV9uYW1lKTsKICAgICAgZmZsdXNoKHN0 ZGVycik7CiAgICB9Cn0KCi8qIEV4cGFuZHMgYXJyYXkgdmFyaWFibGVzIGluIHZhcmxpc3QgYW5k IHJlY29yZHMgdGhlaXIgaW5kZXhlcyBpbiB2YXJ2CiAqIFJldHVybnMgbnVtYmVyIG9mIHZhcmlh YmxlcyBmb3IgaW5jbHVzaW9uIG9yIG5lZ2F0aXZlIG51bWJlciBvZiB2YXJpYWJsZXMKICogZm9y IGV4Y2x1c2lvbi4KICovCnN0YXRpYyBpbnQgZXhwYW5kKGNoYXIgKnZhcmxpc3QsIGludCAqdmFy diwgaW50IG1heHZhcnMpCnsKICBpbnQgbnZhcnM7CiAgaW50IG07CiAgaW50IGk7CiAgY2hhciAq bW5hbWU7CiAgY2hhciAqbmV3bmFtZTsKICBpbnQgYXJybjsJCS8qIHZhciBpbmRleCBvZiBhcnJh eSdzIGZpcnN0IGVsZW1lbnQgKi8KICBpbnQgZGltOwkJLyogYXJyYXkgZGltZW5zaW9uICovCiAg aW50IGQ7CQkJLyogaW5kZXggdG8gYXJyYXkgKi8KICBpbnQgaW5jbHVkZTsJCS8qIHZhcmlhYmxl cyB0byBiZSBpbmNsdWRlZD8gKHJhdGhlciB0aGFuIGV4Y2x1ZGVkKSAqLwoKICBpZiAoIXZhcmxp c3QpCiAgICByZXR1cm4gMDsKICBpZiAoIXZhcnYpCiAgICB7CiAgICAgIGZwdXRzKCIoZXhwYW5k KSBNaXNzaW5nIHZhcmlhYmxlIGluZGV4IGxpc3QuXG4iLCBkYXBfZXJyKTsKICAgICAgZXhpdCgx KTsKICAgIH0KICBtbmFtZSA9IGRhcF9tYWxsb2Moc3RybGVuKHZhcmxpc3QpICsgMSwgImV4cGFu ZDogbW5hbWUiKTsKICBuZXduYW1lID0gZGFwX21hbGxvYyhzdHJsZW4odmFybGlzdCkgKyAxLCAi ZXhwYW5kOiBuZXduYW1lIik7CiAgaW5jbHVkZSA9IDE7CiAgZm9yIChtID0gMDsgdmFybGlzdFtt XSA9PSAnICc7IG0rKykKICAgIDsKICBpZiAodmFybGlzdFttXSA9PSAnIScpCS8qIGluZGljYXRl cyB2YXJpYWJsZXMgdG8gZXhjbHVkZSwgbm90IGluY2x1ZGUgKi8KICAgIHsKICAgICAgZm9yICht Kys7IHZhcmxpc3RbbV0gPT0gJyAnOyBtKyspCgk7CiAgICAgIGluY2x1ZGUgPSAtMTsKICAgIH0K ICBmb3IgKG52YXJzID0gMDsgdmFybGlzdFttXTsgKQogICAgewogICAgICBmb3IgKGkgPSAwOyB2 YXJsaXN0W20gKyBpXSAmJiB2YXJsaXN0W20gKyBpXSAhPSAnICcgJiYgdmFybGlzdFttICsgaV0g IT0gJz4nOyBpKyspCgltbmFtZVtpXSA9IHZhcmxpc3RbbSArIGldOwogICAgICBtbmFtZVtpXSA9 ICdcMCc7CiAgICAgIG0gKz0gaTsKICAgICAgd2hpbGUgKHZhcmxpc3RbbV0gPT0gJyAnKQoJbSsr OwogICAgICBuZXduYW1lWzBdID0gJ1wwJzsKICAgICAgaWYgKHZhcmxpc3RbbV0gPT0gJz4nKQoJ ewoJICBpZiAoaW5jbHVkZSA8IDApCgkgICAgewoJICAgICAgZnB1dHMoIihleHBhbmQpIENhbid0 IHJlbmFtZSB2YXJpYWJsZXMgYmVpbmcgZXhjbHVkZWRcbiIsIGRhcF9lcnIpOwoJICAgICAgZXhp dCgxKTsKCSAgICB9CgkgIGZvciAobSsrOyB2YXJsaXN0W21dID09ICcgJzsgbSsrKQoJICAgIDsK CSAgZm9yIChpID0gMDsgdmFybGlzdFttICsgaV0gJiYgdmFybGlzdFttICsgaV0gIT0gJyAnICYm IHZhcmxpc3RbbSArIGldICE9ICc+JzsKCSAgICAgICBpKyspCgkgICAgbmV3bmFtZVtpXSA9IHZh cmxpc3RbbSArIGldOwoJICBuZXduYW1lW2ldID0gJ1wwJzsKCSAgbSArPSBpOwoJICB3aGlsZSAo dmFybGlzdFttXSA9PSAnICcpCgkgICAgbSsrOwoJfQogICAgICBpZiAobnZhcnMgPj0gbWF4dmFy cykKCXsKCSAgZnByaW50ZihkYXBfZXJyLCAiKGV4cGFuZCkgTW9yZSB0aGFuICVkIHZhcmlhYmxl czogJXNcbiIsIG1heHZhcnMsIHZhcmxpc3QpOwoJICBleGl0KDEpOwoJfQogICAgICBpZiAoKGFy cm4gPSBkYXBfYXJybnVtKG1uYW1lLCAmZGltKSkgPj0gMCkKCXsKCSAgZm9yIChkID0gMDsgZCA8 IGRpbTsgZCsrKQoJICAgIHsKCSAgICAgIGlmIChuZXduYW1lWzBdKQoJCXsKCQkgIGRhcF9mcmVl KGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW2Fycm5dLAoJCQkgICAiZXhwYW5kOiBkYXBfb2JzW2Rh cF9vbm9dLmRvX25hbVthcnJuXSIpOwoJCSAgZGFwX29ic1tkYXBfb25vXS5kb19uYW1bYXJybl0g PQoJCSAgICBkYXBfbWFsbG9jKHN0cmxlbihuZXduYW1lKSArIDYsCgkJCSAgICAgICAiZXhwYW5k OiBkYXBfb2JzW2RhcF9vbm9dLmRvX25hbVthcnJuXSIpOwoJCSAgc3ByaW50ZihkYXBfb2JzW2Rh cF9vbm9dLmRvX25hbVthcnJuXSwKCQkJICAiJXNbJWRdIiwgbmV3bmFtZSwgZCk7CgkJfQoJICAg ICAgdmFydltudmFycysrXSA9IGFycm4rKzsKCSAgICB9Cgl9CiAgICAgIGVsc2UgaWYgKCh2YXJ2 W252YXJzXSA9IGRhcF92YXJudW0obW5hbWUpKSA+IDApCgl7CgkgIGlmIChuZXduYW1lWzBdKQoJ ICAgIHsKCSAgICAgIGRhcF9mcmVlKGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW3ZhcnZbbnZhcnNd XSwKCQkgICAgICAgImV4cGFuZDogZGFwX29ic1tkYXBfb25vXS5kb19uYW1bdmFydltudmFyc11d Iik7CgkgICAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX25hbVt2YXJ2W252YXJzXV0gPQoJCWRhcF9t YWxsb2Moc3RybGVuKG5ld25hbWUpICsgMSwKCQkJICAgImV4cGFuZDogZGFwX29ic1tkYXBfb25v XS5kb19uYW1bdmFydltudmFyc11dIik7CgkgICAgICBzdHJjcHkoZGFwX29ic1tkYXBfb25vXS5k b19uYW1bdmFydltudmFyc11dLCBuZXduYW1lKTsKCSAgICB9CgkgIG52YXJzKys7Cgl9CiAgICAg IGVsc2UKCXsKCSAgZnByaW50ZihkYXBfZXJyLCAiKGV4cGFuZCkgVmFyaWFibGUgdW5rbm93bjog JXNcbiIsIG1uYW1lKTsKCSAgZXhpdCgxKTsKCX0KICAgIH0KICBkYXBfZnJlZShtbmFtZSwgImV4 cGFuZDogbW5hbWUiKTsKICBkYXBfZnJlZShuZXduYW1lLCAiZXhwYW5kOiBuZXduYW1lIik7CiAg cmV0dXJuIGluY2x1ZGUgKiBudmFyczsKfQoKc3RhdGljIHZvaWQgdmFyY2F0KGNoYXIgKnRvLCBj aGFyICpmcm9tKQp7CiAgaW50IHQsIGYsIGZmOwoKICBmb3IgKGYgPSAwOyBmcm9tW2ZdID09ICcg JzsgZisrKQogICAgOwogIGZvciAodCA9IDA7IHRvW3RdOyB0KyspCiAgICA7CiAgd2hpbGUgKGZy b21bZl0pCiAgICB7CiAgICAgIGZvciAoZmYgPSBmOyBmcm9tW2ZmXSAmJiBmcm9tW2ZmXSAhPSAn ICcgJiYgZnJvbVtmZl0gIT0gJz4nOyBmZisrKQoJOwogICAgICB3aGlsZSAoZnJvbVtmZl0gPT0g JyAnKQoJZmYrKzsKICAgICAgaWYgKGZyb21bZmZdID09ICc+JykKCXsKCSAgZm9yIChmID0gZmYg KyAxOyBmcm9tW2ZdID09ICcgJzsgZisrKQoJICAgIDsKCX0KICAgICAgd2hpbGUgKGZyb21bZl0g JiYgZnJvbVtmXSAhPSAnICcpCgl0b1t0KytdID0gZnJvbVtmKytdOwogICAgICB0b1t0KytdID0g JyAnOwogICAgICB3aGlsZSAoZnJvbVtmXSA9PSAnICcpCglmKys7CiAgICB9CiAgdG9bdF0gPSAn XDAnOwp9CgovKiBPbmUtdG8tb25lIG9yIG1hbnktdG8tb25lIG1lcmdlIG9mIGRhdGFzZXQgbGlu ZXMKICogZm5hbWUxLCBmbmFtZTIgPSBkYXRhc2V0cyB0byBtZXJnZQogKiB2YXJzMSwgdmFyczIg PSBsaXN0cyBvZiB2YXJpYWJsZXMgdG8gaW5jbHVkZSBmcm9tIGVhY2ggZGF0YXNldAogKiBtYXJr cyA9IHBhcnRpdGlvbmluZyB2YXJpYWJsZXMgdG8gY29vcmRpbmF0ZSBtZXJnZQogKiBvdXRuYW1l ID0gb3V0cHV0IGRhdGFzZXQKICovCnZvaWQgbWVyZ2UoY2hhciAqZm5hbWUxLCBjaGFyICp2YXJz MSwgY2hhciAqZm5hbWUyLCBjaGFyICp2YXJzMiwKCSAgIGNoYXIgKm1hcmtzLCBjaGFyICpvdXRu YW1lKQp7CiAgaW50ICp2YXJ2MSwgKnZhcnYyOwkvKiBpbmRleGVzIG9mIHZhcmlhYmxlcyBsaXN0 ZWQgaW4gdmFyczEsIHZhcnMyICovCiAgaW50ICpvdmFydjEsICpvdmFydjI7CS8qIGluZGV4ZXMg b2YgdmFyaWFibGVzIHRvIHVzZSBmcm9tIGZuYW1lMSwgZm5hbWUyICovCiAgaW50IG52YXIxLCBu dmFyMjsJLyogbnVtYmVyIG9mIHZhcnMgaW4gdmFyczEsIHZhcnMyIGV4Y2VwdCBpZiBleGNsdWRp bmcsCgkJCSAqIGl0J3MgdGhlIG5lZ2F0aXZlCgkJCSAqLwogIGludCAqbWFya3YxOwkJLyogaW5k ZXhlcyBvZiBwYXJ0aXRpb25pbmcgdmFyaWFibGVzIGluIGZuYW1lMSAqLwogIGludCAqbWFya3Yy OwkJLyogaW5kZXhlcyBvZiBwYXJ0aXRpb25pbmcgdmFyaWFibGVzIGluIGZuYW1lMiAqLwogIGlu dCBubWFyazsJCS8qIG51bWJlciBvZiBwYXJ0aXRpb25pbmcgdmFyaWFibGVzICovCiAgaW50IHYx LCB2MjsJCS8qIGluZGV4ZXMgdG8gdmFyaWFibGUgaW5kZXggbGlzdHMgKi8KICBpbnQgdnYxLCB2 djI7CQkvKiBtb3JlIGluZGV4ZXMgdG8gdmFyaWFibGUgaW5kZXggbGlzdHMgKi8KICBjaGFyICpv dXRsaXN0OwkJLyogbGlzdCBvZiB2YXJpYWJsZXMgdG8gYXBwZWFyIGluIGZpbmFsIG91dHB1dCAq LwogIGNoYXIgKm91dGxpc3QxOwkJLyogbGlzdCBvZiB2YXJpYWJsZXMgdG8gdXNlIGZyb20gZm5h bWUxICovCiAgY2hhciAqb3V0bGlzdDI7CQkvKiBsaXN0IG9mIHZhcmlhYmxlcyB0byB1c2UgZnJv bSBmbmFtZTIgKi8KICBpbnQgZ29vbjE7CiAgZG91YmxlIGRkaWZmOwogIGludCBpc2RpZmY7CiAg aW50IHZhcnMxbnVsbCwgdmFyczJudWxsOwkvKiB2YXJzMSwgdmFyczIgPSBOVUxMPyAqLwogIGNo YXIgKnZhcnMxYSwgKnZhcnMyYTsJLyogT0ssIGF3ZnVsIHBhdGNoOiBpZiB2YXJzMSBhbmQvb3Ig dmFyczIgYXJlIGV4Y2x1c2lvbnMKCQkJCSAqIHdpdGggJyEnLCB0aGVuIGhhdmUgdG8gY3JlYXRl IGxpc3RzIGFydGlmaWNpYWxseSBvZgoJCQkJICogdmFyaWFibGVzIHRoYXQgYXJlIG5vdCB0byBi ZSBleGNsdWRlZC4KCQkJCSAqLwogIGludCBleGNsdWRlMSwgZXhjbHVkZTI7CS8qIHZhcnMxLCB2 YXJzMiBleGNsdXNpb24gbGlzdHM/ICovCiAgaW50IG52YXIxYSwgbnZhcjJhOwkvKiB2YXJpYWJs ZSBjb3VudHMgaW4gY2FzZSBvZiBleGNsdXNpb24gKi8KICBpbnQgKnZhcnYxYSwgKnZhcnYyYTsJ LyogaW5kZXggbGlzdHMgZm9yIHZhcmlhYmxlcyB0byBpbmNsdWRlICovCgogIGlmICghZm5hbWUx IHx8ICFmbmFtZTIgfHwgIW91dG5hbWUpCiAgICB7CiAgICAgIGZwdXRzKCIobWVyZ2UpIE1pc3Np bmcgZGF0YXNldCBuYW1lLlxuIiwgZGFwX2Vycik7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgaWYg KHZhcnMxICYmIGluZGV4KHZhcnMxLCAnWycpKQogICAgewogICAgICBmcHJpbnRmKGRhcF9lcnIs CgkgICAgICAiKG1lcmdlKSBWYXJpYWJsZSBsaXN0cyBtYXkgbm90IGNvbnRhaW4gaW5kaXZpZHVh bCBhcnJheSBlbGVtZW50czogJXNcbiIsCgkgICAgICB2YXJzMSk7CiAgICAgIGV4aXQoMSk7CiAg ICB9CiAgaWYgKHZhcnMyICYmIGluZGV4KHZhcnMyLCAnWycpKQogICAgewogICAgICBmcHJpbnRm KGRhcF9lcnIsCgkgICAgICAiKG1lcmdlKSBWYXJpYWJsZSBsaXN0cyBtYXkgbm90IGNvbnRhaW4g aW5kaXZpZHVhbCBhcnJheSBlbGVtZW50czogJXNcbiIsCgkgICAgICB2YXJzMik7CiAgICAgIGV4 aXQoMSk7CiAgICB9CiAgdmFyczFudWxsID0gMDsJLyogbm9uLU5VTEwgdW50aWwgcHJvdmVuIE5V TEwgKi8KICB2YXJzMm51bGwgPSAwOwogIG91dGxpc3QgPSBkYXBfbWFsbG9jKGRhcF9saXN0bGVu LCAibWVyZ2U6IG91dGxpc3QiKTsKICBvdXRsaXN0MSA9IGRhcF9tYWxsb2MoZGFwX2xpc3RsZW4s ICJtZXJnZTogb3V0bGlzdDEiKTsKICBvdXRsaXN0MiA9IGRhcF9tYWxsb2MoZGFwX2xpc3RsZW4s ICJtZXJnZTpvdXRsaXN0MiIpOwogIHZhcnYxID0gKGludCAqKSBkYXBfbWFsbG9jKHNpemVvZihp bnQpICogZGFwX21heHZhciwgIm1lcmdlOiB2YXJ2MSIpOwogIHZhcnYyID0gKGludCAqKSBkYXBf bWFsbG9jKHNpemVvZihpbnQpICogZGFwX21heHZhciwgIm1lcmdlOiB2YXJ2MiIpOwogIG92YXJ2 MSA9IChpbnQgKikgZGFwX21hbGxvYyhzaXplb2YoaW50KSAqIGRhcF9tYXh2YXIsICJtZXJnZTog b3ZhcnYxIik7CiAgb3ZhcnYyID0gKGludCAqKSBkYXBfbWFsbG9jKHNpemVvZihpbnQpICogZGFw X21heHZhciwgIm1lcmdlOiBvdmFydjIiKTsKICBtYXJrdjEgPSAoaW50ICopIGRhcF9tYWxsb2Mo c2l6ZW9mKGludCkgKiBkYXBfbWF4dmFyLCAibWVyZ2U6IG1hcmt2MSIpOwogIG1hcmt2MiA9IChp bnQgKikgZGFwX21hbGxvYyhzaXplb2YoaW50KSAqIGRhcF9tYXh2YXIsICJtZXJnZTogbWFya3Yy Iik7CiAgZGFwX29ubyA9IDA7CS8qIHRha2Ugbm8gY2hhbmNlcyEgKi8KICBpbnNldChmbmFtZTEp OwkvKiBzZXQgdXAgaW5wdXQgZnJvbSBkYXRhc2V0IDEgKi8KICBpZiAodmFyczEgJiYgIXZhcnMx WzBdKQkJLyogdmFyczEgbnVsbCBzdHJpbmc6IHVzZSBhbGwgdmFyaWFibGVzICovCiAgICB7CiAg ICAgIHZhcnMxbnVsbCA9IDE7CiAgICAgIC8qIGluIHRoaXMgY2FzZSwgbmVlZCB0byBtYWtlIG91 ciBvd24gdmFyczEgbGlzdCAqLwogICAgICB2YXJzMSA9IGRhcF9tYWxsb2MoZGFwX2xpc3RsZW4s ICJtZXJnZTogdmFyczEiKTsKICAgICAgdmFyczFbMF0gPSAnXDAnOwogICAgICBmb3IgKHYxID0g MDsgdjEgPCBkYXBfb2JzW2RhcF9vbm9dLmRvX252YXI7IHYxKyspCgl7CQkvKiBjb3B5IGFsbCB2 YXJzIGV4Y2VwdCBfdHlwZV8gKi8KCSAgaWYgKHN0cmNtcChkYXBfb2JzW2RhcF9vbm9dLmRvX25h bVt2MV0sICJfdHlwZV8iKSkKCSAgICB7CgkgICAgICBzdHJjYXQodmFyczEsICIgIik7CgkgICAg ICBzdHJjYXQodmFyczEsIGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW3YxXSk7CgkgICAgfQoJfQog ICAgfQogIG52YXIxID0gZXhwYW5kKHZhcnMxLCB2YXJ2MSwgZGFwX21heHZhcik7CiAgZXhjbHVk ZTEgPSAwOwogIGlmIChudmFyMSA8IDApCS8qIE9LLCBoZXJlIHdlIGdvOiB2YXJpYWJsZXMgbGlz dGVkIGZvciBleGNsdXNpb24gKi8KICAgIHsKICAgICAgZXhjbHVkZTEgPSAxOwogICAgICBudmFy MSA9IC1udmFyMTsKICAgICAgdmFyczFhID0gZGFwX21hbGxvYyhkYXBfbGlzdGxlbiwgIm1lcmdl OiB2YXJzMWEiKTsKICAgICAgdmFyczFhWzBdID0gJ1wwJzsKICAgICAgdmFydjFhID0gKGludCAq KSBkYXBfbWFsbG9jKGRhcF9tYXh2YXIsICJtZXJnZTogdmFydjFhIik7CiAgICAgIGZvciAodjEg PSAwLCBudmFyMWEgPSAwOyB2MSA8IGRhcF9vYnNbZGFwX29ub10uZG9fbnZhcjsgdjErKykKCXsJ LyogY29weSBhbGwgdmFycyBleGNlcHQgX3R5cGVfIGFuZCBleGNsdWRlZCB2YXJzICovCgkgIGlm ICghc3RyY21wKGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW3YxXSwgIl90eXBlXyIpKQoJICAgIGNv bnRpbnVlOwoJICBmb3IgKHZ2MSA9IDA7IHZ2MSA8IG52YXIxOyB2djErKykKCSAgICB7CS8qIGxv b2sgdG8gc2VlIGlmIGV4Y2x1ZGVkICovCgkgICAgICBpZiAodmFydjFbdnYxXSA9PSB2MSkKCQli cmVhazsKCSAgICB9CgkgIGlmICh2djEgPT0gbnZhcjEpCS8qIG5vdCBmb3VuZCwgaW5jbHVkZSBp dCAqLwoJICAgIHsKCSAgICAgIHN0cmNhdCh2YXJzMWEsICIgIik7CgkgICAgICBzdHJjYXQodmFy czFhLCBkYXBfb2JzW2RhcF9vbm9dLmRvX25hbVt2MV0pOwoJICAgICAgdmFydjFhW252YXIxYSsr XSA9IHYxOwoJICAgIH0KCX0KICAgICAgaWYgKHZhcnMxbnVsbCkKCWRhcF9mcmVlKHZhcnMxLCAi bWVyZ2U6IHZhcnMxIik7CiAgICAgIHZhcnMxID0gdmFyczFhOwkvKiByZWFzc2lnbiBsaXN0OyB0 aGlzIHdvbid0IGhhcHBlbiBpZiB2YXJzMSB3YXMgTlVMTCAqLwogICAgICBudmFyMSA9IG52YXIx YTsKICAgICAgZGFwX2ZyZWUodmFydjEsICJtZXJnZTogdmFydjEiKTsKICAgICAgdmFydjEgPSB2 YXJ2MWE7CiAgICB9CiAgaWYgKG1hcmtzKQogICAgbm1hcmsgPSBkYXBfbGlzdChtYXJrcywgbWFy a3YxLCBkYXBfbWF4dmFyKTsKICBlbHNlCiAgICBubWFyayA9IDA7CiAgZGFwX29ubyA9IDE7CiAg aW5zZXQoZm5hbWUyKTsJLyogc2V0IHVwIGlucHV0IGZyb20gZGF0YXNldCAyICovCiAgaWYgKHZh cnMyICYmICF2YXJzMlswXSkJCS8qIHZhcnMyIG51bGwgc3RyaW5nOiB1c2UgYWxsIHZhcmlhYmxl cyAqLwogICAgewogICAgICB2YXJzMm51bGwgPSAxOwogICAgICAvKiBpbiB0aGlzIGNhc2UsIG5l ZWQgdG8gbWFrZSBvdXIgb3duIHZhcnMyIGxpc3QgKi8KICAgICAgdmFyczIgPSBkYXBfbWFsbG9j KGRhcF9saXN0bGVuLCAibWVyZ2U6IHZhcnMyIik7CiAgICAgIHZhcnMyWzBdID0gJ1wwJzsKICAg ICAgZm9yICh2MiA9IDA7IHYyIDwgZGFwX29ic1tkYXBfb25vXS5kb19udmFyOyB2MisrKQoJewoJ ICBpZiAoc3RyY21wKGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW3YyXSwgIl90eXBlXyIpKQoJICAg IHsJLyogY29weSBhbGwgdmFycyBleGNlcHQgX3R5cGVfICovCgkgICAgICBzdHJjYXQodmFyczIs ICIgIik7CgkgICAgICBzdHJjYXQodmFyczIsIGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW3YyXSk7 CgkgICAgfQoJfQogICAgfQogIG52YXIyID0gZXhwYW5kKHZhcnMyLCB2YXJ2MiwgZGFwX21heHZh cik7CiAgZXhjbHVkZTIgPSAwOwogIGlmIChudmFyMiA8IDApCS8qIE9LLCBoZXJlIHdlIGdvOiB2 YXJpYWJsZXMgbGlzdGVkIGZvciBleGNsdXNpb24gKi8KICAgIHsKICAgICAgZXhjbHVkZTIgPSAx OwogICAgICBudmFyMiA9IC1udmFyMjsKICAgICAgdmFyczJhID0gZGFwX21hbGxvYyhkYXBfbGlz dGxlbiwgIm1lcmdlOiB2YXJzMmEiKTsKICAgICAgdmFyczJhWzBdID0gJ1wwJzsKICAgICAgdmFy djJhID0gKGludCAqKSBkYXBfbWFsbG9jKGRhcF9tYXh2YXIsICJtZXJnZTogdmFydjJhIik7CiAg ICAgIGZvciAodjIgPSAwLCBudmFyMmEgPSAwOyB2MiA8IGRhcF9vYnNbZGFwX29ub10uZG9fbnZh cjsgdjIrKykKCXsJLyogY29weSBhbGwgdmFycyBleGNlcHQgX3R5cGVfIGFuZCBleGNsdWRlZCB2 YXJzICovCgkgIGlmICghc3RyY21wKGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW3YyXSwgIl90eXBl XyIpKQoJICAgIGNvbnRpbnVlOwoJICBmb3IgKHZ2MiA9IDA7IHZ2MiA8IG52YXIyOyB2djIrKykK CSAgICB7CS8qIGxvb2sgdG8gc2VlIGlmIGV4Y2x1ZGVkICovCgkgICAgICBpZiAodmFydjJbdnYy XSA9PSB2MikKCQlicmVhazsKCSAgICB9CgkgIGlmICh2djIgPT0gbnZhcjIpCS8qIG5vdCBmb3Vu ZCwgaW5jbHVkZSBpdCAqLwoJICAgIHsKCSAgICAgIHN0cmNhdCh2YXJzMmEsICIgIik7CgkgICAg ICBzdHJjYXQodmFyczJhLCBkYXBfb2JzW2RhcF9vbm9dLmRvX25hbVt2Ml0pOwoJICAgICAgdmFy djJhW252YXIyYSsrXSA9IHYyOwoJICAgIH0KCX0KICAgICAgaWYgKHZhcnMybnVsbCkKCWRhcF9m cmVlKHZhcnMyLCAibWVyZ2U6IHZhcnMyIik7CiAgICAgIHZhcnMyID0gdmFyczJhOwkvKiByZWFz c2lnbiBsaXN0OyB0aGlzIHdvbid0IGhhcHBlbiBpZiB2YXJzMiB3YXMgTlVMTCAqLwogICAgICBu dmFyMiA9IG52YXIyYTsKICAgICAgZGFwX2ZyZWUodmFydjIsICJtZXJnZTogdmFydjIiKTsKICAg ICAgdmFydjIgPSB2YXJ2MmE7CiAgICB9CiAgZGFwX2xpc3QobWFya3MsIG1hcmt2MiwgZGFwX21h eHZhcik7CiAgZm9yICh2MSA9IDA7IHYxIDwgbm1hcms7IHYxKyspCS8qIGNoZWNrIHR5cGVzIG9m IHBhcnQgdmFycyBhY3Jvc3MgZGF0YXNldHMgKi8KICAgIHsKICAgICAgaWYgKGRhcF9vYnNbMF0u ZG9fbGVuW21hcmt2MVt2MV1dICE9IGRhcF9vYnNbMV0uZG9fbGVuW21hcmt2Mlt2MV1dKQoJewoJ ICBmcHJpbnRmKGRhcF9lcnIsCgkJICAiKG1lcmdlKSBQYXJ0IHZhcmlhYmxlcyBvZiBkaWZmZXJl bnQgdHlwZXM6ICVzICglZCkgYW5kICVzICglZClcbiIsCgkJICBkYXBfb2JzWzBdLmRvX25hbVtt YXJrdjFbdjFdXSwgZGFwX29ic1swXS5kb19sZW5bbWFya3YxW3YxXV0sCgkJICBkYXBfb2JzWzFd LmRvX25hbVttYXJrdjJbdjFdXSwgZGFwX29ic1sxXS5kb19sZW5bbWFya3YyW3YxXV0pOwoJICBl eGl0KDEpOwoJfQogICAgfQogIC8qIFN0YXJ0IGFzc2VtYmxpbmcgbGlzdCBvZiBvdXRwdXQgdmFy aWFibGVzLiAqLwogIG91dGxpc3RbMF0gPSAnXDAnOwogIGlmICh2YXJzMiAmJiBudmFyMiA+IDAp CiAgICB2YXJjYXQob3V0bGlzdCwgdmFyczIpOwogIG91dGxpc3QyWzBdID0gJ1wwJzsKICBpZiAo dmFyczIgJiYgbnZhcjIgPiAwKQogICAgdmFyY2F0KG91dGxpc3QyLCB2YXJzMik7CiAgZGFwX29u byA9IDI7CQkvKiB0aGUgb3V0cHV0IGRhdGFzZXQgKi8KICBkYXBfb2JzWzJdLmRvX252YXIgPSAw OwkvKiBzdGFydCB3aXRoIG5vdGhpbmcgKi8KICBkYXBfb2JzWzJdLmRvX292YXIgPSAwOwkvKiBl eGNlcHQgX3R5cGVfICovCiAgZGFwX29ic1syXS5kb19vdXRbZGFwX29ic1syXS5kb19vdmFyKytd ID0gZGFwX3ZkKCJfdHlwZV8gOCIsIDApOwogIGZvciAodjIgPSAwOyB2MiA8IG52YXIyOyB2Misr KQogICAgewogICAgICBpZiAoZGFwX29ic1syXS5kb19uYW1bZGFwX29ic1syXS5kb19udmFyXSkK CWRhcF9mcmVlKGRhcF9vYnNbMl0uZG9fbmFtW2RhcF9vYnNbMl0uZG9fbnZhcl0sCgkJICJtZXJn ZTogZGFwX29ic1syXS5kb19uYW1bZGFwX29ic1syXS5kb19udmFyXSIpOwogICAgICBkYXBfb2Jz WzJdLmRvX25hbVtkYXBfb2JzWzJdLmRvX252YXJdID0KCWRhcF9tYWxsb2Moc3RybGVuKGRhcF9v YnNbMV0uZG9fbmFtW3ZhcnYyW3YyXV0pICsgMSwKCQkgICAibWVyZ2U6IGRhcF9vYnNbMV0uZG9f bmFtW3ZhcnYyW3YyXV0iKTsKICAgICAgc3RyY3B5KGRhcF9vYnNbMl0uZG9fbmFtW2RhcF9vYnNb Ml0uZG9fbnZhcl0sCgkgICAgIGRhcF9vYnNbMV0uZG9fbmFtW3ZhcnYyW3YyXV0pOwogICAgICBk YXBfb2JzWzJdLmRvX2xlbltkYXBfb2JzWzJdLmRvX252YXJdID0gZGFwX29ic1sxXS5kb19sZW5b dmFydjJbdjJdXTsKICAgICAgZGFwX29ic1syXS5kb19udmFyKys7CiAgICB9CiAgb3V0bGlzdDFb MF0gPSAnXDAnOwogIGlmICh2YXJzMSAmJiBudmFyMSA+IDApCiAgICB7CiAgICAgIHN0cmNhdChv dXRsaXN0LCAiICIpOwogICAgICB2YXJjYXQob3V0bGlzdCwgdmFyczEpOwogICAgICB2YXJjYXQo b3V0bGlzdDEsIHZhcnMxKTsKICAgIH0KICBmb3IgKHYxID0gMDsgdjEgPCBudmFyMTsgdjErKykK ICAgIHsKICAgICAgZm9yICh2MiA9IDA7IHYyIDwgbnZhcjI7IHYyKyspCgl7CgkgIGlmICghc3Ry Y21wKGRhcF9vYnNbMF0uZG9fbmFtW3ZhcnYxW3YxXV0sIGRhcF9vYnNbMV0uZG9fbmFtW3ZhcnYy W3YyXV0pKQoJICAgIGJyZWFrOwoJfQogICAgICBpZiAodjIgPCBudmFyMikKCXsKCSAgZnByaW50 ZihkYXBfZXJyLCAiKG1lcmdlKSB2YXJpYWJsZSBhcHBlYXJzIGluIGxpc3RzIGZvciBib3RoICVz IGFuZCAlczogJXNcbiIsCgkJICBmbmFtZTEsIGZuYW1lMiwgZGFwX29ic1swXS5kb19uYW1bdmFy djFbdjFdXSk7CgkgIGV4aXQoMSk7Cgl9CiAgICAgIGVsc2UKCXsKCSAgaWYgKGRhcF9vYnNbMl0u ZG9fbmFtW2RhcF9vYnNbMl0uZG9fbnZhcl0pCgkgICAgZGFwX2ZyZWUoZGFwX29ic1syXS5kb19u YW1bZGFwX29ic1syXS5kb19udmFyXSwKCQkgICAgICJtZXJnZTogZGFwX29ic1syXS5kb19uYW1b ZGFwX29ic1syXS5kb19udmFyXSIpOwoJICBkYXBfb2JzWzJdLmRvX25hbVtkYXBfb2JzWzJdLmRv X252YXJdID0KCSAgICBkYXBfbWFsbG9jKHN0cmxlbihkYXBfb2JzWzBdLmRvX25hbVt2YXJ2MVt2 MV1dKSArIDEsCgkJICAgICAgICJtZXJnZTogZGFwX29ic1swXS5kb19uYW1bdmFydjFbdjFdXSIp OwoJICBzdHJjcHkoZGFwX29ic1syXS5kb19uYW1bZGFwX29ic1syXS5kb19udmFyXSwKCQkgZGFw X29ic1swXS5kb19uYW1bdmFydjFbdjFdXSk7CgkgIGRhcF9vYnNbMl0uZG9fbGVuW2RhcF9vYnNb Ml0uZG9fbnZhcl0gPSBkYXBfb2JzWzBdLmRvX2xlblt2YXJ2MVt2MV1dOwoJICBkYXBfb2JzWzJd LmRvX252YXIrKzsKCX0KICAgIH0KICBvdXRzZXQob3V0bmFtZSwgb3V0bGlzdCk7CiAgc3RyY3B5 KGRhcF9vYnNbMl0uZG9fc3RyW2RhcF92YXJudW0oIl90eXBlXyIpXSwgIk9CUyIpOwogIGV4cGFu ZChvdXRsaXN0MSwgb3ZhcnYxLCBkYXBfbWF4dmFyKTsKICBleHBhbmQob3V0bGlzdDIsIG92YXJ2 MiwgZGFwX21heHZhcik7CiAgZGFwX29ubyA9IDA7IC8qIGZvciByZWFkaW5nIGZpcnN0IGRhdGFz ZXQgKi8KICBnb29uMSA9IHN0ZXAoKTsgLyogdHJ5IHRvIHJlYWQgb25lIGxpbmUgKi8KICBmb3Ig KCA7IDsgKQogICAgewogICAgICBkYXBfb25vID0gMTsgLyogcHJlcGFyZSB0byByZWFkIHNlY29u ZCBkYXRhc2V0ICovCiAgICAgIGlmIChzdGVwKCkpIC8qIGlmIHRoZXJlJ3MgYW55dGhpbmcgbGVm dCBvZiBzZWNvbmQgZGF0YXNldCAqLwoJewoJICB3aGlsZSAoZ29vbjEpIC8qIHdoaWxlIHRoZXJl J3MgYW55dGhpbmcgbGVmdCBvZiBmaXJzdCBkYXRhc2V0ICovCgkgICAgewoJICAgICAgLyogc2Vl IGlmIG1hcmsgdmFsdWVzIHZhcmlhYmxlcyBjdXJyZW50bHkgbWF0Y2ggZm9yIGJvdGggZGF0YXNl dHMgKi8KCSAgICAgIGlzZGlmZiA9IDA7CgkgICAgICBpZiAobm1hcmspIC8qIG9ubHkgY2hlY2sg aWYgdGhlcmUgYXJlIG1hcmsgdmFyaWFibGVzICovCgkJewoJCSAgZm9yICh2MSA9IDA7IHYxIDwg bm1hcms7IHYxKyspCgkJICAgIHsKCQkgICAgICBpZiAoZGFwX29ic1swXS5kb19sZW5bbWFya3Yx W3YxXV0gPT0gREJMKQoJCQl7CgkJCSAgZGRpZmYgPSBkYXBfb2JzWzBdLmRvX2RibFttYXJrdjFb djFdXSAtCgkJCSAgICBkYXBfb2JzWzFdLmRvX2RibFttYXJrdjJbdjFdXTsKCQkJICBpZiAoZGRp ZmYgPCAwLjApCgkJCSAgICBpc2RpZmYgPSAtMTsKCQkJICBlbHNlIGlmIChkZGlmZiA+IDAuMCkK CQkJICAgIGlzZGlmZiA9IDE7CgkJCSAgZWxzZQoJCQkgICAgaXNkaWZmID0gMDsKCQkJICBpZiAo aXNkaWZmKQoJCQkgICAgYnJlYWs7CgkJCX0KCQkgICAgICBlbHNlIGlmIChkYXBfb2JzWzBdLmRv X2xlblttYXJrdjFbdjFdXSA9PSBJTlQpCgkJCXsKCQkJICBpc2RpZmYgPSBkYXBfb2JzWzBdLmRv X2ludFttYXJrdjFbdjFdXSAtCgkJCSAgICBkYXBfb2JzWzFdLmRvX2ludFttYXJrdjJbdjFdXTsK CQkJICBpZiAoaXNkaWZmKQoJCQkgICAgYnJlYWs7CgkJCX0KCQkgICAgICBlbHNlIGlmICgoaXNk aWZmID0gc3RyY21wKGRhcF9vYnNbMF0uZG9fc3RyW21hcmt2MVt2MV1dLAoJCQkJCQlkYXBfb2Jz WzFdLmRvX3N0clttYXJrdjJbdjFdXSkpKQoJCQlicmVhazsKCQkgICAgfQoJCX0KCSAgICAgIGlm IChpc2RpZmYgPCAwKSAvKiBkYXRhc2V0MSBub3QgdXAgdG8gd2hlcmUgZGF0YXNldDIgaXMgKi8K CQl7CgkJICBkYXBfb25vID0gMDsgLyogcmVhZCBhbm90aGVyIGxpbmUgb2YgZGF0YXNldDEgKi8K CQkgIGdvb24xID0gc3RlcCgpOwoJCX0KCSAgICAgIGVsc2UgaWYgKGlzZGlmZiA+IDApIC8qIGRh dGFzZXQxIHBhc3NlZCB3aGVyZSBkYXRhc2V0MiBpcyAqLwoJCWJyZWFrOwoJICAgICAgZWxzZSAv KiBvciBlbHNlIHdlJ3JlIG9uIHRoZSBzYW1lIHBhZ2U6IG1lcmdlICovCgkJewoJCSAgZm9yICh2 MSA9IDA7IHYxIDwgbnZhcjE7IHYxKyspCgkJICAgIHsKCQkgICAgICBpZiAoZGFwX29ic1swXS5k b19sZW5bdmFydjFbdjFdXSA9PSBEQkwpCgkJCWRhcF9vYnNbMl0uZG9fZGJsW292YXJ2MVt2MV1d ID0KCQkJICBkYXBfb2JzWzBdLmRvX2RibFt2YXJ2MVt2MV1dOwoJCSAgICAgIGVsc2UgaWYgKGRh cF9vYnNbMF0uZG9fbGVuW3ZhcnYxW3YxXV0gPT0gSU5UKQoJCQlkYXBfb2JzWzJdLmRvX2ludFtv dmFydjFbdjFdXSA9CgkJCSAgZGFwX29ic1swXS5kb19pbnRbdmFydjFbdjFdXTsKCQkgICAgICBl bHNlCgkJCXsKCQkJICBpZiAoZGFwX29ic1syXS5kb19zdHJbb3ZhcnYxW3YxXV0pCgkJCSAgICBk YXBfZnJlZShkYXBfb2JzWzJdLmRvX3N0cltvdmFydjFbdjFdXSwKCQkJCSAgICAgIm1lcmdlOiBk YXBfb2JzWzJdLmRvX3N0cltvdmFydjFbdjFdXSIpOwoJCQkgIGRhcF9vYnNbMl0uZG9fc3RyW292 YXJ2MVt2MV1dID0KCQkJICAgIGRhcF9tYWxsb2Moc3RybGVuKGRhcF9vYnNbMF0uZG9fc3RyW3Zh cnYxW3YxXV0pICsgMSwKCQkJCSAgICAgICAibWVyZ2U6IGRhcF9vYnNbMF0uZG9fc3RyW292YXJ2 MVt2MV1dIik7CgkJCSAgc3RyY3B5KGRhcF9vYnNbMl0uZG9fc3RyW292YXJ2MVt2MV1dLAoJCQkJ IGRhcF9vYnNbMF0uZG9fc3RyW3ZhcnYxW3YxXV0pOwoJCQl9CgkJICAgIH0KCQkgIGZvciAodjIg PSAwOyB2MiA8IG52YXIyOyB2MisrKQoJCSAgICB7CgkJICAgICAgaWYgKGRhcF9vYnNbMV0uZG9f bGVuW3ZhcnYyW3YyXV0gPT0gREJMKQoJCQlkYXBfb2JzWzJdLmRvX2RibFtvdmFydjJbdjJdXSA9 CgkJCSAgZGFwX29ic1sxXS5kb19kYmxbdmFydjJbdjJdXTsKCQkgICAgICBlbHNlIGlmIChkYXBf b2JzWzFdLmRvX2xlblt2YXJ2Mlt2Ml1dID09IElOVCkKCQkJZGFwX29ic1syXS5kb19pbnRbb3Zh cnYyW3YyXV0gPQoJCQkgIGRhcF9vYnNbMV0uZG9faW50W3ZhcnYyW3YyXV07CgkJICAgICAgZWxz ZQoJCQl7CgkJCSAgaWYgKGRhcF9vYnNbMl0uZG9fc3RyW292YXJ2Mlt2Ml1dKQoJCQkgICAgZGFw X2ZyZWUoZGFwX29ic1syXS5kb19zdHJbb3ZhcnYyW3YyXV0sCgkJCQkgICAgICJtZXJnZTogZGFw X29ic1syXS5kb19zdHJbb3ZhcnYyW3YyXV0iKTsKCQkJICBkYXBfb2JzWzJdLmRvX3N0cltvdmFy djJbdjJdXSA9CgkJCSAgICBkYXBfbWFsbG9jKHN0cmxlbihkYXBfb2JzWzFdLmRvX3N0clt2YXJ2 Mlt2Ml1dKSArIDEsCgkJCQkgICAgICAgIm1lcmdlOiBkYXBfb2JzWzFdLmRvX3N0cltvdmFydjJb djJdXSIpOwoJCQkgIHN0cmNweShkYXBfb2JzWzJdLmRvX3N0cltvdmFydjJbdjJdXSwKCQkJCSBk YXBfb2JzWzFdLmRvX3N0clt2YXJ2Mlt2Ml1dKTsKCQkJfQoJCSAgICB9CgkJICBkYXBfb25vID0g MjsgLyogcHJlcGFyZSB0byBvdXRwdXQgdG8gbWVyZ2VkIGZpbGUgKi8KCQkgIG91dHB1dCgpOwoJ CSAgZGFwX29ubyA9IDA7CgkJICBnb29uMSA9IHN0ZXAoKTsKCQl9CgkgICAgICBpZiAoIW5tYXJr KQoJCWJyZWFrOwoJICAgIH0KCX0KICAgICAgZWxzZQoJYnJlYWs7CiAgICB9CiAgZGFwX29ubyA9 IDA7CiAgaWYgKGRhcF9pblswXSkKICAgIHsKICAgICAgZGZjbG9zZShkYXBfaW5bMF0pOwogICAg ICBkYXBfaW5bMF0gPSAoREZJTEUgKikgTlVMTDsKICAgIH0KICBpZiAoZGFwX2luWzFdKQogICAg ewogICAgICBkZmNsb3NlKGRhcF9pblsxXSk7CiAgICAgIGRhcF9pblsxXSA9IChERklMRSAqKSBO VUxMOwogICAgfQogIGlmIChkYXBfb3V0W2RhcF9vbm9dKQogICAgewogICAgICBkZmNsb3NlKGRh cF9vdXRbZGFwX29ub10pOwogICAgICBkYXBfb3V0W2RhcF9vbm9dID0gKERGSUxFICopIE5VTEw7 CiAgICB9CiAgZGFwX2ZyZWUob3V0bGlzdCwgIm1lcmdlOiBvdXRsaXN0Iik7CiAgZGFwX2ZyZWUo b3V0bGlzdDEsICJtZXJnZTogb3V0bGlzdDEiKTsKICBkYXBfZnJlZShvdXRsaXN0MiwgIm1lcmdl OiBvdXRsaXN0MiIpOwogIGRhcF9mcmVlKG92YXJ2MSwgIm1lcmdlOiBvdmFydjEiKTsKICBkYXBf ZnJlZShvdmFydjIsICJtZXJnZTogb3ZhcnYyIik7CiAgZGFwX2ZyZWUobWFya3YxLCAibWVyZ2U6 IG1hcmt2MSIpOwogIGRhcF9mcmVlKG1hcmt2MiwgIm1lcmdlOiBtYXJrdjIiKTsKICBpZiAodmFy czFudWxsKQogICAgZGFwX2ZyZWUodmFyczEsICJtZXJnZTogdmFyczEiKTsKICBpZiAodmFyczJu dWxsKQogICAgZGFwX2ZyZWUodmFyczIsICJtZXJnZTogdmFyczIiKTsKICBpZiAoZXhjbHVkZTEg PCAwKQogICAgewogICAgICBkYXBfZnJlZSh2YXJzMWEsICJtZXJnZTogdmFyczFhIik7CiAgICAg IGRhcF9mcmVlKHZhcnYxYSwgIm1lcmdlOiB2YXJ2MWEiKTsKICAgIH0KICBlbHNlCiAgICBkYXBf ZnJlZSh2YXJ2MSwgIm1lcmdlOiB2YXJ2MSIpOwogIGlmIChleGNsdWRlMiA8IDApCiAgICB7CiAg ICAgIGRhcF9mcmVlKHZhcnMyYSwgIm1lcmdlOiB2YXJzMmEiKTsKICAgICAgZGFwX2ZyZWUodmFy djJhLCAibWVyZ2U6IHZhcnYyYSIpOwogICAgfQogIGVsc2UKICAgIGRhcF9mcmVlKHZhcnYyLCAi bWVyZ2U6IHZhcnYyIik7Cn0KCnZvaWQgdGl0bGUoY2hhciAqdGV4dCkKewogIGRhcF90aXRsZSA9 IHRleHQ7Cn0KCnZvaWQgZGFwX2hlYWQoaW50IG1hcmt2W10sIGludCBubWFyaykKewogIHRpbWVf dCB0OwogIGludCBtOwoKICBmcHV0cygiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0iLCBkYXBfbHN0KTsKICBmcHJpbnRmKGRhcF9sc3QsICJcbkRhcCAlM2QuICIsIHBhZ2Vubysr KTsKICB0aW1lKCZ0KTsKICBmcHV0cyhjdGltZSgmdCksIGRhcF9sc3QpOwogIHB1dGMoJ1xuJywg ZGFwX2xzdCk7CiAgaWYgKGRhcF90aXRsZSkKICAgIHsKICAgICAgZnB1dHMoZGFwX3RpdGxlLCBk YXBfbHN0KTsKICAgICAgcHV0YygnXG4nLCBkYXBfbHN0KTsKICAgIH0KICBpZiAobm1hcmspCiAg ICB7CiAgICAgIGZwcmludGYoZGFwX2xzdCwgIlxuRm9yOiAiKTsKICAgICAgZm9yIChtID0gMDsg bSA8IG5tYXJrOyBtKyspCgl7CgkgIHN3aXRjaChkYXBfb2JzW2RhcF9vbm9dLmRvX2xlblttYXJr dlttXV0pCgkgICAgewoJICAgIGNhc2UgREJMOgoJICAgICAgZnByaW50ZihkYXBfbHN0LCAiJXMg PSAlZyIsCgkJICAgICAgZGFwX29ic1tkYXBfb25vXS5kb19uYW1bbWFya3ZbbV1dLAoJCSAgICAg IGRhcF9vYnNbZGFwX29ub10uZG9fZGJsW21hcmt2W21dXSk7CgkgICAgICBicmVhazsKCSAgICBj YXNlIElOVDoKCSAgICAgIGZwcmludGYoZGFwX2xzdCwgIiVzID0gJWQiLAoJCSAgICAgIGRhcF9v YnNbZGFwX29ub10uZG9fbmFtW21hcmt2W21dXSwKCQkgICAgICBkYXBfb2JzW2RhcF9vbm9dLmRv X2ludFttYXJrdlttXV0pOwoJICAgICAgYnJlYWs7CgkgICAgZGVmYXVsdDoKCSAgICAgIGZwcmlu dGYoZGFwX2xzdCwgIiVzID0gJXMiLAoJCSAgICAgIGRhcF9vYnNbZGFwX29ub10uZG9fbmFtW21h cmt2W21dXSwKCQkgICAgICBkYXBfb2JzW2RhcF9vbm9dLmRvX3N0clttYXJrdlttXV0pOwoJICAg ICAgYnJlYWs7CgkgICAgfQoJICBpZiAobSA8IG5tYXJrIC0gMSkKCSAgICBmcHV0cygiLCAiLCBk YXBfbHN0KTsKCX0KICAgICAgcHV0YygnXG4nLCBkYXBfbHN0KTsKICAgIH0KICBwdXRjKCdcbics IGRhcF9sc3QpOwp9Cg== --089e015369141cc8d104daffc484 Content-Type: text/x-csrc; charset=US-ASCII; name="sbstrans3.c" Content-Disposition: attachment; filename="sbstrans3.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hfukvw811 LyogIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu Yy4KICoKICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIERhcC4KICoKICogIERhcCBpcyBmcmVlIHNv ZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqICBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieQogKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBv ZiB0aGUgTGljZW5zZSwgb3IKICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u CiAqCiAqICBEYXAgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCiAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgogKgogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogIGFsb25nIHdpdGggRGFwLiAgSWYg bm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogKi8KCiNpbmNsdWRlIDxz dGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUg InNicy5oIgoKZXh0ZXJuIGNoYXIgc2JzdG1wW1RPS0VOTEVOICsgMV07IC8qIG5hbWUgb2YgY3Vy cmVudCB0ZW1wIGRhdGFzZXQgKi8KZXh0ZXJuIGludCBzYnNsaW5lbm87CgovKiBUcmFuc2xhdGUg Y2FsbCB0byBHTE0uIHN0ZXAgc3RhcnRzIGFmdGVyICJwcm9jIGdsbSIgKi8Kdm9pZCBnbG10cmFu cyhjaGFyICpzdGVwLCBGSUxFICpkYXBmaWxlKQp7CiAgaW50IHM7IC8qIGluZGV4IHRvIHN0ZXAg Ki8KICBpbnQgc2luY3I7IC8qIGluY3JlbWVudCBmb3IgcyAqLwogIHN0YXRpYyBjaGFyIHNldG5h bWVbVE9LRU5MRU4gKyAxXTsKICBpbnQgbW9kZWxzdGFydDsgLyogc3RhcnRpbmcgcG9zaXRpb24g b2YgbW9kZWwgKi8KICBzdGF0aWMgY2hhciByZXNwb25zZVtUT0tFTkxFTiArIDFdOyAvKiBuYW1l IG9mIHJlc3BvbnNlIHZhcmlhYmxlICovCiAgaW50IHJlc3BsZW47IC8qIGxlbmd0aCBvZiByZXNw b25zZSB2YXJpYWJsZSBuYW1lICovCiAgaW50IGU7IC8qIGluZGV4IHRvIHN0ZXAsIGZvciBzdGVw cGluZyB0aHJvdWdoIGVmZmVjdHMgb2YgdGhlIG1vZGVsICovCiAgaW50IGxzbWVhbnM7IC8qIDAg PSBubyBsc21lYW5zIHN0YXRlbWVudCwgPiAwIGlzIHN0YXJ0IG9mIGxzbWVhbnMgc3RhdGVtZW50 LiAqLwogIHN0YXRpYyBjaGFyIHRlc3RbVE9LRU5MRU4gKyAxXTsgLyogZHVubmV0dCwgdHVrZXks IG9yIGxzZCAqLwogIHN0YXRpYyBjaGFyIGxldmVsW1RPS0VOTEVOICsgMV07IC8qIGFscGhhIHJl cXVlc3RlZCBmb3IgbHNtZWFucyAqLwogIGludCB0ZXJtOyAvKiBzdGFydGluZyBwb3NpdGlvbiBv ZiB0ZXJtIGluIG51bWVyYXRvciBvZiBmdGVzdCAqLwogIGludCBub21hdGNoOyAvKiBsc21lYW5z IHRlcm0gZG9lc24ndCBtYXRjaCBmdGVzdCB0ZXJtICovCiAgaW50IGNsYXNzc3RhcnQ7IC8qIHN0 YXJ0IG9mIGNsYXNzIHZhcmlhYmxlIGxpc3QgKi8KICBpbnQgbmJ5dmFyczsgLyogbnVtYmVyIG9m IGJ5IHZhcnM6IG5lZWQgdG8ga25vdyB0aGlzIGZvciBjb250cmFzdHMgKi8KICBpbnQgY2xhc3N2 YXI7IC8qIGluZGV4IG9mIGNsYXNzIHZhciBpbiBjb250cmFzdCAqLwogIGludCBjOyAvKiBpbmRl eCB0byBjbGFzcyB2YXJzICovCiAgc3RhdGljIGNoYXIgY2xhc3NuYW1lW1RPS0VOTEVOICsgMV07 IC8qIG5hbWUgb2YgY2xhc3MgdmFyIGluIGNvbnRyYXN0ICovCiAgdW5zaWduZWQgaW50IGNvbnRy YXN0dGVybTsgLyogdmFsdWUgZm9yIF90ZXJtXyB2YXJpYWJsZSBmb3IgY29udHJhc3RzICovCiAg aW50ICpjb2VmZjsgLyogY29lZmZpY2llbnRzIGZvciB0aGUgZWZmZWN0ICovCiAgaW50IG5jb2Vm ZjsgLyogbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBmb3IgY29udHJhc3QgKi8KICBpbnQgbWludXM7 IC8qIGNvZWZmIGhhcyBtaW51cyBzaWduPyAocmVhZCBhcyBzZXBhcmF0ZSB0b2tlbikgKi8KICBp bnQgY29lZmZzdW07IC8qIHN1bSBvZiBjb2VmZmljaWVudHMgZm9yIGNvbnRyYXN0ICovCgogIGlm ICghZ2V0b3B0aW9uKHN0ZXAsICJkYXRhIiwgc2V0bmFtZSwgMSkpCiAgICBzdHJjcHkoc2V0bmFt ZSwgc2JzdG1wKTsKCiAgaWYgKChtb2RlbHN0YXJ0ID0gZmluZHN0YXRlbWVudChzdGVwLCAibW9k ZWwiKSkpCiAgICByZXNwbGVuID0gbGluZWNweShyZXNwb25zZSwgc3RlcCArIG1vZGVsc3RhcnQp OwogIGVsc2UKICAgIHsKICAgICAgZnByaW50ZihzdGRlcnIsCgkgICAgICAic2JzdHJhbnM6IGJl Zm9yZSAlZDogbWlzc2luZyBtb2RlbCBzdGF0ZW1lbnQgaW4gcHJvYyBnbG1cbiIsCgkgICAgICBz YnNsaW5lbm8pOwogICAgICBleGl0KDEpOwogICAgfQoKICBpZiAoIShjbGFzc3N0YXJ0ID0gZmlu ZHN0YXRlbWVudChzdGVwLCAiY2xhc3MiKSkpCiAgICB7CiAgICAgIGZwcmludGYoc3RkZXJyLAoJ ICAgICAgInNic3RyYW5zOiBiZWZvcmUgJWQ6IG1pc3NpbmcgY2xhc3Mgc3RhdGVtZW50IGluIHBy b2MgZ2xtXG4iLAoJICAgICAgc2JzbGluZW5vKTsKICAgICAgZXhpdCgxKTsKICAgIH0KCiAgaWYg KChzID0gZmluZHN0YXRlbWVudChzdGVwLCAiYnkiKSkpCiAgICB7CiAgICAgIGZvciAobmJ5dmFy cyA9IDA7IHN0ZXBbc10gJiYgc3RlcFtzXSAhPSAnOyc7IG5ieXZhcnMrKykKCXMgKz0gbGluZWNw eSgoY2hhciAqKSBOVUxMLCBzdGVwICsgcykgKyAxOwogICAgfQogIGVsc2UKICAgIG5ieXZhcnMg PSAwOwoKICAvKiB3ZSBoYXZlIHRvIHNvcnQgYnkgdGhlIGNsYXNzIHZhcnMgYW5kIHRvIGdldCBt ZWFucywgZXRjLiAqLwogIGZwcmludGYoZGFwZmlsZSwgInNvcnQoXCIlc1wiLCBcIiIsIHNldG5h bWUpOwogIGNvcHlsaXN0KHN0ZXAsICJieSIsIGRhcGZpbGUpOwogIGNvcHlsaXN0KHN0ZXAsICJj bGFzcyIsIGRhcGZpbGUpOwogIGZwdXRzKCJcIiwgXCJcIik7XG4iLCBkYXBmaWxlKTsKCiAgLyog d2UgaGF2ZSB0byBnZXQgbWVhbnMgYW5kIHZhcnMgKi8KICBmcHJpbnRmKGRhcGZpbGUsICJtZWFu cyhcIiVzLnNydFwiLCBcIiVzXCIsIFwiTiBNRUFOIFZBUlwiLCBcIiIsIHNldG5hbWUsIHJlc3Bv bnNlKTsKICBjb3B5bGlzdChzdGVwLCAiYnkiLCBkYXBmaWxlKTsKICBjb3B5bGlzdChzdGVwLCAi Y2xhc3MiLCBkYXBmaWxlKTsKICBmcHV0cygiXCIpO1xuIiwgZGFwZmlsZSk7CgogIC8qIG5vdyB3 ZSBjYW4gc3RhcnQgdGhlIEFOT1ZBIGFuZCB0ZXN0IHRoZSB3aG9sZSBtb2RlbCAqLwogIGZwcmlu dGYoZGFwZmlsZSwgImVmZmVjdHMoXCIlcy5zcnQubW5zXCIsIFwiJXMgIiwgc2V0bmFtZSwgcmVz cG9uc2UpOwogIGNvcHlsaXN0KHN0ZXAsICJjbGFzcyIsIGRhcGZpbGUpOwogIGZwdXRzKCJcIiwg XCIiLCBkYXBmaWxlKTsKICBzID0gbW9kZWxzdGFydCArIHJlc3BsZW4gKyAxOwogIGlmIChzdGVw W3NdICE9ICc9JykKICAgIHsKICAgICAgZnByaW50ZihzdGRlcnIsCgkgICAgICAic2JzdHJhbnM6 IGJlZm9yZSAlZDogbWlzc2luZyA9IGluIG1vZGVsIHN0YXRlbWVudCBpbiBwcm9jIGdsbVxuIiwK CSAgICAgIHNic2xpbmVubyk7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgZm9yIChzICs9IDI7IHN0 ZXBbc10gJiYgc3RlcFtzXSAhPSAnLycgJiYgc3RlcFtzXSAhPSAnOyc7IHMrKykKICAgIHsKICAg ICAgaWYgKHN0ZXBbc10gPT0gJ1xuJykKCXB1dGMoJyAnLCBkYXBmaWxlKTsKICAgICAgZWxzZQoJ cHV0YyhzdGVwW3NdLCBkYXBmaWxlKTsKICAgIH0KICBmcHV0cygiXCIsIFwiIiwgZGFwZmlsZSk7 CiAgY29weWxpc3Qoc3RlcCwgImJ5IiwgZGFwZmlsZSk7CiAgZnB1dHMoIlwiKTtcbiIsIGRhcGZp bGUpOwoKICAvKiBub3cgd2UndmUgcnVuIHRoZSBtb2RlbCwgaXQncyB0aW1lIHRvIHRlc3QgZWFj aCBlZmZlY3QgaW4gaXQgKi8KICAvKiB3ZSBuZWVkIGEgc2VwYXJhdGUgY2FsbCB0byBmdGVzdCBm b3IgZWFjaCBlZmZlY3QgYW5kIGNoZWNrIGZvciBsc21lYW5zIHN0YXRlbWVudHMKICAgKi8KCiAg LyogZmlyc3QgZ2V0IHRoZSBmaXJzdCBsc21lYW5zIHN0YXRlbWVudCAqLwogIGlmICgobHNtZWFu cyA9IGZpbmRzdGF0ZW1lbnQoc3RlcCwgImxzbWVhbnMiKSkpCiAgICB7IC8qIHNlZSBpZiBpdCBz cGVjaWZpZXMgYW4gZXJyb3IgdGVybSAqLwogICAgICBpZiAoZ2V0b3B0aW9uKHN0ZXAgKyBsc21l YW5zLCAiZSIsIChjaGFyICopIE5VTEwsIDEpKQoJbHNtZWFucyA9IDA7IC8qIG5vdCBnb2luZyB0 byB1c2UgaXQgKi8KICAgICAgZWxzZSAvKiBuZWVkIHRvIGdldCB0ZXN0IG5hbWUsIGFscGhhICov Cgl7CgkgIGZvciAocyA9IGxzbWVhbnM7IHN0ZXBbc10gJiYgc3RlcFtzXSAhPSAnLycgJiYgc3Rl cFtzXSAhPSAnOyc7IHMrKykKCSAgICA7IC8qIGdldCB0byBvcHRpb25zICovCgkgIHRlc3RbMF0g PSAnXDAnOyAvKiBoYXZlbid0IGZvdW5kIG9uZSB5ZXQuLi4gKi8KCSAgaWYgKHN0ZXBbc10gPT0g Jy8nKQoJICAgIHsKCSAgICAgIGZvciAocyArPSAyOyBzdGVwW3NdICYmIHN0ZXBbc10gIT0gJzsn OyApCgkJewoJCSAgcyArPSBsaW5lY3B5KHRlc3QsIHN0ZXAgKyBzKSArIDE7CgkJICB1cHBlcih0 ZXN0KTsKCQkgIGlmIChzdHJjbXAodGVzdCwgIkRVTk5FVFQiKSAmJiBzdHJjbXAodGVzdCwgIlRV S0VZIikgJiYgc3RyY21wKHRlc3QsICJMU0QiKSkKCQkgICAgdGVzdFswXSA9ICdcMCc7IC8qIHdh c24ndCwgYWZ0ZXIgYWxsICovCgkJfQoJICAgIH0KCSAgaWYgKCF0ZXN0WzBdKQoJICAgIHsKCSAg ICAgIGZwcmludGYoc3RkZXJyLAoJCSAgICAgICJzYnN0cmFuczogYmVmb3JlICVkOiBubyB0ZXN0 IHNwZWNpZmllZCBpbiBsc21lYW5zIHN0YXRlbWVudCBpbiBwcm9jIGdsbVxuIiwKCQkgICAgICBz YnNsaW5lbm8pOwoJICAgICAgZXhpdCgxKTsKCSAgICB9CgkgIGlmICghZ2V0b3B0aW9uKHN0ZXAg KyBsc21lYW5zLCAiYWxwaGEiLCBsZXZlbCwgMSkpCgkgICAgc3RyY3B5KGxldmVsLCAiMC4wNSIp OwoJfQogICAgfQoKICAvKiBub3cgd2UncmUgcmVhZHkgdG8gdGVzdCB0aGUgdGVybXMgaW4gdGhl IG1vZGVsLCBvbmUtYnktb25lICovCgogIGUgPSBtb2RlbHN0YXJ0ICsgcmVzcGxlbiArIDM7CiAg d2hpbGUgKHN0ZXBbZV0gJiYgc3RlcFtlXSAhPSAnLycgJiYgc3RlcFtlXSAhPSAnOycpCiAgICB7 CiAgICAgIGZwcmludGYoZGFwZmlsZSwgImZ0ZXN0KFwiJXMuc3J0Lm1ucy5jb25cIiwgXCIlcyAi LCBzZXRuYW1lLCByZXNwb25zZSk7CiAgICAgIGNvcHlsaXN0KHN0ZXAsICJjbGFzcyIsIGRhcGZp bGUpOwogICAgICBmcHV0cygiXCIsIFwiIiwgZGFwZmlsZSk7CiAgICAgIC8qIGhlcmUgY29tZXMg dGhlIG51bWVyYXRvciAqLwogICAgICB0ZXJtID0gZTsgLyogbWFyayB0aGlzIHBsYWNlIGZvciBs c21lYW5zICovCiAgICAgIHdoaWxlIChzdGVwW2VdICYmIHN0ZXBbZV0gIT0gJ1xuJykKCXsKCSAg cHV0YyhzdGVwW2VdLCBkYXBmaWxlKTsKCSAgZSsrOwoJICAvKiBub3cgc2VlIGlmIGl0J3MgYSBj cm9zc2VkIG9yIG5lc3RlZCBlZmZlY3QgKi8KCSAgaWYgKHN0ZXBbZV0gPT0gJ1xuJyAmJiBzdGVw W2UgKyAxXSA9PSAnKicpIC8qIHRoZW4gbmVlZCB0byBrZWVwIGNvcHlpbmcgKi8KCSAgICB7Cgkg ICAgICBwdXRjKCcqJywgZGFwZmlsZSk7CgkgICAgICBlICs9IDM7IC8qIGdldCB0byBuZXh0IHZh cmlhYmxlICovCgkgICAgICB0ZXJtID0gMDsgLyogbWFyayBhcyBjcm9zc2VkOiBsc21lYW5zIGNh bid0IGhhbmRsZSB0aGVzZSB5ZXQgKi8KCSAgICB9Cgl9CiAgICAgIGZwdXRzKCJcIiwgXCJcIiwg XCIiLCBkYXBmaWxlKTsgLyogbnVsbCBkZW5vbWluYXRvciAqLwogICAgICBjb3B5bGlzdChzdGVw LCAiYnkiLCBkYXBmaWxlKTsKICAgICAgZnB1dHMoIlwiKTtcbiIsIGRhcGZpbGUpOwogICAgICBl Kys7IC8qIHBvc2l0aW9uIGF0IG5leHQgdGVybSAqLwoKICAgICAgaWYgKGxzbWVhbnMgJiYgdGVy bSkgLyogdGVybSBpcyBwb3NpdGlvbiBvZiBudW1lcmF0b3IgaW4gZnRlc3QganVzdCBydW4gKi8K CXsKCSAgZm9yIChzID0gbHNtZWFuczsgc3RlcFtzXSAmJiBzdGVwW3NdICE9ICcvJyAmJiBzdGVw W3NdICE9ICc7JyAmJgoJCSAobm9tYXRjaCA9IGxpbmVjbXAoc3RlcCArIHMsIHN0ZXAgKyB0ZXJt KSk7CgkgICAgICAgcyArPSBsaW5lY3B5KChjaGFyICopIE5VTEwsIHN0ZXAgKyBzKSArIDEpCgkg ICAgOyAvKiBzZWFyY2ggZm9yIGZ0ZXN0IGVmZmVjdCBpbiBsc21lYW5zIHN0YXRlbWVudCAqLwoJ ICBpZiAoIW5vbWF0Y2gpCgkgICAgewoJICAgICAgZnByaW50ZihkYXBmaWxlLAoJCSAgICAgICJs c21lYW5zKFwiJXMuc3J0Lm1ucy50c3RcIiwgXCIlc1wiLCAlcywgXCIlcyAiLAoJCSAgICAgIHNl dG5hbWUsIHRlc3QsIGxldmVsLCByZXNwb25zZSk7CgkgICAgICBjb3B5bGlzdChzdGVwLCAiY2xh c3MiLCBkYXBmaWxlKTsKCSAgICAgIGZwdXRzKCJcIiwgXCIiLCBkYXBmaWxlKTsKCSAgICAgIGZv ciAocyA9IHRlcm07IHN0ZXBbc10gJiYgc3RlcFtzXSAhPSAnXG4nOyBzKyspCgkJcHV0YyhzdGVw W3NdLCBkYXBmaWxlKTsKCSAgICAgIGZwdXRzKCJcIiwgXCIiLCBkYXBmaWxlKTsKCSAgICAgIGNv cHlsaXN0KHN0ZXAsICJieSIsIGRhcGZpbGUpOwoJICAgICAgZnB1dHMoIlwiLCBcInMxMlwiKTtc biIsIGRhcGZpbGUpOwoJICAgIH0KCX0KICAgIH0KCiAgLyogbm93IGRvIHNwZWNpZmljIHRlc3Qg cmVxdWVzdCAqLwogIGZvciAocyA9IDA7IChzaW5jciA9IGZpbmRzdGF0ZW1lbnQoc3RlcCArIHMs ICJ0ZXN0IikpOyApCiAgICB7CiAgICAgIHMgKz0gc2luY3I7CiAgICAgIGZwcmludGYoZGFwZmls ZSwgImZ0ZXN0KFwiJXMuc3J0Lm1ucy5jb25cIiwgXCIlcyAiLCBzZXRuYW1lLCByZXNwb25zZSk7 CiAgICAgIGNvcHlsaXN0KHN0ZXAsICJjbGFzcyIsIGRhcGZpbGUpOwogICAgICBmcHV0cygiXCIs IFwiIiwgZGFwZmlsZSk7CiAgICAgIGlmICghc3RlcFtzXSB8fCBsaW5lY21wKHN0ZXAgKyBzLCAi aCIpIHx8IGxpbmVjbXAoc3RlcCArIHMgKyAyLCAiPSIpKQoJewoJICBmcHJpbnRmKHN0ZGVyciwK CQkgICJzYnN0cmFuczogYmVmb3JlICVkOiBtaXNzaW5nIGg9IGluIHRlc3Qgc3RhdGVtZW50IGlu IHByb2MgZ2xtXG4iLAoJCSAgc2JzbGluZW5vKTsKCSAgZXhpdCgxKTsKCX0KICAgICAgZm9yIChz ICs9IDQ7IHN0ZXBbc10gJiYKCSAgICAgKGxpbmVjbXAoc3RlcCArIHMsICJlIikgfHwgKHN0ZXBb cyArIDJdICYmIGxpbmVjbXAoc3RlcCArIHMgKyAyLCAiPSIpKSk7IHMrKykKCXMgKz0gcHV0bGlu ZXMoc3RlcCArIHMsIGRhcGZpbGUsICdcbicpOyAvKiBwdXRsaW5lcyBwdXRzIGEgc3BhY2UgKi8K ICAgICAgaWYgKCFzdGVwW3NdIHx8IGxpbmVjbXAoc3RlcCArIHMsICJlIikgfHwgbGluZWNtcChz dGVwICsgcyArIDIsICI9IikpCgl7CgkgIGZwcmludGYoc3RkZXJyLAoJCSAgInNic3RyYW5zOiBi ZWZvcmUgJWQ6IG1pc3NpbmcgZT0gaW4gdGVzdCBzdGF0ZW1lbnQgaW4gcHJvYyBnbG1cbiIsCgkJ ICBzYnNsaW5lbm8pOwoJICBleGl0KDEpOwoJfQogICAgICBmcHV0cygiXCIsIFwiIiwgZGFwZmls ZSk7CiAgICAgIHMgKz0gNDsKICAgICAgcyArPSBwdXRsaW5lcyhzdGVwICsgcywgZGFwZmlsZSwg JzsnKTsKICAgICAgaWYgKHN0ZXBbc10gIT0gJzsnKQoJewoJICBmcHJpbnRmKHN0ZGVyciwKCQkg ICJzYnN0cmFuczogYmVmb3JlICVkOiBleHRyYSBjaGFyYWN0ZXJzIGFmdGVyIGU9PGVmZmVjdD4g aW4gdGVzdCBzdGF0ZW1lbnQgaW4gcHJvYyBnbG1cbiIsCgkJICBzYnNsaW5lbm8pOwoJICBleGl0 KDEpOwoJfQogICAgICBmcHV0cygiXCIsIFwiIiwgZGFwZmlsZSk7CiAgICAgIGNvcHlsaXN0KHN0 ZXAsICJieSIsIGRhcGZpbGUpOwogICAgICBmcHV0cygiXCIpO1xuIiwgZGFwZmlsZSk7CiAgICB9 CgogIC8qIE5vdyBkbyBjb250cmFzdHM6IGVhY2ggY29udHJhc3Qgc3RhdGVtZW50IHJ1bnMgYSBz ZXBhcmF0ZSBmdGVzdCAqLwogIC8qIEZpcnN0IHNldCB1cCBhcnJheSBmb3IgY29lZmZpY2llbnQg dmFsdWVzOiB0aGlzIGlzIGFuIG92ZXJlc3RpbWF0ZTsgc28/ICovCiAgLyogQW5kIGl0J3MgdW5u Y2Vzc2FyeSBpZiB0aGVyZSdzIG5vIGNvbnRyYXN0IHN0YXRlbWVudCAqLwogIGNvZWZmID0gKGlu dCAqKSBtYWxsb2Moc2l6ZW9mKGludCkgKiBzdHJsZW4oc3RlcCkgLyAyKTsKICAvKiBGaXJzdCBz ZXQgdXAgYXJyYXkgZm9yIGNvZWZmaWNpZW50IHZhbHVlczogdGhpcyBpcyBhbiBvdmVyZXN0aW1h dGU7IHNvPyAqLwogIGZvciAocyA9IDA7IChzaW5jciA9IGZpbmRzdGF0ZW1lbnQoc3RlcCArIHMs ICJjb250cmFzdCIpKTsgKQogICAgewogICAgICBzICs9IHNpbmNyOwogICAgICBpZiAoc3RlcFtz XSAhPSAnIicpCgl7CgkgIGZwcmludGYoc3RkZXJyLAoJCSAgInNic3RyYW5zOiBiZWZvcmUgJWQ6 IG1pc3NpbmcgXCJMQUJFTFwiIGluIGNvbnRyYXN0IHN0YXRlbWVudCBpbiBwcm9jIGdsbVxuIiwK CQkgIHNic2xpbmVubyk7CgkgIGV4aXQoMSk7Cgl9CiAgICAgIGZwdXRzKCJ0aXRsZShcIiIsIGRh cGZpbGUpOwogICAgICBmb3IgKHMrKzsgc3RlcFtzXSAmJiBzdGVwW3NdICE9ICciJzsgcysrKQoJ LyogY2FuJ3QgdXNlIHB1dGxpbmVzIGJlY2F1c2Ugd2Ugd2FudCB0aGUgbmV3bGluZXMgKi8KCXB1 dGMoc3RlcFtzXSwgZGFwZmlsZSk7CiAgICAgIGlmIChzdGVwW3NdICE9ICciJykKCXsKCSAgZnBy aW50ZihzdGRlcnIsCgkJICAic2JzdHJhbnM6IGJlZm9yZSAlZDogbm8gdGVybWluYXRpbmcgXCIg aW4gY29udHJhc3Qgc3RhdGVtZW50IGxhYmVsIGluIHByb2MgZ2xtXG4iLAoJCSAgc2JzbGluZW5v KTsKCSAgZXhpdCgxKTsKCX0KICAgICAgZnB1dHMoIlwiKTtcbiIsIGRhcGZpbGUpOwogICAgICBz ICs9IDI7IC8qIG9uIHRvIGVmZmVjdCBhbmQgdmFsdWVzICovCiAgICAgIC8qIFdlIG5lZWQgdG8g cmV2aXNlIHRoZSAuY29uIGZpbGUgImJ5IGhhbmQiIGZvciBmdGVzdCAqLwogICAgICAvKiBXZSBu ZWVkIHRvIHNldCB1cCBfdGVybV8gZm9yIHRoZSBjbGFzcyB2YXJpYWJsZSBzcGVjaWZpZWQgaW4g dGhlIGNvbnRyYXN0LiAqLwogICAgICAvKiBGaW5kIGNsYXNzIHZhcmlhYmxlIHJlZmVyZW5jZWQg Ki8KICAgICAgZm9yIChjb250cmFzdHRlcm0gPSAweDEsIGUgPSBjbGFzc3N0YXJ0LCBjbGFzc3Zh ciA9IDA7IHN0ZXBbZV0gJiYgc3RlcFtlXSAhPSAnOyc7CgkgICBjb250cmFzdHRlcm0gPSAoY29u dHJhc3R0ZXJtIDw8IDEpLCBjbGFzc3ZhcisrKQoJewoJICBpZiAoIWxpbmVjbXAoc3RlcCArIHMs IHN0ZXAgKyBlKSkKCSAgICBicmVhazsKCSAgZWxzZQoJICAgIGUgKz0gbGluZWNweSgoY2hhciAq KSBOVUxMLCBzdGVwICsgZSkgKyAxOwoJfQogICAgICBjbGFzc3ZhcisrOyAvKiBub3cgaXMgMSwg MiwgLi4uLCAzICovCiAgICAgIHMgKz0gbGluZWNweShjbGFzc25hbWUsIHN0ZXAgKyBzKSArIDE7 CiAgICAgIC8qIHNob3VsZCBoYXZlIGNvZWZmaWNpZW50cyBub3cgKi8KICAgICAgZm9yIChuY29l ZmYgPSAwLCBjb2VmZnN1bSA9IDA7IG51bShzdGVwW3NdKSB8fCBzdGVwW3NdID09ICcrJyB8fCBz dGVwW3NdID09ICctJzsKCSAgIG5jb2VmZisrKQoJewoJICBpZiAoc3RlcFtzXSA9PSAnKycgfHwg c3RlcFtzXSA9PSAnLScpCgkgICAgewoJICAgICAgbWludXMgPSAoc3RlcFtzXSA9PSAnLScpOwoJ ICAgICAgcyArPSAyOwoJICAgIH0KCSAgZWxzZQoJICAgIG1pbnVzID0gMDsKCSAgaWYgKHNzY2Fu ZihzdGVwICsgcywgIiVkIiwgY29lZmYgKyBuY29lZmYpICE9IDEpCgkgICAgewoJICAgICAgZnBy aW50ZihzdGRlcnIsCgkJICAgICAgInNic3RyYW5zOiBiZWZvcmUgJWQ6IGludmFsaWQgY29lZmZp Y2llbnQgaW4gY29udHJhc3Qgc3RhdGVtZW50IGluIHByb2MgZ2xtXG4iLAoJCSAgICAgIHNic2xp bmVubyk7CgkgICAgICBleGl0KDEpOwoJICAgIH0KCSAgaWYgKG1pbnVzKQoJICAgIGNvZWZmW25j b2VmZl0gPSAtY29lZmZbbmNvZWZmXTsKCSAgY29lZmZzdW0gKz0gY29lZmZbbmNvZWZmXTsKCSAg cyArPSBsaW5lY3B5KChjaGFyICopIE5VTEwsIHN0ZXAgKyBzKSArIDE7Cgl9CiAgICAgIGlmIChj b2VmZnN1bSkKCXsKCSAgZnByaW50ZihzdGRlcnIsCgkJICAic2JzdHJhbnM6IGJlZm9yZSAlZDog Y29lZmZpY2llbnRzIHN1bSB0byBub256ZXJvIGluIGNvbnRyYXN0IHN0YXRlbWVudCBpbiBwcm9j IGdsbVxuIiwKCQkgIHNic2xpbmVubyk7CgkgIGV4aXQoMSk7Cgl9CiAgICAgIGlmIChzdGVwW3Nd ID09ICcvJykgLyogb24gdG8gZT0sIGlmIGFueSAqLwoJcyArPSAyOwogICAgICAvKiBXZSdsbCBz dGFydCB3aXRoIHRoZSBmaWxlIHRoYXQgZWZmZWN0cyBjcmVhdGVkICovCiAgICAgIGZwcmludGYo ZGFwZmlsZSwgImluc2V0KFwiJXMuc3J0Lm1ucy5jb25cIilcbntcbiIsIHNldG5hbWUpOwogICAg ICBmcHJpbnRmKGRhcGZpbGUsICJjaGFyIF90eXBlX1s5XTtcbmRvdWJsZSAlcztcbmludCBfbl8s IF90ZXJtXztcbiIsIHJlc3BvbnNlKTsKICAgICAgZnByaW50ZihkYXBmaWxlLCAiaW50IF9wYXJ0 dl9bJWRdO1xuIiwgbmJ5dmFycyArIGNsYXNzdmFyKTsKICAgICAgZnByaW50ZihkYXBmaWxlLCAi aW50IF9jXywgX21vcmVfLCBfY29udHIxXztcbmRvdWJsZSBfY29lZmZfWyVkXTtcbiIsIG5jb2Vm Zik7CiAgICAgIGZwcmludGYoZGFwZmlsZSwgIm91dHNldChcIiVzLnNydC5tbnMuY29uLmNvblwi LCBcIlwiKTtcbiIsIHNldG5hbWUpOwogICAgICBmcHV0cygiZGFwX2xpc3QoXCIiLCBkYXBmaWxl KTsKICAgICAgY29weWxpc3Qoc3RlcCwgImJ5IiwgZGFwZmlsZSk7CiAgICAgIGZvciAoZSA9IGNs YXNzc3RhcnQsIGMgPSAwOyBjIDwgY2xhc3N2YXI7IGMrKykKCWUgKz0gcHV0bGluZXMoc3RlcCAr IGUsIGRhcGZpbGUsICdcbicpICsgMTsKICAgICAgZnByaW50ZihkYXBmaWxlLCAiXCIsIF9wYXJ0 dl8sICVkKTtcbiIsIG5ieXZhcnMgKyBjbGFzc3Zhcik7CiAgICAgIC8qIG5vdyB3ZSBuZWVkIHRv IHNldCB0aGUgY29lZmZpY2llbnQgYXJyYXkgdmFsdWVzICovCiAgICAgIGZvciAoYyA9IDA7IGMg PCBuY29lZmY7IGMrKykKCWZwcmludGYoZGFwZmlsZSwgIl9jb2VmZl9bJWRdID0gJWQuMDtcbiIs IGMsIGNvZWZmW2NdKTsKICAgICAgLyogZmlyc3Qgd3JpdGUgb3V0IE4sIE1FQU4sIFZBUiAqLwog ICAgICBmcHV0cygiZm9yIChfY18gPSAwLCBfY29udHIxXyA9IDEsIF9tb3JlXyA9IHN0ZXAoKTsg X21vcmVfOyApXG57XG4iLCBkYXBmaWxlKTsKICAgICAgZnByaW50ZihkYXBmaWxlLCAiaWYgKGRh cF9uZXdwYXJ0KF9wYXJ0dl8sICVkKSlcbl9jXyA9IDA7XG4iLCBuYnl2YXJzICsgY2xhc3N2YXIg LSAxKTsKICAgICAgZnByaW50ZihkYXBmaWxlLCAiZWxzZSBpZiAoZGFwX25ld3BhcnQoX3BhcnR2 XywgJWQpKVxuX2NfKys7XG4iLCBuYnl2YXJzICsgY2xhc3N2YXIpOwogICAgICBmcHV0cygib3V0 cHV0KCk7XG5zdGVwKCk7XG5vdXRwdXQoKTtcbnN0ZXAoKTtcbm91dHB1dCgpO1xuIiwgZGFwZmls ZSk7CiAgICAgIC8qIG5lZWQgdG8gaW5jbHVkZSBFUlJPUiBsaW5lcywgYnV0IHNraXAgQ09OVFIg bGluZXMgZm9yIHNwZWNpZmllZCBlZmZlY3QgKi8KICAgICAgZnB1dHMoIndoaWxlICgoX21vcmVf ID0gc3RlcCgpKSlcbntcbiIsIGRhcGZpbGUpOwogICAgICBmcHV0cygiaWYgKCFzdHJjbXAoX3R5 cGVfLCBcIkVSUk9SXCIpKVxub3V0cHV0KCk7XG4iLCBkYXBmaWxlKTsKICAgICAgZnB1dHMoImVs c2UgaWYgKCFzdHJjbXAoX3R5cGVfLCBcIkNPTlRSXCIpKVxue1xuIiwgZGFwZmlsZSk7CiAgICAg IGZwcmludGYoZGFwZmlsZSwgImlmIChfdGVybV8gPT0gJWQpXG57XG4iLCBjb250cmFzdHRlcm0p OyAvKiBpZiAxc3QsIGNoYW5nZSB0byBjb250cmFzdCAqLwogICAgICBmcHJpbnRmKGRhcGZpbGUs ICJpZiAoX2NvbnRyMV8pXG57XG5fY29udHIxXyA9IDA7XG5fdGVybV8gPSAlZDtcbiIsIGNvbnRy YXN0dGVybSk7CiAgICAgIGZwcmludGYoZGFwZmlsZSwgImlmIChfY18gPCAlZClcbiIsIG5jb2Vm Zik7CiAgICAgIGZwcmludGYoZGFwZmlsZSwgIiVzID0gX2NvZWZmX1tfY19dO1xuZWxzZVxuJXMg PSAwLjA7XG4iLCByZXNwb25zZSwgcmVzcG9uc2UpOwogICAgICBmcHV0cygib3V0cHV0KCk7XG59 XG59XG4iLCBkYXBmaWxlKTsKICAgICAgZnB1dHMoImVsc2Vcbm91dHB1dCgpO1xufVxuIiwgZGFw ZmlsZSk7CiAgICAgIGZwdXRzKCJlbHNlIGlmICghc3RyY21wKF90eXBlXywgXCJMU01FQU5cIikp XG5vdXRwdXQoKTtcbiIsIGRhcGZpbGUpOwogICAgICBmcHV0cygiZWxzZVxuXHtcbl9jb250cjFf ID0gMTtcbmJyZWFrO1xufVxufVxufVxufVxuIiwgZGFwZmlsZSk7IC8qIGF0IGFub3RoZXIgY2Vs bCAqLwogICAgICBmcHJpbnRmKGRhcGZpbGUsICJmdGVzdChcIiVzLnNydC5tbnMuY29uLmNvblwi LCBcIiVzICIsIHNldG5hbWUsIHJlc3BvbnNlKTsKICAgICAgY29weWxpc3Qoc3RlcCwgImNsYXNz IiwgZGFwZmlsZSk7CiAgICAgIGZwcmludGYoZGFwZmlsZSwgIlwiLCBcIiVzXCIsIFwiIiwgY2xh c3NuYW1lKTsKICAgICAgaWYgKChzaW5jciA9IGdldG9wdGlvbihzdGVwICsgcywgImUiLCAoY2hh ciAqKSBOVUxMLCAxKSkpCgl7CgkgIHMgKz0gc2luY3I7CgkgIHMgKz0gcHV0bGluZXMoc3RlcCAr IHMsIGRhcGZpbGUsICc7Jyk7Cgl9CiAgICAgIGlmICghbGluZWNtcChzdGVwICsgcywgIjsiKSkK CXMgKz0gMjsKICAgICAgZWxzZQoJewoJICBmcHJpbnRmKHN0ZGVyciwKCQkgICJzYnN0cmFuczog YmVmb3JlICVkOiBtaXNzaW5nIDsgYXQgZW5kIG9mIGNvbnRyYXN0IHN0YXRlbWVudCBpbiBwcm9j IGdsbVxuIiwKCQkgIHNic2xpbmVubyk7CgkgIGV4aXQoMSk7Cgl9CiAgICAgIGZwdXRzKCJcIiwg XCIiLCBkYXBmaWxlKTsKICAgICAgY29weWxpc3Qoc3RlcCwgImJ5IiwgZGFwZmlsZSk7CiAgICAg IGZwdXRzKCJcIik7XG50aXRsZShOVUxMKTtcbiIsIGRhcGZpbGUpOwogICAgfQogIGZyZWUoY29l ZmYpOwoKICAvKiBub3cgZG8gbHNtZWFucyBzdGF0ZW1lbnQocykgdGhhdCB3ZSBoYXZlbid0IGRv bmUgeWV0LCBpZiBhbnkgKi8KCiAgd2hpbGUgKChzID0gZmluZHN0YXRlbWVudChzdGVwICsgbHNt ZWFucywgImxzbWVhbnMiKSkpIC8qIGZpbmQgbmV4dCBsc21lYW5zIHN0YXRlbWVudCAqLwogICAg ewogICAgICBsc21lYW5zICs9IHM7CiAgICAgIC8qIGZpcnN0IGdldCBwb3NpdGlvbiBvZiBkZW5v bWluYXRvciwgaWYgYW55ICovCiAgICAgIGUgPSBsc21lYW5zICsgZ2V0b3B0aW9uKHN0ZXAgKyBs c21lYW5zLCAiZSIsIChjaGFyICopIE5VTEwsIDEpOwogICAgICBpZiAoIWdldG9wdGlvbihzdGVw ICsgbHNtZWFucywgImFscGhhIiwgbGV2ZWwsIDEpKQoJc3RyY3B5KGxldmVsLCAiMC4wNSIpOwog ICAgICAvKiBnZXQgdGVzdCB0eXBlICovCiAgICAgIHRlc3RbMF0gPSAnXDAnOyAvKiBpbiBjYXNl IHdlIG5ldmVyIGZpbmQgb25lICovCiAgICAgIGZvciAocyA9IGxzbWVhbnM7IHN0ZXBbc10gJiYg c3RlcFtzXSAhPSAnLycgJiYgc3RlcFtzXSAhPSAnOyc7IHMrKykKCTsKICAgICAgaWYgKHN0ZXBb c10gPT0gJy8nKQoJewoJICBmb3IgKHMgKz0gMjsgc3RlcFtzXSAmJiBzdGVwW3NdICE9ICc7Jzsg KQoJICAgIHsKCSAgICAgIHMgKz0gbGluZWNweSh0ZXN0LCBzdGVwICsgcykgKyAxOwoJICAgICAg dXBwZXIodGVzdCk7CgkgICAgICBpZiAoc3RyY21wKHRlc3QsICJEVU5ORVRUIikgJiYgc3RyY21w KHRlc3QsICJUVUtFWSIpICYmIHN0cmNtcCh0ZXN0LCAiTFNEIikpCgkJdGVzdFswXSA9ICdcMCc7 IC8qIHdhc24ndCwgYWZ0ZXIgYWxsICovCgkgICAgfQoJfQogICAgICBpZiAoIXRlc3RbMF0pCgl7 CgkgIGZwcmludGYoc3RkZXJyLAoJCSAgInNic3RyYW5zOiBiZWZvcmUgJWQ6IG5vIHRlc3Qgc3Bl Y2lmaWVkIGluIGxzbWVhbnMgc3RhdGVtZW50IGluIHByb2MgZ2xtXG4iLAoJCSAgc2JzbGluZW5v KTsKCSAgZXhpdCgxKTsKCX0KICAgICAgdXBwZXIodGVzdCk7CiAgICAgIGZvciAocyA9IGxzbWVh bnM7IHN0ZXBbc10gJiYgc3RlcFtzXSAhPSAnLycgJiYgc3RlcFtzXSAhPSAnOyc7IHMrKykKCXsg Lyogb25lIHRlcm0gYXQgYSB0aW1lICovCgkgIGZwcmludGYoZGFwZmlsZSwgImZ0ZXN0KFwiJXMu c3J0Lm1ucy5jb25cIiwgXCIlcyAiLCBzZXRuYW1lLCByZXNwb25zZSk7CgkgIGNvcHlsaXN0KHN0 ZXAsICJjbGFzcyIsIGRhcGZpbGUpOwoJICBmcHV0cygiXCIsIFwiIiwgZGFwZmlsZSk7CgkgIC8q IGhlcmUgY29tZXMgdGhlIG51bWVyYXRvciAqLwoJICB0ZXJtID0gczsgLyogbWFyayB0aGlzIHBs YWNlIGZvciBjYWxsIHRvIGxzbWVhbnMgKi8KCSAgcyArPSBwdXRsaW5lcyhzdGVwICsgcywgZGFw ZmlsZSwgJ1xuJyk7CgkgIGZwdXRzKCJcIiwgXCIiLCBkYXBmaWxlKTsKCSAgaWYgKGUgPiBsc21l YW5zKSAvKiBwdXQgZGVub21pbmF0b3IgKi8KCSAgICB7CgkgICAgICBmb3IgKHMgPSBlOyBzdGVw W3NdICYmIHN0ZXBbc10gIT0gJzsnICYmIGxpbmVjbXAoc3RlcCArIHMsICJhbHBoYSIpICYmCgkJ ICAgICBsaW5lY21wKHN0ZXAgKyBzLCAiZHVubmV0dCIpICYmIGxpbmVjbXAoc3RlcCArIHMsICJ0 dWtleSIpICYmCgkJICAgICBsaW5lY21wKHN0ZXAgKyBzLCAibHNkIik7IHMgKz0gcHV0bGluZXMo c3RlcCArIHMsIGRhcGZpbGUsICdcbicpICsgMSkKCQk7CgkgICAgfQoJICBmcHV0cygiXCIsIFwi IiwgZGFwZmlsZSk7CgkgIGNvcHlsaXN0KHN0ZXAsICJieSIsIGRhcGZpbGUpOwoJICBmcHV0cygi XCIpO1xuIiwgZGFwZmlsZSk7CgoJICAvKiBub3cgdGhlIGxzbWVhbnMgc3RhdGVtZW50ICovCgoJ ICBmcHJpbnRmKGRhcGZpbGUsICJsc21lYW5zKFwiJXMuc3J0Lm1ucy50c3RcIiwgXCIlc1wiLCAl cywgXCIlcyAiLAoJCSAgc2V0bmFtZSwgdGVzdCwgbGV2ZWwsIHJlc3BvbnNlKTsKCSAgY29weWxp c3Qoc3RlcCwgImNsYXNzIiwgZGFwZmlsZSk7CgkgIGZwdXRzKCJcIiwgXCIiLCBkYXBmaWxlKTsK CSAgcyA9IHRlcm0gKyBwdXRsaW5lcyhzdGVwICsgdGVybSwgZGFwZmlsZSwgJ1xuJyk7CgkgIGZw dXRzKCJcIiwgXCIiLCBkYXBmaWxlKTsKCSAgY29weWxpc3Qoc3RlcCwgImJ5IiwgZGFwZmlsZSk7 CgkgIGZwdXRzKCJcIiwgXCJzMTJcIik7XG4iLCBkYXBmaWxlKTsKCX0KICAgIH0KfQoKLyogVHJh bnNsYXRlIGNhbGwgdG8gTE9HSVNUSUMuIHN0ZXAgc3RhcnRzIGFmdGVyICJwcm9jIGxvZ2lzdGlj IiAqLwp2b2lkIGxvZ2lzdGljdHJhbnMoY2hhciAqc3RlcCwgRklMRSAqZGFwZmlsZSkKewogIGlu dCBzOyAvKiBpbmRleCB0byBzdGVwICovCiAgY2hhciBzZXRuYW1lW1RPS0VOTEVOICsgMV07CiAg Y2hhciBvdXRuYW1lW1RPS0VOTEVOICsgMV07CgogIGlmICghZ2V0b3B0aW9uKHN0ZXAsICJkYXRh Iiwgc2V0bmFtZSwgMSkpCiAgICBzdHJjcHkoc2V0bmFtZSwgc2JzdG1wKTsKCiAgZnByaW50Zihk YXBmaWxlLCAibG9ncmVnKFwiJXNcIiwgXCIiLCBzZXRuYW1lKTsKICBpZiAoKHMgPSBmaW5kc3Rh dGVtZW50KHN0ZXAsICJtb2RlbCIpKSkKICAgIHsKICAgICAgLyogcmVzcG9uc2UgdmFyaWFibGUg Ki8KICAgICAgcyArPSBwdXRsaW5lcyhzdGVwICsgcywgZGFwZmlsZSwgJ1xuJykgKyAxOyAvKiBv bmx5IG9uZSByZXNwb25zZSB2YXJpYWJsZSBhbGxvd2VkICovCiAgICAgIHB1dGMoJy8nLCBkYXBm aWxlKTsgLyogYm90aCBmb3JtcyB1c2UgLyBpbiBEYXAgKi8KICAgICAgaWYgKHN0ZXBbc10gPT0g Jy8nKSAvKiB3ZSBoYXZlIHRoZSBldmVudHMgLyB0cmlhbHMgZm9ybSAqLwoJewoJICBzICs9IDI7 CgkgIHMgKz0gcHV0bGluZXMoc3RlcCArIHMsIGRhcGZpbGUsICdcbicpICsgMTsKCX0KICAgICAg ZWxzZQoJcHV0YygnMScsIGRhcGZpbGUpOyAvKiBiaW5hcnkgcmVzcG9uc2UgKi8KICAgICAgaWYg KHN0ZXBbc10gPT0gJz0nKQoJewoJICBmcHV0cygiXCIsIFwiXCIsIFwiIiwgZGFwZmlsZSk7IC8q IHgwLXZhci1saXN0IGlzIGVtcHR5ICovCgkgIHMgKz0gMjsKCSAgcyArPSBwdXRsaW5lcyhzdGVw ICsgcywgZGFwZmlsZSwgJzsnKTsKCSAgZnB1dHMoIlwiLCBcIiIsIGRhcGZpbGUpOyAvKiBjbG9z ZXMgdGhlIHgxIHZhcmlhYmxlIGxpc3QgKi8KCSAgY29weWxpc3Qoc3RlcCwgImJ5IiwgZGFwZmls ZSk7CgkgIGZwdXRzKCJcIiwgTlVMTCwgMC45NSk7XG4iLCBkYXBmaWxlKTsKCX0KICAgICAgZWxz ZQoJewoJICBmcHJpbnRmKHN0ZGVyciwKCQkgICJzYnN0cmFuczogYmVmb3JlICVkOiBtaXNzaW5n ID0gaW4gbW9kZWwgc3RhdGVtZW50IGluIHByb2MgbG9naXN0aWMuXG4iLAoJCSAgc2JzbGluZW5v KTsKCSAgZXhpdCgxKTsKCX0KICAgIH0KICBlbHNlCiAgICB7CiAgICAgIGZwcmludGYoc3RkZXJy LCAic2JzdHJhbnM6IGJlZm9yZSAlZDogbWlzc2luZyBtb2RlbCBzdGF0ZW1lbnQgaW4gcHJvYyBs b2dpc3RpYy5cbiIsCgkgICAgICBzYnNsaW5lbm8pOwogICAgICBleGl0KDEpOwogICAgfQogIGlm IChnZXRvcHRpb24oc3RlcCwgIm91dGVzdCIsIG91dG5hbWUsIDEpKQogICAgewogICAgICBmcHJp bnRmKGRhcGZpbGUsICJkYXRhc2V0KFwiJXMuY292XCIsIFwiJXNcIiwgXCJSRU5BTUVcIik7XG4i LCBzZXRuYW1lLCBvdXRuYW1lKTsKICAgICAgc3RyY3B5KHNic3RtcCwgb3V0bmFtZSk7CiAgICB9 Cn0KCi8qIFRyYW5zbGF0ZSBjYWxsIHRvIE5QQVIxV0FZLiBzdGVwIHN0YXJ0cyBhZnRlciAicHJv YyBucGFyMXdheSIgKi8Kdm9pZCBucGFyMXdheXRyYW5zKGNoYXIgKnN0ZXAsIEZJTEUgKmRhcGZp bGUpCnsKICBpbnQgczsgLyogaW5kZXggdG8gc3RlcCAqLwogIGNoYXIgc2V0bmFtZVtUT0tFTkxF TiArIDFdOwogIGNoYXIgY2xhc3NuYW1lW1RPS0VOTEVOICsgMV07IC8qIG5hbWUgb2YgY2xhc3Mg dmFyaWFibGUgKi8KCiAgaWYgKCFnZXRvcHRpb24oc3RlcCwgImRhdGEiLCBzZXRuYW1lLCAxKSkK ICAgIHN0cmNweShzZXRuYW1lLCBzYnN0bXApOwoKICBpZiAoKHMgPSBmaW5kc3RhdGVtZW50KHN0 ZXAsICJjbGFzcyIpKSkKICAgIGxpbmVjcHkoY2xhc3NuYW1lLCBzdGVwICsgcyk7CiAgZWxzZQog ICAgewogICAgICBmcHJpbnRmKHN0ZGVyciwgInNic3RyYW5zOiBiZWZvcmUgJWQ6IG1pc3Npbmcg Y2xhc3Mgc3RhdGVtZW50IGluIHByb2MgbnBhcjF3YXkuXG4iLAoJICAgICAgc2JzbGluZW5vKTsK ICAgICAgZXhpdCgxKTsKICAgIH0KCiAgaWYgKChzID0gZmluZHN0YXRlbWVudChzdGVwLCAidmFy IikpKQogICAgewogICAgICB3aGlsZSAoc3RlcFtzXSAmJiBzdGVwW3NdICE9ICc7JykgLyogaWYg dGhlcmUgYXJlIG11bHRpcGxlIHZhcmlhYmxlcywgdGhlbi4uLiAqLwoJeyAvKiBuZWVkIHRvIHJ1 biBub25wYXJhbSBmb3IgZWFjaCAqLwoJICBmcHJpbnRmKGRhcGZpbGUsICJub25wYXJhbShcIiVz XCIsIFwiIiwgc2V0bmFtZSk7CgkgIHdoaWxlIChzdGVwW3NdICYmIHN0ZXBbc10gIT0gJ1xuJykK CSAgICB7CgkgICAgICBwdXRjKHN0ZXBbc10sIGRhcGZpbGUpOwoJICAgICAgcysrOwoJICAgIH0K CSAgZnByaW50ZihkYXBmaWxlLCAiICVzXCIsIFwiIiwgY2xhc3NuYW1lKTsKCSAgY29weWxpc3Qo c3RlcCwgImJ5IiwgZGFwZmlsZSk7CgkgIGZwdXRzKCJcIik7XG4iLCBkYXBmaWxlKTsKCSAgcysr OwoJfQogICAgICBpZiAoc3RlcFtzXSAhPSAnOycpCgl7CgkgIGZwcmludGYoc3RkZXJyLCAic2Jz dHJhbnM6IGJlZm9yZSAlZDogbWlzc2luZyA7IGF0IGVuZCBvZiBwcm9jIG5wYXIxd2F5LlxuIiwK CQkgIHNic2xpbmVubyk7CgkgIGV4aXQoMSk7Cgl9CiAgICB9CiAgZWxzZQogICAgewogICAgICBm cHJpbnRmKHN0ZGVyciwgInNic3RyYW5zOiBiZWZvcmUgJWQ6IG1pc3NpbmcgdmFyIHN0YXRlbWVu dCBpbiBwcm9jIG5wYXIxd2F5LlxuIiwKCSAgICAgIHNic2xpbmVubyk7CiAgICAgIGV4aXQoMSk7 CiAgICB9Cn0KCi8qIFRyYW5zbGF0ZSBjYWxsIHRvIFJFRy4gc3RlcCBzdGFydHMgYWZ0ZXIgInBy b2MgcmVnIiAqLwp2b2lkIHJlZ3RyYW5zKGNoYXIgKnN0ZXAsIEZJTEUgKmRhcGZpbGUpCnsKICBp bnQgczsgLyogaW5kZXggdG8gc3RlcCAqLwogIGNoYXIgc2V0bmFtZVtUT0tFTkxFTiArIDFdOwog IGNoYXIgb3V0bmFtZVtUT0tFTkxFTiArIDFdOwogIGludCBpc2FkZDsgLyogaXMgdGhlcmUgYW4g YWRkIHN0YXRlbWVudD8gKi8KCiAgaWYgKCFnZXRvcHRpb24oc3RlcCwgImRhdGEiLCBzZXRuYW1l LCAxKSkKICAgIHN0cmNweShzZXRuYW1lLCBzYnN0bXApOwoKICBpZiAoZmluZHN0YXRlbWVudChz dGVwLCAicGxvdCIpKSAvKiB3ZSdyZSBnb2luZyB0byBjYWxsIHBsb3RsaW5yZWcgKi8KICAgIHsK ICAgICAgaWYgKGlzYnkoc3RlcCkgPj0gMCkKCWNvdW50cGFydHMoc3RlcCwgc2V0bmFtZSwgZGFw ZmlsZSk7CiAgICAgIGVsc2UKCWZwdXRzKCJfc2JzcGljdGNudF9bX3Nic25waWN0c19dID0gMTtc biIsIGRhcGZpbGUpOwogICAgICBmcHJpbnRmKGRhcGZpbGUsICJfc2JzcGljdF9bX3Nic25waWN0 c19dID0gcGxvdGxpbnJlZyhcIiVzXCIsIFwiIiwgc2V0bmFtZSk7CiAgICAgIGlmICgocyA9IGZp bmRzdGF0ZW1lbnQoc3RlcCwgIm1vZGVsIikpKQoJewoJICAvKiByZXNwb25zZSB2YXJpYWJsZTog bXVzdCBiZSBvbmx5IDEgKi8KCSAgd2hpbGUgKHN0ZXBbc10gJiYgc3RlcFtzXSAhPSAnXG4nKQoJ ICAgIHsKCSAgICAgIHB1dGMoc3RlcFtzXSwgZGFwZmlsZSk7CgkgICAgICBzKys7CgkgICAgfQoJ ICBzKys7CgkgIGlmIChzdGVwW3NdID09ICc9JykKCSAgICB7CgkgICAgICBmcHV0cygiXCIsIFwi IiwgZGFwZmlsZSk7CgkgICAgICBmb3IgKHMgKz0gMjsgc3RlcFtzXSAmJiBzdGVwW3NdICE9ICdc bic7IHMrKykKCQlwdXRjKHN0ZXBbc10sIGRhcGZpbGUpOwoJICAgICAgaWYgKHN0ZXBbcyArIDFd ICE9ICc7JykKCQl7CgkJICBmcHJpbnRmKHN0ZGVyciwKCQkJICAic2JzdHJhbnM6IGJlZm9yZSAl ZDogb25seSBvbmUgZXhwbGFuYXRvcnkgdmFyaWFibGUgYWxsb3dlZCBpbiBtb2RlbCBzdGF0ZW1l bnQgaW4gcHJvYyByZWcgd2l0aCBwbG90dGluZ1xuIiwKCQkJICBzYnNsaW5lbm8pOwoJCSAgZXhp dCgxKTsKCQl9CgkgICAgICBmcHV0cygiXCIsIFwiPT1cIiwgXCIiLCBkYXBmaWxlKTsKCSAgICAg IGNvcHlsaXN0KHN0ZXAsICJieSIsIGRhcGZpbGUpOwoJICAgICAgZnB1dHMoIlwiLCBfc2JzcGlj dGNudF9bX3Nic25waWN0c19dLCAwLjk1KTtcbiIsIGRhcGZpbGUpOwoJICAgICAgZnB1dHMoIl9z YnNwaWN0cGFnZV9bX3Nic25waWN0c18rK10gPSA0O1xuIiwgZGFwZmlsZSk7CgkgICAgICBzYnNo YXNwaWN0cyA9IDE7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgZnByaW50ZihzdGRlcnIs CgkJICAgICAgInNic3RyYW5zOiBiZWZvcmUgJWQ6IG9ubHkgb25lIHJlc3BvbnNlIHZhcmlhYmxl IGFsbG93ZWQgaW4gbW9kZWwgc3RhdGVtZW50IGluIHByb2MgcmVnIHdpdGggcGxvdHRpbmdcbiIs CgkJICAgICAgc2JzbGluZW5vKTsKCSAgICAgIGV4aXQoMSk7CgkgICAgfQoJfQogICAgICBlbHNl Cgl7CgkgIGZwcmludGYoc3RkZXJyLCAic2JzdHJhbnM6IGJlZm9yZSAlZDogbWlzc2luZyBtb2Rl bCBzdGF0ZW1lbnQgaW4gcHJvYyByZWcuXG4iLAoJCSAgc2JzbGluZW5vKTsKCSAgZXhpdCgxKTsK CX0KICAgIH0KICBlbHNlIC8qIGp1c3QgdXNlIGxpbnJlZyAqLwogICAgewogICAgICBmcHJpbnRm KGRhcGZpbGUsICJsaW5yZWcoXCIlc1wiLCBcIiIsIHNldG5hbWUpOwogICAgICBpZiAoKHMgPSBm aW5kc3RhdGVtZW50KHN0ZXAsICJtb2RlbCIpKSkKCXsKCSAgLyogcmVzcG9uc2UgdmFyaWFibGVz ICovCgkgIHMgKz0gcHV0bGluZXMoc3RlcCArIHMsIGRhcGZpbGUsICc9Jyk7CgkgIGlmIChzdGVw W3NdID09ICc9JykKCSAgICB7CgkgICAgICBmcHV0cygiXCIsIFwiIiwgZGFwZmlsZSk7CgkgICAg ICBpZiAoIShpc2FkZCA9IGZpbmRzdGF0ZW1lbnQoc3RlcCwgImFkZCIpKSkgLyogcmVkdWNlZCBt b2RlbCBpcyBpbnRlcmNlcHQgb25seSAqLwoJCWZwdXRzKCJcIiwgXCIiLCBkYXBmaWxlKTsgLyog Y2xvc2UgeDAtdmFyaWFibGVzIGxpc3QgKi8KCSAgICAgIHMgKz0gMjsKCSAgICAgIHMgKz0gcHV0 bGluZXMoc3RlcCArIHMsIGRhcGZpbGUsICc7Jyk7CgkgICAgICBmcHV0cygiXCIsIFwiIiwgZGFw ZmlsZSk7IC8qIGVpdGhlciBjbG9zZXMgdGhlIHgwIG9yIHgxIHZhcmlhYmxlIGxpc3QgKi8KCSAg ICAgIGlmIChpc2FkZCkgLyogcHV0IGluIHRoZSB4MS12YXJpYWJsZXMgKi8KCQl7CgkJICBjb3B5 bGlzdChzdGVwLCAiYWRkIiwgZGFwZmlsZSk7CgkJICBmcHV0cygiXCIsIFwiIiwgZGFwZmlsZSk7 IC8qIGNsb3NlcyB0aGUgeDEgdmFyaWFibGUgbGlzdCAqLwoJCX0KCSAgICAgIGNvcHlsaXN0KHN0 ZXAsICJieSIsIGRhcGZpbGUpOwoJICAgICAgZnB1dHMoIlwiLCBOVUxMLCAwLjk1KTtcbiIsIGRh cGZpbGUpOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIGZwcmludGYoc3RkZXJyLAoJCSAg ICAgICJzYnN0cmFuczogYmVmb3JlICVkOiBtaXNzaW5nID0gaW4gbW9kZWwgc3RhdGVtZW50IGlu IHByb2MgcmVnLlxuIiwKCQkgICAgICBzYnNsaW5lbm8pOwoJICAgICAgZXhpdCgxKTsKCSAgICB9 Cgl9CiAgICAgIGVsc2UKCXsKCSAgZnByaW50ZihzdGRlcnIsICJzYnN0cmFuczogYmVmb3JlICVk OiBtaXNzaW5nIG1vZGVsIHN0YXRlbWVudCBpbiBwcm9jIHJlZy5cbiIsCgkJICBzYnNsaW5lbm8p OwoJICBleGl0KDEpOwoJfQogICAgfQogIGlmIChnZXRvcHRpb24oc3RlcCwgIm91dGVzdCIsIG91 dG5hbWUsIDEpKQogICAgewogICAgICBmcHJpbnRmKGRhcGZpbGUsICJkYXRhc2V0KFwiJXMuY292 XCIsIFwiJXNcIiwgXCJSRU5BTUVcIik7XG4iLCBzZXRuYW1lLCBvdXRuYW1lKTsKICAgICAgc3Ry Y3B5KHNic3RtcCwgb3V0bmFtZSk7CiAgICB9Cn0KCi8qIFRyYW5zbGF0ZSBjYWxsIHRvIERBUC4g c3RlcCBzdGFydHMgYWZ0ZXIgInByb2MgZGFwIiAqLwp2b2lkIGRhcHRyYW5zKGNoYXIgKnN0ZXAs IEZJTEUgKmRhcGZpbGUpCnsKICBpbnQgczsgLyogaW5kZXggdG8gc3RlcCAqLwogIGludCBicmFj ZTsgLyogbGV2ZWwgb2YgYnJhY2VzIG5lc3RpbmcgKi8KCiAgcyA9IDA7CiAgaWYgKHN0ZXBbc10g IT0gJzsnKQogICAgewogICAgICBmcHJpbnRmKHN0ZGVyciwgInNic3RyYW5zOiBiZWZvcmUgJWQ6 IG5vIG9wdGlvbnMgYWxsb3dlZCBmb3IgcHJvYyBkYXBcbiIsIHNic2xpbmVubyk7CiAgICAgIGV4 aXQoMSk7CiAgICB9CiAgcyArPSAyOwogIGlmIChzdGVwW3NdID09ICd7JykKICAgIHsKICAgICAg ZnB1dHMoIntcbiIsIGRhcGZpbGUpOwogICAgICBmb3IgKHMgKz0gMiwgYnJhY2UgPSAxOyBicmFj ZSAmJiBzdGVwW3NdOyBzKyspCgl7CgkgIGlmIChzdGVwW3NdID09ICdcbicpCgkgICAgcHV0Yygn ICcsIGRhcGZpbGUpOwoJICBlbHNlCgkgICAgcHV0YyhzdGVwW3NdLCBkYXBmaWxlKTsKCSAgaWYg KHN0ZXBbc10gPT0gJzsnIHx8IHN0ZXBbc10gPT0gJ3snIHx8IHN0ZXBbc10gPT0gJ30nKQoJICAg IHB1dGMoJ1xuJywgZGFwZmlsZSk7CgkgIGlmIChzdGVwW3NdID09ICd7JykKCSAgICBicmFjZSsr OwoJICBlbHNlIGlmIChzdGVwW3NdID09ICd9JykKCSAgICAtLWJyYWNlOwoJfQogICAgICBpZiAo YnJhY2UpCgl7CgkgIGZwcmludGYoc3RkZXJyLCAic2JzdHJhbnM6IGJlZm9yZSAlZDogbWlzc2lu ZyB9IGluIHByb2MgZGFwXG4iLCBzYnNsaW5lbm8pOwoJICBleGl0KDEpOwoJfQogICAgICBwdXRj KCdcbicsIGRhcGZpbGUpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgcyArPSBwdXRsaW5lcyhz dGVwICsgcywgZGFwZmlsZSwgJzsnKTsKICAgICAgaWYgKHN0ZXBbc10gIT0gJzsnKQoJewoJICBm cHJpbnRmKHN0ZGVyciwgInNic3RyYW5zOiBiZWZvcmUgJWQ6IG1pc3NpbmcgOyBpbiBwcm9jIGRh cFxuIiwgc2JzbGluZW5vKTsKCSAgZXhpdCgxKTsKCX0KICAgICAgZnB1dHMoIjtcbiIsIGRhcGZp bGUpOwogICAgfQp9Cg== --089e015369141cc8d104daffc484--