ZGlmZiAtLWdpdCBhL3NwZWxsYm9va3MvYWJfc3BlbGxzLmMgYi9zcGVsbGJvb2tzL2FiX3NwZWxscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWFmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcGVsbGJvb2tzL2FiX3NwZWxscy5jCkBAIC0wLDAgKzEsNTM1IEBACisvKiBHaWxkZW5vYmpla3QgZnVlciBBYmVudGV1cmVyIC0gTW9yZ2VuR3JhdWVuICovCisvKiBCb2luZywgMTk5My0xOTk4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogU3BydWVjaGU6CisgICAgIExpY2h0a3VnZWwgaGVyYmVpemF1YmVybjogbGljaHQKKyAgICAgICBNYWdpZXB1bmt0ZSA1LCBTdHVmZSA0CisgICAgICAgRGF1ZXI6IExldmVsICogMjAgU2VrdW5kZW4KKyAgICAgSWRlbnRpZml6aWVyZW46IGlkZW50aWZpemllcmUKKyAgICAgICBNYWdpZXB1bmt0ZSAxMCwgU3R1ZmUgMworICAgICBNb25zdGVyIGVpbnNjaGFldHplbjogc2NoYWV0eiA8bmFtZT4KKyAgICAgICBNYWdpZXB1bmt0ZSAzLCBTdHVmZSAxMAorICAgICBQZmVpbGFuZ3JpZmY6IHBmZWlsIDxuYW1lPgorICAgICAgIFNjaGFkZW4gbWF4aW1hbCAyMCwgTWFnaWVwdW5rdGUgMTAsIFN0dWZlIDExCisgICAgIEdlZ2Vuc3RhZW5kZSB1bnRlcnN1Y2hlbjogaWRlbnRpZml6aWVyZSA8b2JqZWt0PgorICAgICAgIFdlbm4gUF9JTkZPIGV4aXNpdGllcnQsIHdpcmQgZGllcyBhdXNnZWdlYmVuCisgICAgICAgTWFnaWVwdW5rdGUgMTAsIHN0dWZlIDgKKyAgICAgQXVzd2VpY2hlbjogYXVzd2VpY2hlbgorICAgICAgIEdlaHQgbnVyIGltIEthbXBmLCBnZW5hdSBlaW5lciBBdHRhY2tlIHdpcmQgYXVzZ2V3aWNoZW4uCisgICAgICAgTWFnaWVwdW5rdGUgMTAsIFN0dWZlIDEyCisgICAgIEthbXBmc2NocmVpOiBrYW1wZnNjaHJlaSA8b3BmZXI+IGJ6dy4ga2FtcGZzY2hyZWkgbWVsZHVuZyA8bWVsZHVuZz4KKyAgICAgICBEZXIgS2FtcGZzY2hyZWkgd2lyZCBhdXNnZXN0b3NzZW4gdW5kIHZlcmxhbmdzYW10IGRlbiBHZWduZXIuCisgICAgICAgTWFnaWVwdW5rdGUgMzAsIHN0dWZlIDEzCisgICAgIEZldWVyYmFsbDogZmV1ZXJiYWxsIDxuYW1lPgorICAgICAgIFNjaGFkZW4gbWF4aW1hbCA0MCwgTWFnaWVwdW5rdGUgMjAsIFN0dWZlIDE1CisgICAgIFNjaG5lbGxpZ2tlaXQ6IHNjaG5lbGwKKyAgICAgICBHaWJ0IGZ1ZXIgZWluZSBiZXN0aW1tdGUgWmVpdCB6dXNhZXR6bGljaGUgQW5ncmlmZmUKKyAgICAgICBNYWdpZXB1bmt0ZSAxMDAsIFN0dWZlIDE3CisgICAgIFNhZXVyZXN0cmFobDogc2FldXJlc3RyYWhsIDxuYW1lPgorICAgICAgIFNjaGFkZW4gbWF4aW1hbCA2MCwgTWFnaWVwdW5rdGUgMjUsIFN0dWZlIDMwCisqLworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8YXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworI2RlZmluZSBMSUNIVEtVR0VMICIvZ2lsZGVuL2ZpbGVzLmFiZW50ZXVyZXIvbGljaHRrdWdlbCIKKworaW5oZXJpdCAiL3N0ZC9zcGVsbGJvb2siOworCit2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0dMT0JBTF9TS0lMTFBST1BTLAorICAgICAgICAgIChbU0lfU1BFTExGQVRJR1VFOjIsICAgICAgIC8vIDIgU2VrdW5kZW4ga2VpbiBuZXVlciBTcGVsbAorICAgICAgICAgICAgU0lfU0tJTExMRUFSTjo1LCAgICAgICAgIC8vIDAuMDUlIHBybyAyIEFfSU5UCisgICAgICAgICAgICBPRkZTRVQoU0lfU0tJTExMRUFSTik6MTAgLy8gcGx1cyAwLjElIGluIGplZGVtIEZhbGwKKyAgICAgICAgICAgIF0pKTsKKworICAgIEFkZFNwZWxsKCJzdGVpbnNjaGxhZyIsNSwKKyAgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoxXSksCisgICAgICAgICBTSV9TS0lMTERBTUFHRTo0MCwKKyAgICAgICAgIE9GRlNFVChTSV9TS0lMTERBTUFHRSk6NDAsCisgICAgICAgICBTSV9TS0lMTERBTUFHRV9UWVBFOiAoe0RUX0JMVURHRU9OfSksCisgICAgICAgICBTSV9NQUdJQ19UWVBFOih7TVRfQU5HUklGRn0pLAorICAgICAgICAgU0lfU1BFTEw6KFtTUF9OQU1FOiJzdGVpbnNjaGxhZyJdKV0pKTsKKworICBBZGRTcGVsbCgiaWRlbnRpZml6aWVyZSIsMTAsCisgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDozXSksCisgICAgICAgICBTSV9NQUdJQ19UWVBFOiAoeyBNVF9IRUxMU0lDSFQgfSksCisgICAgICAgICBTSV9TUEVMTDogKFtQX05BTUU6ICJpZGVudGlmaXppZXJlIl0pLAorICAgICAgICAgXSkgKTsKKyAgQWRkU3BlbGwoImxpY2h0Iiw1LAorICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDo2XSksCisgICAgICAgIFNJX1NQRUxMOiAoW1BfTkFNRTogImxpY2h0Il0pIAorICAgICAgIF0pICk7CisgIEFkZFNwZWxsKCJzY2hhZXR6IiwzLAorICAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6OF0pLAorICAgICAgICAgU0lfTUFHSUNfVFlQRTogKHsgTVRfSEVMTFNJQ0hUIH0pLAorICAgICAgICAgU0lfU1BFTEw6IChbU1BfTkFNRTogInNjaGFldHoiXSksCisgICAgICAgICBdKSk7CisgIEFkZFNwZWxsKCJwZmVpbCIsMTAsCisgICAgICAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6MTBdKSwKKyAgICAgICAgICAgICAvLyBVbSBkaWVzZW4gU3BydWNoIGxlcm5lbiB6dSBrb2VubmVuIG11c3MKKyAgICAgICAgICAgICAvLyBkZXIgTGV2ZWwgbWluZGVzdGVucyAxMSBzZWluCisgICAgICAgICAgICAgU0lfU0tJTExEQU1BR0U6MjAwLAorICAgICAgICAgICAgIC8vIFNjaGFkZW46IFJhbmRvbSgyMDApIC4uLgorICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX1RZUEU6KHtEVF9NQUdJQ30pLAorICAgICAgICAgICAgIC8vIERhbWFnZSBUeXBlOiBNYWdpYworICAgICAgICAgICAgIFNJX01BR0lDX1RZUEU6ICh7IE1UX0FOR1JJRkYgfSksCisgICAgICAgICAgICAgU0lfU1BFTEw6IChbIFNQX05BTUU6ICJwZmVpbCIgXSksCisgICAgICAgICAgICAgLy8gQm9uaSBm/HIgaGludGVyZSBLYW1wZnJlaWhlbgorICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX0JZX1JPVzogKFsyOjExMCwzOjUwLDQ6MTBdKSwKKyAgICAgICAgICAgICBPRkZTRVQoU0lfU0tJTExEQU1BR0VfQllfUk9XKTogKFsyOjUwLDM6MjAsNDo1XSkKKyAgICAgICAgICAgICBdKSk7CisgIEFkZFNwZWxsKCJhdXN3ZWljaGVuIiwgMTAsCisgICAgICAoW1NJX1NLSUxMUkVTVFJfTEVBUk46KFtQX0xFVkVMOjEzXSksCisgICAgICAgIFNJX1NQRUxMOiAoW1BfTkFNRTogImF1c3dlaWNoZW4iXSksCisgICAgICAgIF0pKTsKKyAgQWRkU3BlbGwoImthbXBmc2NocmVpIiwgMzAsCisgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoxNl0pLAorICAgICAgICAgU0lfTUFHSUNfVFlQRTogKHsgTVRfUFNZQ0hPIH0pLAorICAgICAgICAgU0lfU1BFTEw6IChbU1BfTkFNRTogImthbXBmc2NocmVpIl0pLAorICAgICAgICAgXSkpOworICBBZGRTcGVsbCgiZmV1ZXJiYWxsIiwyMCwKKyAgICAgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoxOF0pLAorICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFOjMwMCwKKyAgICAgICAgICAgICAvLyBTY2hhZGVuOiBSYW5kb20oMzAwKSAuLi4KKyAgICAgICAgICAgICBPRkZTRVQoU0lfU0tJTExEQU1BR0UpOjEwMCwKKyAgICAgICAgICAgICAvLyAuLi4gcGx1cyAxMDAKKyAgICAgICAgICAgICBTSV9TS0lMTERBTUFHRV9UWVBFOih7RFRfRklSRX0pLAorICAgICAgICAgICAgIC8vIERhbWFnZSBUeXBlOiBGaXJlCisgICAgICAgICAgICBTSV9NQUdJQ19UWVBFOiAoeyBNVF9BTkdSSUZGIH0pLAorICAgICAgICAgICAgU0lfU1BFTEw6IChbU1BfTkFNRTogImZldWVyYmFsbCJdKSwKKyAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX0JZX1JPVzogKFsyOjgwLDM6MTUwLDQ6ODAsNToyMF0pLAorICAgICAgICAgICAgT0ZGU0VUKFNJX1NLSUxMREFNQUdFX0JZX1JPVyk6IChbMjozMCwzOjgwLDQ6MzAsNToxMF0pCisgICAgICAgICAgICAgXSkpOworICBBZGRTcGVsbCgic2NobmVsbCIsMTAwLAorICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoyMV0pLAorICAgICAgICBTSV9TUEVMTDogKFtQX05BTUU6ICJzY2huZWxsIl0pIF0pKTsKKyAgQWRkU3BlbGwoInNhZXVyZXN0cmFobCIsMjUsCisgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoyOF0pLAorICAgICAgICAgICAgIE9GRlNFVChTSV9TS0lMTExFQVJOKToxLAorICAgICAgICAgICAgIEZBQ1RPUihTSV9TS0lMTExFQVJOKToyMCwKKyAgICAgICAgICAgICBTSV9TS0lMTERBTUFHRTo0MDAsCisgICAgICAgICAgICAgLy8gU2NoYWRlbjogUmFuZG9tKDQwMCkgLi4uCisgICAgICAgICAgICAgT0ZGU0VUKFNJX1NLSUxMREFNQUdFKToyMDAsCisgICAgICAgICAgICAgLy8gLi4uIHBsdXMgMjAwCisgICAgICAgICAgICAgU0lfU0tJTExEQU1BR0VfVFlQRTooe0RUX0FDSUR9KSwKKyAgICAgICAgICAgICAvLyBEYW1hZ2UgVHlwZTogU2FldXJlCisgICAgICAgICAgICAgU0lfTUFHSUNfVFlQRTogKHsgTVRfQU5HUklGRiB9KSwKKyAgICAgICAgICAgICBTSV9TUEVMTDogKFtTUF9OQU1FOiAic2FldXJlc3RyYWhsIl0pLAorICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX0JZX1JPVzooWzI6NjAsMzoxNTAsNDoyMTAsNToxNTAsNjo2MF0pLAorICAgICAgICAgICAgIE9GRlNFVChTSV9TS0lMTERBTUFHRV9CWV9ST1cpOihbMjozMCwzOjgwLDQ6MTIwLDU6ODAsNjozMF0pCisgICAgICAgICAgICAgXSkpOworCit9CisKK2ludAorc3RlaW5zY2hsYWcob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykgeworICBvYmplY3QgdmljdGltOworICBpbnQgaGFuZHM7CisgIHN0cmluZyB2biwgdm53LCBjbjsKKyAgaW50IHN1YzsKKworICB2aWN0aW09RmluZEVuZW15VmljdGltKHNpbmZvW1NJX1NLSUxMQVJHXSxjYXN0ZXIsCisgICAgICAgICAiVWViZXIgd2VtIHdpbGxzdCBEdSBlaW5lbiBTdGVpbnNjaGxhZyBuaWVkZXJnZWhlbiBsYXNzZW4/XG4iKTsKKyAgaWYgKCF2aWN0aW0pCisgICAgcmV0dXJuIDA7CisgIGlmICgoc3VjPVNwZWxsU3VjY2VzcyhjYXN0ZXIsc2luZm8pKTw9MCkKKyAgICByZXR1cm4gTUlTU0VSRk9MRzsKKyAgaWYgKHN1YyA8IHZpY3RpbS0+U3BlbGxEZWZlbmQoY2FzdGVyLCBzaW5mbykpCisgIHsKKyAgICB0ZWxsX29iamVjdChjYXN0ZXIsIHZpY3RpbS0+TmFtZSgpICsgIiB3ZWhydCBEZWluZW4gU3BydWNoIGFiLlxuIik7CisgICAgcmV0dXJuIEVSRk9MRzsKKyAgfQorCisgIGNuID0gY2FzdGVyLT5OYW1lKCk7CisgIHZudyA9IHZpY3RpbS0+bmFtZShXRU4sIDIpOworICBzYXkoc3ByaW50ZigiJXMgbGFlc3N0IGtsZWluZSBLaWVzZWwgYXVmICVzIGZhbGxlbi5cbiIsY24sIHZudyksCisgICAgICB2aWN0aW0pOworICBwcmludGYoIkR1IGtvbnplbnRyaWVyc3QgRGljaCBkYXJhdWYsIGtsZWluZSBLaWVzZWwgYXVmICVzIGZhbGxlbiB6dSBsYXNzZW4uXG4iLCB2bncpOworICB0ZWxsX29iamVjdCh2aWN0aW0sc3ByaW50ZigiJXMgbGFlc3N0IGtsZWluZSBLaWVzZWwgYXVmIERpY2ggZmFsbGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY24pKTsKKyAgVHJ5RGVmYXVsdEF0dGFja1NwZWxsKHZpY3RpbSxjYXN0ZXIsc2luZm8sCisgICAgICAgICAgICAoW1NQX05BTUU6InN0ZWluc2NobGFnIiwgU1BfUEhZU0lDQUxfQVRUQUNLOjEsU1BfU0hPV19EQU1BR0U6MV0pKTsKKyAgcmV0dXJuIEVSRk9MRzsKK30KKworaW50CitzY2hhZXR6KG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pIHsKKyAgIG9iamVjdCB2aWN0aW07CisgICBpbnQgaHBkaWZmLCB3Y2RpZmYsIGFjZGlmZjsKKyAgIGludCBocCwgdmhwLCB3YywgdndjLCBhYywgdmFjOworICAgc3RyaW5nIHJlc3VsdDsKKyAgIHN0cmluZyB2bmFtZSwgdm5hbWVnZW47CisgICBpbnQgc3VjOworCisgICB2aWN0aW09RmluZExpdmluZ1ZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sY2FzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlbiBtb2VjaHRlc3QgRHUgZWluc2NoYWV0emVuP1xuIik7CisgICBpZiAoIXZpY3RpbSkKKyAgICAgcmV0dXJuIDA7CisgICBpZiAoKHN1Yz1TcGVsbFN1Y2Nlc3MoY2FzdGVyLHNpbmZvKSk8PTApCisgICAgICByZXR1cm4gTUlTU0VSRk9MRzsKKyAgIGlmIChzdWMgPCB2aWN0aW0tPlNwZWxsRGVmZW5kKGNhc3Rlciwgc2luZm8pKQorICAgeworICAgICB0ZWxsX29iamVjdChjYXN0ZXIsIHZpY3RpbS0+TmFtZSgpICsgIiB3ZWhydCBEZWluZW4gU3BydWNoIGFiLlxuIik7CisgICAgIHJldHVybiBFUkZPTEc7CisgICB9CisKKyAgIGhwID0gY2FzdGVyLT5RdWVyeVByb3AoUF9IUCk7ICAgIHZocCA9IHZpY3RpbS0+UXVlcnlQcm9wKFBfSFApOworICAgd2MgPSBjYXN0ZXItPlF1ZXJ5UHJvcChQX1RPVEFMX1dDKTsgIHZ3YyA9IHZpY3RpbS0+UXVlcnlQcm9wKFBfVE9UQUxfV0MpOworICAgYWMgPSBjYXN0ZXItPlF1ZXJ5UHJvcChQX1RPVEFMX0FDKTsgIHZhYyA9IHZpY3RpbS0+UXVlcnlQcm9wKFBfVE9UQUxfQUMpOworICAgaHBkaWZmID0gaHAgLSB2aHA7CisgICB3Y2RpZmYgPSB3YyAtIHZ3YzsKKyAgIGFjZGlmZiA9IGFjIC0gdmFjOworICAgdm5hbWUgPSB2aWN0aW0tPm5hbWUoV0VSLCAxKTsKKyAgIHZuYW1lZ2VuID0gdmljdGltLT5uYW1lKFdFU1NFTiwgMSk7CisKKyAgIGlmIChocGRpZmYgPiAxMCp2aHApCisgICAgICByZXN1bHQgPSBjYXBpdGFsaXplKHZpY3RpbS0+bmFtZShXRVIsIDEpKSsiIHNvbGx0ZSBzaWNoIGJlc3NlciBzY2hvbiBtYWwgZWluZW4gU2FyZyBiZXNvcmdlbi5cbiI7CisgICBlbHNlIGlmIChocGRpZmYgPiA3KnZocCkKKyAgICAgIHJlc3VsdCA9ICJEdSBiaXN0ICIgKyB2aWN0aW0tPm5hbWUoV0VNLCAxKSArICIgaGF1c2hvY2ggdWViZXJsZWdlbi5cbiI7CisgICBlbHNlIGlmIChocGRpZmYgPiA0KnZocCkKKyAgICAgIHJlc3VsdCA9ICJEdSBiaXN0IHNlaHIgdmllbCBzdGFlcmtlciBhbHMgIiArIHZuYW1lICsgIi5cbiI7CisgICBlbHNlIGlmIChocGRpZmYgPiAyKnZocCkKKyAgICAgIHJlc3VsdCA9ICJEdSBiaXN0IHZpZWwgc3RhZXJrZXIgYWxzICIgKyB2bmFtZSArICIuXG4iOworICAgZWxzZSBpZiAoMipocGRpZmYgPiAzKnZocCkKKyAgICAgIHJlc3VsdCA9ICJEdSBiaXN0IHNwdWVyYmFyIHN0YWVya2VyIGFscyAiICsgdm5hbWUgKyAiLlxuIjsKKyAgIGVsc2UgaWYgKGhwZGlmZiA+IHZocCkKKyAgICAgIHJlc3VsdCA9ICJEdSBiaXN0IHN0YWVya2VyIGFscyAiICsgdm5hbWUgKyAiLlxuIjsKKyAgIGVsc2UgaWYgKGhwZGlmZiA+IHZocC81KQorICAgICAgcmVzdWx0ID0gIkR1IGJpc3QgZXR3YXMgc3RhZXJrZXIgYWxzICIgKyB2bmFtZSArICIuXG4iOworICAgZWxzZSBpZiAoLWhwZGlmZiA+IDEwKmhwKQorICAgICAgcmVzdWx0ID0gIkJlc29yZyBEaXIgYmVzc2VyIHNjaG9uIG1hbCBlaW5lbiBTYXJnLlxuIjsKKyAgIGVsc2UgaWYgKC1ocGRpZmYgPiA3KmhwKQorICAgICAgcmVzdWx0ID0gY2FwaXRhbGl6ZSh2bmFtZSkgKyAiIGlzdCBEaXIgaGF1c2hvY2ggdWViZXJsZWdlbi5cbiI7CisgICBlbHNlIGlmICgtaHBkaWZmID4gNCpocCkKKyAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3Qgc2VociB2aWVsIHN0YWVya2VyIGFscyBEdS5cbiI7CisgICBlbHNlIGlmICgtaHBkaWZmID4gMipocCkKKyAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3QgdmllbCBzdGFlcmtlciBhbHMgRHUuXG4iOworICAgZWxzZSBpZiAoLTIqaHBkaWZmID4gMypocCkKKyAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3Qgc3B1ZXJiYXIgc3RhZXJrZXIgYWxzIER1LlxuIjsKKyAgIGVsc2UgaWYgKC1ocGRpZmYgPiBocCkKKyAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3Qgc3RhZXJrZXIgYWxzIER1LlxuIjsKKyAgIGVsc2UgaWYgKC1ocGRpZmYgPiBocC81KQorICAgICAgcmVzdWx0ID0gY2FwaXRhbGl6ZSh2bmFtZSkgKyAiIGlzdCBldHdhcyBzdGFlcmtlciBhbHMgRHUuXG4iOworICAgZWxzZQorICAgICAgcmVzdWx0ID0gY2FwaXRhbGl6ZSh2bmFtZSkgKyAiIGlzdCBldHdhIGdsZWljaCBzdGFyayB3aWUgRHUuXG4iOworICAgd3JpdGUocmVzdWx0KTsKKworICAgaWYgKGFjZGlmZiA+IDIqdmFjKQorICAgICAgcmVzdWx0ID0gIkRlaW5lIFJ1ZXN0dW5nIGlzdCB1bmdsYXVibGljaCB2aWVsIGJlc3NlciBhbHMgZGllICIKKyAgICAgKyB2bmFtZWdlbiArICIuXG4iOworICAgZWxzZSBpZiAoYWNkaWZmID4gdmFjKQorICAgICAgcmVzdWx0ID0gIkRlaW5lIFJ1ZXN0dW5nIGlzdCB2aWVsIGJlc3NlciBhbHMgZGllICIgKyB2bmFtZWdlbiArICIuXG4iOworICAgZWxzZSBpZiAoYWNkaWZmID52YWMvNSkKKyAgICAgIHJlc3VsdCA9ICJEZWluZSBSdWVzdHVuZyBpc3QgYmVzc2VyIGFscyBkaWUgIiArIHZuYW1lZ2VuICsgIi5cbiI7CisgICBlbHNlIGlmICgtYWNkaWZmID4gMiphYykKKyAgICAgIHJlc3VsdCA9ICJEaWUgUnVlc3R1bmcgIiArIHZuYW1lZ2VuCisgICAgICsgIiBpc3QgdW5nbGF1YmxpY2ggdmllbCBiZXNzZXIgYWxzIERlaW5lLlxuIjsKKyAgIGVsc2UgaWYgKC1hY2RpZmYgPiBhYykKKyAgICAgIHJlc3VsdCA9ICJEaWUgUnVlc3R1bmcgIiArIHZuYW1lZ2VuICsgIiBpc3QgdmllbCBiZXNzZXIgYWxzIERlaW5lLlxuIjsKKyAgIGVsc2UgaWYgKC1hY2RpZmYgPiBhYy81KQorICAgICAgcmVzdWx0ID0gIkRpZSBSdWVzdHVuZyAiICsgdm5hbWVnZW4gKyAiIGlzdCBiZXNzZXIgYWxzIERlaW5lLlxuIjsKKyAgIGVsc2UKKyAgICAgIHJlc3VsdCA9ICJFdXJlIFJ1ZXN0dW5nZW4gc2luZCBldHdhIGdsZWljaCBndXQuXG4iOworICAgd3JpdGUocmVzdWx0KTsKKworICAgaWYgKHdjZGlmZiA+IDIqdndjKQorICAgICAgcmVzdWx0ID0gIkRlaW5lIFdhZmZlIGlzdCBlaWdlbnRsaWNoIHp1IGd1dCBmdWVyIGRpZXNlbiBHZWduZXIuXG4iOworICAgZWxzZSBpZiAod2NkaWZmID4gdndjKQorICAgICAgcmVzdWx0ID0gIkRlaW5lIFdhZmZlIGlzdCB2aWVsIGJlc3NlciBhbHMgZGllICIgK3ZuYW1lZ2VuICsgIi5cbiI7CisgICBlbHNlIGlmICh3Y2RpZmYgPiB2d2MvNSkKKyAgICAgIHJlc3VsdCA9ICJEZWluZSBXYWZmZSBpc3QgYmVzc2VyIGFscyBkaWUgIiArdm5hbWVnZW4gKyAiLlxuIjsKKyAgIGVsc2UgaWYgKC13Y2RpZmYgPiAyKndjKQorICAgICAgcmVzdWx0ID0gIkRpZSBXYWZmZSAiICsgdm5hbWVnZW4KKyAgICAgKyAiIGxhZXNzdCBEZWluZSBnYW56IG1pY2tyaWcgYXVzc2VoZW4uXG4iOworICAgZWxzZSBpZiAoLXdjZGlmZiA+IHdjKQorICAgICAgcmVzdWx0ID0gIkRpZSBXYWZmZSAiICsgdm5hbWVnZW4gKyAiIGlzdCB2aWVsIGJlc3NlciBhbHMgRGVpbmUuXG4iOworICAgZWxzZSBpZiAoLXdjZGlmZiA+IHdjLzUpCisgICAgICByZXN1bHQgPSAiRGllIFdhZmZlICIgKyB2bmFtZWdlbiArICIgaXN0IGJlc3NlciBhbHMgRGVpbmUuXG4iOworICAgZWxzZQorICAgICAgcmVzdWx0ID0gIkV1cmUgV2FmZmVuIHNpbmQgZXR3YSBnbGVpY2ggZ3V0LlxuIjsKKyAgIHdyaXRlKHJlc3VsdCk7CisgICByZXR1cm4gRVJGT0xHOworfQorCitpbnQga2FtcGZzY2hyZWkob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykKK3sKKyAgb2JqZWN0IG9iOworICBzdHJpbmcgY21kbGluZSwgbWVsZHVuZzsKKyAgaW50ICAgIHN1YywgZGF1ZXI7CisKKyAgY21kbGluZSA9IHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCk7CisgIGlmIChjbWRsaW5lKQorICB7CisgICAgaWYgKHNzY2FuZihjbWRsaW5lLCAibWVsZHVuZyAlcyIsIG1lbGR1bmcpKQorICAgIHsKKyAgICAgIGNhc3Rlci0+U2V0KCJhYl9rYW1wZnNjaHJlaSIsIFNBVkUsIEZfTU9ERV9BUyk7CisgICAgICBjYXN0ZXItPlNldFByb3AoImFiX2thbXBmc2NocmVpIiwgbWVsZHVuZyk7CisgICAgICBwcmludGYoIkRlaW4gS2FtcGZzY2hyZWkgaXN0IGpldHp0OiAlc1xuIiwgbWVsZHVuZyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgb2IgPSBGaW5kRW5lbXlWaWN0aW0oc2luZm9bU0lfU0tJTExBUkddLCBjYXN0ZXIsCisgICAgICAgICAgIldlbSB3aWxsc3QgRHUgRGVpbmVuIEthbXBmc2NocmVpIGVudGdlZ2Vuc2NobGV1ZGVybj9cbiIpOworCisgIGlmICghb2IpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKChzdWM9U3BlbGxTdWNjZXNzKGNhc3Rlciwgc2luZm8pKSA8PSAwKQorICAgIHJldHVybiBNSVNTRVJGT0xHOworICBpZiAoc3VjIDwgb2ItPlNwZWxsRGVmZW5kKGNhc3Rlciwgc2luZm8pKQorICB7CisgICAgdGVsbF9vYmplY3QoY2FzdGVyLCBvYi0+TmFtZSgpICsgIiB3ZWhydCBEZWluZW4gU3BydWNoIGFiLlxuIik7CisgICAgcmV0dXJuIEVSRk9MRzsKKyAgfQorCisgIG1lbGR1bmcgPSBjYXN0ZXItPlF1ZXJ5UHJvcCgiYWJfa2FtcGZzY2hyZWkiKTsKKyAgaWYgKCFtZWxkdW5nKQorICAgIG1lbGR1bmcgPSAiQWFhYWFhYWlpaWlpZWVlZWVlZWVlZWVlZWVlZWhoaGhoaGhoaGhoaGhoaCEhISEhISFcbiI7CisKKyAgd3JpdGUoYnJlYWtfc3RyaW5nKG1lbGR1bmcsIDc4LCAiRHUga3JlaXNjaHN0OiAiKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChjYXN0ZXIpLAorICAgICAgICBicmVha19zdHJpbmcobWVsZHVuZywgNzgsIGNhc3Rlci0+TmFtZSgpKyIga3JlaXNjaHQ6ICIpLAorICAgICAgICAoe2Nhc3Rlcn0pKTsKKyAgdGVsbF9vYmplY3Qob2IsICJEdSBmdWVobHN0IERpY2ggd2llIGdlbGFlaG10LlxuIik7CisKKyAgZGF1ZXIgPSAxICsgKHN1Yy8xMDAwICsgcmFuZG9tKGNhc3Rlci0+UXVlcnlQcm9wKFBfTEVWRUwpLzIpKS8yOworICBpZiAoZGF1ZXI+MjUpCisgICAgZGF1ZXIgPSAyNTsKKyAgb2ItPk1vZGlmeVNraWxsQXR0cmlidXRlKFNBX1NQRUVELCAtNTAsIGRhdWVyKTsKKworICByZXR1cm4gRVJGT0xHOworfQorCitpbnQgYXVzd2VpY2hlbihvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKQoreworICBpZiAoIWNhc3Rlci0+SW5GaWdodCgpKQorICB7CisgICAgd3JpdGUoIkF1c3dlaWNoZW4gYXVzc2VyaGFsYiBlaW5lcyBLYW1wZmVzIGlzdCB6aWVtbGljaCBzaW5ubG9zLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoY2FzdGVyLT5RdWVyeVByb3AoUF9UTVBfREVGRU5EX0hPT0spKQorICB7CisgICAgd3JpdGUoIkRhcyBnZWh0IG1vbWVudGFuIG5pY2h0LCBEdSB3dW5kZXJzdCBEaWNoIHdpZXNvIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoU3BlbGxTdWNjZXNzKGNhc3RlcixzaW5mbyk8PTApCisgICAgcmV0dXJuIE1JU1NFUkZPTEc7CisKKyAgY2FzdGVyLT5TZXRQcm9wKFBfVE1QX0RFRkVORF9IT09LLCAoeyB0aW1lKCkrNCwgdGhpc19vYmplY3QoKSwgIkRlY2t1bmciIH0pKTsKKyAgcmV0dXJuIEVSRk9MRzsKK30KKworbWl4ZWQgRGVja3VuZyhpbnQgZGFtLCBtaXhlZCBkYW1fdHlwZSwgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkKK3sKKyAgaWYgKCFwb2ludGVycChkYW1fdHlwZSkpCisgICAgZGFtX3R5cGUgPSAoeyBkYW1fdHlwZSB9KTsKKyAgaWYgKHNpemVvZihkYW1fdHlwZSAmIG1faW5kaWNlcyhQSFlTSUNBTF9EQU1BR0VfVFlQRVMpKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpLCAiRHUgd2VpY2hzdCBnZWtvbm50IGF1cy5cbiIpOworICAgIGlmIChwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wKFBfVE1QX0RFRkVORF9IT09LKVsxXSA9PSB0aGlzX29iamVjdCgpKQorICAgICAgcHJldmlvdXNfb2JqZWN0KCktPlNldFByb3AoUF9UTVBfREVGRU5EX0hPT0ssIDApOworICAgIHJldHVybiAwOworICB9CisgIHRlbGxfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpLCAiRGVpbiBBdXN3ZWljaHZlcnN1Y2ggaXN0IHZlcmdlYmVucy5cbiIpOworICByZXR1cm4gKHsgZGFtLCBkYW1fdHlwZSwgc3BlbGwsIGVuZW15IH0pOworfQorCitpbnQKK2lkZW50aWZpemllcmUob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykgeworICBvYmplY3Qgb2I7CisgIHN0cmluZyogZmk7CisgIHN0cmluZyBjbjsKKyAgc3RyaW5nIHJlc3VsdCwgaW5mbzsKKyAgaW50IHN1YzsKKyAgb2I9RmluZFZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sIGNhc3RlciwKKyAgICAgICAgICAgICAgICAiV2FzIG1vZWNodGVzdCBEdSBpZGVudGlmaXppZXJlbj9cbiIpOworICBpZiAoIW9iKQorICAgIHJldHVybiAwOworCisgIGNuID0gY2FzdGVyLT5uYW1lKCk7CisgIGlmICgoc3VjPVNwZWxsU3VjY2VzcyhjYXN0ZXIsc2luZm8pKTw9MCkKKyAgICByZXR1cm4gTUlTU0VSRk9MRzsKKyAgaWYgKHN1YyA8IG9iLT5TcGVsbERlZmVuZChjYXN0ZXIsIHNpbmZvKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KGNhc3Rlciwgb2ItPk5hbWUoKSArICIgd2VocnQgRGVpbmVuIFNwcnVjaCBhYi5cbiIpOworICAgIHJldHVybiBFUkZPTEc7CisgIH0KKworICByZXN1bHQ9IkR1IGlkZW50aWZpemllcnN0ICIrb2ItPm5hbWUoV0VOLDEpKyIuICIKKyAgICAgICAgK2NhcGl0YWxpemUob2ItPlF1ZXJ5UHJvbm91bigpKQorICAgICAgICArIiBiZXN0ZWgiCisgICAgICAgICsob2ItPlF1ZXJ5UHJvcChQX1BMVVJBTCkgPyAiZW4iIDogInQiKQorICAgICAgICArIiBhdXMgIgorICAgICAgICArKG9iLT5NYXRlcmlhbExpc3QoV0VNLCBjYXN0ZXIpKSsiLiAiOworICBpZiAoaW5mbz1vYi0+UXVlcnlQcm9wKFBfSU5GTykpCisgICAgcmVzdWx0Kz0iQXVzc2VyZGVtIGJlbWVya3N0IER1IGZvbGdlbmRlczpcbiIraW5mbzsKKyAgZWxzZSByZXN1bHQrPSJEdSBrYW5uc3Qgc29uc3QgbmljaHRzIGJlc29uZGVyZXMgYW4gIitvYi0+UXVlcnlQcm9ub3VuKFdFTSkKKyAgICAgICAgICAgICAgKyIgZXJrZW5uZW4uIjsKKyAgd3JpdGUoYnJlYWtfc3RyaW5nKHJlc3VsdCwgNzgsIDAsIDEpKTsKKyAgcmV0dXJuIEVSRk9MRzsKK30KKworaW50CitsaWNodChvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKQoreworICAgb2JqZWN0IGw7CisKKyAgIHRlbGxfb2JqZWN0KGNhc3RlciwgIkR1IG1hY2hzdCBlaW5lIG1hZ2lzY2hlIEJld2VndW5nLlxuIik7CisgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoY2FzdGVyKSwKKyAgICAgICBzcHJpbnRmKCIlcyBtYWNodCBlaW5lIG1hZ2lzY2hlIEJld2VndW5nLlxuIiwKKyAgICAgICAgICAgY2FwaXRhbGl6ZShjYXN0ZXItPm5hbWUoV0VSKSkpLCAoe2Nhc3Rlcn0pKTsKKyAgIAorICAgaW50IHN1Yz1TcGVsbFN1Y2Nlc3MoY2FzdGVyLHNpbmZvKTsKKyAgIGlmIChzdWM8PTApCisgICAgICByZXR1cm4gTUlTU0VSRk9MRzsKKworICAgbCA9IGNsb25lX29iamVjdChMSUNIVEtVR0VMKTsKKyAgIGlmIChsLT5tb3ZlKHRoaXNfcGxheWVyKCkpID4gMCkKKyAgIHsKKyAgICAgIGludCBsdmw7CisgICAgICAvLyBmdWVyIFNwcnVjaHJvbGxlbi1TdXBwb3J0LgorICAgICAgaWYgKCFzaW5mb1tTSV9VU1JdIHx8ICEobHZsPXNpbmZvW1NJX1VTUl1bUF9MRVZFTF0pICkKKyAgICAgICAgbHZsID0gY2FzdGVyLT5RdWVyeVByb3AoUF9MRVZFTCk7CisgICAgICBsdmwgPSBtaW4obHZsLDQyKTsKKyAgICAgIC8vIHdlbm4gZGVyIFNwZWxsIG5pY2h0IGdhbnogc28gZ3V0IGdlbGluZ3QsIGlzdCBkaWUgS3VnZWwgYXVjaCBldHdhcworICAgICAgLy8gZHVua2xlci4KKyAgICAgIGlmIChzdWM8NjAwMCkKKyAgICAgIHsKKyAgICAgICAgbC0+U2V0UHJvcChQX0xJR0hULDEpOworICAgICAgICB0ZWxsX29iamVjdChjYXN0ZXIsCisgICAgICAgICAgICAiV2llIGF1cyBkZW0gTmljaHRzIGVyc2NoZWludCBlaW5lIGxldWNodGVuZGUgS3VnZWwuXG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdGVsbF9vYmplY3QoY2FzdGVyLAorICAgICAgICAgICAgIldpZSBhdXMgZGVtIE5pY2h0cyBlcnNjaGVpbnQgZWluZSBoZWxsIGxldWNodGVuZGUgS3VnZWwuXG4iKTsKKyAgICAgIGwtPnN0YXJ0X3JlbW92ZShsdmwgKiAyMCAqIG1pbihzdWMrMzMzMywxMDAwMCkgLyAxMDAwMCk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBsLT5yZW1vdmUoKTsKKyAgICAgIHRlbGxfb2JqZWN0KGNhc3RlciwKKyAgICAgICAgICAiRWluZSBMaWNodGt1Z2VsIGVyc2NoZWludCwgemVycGxhdHp0IGFiZXIgc29mb3J0IG1pdCBlaW5lbSBzYW5mdGVuICdwbG9wcCcuXG4iKTsKKyAgIH0KKworICAgcmV0dXJuIEVSRk9MRzsKK30KKworaW50CitzYWV1cmVzdHJhaGwob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykgeworICBvYmplY3QgdmljdGltOworICBpbnQgaGFuZHM7CisgIHN0cmluZyB2bnc7CisgIGludCBzdWM7CisKKyAgdmljdGltPUZpbmRFbmVteVZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sY2FzdGVyLAorICAgICAgICAgICAgICAgICAgICAgIldlbiB3aWxsc3QgRHUgbWl0IGVpbmVtIFNhZXVyZXN0cmFobCBiZXNjaGllc3Nlbj9cbiIpOworICBpZiAoIXZpY3RpbSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKChzdWM9U3BlbGxTdWNjZXNzKGNhc3RlcixzaW5mbykpPD0wKQorICAgIHJldHVybiBNSVNTRVJGT0xHOworICBpZiAoc3VjIDwgdmljdGltLT5TcGVsbERlZmVuZChjYXN0ZXIsIHNpbmZvKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KGNhc3RlciwgdmljdGltLT5OYW1lKCkgKyAiIHdlaHJ0IERlaW5lbiBTcHJ1Y2ggYWIuXG4iKTsKKyAgICByZXR1cm4gRVJGT0xHOworICB9CisKKyAgdm53ID0gdmljdGltLT5uYW1lKFdFTiwgMik7CisgIHNheShicmVha19zdHJpbmcoCisgICBzcHJpbnRmKAorICAgIiVzIGZ1Y2h0ZWx0IHNlbHRzYW0gaW4gZGVyIEx1ZnQgaGVydW0gdW5kIHNjaGllc3N0IGVpbmVuIFNhZXVyZXN0cmFobCBhdWYgJXMuXG4iLAorICAgICAgIGNhc3Rlci0+TmFtZSgpLCB2bncpLCA3OCksIHZpY3RpbSk7CisgIHByaW50ZigiRHUgc2NoaWVzc3QgZWluZW4gU2FldXJlc3RyYWhsIGF1ZiAlcy5cbiIsIHZudyk7CisgIHRlbGxfb2JqZWN0KHZpY3RpbSwgc3ByaW50ZigiJXMgc2NoaWVzc3QgZWluZW4gU2FldXJlc3RyYWhsIGF1ZiBEaWNoLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rlci0+TmFtZSgpKSk7CisKKyAgVHJ5RGVmYXVsdEF0dGFja1NwZWxsKHZpY3RpbSxjYXN0ZXIsc2luZm8sCisgICAgICAgICAgICAoW1NQX05BTUU6IlNhZXVyZXN0cmFobCIsIFNQX1NIT1dfREFNQUdFOjFdKSk7CisKKyAgcmV0dXJuIEVSRk9MRzsKK30KKworaW50CitmZXVlcmJhbGwob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykgeworICBvYmplY3QgdmljdGltOworICBpbnQgaGFuZHM7CisgIHN0cmluZyB2bnc7CisgIGludCBzdWM7CisKKyAgdmljdGltPUZpbmRFbmVteVZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sY2FzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJBdWYgd2VuIHdpbGxzdCBEdSBlaW5lbiBGZXVlcmJhbGwgc2NobGV1ZGVybj9cbiIpOworICBpZiAoIXZpY3RpbSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKChzdWM9U3BlbGxTdWNjZXNzKGNhc3RlcixzaW5mbykpPD0wKQorICAgIHJldHVybiBNSVNTRVJGT0xHOworICBpZiAoc3VjIDwgdmljdGltLT5TcGVsbERlZmVuZChjYXN0ZXIsIHNpbmZvKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KGNhc3RlciwgdmljdGltLT5OYW1lKCkgKyAiIHdlaHJ0IERlaW5lbiBTcHJ1Y2ggYWIuXG4iKTsKKyAgICByZXR1cm4gRVJGT0xHOworICB9CisKKyAgdm53ID0gdmljdGltLT5uYW1lKFdFTSwgMik7CisgIHNheShzcHJpbnRmKCIlcyB3aXJmdCBlaW5lbiBGZXVlcmJhbGwgbmFjaCAlcy5cbiIsCisgICAgICAgICAgICAgIGNhc3Rlci0+TmFtZSgpLCB2bncpLCB2aWN0aW0pOworICBwcmludGYoIkR1IHdpcmZzdCBlaW5lbiBGZXVlcmJhbGwgbmFjaCAlcy5cbiIsIHZudyk7CisgIHRlbGxfb2JqZWN0KHZpY3RpbSwgc3ByaW50ZigiJXMgd2lyZnQgZWluZW4gRmV1ZXJiYWxsIG5hY2ggRGlyLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rlci0+TmFtZSgpKSk7CisKKyAgVHJ5RGVmYXVsdEF0dGFja1NwZWxsKHZpY3RpbSxjYXN0ZXIsc2luZm8sCisgICAgICAgICAgICAoW1NQX05BTUU6IkZldWVyYmFsbCIsIFNQX1NIT1dfREFNQUdFOjFdKSk7CisKKyAgcmV0dXJuIEVSRk9MRzsKK30KKworaW50CitwZmVpbChvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKSB7CisgIG9iamVjdCB2aWN0aW07CisgIGludCBoYW5kczsKKyAgc3RyaW5nIHZuLCB2bncsIGNuOworICBpbnQgc3VjOworCisgIHZpY3RpbT1GaW5kRW5lbXlWaWN0aW0oc2luZm9bU0lfU0tJTExBUkddLGNhc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTmFjaCB3ZW0gd2lsbHN0IER1IGVpbmVuIG1hZ2lzY2hlbiBQZmVpbCB3ZXJmZW4/XG4iKTsKKyAgaWYgKCF2aWN0aW0pCisgICAgcmV0dXJuIDA7CisgIGlmICgoc3VjPVNwZWxsU3VjY2VzcyhjYXN0ZXIsc2luZm8pKTw9MCkKKyAgICByZXR1cm4gTUlTU0VSRk9MRzsKKyAgaWYgKHN1YyA8IHZpY3RpbS0+U3BlbGxEZWZlbmQoY2FzdGVyLCBzaW5mbykpCisgIHsKKyAgICB0ZWxsX29iamVjdChjYXN0ZXIsIHZpY3RpbS0+TmFtZSgpICsgIiB3ZWhydCBEZWluZW4gU3BydWNoIGFiLlxuIik7CisgICAgcmV0dXJuIEVSRk9MRzsKKyAgfQorCisgIGNuID0gY2FzdGVyLT5OYW1lKCk7CisgIHZudyA9IHZpY3RpbS0+bmFtZShXRU4sIDIpOworICBzYXkoc3ByaW50ZigiJXMgZmV1ZXJ0IGVpbmVuIG1hZ2lzY2hlbiBQZmVpbCBhdWYgJXMgYWIuXG4iLGNuLCB2bncpLAorICAgICAgdmljdGltKTsKKyAgcHJpbnRmKCJEdSBmZXVlcnN0IGVpbmVuIG1hZ2lzY2hlbiBQZmVpbCBhdWYgJXMgYWIuXG4iLCB2bncpOworICB0ZWxsX29iamVjdCh2aWN0aW0sc3ByaW50ZigiJXMgZmV1ZXJ0IGVpbmVuIG1hZ2lzY2hlbiBQZmVpbCBhdWYgRGljaCBhYi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuKSk7CisgIFRyeURlZmF1bHRBdHRhY2tTcGVsbCh2aWN0aW0sY2FzdGVyLHNpbmZvLAorICAgICAgICAgICAgKFtTUF9OQU1FOiJQZmVpbCIsIFNQX1NIT1dfREFNQUdFOjFdKSk7CisgIHJldHVybiBFUkZPTEc7Cit9CisKK2ludAorc2NobmVsbChvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKSB7CisgIGludCBkYXVlcjsKKworICBpZiAoU3BlbGxTdWNjZXNzKGNhc3RlcixzaW5mbyk8PTApCisgICAgcmV0dXJuIE1JU1NFUkZPTEc7CisgIHdyaXRlKCJEdSBmdWVobHN0IERpY2ggcGxvZXR6bGljaCBkZXV0bGljaCBzY2huZWxsZXIuXG4iKTsKKyAgZGF1ZXIgPSAyICogKGNhc3Rlci0+UXVlcnlBdHRyaWJ1dGUoQV9ERVgpICsKKyAgICAgICAgICAgcmFuZG9tKHNpbmZvW1NJX1NLSUxMQUJJTElUWV0vMTAwMCkpOworICBpZiAoZGF1ZXI+NjApCisgICAgZGF1ZXIgPSA2MDsKKyAgY2FzdGVyLT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCwgMTAwLCBkYXVlcik7CisKKyAgcmV0dXJuIEVSRk9MRzsKK30K