LyoKICpDb3B5cmlnaHQoYykyMDA0LENpc2NvIFVSUCBpbWJ1cnNlcyBhbmQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgaW4gQmVpamluZyBVbml2ZXJzaXR5IG9mIFBvc3RzIGFuZCBUZWxlY29tbXVuaWNhdGlvbnMgcmVzZWFyY2hlcy4KICoKICpBbGwgcmlnaHQgcmVzZXJ2ZWQKICoKICpGaWxlIE5hbWU6bG9va3VwQ3RsVGFibGUuYwogKkZpbGUgRGVzY3JpcHRpb246Um93cyBvZiB0aGUgbG9va3VwQ3RsVGFibGUgTUlCIGFkZCAsIGRlbGV0ZSBhbmQgcmVhZC5Sb3dzIG9mIGxvb2t1cFJlc3VsdHNUYWJsZQogKiAgICAgICAgICAgICAgTUlCIGFkZCBhbmQgZGVsZXRlLgogCiAqCiAqQ3VycmVudCBWZXJzaW9uOjEuMAogKkF1dGhvcjpDaGVuSmluZwogKkRhdGU6MjAwNC44LjIwCiAqLwoKLyoKICogVGhpcyBzaG91bGQgYWx3YXlzIGJlIGluY2x1ZGVkIGZpcnN0IGJlZm9yZSBhbnl0aGluZyBlbHNlIAogKi8KI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfTElNSVRTX0gKI2luY2x1ZGUgPGxpbWl0cy5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXRkYi5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KCiNpbmNsdWRlICJsb29rdXBDdGxUYWJsZS5oIgojaW5jbHVkZSAibG9va3VwUmVzdWx0c1RhYmxlLmgiCiNpbmNsdWRlICJoZWFkZXJfY29tcGxleC5oIgoKLyoKICpGb3IgZGlzY29udGludWl0eSBjaGVja2luZy4KICovCgpvaWQgICAgICAgICAgICAgbG9va3VwQ3RsVGFibGVfdmFyaWFibGVzX29pZFtdID0KICAgIHsgMSwgMywgNiwgMSwgMiwgMSwgODIsIDEsIDMgfTsKCgpzdHJ1Y3QgdmFyaWFibGUyIGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc1tdID0gewogICAgLyoKICAgICAqIG1hZ2ljIG51bWJlciAgICAgICAgLCB2YXJpYWJsZSB0eXBlICwgcm8vcncgLCBjYWxsYmFjayBmbiAgLCBMLCBvaWRzdWZmaXggCiAgICAgKi8KICAgIHtDT0xVTU5fTE9PS1VQQ1RMVEFSR0VUQUREUkVTU1RZUEUsIEFTTl9JTlRFR0VSLCBSV1JJVEUsIHZhcl9sb29rdXBDdGxUYWJsZSwgMiwgezEsIDN9fSwKICAgIHtDT0xVTU5fTE9PS1VQQ1RMVEFSR0VUQUREUkVTUywgICBBU05fT0NURVRfU1RSLCBSV1JJVEUsIHZhcl9sb29rdXBDdGxUYWJsZSwgMiwgezEsIDR9fSwKICAgIHtDT0xVTU5fTE9PS1VQQ1RMT1BFUlNUQVRVUywgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfbG9va3VwQ3RsVGFibGUsIDIsIHsxLCA1fX0sCiAgICB7Q09MVU1OX0xPT0tVUENUTFRJTUUsICAgICAgQVNOX1VOU0lHTkVELCBST05MWSwgdmFyX2xvb2t1cEN0bFRhYmxlLCAyLCB7MSwgNn19LAogICAge0NPTFVNTl9MT09LVVBDVExSQywgICAgICAgICBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9sb29rdXBDdGxUYWJsZSwgMiwgezEsIDd9fSwKICAgIHtDT0xVTU5fTE9PS1VQQ1RMUk9XU1RBVFVTLCBBU05fSU5URUdFUiwgUldSSVRFLCB2YXJfbG9va3VwQ3RsVGFibGUsIDIsIHsxLCA4fX0KfTsKCgovKgogKiBnbG9iYWwgc3RvcmFnZSBvZiBvdXIgZGF0YSwgc2F2ZWQgaW4gYW5kIGNvbmZpZ3VyZWQgYnkgaGVhZGVyX2NvbXBsZXgoKSAKICovCgoKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpsb29rdXBDdGxUYWJsZVN0b3JhZ2UgPSBOVUxMOwpzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmxvb2t1cFJlc3VsdHNUYWJsZVN0b3JhZ2UgPSBOVUxMOwoKaW50IG1vZGlmeV9sb29rdXBDdGxUaW1lKHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICp0aGVkYXRhLCB1bnNpZ25lZCBsb25nIHZhbCk7CmludCBtb2RpZnlfbG9va3VwQ3RsT3BlclN0YXR1cyhzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqdGhlZGF0YSwgbG9uZyB2YWwpOwppbnQgbW9kaWZ5X2xvb2t1cEN0bFJjKHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICp0aGVkYXRhLCBsb25nIHZhbCk7CgoKdm9pZAppbml0X2xvb2t1cEN0bFRhYmxlKHZvaWQpCnsKICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJpbml0aWFsaXppbmcuLi4gICIpKTsKICAgIC8qCiAgICAgKiByZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCB0aGUgYWdlbnQgdG8gaGFuZGxlIG91ciBtaWIgdHJlZSAKICAgICAqLwogICAgUkVHSVNURVJfTUlCKCJsb29rdXBDdGxUYWJsZSIsIGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlcywgdmFyaWFibGUyLAogICAgICAgICAgICAgICAgIGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpOwoKCiAgICAvKgogICAgICogcmVnaXN0ZXIgb3VyIGNvbmZpZyBoYW5kbGVyKHMpIHRvIGRlYWwgd2l0aCByZWdpc3RyYXRpb25zIAogICAgICovCiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigibG9va3VwQ3RsVGFibGUiLCBwYXJzZV9sb29rdXBDdGxUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwoKICAgIC8qCiAgICAgKiB3ZSBuZWVkIHRvIGJlIGNhbGxlZCBiYWNrIGxhdGVyIHRvIHN0b3JlIG91ciBkYXRhIAogICAgICovCiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfTElCUkFSWSwgU05NUF9DQUxMQkFDS19TVE9SRV9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9sb29rdXBDdGxUYWJsZSwgTlVMTCk7CgogICAgREVCVUdNU0dUTCgoImxvb2t1cEN0bFRhYmxlIiwgImRvbmUuXG4iKSk7Cn0KCnN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICoKY3JlYXRlX2xvb2t1cFRhYmxlX2RhdGEodm9pZCkKewogICAgc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKlN0b3JhZ2VOZXcgPSBOVUxMOwogICAgU3RvcmFnZU5ldyA9IFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBUYWJsZV9kYXRhKTsKICAgIGlmIChTdG9yYWdlTmV3ID09IE5VTEwpIHsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgU3RvcmFnZU5ldy0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzcyA9IHN0cmR1cCgiIik7CiAgICBTdG9yYWdlTmV3LT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzTGVuID0gMDsKICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bE9wZXJTdGF0dXMgPSAybDsKICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bFRpbWUgPSAwOwogICAgU3RvcmFnZU5ldy0+c3RvcmFnZXR5cGUgPSBTVF9OT05WT0xBVElMRTsKICAgIHJldHVybiBTdG9yYWdlTmV3Owp9CgovKgogKiBsb29rdXBDdGxUYWJsZV9hZGQoKTogYWRkcyBhIHN0cnVjdHVyZSBub2RlIHRvIG91ciBkYXRhIHNldCAKICovCmludApsb29rdXBDdGxUYWJsZV9hZGQoc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CgoKICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgLyoKICAgICAqIGFkZCB0aGUgaW5kZXggdmFyaWFibGVzIHRvIHRoZSB2YXJiaW5kIGxpc3QsIHdoaWNoIGlzIAogICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAqLwoKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT5sb29rdXBDdGxPd25lckluZGV4LCB0aGVkYXRhLT5sb29rdXBDdGxPd25lckluZGV4TGVuKTsgICAvKiBsb29rdXBDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLCB0aGVkYXRhLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuKTsgICAgIC8qIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgKi8KCgogICAgaWYgKGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhKCZsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIHZhcnMsIHRoZWRhdGEpID09CiAgICAgICAgTlVMTCkgewogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJyZWdpc3RlcmVkIGFuIGVudHJ5XG4iKSk7CiAgICB2YXJzID0gTlVMTDsKCiAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCmludApsb29rdXBSZXN1bHRzVGFibGVfYWRkKHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnNfbGlzdCA9IE5VTEw7CiAgICBzdHJ1Y3QgbG9va3VwUmVzdWx0c1RhYmxlX2RhdGEgKnAgPSBOVUxMOwogICAgcCA9IHRoZWRhdGEtPlJlc3VsdHNUYWJsZTsKICAgIGlmICh0aGVkYXRhLT5SZXN1bHRzVGFibGUgIT0gTlVMTCkKICAgICAgICBkbyB7CiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+bG9va3VwQ3RsT3duZXJJbmRleCwgcC0+bG9va3VwQ3RsT3duZXJJbmRleExlbik7ICAvKiBsb29rdXBDdGxPd25lckluZGV4ICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwgcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbik7ICAgIC8qIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZwLT5sb29rdXBSZXN1bHRzSW5kZXgsIHNpemVvZihwLT5sb29rdXBSZXN1bHRzSW5kZXgpKTsgICAgICAgLyogbG9va3VwUmVzdWx0c0luZGV4ICovCgoKICAgICAgICAgICAgREVCVUdNU0dUTCgoImxvb2t1cFJlc3VsdHNUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEKICAgICAgICAgICAgICAgICgmbG9va3VwUmVzdWx0c1RhYmxlU3RvcmFnZSwgdmFyc19saXN0LCBwKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBSZXN1bHRzVGFibGUiLCAib3V0IGZpbmlzaGVkXG4iKSk7CiAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgIHAgPSBwLT5uZXh0OwogICAgICAgIH0gd2hpbGUgKHAgIT0gTlVMTCk7CgoKICAgIERFQlVHTVNHVEwoKCJsb29rdXBSZXN1bHRzVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCnZvaWQKbG9va3VwQ3RsVGFibGVfY2xlYW5lcihzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRoZXN0dWZmKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0ciA9IE5VTEw7CiAgICBzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqU3RvcmFnZURlbCA9IE5VTEw7CiAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLCAiY2xlYW5lcm91dCAgIikpOwogICAgZm9yIChoY2lwdHIgPSB0aGVzdHVmZjsgaGNpcHRyICE9IE5VTEw7IGhjaXB0ciA9IGhjaXB0ci0+bmV4dCkgewogICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIGhjaXB0cik7CiAgICAgICAgaWYgKFN0b3JhZ2VEZWwgIT0gTlVMTCkgewogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPmxvb2t1cEN0bE93bmVySW5kZXgpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT5sb29rdXBDdGxPd25lckluZGV4ID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3MgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICBTdG9yYWdlRGVsID0gTlVMTDsKCiAgICAgICAgfQogICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJjbGVhbmVyICAiKSk7CiAgICB9Cn0KCi8qCiAqIHBhcnNlX2xvb2t1cEN0bFRhYmxlKCk6CiAqICAgcGFyc2VzIC5jb25mIGZpbGUgZW50cmllcyBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSBtaWIuCiAqLwp2b2lkCnBhcnNlX2xvb2t1cEN0bFRhYmxlKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBzaXplX3QgICAgICAgICAgdG1waW50OwogICAgc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPQogICAgICAgIFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBUYWJsZV9kYXRhKTsKCiAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLCAicGFyc2luZyBjb25maWcuLi4gICIpKTsKCgogICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoIm1hbGxvYyBmYWlsdXJlIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxPd25lckluZGV4TGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT5sb29rdXBDdGxPd25lckluZGV4ID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIGxvb2t1cEN0bE93bmVySW5kZXgiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciBsb29rdXBDdGxPcGVyYXRpb25OYW1lIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3NUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzTGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIGxvb2t1cEN0bFRhcmdldEFkZHJlc3MiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+bG9va3VwQ3RsT3BlclN0YXR1cywgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRpbWUsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJjLCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMsICZ0bXBpbnQpOwoKCiAgICBTdG9yYWdlVG1wLT5zdG9yYWdldHlwZSA9IFNUX05PTlZPTEFUSUxFOwogICAgbG9va3VwQ3RsVGFibGVfYWRkKFN0b3JhZ2VUbXApOwogICAgLyogbG9va3VwQ3RsVGFibGVfY2xlYW5lcihsb29rdXBDdGxUYWJsZVN0b3JhZ2UpOyAqLwoKICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJkb25lLlxuIikpOwp9CgoKCi8qCiAqIHN0b3JlX2xvb2t1cEN0bFRhYmxlKCk6CiAqICAgc3RvcmVzIC5jb25mIGZpbGUgZW50cmllcyBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSBtaWIuCiAqLwppbnQKc3RvcmVfbG9va3VwQ3RsVGFibGUoaW50IG1ham9ySUQsIGludCBtaW5vcklELCB2b2lkICpzZXJ2ZXJhcmcsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsaWVudGFyZykKewogICAgY2hhciAgICAgICAgICAgIGxpbmVbU05NUF9NQVhCVUZdOwogICAgY2hhciAgICAgICAgICAgKmNwdHI7CiAgICBzaXplX3QgICAgICAgICAgdG1waW50OwogICAgc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXA7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaW5kZXg7CgoKICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJzdG9yaW5nIGRhdGEuLi4gICIpKTsKCgogICAgZm9yIChoY2luZGV4ID0gbG9va3VwQ3RsVGFibGVTdG9yYWdlOyBoY2luZGV4ICE9IE5VTEw7CiAgICAgICAgIGhjaW5kZXggPSBoY2luZGV4LT5uZXh0KSB7CiAgICAgICAgU3RvcmFnZVRtcCA9IChzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqKSBoY2luZGV4LT5kYXRhOwoKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+c3RvcmFnZXR5cGUgIT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICAgICAgbWVtc2V0KGxpbmUsIDAsIHNpemVvZihsaW5lKSk7CiAgICAgICAgICAgIHN0cmNhdChsaW5lLCAibG9va3VwQ3RsVGFibGUgIik7CiAgICAgICAgICAgIGNwdHIgPSBsaW5lICsgc3RybGVuKGxpbmUpOwoKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+bG9va3VwQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBDdGxPd25lckluZGV4TGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwQ3RsVGFyZ2V0QWRkcmVzc0xlbik7CgogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxPcGVyU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxSYywgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgoKCiAgICAgICAgICAgIHNubXBkX3N0b3JlX2NvbmZpZyhsaW5lKTsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgoKCi8qCiAqIHZhcl9sb29rdXBDdGxUYWJsZSgpOgogKiAgIEhhbmRsZSB0aGlzIHRhYmxlIHNlcGFyYXRlbHkgZnJvbSB0aGUgc2NhbGFyIHZhbHVlIGNhc2UuCiAqICAgVGhlIHdvcmtpbmdzIG9mIHRoaXMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBmb3IgdmFyX210ZU9iamVjdHNUYWJsZSBhYm92ZS4KICovCnVuc2lnbmVkIGNoYXIgICoKdmFyX2xvb2t1cEN0bFRhYmxlKHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsZW5ndGgsCiAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CgoKICAgIHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKCiAgICAvKgogICAgICogdGhpcyBhc3N1bWVzIHlvdSBoYXZlIHJlZ2lzdGVyZWQgYWxsIHlvdXIgZGF0YSBwcm9wZXJseQogICAgICovCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleChsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LAogICAgICAgICAgICAgICAgICAgICAgICB2YXJfbGVuLCB3cml0ZV9tZXRob2QpKSA9PSBOVUxMKSB7CiAgICAgICAgaWYgKHZwLT5tYWdpYyA9PSBDT0xVTU5fTE9PS1VQQ1RMUk9XU1RBVFVTKQogICAgICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfbG9va3VwQ3RsUm93U3RhdHVzOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qCiAgICAgKiB0aGlzIGlzIHdoZXJlIHdlIGRvIHRoZSB2YWx1ZSBhc3NpZ25tZW50cyBmb3IgdGhlIG1pYiByZXN1bHRzLgogICAgICovCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewoKCiAgICBjYXNlIENPTFVNTl9MT09LVVBDVExUQVJHRVRBRERSRVNTVFlQRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfbG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGUpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CgogICAgY2FzZSBDT0xVTU5fTE9PS1VQQ1RMVEFSR0VUQUREUkVTUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfbG9va3VwQ3RsVGFyZ2V0QWRkcmVzczsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzczsKCiAgICBjYXNlIENPTFVNTl9MT09LVVBDVExPUEVSU1RBVFVTOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPmxvb2t1cEN0bE9wZXJTdGF0dXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bE9wZXJTdGF0dXM7CgogICAgY2FzZSBDT0xVTU5fTE9PS1VQQ1RMVElNRToKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT5sb29rdXBDdGxUaW1lKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5sb29rdXBDdGxUaW1lOwoKICAgIGNhc2UgQ09MVU1OX0xPT0tVUENUTFJDOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJjKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5sb29rdXBDdGxSYzsKCiAgICBjYXNlIENPTFVNTl9MT09LVVBDVExST1dTVEFUVVM6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX2xvb2t1cEN0bFJvd1N0YXR1czsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1czsKCiAgICBkZWZhdWx0OgogICAgICAgIEVSUk9SX01TRygiIik7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKCnZvaWQKcnVuX2xvb2t1cChzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqaXRlbSkKewoKICAgIGxvbmcgICAgICAgICAgICBhZGRyZXNzVHlwZTsKICAgIGNoYXIgICAgICAgICAgICphZGRyZXNzID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBhZGRyZXNzbGVuOwogICAgc3RydWN0IGxvb2t1cFJlc3VsdHNUYWJsZV9kYXRhICpjdXJyZW50ID0gTlVMTDsKICAgIHN0cnVjdCBsb29rdXBSZXN1bHRzVGFibGVfZGF0YSAqdGVtcCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgaSA9IDAsIG4gPSAxLCB0ID0gMDsKCiAgICAvKiBmb3IgaXB2NCxpcHY2ICovCiAgICB1bnNpZ25lZCBpbnQgICAgYWRkcl9pbiwgYWRkcl9pbjY7CiAgICBzdHJ1Y3QgaG9zdGVudCAqbG9va3VwID0gTlVMTDsKCiAgICBzdHJ1Y3QgdGltZXZhbCAgdHBzdGFydCwgdHBlbmQ7CiAgICB1bnNpZ25lZCBsb25nICAgdGltZXVzZSwgdGltZXVzZTQsIHRpbWV1c2U2OwoKICAgIC8qIGZvciBkbnMgKi8KCiAgICBzdHJ1Y3QgaW5fYWRkciAgYTsKICAgIHN0cnVjdCBpbjZfYWRkciBhNjsKCiAgICBpZiAoaXRlbSA9PSBOVUxMKQogICAgICAgIHJldHVybjsKCiAgICBhZGRyZXNzVHlwZSA9IChsb25nKSBpdGVtLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzVHlwZTsKICAgIGFkZHJlc3NsZW4gPSAoc2l6ZV90KSBpdGVtLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzTGVuOwogICAgYWRkcmVzcyA9IChjaGFyICopIG1hbGxvYyhhZGRyZXNzbGVuICsgMSk7CiAgICBtZW1jcHkoYWRkcmVzcywgaXRlbS0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzcywgYWRkcmVzc2xlbiArIDEpOwogICAgYWRkcmVzc1thZGRyZXNzbGVuXSA9ICdcMCc7CgogICAgaWYgKGFkZHJlc3NUeXBlID09IDEpIHsKICAgICAgICBhZGRyX2luID0gaW5ldF9hZGRyKGFkZHJlc3MpOwogICAgICAgIGlmIChhZGRyX2luID09IDB4ZmZmZmZmZmYKICAgICAgICAgICAgJiYgc3RyY21wKGFkZHJlc3MsICIyNTUuMjU1LjI1NS4yNTUiKSAhPSAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBSZXN1bHRzVGFibGUiLCAiSW52YWxpZCBhcmd1bWVudDogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZ2V0dGltZW9mZGF5KCZ0cHN0YXJ0LCBOVUxMKTsKICAgICAgICBsb29rdXAgPSBnZXRob3N0YnlhZGRyKChjaGFyICopICZhZGRyX2luLCA0LCBBRl9JTkVUKTsKICAgICAgICBnZXR0aW1lb2ZkYXkoJnRwZW5kLCBOVUxMKTsKICAgICAgICB0aW1ldXNlID0gMTAwMDAwMCAqICh0cGVuZC50dl9zZWMgLSB0cHN0YXJ0LnR2X3NlYykgKwogICAgICAgICAgICB0cGVuZC50dl91c2VjIC0gdHBzdGFydC50dl91c2VjOwogICAgICAgIHRpbWV1c2UgLz0gMTAwMDsKICAgICAgICBtb2RpZnlfbG9va3VwQ3RsVGltZShpdGVtLCB0aW1ldXNlKTsKICAgICAgICBtb2RpZnlfbG9va3VwQ3RsT3BlclN0YXR1cyhpdGVtLCAzbCk7CgogICAgICAgIGlmIChsb29rdXAgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IGEgbmV0d29yayBob3N0IGVudHJ5IGZvciBpcHY0IGFkZHJlc3M6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKSk7CiAgICAgICAgICAgIG1vZGlmeV9sb29rdXBDdGxSYyhpdGVtLCAxbCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtb2RpZnlfbG9va3VwQ3RsUmMoaXRlbSwgMGwpOwogICAgICAgICAgICBpZiAobG9va3VwLT5oX25hbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY3VycmVudCA9IHRlbXAgPQogICAgICAgICAgICAgICAgICAgIFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBSZXN1bHRzVGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNJbmRleCA9IG47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4W2l0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc1R5cGUgPSAxNjsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGxvb2t1cC0+aF9uYW1lKSArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzLCBsb29rdXAtPmhfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4obG9va3VwLT5oX25hbWUpICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc1tzdHJsZW4obG9va3VwLT5oX25hbWUpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc0xlbiA9IHN0cmxlbihsb29rdXAtPmhfbmFtZSk7CiAgICAgICAgICAgICAgICBpdGVtLT5SZXN1bHRzVGFibGUgPSB0ZW1wOwogICAgICAgICAgICAgICAgbiA9IG4gKyAxOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChsb29rdXAtPmhfYWxpYXNlc1tpXSkgewogICAgICAgICAgICAgICAgdGVtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBSZXN1bHRzVGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleFtpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0luZGV4ID0gbjsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzVHlwZSA9IDE2OwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4obG9va3VwLT5oX2FsaWFzZXNbaV0pICsgMSk7CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MsIGxvb2t1cC0+aF9hbGlhc2VzW2ldLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihsb29rdXAtPmhfYWxpYXNlc1tpXSkgKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzW3N0cmxlbihsb29rdXAtPmhfYWxpYXNlc1tpXSldID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgIHN0cmxlbihsb29rdXAtPmhfYWxpYXNlc1tpXSk7CiAgICAgICAgICAgICAgICBjdXJyZW50LT5uZXh0ID0gdGVtcDsKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0ZW1wOwogICAgICAgICAgICAgICAgaSA9IGkgKyAxOwogICAgICAgICAgICAgICAgbiA9IG4gKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnQtPm5leHQgPSBOVUxMOwoKICAgICAgICB9CgoKICAgICAgICBpZiAoaXRlbS0+UmVzdWx0c1RhYmxlICE9IE5VTEwpCiAgICAgICAgICAgIGlmIChsb29rdXBSZXN1bHRzVGFibGVfYWRkKGl0ZW0pICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBSZXN1bHRzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKCiAgICAgICAgU05NUF9GUkVFKGFkZHJlc3MpOwogICAgICAgIGFkZHJlc3MgPSBOVUxMOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBlbHNlIGlmIChhZGRyZXNzVHlwZSA9PSAxNikgewoKICAgICAgICBnZXR0aW1lb2ZkYXkoJnRwc3RhcnQsIE5VTEwpOwogICAgICAgIGxvb2t1cCA9IGdldGhvc3RieW5hbWUoYWRkcmVzcyk7CiAgICAgICAgZ2V0dGltZW9mZGF5KCZ0cGVuZCwgTlVMTCk7CiAgICAgICAgdGltZXVzZTQgPSAxMDAwMDAwICogKHRwZW5kLnR2X3NlYyAtIHRwc3RhcnQudHZfc2VjKSArCiAgICAgICAgICAgIHRwZW5kLnR2X3VzZWMgLSB0cHN0YXJ0LnR2X3VzZWM7CiAgICAgICAgdGltZXVzZTQgLz0gMTAwMDsKICAgICAgICBpZiAobG9va3VwID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImxvb2t1cEN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGdldCBhIG5ldHdvcmsgaG9zdCBlbnRyeSBmb3IgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGlsZSAoKmxvb2t1cC0+aF9hZGRyX2xpc3QpIHsKICAgICAgICAgICAgICAgIGJjb3B5KCpsb29rdXAtPmhfYWRkcl9saXN0KyssIChjaGFyICopICZhLCBzaXplb2YoYSkpOwoKICAgICAgICAgICAgICAgIHRlbXAgPSBTTk1QX01BTExPQ19TVFJVQ1QobG9va3VwUmVzdWx0c1RhYmxlX2RhdGEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzSW5kZXggPSBuOwoKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleFtpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZVtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuOwoKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzVHlwZSA9IDE7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihpbmV0X250b2EoYSkpICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MsIGluZXRfbnRvYShhKSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKGEpKSArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3Nbc3RybGVuKGluZXRfbnRvYShhKSldID0gJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzTGVuID0gc3RybGVuKGluZXRfbnRvYShhKSk7CiAgICAgICAgICAgICAgICBpZiAobiA9PSAxKQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPlJlc3VsdHNUYWJsZSA9IHRlbXA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+bmV4dCA9IHRlbXA7CiAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGVtcDsKICAgICAgICAgICAgICAgIG4gPSBuICsgMTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VycmVudC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgIHQgPSBuOwoKICAgICAgICB9CgogICAgICAgIHN0cnVjdCBob3N0ZW50ICpocDsKICAgICAgICBjaGFyICAgICAgICAgICAgcGFbNjRdOwogICAgICAgIGNoYXIgICAgICAgICAgICpob3N0bmFtZSA9IE5VTEw7CgogICAgICAgIGdldHRpbWVvZmRheSgmdHBzdGFydCwgTlVMTCk7CiAgICAgICAgaHAgPSBnZXRob3N0YnluYW1lMihhZGRyZXNzLCBBRl9JTkVUNik7CiAgICAgICAgZ2V0dGltZW9mZGF5KCZ0cGVuZCwgTlVMTCk7CiAgICAgICAgdGltZXVzZTYgPSAxMDAwMDAwICogKHRwZW5kLnR2X3NlYyAtIHRwc3RhcnQudHZfc2VjKSArCiAgICAgICAgICAgIHRwZW5kLnR2X3VzZWMgLSB0cHN0YXJ0LnR2X3VzZWM7CiAgICAgICAgdGltZXVzZTYgLz0gMTAwMDsKCiAgICAgICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImxvb2t1cEN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGdldCBhIGlwdjYgbmV0d29yayBob3N0IGVudHJ5IGZvciAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdoaWxlICgqaHAtPmhfYWRkcl9saXN0KSB7CiAgICAgICAgICAgICAgICBtZW1tb3ZlKChjYWRkcl90KSAmIGE2LCAqaHAtPmhfYWRkcl9saXN0KyssIDE2KTsKICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gKGNoYXIgKikgaHAtPmhfbmFtZTsKCiAgICAgICAgICAgICAgICB0ZW1wID0gU05NUF9NQUxMT0NfU1RSVUNUKGxvb2t1cFJlc3VsdHNUYWJsZV9kYXRhKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0luZGV4ID0gbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4ID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXhbaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4TGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuOwoKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZVtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuOwoKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzVHlwZSA9IDI7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikKICAgICAgICAgICAgICAgICAgICBtYWxsb2Moc3RybGVuKGluZXRfbnRvcChBRl9JTkVUNiwgJmE2LCBwYSwgNjQpKSArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVUNiwgJmE2LCBwYSwgNjQpLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b3AoQUZfSU5FVDYsICZhNiwgcGEsIDY0KSkgKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPgogICAgICAgICAgICAgICAgICAgIGxvb2t1cFJlc3VsdHNBZGRyZXNzW3N0cmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LCAmYTYsIHBhLCA2NCkpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc0xlbiA9CiAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvcChBRl9JTkVUNiwgJmE2LCBwYSwgNjQpKTsKICAgICAgICAgICAgICAgIGlmIChuID09IDEpCiAgICAgICAgICAgICAgICAgICAgaXRlbS0+UmVzdWx0c1RhYmxlID0gdGVtcDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5uZXh0ID0gdGVtcDsKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0ZW1wOwogICAgICAgICAgICAgICAgbiA9IG4gKyAxOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50LT5uZXh0ID0gTlVMTDsKICAgICAgICB9CiAgICAgICAgdGltZXVzZSA9IHRpbWV1c2U0ICsgdGltZXVzZTY7CiAgICAgICAgbW9kaWZ5X2xvb2t1cEN0bFRpbWUoaXRlbSwgdGltZXVzZSk7CiAgICAgICAgbW9kaWZ5X2xvb2t1cEN0bE9wZXJTdGF0dXMoaXRlbSwgM2wpOwoKICAgICAgICBpZiAoaXRlbS0+UmVzdWx0c1RhYmxlICE9IE5VTEwpIHsKCiAgICAgICAgICAgIG1vZGlmeV9sb29rdXBDdGxSYyhpdGVtLCAwbCk7CiAgICAgICAgICAgIGlmIChsb29rdXBSZXN1bHRzVGFibGVfYWRkKGl0ZW0pICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBSZXN1bHRzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtb2RpZnlfbG9va3VwQ3RsUmMoaXRlbSwgMWwpOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoYWRkcmVzcyk7CiAgICAgICAgYWRkcmVzcyA9IE5VTEw7CgogICAgICAgIHJldHVybjsKCiAgICB9CgoKICAgIGVsc2UgaWYgKGFkZHJlc3NUeXBlID09IDIpIHsKICAgICAgICBpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBhZGRyZXNzLCAmYWRkcl9pbjYpID09IDEpCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJzdWNjZXNzISBcbiIpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJlcnJvciEgXG4iKSk7CgoKICAgICAgICBnZXR0aW1lb2ZkYXkoJnRwc3RhcnQsIE5VTEwpOwogICAgICAgIGxvb2t1cCA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikgJmFkZHJfaW42LCAxNiwgQUZfSU5FVDYpOwogICAgICAgIGdldHRpbWVvZmRheSgmdHBlbmQsIE5VTEwpOwogICAgICAgIHRpbWV1c2UgPSAxMDAwMDAwICogKHRwZW5kLnR2X3NlYyAtIHRwc3RhcnQudHZfc2VjKSArCiAgICAgICAgICAgIHRwZW5kLnR2X3VzZWMgLSB0cHN0YXJ0LnR2X3VzZWM7CiAgICAgICAgdGltZXVzZSAvPSAxMDAwOwogICAgICAgIG1vZGlmeV9sb29rdXBDdGxUaW1lKGl0ZW0sIHRpbWV1c2UpOwogICAgICAgIG1vZGlmeV9sb29rdXBDdGxPcGVyU3RhdHVzKGl0ZW0sIDNsKTsKCiAgICAgICAgaWYgKGxvb2t1cCA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBnZXQgYSBuZXR3b3JrIGhvc3QgZW50cnkgZm9yICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKSk7CiAgICAgICAgICAgIG1vZGlmeV9sb29rdXBDdGxSYyhpdGVtLCAxbCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtb2RpZnlfbG9va3VwQ3RsUmMoaXRlbSwgMGwpOwogICAgICAgICAgICBpZiAobG9va3VwLT5oX25hbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY3VycmVudCA9IHRlbXAgPQogICAgICAgICAgICAgICAgICAgIFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBSZXN1bHRzVGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNJbmRleCA9IG47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4W2l0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc1R5cGUgPSAxNjsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGxvb2t1cC0+aF9uYW1lKSArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzLCBsb29rdXAtPmhfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4obG9va3VwLT5oX25hbWUpICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc1tzdHJsZW4obG9va3VwLT5oX25hbWUpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc0xlbiA9IHN0cmxlbihsb29rdXAtPmhfbmFtZSk7CiAgICAgICAgICAgICAgICBpdGVtLT5SZXN1bHRzVGFibGUgPSB0ZW1wOwogICAgICAgICAgICAgICAgbiA9IG4gKyAxOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChsb29rdXAtPmhfYWxpYXNlc1tpXSkgewogICAgICAgICAgICAgICAgdGVtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBSZXN1bHRzVGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleFtpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0luZGV4ID0gbjsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzVHlwZSA9IDE2OwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4obG9va3VwLT5oX2FsaWFzZXNbaV0pICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MsIGxvb2t1cC0+aF9hbGlhc2VzW2ldLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihsb29rdXAtPmhfYWxpYXNlc1tpXSkgKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzW3N0cmxlbihsb29rdXAtPmhfYWxpYXNlc1tpXSldID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgIHN0cmxlbihsb29rdXAtPmhfYWxpYXNlc1tpXSk7CiAgICAgICAgICAgICAgICBjdXJyZW50LT5uZXh0ID0gdGVtcDsKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0ZW1wOwogICAgICAgICAgICAgICAgaSA9IGkgKyAxOwogICAgICAgICAgICAgICAgbiA9IG4gKyAxOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGl0ZW0tPlJlc3VsdHNUYWJsZSAhPSBOVUxMKQogICAgICAgICAgICAgICAgY3VycmVudC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBOVUxMOwoKICAgICAgICB9CgoKICAgICAgICBpZiAoaXRlbS0+UmVzdWx0c1RhYmxlICE9IE5VTEwpCiAgICAgICAgICAgIGlmIChsb29rdXBSZXN1bHRzVGFibGVfYWRkKGl0ZW0pICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBSZXN1bHRzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKICAgICAgICBTTk1QX0ZSRUUoYWRkcmVzcyk7CiAgICAgICAgYWRkcmVzcyA9IE5VTEw7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBTTk1QX0ZSRUUoYWRkcmVzcyk7CiAgICAgICAgYWRkcmVzcyA9IE5VTEw7CiAgICAgICAgcmV0dXJuOwogICAgfQp9CgoKaW50Cm1vZGlmeV9sb29rdXBDdGxPcGVyU3RhdHVzKHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICp0aGVkYXRhLCBsb25nIHZhbCkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT5sb29rdXBDdGxPd25lckluZGV4LCB0aGVkYXRhLT5sb29rdXBDdGxPd25lckluZGV4TGVuKTsgICAvKiBsb29rdXBDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLCB0aGVkYXRhLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuKTsgICAgIC8qIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgKi8KCgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0KGxvb2t1cEN0bFRhYmxlU3RvcmFnZSwgdmFycykpID09IE5VTEwpIHsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsKICAgIH0KICAgIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bE9wZXJTdGF0dXMgPSB2YWw7CgogICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICB2YXJzID0gTlVMTDsKCiAgICBERUJVR01TR1RMKCgibG9va3VwT3BlclN0YXR1cyIsICJkb25lLlxuIikpOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKaW50Cm1vZGlmeV9sb29rdXBDdGxUaW1lKHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICp0aGVkYXRhLCB1bnNpZ25lZCBsb25nIHZhbCkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT5sb29rdXBDdGxPd25lckluZGV4LCB0aGVkYXRhLT5sb29rdXBDdGxPd25lckluZGV4TGVuKTsgICAvKiBsb29rdXBDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLCB0aGVkYXRhLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuKTsgICAgIC8qIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgKi8KCgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0KGxvb2t1cEN0bFRhYmxlU3RvcmFnZSwgdmFycykpID09IE5VTEwpIHsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsKICAgIH0KICAgIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRpbWUgPSB2YWw7CgogICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICB2YXJzID0gTlVMTDsKCiAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGltZSIsICJkb25lLlxuIikpOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKaW50Cm1vZGlmeV9sb29rdXBDdGxSYyhzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqdGhlZGF0YSwgbG9uZyB2YWwpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+bG9va3VwQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+bG9va3VwQ3RsT3duZXJJbmRleExlbik7ICAgLyogbG9va3VwQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwgdGhlZGF0YS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbik7ICAgICAvKiBsb29rdXBDdGxPcGVyYXRpb25OYW1lICovCgoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldChsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIHZhcnMpKSA9PSBOVUxMKSB7CiAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7CiAgICB9CiAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxSYyA9IHZhbDsKCiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgIHZhcnMgPSBOVUxMOwogICAgREVCVUdNU0dUTCgoImxvb2t1cE9wZXJTdGF0dXMiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgppbnQKbG9va3VwUmVzdWx0c1RhYmxlX2RlbChzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgIHN0cnVjdCBsb29rdXBSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZURlbCA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT5sb29rdXBDdGxPd25lckluZGV4LCB0aGVkYXRhLT5sb29rdXBDdGxPd25lckluZGV4TGVuKTsgICAvKiBsb29rdXBDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLCB0aGVkYXRhLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuKTsgICAgIC8qIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgKi8KICAgIGJ6ZXJvKG5ld29pZCwgTUFYX09JRF9MRU4gKiBzaXplb2Yob2lkKSk7CiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgoKICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgdmFycyA9IE5VTEw7CiAgICBmb3IgKGhjaXB0cjIgPSBsb29rdXBSZXN1bHRzVGFibGVTdG9yYWdlOyBoY2lwdHIyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLCBuZXdvaWRfbGVuKQogICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmbG9va3VwUmVzdWx0c1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyMik7CiAgICAgICAgICAgIGlmIChTdG9yYWdlRGVsICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIFNOTVBfRlJFRShTdG9yYWdlRGVsLT5sb29rdXBDdGxPd25lckluZGV4KTsKICAgICAgICAgICAgICAgIFNOTVBfRlJFRShTdG9yYWdlRGVsLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lKTsKICAgICAgICAgICAgICAgIFNOTVBfRlJFRShTdG9yYWdlRGVsLT5sb29rdXBSZXN1bHRzQWRkcmVzcyk7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0dUTCgoImxvb2t1cFJlc3VsdHNUYWJsZSIsICJkZWxldGUgIHN1Y2Nlc3MhXG4iKSk7CgogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgppbnQKd3JpdGVfbG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLSAoc2l6ZW9mKGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleChsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZihsb29rdXBDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZXR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+bG9va3VwQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIGxvb2t1cEN0bFRhcmdldEFkZHJlc3NUeXBlIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3NUeXBlOwogICAgICAgIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3NUeXBlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgppbnQKd3JpdGVfbG9va3VwQ3RsVGFyZ2V0QWRkcmVzcyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIGNoYXIgICAgKnRtcHZhciA9IE5VTEw7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wbGVuOwogICAgc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLSAoc2l6ZW9mKGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KGxvb2t1cEN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdldHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gbG9va3VwQ3RsVGFyZ2V0QWRkcmVzcyBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBsb25nX3JldCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3M7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc0xlbjsKCiAgICAgICAgaWYgKChTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzID0KICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzLCB2YXJfdmFsLCB2YXJfdmFsX2xlbik7CiAgICAgICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1t2YXJfdmFsX2xlbl0gPSAnXDAnOwogICAgICAgIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3NMZW4gPSB2YXJfdmFsX2xlbjsKCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIGZyZWUoU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICAgICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzcyA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzcyA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzTGVuID0gdG1wbGVuOwoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KCiAgICAgICAgZnJlZSh0bXB2YXIpOwogICAgICAgIHRtcHZhciA9IE5VTEw7CgogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCgoKaW50CndyaXRlX2xvb2t1cEN0bFJvd1N0YXR1cyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzdGF0aWMgc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKlN0b3JhZ2VOZXcsICpTdG9yYWdlRGVsID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0gKHNpemVvZihsb29rdXBDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgICAzIC0gMSk7CiAgICBzdGF0aWMgaW50ICAgICAgb2xkX3ZhbHVlOwogICAgaW50ICAgICAgICAgICAgIHNldF92YWx1ZTsKICAgIHN0YXRpYyBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMsICp2cDsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyID0gTlVMTDsKCiAgICBTdG9yYWdlVG1wID0KICAgICAgICBoZWFkZXJfY29tcGxleChsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwgTlVMTCk7CgogICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUiB8fCB2YXJfdmFsID09IE5VTEwpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAid3JpdGUgdG8gbG9va3VwQ3RsUm93U3RhdHVzIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgIH0KICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2V0eXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHNldF92YWx1ZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CgoKICAgIC8qCiAgICAgKiBjaGVjayBsZWdhbCByYW5nZSwgYW5kIG5vdFJlYWR5IGlzIHJlc2VydmVkIGZvciB1cywgbm90IGEgdXNlciAKICAgICAqLwogICAgaWYgKHNldF92YWx1ZSA8IDEgfHwgc2V0X3ZhbHVlID4gNiB8fCBzZXRfdmFsdWUgPT0gUlNfTk9UUkVBRFkpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwoKCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICAvKgogICAgICAgICAqIHN0YWdlIG9uZTogdGVzdCB2YWxpZGl0eSAKICAgICAgICAgKi8KICAgICAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGNyZWF0ZSB0aGUgcm93IG5vdz8gCiAgICAgICAgICAgICAqLwoKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRpdGNoIGlsbGVnYWwgdmFsdWVzIG5vdyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQUNUSVZFIHx8IHNldF92YWx1ZSA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRlc3Ryb3lpbmcgYSBub24tZXhpc3RlbnQgcm93IGlzIGFjdHVhbGx5IGxlZ2FsIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlsbGVnYWwgY3JlYXRpb24gdmFsdWVzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19BQ1RJVkUgfHwgc2V0X3ZhbHVlID09IFJTX05PVElOU0VSVklDRSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGV4aXN0cy4gIENoZWNrIGZvciBhIHZhbGlkIHN0YXRlIGNoYW5nZSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQ1JFQVRFQU5ER08KICAgICAgICAgICAgICAgIHx8IHNldF92YWx1ZSA9PSBSU19DUkVBVEVBTkRXQUlUKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogY2FuJ3QgY3JlYXRlIGEgcm93IHRoYXQgZXhpc3RzIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogaW50ZXJhY3Rpb24gd2l0aCByb3cgc3RvcmFnZSB0eXBlIG5lZWRlZCAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+bG9va3VwQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSAmJgogICAgICAgICAgICAgICAgc2V0X3ZhbHVlICE9IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAiT25jZSBtYWRlIGFjdGl2ZSBhbiBlbnRyeSBtYXkgbm90IGJlIG1vZGlmaWVkIGV4Y2VwdCB0byAKICAgICAgICAgICAgICAgICAqIGRlbGV0ZSBpdC4iICBYWFg6IGRvZXNuJ3QgdGhpcyBpbiBmYWN0IGFwcGx5IHRvIEFMTAogICAgICAgICAgICAgICAgICogY29sdW1ucyBvZiB0aGUgdGFibGUgYW5kIG5vdCBqdXN0IHRoaXMgb25lPyAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+c3RvcmFnZXR5cGUgIT0gU1RfTk9OVk9MQVRJTEUpCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGNyZWF0aW9uIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXJzID0gTlVMTDsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIL2rbmFtZc6qv9W1xMj9uPbL99L919a2zrzTtb12YXKx5MG/wdCx7bXExKnOsiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIE5VTEwsIDApOyAgLyogbG9va3VwQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCBOVUxMLCAwKTsgIC8qIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgKi8KCiAgICAgICAgICAgIGlmIChoZWFkZXJfY29tcGxleF9wYXJzZV9vaWQKICAgICAgICAgICAgICAgICgmCiAgICAgICAgICAgICAgICAgKG5hbWUKICAgICAgICAgICAgICAgICAgW3NpemVvZihsb29rdXBDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgIDJdKSwgbmV3bGVuLCB2YXJzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICAgICAgICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZwID0gdmFyczsKICAgICAgICAgICAgU3RvcmFnZU5ldyA9IGNyZWF0ZV9sb29rdXBUYWJsZV9kYXRhKCk7CiAgICAgICAgICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bE93bmVySW5kZXggPSBtYWxsb2ModnAtPnZhbF9sZW4gKyAxKTsKICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VOZXctPmxvb2t1cEN0bE93bmVySW5kZXgsIHZwLT52YWwuc3RyaW5nLAogICAgICAgICAgICAgICAgICAgdnAtPnZhbF9sZW4pOwogICAgICAgICAgICBTdG9yYWdlTmV3LT5sb29rdXBDdGxPd25lckluZGV4W3ZwLT52YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gPSB2cC0+dmFsX2xlbjsKICAgICAgICAgICAgdnAgPSB2cC0+bmV4dF92YXJpYWJsZTsKCiAgICAgICAgICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgPSBtYWxsb2ModnAtPnZhbF9sZW4gKyAxKTsKICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VOZXctPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUsIHZwLT52YWwuc3RyaW5nLAogICAgICAgICAgICAgICAgICAgdnAtPnZhbF9sZW4pOwogICAgICAgICAgICBTdG9yYWdlTmV3LT5sb29rdXBDdGxPcGVyYXRpb25OYW1lW3ZwLT52YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gPSB2cC0+dmFsX2xlbjsKICAgICAgICAgICAgdnAgPSB2cC0+bmV4dF92YXJpYWJsZTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZmlsbCBpbiBkZWZhdWx0IHJvdyB2YWx1ZXMgaGVyZSBpbnRvIFN0b3JhZ2VOZXcgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgU3RvcmFnZU5ldy0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPSAxOyAvKiBpcHY0ICovCgogICAgICAgICAgICBTdG9yYWdlTmV3LT5sb29rdXBDdGxSb3dTdGF0dXMgPSBzZXRfdmFsdWU7CgogICAgICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICAgICAgdmFycyA9IE5VTEw7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycywgbm8gbG9uZ2VyIG5lZWRlZD8gCiAgICAgICAgICAgICAqLwogICAgICAgIH0KCgogICAgICAgIGJyZWFrOwoKCgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFhYWDogZnJlZSwgemVybyB2YXJzIAogICAgICAgICAqLwogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gc2V0X3ZhbHVlIGZvciB5b3UgdG8KICAgICAgICAgKiB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluCiAgICAgICAgICogdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KCgogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGNyZWF0aW9uLCBzbyBhZGQgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChTdG9yYWdlTmV3ICE9IE5VTEwpCiNpZiAxCiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX2xvb2t1cEN0bFJvd1N0YXR1cyBlbnRlcmluZyBuZXc9JWQuLi4gIFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbikpOwojZW5kaWYKICAgICAgICAgICAgbG9va3VwQ3RsVGFibGVfYWRkKFN0b3JhZ2VOZXcpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGFjaywgYW5kIGlmIGl0IGlzIE5VTEw/IAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgaWYgKHNldF92YWx1ZSAhPSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHNldCB0aGUgZmxhZz8gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbGRfdmFsdWUgPSBTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXM7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1cyA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZGVzdHJveS4uLiAgZXh0cmFjdCBpdCBmb3Igbm93IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgREVCVUdNU0dUTCgoImxvb2t1cEN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX2xvb2t1cEN0bFRhYmxlX2RlbGV0ZSAxIFxuIikpOwogICAgICAgICAgICBoY2lwdHIgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZmluZF9lbnRyeShsb29rdXBDdGxUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXApOwoKICAgICAgICAgICAgU3RvcmFnZURlbCA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZsb29rdXBDdGxUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cik7CiAgICAgICAgICAgIGxvb2t1cFJlc3VsdHNUYWJsZV9kZWwoU3RvcmFnZVRtcCk7CgogICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfbG9va3VwQ3RsVGFibGVfZGVsZXRlICBcbiIpKTsKCiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGNyZWF0aW9uLCBzbyByZW1vdmUgaXQgYWdhaW4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBoY2lwdHIgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZmluZF9lbnRyeShsb29rdXBDdGxUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXApOwogICAgICAgICAgICBTdG9yYWdlRGVsID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJmxvb2t1cEN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyKTsKCiAgICAgICAgICAgIGxvb2t1cFJlc3VsdHNUYWJsZV9kZWwoU3RvcmFnZVRtcCk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZyZWUgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgIH0gZWxzZSBpZiAoU3RvcmFnZURlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHJvdyBkZWxldGlvbiwgc28gYWRkIGl0IGFnYWluIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbG9va3VwQ3RsVGFibGVfYWRkKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICBsb29rdXBSZXN1bHRzVGFibGVfYWRkKFN0b3JhZ2VEZWwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1cyA9IG9sZF92YWx1ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChTdG9yYWdlRGVsICE9IE5VTEwpIHsKICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwtPmxvb2t1cEN0bE93bmVySW5kZXgpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT5sb29rdXBDdGxPd25lckluZGV4ID0gTlVMTDsKICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lID0gTlVMTDsKICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3MpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICBTdG9yYWdlRGVsID0gTlVMTDsKCiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPSAwOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZyZWUgaXQsIGl0cyBkZWFkIAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcAogICAgICAgICAgICAgICAgJiYgU3RvcmFnZVRtcC0+bG9va3VwQ3RsUm93U3RhdHVzID09IFJTX0NSRUFURUFOREdPKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMgPSBSU19BQ1RJVkU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoU3RvcmFnZVRtcCAmJgogICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1cyA9PQogICAgICAgICAgICAgICAgICAgICAgIFJTX0NSRUFURUFORFdBSVQpIHsKCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMgPSBSU19OT1RJTlNFUlZJQ0U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+bG9va3VwQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewojaWYgMQogICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfbG9va3VwQ3RsUm93U3RhdHVzIGVudGVyaW5nIHJ1bmJlZm9yZT0lbGQuLi4gIFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGUpKTsKCiNlbmRpZgogICAgICAgICAgICBtb2RpZnlfbG9va3VwQ3RsT3BlclN0YXR1cyhTdG9yYWdlVG1wLCAybCk7CiAgICAgICAgICAgIHJ1bl9sb29rdXAoKHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICopIFN0b3JhZ2VUbXApOwoKICAgICAgICB9CgogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0K