Ly8gTW9yZ2VuR3JhdWVuIE1VRGxpYgovLwovLyBzaW11bF9lZnVuLmMgLS0gc2ltdWwgZWZ1bidzCi8vCi8vICRJZDogc2ltdWxfZWZ1bi5jIDc0MDggMjAxMC0wMi0wNiAwMDoyNzoyNVogWmVzc3RyYSAkCiNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcwojcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdyxub19pbmhlcml0CiNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCiNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CgovLyBBYnNvbHV0ZSBQZmFkZSBlcmZvcmRlcmxpY2ggLSB6dW0gWmVpdHB1bmt0LCB3byBkZXIgTWFzdGVyIGdlbGFkZW4KLy8gd2lyZCwgc2luZCBub2NoIGtlaW5lIEluY2x1ZGUtUGZhZGUgZGEgLi4uCgojZGVmaW5lIFNOT09QTE9HRklMRSAiU05PT1AiCiNkZWZpbmUgQVNOT09QTE9HRklMRSAiQVJDSC9TTk9PUCIKCiNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgojaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKI2luY2x1ZGUgIi9zeXMvc25vb3BpbmcuaCIKI2luY2x1ZGUgIi9zeXMvbGFuZ3VhZ2UuaCIKI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgojaW5jbHVkZSAiL3N5cy93aXpsaXN0LmgiCiNpbmNsdWRlICIvc3lzL2VycS5oIgojaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgojaW5jbHVkZSAiL3N5cy9kYWVtb24uaCIKI2luY2x1ZGUgIi9zeXMvcGxheWVyL2Jhc2UuaCIKI2luY2x1ZGUgIi9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaCIKI2luY2x1ZGUgIi9zeXMvY29udGFpbmVyLmgiCiNpbmNsdWRlICIvc3lzL2RlZmluZXMuaCIKI2luY2x1ZGUgIi9zeXMvdGVsbmV0LmgiCiNpbmNsdWRlICIvc3lzL29iamVjdGluZm8uaCIKI2luY2x1ZGUgIi9zeXMvZmlsZXMuaCIKI2luY2x1ZGUgIi9zeXMvc3RyaW5ncy5oIgojaW5jbHVkZSAiL3N5cy90aW1lLmgiCiNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCiNpbmNsdWRlICIvc3lzL25vdGlmeV9mYWlsLmgiCiNpbmNsdWRlICIvc3lzL3Rscy5oIgojaW5jbHVkZSAiL3N5cy9pbnB1dF90by5oIgojaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgoKLyogZnVuY3Rpb24gcHJvdG90eXBlcwogKi8Kc3RyaW5nIGR0aW1lKGludCB3YW5uKTsKdmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKTsKaW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpOwpub21hc2sgdmFyYXJncyBpbnQgc25vb3Aob2JqZWN0IG1lLCBvYmplY3QgeW91KTsKdmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSk7CmludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeik7CnB1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKTsKbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKTsKbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpOwpwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKTsKbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSk7CnZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpOwoKCi8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECiNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQp2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pOwojZW5kaWYKI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQp2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKTsKI2VuZGlmCiNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCmludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpOwojZW5kaWYKCi8vIEluY2x1ZGUgdGhlIGRpZmZlcmVudCBzdWIgJ21vZHVsZXMnIG9mIHRoZSBzaW11bF9lZnVuCiNpbmNsdWRlIF9fRElSX18iZGVidWdfaW5mby5jIgojaW5jbHVkZSBfX0RJUl9fImVuYWJsZV9jb21tYW5kcy5jIgojaW5jbHVkZSBfX0RJUl9fImhhc2guYyIKI2luY2x1ZGUgX19ESVJfXyJvYmplY3RfaW5mby5jIgojaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2VkaXRpbmcuYyIKI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pZGxlLmMiCiNpbmNsdWRlIF9fRElSX18icXVlcnlfaW5wdXRfcGVuZGluZy5jIgojaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lwX25hbWUuYyIKI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9saW1pdHMuYyIKI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9sb2FkX2F2ZXJhZ2UuYyIKI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9tdWRfcG9ydC5jIgojaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyIKI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9zbm9vcC5jIgojaW5jbHVkZSBfX0RJUl9fInNldF9oZWFydF9iZWF0LmMiCiNpZiBfX0JPT1RfVElNRV9fIDwgMTQ1NjI2MTg1OQojaW5jbHVkZSBfX0RJUl9fInNldF9wcm9tcHQuYyIKI2VuZGlmCiNpbmNsdWRlIF9fRElSX18ic2hhZG93LmMiCiNpbmNsdWRlIF9fRElSX18ibGl2aW5ncy5jIgojaW5jbHVkZSBfX0RJUl9fImNvbW0uYyIKI2luY2x1ZGUgX19ESVJfXyJmaWxlcy5jIgoKI2RlZmluZSBUTyAgICAgICAgZWZ1bjo6dGhpc19vYmplY3QoKQojZGVmaW5lIFRJICAgICAgICBlZnVuOjp0aGlzX2ludGVyYWN0aXZlKCkKI2RlZmluZSBUUCAgICAgICAgZWZ1bjo6dGhpc19wbGF5ZXIoKQojZGVmaW5lIFBPICAgICAgICBlZnVuOjpwcmV2aW91c19vYmplY3QoMCkKI2RlZmluZSBMRVZFTCh4KSBxdWVyeV93aXpfbGV2ZWwoeCkKI2RlZmluZSBOQU1FKHgpICBjYXBpdGFsaXplKGdldHVpZCh4KSkKCiNkZWZpbmUgREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpIFwKICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLHgpCgptaXhlZCBkdGltZV9jYWNoZSA9ICh7LTEsIiJ9KTsKCiNpZmRlZiBJT1NUQVRTCnN0cnVjdCBpb3N0YXRfcyB7CiAgc3RyaW5nIG9uYW1lOwogIGludCB0aW1lOwogIGludCBzaXplOwp9OwptaXhlZCBzYXZlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsIDApIH0pOwptaXhlZCByZXN0b3Jlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsMCkgfSk7Ci8vbWl4ZWQgd3JpdGVmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOwovL21peGVkIHJlYWRmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOwovL21peGVkIGxvZ19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKCm1peGVkIF9fX2lvc3RhdHMoaW50IHR5cGUpIHsKICBzd2l0Y2godHlwZSkgewogICAgY2FzZSAxOgogICAgICByZXR1cm4gc2F2ZW9fc3RhdDsKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIHJlc3RvcmVvX3N0YXQ7Ci8qICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIHdyaXRlZmlsZV9zdGF0OwogICAgY2FzZSA0OgogICAgICByZXR1cm4gcmVhZGZpbGVfc3RhdDsKICAgIGNhc2UgNToKICAgICAgcmV0dXJuIGxvZ19zdGF0OwogICAgICAqLwogIH0KICByZXR1cm4gMDsKfQojZW5kaWYKCi8vIE5pY2h0IGplZGVyIE1hZ2llciBtdXNzIGRpZSBzaW11bF9lZnVuIGVudHNvcmdlbiBrb2VubmVuLgpzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgewogICAgaWYoIChjYWxsZXIhPXRoaXNfb2JqZWN0KCkgJiYgIUFSQ0hfU0VDVVJJVFkpIHx8IHByb2Nlc3NfY2FsbCgpICkgewogICAgICByZXR1cm4gIkR1IGRhcmZzdCBkYXMgc2ltdWxfZWZ1biBPYmpla3QgbmljaHQgemVyc3RvZXJlbiFcbiI7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKcHVibGljIG5vbWFzayB2b2lkIHJlbW92ZV9pbnRlcmFjdGl2ZSggb2JqZWN0IG9iICkKewogICAgaWYgKCBvYmplY3RwKG9iKSAmJiBwcmV2aW91c19vYmplY3QoKQogICAgICAgICYmIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi43XSAhPSAiL3NlY3VyZS8iCiAgICAgICAgJiYgKChwcmV2aW91c19vYmplY3QoKSAhPSBvYgogICAgICAgICAgICAgJiYgKG9iICE9IHRoaXNfcGxheWVyKCkgfHwgb2IgIT0gdGhpc19pbnRlcmFjdGl2ZSgpKSkKICAgICAgICAgICAgfHwgKHByZXZpb3VzX29iamVjdCgpID09IG9iCiAgICAgICAgICAgICAgICYmICh0aGlzX3BsYXllcigpICYmIHRoaXNfcGxheWVyKCkgIT0gb2IKICAgICAgICAgICAgICAgICAgIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkgIT0gb2IpKSApICkKCiAgICAgICBsb2dfZmlsZSggIlBMQVlFUkRFU1QiLAogICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlTyBhdXNnZWxvZ2d0IHZvbiBQTyAlTywgVEkgJU8sIFRQICVPXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBvYiwgcHJldmlvdXNfb2JqZWN0KCksCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSwgdGhpc19wbGF5ZXIoKSApICk7CgogICAgZWZ1bjo6cmVtb3ZlX2ludGVyYWN0aXZlKG9iKTsKfQoKCnZvaWQgX19fdXBkbWFzdGVyKCkKewogICAgb2JqZWN0IG9iOwoKICAgIC8vc29sbHRlIG5pY2h0IGplZGVyIGR1ZXJmZW4uCiAgICBpZiAocHJvY2Vzc19jYWxsKCkgfHwgIUFSQ0hfU0VDVVJJVFkpCiAgICAgIHJhaXNlX2Vycm9yKCJJbGxlZ2FsIHVzZSBvZiBfX191cGRtYXN0ZXIoKSEiKTsKCiAgICB3cml0ZSgiUmVtb3Zpbmcgb2xkIG1hc3RlciAuLi4gIik7CiAgICBmb3JlYWNoKHN0cmluZyBmaWxlOiAKICAgICAgICBnZXRfZGlyKCIvc2VjdXJlL21hc3Rlci8qLmMiLEdFVERJUl9OQU1FU3xHRVRESVJfVU5TT1JURUR8R0VURElSX1BBVEgpKSB7CiAgICAgIGlmIChvYiA9IGZpbmRfb2JqZWN0KGZpbGUpKQogICAgICAgZWZ1bjo6ZGVzdHJ1Y3Qob2IpOwogICAgfQogICAgZWZ1bjo6ZGVzdHJ1Y3QoZWZ1bjo6ZmluZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIikpOwogICAgd3JpdGUoImRvbmUuXG5Mb2FkaW5nIGFnYWluIC4uLiAiKTsKICAgIGxvYWRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpOwoKICAgIHdyaXRlKCJkb25lLlxuIik7Cn0KCnZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pIHsKICBtaXhlZCByZXQ7CgogIGlmKHJldCA9IChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmNvdW50cnkobnVtIHx8IGlwKSkgewogICAgcmV0dXJuIHJldDsKICB9IGVsc2UgcmV0dXJuICI/Pz8iOwp9CgoKLy8gKiBTbm9vcGVuIHVuZCB3YXMgZGF6dWdlaG9lcnQKc3RhdGljIG9iamVjdCBmaW5kX3Nub29wZWQob2JqZWN0IHdobykKewogIG9iamVjdCAqdTsKICBpbnQgaTsKCiAgZm9yIChpPXNpemVvZih1PXVzZXJzKCkpLTE7aT49MDtpLS0pCiAgICBpZiAod2hvPT1lZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHVbaV0sIElJX1NOT09QX05FWFQpKQogICAgICByZXR1cm4gdVtpXTsKICByZXR1cm4gMDsKfQoKcHJpdmF0ZSBzdHJpbmcgTGN1dChzdHJpbmcgc3RyKSB7CiAgcmV0dXJuIHN0cls1Li4xMV0rc3RyWzE4Li5dOwp9Cgpub21hc2sgdmFyYXJncyBpbnQgc25vb3AoIG9iamVjdCBtZSwgb2JqZWN0IHlvdSApCnsKICAgIGludCByZXQ7CiAgICBvYmplY3Qgc25vb3BlcjAsIHNub29wZXIsIHNub29wZXIyLCBzbm9vcGVyMzsKCiAgICBpZiggIW9iamVjdHAobWUpIHx8IG1lID09IHlvdSB8fCAhUE8gKQogICAgICAgcmV0dXJuIDA7CgogICAgc25vb3BlcjAgPSBmaW5kX3Nub29wZWQobWUpOwoKICAgICBpZih5b3UpewogICAgICAgIGlmICggUE8gIT0gbWUgJiYgcXVlcnlfd2l6X2dycChtZSkgPj0gcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgKQogICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgaWYgKCBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKICAgICAgICAgICAgICEoeW91LT5RdWVyeUFsbG93U25vb3AobWUpKSApCiAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgfHwgSVNfQVJDSCh5b3UpICkKICAgICAgICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgIGlmICggKHNub29wZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkpICYmCiAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKHNub29wZXIpID49IHF1ZXJ5X3dpel9ncnAobWUpICl7CiAgICAgICAgICAgIGlmICggKGludClzbm9vcGVyLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApCiAgICAgICAgICAgICAgIHJldHVybiAwOwoKICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICIlcyBzbm9vcGVkIGpldHp0ICVzLlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUtPm5hbWUoV0VSKSwgeW91LT5uYW1lKFdFUikgKSApOwoKICAgICAgICAgICAgc25vb3BlcjIgPSBtZTsKCiAgICAgICAgICAgIHdoaWxlICggc25vb3BlcjMgPSBpbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSApewogICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3BlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzIHdpcmQgc2VpbmVyc2VpdHMgdm9uICVzIGdlc25vb3BlZC5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc25vb3BlcjItPm5hbWUoV0VSKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMy0+bmFtZShXRU0pICkgKTsKICAgICAgICAgICAgICAgc25vb3BlcjIgPSBzbm9vcGVyMzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWZ1bjo6c25vb3AoIHNub29wZXIsIHNub29wZXIyICk7CgogICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICE9IHNub29wZXIgKQogICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IGthbm5zdCAlcyBuaWNodCBzbm9vcGVuLlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiRHUgc25vb3BzdCBqZXR6dCAlcy5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOwogICAgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkoc25vb3BlcikgKXsKICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoIiVzOiAlTyAlTyAlT1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKICAgICAgICAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKICAgICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKCiAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgLT4gJXMgKCVPKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpKSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTAwMDAwICk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGlmIChzbm9vcGVyKQogICAgICAgICAgICAgICBpZiAoICFtZS0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKXsKICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiVzIHdpcmQgYmVyZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLiBCZW51dHplIGRhcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiZlwiLUZsYWcsIHdlbm4gZHUgZGVubm9jaCBzbm9vcGVuIHdpbGxzdC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeW91LT5uYW1lKFdFUiksIHNub29wZXItPm5hbWUoV0VNKSApOwogICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgcmV0ID0gZWZ1bjo6c25vb3AoIG1lLCB5b3UgKTsKCiAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSAmJiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUpewogICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIHlvdSwgZW52aXJvbm1lbnQoeW91KSApLAogICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKCiAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CgogICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsIHNwcmludGYoICIlcyAtPiAlcyAoJU8pLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHlvdSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCh5b3UpICkgKTsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUgKXsKICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggcmV0ICYmIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgogICAgICAgICAgICAgIUlTX0RFUFVUWShtZSkgKQogICAgICAgICAgICB0ZWxsX29iamVjdCggeW91LCAiKioqICIgKyBOQU1FKG1lKSArICIgc25vb3B0IERpY2ghXG4iICk7CgogICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgIGlmICggKG1lID09IFBPIHx8CiAgICAgICAgICAgICAgcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgPiBxdWVyeV93aXpfZ3JwKG1lKSB8fAogICAgICAgICAgICAgIChxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA9PSBxdWVyeV93aXpfZ3JwKG1lKSAmJgogICAgICAgICAgICAgIGVmdW46OmludGVyYWN0aXZlX2luZm8oUE8sIElJX1NOT09QX05FWFQpID09IG1lKSkgJiYgc25vb3BlcjAgKXsKICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSApewogICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAogICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKCiAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZWZ1bjo6c25vb3AobWUpOwogICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7Cn0KCgoKLy8gKiBFbXVsYXRpb24gZGVzICdhbHRlbicgZXhwbG9kZSBkdXJjaCBkYXMgbmV1ZQpzdHJpbmcgKm9sZF9leHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpIHsKICBpbnQgcywgdDsKICBzdHJpbmcgKnN0cnM7CgogIGlmICghc3RyaW5ncChzdHIpKSB7CiAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCiAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDEgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgogICAgICAgICAiJS4zME9cbiIsc3RyKSk7CiAgfQogIGlmICghc3RyaW5ncChkZWwpKSB7CiAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCiAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDIgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgogICAgICAgICAiJS4zME9cbiIsZGVsKSk7CiAgfQogIGlmKGRlbCA9PSAiIikKICAgIHJldHVybiAoe3N0cn0pOwogIHN0cnM9ZWZ1bjo6ZXhwbG9kZShzdHIsIGRlbCk7CiAgdD1zaXplb2Yoc3RycyktMTsKICB3aGlsZShzPD10ICYmIHN0cnNbcysrXSA9PSAiIik7cy0tOwogIHdoaWxlKHQ+PTAgJiYgc3Ryc1t0LS1dID09ICIiKTt0Kys7CiAgaWYoczw9dCkKICAgIHJldHVybiBzdHJzW3MuLnRdOwogIHJldHVybiAoe30pOwp9CgppbnQgZmlsZV90aW1lKHN0cmluZyBwYXRoKSB7CiAgbWl4ZWQgKnY7CgogIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgaWYgKHNpemVvZih2PWdldF9kaXIocGF0aCxHRVRESVJfREFURVMpKSkgcmV0dXJuIHZbMF07CiAgcmV0dXJuKDApOyAvL3NvbnN0Cn0KCi8vICogQmVpIDUwayBHcm9lc3NlIExvZy1GaWxlIHJvdGllcmVuCnZhcmFyZ3MgaW50IGxvZ19maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgdHh0LCBpbnQgc2l6ZV90b19icmVhaykgewogIG1peGVkICpzdDsKCiAgZmlsZT0iL2xvZy8iK2ZpbGU7CiAgZmlsZT1pbXBsb2RlKChlZnVuOjpleHBsb2RlKGZpbGUsIi8iKS0oeyIuLiJ9KSksIi8iKTsKLy8gIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJqb2YiKSxzcHJpbnRmKCJMT0cgRklMRTogJU8gLT4gJU9cbiIscHJldmlvdXNfb2JqZWN0KCksZmlsZSkpOwogIGlmICghZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNhbGxfb3RoZXIsUE8pLCJzZWN1cmUvbWFzdGVyIiwvLycpCiAgICAgICAgICAgICAgInZhbGlkX3dyaXRlIixmaWxlLGdldGV1aWQoUE8pLCJsb2dfZmlsZSIsUE8pKQogICAgICByZXR1cm4gMDsKICBpZiAoIHNpemVfdG9fYnJlYWsgPj0gMCAmICgKICAgICAgc2l6ZW9mKHN0ID0gZ2V0X2RpcihmaWxlLDIpICkgJiYgc3RbMF0gPj0gKHNpemVfdG9fYnJlYWt8TUFYX0xPR19TSVpFKSkpCiAgICAgIGNhdGNoKHJlbmFtZShmaWxlLCBmaWxlICsgIi5vbGQiKTtwdWJsaXNoKTsgLyogTm8gcGFuaWMgaWYgZmFpbHVyZSAqLwogIHJldHVybih3cml0ZV9maWxlKGZpbGUsdHh0KSk7Cn0KCi8vICogTWFnaWVyLUxldmVsIGFiZnJhZ2VuCmludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKSB7CiAgcmV0dXJuIChpbnQpIi9zZWN1cmUvbWFzdGVyIi0+cXVlcnlfd2l6X2xldmVsKHBsYXllcik7Cn0KCiNpZmRlZiBfX0FMSVNUU19fCi8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IGtleSkKbWl4ZWQgKnJlbW92ZV9hbGlzdChtaXhlZCBrZXksbWl4ZWQgKmFsaXN0KQp7CiAgaW50IGksajsKCiAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkpCiAgICByZXR1cm4gYWxpc3Q7CiAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCiAgewogICAgaWYgKChpPWFzc29jKGtleSxhbGlzdCkpPDApCiAgICAgIHJldHVybiBhbGlzdDsKICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKICB9CiAgaSA9IGFzc29jKGtleSxhbGlzdFswXSk7CiAgaWYgKChpPWFzc29jKGtleSxhbGlzdFswXSkpPDApCiAgICByZXR1cm4gYWxpc3Q7CiAgYWxpc3Q9YWxpc3RbMC4uXTsKICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQogICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07CiAgcmV0dXJuIGFsaXN0Owp9CgovLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBwb3MpCm1peGVkICpleGNsdWRlX2FsaXN0KGludCBpLG1peGVkICphbGlzdCkKewogIGludCBqOwogIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpIHx8IGk8MCkKICAgIHJldHVybiBhbGlzdDsKICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKICBhbGlzdD1hbGlzdFswLi5dOyAvKiBDcmVhdGUgUEhZU0lDQUwgY29weSBvZiBhbGlzdCAqLwogIGZvciAoaj1zaXplb2YoYWxpc3QpLTE7aj49MDtqLS0pCiAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKICByZXR1cm4gYWxpc3Q7IC8qIG9yZGVyX2FsaXN0IGlzIE5PVCBuZWNlc3NhcnkgLSBzZWUgL2RvYy9MUEMvYWxpc3QgKi8KfQojZW5kaWYgLy8gX19BTElTVFNfXwoKLy8gKiBHZXJtYW4gdmVyc2lvbiBvZiBjdGltZSgpCiNkZWZpbmUgVEFHRSAoeyJTb24iLCJNb24iLCJEaWUiLCJNaXQiLCJEb24iLCJGcmUiLCJTYW0ifSkKI2RlZmluZSBNT05BVEUgKHsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWFpIiwiSnVuIiwiSnVsIiwiQXVnIixcCiAgICAgICAgICAgICAgICAgIlNlcCIsIk9rdCIsIk5vdiIsIkRleiJ9KQpzdHJpbmcgZHRpbWUoaW50IHdhbm4pIHsKICAKICBpZiAod2FubiA9PSBkdGltZV9jYWNoZVswXSkKICAgIHJldHVybihkdGltZV9jYWNoZVsxXSk7CgogIGludCAqbHQgPSBsb2NhbHRpbWUod2Fubik7CiAgcmV0dXJuIHNwcmludGYoIiVzLCAlMmQuICVzICVkLCAlMDJkOiUwMmQ6JTAyZCIsCiAgICAgIFRBR0VbbHRbVE1fV0RBWV1dLCBsdFtUTV9NREFZXSwgTU9OQVRFW2x0W1RNX01PTl1dLCAKICAgICAgbHRbVE1fWUVBUl0sbHRbVE1fSE9VUl0sIGx0W1RNX01JTl0sIGx0W1RNX1NFQ10pOwp9CgovLyB3ZW5uIHN0cmZ0aW1lIGltIERyaXZlciBuaWNodCBleGlzdGllcnQsIGlzdCBkaWVzIGhpZXIgZWluIEFsaWFzIGF1ZiBkdGltZSgpLAovLyB6d2FyIHN0aW1tdCBkYXMgRm9ybWF0IGRhbm4gbmljaHQsIGFiZXIgZGllIE11ZGxpYiBidWdndCBuaWNodCB1bmQgc2NocmVpYnQKLy8gZWluIG9yZGVudGxpY2hlcyBEYXR1bS9VaHJ6ZWl0LgojaWYgIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCnZhcmFyZ3Mgc3RyaW5nIHN0cmZ0aW1lKG1peGVkIGZtdCwgaW50IGNsb2NrLCBpbnQgbG9jYWxpemVkKSB7CiAgaWYgKGludHAoY2xvY2spICYmIGNsb2NrID49IDApCiAgICByZXR1cm4gZHRpbWUoY2xvY2spOwogIGVsc2UgaWYgKGludHAoZm10KSAmJiBmbXQgPj0gMCkKICAgIHJldHVybiBkdGltZShmbXQpOwogIAogIHJldHVybiBkdGltZSh0aW1lKCkpOwp9CiNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQoKLy8gKiBTaHV0ZG93biBtaXQgenVzYWV0emxpY2hlbSBsb2dnaW5nCm5vbWFzayBpbnQgc2h1dGRvd24oc3RyaW5nIHJlYXNvbikKewogIHN0cmluZyBuYW1lOwogIHN0cmluZyBvYm5hbWU7CiAgc3RyaW5nIG91dHB1dDsKCiAgaWYgKCFyZWFzb24pCiAgICByZXR1cm4gMDsKICBpZiAoICFBUkNIX1NFQ1VSSVRZICYmIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkhPVJPT1RJRCAmJgogICAgICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpIT0iL29iai9zaHV0IiApCiAgewogICAgd3JpdGUoIllvdSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gc2h1dCBkb3duIHRoZSBnYW1lZHJpdmVyIVxuIik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKCh0aGlzX2ludGVyYWN0aXZlKCkpJiYobmFtZT1nZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkpCiAgewogICAgbmFtZT1jYXBpdGFsaXplKG5hbWUpOwogICAgZmlsdGVyKHVzZXJzKCksIyd0ZWxsX29iamVjdCwvLycKICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKSsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIhXG4iKTsKICB9CiAgZWxzZQogICAgbmFtZT0iQU5PTllNT1VTIjsKICBpZiAocHJldmlvdXNfb2JqZWN0KCkpIG9ibmFtZT1jYXBpdGFsaXplKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOwogIG91dHB1dD1uYW1lOwogIGlmIChvYm5hbWUgJiYgbmFtZSE9b2JuYW1lKSBvdXRwdXQ9b3V0cHV0KyIgKCIrb2JuYW1lKyIpIjsKICBpZiAocHJldmlvdXNfb2JqZWN0KCkmJm9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKT09Ii9vYmovc2h1dCIpewogICAgb3V0cHV0Kz0iIGZhZWhydCBkYXMgU3BpZWwgdmlhIEFybWFnZWRkb24gaGVydW50ZXIuXG4iOwogICAgb3V0cHV0PWR0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQ7CiAgICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKICAgIGVmdW46OnNodXRkb3duKCk7CiAgICByZXR1cm4gMTsKICB9CiAgb3V0cHV0PWN0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQrIiBmYWVocnQgZGFzIFNwaWVsIGhlcnVudGVyLlxuIjsKICBvdXRwdXQrPSIgICAgR3J1bmQ6ICIrcmVhc29uOwogIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOwogIGVmdW46OnNodXRkb3duKCk7CiAgcmV0dXJuIDE7Cn0KCi8vICogbG93ZXJjaGFyCgppbnQgbG93ZXJjaGFyKGludCBjaGFyKSB7CiAgaWYgKGNoYXI8J0EnIHx8IGNoYXI+J1onKSByZXR1cm4gY2hhcjsKICByZXR1cm4gY2hhciszMjsKfQoKLy8gKiB1cHBlcnN0cmluZwoKc3RyaW5nIHVwcGVyc3RyaW5nKHN0cmluZyBzKQp7CiNpZiBfX0VGVU5fREVGSU5FRF9fKHVwcGVyX2Nhc2UpCiAgcmV0dXJuKHVwcGVyX2Nhc2UocykpOwojZWxzZQogIGludCBpOwogIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7CiAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKSBzW2ldPSgoc1tpXTwnYSd8fHNbaV0+J3onKT9zW2ldOnNbaV0tMzIpOwogIHJldHVybiBzOwojZW5kaWYKfQoKLy8gKiBsb3dlcnN0cmluZwoKc3RyaW5nIGxvd2Vyc3RyaW5nKHN0cmluZyBzKQp7CiAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKICByZXR1cm4gbG93ZXJfY2FzZShzKTsKfQoKCi8vICogR0QgdmVyc2lvbgpzdHJpbmcgdmVyc2lvbigpCnsKICByZXR1cm4gX19WRVJTSU9OX187Cn0KCi8vICogYnJlYWtfc3RyaW5nCi8vIHN0cmV0Y2goKSAtLSBzdHJldGNoIGEgbGluZSB0byBmaWxsIGEgZ2l2ZW4gd2lkdGggCnByaXZhdGUgc3RyaW5nIHN0cmV0Y2goc3RyaW5nIHMsIGludCB3aWR0aCkgewogIGludCBsZW49c2l6ZW9mKHMpOwogIGlmIChsZW49PXdpZHRoKSByZXR1cm4gczsKCiAgLy8gcmVpbmUgTGVlcnplaWxlbiwgZGlyZWt0IHp1cnVlY2tnZWJlbgogIHN0cmluZyB0cmltbWVkPXRyaW0ocyxUUklNX0xFRlQsIiAiKTsKICBpZiAodHJpbW1lZD09IiIpIHJldHVybiBzOyAKICBpbnQgc3RhcnRfc3BhY2VzID0gbGVuIC0gc2l6ZW9mKHRyaW1tZWQpOwoKICBzdHJpbmcqIHdvcmRzID0gZXhwbG9kZSh0cmltbWVkLCAiICIpOwogIC8vIGRlciBsZXR6dGUga3JpZWd0IGtlaW5lIFNwYWNlcwogIGludCB3b3JkX2NvdW50PXNpemVvZih3b3JkcykgLSAxOwogIC8vIHdlbm4gWmVpbGUgbnVyIGF1cyBlaW5lbSBXb3J0LCB3aXJkIGRhcyBXb3J0IHp1cnVlY2tnZWdlYmVuCiAgaWYgKCF3b3JkX2NvdW50KQogICAgcmV0dXJuICIgIipzdGFydF9zcGFjZXMgKyB3b3Jkc1swXTsKCiAgaW50IHNwYWNlX2NvdW50ID0gd2lkdGggLSBsZW47CgogIGludCBzcGFjZV9wZXJfd29yZD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgLyB3b3JkX2NvdW50OwogIC8vIEFuei5Xb2VydGVyIG1pdCBadXNhdHotU3BhY2UKICBpbnQgcmVzdD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgJSB3b3JkX2NvdW50OyAKICAvLyBSZXN0LVNwYWNlcyBWZXJ0ZWlsZW4KICBmb3JlYWNoIChpbnQgcG9zIDogcmVzdCkgd29yZHNbcG9zXSs9IiAiOwogIHJldHVybiAoIiAiKnN0YXJ0X3NwYWNlcykgKyBpbXBsb2RlKCB3b3JkcywgIiAiKnNwYWNlX3Blcl93b3JkICk7Cn0KCi8vIGF1cyBHZXNjaHdpbmRpZ2tlaXRzZ3J1ZW5kZW4gaGF0IGRlciBCbG9ja3NhdHogZnVlciBicmVha19zdHJpbmcgZWluZQovLyBlaWdlbmUgRnVua3Rpb24gYmVrb21tZW46CnByaXZhdGUgdmFyYXJncyBzdHJpbmcgYmxvY2tfc3RyaW5nKHN0cmluZyBzLCBpbnQgd2lkdGgsIGludCBmbGFncykgewogIC8vIHdlbm4gQlNfTEVBVkVfTVlfTEZTLCBhYmVyIGtlaW4gQlNfTk9fUEFSSU5ERU5ULCBkYW5uIHdlcmRlbiBaZWlsZW4gbWl0CiAgLy8gZWluZW0gTGVlcnplaWNoZW4gYmVnb25uZW4uCiAgLy8gQlRXOiBXZW5uICFCU19MRUFWRV9NWV9MRlMsIGhhdCBkZXIgQXVmcnVmZXIgYmVyZWl0cyBhbGxlIFxuIGR1cmNoICIgIgogIC8vIGVyc2V0enQuCiAgaWYgKCAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpCiAgICAgICYmICEoZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpKQogIHsKICAgICAgcyA9ICIgIityZWdyZXBsYWNlKHMsIlxuIiwiXG4gIiwxKTsKICB9CgogIC8vIHNwcmludGYgZnVlbGx0IGRpZSBsZXR6dGUgWmVpbGUgYXVmIGRpZSBGZWxkYnJlaXRlIChoaWVyIGFsc28KICAvLyBaZWlsZW5icmVpdGUpIG1pdCBGdWVsbHplaWNoZW4gYXVmLCB3ZW5uIHNpZSBOSUNIVCBtaXQgXG4gdW1nZWJyb2NoZW4KICAvLyBpc3QuIEVzIHdpcmQgYW4gZGllIGxldHp0ZSBaZWlsZSBhYmVyIGtlaW4gWmVpbGVudW1icnVjaCBhbmdlaGFlbmd0LgogIC8vIEVpZ2VudGxpY2ggaXN0IGRhcyBBdWZmdWVsbGVuIGRvb2YsIGFiZXIgdmVybXV0bGljaCBpc3QgZXMgdW5ub2V0aWcsIGVzCiAgLy8gd2llZGVyIHJ1ZWNrZ2FlbmdpZyB6dSBtYWNoZW4uCiAgcyA9IHNwcmludGYoICIlLSo9cyIsIHdpZHRoLCBzKTsKCiAgc3RyaW5nICp0bXA9ZXhwbG9kZShzLCAiXG4iKTsKICAvLyBOdXIgd2VubiBzIG1laHJ6ZWlsaWcgaXN0LCBCbG9ja3NhdHogZHJhdXMgbWFjaGVuLiBEaWUgbGV0enRlIFplaWxlIHdpcmQKICAvLyBuYXR1ZXJsaWNoIG5pY2h0IGdlZGVobnQuIFNpZSBpc3QgZGFmdWVyIHNjaG9uIHZvbiBzcHJpbnRmKCkgYXVmZ2VmdWVsbHQKICAvLyB3b3JkZW4uIEJUVzogRGllIGxldHp0ZSBaZWlsZSBlbmRldCB1LlUuIG5vY2ggbmljaHQgbWl0IGVpbmVtIFxuIChiencuCiAgLy8gbnVyIGRhbm4sIHdlbm4gQlNfTEVBVkVfTVlfTEZTIHVuZCBkZXIgdWViZXJnZWJlbmUgVGV4dCBzY2hvbiBuZW4gXG4gYW0KICAvLyBFbmRlIGRlciBsZXR6dGVuIFplaWxlIGhhdCksIGRhcyBtYWNodCBkZXIgQXVmcnVmZXIuLi4KICBpZiAoc2l6ZW9mKHRtcCkgPiAxKQogICAgcmV0dXJuIGltcGxvZGUoIG1hcCggdG1wWzAuLjwyXSwgIydzdHJldGNoLyonKi8sIHdpZHRoICksICJcbiIgKSAKICAgICAgKyAiXG4iICsgdG1wWzwxXTsKCiAgcmV0dXJuIHM7Cn0KCnB1YmxpYyB2YXJhcmdzIHN0cmluZyBicmVha19zdHJpbmcoc3RyaW5nIHMsIGludCB3LCBtaXhlZCBpbmRlbnQsIGludCBmbGFncykKewogICAgaWYgKCAhcyB8fCBzID09ICIiICkgcmV0dXJuICIiOwoKICAgIGlmICggIXcgKSB3PTc4OwoKICAgIGlmKCBpbnRwKGluZGVudCkgKQogICAgICAgaW5kZW50ID0gaW5kZW50ID8gIiAiKmluZGVudCA6ICIiOwoKICAgIGludCBpbmRlbnRsZW49c3RyaW5ncChpbmRlbnQpID8gc2l6ZW9mKGluZGVudCkgOiAwOwoKICAgIGlmIChpbmRlbnRsZW4+dykgewogICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJicmVha19zdHJpbmc6IGluZGVudCBsb25nZXIgJWQgdGhhbiB3aWR0aCAlZFxuIiwKICAgICAgICAgICAgICAgICAgaW5kZW50bGVuLHcpKTsKICAgICAgLy8gdz0oKGluZGVudGxlbi93KSsxKSp3OwogICAgfQoKICAgIGlmICghKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSkgCiAgICAgIHM9cmVncmVwbGFjZSggcywgIlxuIiwgIiAiLCAxICk7CgogICAgaWYgKCBmbGFncyAmIEJTX1NJTkdMRV9TUEFDRSApCiAgICAgICBzID0gcmVncmVwbGFjZSggcywgIihefFxufCApICAqIiwgIlxcMSIsIDEgKTsKIAogICAgc3RyaW5nIHByZWZpeD0iIjsKICAgIGlmIChpbmRlbnRsZW4gJiYgZmxhZ3MgJiBCU19QUkVQRU5EX0lOREVOVCkgewogICAgICBpZiAoaW5kZW50bGVuK3NpemVvZihzKSA+IHcgfHwgCiAgICAgICAgIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykgJiYgc3Ryc3RyKHMsIlxuIik+LTEpIHsKICAgICAgIHByZWZpeD1pbmRlbnQrIlxuIjsKICAgICAgIGluZGVudD0oZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpID8gIiIgOiAiICI7CiAgICAgICBpbmRlbnRsZW49c2l6ZW9mKGluZGVudCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIGZsYWdzICYgQlNfQkxPQ0sgKSB7CiAgICAgIC8qCiAgICAgICAgICAgcyA9IGltcGxvZGUoIG1hcCggZXhwbG9kZSggcywgIlxuIiApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydibG9ja19zdHJpbmcsIHcsIGluZGVudGxlbiwgZmxhZ3MpLAogICAgICAgICAgICAgICAgICAgICAgIiIgKTsKICAgICAgKi8KICAgICAgcyA9IGJsb2NrX3N0cmluZyggcyAsIHcgLSBpbmRlbnRsZW4sIGZsYWdzICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgcyA9IHNwcmludGYoIiUtMS4qPXMiLHctaW5kZW50bGVuLHMpOwogICAgfQogICAgaWYgKCBzWzwxXSAhPSAnXG4nICkgcyArPSAiXG4iOwoKICAgIGlmICggIWluZGVudGxlbiApIHJldHVybiBwcmVmaXggKyBzOwogICAgCiAgICBzdHJpbmcgaW5kZW50MiA9ICggZmxhZ3MgJiBCU19JTkRFTlRfT05DRSApID8gKCIgIippbmRlbnRsZW4pIDppbmRlbnQ7CiAgICAgIAogICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIAogICAgICByZWdyZXBsYWNlKCBzWzAuLjwyXSwgIlxuIiwgIlxuIitpbmRlbnQyLCAxICkgKyAiXG4iOwogICAgICAvKgogICAgICAgc3RyaW5nICpidWY7CgogICAgICAgYnVmID0gZXhwbG9kZSggcywgIlxuIiApOwogICAgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIGltcGxvZGUoIGJ1ZlswLi48Ml0sICJcbiIraW5kZW50MiApICsgYnVmWzwxXSArICJcbiI7CiAgICAgICovCn0KCi8vICogRWxlbWVudGUgYXVzIG1hcHBpbmcgbG9lc2NoZW4gLSBtYXBwaW5nIHZvcmhlciBrb3BpZXJlbgoKbWFwcGluZyBtX2NvcHlfZGVsZXRlKG1hcHBpbmcgbSwgbWl4ZWQga2V5KSB7CiAgcmV0dXJuIG1fZGVsZXRlKGNvcHkobSksIGtleSk7Cn0KCi8vICogdGltZXMKaW50IGxhc3RfcmVib290X3RpbWUoKQp7CiAgcmV0dXJuIF9fQk9PVF9USU1FX187Cn0KCmludCBmaXJzdF9ib290X3RpbWUoKQp7CiAgcmV0dXJuIDcwMTUxNzYwMDsKfQoKaW50IGV4aXN0X2RheXMoKQp7CiAgcmV0dXJuICgoKHRpbWUoKS1maXJzdF9ib290X3RpbWUoKSkvODY0MCkrNSkvMTA7Cn0KCi8vICogdXB0aW1lIDopCnN0cmluZyB1cHRpbWUoKQp7CiAgaW50IHQ7CiAgaW50IHRtcDsKICBzdHJpbmcgczsKCiAgdD10aW1lKCktX19CT09UX1RJTUVfXzsKICBzPSIiOwogIGlmICh0Pj04NjQwMCkKICAgIHMrPXNwcmludGYoIiVkIFRhZyVzLCAiLHRtcD10Lzg2NDAwLCh0bXA9PTE/IiI6ImUiKSk7CiAgaWYgKHQ+PTM2MDApCiAgICBzKz1zcHJpbnRmKCIlZCBTdHVuZGUlcywgIix0bXA9KHQ9dCU4NjQwMCkvMzYwMCwodG1wPT0xPyIiOiJuIikpOwogIGlmICh0PjYwKQogICAgcys9c3ByaW50ZigiJWQgTWludXRlJXMgdW5kICIsdG1wPSh0PXQlMzYwMCkvNjAsKHRtcD09MT8iIjoibiIpKTsKICByZXR1cm4gcytzcHJpbnRmKCIlZCBTZWt1bmRlJXMiLHQ9dCU2MCwodD09MT8iIjoibiIpKTsKfQoKLy8gKiBXYXMgdHVuIGJlaSAnZGFuZ2xpbmcnIGxmdW4tY2xvc3VyZXMgPwp2b2lkIGRhbmdsaW5nX2xmdW5fY2xvc3VyZSgpIHsKICByYWlzZV9lcnJvcigiZGFuZ2xpbmcgbGZ1biBjbG9zdXJlXG4iKTsKfQoKLy8gKiBTcGVycmVuIGF1c3NlciBmdWVyIG1hc3Rlci9zaW11bF9lZnVuCgojaWYgX19FRlVOX0RFRklORURfXyhzZXRfZW52aXJvbm1lbnQpCm5vbWFzayB2b2lkIHNldF9lbnZpcm9ubWVudChvYmplY3QgbzEsIG9iamVjdCBvMikgewogIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cn0KI2VuZGlmCgpub21hc2sgdm9pZCBzZXRfdGhpc19wbGF5ZXIob2JqZWN0IHBsKSB7CiAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKfQoKI2lmIF9fRUZVTl9ERUZJTkVEX18oZXhwb3J0X3VpZCkKbm9tYXNrIHZvaWQgZXhwb3J0X3VpZChvYmplY3Qgb2IpIHsKICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOwp9CiNlbmRpZgoKLy8gKiBKZXR6dCBhdWNoIGNsb3N1cmVzCmludCBwcm9jZXNzX2ZsYWc7CgpwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKQp7CiAgaWYgKHByb2Nlc3NfZmxhZz4wKQogICAgcmV0dXJuIHByb2Nlc3NfZmxhZzsKICBlbHNlIHJldHVybigwKTsKfQoKcHJpdmF0ZSBub21hc2sgc3RyaW5nIF9wcm9jZXNzX3N0cmluZyhzdHJpbmcgc3RyLG9iamVjdCBwbykgewogICAgICAgICAgICAgIHNldF90aGlzX29iamVjdChwbyk7CiAgICAgICAgICAgICAgcmV0dXJuKGVmdW46OnByb2Nlc3Nfc3RyaW5nKHN0cikpOwp9Cgpub21hc2sgc3RyaW5nIHByb2Nlc3Nfc3RyaW5nKCBtaXhlZCBzdHIgKQp7CiAgc3RyaW5nIHRtcCwgZXJyOwogIGludCBmbGFnOyAKCiAgaWYgKCBjbG9zdXJlcChzdHIpICkgewogICAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7CiAgICAgIHJldHVybiBmdW5jYWxsKHN0cik7CiAgfQogIGVsc2UgaWYgKHN0cj09MCkKICAgICAgcmV0dXJuKChzdHJpbmcpc3RyKTsKICBlbHNlIGlmICggIXN0cmluZ3Aoc3RyKSApIHsKICAgICAgcmV0dXJuIHRvX3N0cmluZyhzdHIpOwogIH0KCiAgaWYgKCAhKGZsYWcgPSBwcm9jZXNzX2ZsYWcgPiB0aW1lKCkgLSA2MCkpICAgICAgICAgICAgICAgICAgICAgCiAgICAgIHByb2Nlc3NfZmxhZz10aW1lKCk7CgogIGVyciA9IGNhdGNoKHRtcCA9IGZ1bmNhbGwoIydfcHJvY2Vzc19zdHJpbmcsc3RyLHByZXZpb3VzX29iamVjdCgpKTsgcHVibGlzaCk7CgogIGlmICggIWZsYWcgKQogICAgcHJvY2Vzc19mbGFnPTA7CgogIGlmIChlcnIpIHsKICAgIC8vIFZlcmFyYmVpdHVuZyBhYmJyZWNoZW4KICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgICByYWlzZV9lcnJvcihlcnIpOwogIH0KICByZXR1cm4gdG1wOwp9CgovLyAnbWtkaXIgLXAnIC0gZXJ6ZXVndCBlaW5lIGtvbXBsZXR0ZSBIaWVyYXJjaGllIHZvbiBWZXJ6ZWljaG5pc3Nlbi4KLy8gd2VubiBkYXMgVmVyemVpY2huaXMgYW5nZWxlZ3Qgd3VyZGUgb2RlciBzY2hvbiBleGlzdGllcnQsIHdpcmQgMQovLyB6dXJ1ZWNrZ2VsaWVmZXJ0LCBzb25zdCAwLgovLyBXaXJmdCBlaW5lbiBGZWhsZXIsIHdlbm4gZGFzIGFuZ2ViZW5lIFZlcnplaWNobmlzIG5pY2h0IGFic29sdXQgaXN0IQpwdWJsaWMgaW50IG1rZGlycChzdHJpbmcgZGlyKSB7CiAgLy8gd2VubiBlcyBudXIga2VpbmVuIGZ1ZWhyZW5kZW4gLyBnaWJ0LCBpc3QgZGFzIGVpbiBGZWhsZXIuCiAgaWYgKHN0cnN0cihkaXIsICIvIikgIT0gMCkKICAgIHJhaXNlX2Vycm9yKCJta2RpcnAoKTogUGZhZCBpc3QgbmljaHQgYWJzb2x1dGUuXG4iKTsKICAvLyBjdXQgb2ZmIHRyYWlsaW5nIC8uLi4KICBpZiAoZGlyWzwxXT09Jy8nKQogICAgICBkaXIgPSBkaXJbMC4uPDJdOwoKICBpbnQgZnN0YXQgPSBmaWxlX3NpemUoZGlyKTsKICAvLyB3ZW5uIGVzIHNjaG9uIGV4aXN0aWVydCwgdHVuIHdpciBlaW5mYWNoIHNvLCBhbHMgaGFldHRlbiB3aXIgZXMgYW5nZWxlZ3QuCiAgaWYgKGZzdGF0ID09IEZTSVpFX0RJUikKICAgIHJldHVybiAxOwogIC8vIHdlbm4gc2Nob24gbmUgRGF0ZWkgZXhpc3RpZXJ0LCBnZWh0IGVzIG5pY2h0LgogIGlmIChmc3RhdCAhPSBGU0laRV9OT0ZJTEUpCiAgICByZXR1cm4gMDsKICAvLyB3ZW5uIGVzIG51ciBlaW5lbiAvIGdpYnQgKGRlbiBmdWVocmVuZGVuKSwgZGFubiBpc3QgZXMgZWluCiAgLy8gdG9wbGV2ZWwtdmVyemVpY2huaXMsIHdhcyBkaXJla3QgYW5nZWxlZ3Qgd2lyZC4KICBpZiAoc3RycnN0cihkaXIsIi8iKT09MCkgewogICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOwogIH0KCiAgLy8gbWtkaXIoKSBuaWNodCBkaXJla3QgcnVmZW4sIHNvbmRlcm4gdm9yaGVyIGFscyBjbG9zdXJlIGFucyBhdWZydWZlbmRlCiAgLy8gT2JqZWt0IGJpbmRlbi4gU29uc3QgbGFldWZ0IGRpZSBSZWNodGVwcnVlZnVuZyBpbiB2YWxpZF93cml0ZSgpIGltIE1hc3RlcgogIC8vIHVudGVyIGRlciBBbm5haG1lLCBkYXNzIGRpZSBzaW11bF9lZnVuLmMgbWl0IGlocmVyIHJvb3QgaWQgd2FzIHdpbGwuCgogIC8vIGpldHp0IHJla3Vyc2l2IGRpZSBWZXJ6ZWljaG5pc2hpZXJhcmNoaWUgYW5sZWdlbi4gV2VubiBkYXMgZXJmb2xncmVpY2gKICAvLyBpc3QsIGRhbm4ga29lbm5lbiB3aXIgamV0enQgbWl0IG1rZGlyIGRhcyB0aWVmc3RlIFZlcnplaWNobmlzIGFubGVnZW4KICBpZiAobWtkaXJwKGRpclswLi5zdHJyc3RyKGRpciwiLyIpLTFdKSA9PSAxKQogICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOwp9CgoKLy8gKiBQcm9wZXJ0aWVzIGdnZnMuIG1pdHNwZWljaGVybgptaXhlZCBzYXZlX29iamVjdChtaXhlZCBuYW1lKQp7CiAgbWFwcGluZyBwcm9wZXJ0aWVzOwogIG1hcHBpbmcgc2F2ZTsKICBtaXhlZCBpbmRleCwgcmVzOwogIGludCBpOwogIHN0cmluZyBvbGRwYXRoOwoKICAvLyBudXIgU3RyaW5ncyB1bmQgMCB6dWxhc3NlbgogIGlmICgoIXN0cmluZ3AobmFtZSkgfHwgIXNpemVvZihuYW1lKSkgJiYgCiAgICAgICghaW50cChuYW1lKSB8fCBuYW1lIT0wKSkgewogICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAogICAgICAgICAiT25seSBub24tZW1wdHkgc3RyaW5ncyBhbmQgMCBtYXkgYmUgdXNlZCBhcyBmaWxlbmFtZSBpbiAiCiAgICAgICAgICJzZWZ1bjo6c2F2ZV9vYmplY3QoKSEgQXJndW1lbnQgd2FzICVPXG4iLG5hbWUpKTsKICB9CgogIGlmIChzdHJpbmdwKG5hbWUpKSB7CiAgICAvLyBhYnMuIFBmYWQgZXJ6ZXVnZW4uICpzZXVmeioKICAgIGlmIChuYW1lWzBdIT0nLycpCiAgICAgIG5hbWUgPSAiLyIgKyBuYW1lOwogICAgb2xkcGF0aCA9IG5hbWU7CiAgICAvLyBhdXRvbWF0aXNjaCBpbiBMSUJEQVRBRElSIHNwZWljaGVybgogICAgaWYgKHN0cnN0cihuYW1lLCIvIkxJQkRBVEFESVIiLyIpICE9IDApIHsKICAgICAgbmFtZSA9ICIvIkxJQkRBVEFESVIgKyBuYW1lOwogICAgICAvLyB3ZW5uIGRhcyBWZXJ6ZWljaG5pcyBuaWNodCBleGlzdGllcnQsIGdnZi4gYW5sZWdlbgogICAgICBzdHJpbmcgZGlyID0gbmFtZVswLi5zdHJyc3RyKG5hbWUsIi8iKS0xXTsKICAgICAgaWYgKGZpbGVfc2l6ZShkaXIpICE9IEZTSVpFX0RJUikgewogICAgICAgIGlmIChta2RpcnAoZGlyKSAhPSAxKQogICAgICAgICAgcmFpc2VfZXJyb3IoInNhdmVfb2JqZWN0KCk6IGthbm4gVmVyemVpY2huaXMgIiArIGRpcgogICAgICAgICAgICAgICsgIiBuaWNodCBhbmxlZ2VuISIpOwogICAgICB9CiAgICB9CiAgfQoKICBzYXZlID0gbV9hbGxvY2F0ZSgwLCAyKTsKICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOwoKICBpZihtYXBwaW5ncChwcm9wZXJ0aWVzKSkKICB7CiAgICAvLyBkZWxldGUgYWxsIGVudHJpZXMgaW4gbWFwcGluZyBwcm9wZXJ0aWVzIHdpdGhvdXQgU0FWRSBmbGFnIQogICAgaW5kZXggPSBtX2luZGljZXMocHJvcGVydGllcyk7CiAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDtpLS0pCiAgICB7CiAgICAgIGlmKHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJiBTQVZFKQogICAgICB7CiAgICAgICBzYXZlW2luZGV4W2ldXSA9IHByb3BlcnRpZXNbaW5kZXhbaV1dOwogICAgICAgc2F2ZVtpbmRleFtpXSwgRl9NT0RFXSA9CiAgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYKICAgICAgICAgICAgICAgICAgICAofihTRVRNTk9URk9VTkR8UVVFUllNTk9URk9VTkR8UVVFUllDQUNIRUR8U0VUQ0FDSEVEKSk7CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZSBzYXZlID0gKFtdKTsKCiAgLy8gc2F2ZSBvYmplY3QhCiAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKHNhdmUpOwogIC8vIGZvcm1hdDogd2llIGRlZmluaWVydCBpbiBjb25maWcuaAogIGlmIChzdHJpbmdwKG5hbWUpKSB7CiAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSwKICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOwogICAgLy8gd2VubiBlcmZvbGdyZWljaCB1bmQgbm9jaCBuZW4gU2F2ZWZpbGUgZXhpc3RpZXJ0LCB3YXMgbmljaHQgdW50ZXIKICAgIC8vIC9kYXRhLyBsaWVndCwgd2lyZCBkYXMgZ2Vsb2VzY2h0LgogICAgaWYgKCFyZXMgJiYgb2xkcGF0aAogICAgICAgICYmIGZpbGVfc2l6ZShvbGRwYXRoKyIubyIpID49IDApCiAgICAgIHJtKG9sZHBhdGgrIi5vIik7CiAgfQogIGVsc2UKICAgIHJlcyA9IGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpzYXZlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLAogICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7CgogIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKCiNpZmRlZiBJT1NUQVRTCiAgLy8gU3RhdHMuLi4KICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKICBzdGF0LT50aW1lID0gdGltZSgpOwogIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAogIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOwogIGlmIChzdHJpbmdwKG5hbWUpKQogICAgICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKICBlbHNlCiAgICAgIHN0YXQtPnNpemVvZihyZXMpOwogIC8vZGVidWdfbWVzc2FnZSgic2F2ZW86ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKICBzYXZlb19zdGF0WzFdW3NhdmVvX3N0YXRbMF1dID0gc3RhdDsKICBzYXZlb19zdGF0WzBdID0gKHNhdmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihzYXZlb19zdGF0WzFdKTsKICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvIDI6ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKI2VuZGlmCgogIHJldHVybiByZXM7Cn0KCi8vICogQXVjaCBQcm9wZXJ0aWVzIGxhZGVuCmludCByZXN0b3JlX29iamVjdChzdHJpbmcgbmFtZSkKewogIGludCByZXN1bHQ7CiAgbWl4ZWQgaW5kZXg7CiAgbWl4ZWQgc2F2ZTsKICBtYXBwaW5nIHByb3BlcnRpZXM7CiAgaW50IGk7CiAgY2xvc3VyZSBjbDsKCiAgLy8gV2VubiBuYW1lIHZlcm11dGxpY2ggZWluIFBmYWQgKGFsc28gbmljaHQgbWl0ICN4OnkgYW5mYWVuZ3QpCiAgaWYgKG5hbWVbMF0gIT0gJyMnKQogIHsKICAgIC8vIGFicy4gUGZhZCBlcnpldWdlbiAqc2V1ZnoqCiAgICBpZiAobmFtZVswXSAhPSAnIycgJiYgbmFtZVswXSE9Jy8nKQogICAgICBuYW1lID0gIi8iICsgbmFtZTsKCiAgICAvLyB3ZW5uIGtlaW4gL2RhdGEvIHZvcm4gc3RlaHQsIGVyc3RtYWwgZ3Vja2VuLCBvYiBkYXMgU2F2ZWZpbGUgdW50ZXIKICAgIC8vIC9kYXRhLyBleGlzdGllcnQuIFdlbm4gamEsIHdpcmQgZGFzIGdlbGFkZW4uCiAgICBpZiAobmFtZVswXSE9JyMnICYmIHN0cnN0cihuYW1lLCIvIkxJQkRBVEFESVIiLyIpICE9IDApCiAgICB7CiAgICAgIHN0cmluZyBwYXRoID0gIi8iTElCREFUQURJUiArIG5hbWU7CiAgICAgIGlmIChmaWxlX3NpemUocGF0aCArICIubyIpID49IDApCiAgICAgICAgbmFtZSA9IHBhdGg7CiAgICB9CiAgfQoKICAvLyBnZXQgYWN0dWFsIHByb3BlcnR5IHNldHRpbmdzIChieSBjcmVhdGUoKSkKICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOwoKLy8gIERFQlVHKHNwcmludGYoIlJFU1RPUkUgJU9cbiIsbmFtZSkpOwogIC8vIHJlc3RvcmUgb2JqZWN0CiAgcmVzdWx0PWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpyZXN0b3JlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLCBuYW1lKTsKICAvLycpKQogIC8vX2dldF9zYXZlX2RhdGEgbGllZmVydCB0YXRzYWVjaGxpY2ggbWl4ZWQgenVydWVjaywgd2VubiBkYXMgYXVjaCBpbW1lciBlaW4gCiAgLy9tYXBwaW5nIHNlaW4gc29sbHRlLgogIHNhdmUgPSAobWl4ZWQpcHJldmlvdXNfb2JqZWN0KCktPl9nZXRfc2F2ZV9kYXRhKCk7CiAgaWYobWFwcGluZ3Aoc2F2ZSkpCiAgewogICAgaW5kZXggPSBtX2luZGljZXMoc2F2ZSk7CiAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDsgaS0tKQogICAgewogICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldXSA9IHNhdmVbaW5kZXhbaV1dOwogICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdID0gc2F2ZVtpbmRleFtpXSwgRl9NT0RFXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJn4oU0VUQ0FDSEVEfFFVRVJZQ0FDSEVEKTsKICAgIH0KICB9CiAgZWxzZSBwcm9wZXJ0aWVzID0gKFtdKTsKCiAgLy8gcmVzdG9yZSBwcm9wZXJ0aWVzCiAgZnVuY2FsbCgKICAgICAgICAgIGJpbmRfbGFtYmRhKAogICAgICAgICAgICAgICAgICAgICB1bmJvdW5kX2xhbWJkYSgoeydhcmd9KSwgLy8nfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCh7Iyd0aGlzX29iamVjdH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldFByb3BlcnRpZXMiLCdhcmd9KSksLy8nKQogICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSkscHJvcGVydGllcyk7CiAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOwoKI2lmZGVmIElPU1RBVFMKICAvLyBTdGF0cy4uLgogIC8vZGVidWdfbWVzc2FnZSgicmVzdG9yZW86ICIrcmVzdG9yZW9fc3RhdFswXSsiXG4iKTsKICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKICBzdGF0LT50aW1lID0gdGltZSgpOwogIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAogIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOwogIHN0YXQtPnNpemUgPSBmaWxlX3NpemUobmFtZSArICIubyIpOwogIHJlc3RvcmVvX3N0YXRbMV1bcmVzdG9yZW9fc3RhdFswXV0gPSBzdGF0OwoKICByZXN0b3Jlb19zdGF0WzBdID0gKHJlc3RvcmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihyZXN0b3Jlb19zdGF0WzFdKTsKI2VuZGlmCgogIHJldHVybiByZXN1bHQ7Cn0KCi8vICogSEIgZWluZXMgT2JqZWt0ZXMgZWluL2F1c3NjaGFsdGVuCmludCBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQob2JqZWN0IG9iLCBpbnQgZmxhZykKewogIGlmIChvYmplY3RwKG9iKSkKICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y29uZmlndXJlX29iamVjdCxvYiksIG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKfQoKLy8gKiBNYWdpZXJsZXZlbGdydXBwZW4gZXJtaXR0ZWxuCmludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeikKewogIGludCBsZXY7CgogIGxldj1xdWVyeV93aXpfbGV2ZWwod2l6KTsKICBpZiAobGV2PFNFRVJfTFZMKSByZXR1cm4gMDsKICBpZiAobGV2Pj1HT0RfTFZMKSByZXR1cm4gbGV2OwogIGlmIChsZXY+PUFSQ0hfTFZMKSByZXR1cm4gQVJDSF9HUlA7CiAgaWYgKGxldj49RUxERVJfTFZMKSByZXR1cm4gRUxERVJfR1JQOwogIGlmIChsZXY+PUxPUkRfTFZMKSByZXR1cm4gTE9SRF9HUlA7CiAgaWYgKGxldj49U1BFQ0lBTF9MVkwpIHJldHVybiBTUEVDSUFMX0dSUDsKICBpZiAobGV2Pj1ET01BSU5NRU1CRVJfTFZMKSByZXR1cm4gRE9NQUlOTUVNQkVSX0dSUDsKICBpZiAobGV2Pj1XSVpBUkRfTFZMKSByZXR1cm4gV0laQVJEX0dSUDsKICBpZiAobGV2Pj1MRUFSTkVSX0xWTCkgcmV0dXJuIExFQVJORVJfR1JQOwogIHJldHVybiBTRUVSX0dSUDsKfQoKbWl4ZWQgKndpemxpc3RfaW5mbygpCnsKICBpZiAoQVJDSF9TRUNVUklUWSB8fCAhZXh0ZXJuX2NhbGwoKSkKICAgICAgICAgICAgcmV0dXJuIGVmdW46Ondpemxpc3RfaW5mbygpOwogIHJldHVybiAwOwp9CgovLyAqIHdpemxpc3QgYXVzZ2ViZW4KdmFyYXJncyB2b2lkIHdpemxpc3Qoc3RyaW5nIG5hbWUsIGludCBzb3J0a2V5ICkgewoKICBpZiAoIW5hbWUpCiAgewogICAgaWYgKHRoaXNfcGxheWVyKCkpCiAgICAgIG5hbWUgPSBnZXR1aWQodGhpc19wbGF5ZXIoKSk7CiAgICBpZiAoIW5hbWUpCiAgICAgIHJldHVybjsKICB9CgogIC8vIFNjaGx1ZXNzZWwgZGFyZiBudXIgaW4gZWluZW0gZ3VlbHRpZ2VuIEJlcmVpY2ggc2VpbgogIGlmIChzb3J0a2V5PFdMX05BTUUgfHwgc29ydGtleT49V0xfU0laRSkgc29ydGtleT1XTF9DT1NUOwoKICBtaXhlZCoqIHdsID0gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7CiAgLy8gbmFjaCA8c29ydGtleT4gc29ydGllcmVuCiAgd2wgPSBzb3J0X2FycmF5KHdsLCBmdW5jdGlvbiBpbnQgKG1peGVkIGEsIG1peGVkIGIpCiAgICAgIHtyZXR1cm4gYVtzb3J0a2V5XSA8IGJbc29ydGtleV07IH0gKTsKCiAgLy8gU3VtbWUgdWViZXIgYWxsZSBLb21tYW5kb3MgZXJtaXR0ZWxuLgogIGludCB0b3RhbF9jbWQsIGk7CiAgaW50IHBvcz0tMTsKICBmb3JlYWNoKG1peGVkIGVudHJ5IDogd2wpCiAgewogICAgdG90YWxfY21kICs9IGVudHJ5W1dMX0NPTU1BTkRTXTsKICAgIGlmIChlbnRyeVtXTF9OQU1FXSA9PSBuYW1lKQogICAgICBwb3MgPSBpOwogICAgKytpOwogIH0KCiAgaWYgKHBvcyA8IDAgJiYgbmFtZSAhPSAiQUxMIiAmJiBuYW1lICE9ICJUT1AxMDAiKQogICAgcmV0dXJuOwoKICBpZiAobmFtZSA9PSAiVE9QMTAwIikKICB7CiAgICBpZiAoc2l6ZW9mKHdsKSA+IDEwMCkKICAgICAgd2wgPSB3bFswLi4xMDBdOwogICAgZWxzZQogICAgICB3bCA9IHdsOwogIH0KICAvLyB1bSBuYW1lIGhlcnVtIHNjaG5laWRlbgogIGVsc2UgaWYgKG5hbWUgIT0gIkFMTCIpCiAgewogICAgaWYgKHNpemVvZih3bCkgPD0gMjEpCiAgICAgIHdsID0gd2w7CiAgICBlbHNlIGlmIChwb3MgKyAxMCA8IHNpemVvZih3bCkgJiYgcG9zIC0gMTAgPiAwKQogICAgICB3bCA9IHdsW3Bvcy0xMC4ucG9zKzEwXTsKICAgIGVsc2UgaWYgKHBvcyA8PTIxKQogICAgICB3bCA9IHdsWzAuLjIwXTsKICAgIGVsc2UgaWYgKHBvcyA+PSBzaXplb2Yod2wpIC0gMjEpCiAgICAgIHdsID0gd2xbPDIxLi5dOwogICAgZWxzZQogICAgICB3bCA9IHdsOwogIH0KCiAgd3JpdGUoIlxuV2l6YXJkIHRvcCBzY29yZSBsaXN0XG5cbiIpOwogIGlmICh0b3RhbF9jbWQgPT0gMCkKICAgIHRvdGFsX2NtZCA9IDE7CiAgcHJpbnRmKCIlLTIwcyAlLTZzICUtM3MgJS0xN3MgJS02cyAlLTZzICUtNnNcbiIsCiAgICAgICAgICJFVUlEIiwgImNtZHMiLCAiJSIsICJDb3N0cyIsICJIQiIsICJBcnJheXMiLCJNYXBwLiIpOwogIGZvcmVhY2gobWl4ZWQgZTogd2wpCiAgewogICAgcHJpbnRmKCIlLToyMHMgJTo2ZCAlOjJkJSUgWyU6NmRrLCU6NmRHXSAlOjZkICU6NmQgJTo2ZFxuIiwKICAgICAgICAgIGVbV0xfTkFNRV0sIGVbV0xfQ09NTUFORFNdLCBlW1dMX0NPTU1BTkRTXSAqIDEwMCAvIHRvdGFsX2NtZCwKICAgICAgICAgIGVbV0xfQ09TVF0gLyAxMDAwLCBlW1dMX1RPVEFMX0dJR0FDT1NUXSwKICAgICAgICAgIGVbV0xfSEVBUlRfQkVBVFNdLCBlW1dMX0FSUkFZX1RPVEFMXSwgZVtXTF9NQVBQSU5HX1RPVEFMXQogICAgICAgICAgKTsKICB9CiAgcHJpbnRmKCJcblRvdGFsICAgICAgICAgJTdkICAgICAgICAgKCVkKVxuXG4iLCB0b3RhbF9jbWQsIHNpemVvZih3bCkpOwp9CgoKLy8gQWIgaGllciBmb2xnZW4gSGlsZnNmdW5rdGlvbmVuIGZ1ZXIgY2FsbF9vdXQoKSBiencuIGZ1ZXIgZGVyZW4gQmVncmVuenVuZwoKLy8gZXJtaXR0ZWx0IGRhcyBPYmpla3QgZGVzIENhbGxvdXRzLgpwcml2YXRlIG9iamVjdCBfY2FsbF9vdXRfb2JqKCBtaXhlZCBjYWxsX291dCApIHsKICAgIHJldHVybiBwb2ludGVycChjYWxsX291dCkgPyBjYWxsX291dFswXSA6IDA7Cn0KCnByaXZhdGUgdm9pZCBfc2FtZV9vYmplY3QoIG9iamVjdCBvYiwgbWFwcGluZyBtICkgewogIC8vIGlzdCBuaWNodCBzbyBibG9lZCwgd2llIGVzIGF1c3NpZWh0LCBzLiBuYWNoZm9sZ2VkZSBWZXJ3ZW5kdW5nIHZvbiBtCiAgaWYgKCBtW29iXSApCiAgICBtW29iXSArPSAoeyBvYiB9KTsKICBlbHNlCiAgICBtW29iXSA9ICh7IG9iIH0pOyAKfQoKLy8gYWxsZSBPYmpla3RlIGltIE1hcHBpbmcgbSB6dXNhbW1lbmZhc3NlbiwgZGllIGRlbiBnbGVpY2hlbiBMb2FkbmFtZSAoTmFtZSBkZXIKLy8gQmx1ZXByaW50KSBoYWJlbiwgYWxzbyBhbGxlIENsb25lcyBkZXIgQlAsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4uCi8vIE9iamVrdGUgd2VyZGVuIGF1Y2ggbWVocmZhY2ggZXJmYXNzdCwgamUgbmFjaCBBbnphaGwgaWhyZXIgQ2FsbG91dHMuCnByaXZhdGUgdm9pZCBfc2FtZV9wYXRoKCBvYmplY3Qga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtICkgewogIHN0cmluZyBwYXRoOwogIGlmICghb2JqZWN0cChrZXkpIHx8ICFwb2ludGVycChvYnMpKSByZXR1cm47CgogIHBhdGggPSBsb2FkX25hbWUoa2V5KTsKCiAgaWYgKCBtW3BhdGhdICkKICAgIG1bcGF0aF0gKz0gb2JzOwogIGVsc2UKICAgIG1bcGF0aF0gPSBvYnM7Cn0KCi8vIGtleSBrYW5uIG9iamVjdCBvZGVyIHN0cmluZyBzZWluLgpwcml2YXRlIGludCBfdG9vX21hbnkoIG1peGVkIGtleSwgbWFwcGluZyBtLCBpbnQgaSApIHsKICAgIHJldHVybiBzaXplb2YobVtrZXldKSA+PSBpOwp9CgovLyBhbGxlIE9iamVrdGUgaW4gb2JzIHplcnN0b2VyZW4gdW5kIEZlaGxlcm1lbGR1bmcgYXVzZ2ViZW4uIEFDSFRVTkc6IERpZQovLyBPYmpla3RlIHdlcmRlbiBpZFIgenUgZWluZXIgQlAgZ2Vob2VyZW4sIG11ZXNzZW4gYWJlciBuaWNodCEgSW4gZGVtIEZhbGwKLy8gd2lyZCBhdWYgZGVyIEViZW5lIGFiZXIgbnVyIGVpbiBPYmpla3QgaW4gZGVyIEZlaGxlcm1lbGR1bmcgZXJ3YWVobnQuCnByaXZhdGUgdm9pZCBfZGVzdHJveSggbWl4ZWQga2V5LCBvYmplY3QgKm9icywgc3RyaW5nIHRleHQsIGludCB1aWQgKSB7CiAgICBpZiAoIXBvaW50ZXJwKG9icykpIHJldHVybjsKICAgIC8vIEFycmF5IG1pdCB1bmlxdWUgRWludHJhZWdlIGVyemV1Z2VuLgogICAgb2JzID0gbV9pbmRpY2VzKCBta21hcHBpbmcob2JzKSApOwogICAgLy8gRmVobGVybWVsZHVuZyBhdWYgZGVyIEViZW5lIGF1c2dlYmVuLCBpbSBjYXRjaCgpIG1pdCBwdWJsaXNoLCBkYW1pdCBlcwogICAgLy8gYXVmIGRlciBFYmVuZSBkaXJla3Qgc2Nyb2xsdCwgZGVyIGJhY2t0cmFjZSB2ZXJmdWVnYmFyIGlzdCAoaW0KICAgIC8vIGdlZ2Vuc2F0eiB6dXIgTG9lc3VuZyBtaXR0ZWxzIENhbGxvdXQpLCBkaWUgQXVzZnVlaHJ1bmcgYWJlciB3ZWl0ZXIKICAgIC8vIGxhZXVmdC4KICAgIGNhdGNoKCBlZnVuOjpyYWlzZV9lcnJvciggICAgICAgICAgIAogICAgICAgICBzcHJpbnRmKCB0ZXh0LCAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICB1aWQgPyAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUoa2V5KSA6IGtleSwgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgc2l6ZW9mKG9icyksIG9iamVjdF9uYW1lKG9ic1s8MV0pICkgKTtwdWJsaXNoKTsKICAgIC8vIFVuZCB3ZWcgbWl0IGRlbSBLcmFtLi4uCiAgICBmaWx0ZXIoIG9icywgIydlZnVuOjpkZXN0cnVjdC8qJyovICk7Cn0KCi8vIEFsbGUgT2JqZWt0IGVpbmVyIFVJRCBpbSBNYXBwaW5nIG0gbWl0IFVJRCBhbHMgS0V5cyB6dXNhbW1lbmZhc3Nlbi4gT2JqZWt0Ci8vIHNpbmQgZGFiZWkgbmljaHQgdW5pcXVlLgpwcml2YXRlIHZvaWQgX3NhbWVfdWlkKCBzdHJpbmcga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtLCBjbG9zdXJlIGNmICkgewogIHN0cmluZyB1aWQ7CgogIGlmICggIXBvaW50ZXJwKG9icykgfHwgIXNpemVvZihvYnMpICkKICAgIHJldHVybjsKCiAgdWlkID0gZnVuY2FsbCggY2YsIGtleSApOwoKICBpZiAoIG1bdWlkXSApCiAgICBtW3VpZF0gKz0gb2JzOyAvLyBvYnMgaXN0IG5lbiBBcnJheQogIGVsc2UKICAgIG1bdWlkXSA9IG9iczsKfQoKcHJpdmF0ZSBpbnQgX2xvZ19jYWxsX291dChtaXhlZCBjbykKewogIGxvZ19maWxlKCJUT09fTUFOWV9DQUxMT1VUUyIsCiAgICAgIHNwcmludGYoIiVzOjolTyAoJWQpXG4iLG9iamVjdF9uYW1lKGNvWzBdKSxjb1sxXSxjb1syXSksCiAgICAgIDIwMDAwMCk7CiAgcmV0dXJuIDA7Cn0KCnByaXZhdGUgaW50IGxhc3RfY2FsbG91dF9sb2c9MDsKCm5vbWFzayB2YXJhcmdzIHZvaWQgY2FsbF9vdXQoIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQp7CiAgICBtaXhlZCB0bXAsICpjYWxsX291dHM7CgogICAgLy8gQmVpID42MDAgQ2FsbG91dHMgYWxsZSBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDMwIENhbGxvdXRzIGxhdWZlbgogICAgLy8gaGFiZW4uCiAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA2MDAKICAgICAgICAmJiBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBST09USUQgKQogICAgewogICAgICAgLy8gTG9nIGVyemV1Z2VuLi4uCiAgICAgICBpZiAobGFzdF9jYWxsb3V0X2xvZyA8CiAgICAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpIC0gMTAKICAgICAgICAgICAmJiBnZXRfZXZhbF9jb3N0KCkgPiAyMDAwMDApCiAgICAgICB7CiAgICAgICAgIGxhc3RfY2FsbG91dF9sb2cgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7CiAgICAgICAgIGxvZ19maWxlKCJUT09fTUFOWV9DQUxMT1VUUyIsCiAgICAgICAgICAgICBzcHJpbnRmKCJcbiVzOiAjIyMjIyMjIyMjIyMgVG9vIG1hbnkgY2FsbG91dHM6ICVkICMjIyMjIyMjIyMjIyMjXG4iLAogICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLAogICAgICAgICAgICAgICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpKSk7CiAgICAgICAgIGZpbHRlcihlZnVuOjpjYWxsX291dF9pbmZvKCksICMnX2xvZ19jYWxsX291dCk7CiAgICAgICB9CiAgICAgICAvLyBPYmpla3RlIGFsbGVyIENhbGxvdXRzIGVybWl0dGVsbgogICAgICAgY2FsbF9vdXRzID0gbWFwKCBlZnVuOjpjYWxsX291dF9pbmZvKCksICMnX2NhbGxfb3V0X29iaiApOwogICAgICAgbWFwcGluZyBvYmplY3RtYXAgPSAoW10pOwogICAgICAgZmlsdGVyKCBjYWxsX291dHMsICMnX3NhbWVfb2JqZWN0LCAmb2JqZWN0bWFwICk7CiAgICAgICAvLyBNYXN0ZXIgbmljaHQgZ3JpbGxlbi4uLgogICAgICAgZWZ1bjo6bV9kZWxldGUoIG9iamVjdG1hcCwgbWFzdGVyKDEpICk7CiAgICAgICAvLyBhbGxlIE9iamVrdGUgcmF1c3N1Y2hlbiwgZGllIHp1dmllbGUgaGFiZW4uLi4KICAgICAgIG1hcHBpbmcgcmVzID0gZmlsdGVyX2luZGljZXMoIG9iamVjdG1hcCwgIydfdG9vX21hbnksIG9iamVjdG1hcCwgMjkgKTsKICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIEtleSB1bmQgQXJyYXkgbWl0CiAgICAgICAvLyBPYmpla3RlbiB1ZWJlcmdlYmVuIChpbiBkaWVzZW0gRmFsbCBzaW5kIEtleXMgdW5kIEFycmF5IG1pdAogICAgICAgLy8gT2JqZWt0ZW4gamV3ZWlscyBkYXMgZ2xlaWNoZSBPYmpla3QpLgogICAgICAgaWYgKCBzaXplb2YocmVzKSApICAgICAgIAogICAgICAgICAgIHdhbGtfbWFwcGluZyhyZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSBzaW5nbGUgIiAgICAgICAgICAgICAKICAgICAgICAgICAgICAib2JqZWN0IFslT10uIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOwoKICAgICAgIC8vIEJlaSAoYXVjaCBuYWNoIGRlbSBlcnN0ZW4gQXVmcmFldW1lbiBub2NoKSA+ODAwIENhbGxvdXRzIGFsbGUKICAgICAgIC8vIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgNTAgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuIC0gdW5kCiAgICAgICAvLyBkaWVzbWFsIHphZWhsZW4gQ2xvbmVzIG5pY2h0IGVpZ2Vuc3RhZW5kaWchIEQuaC4gZXMgd2VyZGVuIGFsbGUKICAgICAgIC8vIENsb25lcyBlaW5lciBCUCBnZWtpbGx0LCBkaWUgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuLCBmYWxscyBhbGxlCiAgICAgICAvLyBkaWVzZSBPYmpla3RlIF96dXNhbW1lbl8gbWVociBhbHMgNTAgQ2FsbG91dHMgaGFiZW4hCiAgICAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA4MDAgKSB7CiAgICAgICAgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIHZvbiBkZXIgbGV0enRlbiBBa3Rpb24gc2luZCBpbiBvYmplY3RtYXAgbmljaHQKICAgICAgICAgICAvLyBtZWhyIGRyaW4sIGRhIHNpZSBkb3J0IGFscyBLZXlzIHZlcndlbmRldCB3dXJkZW4uCiAgICAgICAgICAgbWFwcGluZyBwYXRobWFwPShbXSk7CiAgICAgICAgICAgLy8gYWxsZSBPYmpla3QgZWluZXIgQlAgaW4gcmVzIHNvcnRpZXJlbiwgQlAtTmFtZSBhbHMgS2V5LCBBcnJheXMKICAgICAgICAgICAvLyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgogICAgICAgICAgIHdhbGtfbWFwcGluZyggb2JqZWN0bWFwLCAjJ19zYW1lX3BhdGgsICZwYXRobWFwKTsKICAgICAgICAgICAvLyBhbGxlIEJQcyAodW5kIGlocmUgT2JqZWt0ZSkgcmF1c3N1Y2hlbiwgZGllIHp1dmllbGUgaGFiZW4uLi4KICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggcGF0aG1hcCwgIydfdG9vX21hbnkvKicqLywgcGF0aG1hcCwgNTAgKTsKICAgICAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBkaWUgQ2xvbmVzCiAgICAgICAgICAgLy8gdWViZXJnZWJlbiwgZGllIENhbGxvdXRzIGhhYmVuLgogICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQogICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LyonKi8sICJDQUxMX09VVCBvdmVyZmxvdyBieSBmaWxlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycuIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOwoKICAgICAgICAgICAvLyBXZW5uIGJlaWRlIEF1ZnJhZXVtYXJiZWl0ZW4gbmljaHRzIGdlYnJhY2h0IGhhYmVuIHVuZCBpbW1lcgogICAgICAgICAgIC8vIG5vY2ggPjEwMDAgQ2FsbG91dHMgbGF1ZmVuLCB3ZXJkZW4gZGllc21hbCBhbGxlIENhbGxvdXRzCiAgICAgICAgICAgLy8gZWluZXIgVUlEIHp1c2FtbWVuZ2V6YWVobHQuCiAgICAgICAgICAgLy8gQWxsZSBPYmpla3RlIGVpbmVyIFVJRCwgZGllIGVzIGluIFN1bW1lIGFsbGVyIGlocmVyIE9iamVrdCBtaXQKICAgICAgICAgICAvLyBDYWxsb3V0cyBhdWYgbWVociBhbHMgMTAwIENhbGxvdXRzIGJyaW5ndCwgd2VyZGVuIGdlcm9lc3RldC4KICAgICAgICAgICBpZiAoZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDEwMDApCiAgICAgICAgICAgewogICAgICAgICAgICAgIC8vIGRhcyBuYWNoIEJQLU5hbWVuIHZvcmdlZmlsdGVydGUgTWFwcGluZyBqZXR6dCBuYWNoIFVJRHMKICAgICAgICAgICAgICAvLyB6dXNhbW1lbnNvcnRpZXJlbi4gWmVyc3RvZXJ0ZSBDbG9uZXMgZmlsdGVyIF9zYW1lX3VpZCgpCiAgICAgICAgICAgICAgLy8gcmF1cy4KICAgICAgICAgICAgICBtYXBwaW5nIHVpZG1hcD0oW10pOwogICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcGF0aG1hcCwgIydfc2FtZV91aWQsICZ1aWRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9mdW5jdGlvbiggImNyZWF0b3JfZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc2VjdXJlL21hc3RlciIgKSApOwogICAgICAgICAgICAgIC8vIEluIHJlcyBudW4gVUlEcyBhbHMgS2V5cyB1bmQgQXJyYXlzIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCiAgICAgICAgICAgICAgLy8gRGllIHJhdXNmaWx0ZXJuLCBkaWUgbWVociBhbHMgMTAwIE9iamVrdGUgKG5vbi11bmlxdWUsIGQuaC4KICAgICAgICAgICAgICAvLyAxMDAgQ2FsbG91dHMhKSBoYWJlbi4KICAgICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggdWlkbWFwLCAjJ190b29fbWFueSwgdWlkbWFwLCAxMDAgKTsKICAgICAgICAgICAgICAvLyB1bmQgZXJuZXV0IHVlYmVyIGRpZSBLZXlzIGxhdWZlbiB1bmQgamV3ZWlscyBkaWUgQXJyYXlzIG1pdAogICAgICAgICAgICAgIC8vIGRlbiBPYmpla3RlbiB6dXIgWmVyc3RvZXJ1bmcgYW4gX2Rlc3Ryb3koKS4uLgogICAgICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQogICAgICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVJRCAnJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsKICAgICAgICAgICB9CiAgICAgICB9CiAgICB9CgogICAgLy8gRmFsbHMgZGFzIGF1ZnJ1ZmVuZGUgT2JqZWt0IHplcnN0b2VydCB3dXJkZSBiZWltIEF1ZnJhZXVtZW4KICAgIGlmICggIXByZXZpb3VzX29iamVjdCgpICkKICAgICAgIHJldHVybjsKCiAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7CiAgICBhcHBseSggIydlZnVuOjpjYWxsX291dCwgYXJncyApOwogICAgcmV0dXJuOwp9CgptaXhlZCBjYWxsX291dF9pbmZvKCkgewogIAogIG9iamVjdCBwbyA9IHByZXZpb3VzX29iamVjdCgpOwogIG1peGVkIGNvaSA9IGVmdW46OmNhbGxfb3V0X2luZm8oKTsKCiAgLy8gdW5nZWZpbHRlcnRlbiBPdXRwdXQgbnVyIGZ1ZXIgYmVzdGltbXRlIE9iamVrdGUsIE9iamVrdGUgaW4gL3N0ZCBvZGVyCiAgLy8gL29iaiBoYWJlbiBkaWUgQmFja2JvbmVJRC4KICBpZiAocXVlcnlfd2l6X2xldmVsKGdldHVpZChwbykpID49IEFSQ0hfTFZMCiAgICAgICB8fCAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUobG9hZF9uYW1lKHBvKSkgPT0gQkFDS0JPTkVJRCApIHsKICAgICAgcmV0dXJuIGNvaTsKICB9CiAgZWxzZSB7CiAgICAgIHJldHVybiBmaWx0ZXIoY29pLCBmdW5jdGlvbiBtaXhlZCAobWl4ZWQgYXJyKSB7CiAgICAgICAgICAgICAgaWYgKHBvaW50ZXJwKGFycikgJiYgYXJyWzBdPT1wbykKICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICBlbHNlIHJldHVybiAwOyB9KTsKICB9Cn0KCi8vICogWnUgZWluZXIgY2xvc3VyZSBkYXMgT2JqZWt0LCBhbiBkYXMgc2llIGdlYnVuZGVuIGlzdCwgc3VjaGVuCi8vIE5JQ0hUIGRhcyBPYmpla3QsIHdhcyBnZ2YuIGRpZSBsZnVuIGRlZmluaWVydCEKbWl4ZWQgcXVlcnlfY2xvc3VyZV9vYmplY3QoY2xvc3VyZSBjKSB7CiAgcmV0dXJuCiAgICBDTE9TVVJFX0lTX1VOQk9VTkRfTEFNQkRBKGdldF90eXBlX2luZm8oYywgMSkpID8KICAgICAgMCA6CiAgKHRvX29iamVjdChjKSB8fCAtMSk7Cn0KCi8vICogV2lyIHdvbGxlbiBudXIgRUlOIEFyZ3VtZW50IC4uLiBhdXNzZXJkZW0gY2hlY2tzIGZ1ZXIgZGVuIE5ldHp0b3RlbnJhdW0KdmFyYXJncyB2b2lkIG1vdmVfb2JqZWN0KG1peGVkIHdoYXQsIG1peGVkIHdoZXJlKQp7CiAgb2JqZWN0IHBvLHRtcDsKCiAgcG89cHJldmlvdXNfb2JqZWN0KCk7CiAgaWYgKCF3aGVyZSkKICB7CiAgICB3aGVyZT13aGF0OwogICAgd2hhdD1wbzsKICB9CiAgaWYgKCgoc3RyaW5ncCh3aGVyZSkgJiYgd2hlcmU9PU5FVERFQURfUk9PTSApIHx8CiAgICAgICAob2JqZWN0cCh3aGVyZSkgJiYgd2hlcmU9PWZpbmRfb2JqZWN0KE5FVERFQURfUk9PTSkpKSAmJgogICAgICAgb2JqZWN0cCh3aGF0KSAmJiBvYmplY3RfbmFtZSh3aGF0KSE9Ii9vYmovc3BlcnJlciIpCiAgewogICAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHdoYXQpKQogICAgewogICAgICB3aGF0LT5yZW1vdmUoKTsKICAgICAgaWYgKHdoYXQpIGRlc3RydWN0KHdoYXQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobGl2aW5nKHdoYXQpIHx8IGludGVyYWN0aXZlKHdoYXQpKQogICAgewogICAgICBsb2dfZmlsZSgiTkRFQUQyIixzcHJpbnRmKCJUUllFRCBUTyBNT1ZFIFRPIE5FVERFQUQ6ICVPXG4iLHdoYXQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc2V0X29iamVjdF9oZWFydF9iZWF0KHdoYXQsMCk7CiAgfQogIHRtcD13aGF0OwogIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKICAgICAgLy8gSmEuIE1hbiBydWZ0IGRpZSBfc2V0X3h4eCgpLUZ1bmt0aW9uZW4gZWlnZW50bGljaCBuaWNodCBkaXJla3QgYXVmLgogICAgICAvLyBBYmVyIGRhcyBMaWNodHN5c3RlbSBpc3Qgc2Nob24gKnNvKiByZWNoZW5pbnRlbnNpdiB1bmQgZ2VyYWRlIGRlcgogICAgICAvLyBQX0xBU1RfQ09OVEVOVF9DSEFOR0UtQ2FjaGUgd2lyZCAqc28qIG9mdCBiZW5vZXRpZ3QsIGRhc3MgZXMgbWlyCiAgICAgIC8vIGRhIHVtIGplZGVzIGJpc3NjaGVuIFJlY2hlbnplaXQgZ2VodC4KICAgICAgLy8gRGVyIFp3ZWNrIGhlaWxpZ3QgamEgYmVrYW5udGxpY2ggZGllIE1pdHRlbC4gOy0pCiAgICAgIC8vCiAgICAgIC8vIFRpYW1hawogICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKICBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bW92ZV9vYmplY3QscG8pLHdoYXQsd2hlcmUpOwogIGlmICh0bXA9d2hhdCkKICAgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKICAgICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKfQoKCnZvaWQgc3RhcnRfc2ltdWxfZWZ1bigpIHsKICBtaXhlZCAqaW5mbzsKCiAgLy8gRmFsbHMgbm9jaCBuaWNodCBnZXRhbiwgZXh0cmFfd2l6aW5mbyBpbml0aWFsaXNpZXJlbgogIGlmICggIXBvaW50ZXJwKGluZm8gPSBnZXRfZXh0cmFfd2l6aW5mbygwKSkgKQogICAgc2V0X2V4dHJhX3dpemluZm8oMCwgaW5mbyA9IGFsbG9jYXRlKEJBQ0tCT05FX1dJWklORk9fU0laRSkpOwoKICBJbml0TGl2aW5nRGF0YShpbmZvKTsKCiAgc2V0X25leHRfcmVzZXQoMTApOyAvLyBkaXJla3QgbWFsIGF1ZnJhZXVtZW4KfQoKcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CiAgc2V0X25leHRfcmVzZXQoNzIwMCk7CiAgQ2xlYW5MaXZpbmdEYXRhKCk7Cn0KCiNpZiAhX19FRlVOX0RFRklORURfXyhhYnNvbHV0ZV9oYl9jb3VudCkKaW50IGFic29sdXRlX2hiX2NvdW50KCkgewogIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7Cn0KI2VuZGlmCgp2b2lkIF9fc2V0X2Vudmlyb25tZW50KG9iamVjdCBvYiwgbWl4ZWQgdGFyZ2V0KQp7CiAgc3RyaW5nIHBhdGg7CiAgb2JqZWN0IG9iajsKCiAgaWYgKCFvYmplY3RwKG9iKSkKICAgIHJldHVybjsKICBpZiAoIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIHx8ICFBUkNIX1NFQ1VSSVRZICkKICAgIHJldHVybjsKICBpZiAob2JqZWN0cCh0YXJnZXQpKQogIHsKICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYix0YXJnZXQpOwogICAgcmV0dXJuOwogIH0KICBwYXRoPShzdHJpbmcpTUFTVEVSLT5fZ2V0X3BhdGgodGFyZ2V0LHRoaXNfaW50ZXJhY3RpdmUoKSk7CiAgaWYgKHN0cmluZ3AocGF0aCkgJiYgZmlsZV9zaXplKHBhdGgrIi5jIik+PTAgJiYKICAgICAgIWNhdGNoKGxvYWRfb2JqZWN0KHBhdGgpO3B1Ymxpc2gpICkKICB7CiAgICBvYmo9ZmluZF9vYmplY3QocGF0aCk7CiAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2Isb2JqKTsKICAgIHJldHVybjsKICB9Cn0KCnZvaWQgX2R1bXBfd2l6bGlzdChzdHJpbmcgZmlsZSwgaW50IHNvcnRieSkgewogIGludCBpOwogIG1peGVkICphOwoKICBpZiAoIUxPUkRfU0VDVVJJVFkpCiAgICByZXR1cm47CiAgaWYgKCFtYXN0ZXIoKS0+dmFsaWRfd3JpdGUoZmlsZSxnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwid3JpdGVfZmlsZSIpKQogIHsKICAgIHdyaXRlKCJOTyBXUklURSBQRVJNSVNTSU9OXG4iKTsKICAgIHJldHVybjsKICB9CiAgYSA9IHdpemxpc3RfaW5mbygpOwogIGEgPSBzb3J0X2FycmF5KGEsIGxhbWJkYSggKHsnYSwnYn0pLAogICAgICAgICAgICAgICAgICAgICAgICAoeyMnPCwKICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYSxzb3J0Ynl9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYixzb3J0Ynl9KQogICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICBybShmaWxlKTsKICBmb3IgKGk9c2l6ZW9mKGEpLTE7aT49MDtpLS0pCiAgICB3cml0ZV9maWxlKGZpbGUsc3ByaW50ZigiJS0xMXM6IGV2YWw9JS04ZCBjbWRzPSUtNmQgSEJzPSUtNWQgYXJyYXk9JS01ZCBtYXBwaW5nPSUtN2RcbiIsCiAgICAgIGFbaV1bV0xfTkFNRV0sYVtpXVtXTF9UT1RBTF9DT1NUXSxhW2ldW1dMX0NPTU1BTkRTXSxhW2ldW1dMX0hFQVJUX0JFQVRTXSwKICAgICAgYVtpXVtXTF9BUlJBWV9UT1RBTF0sYVtpXVtXTF9DQUxMX09VVF0pKTsKfQoKcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpIHsKCiAgaWYoIW9iamVjdHAob2IpKQogICAgb2I9cHJldmlvdXNfb2JqZWN0KCk7CiAgLy8gV2VubiBlaW4gT2JqZWt0IGdlc3VjaHQgd2lyZDogQWxsZSBFbnZzIGRpZXNlcyBPYmpla3RzIGVybWl0dGVsbiB1bmQKICAvLyBzY2hhdWVuLCBvYiBpbiBkaWVzZW4gb2Igdm9ya29tbXQuIERhbm4gaXN0IHdoYXQgaW4gb2IgZW50aGFsdGVuLgogIGlmKG9iamVjdHAod2hhdCkpIHsKICAgIG9iamVjdCAqZW52cz1hbGxfZW52aXJvbm1lbnQod2hhdCk7CiAgICAvLyB3ZW5uIG9iIGtlaW4gRW52aXJvbm1lbnQgaGF0LCBpc3QgZXMgb2ZmZW5zaWNodGxpY2ggbmljaHQgaW4gd2hhdAogICAgLy8gZW50aGFsdGVuLgogICAgaWYgKCFwb2ludGVycChlbnZzKSkgcmV0dXJuIDA7CiAgICBpZiAobWVtYmVyKGVudnMsIG9iKSAhPSAtMSkgcmV0dXJuIHdoYXQ7CiAgfQogIC8vIHNvbnN0IHdpcmRzIHRldXJlciwgdWViZXIgYWxsZSBPYmpla3RlIGltIChkZWVwKSBJbnYgbGF1ZmVuIHVuZCBwZXIgaWQoKQogIC8vIHRlc3Rlbi4gRGFiZWkgbXVzcyBhYmVyIGRpZSBnZXd1ZW5zY2h0ZSBOci4gKCJmbGFzY2hlIDMiKSBhYmdlc2Nobml0dGVuCiAgLy8gd2VyZGVuIHVuZCBzZWxiZXIgZ2V6YWVobHQgd2VyZGVuLCB3ZWxjaGUgZGFzIGVudHNwcmVjaGVuZGUgT2JqZWt0IGlzdC4KICBlbHNlIGlmIChzdHJpbmdwKHdoYXQpKSB7CiAgICAgIGludCBjbnQ7CiAgICAgIHN0cmluZyBuZXd3aGF0OwogICAgICBpZihzc2NhbmYod2hhdCwiJXMgJWQiLG5ld3doYXQsY250KSE9MikKICAgICAgIGNudD0xOwogICAgICBlbHNlCiAgICAgICB3aGF0PW5ld3doYXQ7CiAgICAgIGZvcmVhY2gob2JqZWN0IGludm9iOiBkZWVwX2ludmVudG9yeShvYikpIHsKICAgICAgIGlmIChpbnZvYi0+aWQod2hhdCkgJiYgIS0tY250KQogICAgICAgICAgIHJldHVybiBpbnZvYjsKICAgICAgfQogIH0KICBlbHNlIHsKICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJXcm9uZyBhcmd1bWVudCAxIHRvIGRlZXBfcHJlc2VudCgpLiAiCiAgICAgICAgICJFeHBlY3RlZCBcIm9iamVjdFwiIG9yIFwic3RyaW5nXCIsIGdvdCAlLjUwTy5cbiIsCiAgICAgICAgIHdoYXQpKTsKICB9CiAgcmV0dXJuIDA7Cn0KCm1hcHBpbmcgZHVtcF9pcF9tYXBwaW5nKCkKewogIHJldHVybiAwOwp9Cgpub21hc2sgdm9pZCBzd2FwKG9iamVjdCBvYmopCnsKICB3cml0ZSgiWW91ciBhcmUgbm90IGFsbG93ZWQgdG8gc3dhcCBvYmplY3RzIGJ5IGhhbmQhXG4iKTsKICByZXR1cm47Cn0KCm5vbWFzayB2YXJhcmdzIHZvaWQgZ2FyYmFnZV9jb2xsZWN0aW9uKHN0cmluZyBzdHIpCnsKICBpZihwcmV2aW91c19vYmplY3QoKT09MCB8fCAhSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgCiAgICAgIHx8ICFBUkNIX1NFQ1VSSVRZKQogIHsKICAgIHdyaXRlKCJDYWxsIEdDIG5vdyBhbmQgdGhlIG11ZCB3aWxsIGNyYXNoIGluIDUtNiBob3Vycy4gRE9OVCBETyBJVCFcbiIpOwogICAgcmV0dXJuOwogIH0KICBlbHNlIGlmIChzdHJpbmdwKHN0cikpCiAgewogICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbihzdHIpOwogIH0KICBlbHNlIAogICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbigpOwp9Cgp2YXJhcmdzIHZvaWQgbm90aWZ5X2ZhaWwobWl4ZWQgbmYsIGludCBwcmlvKSB7CiAgb2JqZWN0IHBvLG9sZG87CiAgaW50IG9sZHByaW87CiAgCiAgaWYgKCFQTCB8fCAhb2JqZWN0cChwbz1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybjsKICBpZiAoIXN0cmluZ3AobmYpICYmICFjbG9zdXJlcChuZikpIHsKICAgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKICAgICAgICAgIk9ubHkgc3RyaW5ncyBhbmQgY2xvc3VyZXMgYWxsb3dlZCBmb3Igbm90aWZ5X2ZhaWwhICIKICAgICAgICAgIkFyZ3VtZW50IHdhczogJS41ME8uLi5cbiIsbmYpKTsKICB9CgogIC8vIGZhbGxzIGVpbiBPYmpla3QgYmVyZWl0cyBuZW4gbm90aWZ5X2ZhaWwoKSBzZXR6dGUsIFByaW9yaXRhZXRlbiBhYnNjaGFldHplbgogIC8vIHVuZCB2ZXJnbGVpY2hlbi4KICBpZiAob2JqZWN0cChvbGRvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBwbyE9b2xkbykgewogICAgaWYgKCFwcmlvKSB7ICAgICAgIAogICAgICAvL1ByaW9yaXRhZXQgZGllc2VzIG5vdGlmeV9mYWlsKCkgJ2Fic2NoYWV0emVuJwogICAgICBpZiAocG89PVBMKSAvLyBTcGllbGVyLWludGVybmUgKHNvdWwtY21kcykKICAgICAgICBwcmlvPU5GX05MX09XTjsKICAgICAgZWxzZSBpZiAobGl2aW5nKHBvKSkKICAgICAgICBwcmlvPU5GX05MX0xJVklORzsKICAgICAgZWxzZSBpZiAoKGludClwby0+SXNSb29tKCkpCiAgICAgICAgcHJpbz1ORl9OTF9ST09NOwogICAgICBlbHNlCiAgICAgICAgcHJpbz1ORl9OTF9USElORzsKICAgIH0KICAgIC8vUHJpb3JpdGFldCBkZXMgYWx0ZW4gU2V0emVycyBhYnNjaGFldHplbgogICAgaWYgKG9sZG89PVBMKQogICAgICBvbGRwcmlvPU5GX05MX09XTjsKICAgIGVsc2UgaWYgKGxpdmluZyhvbGRvKSkKICAgICAgb2xkcHJpbz1ORl9OTF9MSVZJTkc7CiAgICBlbHNlIGlmICgoaW50KW9sZG8tPklzUm9vbSgpKQogICAgICBvbGRwcmlvPU5GX05MX1JPT007CiAgICBlbHNlCiAgICAgIG9sZHByaW89TkZfTkxfVEhJTkc7CiAgfQogIGVsc2UgLy8gd2VubiBlcyBub2NoIGtlaW4gTm90aWZ5X2ZhaWwgZ2lidDoKICAgIG9sZHByaW89TkZfTkxfTk9ORTsKCiAgLy92ZXJnbGVpY2hlbiB1bmQgZ2dmLiBzZXR6ZW4KICBpZiAocHJpbyA+PSBvbGRwcmlvKSB7IAogICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKICAgIGVmdW46Om5vdGlmeV9mYWlsKG5mKTsKICB9CgogIHJldHVybjsKfQoKdm9pZCBfbm90aWZ5X2ZhaWwoc3RyaW5nIHN0cikKewogIC8vcXVlcnlfbm90aWZ5X2ZhaWwoKSBiZW51dHplbiwgdW0gZGFzIE9iamVrdAogIC8vZGVzIGxldHp0ZW4gbm90aWZ5X2ZhaWwoKSB6dSBlcm1pdHRlbG4KICBvYmplY3QgbzsKICBpZiAoKG89cXVlcnlfbm90aWZ5X2ZhaWwoMSkpICYmIG8hPXByZXZpb3VzX29iamVjdCgpKQogICAgcmV0dXJuOwogIC8vbm9jaCBrZWluIG5vdGlmeV9mYWlsKCkgZnVlciBkaWVzZXMgS29tbWFuZG8gZ2VzZXR6dCwgYXVmIGdlaHRzLgogIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgZWZ1bjo6bm90aWZ5X2ZhaWwoc3RyKTsKICByZXR1cm47Cn0KCnN0cmluZyB0aW1lMnN0cmluZyggc3RyaW5nIGZvcm1hdCwgaW50IHplaXQgKQp7CiAgaW50IGksY2gsbWF4dW5pdCxkdW1teTsKICBzdHJpbmcgKnBhcnRzLCBmbXQ7CgogIGludCBzZWNzID0gemVpdDsKICBpbnQgbWlucyA9ICh6ZWl0LzYwKTsKICBpbnQgaG91cnMgPSAoemVpdC8zNjAwKTsKICBpbnQgZGF5cyA9ICh6ZWl0Lzg2NDAwKTsKICBpbnQgd2Vla3MgPSAgKHplaXQvNjA0ODAwKTsKICBpbnQgbW9udGhzID0gKHplaXQvMjQxOTIwMCk7CiAgaW50IGFiYnIgPSAwOwoKICBwYXJ0cyA9IHJlZ2V4cGxvZGUoIGZvcm1hdCwgIlwoJVwoLXxcKVswLTldKltud2RobXN4TldESE1TWF1cKXxcKCUlXCkiICk7CgogIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQogIHsKICAgIGNoID0gcGFydHNbaV1bPDFdOwogICAgc3dpdGNoKCBwYXJ0c1tpXVs8MV0gKQogICAgewogICAgY2FzZSAneCc6IGNhc2UgJ1gnOgogICAgICAgYWJiciA9IHNzY2FuZiggcGFydHNbaV0sICIlJSVkIiwgZHVtbXkgKSAmJiBkdW1teT09MDsKICAgICAgIC8vIE5PIGJyZWFrICEKICAgIGNhc2UgJ24nOiBjYXNlICdOJzoKICAgICAgIG1heHVuaXQgfD0gMzE7CiAgICAgICBicmVhazsKICAgIGNhc2UgJ3cnOiBjYXNlICdXJzoKICAgICAgIG1heHVuaXQgfD0gMTU7CiAgICAgICBicmVhazsKICAgIGNhc2UgJ2QnOiBjYXNlICdEJzoKICAgICAgIG1heHVuaXQgfD0gNzsKICAgICAgIGJyZWFrOwogICAgY2FzZSAnaCc6IGNhc2UgJ0gnOgogICAgICAgbWF4dW5pdCB8PSAzOwogICAgICAgYnJlYWs7CiAgICBjYXNlICdtJzogY2FzZSAnTSc6CiAgICAgICBtYXh1bml0IHw9IDE7CiAgICAgICBicmVhazsKICAgIH0KICB9CiAgaWYoIG1heHVuaXQgJiAxNiApIHdlZWtzICU9IDQ7CiAgaWYoIG1heHVuaXQgJiA4ICkgZGF5cyAlPSA3OwogIGlmKCBtYXh1bml0ICYgNCApIGhvdXJzICU9IDI0OwogIGlmKCBtYXh1bml0ICYgMiApIG1pbnMgJT0gNjA7CiAgaWYoIG1heHVuaXQgKSBzZWNzICU9IDYwOwoKICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKICB7CiAgICBmbXQgPSBwYXJ0c1tpXVswLi48Ml07CiAgICBjaCA9IHBhcnRzW2ldWzwxXTsKICAgIGlmKCBjaD09J3gnICkKICAgIHsKICAgICAgaWYgKG1vbnRocyA+IDApIGNoPSduJzsKICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSd3JzsKICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J2QnOwogICAgICBlbHNlIGlmKCBob3Vycz4wICkgY2g9J2gnOyAKICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnbSc7CiAgICAgIGVsc2UgY2ggPSAncyc7CiAgICB9CiAgICBlbHNlIGlmKCBjaD09J1gnICkKICAgIHsKICAgICAgaWYgKG1vbnRocyA+IDApIGNoPSdOJzsKICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSdXJzsKICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J0QnOwogICAgICBlbHNlIGlmKCBob3Vycz4wICkgY2g9J0gnOyAKICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnTSc7CiAgICAgIGVsc2UgY2ggPSAnUyc7CiAgICB9CiAgICAKICAgIHN3aXRjaCggY2ggKQogICAgewogICAgICBjYXNlICduJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBtb250aHMgKTsgYnJlYWs7CiAgICAgIGNhc2UgJ3cnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHdlZWtzICk7IGJyZWFrOwogICAgICBjYXNlICdkJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBkYXlzICk7IGJyZWFrOwogICAgICBjYXNlICdoJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBob3VycyApOyBicmVhazsKICAgICAgY2FzZSAnbSc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbWlucyApOyBicmVhazsKICAgICAgY2FzZSAncyc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgc2VjcyApOyBicmVhazsKICAgICAgY2FzZSAnTic6CiAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJNIjsKICAgICAgIGVsc2UgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobW9udGhzPT0xKSA/ICJNb25hdCIgOiAiTW9uYXRlIiApOwogICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ1cnOgogICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAidyI7IGVsc2UKICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKHdlZWtzPT0xKSA/ICJXb2NoZSIgOiAiV29jaGVuIiApOwogICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ0QnOgogICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiZCI7IGVsc2UKICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGRheXM9PTEpID8gIlRhZyIgOiAiVGFnZSIgKTsKICAgICAgIGJyZWFrOwogICAgICBjYXNlICdIJzoKICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImgiOyBlbHNlCiAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChob3Vycz09MSkgPyAiU3R1bmRlIiA6ICJTdHVuZGVuIiApOwogICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ00nOgogICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAibSI7IGVsc2UKICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1pbnM9PTEpID8gIk1pbnV0ZSIgOiAiTWludXRlbiIgKTsKICAgICAgIGJyZWFrOwogICAgICBjYXNlICdTJzoKICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInMiOyBlbHNlCiAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChzZWNzPT0xKSA/ICJTZWt1bmRlIiA6ICJTZWt1bmRlbiIgKTsKICAgICAgIGJyZWFrOwogICAgICBjYXNlICclJzoKICAgICAgIHBhcnRzW2ldID0gIiUiOwogICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbXBsb2RlKCBwYXJ0cywgIiIgKTsKfQoKbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSkKewogIHN0cmluZyBlcnI7CiAgb2JqZWN0IG9iOwogIG1peGVkIG07CiAgLy9oYXQgbmVuIFNjaGVyemtla3MgZGllIEJsdWVwcmludCBiZXdlZ3Q/CiAgaWYgKChvYj1maW5kX29iamVjdCgiL3NlY3VyZS9sb2dpbiIpKSAmJiBlbnZpcm9ubWVudChvYikpCiAgICAgIGNhdGNoKGRlc3RydWN0KG9iKTtwdWJsaXNoKTsKICBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdCgic2VjdXJlL2xvZ2luIik7cHVibGlzaCk7CiAgaWYgKGVycikKICB7CiAgICB3cml0ZSgiRmVobGVyIGJlaW0gTGFkZW4gdm9uIC9zZWN1cmUvbG9naW4uY1xuIitlcnIrIlxuIik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKG9iamVjdHAobT0obWl4ZWQpb2ItPm5ld19sb2dvbihuYW1lKSkpIG5ldGRlYWRbbmFtZV09bTsKICByZXR1cm4gbTsKfQoKbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKQp7CiAgaW50ICpsZXZlbDsKICAvL2tldHRlIGRlciBDYWxsZXIgZHVyY2hsYXVmZW4sIGRlbiBuaWVkcmlnc3RlbiBMZXZlbCBpbiBkZXIgS2V0dGUKICAvL3p1cnVlY2tnZWJlbi4gWmVyc3RvZXJ0ZSBPYmpla3RlIChTZWxic3R6ZXJzdG9lcmVyKSBmdWVocmVuIHp1ciBSdWVja2dhYmUKICAvL3ZvbiAwLgogIC8vY2FsbGVyX3N0YWNrKDEpIGZ1ZWd0IGRlbSBSdWVja2dhYmVhcnJheSB0aGlzX2ludGVyYWN0aXZlKCkgaGluenUgYnp3LiAwLAogIC8vd2VubiBlcyBrZWluZW4gSW50ZXJhY3RpdmUgZ2lidC4gRGllIDAgZnVlaHJ0IGRhbm4gd2llIGJlaSB6ZXJzdG9lcnRlbgogIC8vT2JqZWt0ZW4genVyIFJ1ZWNrZ2FiZSB2b24gMCwgd2FzIGdld3VlbnNjaHQgaXN0LCBkYSBlcyBoaWVyIGVpbmVuCiAgLy9JTnRlcmFjdGl2ZSBnZWJlbiBtdXNzLgogIGxldmVsPW1hcChjYWxsZXJfc3RhY2soMSksZnVuY3Rpb24gaW50IChvYmplY3QgY2FsbGVyKQogICAgICB7aWYgKG9iamVjdHAoY2FsbGVyKSkKICAgICAgIHJldHVybihxdWVyeV93aXpfbGV2ZWwoZ2V0ZXVpZChjYWxsZXIpKSk7CiAgICAgICByZXR1cm4oMCk7IC8vIGtlaW4gT2JqZWt0IGRhLCAwLgogICAgICB9ICk7CiAgcmV0dXJuKG1pbihsZXZlbCkpOyAvL2RlbiBrbGVpbnN0ZW4gV2VydCBpbSBBcnJheSB6dXJ1ZWNrZ2ViZW4gKGdnZi4gMCkKfQoKbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpCnsKICBzdHJpbmcgZXVpZDsKCiAgaWYgKCF0aGlzX2ludGVyYWN0aXZlKCkpIC8vIEVzIG11c3MgZWluZW4gaW50ZXJhY3RpdmUgZ2ViZW4KICAgICByZXR1cm4gMDsKICBldWlkPWdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKTsKICAvLyB1ZWJlciBhbGxlIENhbGxlciBpdGVyaWVyZW4uIFdlbm4gZWluZXMgZGF2b24gZWluZSBhbmRlcmUgZXVpZCBoYXQgYWxzCiAgLy8gZGVyIEludGVyYWN0aXZlIHVuZCBkaWVzZSBuaWNodCBkaWUgUk9PVElEIGlzdCwgd2lyZCAwIHp1cnVlY2tnZWJlbi4KICAvLyBFYmVuc28sIGZhbGxzIGVpbiBTZWxic3R6ZXJzdG9lcmVyIGlyZ2VuZHdvIGluIGRlciBLZXR0ZSBpc3QuCiAgZm9yZWFjaChvYmplY3QgY2FsbGVyOiBjYWxsZXJfc3RhY2soKSkgewogICAgICBpZiAoIW9iamVjdHAoY2FsbGVyKSB8fAogICAgICAgKGdldGV1aWQoY2FsbGVyKSE9ZXVpZCAmJiBnZXRldWlkKGNhbGxlcikhPVJPT1RJRCkpCiAgICAgICAgIHJldHVybiAwOwogIH0KICByZXR1cm4gZXVpZDsgLy8gJ3NpY2hlcmUnIGV1aWQgenVydWVja2dlYmVuCn0KCi8vIElOUFVUX1BST01QVCB1bmQgbmVuIExlZXJwcm9tcHQgaGluenVmdWVnZW4sIHdlbm4ga2VpbnMgdWViZXJnZWJlbiB3aXJkLgovLyBEYXMgc29sbCBkYXp1IGRpZW5lbiwgZGFzcyBhbGxlIGdnZi4gZWluIEVPUiBhbSBQcm9tcHRlbmRlIGtyaWVnZW4uLi4KLy8jaWYgX19CT09UX1RJTUVfXyA8IDEzNjAwMTcyMTMKdmFyYXJncyB2b2lkIGlucHV0X3RvKCBtaXhlZCBmdW4sIGludCBmbGFncywgdmFyYXJncyBtaXhlZCAqYXJncyApCnsKICAgIG1peGVkICphcnI7CiAgICBpbnQgaTsKCiAgICBpZiAoICF0aGlzX3BsYXllcigpIHx8ICFwcmV2aW91c19vYmplY3QoKSApCiAgICAgICByZXR1cm47CgogICAgLy8gVE9ETzogaW5wdXRfdG8oLi4uLElOUFVUX1BST01QVCwgIiIsIC4uLiksIHdlbm4ga2VpbiBJTlBVVF9QUk9NUFQKICAgIC8vIHZvcmtvbW10Li4uCiAgICBpZiAoIGZsYWdzJklOUFVUX1BST01QVCApIHsgICAgCiAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncyB9KSArIGFyZ3M7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBnZ2YuIGVpbiBJTlBVVF9QUk9NUFQgaGluenVmdWVnZW4gdW5kIG5lbiBMZWVyc3RyaW5nIGFscyBQcm9tcHQuCiAgICAgICAgZmxhZ3MgfD0gSU5QVVRfUFJPTVBUOwogICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MsICIiIH0pICsgYXJnczsKICAgIH0KCiAgICAvLyBBcnJheXMgZ2VnZW4gZmxhdHRlbiBxdW90ZW4uCiAgICBmb3IgKCBpID0gc2l6ZW9mKGFycikgLSAxOyBpID4gMTsgaS0tICkKICAgICAgIGlmICggcG9pbnRlcnAoYXJyW2ldKSApCiAgICAgICAgICAgYXJyW2ldID0gcXVvdGUoYXJyW2ldKTsKCiAgICBhcHBseSggYmluZF9sYW1iZGEoIHVuYm91bmRfbGFtYmRhKCAoe30pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgIydlZnVuOjppbnB1dF90by8qJyovIH0pICsgYXJyICksCiAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkgKSApOwp9Ci8vI2VuZGlmCgpub21hc2sgaW50IHNldF9saWdodChpbnQgaSkKLy8gZXJob2VodCBkYXMgTGljaHRsZXZlbCBlaW5lcyBPYmpla3RzIHVtIGkKLy8gcmVzdWx0OiBkYXMgTGljaHRsZXZlbCBpbm5lcmhhbGIgZGVzIE9iamVrdHMKewogICAgb2JqZWN0IG9iLCAqaW52OwogICAgaW50IGxhbGwsIGxpZ2h0LCBkYXJrLCB0bXA7CgogICAgaWYgKCEob2I9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gMDsgLy8gb2huZSBkYXMgZ2VodHMgbmljaHQuCgogICAgLy8gYXVzIGtvbXBhdGliaWxpdGFldHNncnVlbmRlbiBrYW5uIG1hbiBhdWNoIGRlbiBMaWNodGxldmVsIG5vY2ggc2V0emVuCiAgICBpZiAoaSE9MCkgb2ItPlNldFByb3AoUF9MSUdIVCwgb2ItPlF1ZXJ5UHJvcChQX0xJR0hUKStpKTsKCiAgICAvLyBMaWNodGJlcmVjaG51bmcgZmluZGV0IGVpZ2VudGxpY2ggaW4gZGVyIE11ZGxpYiBzdGF0dC4KICAgIHJldHVybiAoaW50KW9iLT5RdWVyeVByb3AoUF9JTlRfTElHSFQpOwp9CgoKcHVibGljIHN0cmluZyBpc28yYXNjaWkoIHN0cmluZyBzdHIgKQp7CiAgICBpZiAoICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICkKICAgICAgIHJldHVybiAiIjsKCiAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLkIiwgImFlIiwgMSApOwogICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi9iIsICJvZSIsIDEgKTsKICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvwiLCAidWUiLCAxICk7CiAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLEIiwgIkFlIiwgMSApOwogICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi1iIsICJPZSIsIDEgKTsKICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItwiLCAiVWUiLCAxICk7CiAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLfIiwgInNzIiwgMSApOwogICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAiW14gLX5dIiwgIj8iLCAxICk7CgogICAgcmV0dXJuIHN0cjsKfQoKCnB1YmxpYyB2YXJhcmdzIHN0cmluZyBDb3VudFVwKCBzdHJpbmcgKnMsIHN0cmluZyBzZXAsIHN0cmluZyBsYXN0c2VwICkKewogICAgc3RyaW5nIHJldDsKCiAgICBpZiAoICFwb2ludGVycChzKSApCiAgICAgICByZXR1cm4gIiI7CiAgICAKICAgIGlmICghc2VwKSBzZXAgPSAiLCAiOwogICAgaWYgKCFsYXN0c2VwKSBsYXN0c2VwID0gIiB1bmQgIjsKCiAgICBzd2l0Y2ggKHNpemVvZihzKSkgIHsKICAgICAgIGNhc2UgMDogcmV0PSIiOyBicmVhazsKICAgICAgIGNhc2UgMTogcmV0PXNbMF07IGJyZWFrOwogICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXQgPSBpbXBsb2RlKHNbMC4uPDJdLCBzZXApOwogICAgICAgICAgICAgIHJldCArPSBsYXN0c2VwICsgc1s8MV07CiAgICB9CiAgICByZXR1cm4gcmV0Owp9Cgpub21hc2sgdmFyYXJncyBpbnQgcXVlcnlfbmV4dF9yZXNldChvYmplY3Qgb2IpIHsKCiAgICAvLyBUeXBwcnVlZnVuZzogZXR3YXMgYW5kZXJlcyBhbHMgT2JqZWt0ZSBvZGVyIDAgc29sbGVuIEZlaGxlciBzZWluLgogICAgaWYgKG9iICYmICFvYmplY3RwKG9iKSkKICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X25leHRfcmVzZXQoKTogZ290ICUuMjBPLCAiCiAgICAgICAgICAgImV4cGVjdGVkIG9iamVjdC5cbiIsb2IpKTsKCiAgICAvLyBEZWZhdWx0b2JqZWt0IFBPLCB3ZW5uIDAgdWViZXJnZWJlbi4KICAgIGlmICggIW9iamVjdHAob2IpICkKICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKCiAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSk7Cn0KCgojaWYgIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQojZGVmaW5lIE1BWExFTiA1MDAwMApub21hc2sgaW50IGNvcHlfZmlsZShzdHJpbmcgc291cmNlLCBzdHJpbmcgZGVzdCkKewoKICBpbnQgcHRyOwogIHN0cmluZyBieXRlczsKCiAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKICBpZiAoIXNpemVvZihzb3VyY2UpfHwhc2l6ZW9mKGRlc3QpfHxzb3VyY2U9PWRlc3R8fChmaWxlX3NpemUoc291cmNlKT09LTEpfHwKICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCiAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpfHwKICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksInJlYWRfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKXx8CiAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAogICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CiAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIixwcmV2aW91c19vYmplY3QoKSkpKQogICAgcmV0dXJuIDE7CiAgc3dpdGNoIChmaWxlX3NpemUoZGVzdCkpCiAgewogIGNhc2UgLTE6CiAgICBicmVhazsKICBjYXNlIC0yOgogICAgaWYgKGRlc3RbPDFdIT0nLycpIGRlc3QrPSIvIjsKICAgIGRlc3QrPWVmdW46OmV4cGxvZGUoc291cmNlLCIvIilbPDFdOwogICAgaWYgKGZpbGVfc2l6ZShkZXN0KT09LTIpIHJldHVybiAxOwogICAgaWYgKGZpbGVfc2l6ZShkZXN0KSE9LTEpIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBpZiAoIXJtKGRlc3QpKSByZXR1cm4gMTsKICAgIGJyZWFrOwogIH0KICBkbwogIHsKICAgIGJ5dGVzID0gcmVhZF9ieXRlcyhzb3VyY2UsIHB0ciwgTUFYTEVOKTsgcHRyICs9IE1BWExFTjsKICAgIGlmICghYnl0ZXMpIGJ5dGVzPSIiOwogICAgd3JpdGVfZmlsZShkZXN0LCBieXRlcyk7CiAgfQogIHdoaWxlKHNpemVvZihieXRlcykgPT0gTUFYTEVOKTsKICByZXR1cm4gMDsKfQojZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCgoKLy8gIyMjIEVyc2F0emF1ZmxvZXN1bmcgaW4gU3RyaW5ncyAjIyMKdmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2FwcykgewogIGludCBpOwogIHN0cmluZyAqcGFydHM7CgogIHBhcnRzID0gcmVnZXhwbG9kZShzdHIsICJAV0VbQS1TVV0qWzAtOV0iKTsKICBpID0gc2l6ZW9mKHBhcnRzKTsKCiAgaWYgKGk+MSkKICB7CiAgICBpbnQgaiwgdDsKICAgIGNsb3N1cmUgKm5hbWVfY2xzOwoKICAgIHQgPSBqID0gc2l6ZW9mKG9icyk7CgogICAgbmFtZV9jbHMgID0gIGFsbG9jYXRlKGopOwogICAgd2hpbGUgKGotLSkKICAgICAgaWYgKG9iamVjdHAob2JzW2pdKSkKICAgICAgICBuYW1lX2Nsc1tqXSA9IHN5bWJvbF9mdW5jdGlvbigibmFtZSIsIG9ic1tqXSk7CiAgICAgIGVsc2UgaWYgKHN0cmluZ3Aob2JzW2pdKSkKICAgICAgICBuYW1lX2Nsc1tqXSA9IG9ic1tqXTsKCiAgICB3aGlsZSAoKGktPSAyKT4wKQogICAgewogICAgICBpbnQgb2JfbnI7CiAgICAgIC8vIHp1IGVyc2V0emVuZGVzIFRva2VuIGluIEZhbGwgdW5kIE9iamVrdGluZGV4IGF1ZnNwYWx0ZW4KICAgICAgb2JfbnIgPSBwYXJ0c1tpXVs8MV0tJzEnOwogICAgICBpZiAob2JfbnI8MCB8fCBvYl9ucj49dCkgewogICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigicmVwbGFjZV9wZXJzb25hbDogdXNpbmcgd3Jvbmcgb2JqZWN0IGluZGV4ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIG9iX25yKSk7CiAgICAgICAgcmV0dXJuIGltcGxvZGUocGFydHMsICIiKTsKICAgICAgfQoKICAgICAgLy8gY2FzdXMga2FubiBtYW4gc2Nob24gaGllciBlbnRzY2hlaWRlbgogICAgICBpbnQgY2FzdXM7CiAgICAgIHN0cmluZyBwYXJ0ID0gcGFydHNbaV07CiAgICAgIHN3aXRjaCAocGFydFszXSkgewogICAgICAgIGNhc2UgJ1InOiBjYXN1cyA9IFdFUjsgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnUyc6IGNhc3VzID0gV0VTU0VOOyBicmVhazsKICAgICAgICBjYXNlICdNJzogY2FzdXMgPSBXRU07ICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ04nOiBjYXN1cyA9IFdFTjsgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogIGNvbnRpbnVlOyAvLyBwYXNzdCBzY2hvbiBqZXR6dCBuaWNodCBpbiBkYXMgSGF1cHRtdXN0ZXIKICAgICAgfQoKICAgICAgLy8gdW5kIGpldHp0IGRpZSBlaW56ZWxuZW4gS2V5d29yZHMgb2huZSBmdWVocmVuZGVzICJAV0UiLCBiZWVuZGVuZGUgSWQKICAgICAgbWl4ZWQgdG1wOwogICAgICBzd2l0Y2ggKHBhcnRbMy4uPDJdKSB7CiAgICAgICAgY2FzZSAiUiI6IGNhc2UgIlNTRU4iOiBjYXNlICJNIjogY2FzZSAiTiI6ICAgICAgICAgICAgICAgLy8gTmFtZQogICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMsIDEpOyAgYnJlYWs7CiAgICAgICAgY2FzZSAiUlUiOiBjYXNlICJTU0VOVSI6IGNhc2UgIk1VIjogY2FzZSAiTlUiOiAgICAgICAgICAgLy8gdW5iZXN0aW1tdAogICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMpOyAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUlFQIjogY2FzZSAiU1NFTlFQIjogY2FzZSAiTVFQIjogY2FzZSAiTlFQIjogICAgICAgLy8gUHJvbm91bgogICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCiAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UHJvbm91bihjYXN1cyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJSUUEiOiBjYXNlICJTU0VOUUEiOiBjYXNlICJNUUEiOiBjYXNlICJOUUEiOiAgICAgICAvLyBBcnRpY2xlCiAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKICAgICAgICAgICAgdG1wID0gKHN0cmluZyl0bXAtPlF1ZXJ5QXJ0aWNsZShjYXN1cywgMSwgMSk7CiAgICAgICAgICBpZiAoc3RyaW5ncCh0bXApICYmICEodG1wWzwxXV4nICcpKSAKICAgICAgICAgICAgdG1wID0gdG1wWzAuLjwyXTsgICAgICAgICAgICAgICAgLy8gRXh0cmEtU3BhY2Ugd2llZGVyIGxvZXNjaGVuCiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJSUVBQTVMiOiBjYXNlICJTU0VOUVBQTVMiOiBjYXNlICJNUVBQTVMiOiBjYXNlICJOUVBQTVMiOgogICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCiAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlJRUFBGUyI6IGNhc2UgIlNTRU5RUFBGUyI6IGNhc2UgIk1RUFBGUyI6IGNhc2UgIk5RUFBGUyI6CiAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJSUVBQTlMiOiBjYXNlICJTU0VOUVBQTlMiOiBjYXNlICJNUVBQTlMiOiBjYXNlICJOUVBQTlMiOgogICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCiAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgU0lOR1VMQVIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUlFQUE1QIjogY2FzZSAiU1NFTlFQUE1QIjogY2FzZSAiTVFQUE1QIjogY2FzZSAiTlFQUE1QIjoKICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQogICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBQTFVSQUwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUlFQUEZQIjogY2FzZSAiU1NFTlFQUEZQIjogY2FzZSAiTVFQUEZQIjogY2FzZSAiTlFQUEZQIjoKICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQogICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFBMVVJBTCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJSUVBQTlAiOiBjYXNlICJTU0VOUVBQTlAiOiBjYXNlICJNUVBQTlAiOiBjYXNlICJOUVBQTlAiOgogICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCiAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgUExVUkFMKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgLy8gd2VubiB0bXAgZWluIFN0cmluZyB3YXIsIHdlaXNlbiB3aXIgZXMgaGllciBwYXVzY2hhbCB6dQogICAgICBpZiAoc3RyaW5ncCh0bXApKQogICAgICAgIHBhcnRzW2ldID0gdG1wOwoKICAgICAgLy8gYXVmIFd1bnNjaCB3aXJkIG5hY2ggU2F0emVuZGVuIGdyb3NzIGdlc2NocmllYmVuCiAgICAgIGlmIChjYXBzKQogICAgICB7CiAgICAgICAgLy8gV2VubiBkYXMgdm9yaGVyZ2VoZW5kZSBwYXJ0c1tpXSA9PSAiIiBpc3QsIHNpbmQgd2lyIGFtIEFuZmFuZyB2b20KICAgICAgICAvLyBTdHJpbmcgdW5kIGRpZXMgd2lyZCB3aWUgZWluIFNhdHplbmRlIHZvcmhlciBiZWhhbmRlbHQuCiAgICAgICAgaWYgKHBhcnRzW2ktMV0gPT0gIiIpCiAgICAgICAgICAgIHBhcnRzW2ldID0gY2FwaXRhbGl6ZShwYXJ0c1tpXSk7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIHN3aXRjaCAocGFydHNbaS0xXVs8Mi4uXSkKICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSAiLiAiOiAgY2FzZSAiISAiOiAgY2FzZSAiPyAiOgogICAgICAgICAgICBjYXNlICIuIjogICBjYXNlICIhIjogICBjYXNlICI/IjoKICAgICAgICAgICAgY2FzZSAiLlxuIjogY2FzZSAiIVxuIjogY2FzZSAiP1xuIjoKICAgICAgICAgICAgY2FzZSAiXCIgIjogY2FzZSAiXCJcbiI6CiAgICAgICAgICAgICAgcGFydHNbaV0gPSBjYXBpdGFsaXplKHBhcnRzW2ldKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CiAgfQogIHJldHVybiBzdHI7Cn0KCi8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECiNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQpkZXByZWNhdGVkIHZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0bykgewoKICBpZighc3RyaW5ncChzdHIpKSB7CiAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gZXh0cmFjdCgpOiAlTyIsc3RyKSk7CiAgfQogIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CiAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIHRvXSk7CiAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCiAgICAgIHJldHVybihzdHJbZnJvbSAuLiA8YWJzKHRvKV0pOwogICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQogICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gdG9dKTsKICAgIGVsc2UKICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7CiAgfQogIGVsc2UgaWYgKGludHAoZnJvbSkpIHsKICAgIGlmIChmcm9tPj0wKQogICAgICByZXR1cm4oc3RyW2Zyb20gLi4gXSk7CiAgICBlbHNlCiAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiBdKTsKICB9CiAgZWxzZSB7CiAgICByZXR1cm4oc3RyKTsKICB9Cn0KI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCgojaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCmRlcHJlY2F0ZWQgdmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0bykgewoKICBpZighcG9pbnRlcnAoYXJyYXkpKSB7CiAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gc2xpY2VfYXJyYXkoKTogJU8iLGFycmF5KSk7CiAgfQogIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CiAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gdG9dKTsKICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gPGFicyh0byldKTsKICAgIGVsc2UgaWYgKGZyb208MCAmJiB0bz49MCkKICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gdG9dKTsKICAgIGVsc2UKICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKICB9CiAgZWxzZSBpZiAoaW50cChmcm9tKSkgewogICAgaWYgKGZyb20+PTApCiAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIF0pOwogICAgZWxzZQogICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiBdKTsKICB9CiAgZWxzZSB7CiAgICByZXR1cm4oYXJyYXkpOwogIH0KfQojZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCgojaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQpkZXByZWNhdGVkIGludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpIHsKCiAgaWYgKHBvaW50ZXJwKGFycmF5c3RyaW5nKSkgewogICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyxpdGVtKSk7CiAgfQogIGVsc2UgaWYgKHN0cmluZ3AoYXJyYXlzdHJpbmcpKSB7CiAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLHRvX2ludChpdGVtKSkpOwogIH0KICBlbHNlIHsKICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBtZW1iZXJfYXJyYXkoKTogJU8iLGFycmF5c3RyaW5nKSk7CiAgfQp9CiNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCgovLyBUaGUgZGlnaXQgYXQgdGhlIGkndGggcG9zaXRpb24gaXMgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiAnaScuCnN0cmluZyBjb3VudF90YWJsZSA9CiAgICAiMDExMjEyMjMxMjIzMjMzNDEyMjMyMzM0MjMzNDM0NDUxMjIzMjMzNDIzMzQzNDQ1MjMzNDM0NDUzNDQ1NDU1NiI7CmludCBicm9rZW5fY291bnRfYml0cyggc3RyaW5nIHMgKSB7CiAgICBpbnQgaSwgcmVzOwogICAgaWYoICFzdHJpbmdwKHMpIHx8ICEoaT1zaXplb2YocykpICkgcmV0dXJuIDA7CiAgICBmb3IoIDsgaS0tPjA7ICkgewogICAgICAgIC8vIFdlIGFyZSBjb3VudGluZyA2IGJpdHMgYXQgYSB0aW1lIHVzaW5nIGEgcHJlY29tcGlsZWQgdGFibGUuCiAgICAgICAgcmVzICs9IGNvdW50X3RhYmxlWyhzW2ldLScgJykmNjNdLScwJzsKICAgIH0KICAgIHJldHVybiByZXM7Cn0KCiNpZiAhX19FRlVOX0RFRklORURfXyhjb3VudF9iaXRzKQppbnQgY291bnRfYml0cyggc3RyaW5nIHMgKSB7CiAgICByZXR1cm4oYnJva2VuX2NvdW50X2JpdHMocykpOwp9CiNlbmRpZgoKCi8vICogVGVpbGUgYXVzIGVpbmVtIEFycmF5IGVudGZlcm5lbiAqKiogT0JTT0xFVEUKZGVwcmVjYXRlZCBtaXhlZCAqZXhjbHVkZV9hcnJheShtaXhlZCAqYXJyLGludCBmcm9tLGludCB0bykKewogIGlmICh0bzxmcm9tKQogICAgdG8gPSBmcm9tOwogIHJldHVybiBhcnJbMC4uZnJvbS0xXSthcnJbdG8rMS4uXTsKfQoK