Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICBfX19fICAgICAgICAgICAgICAgICAgICAgICAgXyAgICAgIF8KLy8gICAgIC8gX19ffF9fX18gXyAgIF8gX19fXyAgIF9fX198IHxfXyAgfCB8Ci8vICAgIHwgfCAgIC8gX19ffCB8IHwgfCAgXyAgXC8gX19ffCAgXyAgXHwgfAovLyAgICB8IHxfX198IHwgIHwgfF98IHwgfCB8IHwgfF9fX3wgfCB8IHx8X3wKLy8gICAgIFxfX19ffF98ICBcX19fX198X3wgfF98XF9fX198X3wgfF98KF8pIE1lZGlhIGJlbmNobWFya3MKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLy8JIKkgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24sIGxpY2Vuc2VkIHVuZGVyIEFwYWNoZSAyLjAgCi8vCi8vICBmaWxlIDoJIFBhcnRpY2xlRmlsdGVyLmgKLy8gIGF1dGhvciA6IFNjb3R0IEV0dGluZ2VyIC0gc2NvdHQubS5ldHRpbmdlckBpbnRlbC5jb20KLy8KLy8gIGRlc2NyaXB0aW9uIDogR2VuZXJpYyBQYXJ0aWNsZSBGaWx0ZXIgY2xhc3MuICBTdXBwb3J0cyBhbm5lYWxlZCAKLy8JCQkJICBwYXJ0aWNsZSBmaWx0ZXJpbmcuICBUZW1wbGF0ZWQgb24gYSBtb2RlbCBvYmplY3QKLy8JCQkJICB3aGljaCBldmFsdWF0ZXMgdGhlIHBhcnRpY2xlIGxpa2VsaWhvb2RzLiBWZWN0b3Igd2lkdGgKLy8JCQkJICBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBtb2RlbCBpbml0aWFsIHN0YXRlLiAgTnVtYmVyIG9mIAovLwkJCQkgIGFubmVhbGluZyBzdGVwcyBpcyBkZXRlcm1pbmVkIGJ5IG1vZGVsIFN0ZERldnMoKSBmdW5jdGlvbi4KLy8KLy8JCQkJICBNb2RlbCBvYmplY3QgbXVzdCBzdXBwb3J0IG1lbWJlciBmdW5jdGlvbnMgOiAKLy8JCQkJCXN0ZDo6dmVjdG9yPGZwVHlwZT4gSW5pdGlhbFN0YXRlKCk7IAovLwkJCQkJZnBUeXBlIExvZ0xpa2VsaWhvb2Qoc3RkOjp2ZWN0b3I8ZnBUeXBlPiAmdiwgYm9vbCAmdmFsaWQpOwovLwkJCQkJc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8ZnBUeXBlPiA+IFN0ZERldnMoKTsKLy8JCQkJCXZvaWQgR2V0T2JzZXJ2YXRpb24oZnBUeXBlIHRpbWV2YWwpOwovLwkJCi8vICBtb2RpZmllZCA6IAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojaWZuZGVmIFBBUlRJQ0xFRklMVEVSX0gKI2RlZmluZSBQQVJUSUNMRUZJTFRFUl9ICgojaWYgZGVmaW5lZChIQVZFX0NPTkZJR19IKQojIGluY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxmc3RyZWFtPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlICJSYW5kb21HZW5lcmF0b3IuaCIKI2luY2x1ZGUgIkFubmVhbGluZ0ZhY3Rvci5oIgoKI2lmbmRlZiB1aW50CiNkZWZpbmUgdWludCB1bnNpZ25lZCBpbnQKI2VuZGlmCgojdW5kZWYgbWluCgovL0dlbmVyaWMgcGFydGljbGUgZmlsdGVyIGNsYXNzIHRlbXBsYXRlZCBvbiBtb2RlbCBvYmplY3QKdGVtcGxhdGU8Y2xhc3MgVD4gCmNsYXNzIFBhcnRpY2xlRmlsdGVyewkKCnB1YmxpYzoKLy9UeXBlcwoJdHlwZWRlZiBmbG9hdCBmcFR5cGU7Cgl0eXBlZGVmIHN0ZDo6dmVjdG9yPGZwVHlwZT4gVmVjdG9yZjsKCnByb3RlY3RlZDoKLy92YXJpYWJsZXMKCVQgKm1Nb2RlbDsJCQkJCQkJCQkJCQkvL3RlbXBsYXRlZCBtb2RlbCBvYmplY3QgZXZhbHVhdGVzIHBhcnRpY2xlIGxpa2VsaWhvb2RzCglzdGQ6OnZlY3RvcjxWZWN0b3JmID4gbVBhcnRpY2xlcywgbU5ld1BhcnRpY2xlczsJCS8vbGlzdHMgb2YgcGFydGljbGVzCglWZWN0b3JmCW1XZWlnaHRzLCBtQ2RmOwkJCQkJCQkJCS8vcGFydGljbGUgd2VpZ2h0cywgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24KCVZlY3RvcmYgbUJpbnMsIG1TYW1wbGVzLCBtTGlrZWxpaG9vZHM7CQkJCQkvL3Jlc2FtcGxpbmcgYmlucywgbmV3IHNhbXBsZXMsIHBhcnRpY2xlIGxpa2VsaWhvb2RzCgoJaW50IG1OUGFydGljbGVzOwkJCQkJCQkJCQkvL251bWJlciBvZiBwYXJ0aWNsZXMgdXNlZAoJaW50IG1CZXN0UGFydGljbGU7CQkJCQkJCQkJCS8vaW5kZXggb2YgcGFydGljbGUgd2l0aCBoaWdoZXN0IGxpa2VsaWhvb2QKCWludCBtTWluUGFydGljbGVzOwkJCQkJCQkJCQkvL21pbmltdW0gbnVtYmVyIG9mIHBhcnRpY2xlcyBhbGxvd2VkCglzdGQ6OnZlY3RvcjxSYW5kb21HZW5lcmF0b3I+IG1SbmQ7CQkJCQkJLy9yYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgLSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSBwYXJhbGxlbCBsZWFwZnJvZyBnZW5lcmF0b3IgZm9yIGJldHRlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJzLgoJYm9vbCBtSW5pdGlhbGl6ZWQ7CQkJCQkJCQkJCS8vcGFydGljbGUgaW5pdGlhbGl6YXRpb24gZmxhZwoKLy9mdW5jdGlvbnMKCXZvaWQgQ2FsY0NERihjb25zdCBWZWN0b3JmICZ3ZWlnaHRzLCBWZWN0b3JmICZkc3QpOwkJCQkJCQkJCQkvL2NhbGN1bGF0ZSB0aGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gZnJvbSBwYXJ0aWNsZSB3ZWlnaHRzCgl2b2lkIEFkZEdhdXNzaWFuTm9pc2UoVmVjdG9yZiAmcCwgY29uc3QgVmVjdG9yZiAmc3RkRGV2cywgUmFuZG9tR2VuZXJhdG9yICZybmQpIGNvbnN0OwkvL2Rpc3RyaWJ1dGUgcGFydGljbGUgcmFuZG9tbHkgYWNjb3JkaW5nIHRvIGdpdmVuIHN0YW5kYXJkIGRldmlhdGlvbnMKCXZvaWQgUmVzYW1wbGUoVmVjdG9yZiAmY2RmLCBWZWN0b3JmICZiaW5zLCBWZWN0b3JmICZzYW1wbGVzLCBpbnQgbik7CQkJCQkvL01vbnRlIENhcmxvIHJlc2FtcGxpbmcgZ2l2ZW4gYSBDREYKCXZpcnR1YWwgdm9pZCBDYWxjV2VpZ2h0cyhzdGQ6OnZlY3RvcjxWZWN0b3JmID4gJnBhcnRpY2xlcyk7CQkJCQkJCQkvL2NhbGN1bGF0ZSBwYXJ0aWNsZSB3ZWlnaHRzIGJhc2VkIG9uIG1vZGVsIGxpa2VsaWhvb2QKCXZpcnR1YWwgdm9pZCBHZW5lcmF0ZU5ld1BhcnRpY2xlcyhpbnQgayk7CQkJCQkJCQkJCQkJLy9nZW5lcmF0ZSBuZXcgcGFydGljbGVzIGRpc3RyaWJ1dGVkIGJ5IG1vZGVsIGFubmVhbGluZyBsZXZlbCBzdGQgZGV2CgoKCnB1YmxpYzoKCS8vQ29uc3RydWN0b3JzCglQYXJ0aWNsZUZpbHRlcigpCQkJCQkJCXttTWluUGFydGljbGVzID0gNTsgbUluaXRpYWxpemVkID0gZmFsc2U7fTsJCQkKCVBhcnRpY2xlRmlsdGVyKFQgJm1vZGVsKQkJCQkJe21Nb2RlbCA9ICZtb2RlbDsgbU1pblBhcnRpY2xlcyA9IDU7IG1Jbml0aWFsaXplZCA9IGZhbHNlO307IAoJdmlydHVhbCB+UGFydGljbGVGaWx0ZXIoKSB7fTsJCQkJCQkJCQkKCgkvL0dldCBGdW5jdGlvbnMKCVQgJk1vZGVsKCkJCQkJCQkJCQl7cmV0dXJuICptTW9kZWw7IH07CglpbnQgTnVtUGFydGljbGVzKCkgY29uc3QJCQkJCXtyZXR1cm4gbU5QYXJ0aWNsZXM7IH07CglpbnQgR29vZFBhcnRpY2xlcygpCWNvbnN0CQkJCQl7cmV0dXJuIChpbnQpbVBhcnRpY2xlcy5zaXplKCk7IH07CglzdGQ6OnZlY3RvcjxWZWN0b3JmID4gJlN0ZERldnMoKSBjb25zdAkJe3JldHVybiBtTW9kZWwtPlN0ZERldnMoKTsgfTsKCQoJLy9TZXQgRnVuY3Rpb25zCgl2b2lkIFNldE1vZGVsKFQgJm1vZGVsKQkJCQkJCXttTW9kZWwgPSAmbW9kZWw7IH07Cgl2b2lkIFNldE1pbmltdW1QYXJ0aWNsZXMoaW50IG4pCQkJCXttTWluUGFydGljbGVzID0gbjt9OwoKCS8vU2V0IG51bWJlciBvZiBwYXJ0aWNsZXMgdG8gbiBhbmQgZ2VuZXJhdGUgaW5pdGlhbCB2YWx1ZXMKCXZvaWQgSW5pdGlhbGl6ZVBhcnRpY2xlcyhpbnQgbik7CQkJCQkJCgoJLy9VcGRhdGUgZmlsdGVyIHRvIGEgbmV3IHNldCBvZiBwYXJ0aWNsZXMgLSByZXR1cm5zIGZhbHNlIGlmIG1vZGVsIG9ic2VydmF0aW9uIGZhaWxzCgkvL2NhbGxzIG1vZGVsIHRvIGdldCBvYnNlcnZhdGlvbiBhdCBnaXZlbiB0aW1lLCBhbmQgdG8gZ2V0IGxpa2VsaWhvb2RzIG9mIGVhY2ggcGFydGljbGUKCXZpcnR1YWwgYm9vbCBVcGRhdGUoZnBUeXBlIHRpbWVWYWwpOwoJCgkvL1N0YXRlIGVzdGltYXRlICh3ZWlnaHRlZCBtZWFuIG9mIGFsbCBwYXJ0aWNsZXMpCgl2b2lkIEVzdGltYXRlKFZlY3RvcmYgJmVzdGltYXRlKTsKCQoJLy9SZXR1cm4gcGFydGljbGUgd2l0aCBoaWdoZXN0IGxpa2VsaWhvb2QKCXZvaWQgQmVzdFBhcnRpY2xlKFZlY3RvcmYgJnApIHtwID0gbVBhcnRpY2xlc1ttQmVzdFBhcnRpY2xlXTsgfTsKCQp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vdmVjdG9yIG11bHRpcGx5IGJ5IHNjYWxhcgp0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+CmlubGluZSB2b2lkIG9wZXJhdG9yKj0oc3RkOjp2ZWN0b3I8VDE+ICZ2LCBjb25zdCBUMiBjKQp7CWZvcih1aW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykKCQl2W2ldICo9IGM7Cn0KCi8vdmVjdG9yIGNvbnN0YW50IHN1YnRyYWN0aW9uCnRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4KaW5saW5lIHZvaWQgb3BlcmF0b3ItPShzdGQ6OnZlY3RvcjxUMT4gJnYsIGNvbnN0IFQyIGMpCnsJZm9yKHVpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKQoJCXZbaV0gLT0gYzsKfQoKLy9kaXN0cmlidXRlIHBhcnRpY2xlIHJhbmRvbWx5IGFjY29yZGluZyB0byBnaXZlbiBzdGFuZGFyZCBkZXZpYXRpb25zCnRlbXBsYXRlPGNsYXNzIFQ+CmlubGluZSB2b2lkIFBhcnRpY2xlRmlsdGVyPFQ+OjpBZGRHYXVzc2lhbk5vaXNlKFZlY3RvcmYgJnAsIGNvbnN0IFZlY3RvcmYgJnN0ZERldnMsIFJhbmRvbUdlbmVyYXRvciAmcm5kKSBjb25zdAp7CWZvcih1aW50IGkgPSAwOyBpIDwgc3RkRGV2cy5zaXplKCk7IGkrKykKCQlwW2ldICs9IChmcFR5cGUpcm5kLlJhbmROKCkgKiBzdGREZXZzW2ldOwkJCQkKfQoKLy9jYWxjdWxhdGUgdGhlIENERiBmcm9tIHBhcnRpY2xlIHdlaWdodHMKdGVtcGxhdGU8Y2xhc3MgVD4KaW5saW5lIHZvaWQgUGFydGljbGVGaWx0ZXI8VD46OkNhbGNDREYoY29uc3QgVmVjdG9yZiAmd2VpZ2h0cywgVmVjdG9yZiAmZHN0KQp7CWRzdC5yZXNpemUod2VpZ2h0cy5zaXplKCkpOwoJZHN0WzBdID0gd2VpZ2h0c1swXTsKCWZvcih1aW50IGkgPSAxOyBpIDwgd2VpZ2h0cy5zaXplKCk7IGkrKykJCQkJCQkJLy9jb21wdXRlIGN1bXVsYXRpdmUgc3VtCgkJZHN0W2ldID0gZHN0W2kgLSAxXSArIHdlaWdodHNbaV07Cglkc3QgKj0gZnBUeXBlKDEuMCkgLyBkc3RbZHN0LnNpemUoKSAtIDFdOwkJCQkJCQkvL25vcm1hbGl6ZSBjZGYKfQoKLy9Nb250ZSBDYXJsbyByZXNhbXBsaW5nIGdpdmVuIGEgY2RmLiAgVXNlcyBpbmNyZW1lbnRhbCBlcG9uZW50aWFsIHJhbmRvbSB2YWx1ZXMgdG8KLy9jcmVhdGUgYSBzb3J0ZWQgdW5pZm9ybSByYW5kb20gc2FtcGxlIGZvciBmYXN0IGludmVyc2Ugb2YgdGhlIGNkZiBmb3IgYWxsIHNhbXBsZXMgaW4gMSBwYXNzCnRlbXBsYXRlPGNsYXNzIFQ+CmlubGluZSB2b2lkIFBhcnRpY2xlRmlsdGVyPFQ+OjpSZXNhbXBsZShWZWN0b3JmICZjZGYsIFZlY3RvcmYgJmJpbnMsIFZlY3RvcmYgJnNhbXBsZXMsIGludCBuKQp7CglSYW5kb21HZW5lcmF0b3IgcjsKCXNhbXBsZXNbMF0gPSAoZnBUeXBlKXIuUmFuZEV4cCgpOwoJZm9yKGludCBpID0gMTsgaSA8IG47IGkrKykJCQkJCQkJCQkJCS8vZ2VuZXJhdGUgYSBuZXcgc2V0IG9mIHNvcnRlZCByYW5kb20gc2FtcGxlcwoJCXNhbXBsZXNbaV0gPSBzYW1wbGVzW2kgLSAxXSArIChmcFR5cGUpci5SYW5kRXhwKCk7CglzYW1wbGVzICo9IChmcFR5cGUpMS4wIC8gKHNhbXBsZXNbc2FtcGxlcy5zaXplKCkgLSAxXSk7CQkJCS8vbm9ybWFsaXplIAoJY2RmW2NkZi5zaXplKCkgLSAxXSArPSAxOwkJCQkJCQkJCQkJLy9wcmV2ZW50IG92ZXJydW4gZHVlIHRvIG51bWVyaWNhbCBlcnJvcgoJaW50IHAgPSAwOwoJYmlucy5hc3NpZ24oY2RmLnNpemUoKSwgMCk7Cglmb3IodWludCBpID0gMDsgaSA8IHNhbXBsZXMuc2l6ZSgpOyBpKyspCQkJCQkJCS8vcG9wdWxhdGUgc2FtcGxlIGJpbnMgYmFzZWQgb24gcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uCgl7CXdoaWxlKGNkZltwXSA8IHNhbXBsZXNbaV0pCgkJCXArKzsKCQliaW5zW3BdKys7Cgl9Cn0KCi8vY2FsY3VsYXRlIHBhcnRpY2xlIHdlaWdodHMgKG1XZWlnaHRzKSBhbmQgZmluZCBoaWdoZXN0IGxpa2VsaWhvb2QgcGFydGljbGUuIAovL2NvbXB1dGVzIGFuIG9wdGltYWwgYW5uZWFsaW5nIGZhY3RvciBhbmQgc2NhbGVzIHRoZSBsaWtlbGlob29kcy4gCi8vQWxzbyByZW1vdmVzIGFueSBwYXJ0aWNsZXMgcmVwb3J0ZWQgYXMgaW52YWxpZCBieSB0aGUgbW9kZWwuCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgUGFydGljbGVGaWx0ZXI8VD46OkNhbGNXZWlnaHRzKHN0ZDo6dmVjdG9yPFZlY3RvcmYgPiAmcGFydGljbGVzKQp7CQoJYm9vbCB2YWxpZDsKCW1CZXN0UGFydGljbGUgPSAwOwoJZnBUeXBlIHRvdGFsID0gMCwgYmVzdCA9IDAsIG1pbldlaWdodCA9IDFlMzBmLCBhbm5lYWxpbmdGYWN0b3IgPSAxOwoJbVdlaWdodHMucmVzaXplKHBhcnRpY2xlcy5zaXplKCkpOwoJdWludCBpID0gMDsKCXdoaWxlKGkgPCBwYXJ0aWNsZXMuc2l6ZSgpKQkJCQkJCQkJCQkJLy9jb21wdXRlIGxpa2VsaWhvb2Qgd2VpZ2h0cyBmb3IgZWFjaCBwYXJ0aWNsZQoJewltV2VpZ2h0c1tpXSA9IG1Nb2RlbC0+TG9nTGlrZWxpaG9vZChwYXJ0aWNsZXNbaV0sIHZhbGlkKTsKCQlpZighdmFsaWQpCQkJCQkJCQkJCQkJCQkvL2lmIG5vdCB2YWxpZChtb2RlbCBwcmlvciksIHJlbW92ZSB0aGUgcGFydGljbGUgZnJvbSB0aGUgbGlzdAoJCXsJcGFydGljbGVzW2ldID0gcGFydGljbGVzW3BhcnRpY2xlcy5zaXplKCkgLSAxXTsKCQkJcGFydGljbGVzLnBvcF9iYWNrKCk7IG1XZWlnaHRzLnBvcF9iYWNrKCk7CgkJfQoJCWVsc2UKCQkJbWluV2VpZ2h0ID0gc3RkOjptaW4obVdlaWdodHNbaSsrXSwgbWluV2VpZ2h0KTsJCQkJLy9maW5kIG1pbmltdW0gd2VpZ2h0Cgl9CglpZigoaW50KXBhcnRpY2xlcy5zaXplKCkgPCBtTWluUGFydGljbGVzKSByZXR1cm47CQkJCQkvL2JhaWwgb3V0IGlmIG5vdCBlbm91Z2ggdmFsaWQgcGFydGljbGVzCgltV2VpZ2h0cyAtPSBtaW5XZWlnaHQ7CQkJCQkJCQkJCQkJLy9zaGlmdCB3ZWlnaHRzIHRvIHplcm8gZm9yIG51bWVyaWNhbCBzdGFiaWxpdHkKCWlmKG1Nb2RlbC0+U3RkRGV2cygpLnNpemUoKSA+IDEpIAoJCWFubmVhbGluZ0ZhY3RvciA9IEJldGFBbm5lYWxpbmdGYWN0b3IobVdlaWdodHMsIDAuNWYpOwkJCS8vY2FsY3VsYXRlIGFubmVhbGluZyBmYWN0b3IgaWYgbW9yZSB0aGFuIDEgc3RlcAoJZm9yKHVpbnQgaSA9IDA7IGkgPCBtV2VpZ2h0cy5zaXplKCk7IGkrKykKCXsJZG91YmxlIHdhID0gYW5uZWFsaW5nRmFjdG9yICogbVdlaWdodHNbaV07CgkJbVdlaWdodHNbaV0gPSAoZmxvYXQpZXhwKHdhKTsKCQl0b3RhbCArPSBtV2VpZ2h0c1tpXTsJCQkJCQkJCQkJCS8vc2F2ZSBzdW0gb2YgYWxsIHdlaWdodHMKCQlpZihpID09IDAgfHwgbVdlaWdodHNbaV0gPiBiZXN0KQkJCQkJCQkJLy9maW5kIGhpZ2hlc3QgbGlrZWxpaG9vZCBwYXJ0aWNsZQoJCXsJYmVzdCA9IG1XZWlnaHRzW2ldOwoJCQltQmVzdFBhcnRpY2xlID0gaTsKCQl9Cgl9CgltV2VpZ2h0cyAqPSBmcFR5cGUoMS4wKSAvIHRvdGFsOwkJCQkJCQkJCS8vbm9ybWFsaXplIHdlaWdodHMKfQoKLy9HZW5lcmF0ZSBhIHNldCBvZiBpbml0YWwgcGFydGljbGVzCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgUGFydGljbGVGaWx0ZXI8VD46OkluaXRpYWxpemVQYXJ0aWNsZXMoaW50IG4pCnsJCgltUm5kLnJlc2l6ZShuKTsJCQkJCQkJCQkJCQkJCS8vaW5pdGlhbGl6ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMKCWZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCgkJbVJuZFtpXS5TZWVkKGkgKiAyKTsKCW1OUGFydGljbGVzID0gbjsKCVZlY3RvcmYgaW5pdFZlY3RvciA9IG1Nb2RlbC0+SW5pdGlhbFN0YXRlKCk7CQkJCQkJLy9nZXQgaW5pdGFsIHN0YXRlIHZlY3RvciAKCWlmKGluaXRWZWN0b3Iuc2l6ZSgpICE9IG1Nb2RlbC0+U3RkRGV2cygpWzBdLnNpemUoKSApCgkJc3RkOjpjb3V0IDw8ICJXYXJuaW5nISEgUEY6Ok1vZGVsIGluaXRpYWwgVmVjdG9yIGFuZCBzdGREZXYgdmVjdG9yIGFyZSBub3QgZXF1YWwgbGVuZ3RocyEiIDw8IHN0ZDo6ZW5kbDsKCWJvb2wgbWluVmFsaWQgPSBmYWxzZTsKCXdoaWxlKCFtaW5WYWxpZCkKCXsJbVBhcnRpY2xlcy5yZXNpemUobik7CgkJZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykKCQl7CVZlY3RvcmYgJnAgPSBtUGFydGljbGVzW2ldOwkJCQkJCQkJCS8vY3JlYXRlIG5ldyBwYXJ0aWNsZSB3aXRoIHJhbmRvbWl6ZWQgaW5pdGlhbCB2YWx1ZQoJCQlwID0gaW5pdFZlY3RvcjsKCQkJQWRkR2F1c3NpYW5Ob2lzZShwLCBtTW9kZWwtPlN0ZERldnMoKVswXSwgbVJuZFtpXSk7CQkJLy9kaXN0cmlidXRlIHBhcnRpY2xlcyByYW5kb21seSBhYm91dCB0aGUgaW5pdGlhbCB2ZWN0b3IKCQl9CgkJQ2FsY1dlaWdodHMobVBhcnRpY2xlcyk7CQkJCQkJCQkJCS8vY2FsY3VsYXRlIGluaXRpYWwgd2VpZ2h0cyBhbmQgcmVtb3ZlIGFueSBwYXJ0aWNsZXMgdGhhdCBhcmUgaW52YWxpZCBieSBtb2RlbCBwcmlvcgoJCW1pblZhbGlkID0gKGludCltUGFydGljbGVzLnNpemUoKSA+PSBtTWluUGFydGljbGVzOwkJCQkvL3JlcGVhdCB1bnRpbCBtaW5pbXVtIG51bWJlciBvZiB2YWxpZCBwYXJ0aWNsZXMgaXMgbWV0CgkJaWYoIW1pblZhbGlkKQkJCQkJCQkKCQkJc3RkOjpjb3V0IDw8ICJXYXJuaW5nIDogaW5pdGlhbCBwYXJ0aWNsZSBzZXQgZG9lcyBub3QgbWVldCBtaW5pbXVtIG51bWJlciBvZiBwYXJ0aWNsZXMuIFJlc2FtcGxpbmcuLiIgPDwgc3RkOjplbmRsOwoJfQoJbUNkZi5yZXNpemUobik7CQkJCQkJCQkJCQkJCQkvL2FsbG9jYXRlIHNwYWNlIAoJbVNhbXBsZXMucmVzaXplKG4pOwoJbUJpbnMucmVzaXplKG4pOwoJbUluaXRpYWxpemVkID0gdHJ1ZTsKfQoKLy9nZW5lcmF0ZSBuZXcgcGFydGljbGVzIGRpc3RyaWJ1dGVkIHdpdGggc3RkIGRldmlhdGlvbiBnaXZlbiBieSB0aGUgbW9kZWwgYW5uZWFsaW5nIHBhcmFtZXRlcgp0ZW1wbGF0ZTxjbGFzcyBUPiAKdm9pZCBQYXJ0aWNsZUZpbHRlcjxUPjo6R2VuZXJhdGVOZXdQYXJ0aWNsZXMoaW50IGspCnsJaW50IHAgPSAwOwoJbU5ld1BhcnRpY2xlcy5yZXNpemUobU5QYXJ0aWNsZXMpOwoJZm9yKHVpbnQgaSA9IDA7IGkgPCBtQmlucy5zaXplKCk7IGkrKykJCQkJCQkJCQkvL2Rpc3RyaWJ1dGUgbmV3IHBhcnRpY2xlcyByYW5kb21seSBhY2NvcmRpbmcgdG8gbW9kZWwgc3RkRGV2cwoJCWZvcih1aW50IGogPSAwOyBqIDwgbUJpbnNbaV07IGorKykKCQl7CW1OZXdQYXJ0aWNsZXNbcF0gPSBtUGFydGljbGVzW2ldOwkJCQkJCQkJLy9hZGQgbmV3IHBhcnRpY2xlIGZvciBlYWNoIGVudHJ5IGluIGVhY2ggYmluIGRpc3RyaWJ1dGVkIHJhbmRvbWx5IGFib3V0IGR1cGxpY2F0ZWQgcGFydGljbGUKCQkJQWRkR2F1c3NpYW5Ob2lzZShtTmV3UGFydGljbGVzW3BdLCBtTW9kZWwtPlN0ZERldnMoKVtrXSwgbVJuZFtwXSk7CgkJCXArKzsKCQl9Cn0KCi8vUGFydGljbGUgZmlsdGVyIHVwZGF0ZSAobW9kZWwgYW5kIG9ic2VydmF0aW9uIHVwZGF0ZXMgbXVzdCBiZSBjYWxsZWQgZmlyc3QpICAKdGVtcGxhdGU8Y2xhc3MgVD4KYm9vbCBQYXJ0aWNsZUZpbHRlcjxUPjo6VXBkYXRlKGZwVHlwZSB0aW1ldmFsKQkJCQkJCQkJLy93ZWlnaHRzIGhhdmUgYWxyZWFkeSBiZWVuIGNvbXB1dGVkIGZyb20gcHJldmlvdXMgc3RlcCBvciBpbml0aWFsaXphdGlvbgp7CQkJCQkJCglpZighbUluaXRpYWxpemVkKQkJCQkJCQkJCQkJCQkJLy9jaGVjayBmb3IgcHJvcGVyIGluaXRpYWxpemF0aW9uCgl7CXN0ZDo6Y291dCA8PCAiVXBkYXRlIEVycm9yIDogUGFydGljbGVzIG5vdCBpbml0aWFsaXplZCIgPDwgc3RkOjplbmRsOyAKCQlyZXR1cm4gZmFsc2U7Cgl9CQoJaWYoIW1Nb2RlbC0+R2V0T2JzZXJ2YXRpb24odGltZXZhbCkpCgl7CXN0ZDo6Y291dCA8PCAiVXBkYXRlIEVycm9yIDogTW9kZWwgb2JzZXJ2YXRpb24gZmFpbGVkIGZvciB0aW1lIDogIiA8PCB0aW1ldmFsIDw8IHN0ZDo6ZW5kbDsKCQlyZXR1cm4gZmFsc2U7Cgl9Cglmb3IoaW50IGsgPSAoaW50KW1Nb2RlbC0+U3RkRGV2cygpLnNpemUoKSAtIDE7IGsgPj0gMCA7IGstLSkJCQkvL2xvb3Agb3ZlciBhbGwgYW5uZWFsaW5nIHN0ZXBzIHN0YXJ0aW5nIHdpdGggaGlnaGVzdAoJewlDYWxjQ0RGKG1XZWlnaHRzLCBtQ2RmKTsJCQkJCQkJCQkJCS8vTW9udGUgQ2FybG8gcmUtc2FtcGxpbmcgCgkJUmVzYW1wbGUobUNkZiwgbUJpbnMsIG1TYW1wbGVzLCBtTlBhcnRpY2xlcyk7CQkKCQlib29sIG1pblZhbGlkID0gZmFsc2U7CgkJd2hpbGUoIW1pblZhbGlkKQoJCXsJR2VuZXJhdGVOZXdQYXJ0aWNsZXMoayk7CgkJCUNhbGNXZWlnaHRzKG1OZXdQYXJ0aWNsZXMpOwkJCQkJCQkJCQkvL2NhbGN1bGF0ZSBwYXJ0aWNsZSB3ZWlnaHRzIGFuZCByZW1vdmUgYW55IGludmFsaWQgcGFydGljbGVzCgkJCW1pblZhbGlkID0gKGludCltTmV3UGFydGljbGVzLnNpemUoKSA+PSBtTWluUGFydGljbGVzOwkJCS8vcmVwZWF0IGlmIG5vdCBlbm91Z2ggdmFsaWQgcGFydGljbGVzCgkJCWlmKCFtaW5WYWxpZCkgCgkJCQlzdGQ6OmNvdXQgPDwgIk5vdCBlbm91Z2ggdmFsaWQgcGFydGljbGVzIC0gUmVzYW1wbGluZyEhISIgPDwgc3RkOjplbmRsOwoJCX0KCQltUGFydGljbGVzID0gbU5ld1BhcnRpY2xlczsJCQkJCQkJCQkJCS8vc2F2ZSBuZXcgcGFydGljbGUgc2V0Cgl9CglyZXR1cm4gdHJ1ZTsKfQoKLy9jYWxjdWxhdGUgZXhwZWN0ZWQgdmFsdWUgb2YgdGhlIHBhcnRpY2xlIHNldAp0ZW1wbGF0ZTxjbGFzcyBUPiAKdm9pZCBQYXJ0aWNsZUZpbHRlcjxUPjo6RXN0aW1hdGUoVmVjdG9yZiAmZXN0aW1hdGUpCnsKCWVzdGltYXRlLmFzc2lnbihtUGFydGljbGVzWzBdLnNpemUoKSwgMCk7CQkJCQkJCQkvL2NsZWFyIGVzdGltYXRlIHZhbHVlcwoJZm9yKHVpbnQgaSA9IDA7IGkgPCBtUGFydGljbGVzLnNpemUoKTsgaSsrKQkJCQkJCQkJLy9jYWxjdWxhdGUgZXhwZWN0ZWQgdmFsdWUgCgkJZm9yKHVpbnQgaiA9IDA7IGogPCBlc3RpbWF0ZS5zaXplKCk7IGorKykKCQkJZXN0aW1hdGVbal0gKz0gbVBhcnRpY2xlc1tpXVtqXSAqIG1XZWlnaHRzW2ldOwp9CgojZW5kaWYK