ZGlmZiAtLWdpdCBhL1Rvb2xzL2kxOG4vbXNnZm10LnB5IGIvVG9vbHMvaTE4bi9tc2dmbXQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWE3MmEwNwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL2kxOG4vbXNnZm10LnB5CkBAIC0wLDAgKzEsMTk0IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgV3JpdHRlbiBieSBNYXJ0aW4gdi4gTPZ3aXMgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KKworIiIiR2VuZXJhdGUgYmluYXJ5IG1lc3NhZ2UgY2F0YWxvZyBmcm9tIHRleHR1YWwgdHJhbnNsYXRpb24gZGVzY3JpcHRpb24uCisKK1RoaXMgcHJvZ3JhbSBjb252ZXJ0cyBhIHRleHR1YWwgVW5pZm9ydW0tc3R5bGUgbWVzc2FnZSBjYXRhbG9nICgucG8gZmlsZSkgaW50bworYSBiaW5hcnkgR05VIGNhdGFsb2cgKC5tbyBmaWxlKS4gIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlCitHTlUgbXNnZm10IHByb2dyYW0sIGhvd2V2ZXIsIGl0IGlzIGEgc2ltcGxlciBpbXBsZW1lbnRhdGlvbi4KKworVXNhZ2U6IG1zZ2ZtdC5weSBbT1BUSU9OU10gZmlsZW5hbWUucG8KKworT3B0aW9uczoKKyAgICAtaAorICAgIC0taGVscAorICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQuCisKKyAgICAtVgorICAgIC0tdmVyc2lvbgorICAgICAgICBEaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQuCisKKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgZ2V0b3B0CitpbXBvcnQgc3RydWN0CitpbXBvcnQgYXJyYXkKKworX192ZXJzaW9uX18gPSAiMS4wIgorCitNRVNTQUdFUyA9IHt9CisKKworDAorZGVmIHVzYWdlKGNvZGUsIG1zZz0nJyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX19kb2NfXworICAgIGlmIG1zZzoKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCisgICAgc3lzLmV4aXQoY29kZSkKKworCisMCitkZWYgYWRkKGlkLCBzdHIsIGZ1enp5KToKKyAgICAiQWRkIGEgbm9uLWZ1enp5IHRyYW5zbGF0aW9uIHRvIHRoZSBkaWN0aW9uYXJ5LiIKKyAgICBnbG9iYWwgTUVTU0FHRVMKKyAgICBpZiBub3QgZnV6enkgYW5kIHN0cjoKKyAgICAgICAgTUVTU0FHRVNbaWRdID0gc3RyCisKKworDAorZGVmIGdlbmVyYXRlKCk6CisgICAgIlJldHVybiB0aGUgZ2VuZXJhdGVkIG91dHB1dC4iCisgICAgZ2xvYmFsIE1FU1NBR0VTCisgICAga2V5cyA9IE1FU1NBR0VTLmtleXMoKQorICAgICMgdGhlIGtleXMgYXJlIHNvcnRlZCBpbiB0aGUgLm1vIGZpbGUKKyAgICBrZXlzLnNvcnQoKQorICAgIG9mZnNldHMgPSBbXQorICAgIGlkcyA9IHN0cnMgPSAnJworICAgIGZvciBpZCBpbiBrZXlzOgorICAgICAgICAjIEZvciBlYWNoIHN0cmluZywgd2UgbmVlZCBzaXplIGFuZCBmaWxlIG9mZnNldC4gIEVhY2ggc3RyaW5nIGlzIE5VTAorICAgICAgICAjIHRlcm1pbmF0ZWQ7IHRoZSBOVUwgZG9lcyBub3QgY291bnQgaW50byB0aGUgc2l6ZS4KKyAgICAgICAgb2Zmc2V0cy5hcHBlbmQoKGxlbihpZHMpLCBsZW4oaWQpLCBsZW4oc3RycyksIGxlbihNRVNTQUdFU1tpZF0pKSkKKyAgICAgICAgaWRzICs9IGlkICsgJ1wwJworICAgICAgICBzdHJzICs9IE1FU1NBR0VTW2lkXSArICdcMCcKKyAgICBvdXRwdXQgPSAnJworICAgICMgVGhlIGhlYWRlciBpcyA3IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4gIFdlIGRvbid0IHVzZSBoYXNoIHRhYmxlcywgc28KKyAgICAjIHRoZSBrZXlzIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSBpbmRleCB0YWJsZXMuCisgICAgIyB0cmFuc2xhdGVkIHN0cmluZy4KKyAgICBrZXlzdGFydCA9IDcqNCsxNipsZW4oa2V5cykKKyAgICAjIGFuZCB0aGUgdmFsdWVzIHN0YXJ0IGFmdGVyIHRoZSBrZXlzCisgICAgdmFsdWVzdGFydCA9IGtleXN0YXJ0ICsgbGVuKGlkcykKKyAgICBrb2Zmc2V0cyA9IFtdCisgICAgdm9mZnNldHMgPSBbXQorICAgICMgVGhlIHN0cmluZyB0YWJsZSBmaXJzdCBoYXMgdGhlIGxpc3Qgb2Yga2V5cywgdGhlbiB0aGUgbGlzdCBvZiB2YWx1ZXMuCisgICAgIyBFYWNoIGVudHJ5IGhhcyBmaXJzdCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nLCB0aGVuIHRoZSBmaWxlIG9mZnNldC4KKyAgICBmb3IgbzEsIGwxLCBvMiwgbDIgaW4gb2Zmc2V0czoKKyAgICAgICAga29mZnNldHMgKz0gW2wxLCBvMStrZXlzdGFydF0KKyAgICAgICAgdm9mZnNldHMgKz0gW2wyLCBvMit2YWx1ZXN0YXJ0XQorICAgIG9mZnNldHMgPSBrb2Zmc2V0cyArIHZvZmZzZXRzCisgICAgb3V0cHV0ID0gc3RydWN0LnBhY2soImlpaWlpaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTUwNDEyZGUsICAgICAgICAjIE1hZ2ljCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICMgVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihrZXlzKSwgICAgICAgICAjICMgb2YgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgICAgIDcqNCwgICAgICAgICAgICAgICAjIHN0YXJ0IG9mIGtleSBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgIDcqNCtsZW4oa2V5cykqOCwgICAjIHN0YXJ0IG9mIHZhbHVlIGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCkgICAgICAgICAgICAgICMgc2l6ZSBhbmQgb2Zmc2V0IG9mIGhhc2ggdGFibGUKKyAgICBvdXRwdXQgKz0gYXJyYXkuYXJyYXkoImkiLCBvZmZzZXRzKS50b3N0cmluZygpCisgICAgb3V0cHV0ICs9IGlkcworICAgIG91dHB1dCArPSBzdHJzCisgICAgcmV0dXJuIG91dHB1dAorCisKKwwKK2RlZiBtYWtlKGZpbGVuYW1lKToKKyAgICBJRCA9IDEKKyAgICBTVFIgPSAyCisKKyAgICAjIENvbXB1dGUgLm1vIG5hbWUgZnJvbSAucG8gbmFtZQorICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucG8nKToKKyAgICAgICAgaW5maWxlID0gZmlsZW5hbWUKKyAgICAgICAgb3V0ZmlsZSA9IGZpbGVuYW1lWzotMl0gKyAnbW8nCisgICAgZWxzZToKKyAgICAgICAgaW5maWxlID0gZmlsZW5hbWUgKyAnLnBvJworICAgICAgICBvdXRmaWxlID0gZmlsZW5hbWUgKyAnLm1vJworICAgIHRyeToKKyAgICAgICAgbGluZXMgPSBvcGVuKGluZmlsZSkucmVhZGxpbmVzKCkKKyAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtc2cKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAKKyAgICBzZWN0aW9uID0gTm9uZQorICAgIGZ1enp5ID0gMAorCisgICAgIyBQYXJzZSB0aGUgY2F0YWxvZworICAgIGxubyA9IDAKKyAgICBmb3IgbCBpbiBsaW5lczoKKyAgICAgICAgbG5vICs9IDEKKyAgICAgICAgIyBJZiB3ZSBnZXQgYSBjb21tZW50IGxpbmUgYWZ0ZXIgYSBtc2dzdHIsIHRoaXMgaXMgYSBuZXcgZW50cnkKKyAgICAgICAgaWYgbFswXSA9PSAnIycgYW5kIHNlY3Rpb24gPT0gU1RSOgorICAgICAgICAgICAgYWRkKG1zZ2lkLCBtc2dzdHIsIGZ1enp5KQorICAgICAgICAgICAgc2VjdGlvbiA9IE5vbmUKKyAgICAgICAgICAgIGZ1enp5ID0gMAorICAgICAgICAjIFJlY29yZCBhIGZ1enp5IG1hcmsKKyAgICAgICAgaWYgbFs6Ml0gPT0gJyMsJyBhbmQgbC5maW5kKCdmdXp6eScpOgorICAgICAgICAgICAgZnV6enkgPSAxCisgICAgICAgICMgU2tpcCBjb21tZW50cworICAgICAgICBpZiBsWzBdID09ICcjJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICMgTm93IHdlIGFyZSBpbiBhIG1zZ2lkIHNlY3Rpb24sIG91dHB1dCBwcmV2aW91cyBzZWN0aW9uCisgICAgICAgIGlmIGwuc3RhcnRzd2l0aCgnbXNnaWQnKToKKyAgICAgICAgICAgIGlmIHNlY3Rpb24gPT0gU1RSOgorICAgICAgICAgICAgICAgIGFkZChtc2dpZCwgbXNnc3RyLCBmdXp6eSkKKyAgICAgICAgICAgIHNlY3Rpb24gPSBJRAorICAgICAgICAgICAgbCA9IGxbNTpdCisgICAgICAgICAgICBtc2dpZCA9IG1zZ3N0ciA9ICcnCisgICAgICAgICMgTm93IHdlIGFyZSBpbiBhIG1zZ3N0ciBzZWN0aW9uCisgICAgICAgIGVsaWYgbC5zdGFydHN3aXRoKCdtc2dzdHInKToKKyAgICAgICAgICAgIHNlY3Rpb24gPSBTVFIKKyAgICAgICAgICAgIGwgPSBsWzY6XQorICAgICAgICAjIFNraXAgZW1wdHkgbGluZXMKKyAgICAgICAgbCA9IGwuc3RyaXAoKQorICAgICAgICBpZiBub3QgbDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICMgWFhYOiBEb2VzIHRoaXMgYWx3YXlzIGZvbGxvdyBQeXRob24gZXNjYXBlIHNlbWFudGljcz8KKyAgICAgICAgbCA9IGV2YWwobCkKKyAgICAgICAgaWYgc2VjdGlvbiA9PSBJRDoKKyAgICAgICAgICAgIG1zZ2lkICs9IGwKKyAgICAgICAgZWxpZiBzZWN0aW9uID09IFNUUjoKKyAgICAgICAgICAgIG1zZ3N0ciArPSBsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnU3ludGF4IGVycm9yIG9uICVzOiVkJyAlIChpbmZpbGUsIGxubyksIFwKKyAgICAgICAgICAgICAgICAgICdiZWZvcmU6JworICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbAorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAjIEFkZCBsYXN0IGVudHJ5CisgICAgaWYgc2VjdGlvbiA9PSBTVFI6CisgICAgICAgIGFkZChtc2dpZCwgbXNnc3RyLCBmdXp6eSkKKworICAgICMgQ29tcHV0ZSBvdXRwdXQKKyAgICBvdXRwdXQgPSBnZW5lcmF0ZSgpCisKKyAgICAjIFNhdmUgb3V0cHV0CisgICAgdHJ5OgorICAgICAgICBvcGVuKG91dGZpbGUsIndiIikud3JpdGUob3V0cHV0KQorICAgIGV4Y2VwdCBJT0Vycm9yLG1zZzoKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCisgICAgICAgICAgICAgICAgICAgICAgCisKKwwKK2RlZiBtYWluKCk6CisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdoVicsIFsnaGVscCcsJ3ZlcnNpb24nXSkKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIHVzYWdlKDEsIG1zZykKKworICAgICMgcGFyc2Ugb3B0aW9ucworICAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOgorICAgICAgICBpZiBvcHQgaW4gKCctaCcsICctLWhlbHAnKToKKyAgICAgICAgICAgIHVzYWdlKDApCisgICAgICAgIGVsaWYgb3B0IGluICgnLVYnLCAnLS12ZXJzaW9uJyk6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAibXNnZm10LnB5IiwgX192ZXJzaW9uX18KKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgIyBkbyBpdAorICAgIGlmIG5vdCBhcmdzOgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnTm8gaW5wdXQgZmlsZSBnaXZlbicKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlRyeSBgbXNnZm10IC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorICAgICAgICByZXR1cm4KKworICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzOgorICAgICAgICBtYWtlKGZpbGVuYW1lKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCg==