ZGlmZiAtLWdpdCBhL3Avc2VydmljZS9wYWRyZWljL21ucGMvbW92aW5nLmMgYi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21vdmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxN2Q1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21vdmluZy5jCkBAIC0wLDAgKzEsNDIxIEBACisjcHJhZ21hIHNhdmVfdHlwZXMsc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3MscGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9saXZpbmcvbW92aW5nIjsKKworI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiL3Avc2VydmljZS9wYWRyZWljL21ucGMvbW5wYy5oIgorI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxsaXZpbmcvY29tYmF0Lmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8Y29tYmF0Lmg+CisKKyNkZWZpbmUgRU5WICAgIGVudmlyb25tZW50CisjZGVmaW5lIFBPICAgICBwcmV2aW91c19vYmplY3QoKQorCisvLyBMZXR6dGVyIFNwaWVsZXJrb250YWt0LiAtMSwgd2VubiBkZXIgTU5QQyBpbmFrdGl2IHp1aGF1c2UgcnVtc3RlaHQKK3N0YXRpYyBpbnQgbWVldF9sYXN0X3BsYXllcjsKKworc3RhdGljIHZvaWQgbW5wY19jcmVhdGUoKQoreworICBpZiAoUE8gJiYgbWVtYmVyKGluaGVyaXRfbGlzdChQTyksICIvc3RkL3Jvb20uYyIpIT0tMSkKKyAgICBTZXRQcm9wKE1OUENfSE9NRSwgb2JqZWN0X25hbWUoUE8pKTsKKyAgZWxzZSBpZiAoUEwgJiYgRU5WKFBMKSkKKyAgICBTZXRQcm9wKE1OUENfSE9NRSwgb2JqZWN0X25hbWUoRU5WKFBMKSkpOworICBlbHNlCisgICAgU2V0UHJvcChNTlBDX0hPTUUsIE1OUENfREZMVF9IT01FKTsKKyAgU2V0UHJvcChQX01OUEMsIDEpOworICBTZXRQcm9wKE1OUENfQVJFQSwgKHt9KSk7CisgIFNldFByb3AoTU5QQ19ERUxBWSwgTU5QQ19ERkxUX0RFTEFZKTsKKyAgU2V0UHJvcChNTlBDX0ZVTkMsIDApOworICBTZXRQcm9wKE1OUENfUkFORE9NLCAwKTsKKyAgU2V0UHJvcChNTlBDX1dBTEtfVElNRSwgTU5QQ19ERkxUX1dBTEspOworICBTZXRQcm9wKE1OUENfRkxBR1MsIDApOworICBTZXRQcm9wKFBfRU5BQkxFX0lOX0FUVEFDS19PVVQsIDEpOworICBtZWV0X2xhc3RfcGxheWVyPXRpbWUoKTsKK30KKworcHJvdGVjdGVkIHZvaWQgUmVnaXN0ZXJXYWxrKCkKK3sKKyAgaWYgKChRdWVyeVByb3AoTU5QQ19ERUxBWSkrUXVlcnlQcm9wKE1OUENfUkFORE9NKSk8PU1BWF9NQVNURVJfVElNRSkKKyAgICBXQUxLX01BU1RFUi0+UmVnaXN0ZXJXYWxrZXIoUXVlcnlQcm9wKE1OUENfREVMQVkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeVByb3AoTU5QQ19SQU5ET00pKTsKKyAgZWxzZQorICAgIGNhbGxfb3V0KCJXYWxrIiwgUXVlcnlQcm9wKE1OUENfREVMQVkpK3JhbmRvbShRdWVyeVByb3AoTU5QQ19SQU5ET00pKSk7Cit9CisKKy8vIENhbiBiZSB1c2VkIHRvIG1hbnVhbGx5IHJlc3RhcnQgdGhlIE1OUEMgZnJvbSBhIGRpZmZlcmVudCBvYmplY3QgZXZlbiBpZgorLy8gdGhlIE1OUEMgaGFkIG5vdCBwbGF5ZXIgY29udGFjdC4KK3B1YmxpYyBpbnQgUmVzdGFydFdhbGsoKQoreworICBpbnQgZmxhZ3MgPSBRdWVyeVByb3AoTU5QQ19GTEFHUyk7CisgIC8vIEZhbGxzIG5pY2h0IGxhdWZlbmQsIHdpcmQgZ2FyIG5pY2h0cyBnZW1hY2h0LgorICBpZiAoZmxhZ3MgJiBNTlBDX1dBTEspCisgIHsKKyAgICAvL1NwaWVsZXJrb250YWt0IHNpbXVsaWVyZW4KKyAgICBtZWV0X2xhc3RfcGxheWVyPXRpbWUoKTsKKyAgICAvLyBGYWxscyBNTlBDIG5vY2ggcmVnaXN0cmllcnQgaXN0IG9kZXIgbm9jaCBlaW5lbiBDYWxsb3V0IGF1ZiBXYWxrIGhhdCwKKyAgICAvLyBtdXNzIG5pY2h0cyB3ZWl0ZXIgZ2VtYWNodCB3ZXJkZW4uCisgICAgaWYgKFdBTEtfTUFTVEVSLT5SZWdpc3RyYXRpb24oKQorICAgICAgICB8fCBmaW5kX2NhbGxfb3V0KCJXYWxrIikgPiAtMSkKKyAgICAgIHJldHVybiAtMTsKKyAgICAvLyBhbnNvbnN0ZW4gTU5QQyByZWdpc3RyaWVyZW4sIGZhbGxzIGdlZWlnbmV0LgorICAgIGlmICgoUXVlcnlQcm9wKE1OUENfREVMQVkpK1F1ZXJ5UHJvcChNTlBDX1JBTkRPTSkpPD1NQVhfTUFTVEVSX1RJTUUpCisgICAgICBXQUxLX01BU1RFUi0+UmVnaXN0ZXJXYWxrZXIoUXVlcnlQcm9wKE1OUENfREVMQVkpLCBRdWVyeVByb3AoTU5QQ19SQU5ET00pKTsKKyAgICAvLyB1bmQgbWl0IGt1cnplciBWZXJ6b2VnZXJ1bmcgZWlubWFsIGxhdWZlbi4gKGphLCBhYnNpY2h0LCBoaWVyCisgICAgLy8gTU5QQ19ERUxBWSB6dSBudXR6ZW4gLSBkZW5uIHNvbGFuZ2UgZGF1ZXJ0IGRhcyBXYWxrIHZvbSBNYXN0ZXIKKyAgICAvLyBtaW5kZXN0ZW5zLikKKyAgICBjYWxsX291dCgiV2FsayIsMStyYW5kb20oIG1pbihRdWVyeVByb3AoTU5QQ19ERUxBWSktMSw4KSApKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworcHJvdGVjdGVkIHZvaWQgU3RvcChpbnQgbW92ZWhvbWUpCit7CisgIGlmIChXQUxLX01BU1RFUi0+UmVnaXN0cmF0aW9uKCkpCisgICAgV0FMS19NQVNURVItPlJlbW92ZVdhbGtlcigpOworICBlbHNlIGlmIChmaW5kX2NhbGxfb3V0KCJXYWxrIikhPS0xKQorICAgIHJlbW92ZV9jYWxsX291dCgiV2FsayIpOworICBpZiAobW92ZWhvbWUpCisgIHsKKyAgICBtb3ZlKFF1ZXJ5UHJvcChNTlBDX0hPTUUpLCBNX1RQT1JUfE1fTk9DSEVDSyk7CisgICAgbWVldF9sYXN0X3BsYXllcj0tMTsKKyAgfQorfQorCitzdGF0aWMgaW50IF9zZXRfbW5wY19mbGFncyhpbnQgZmxhZ3MpCit7CisgIGlmIChmbGFncyAmIE1OUENfV0FMSykKKyAgeworICAgIGlmICghUXVlcnlQcm9wKE1OUENfSE9NRSkpCisgICAgICByYWlzZV9lcnJvcigidW5rbm93biBNTlBDX0hPTUVcbiIpOworICAgIC8vd2VubiBkaWUgRmxhZ3MgbmV1IGdlc2V0enQgd2VyZGVuLCB3aXJkIGRlciBNTlBDIGRhcyB6d2VpdGUgTWFsIGltCisgICAgLy9NYXN0ZXIgYW5nZW1lbGRldCAtPiB2b3JoZXIgYWJtZWxkZW4gKFplc3N0cmEpCisgICAgaWYgKFF1ZXJ5UHJvcChNTlBDX0ZMQUdTKSAmIE1OUENfV0FMSykKKyAgICB7CisgICAgICBTdG9wKDApOworICAgIH0KKyAgICBSZWdpc3RlcldhbGsoKTsKKyAgfQorICAvLyBlbHNlIG5pY2h0IHZvbiBCZWRldXR1bmcsIGRhIGluIFdhbGsoKSBkYXMgZmxhZyBnZXRlc3RldCB3aXJkCisgIGlmIChmbGFncyAmIE1OUENfRk9MTE9XX1BMQVlFUikKKyAgeworICAgIGlmICghUXVlcnlQcm9wKE1OUENfUFVSU1VFUikpCisgICAgeyAvLyB3dXJkZSBkaWVzZXMgRmxhZyBuZXUgZWluZ2VzY2hhbHRldD8KKyAgICAgIGlmIChlbnZpcm9ubWVudCgpKQorICAgICAgeyAvLyBWZXJmb2xndW5nIGF1Zm5laG1lbi4uLgorICAgICAgICBvYmplY3QgKnB1cnN1ZXIgPSBmaWx0ZXIoYWxsX2ludmVudG9yeShFTlYoKSksICMnaW50ZXJhY3RpdmUpOworICAgICAgICBmaWx0ZXJfb2JqZWN0cyhwdXJzdWVyLCAiQWRkUHVyc3VlciIsIE1FKTsKKyAgICAgICAgU2V0UHJvcChNTlBDX1BVUlNVRVIsIHB1cnN1ZXIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBTZXRQcm9wKE1OUENfUFVSU1VFUiwgKHt9KSk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHBvaW50ZXJwKFF1ZXJ5UHJvcChNTlBDX1BVUlNVRVIpKSkKKyAgeyAvLyB3aXJkIGRlcnplaXQgaXJnZW5kd2VyIHZlcmZvbGd0PworICAgIC8vIGFsbGUgVmVyZm9sZ3VuZ2VuIGFiYnJlY2hlbi4uLgorICAgIGZpbHRlcl9vYmplY3RzKFF1ZXJ5UHJvcChNTlBDX1BVUlNVRVIpLSh7IDAgfSksICJSZW1vdmVQdXJzdWVyIiwgTUUpOworICAgIFNldFByb3AoTU5QQ19QVVJTVUVSLCAwKTsgLy8gU3BlaWNoZXIgZnJlaWdlYmVuLi4uCisgIH0KKyAgZWxzZQorICAgIFNldFByb3AoTU5QQ19QVVJTVUVSLCAwKTsKKworICAvLyBudXIgbGl2aW5ncyBrb2VubmVuIGNvbW1hbmRfbWUgbnV0emVuLi4uCisgIGlmICghbGl2aW5nKE1FKSkKKyAgICBmbGFncyB8PSBNTlBDX0RJUkVDVF9NT1ZFOworCisgIHJldHVybiBTZXQoTU5QQ19GTEFHUywgZmxhZ3MsIEZfVkFMVUUpOworfQorCitzdGF0aWMgdm9pZCBtbnBjX0luc2VydEVuZW15KG9iamVjdCBlbmVteSkKK3sKKyAgaWYgKCAoUXVlcnlQcm9wKE1OUENfRkxBR1MpICYgTU5QQ19GT0xMT1dfRU5FTVkpICYmCisgICAgICAgICAobWVtYmVyKFF1ZXJ5UHJvcChNTlBDX1BVUlNVRVIpLCBQTCk9PS0xKSkKKyAgeworICAgICBQTC0+QWRkUHVyc3VlcihNRSk7CisgICAgIFNldFByb3AoTU5QQ19QVVJTVUVSLCBRdWVyeVByb3AoTU5QQ19QVVJTVUVSKSsoeyBQTCB9KSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgbW5wY19yZXNldCgpCit7CisgIGludCBmbGFncyA9IFF1ZXJ5UHJvcChNTlBDX0ZMQUdTKTsKKyAgLy8gbWVldF9sYXN0X3BsYXllciA8IDAgemVpZ3QgYW4sIGRhc3MgZGVyIE1OUEMgc2Nob24genVoYXVzZSBpc3QuCisgIGlmIChtZWV0X2xhc3RfcGxheWVyIDwgMAorICAgICAgfHwgIShmbGFncyAmIE1OUENfV0FMSykKKyAgICAgIHx8IChmbGFncyAmIE1OUENfTk9fTU9WRV9IT01FKSkKKyAgICByZXR1cm47CisKKyAgLy8gTGFuZ2Uga2VpbmVuIFNwaWVsZXJrb250YWt0IHVuZCBrZWluIFNwaWVsZXIgaW0gUmF1bTogbmFjaCBIYXVzZSBnZWhlbi4KKyAgaWYgKFF1ZXJ5UHJvcChNTlBDX1dBTEtfVElNRSkrbWVldF9sYXN0X3BsYXllciA8IHRpbWUoKQorICAgICAgJiYgZW52aXJvbm1lbnQoKSAmJiAhc2l6ZW9mKGZpbHRlcigKKyAgICAgIGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSksICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZSkpKQorICB7CisgICAgLy8gQWJzY2hhbHRlbiB1bmQgSGVpbWdlaGVuIHVuZCBkb3J0IHdhcnRlbi4KKyAgICBTdG9wKDEpOworICB9Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X21ucGNfbGFzdF9tZWV0KCkKK3sgICByZXR1cm4gbWVldF9sYXN0X3BsYXllcjsgICB9CisKK3N0YXRpYyB2b2lkIG1ucGNfaW5pdCgpCit7CisgIGlmIChpbnRlcmFjdGl2ZShQTCkpCisgIHsKKyAgICBpZiAobWVldF9sYXN0X3BsYXllcjw9MCkKKyAgICB7CisgICAgICBSZWdpc3RlcldhbGsoKTsKKyAgICB9CisgICAgaWYgKCAoUXVlcnlQcm9wKE1OUENfRkxBR1MpICYgTU5QQ19GT0xMT1dfUExBWUVSKSAmJgorICAgICAgICAgKG1lbWJlcihRdWVyeVByb3AoTU5QQ19QVVJTVUVSKSwgUEwpPT0tMSkgJiYKKyAgICAgICAgKCEoUXVlcnlQcm9wKE1OUENfRkxBR1MpICYgTU5QQ19GT0xMT1dfRU5FTVkpIHx8IElzRW5lbXkoUEwpKSkKKyAgICB7CisgICAgICBQTC0+QWRkUHVyc3VlcihNRSk7CisgICAgICBTZXRQcm9wKE1OUENfUFVSU1VFUiwgUXVlcnlQcm9wKE1OUENfUFVSU1VFUikrKHsgUEwgfSkpOworICAgIH0KKyAgICBtZWV0X2xhc3RfcGxheWVyPXRpbWUoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBXZW5uIGRlciByZWlua29tbWVuZGUgYXVjaCBlaW4gTU5QQ19MQVNUX01FRVQgZ3JvZXNzZXIgMCBoYXQsIGlzdCBlcworICAgIC8vIGVpbiBNTlBDLCBkZXIgbm9jaCBsYWV1ZnQuIFdlbm4gd2lyIG5pY2h0IGxhdWZlbiwgbGF1ZmVuIHdpciBsb3MuCisgICAgLy8gSW4gZGllc2VtIHVuZCBhdWNoIGltIGFuZGVyZW4gRmFsbCB1ZWJlcm5laG1lbiB3aXIgYWJlciBtYWwgc2VpbmVuCisgICAgLy8gbGV0enRlbiBTcGllbGVya29udGFrdCwgZGVubiBkZXIgaXN0IGp1ZW5nZXIgYWxzIHVuc2VyZXIuCisgICAgaW50IGxtID0gUEwtPlF1ZXJ5UHJvcChNTlBDX0xBU1RfTUVFVCk7CisgICAgaWYgKG1lZXRfbGFzdF9wbGF5ZXI8PTAgJiYgbG0+MCkKKyAgICB7CisgICAgICBSZWdpc3RlcldhbGsoKTsKKyAgICAgIG1lZXRfbGFzdF9wbGF5ZXI9bG07CisgICAgfQorICAgIGVsc2UgaWYgKG1lZXRfbGFzdF9wbGF5ZXI8bG0pCisgICAgICAgbWVldF9sYXN0X3BsYXllcj1sbTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBtbnBjX21vdmUoKQoreworICBpZiAoZW52aXJvbm1lbnQoKSAmJiAoUXVlcnlQcm9wKE1OUENfRkxBR1MpICYgTU5QQ19GT0xMT1dfUExBWUVSKSkKKyAgeworICAgIG9iamVjdCAqbGl2ID0gUXVlcnlQcm9wKE1OUENfUFVSU1VFUikgJiBhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpOworICAgIGZpbHRlcl9vYmplY3RzKFF1ZXJ5UHJvcChNTlBDX1BVUlNVRVIpLWxpdi0oeyAwIH0pLCAiUmVtb3ZlUHVyc3VlciIsIE1FKTsKKyAgICBTZXRQcm9wKE1OUENfUFVSU1VFUiwgbGl2KTsKKyAgfQorICBpZiAoUXVlcnlQcm9wKE1OUENfRlVOQykpCisgICAgTUUtPlF1ZXJ5UHJvcChNTlBDX0ZVTkMpOworfQorCitzdGF0aWMgaW50IFByZXZlbnRFbnRlcihzdHJpbmcgZmlsZSkKKy8vIGRhcmYgZGVyIFJhdW0gYmV0cmV0ZW4gd2VyZGVuPworeworICBzdHJpbmcgKmFyZWE7CisKKyAgaWYgKCFzaXplb2YoYXJlYT1RdWVyeVByb3AoTU5QQ19BUkVBKSkpCisgICAgcmV0dXJuIDA7IC8vIFJhdW0gZGFyZiBiZXRyZXRlbiB3ZXJkZW4KKyAgZWxzZQorICB7CisgICAgaW50IGk7CisgICAgc3RhdHVzIGV4YWN0bWF0Y2g7CisgICAgZXhhY3RtYXRjaD1RdWVyeVByb3AoTU5QQ19GTEFHUykgJiBNTlBDX0VYQUNUX0FSRUFfTUFUQ0g7CisgICAgaWYgKChpPXN0cnN0cihmaWxlLCAiIyIpKSE9LTEpIGZpbGU9ZmlsZVswLi5pLTFdOworICAgIGZvciAoaT1zaXplb2YoYXJlYSktMTsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgIGlmIChleGFjdG1hdGNoKQorICAgICAgeworICAgICAgICAvL2V4YWt0ZXIgVmVyZ2xlaWNoLCBrZWluIFN1YnN0cmluZ3ZlcmdsZWljaCBnZXd1ZW5zY2h0CisgICAgICAgIGlmIChmaWxlPT1hcmVhW2ldKQorICAgICAgICAgIHJldHVybiAwOyAgLy9iZXRyZXRlbgorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoc3Ryc3RyKGZpbGUsIGFyZWFbaV0pPT0wKQorICAgICAgICAgIHJldHVybiAwOyAvLyBSYXVtIGJldHJldGVuCisgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOyAvLyAgUmF1bSBkYXJmIG5pY2h0IGJldHJldGVuIHdlcmRlbgorICB9Cit9CisKK3N0YXRpYyBpbnQgbW5wY19QcmV2ZW50Rm9sbG93KG9iamVjdCBkZXN0KQoreworICBpZiAoZGVzdCAmJiBQcmV2ZW50RW50ZXIob2JqZWN0X25hbWUoZGVzdCkpKQorICAgIHJldHVybiAyOworICByZXR1cm4gMDsKK30KKworLy8gQmV3ZWd1bmdzc2ltdWxhdGlvbiAoQmV3ZWd1bmdzbWVsZHVuZykgZnVlciBiZXdlZ2VuZGUgbm9uLWxpdmluZ3MKK3N0YXRpYyBpbnQgZGlyZWN0X21vdmUobWl4ZWQgZGVzdCwgaW50IG1ldGhvZCwgc3RyaW5nIGRpcmVjdGlvbikKK3sKKyAgIGludCByZXMsIHBhcmEsIHRtcDsKKyAgIHN0cmluZyB0ZXh0b3V0LCB0ZXh0aW4sICptb3V0LCB2YywgZm47CisgICBvYmplY3Qgb2xkZW52LCAqaW52OworCisgICBpZiAobGl2aW5nKE1FKSkKKyAgICAgIHJldHVybiBjYWxsX290aGVyKE1FLCAibW92ZSIsIGRlc3QsIG1ldGhvZCk7CisgICBlbHNlCisgICB7CisgICAgICBvbGRlbnYgPSBlbnZpcm9ubWVudCgpOworICAgICAgcGFyYT1RdWVyeVByb3AoUF9QQVJBKTsKKyAgICAgIGlmICgocGFyYT4wKSAmJiBzdHJpbmdwKGRlc3QpKQorICAgICAgeworICAgICAgICAgZm49ZGVzdCsiXiIrcGFyYTsKKyAgICAgICAgIGlmIChmaW5kX29iamVjdChmbikgfHwgKGZpbGVfc2l6ZShmbisiLmMiKT4wKSkKKyAgICAgICAgICAgIGRlc3Q9Zm47CisgICAgICAgICBlbHNlIGlmIChmaWxlX3NpemUodmM9aW1wbG9kZShleHBsb2RlKGZuLCIvIilbMC4uPDJdLCIvIikKKyAgICAgICAgICAgICAgICAgICsiL3ZpcnR1YWxfY29tcGlsZXIuYyIpPjApCisgICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZW5uIGVpbiBWQyBleGlzdGllcnQsIHBy/GZlbiBvYiBkaWVzZXIgUGFyYU9iamVjdGUgdW50ZXJzdHVldHp0CisgICAgICAgICAgICAvLyB3ZW5uIGphLCBkYW5uIHRlc3RlbiBvYiBzaWNoIFJhdW0gbGFkZW4gbGFlc3N0Li4uCisgICAgICAgICAgICBpZiAoKCFjYXRjaCh0bXA9KGludCljYWxsX290aGVyKHZjLCJOb1BhcmFPYmplY3RzIikpICYmICghdG1wKSkgJiYKKyAgICAgICAgICAgICAgICAoIWNhdGNoKGNhbGxfb3RoZXIoIGZuLCAiPz8/IiApKSkpCisgICAgICAgICAgICAgICAgZGVzdD1mbjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmVzID0gKGludCljYWxsX290aGVyKE1FLCAibW92ZSIsIGRlc3QsIE1fTk9DSEVDSyk7CisKKyAgICAgIGlmIChvbGRlbnY9PWVudmlyb25tZW50KCkpCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgIC8vIGFscyBlcnN0ZXMgZGllIE1lbGR1bmcgZnVlciBkYXMgVmVybGFzc2VuIGRlcyBSYXVtZXMuLi4KKyAgICAgIGlmICggbWV0aG9kICYgTV9UUE9SVCApCisgICAgICAgIHRleHRvdXQgPSAoc3RyaW5nKSBRdWVyeVByb3AoUF9NTVNHT1VUKSB8fCAoc3RyaW5nKSBRdWVyeVByb3AoUF9NU0dPVVQpOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBtb3V0ID0gZXhwbG9kZSggKHN0cmluZykgUXVlcnlQcm9wKFBfTVNHT1VUKSB8fCAiIiwgIiMiICk7CisgICAgICAgIHRleHRvdXQgPSBtb3V0WzBdIHx8IChzdHJpbmcpIFF1ZXJ5UHJvcChQX01NU0dPVVQpOworICAgICAgfQorCisgICAgICBpZiAoc3RyaW5ncCh0ZXh0b3V0KSkKKyAgICAgIHsKKyAgICAgICAgIGlmICggIXNpemVvZihkaXJlY3Rpb24pICkKKyAgICAgICAgICAgZGlyZWN0aW9uID0gMDsKKworICAgICAgICAgaW52ID0gYWxsX2ludmVudG9yeShvbGRlbnYpIC0gKHsgdGhpc19vYmplY3QoKSB9KTsKKyAgICAgICAgIGludiA9IGZpbHRlciggaW52LCAjJ2xpdmluZyk7CisgICAgICAgICBpbnYgLT0gZmlsdGVyX29iamVjdHMoIGludiwgIkNhbm5vdFNlZSIsIDEgKTsKKyAgICAgICAgIGZpbHRlciggaW52LCAjJ3RlbGxfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBOYW1lKCBXRVIsIDIgKSArICIgIiArIHRleHRvdXQgKworICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID8gIiAiICsgZGlyZWN0aW9uIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihtb3V0KSA+IDEgPyBtb3V0WzFdIDogIiIpICsgIi5cbiIgKTsKKyAgICAgIH0KKworICAgICAgLy8gbnVuIGRpZSBNZWxkdW5nIGb8ciBkYXMgIkJldHJldGVuIiBkZXMgUmF1bWVzLi4uCisKKyAgICAgIGlmICggbWV0aG9kICYgTV9UUE9SVCApCisgICAgICAgIHRleHRpbiA9IChzdHJpbmcpIFF1ZXJ5UHJvcChQX01NU0dJTik7CisgICAgICBlbHNlCisgICAgICAgIHRleHRpbiA9IChzdHJpbmcpIFF1ZXJ5UHJvcChQX01TR0lOKTsKKworICAgICAgaWYgKHN0cmluZ3AodGV4dGluKSkKKyAgICAgIHsKKyAgICAgICAgIGludiA9IGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSkgLSAoeyB0aGlzX29iamVjdCgpIH0pOworICAgICAgICAgaW52ID0gZmlsdGVyKCBpbnYsICMnbGl2aW5nKTsKKyAgICAgICAgIGludiAtPSBmaWx0ZXJfb2JqZWN0cyggaW52LCAiQ2Fubm90U2VlIiwgMSApOworICAgICAgICAgZmlsdGVyKCBpbnYsICMndGVsbF9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZSggV0VSLCAwICkpICsgIiAiICsgdGV4dGluICsgIi5cbiIgKTsKKyAgICAgIH0KKyAgfQorICByZXR1cm4gcmVzOworfQorCitpbnQgV2FsaygpCit7CisgIGludCAgICAgaTsKKyAgbWFwcGluZyBleGl0czsKKyAgc3RyaW5nICAqcm9vbXMsICpkaXJzLCAqZXgsIHRtcDsKKworICBpZiAoIWVudmlyb25tZW50KCkpCisgIHsKKyAgICAvLyBkYXJmIGVpZ2VudGxpY2ggbmljaHQgdm9ya29tbWVuLgorICAgIHJhaXNlX2Vycm9yKCJNTlBDIG9obmUgRW52aXJvbm1lbnQuXG4iKTsKKyAgfQorCisgIGludCBmbGFncz1RdWVyeVByb3AoTU5QQ19GTEFHUyk7CisgIGlmICghKGZsYWdzICYgTU5QQ19XQUxLKSkKKyAgICByZXR1cm4gMDsKKworICAvL2dnZi4gbmV1ZW4gQ2FsbG91dCBlaW50cmFnZW4sIGJldm9yIGlyZ2VuZHdhcyBhbmRlcmVzIGdlbWFjaHQgd2lyZC4KKyAgaWYgKChRdWVyeVByb3AoTU5QQ19ERUxBWSkrUXVlcnlQcm9wKE1OUENfUkFORE9NKSk+TUFYX01BU1RFUl9USU1FKQorICAgIGNhbGxfb3V0KCJXYWxrIiwgUXVlcnlQcm9wKE1OUENfREVMQVkpK3JhbmRvbShRdWVyeVByb3AoTU5QQ19SQU5ET00pKSk7CisKKyAgLy8gSW0gS2FtcGYgZ2dmLiBuaWNodCB3ZWl0ZXJnZWhlbi4KKyAgaWYgKChmbGFncyAmIE1OUENfTk9fV0FMS19JTl9GSUdIVCkgJiYgSW5GaWdodCgpKQorICB7CisgICAgbWVldF9sYXN0X3BsYXllcj10aW1lKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBNTlBDIGFuaGFsdGVuLCB3ZW5uIGxhbmdlIGtlaW4gU3BpZWxlcmtvbnRha3QKKyAgaWYgKFF1ZXJ5UHJvcChNTlBDX1dBTEtfVElNRSkrbWVldF9sYXN0X3BsYXllciA8IHRpbWUoKQorICAgICAgJiYgIXNpemVvZihmaWx0ZXIoYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSwKKyAgICAgICAgICAgICAgICAgIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlKSkKKyAgICAgICkKKyAgeworICAgIC8vIGFuaGFsdGVuIHVuZCBnZ2YuIGF1Y2ggZGlyZWt0IG5hY2ggSGF1c2UgZ2VoZW4uCisgICAgU3RvcChmbGFncyAmIE1OUENfR09fSE9NRV9XSEVOX1NUT1BQRUQpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gQXVzZ2FlbmdlIGVybWl0dGVsbi4KKyAgZXhpdHMgPSAoZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfRVhJVFMpKTsKKyAgcm9vbXMgPSBtX3ZhbHVlcyhleGl0cyk7CisgIGRpcnMgID0gbV9pbmRpY2VzKGV4aXRzKTsKKyAgZXggPSAoe30pOworCisgIGZvciAoaT1zaXplb2Yocm9vbXMpLTE7IGk+PTA7IGktLSkKKyAgeworICAgIGlmICghUHJldmVudEVudGVyKHJvb21zW2ldKSkKKyAgICAgIGV4ICs9ICh7IGRpcnNbaV0gfSk7CisgIH0KKyAgLyogSGllciBtdWVzc2VuIHdpciBhdWYgZGllIFp1dmVybGFlc3NpZ2tlaXQgdW5zZXJlciBNYWdpZXIgYmF1ZW4gLi4uICovCisgIGlmIChmbGFncyAmIE1OUENfRElSRUNUX01PVkUpCisgIHsKKyAgICAvLyBpbSBkaXJlY3QgbW9kZSBrZWluZSBTRXMgYmVudXR6YmFyLi4uCisgICAgaWYgKHNpemVvZihleCkpCisgICAgeworICAgICAgIHRtcD1leFtyYW5kb20oc2l6ZW9mKGV4KSldOworICAgICAgIGRpcmVjdF9tb3ZlKGV4cGxvZGUoZXhpdHNbdG1wXSwgIiMiKVs8MV0sIE1fR08sICJuYWNoICIrY2FwaXRhbGl6ZSh0bXApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAvLyBIbmdsLiBOYWNoIEhhdXNlLi4uCisgICAgICAgZGlyZWN0X21vdmUoUXVlcnlQcm9wKE1OUENfSE9NRSksIE1fVFBPUlR8TV9OT0NIRUNLLCAwKTsKKyAgICAgICBtZWV0X2xhc3RfcGxheWVyPS0xOworICAgICB9CisgIH0KKyAgZWxzZSBpZiAoZmxhZ3MgJiBNTlBDX09OTFlfRVhJVFMpCisgIHsKKyAgICAvLyBsb2dpc2NoZXJ3ZWlzZSBhdWNoIGtlaW5lIFNFcyBiZW51dHplbi4uLgorICAgIGlmIChzaXplb2YoZXgpKQorICAgIHsKKyAgICAgIGNvbW1hbmQoZXhbcmFuZG9tKHNpemVvZihleCkpXSk7IC8qIElyZ2VuZHdvaGluIGdlaGVuICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBIbmdsLiBOYWNoIEhhdXNlLi4uCisgICAgICBtb3ZlKFF1ZXJ5UHJvcChNTlBDX0hPTUUpLCBNX1RQT1JUfE1fTk9DSEVDSyk7CisgICAgICBtZWV0X2xhc3RfcGxheWVyPS0xOworICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8vIFNwZWNpYWwgRXhpdHMgbWl0YmVudXR6ZW4uCisgICAgZXggKz0gbV9pbmRpY2VzKEVOVigpLT5RdWVyeVByb3AoUF9TUEVDSUFMX0VYSVRTKSk7CisgICAgaWYgKHNpemVvZihleCkpCisgICAgeworICAgICAgY29tbWFuZChleFtyYW5kb20oc2l6ZW9mKGV4KSldKTsgLyogSXJnZW5kd29oaW4gZ2VoZW4gKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIEhuZ2wuIEdhciBrZWluZSBBdXNnYWVuZ2UuIE5hY2ggSGF1c2UuLi4KKyAgICAgIG1vdmUoUXVlcnlQcm9wKE1OUENfSE9NRSksIE1fVFBPUlR8TV9OT0NIRUNLKTsKKyAgICAgIG1lZXRfbGFzdF9wbGF5ZXI9LTE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDE7Cit9Cg==