ZGlmZiAtLWdpdCBhL0NIQU5HRUxPRyBiL0NIQU5HRUxPRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTQwNjBmCi0tLSAvZGV2L251bGwKKysrIGIvQ0hBTkdFTE9HCkBAIC0wLDAgKzEsMTIgQEAKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTm90ZXMgZm9yIFUtQm9vdCAxLjAuMDoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBpcyB0aGUgaW5pdGlhbCB2ZXJzaW9uIG9mICJEYXMgVS1Cb290IiwgdGhlIFVuaXZlcnNhbCBCb290IExvYWRlci4KKworSXQgaXMgYmFzZWQgb24gdmVyc2lvbiAyLjAuMCAodGhlICJIYWxsb3dlZW4gUmVsZWFzZSIpIG9mIFBQQ0Jvb3QuCitGb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhpc3Rvcnkgb2YgdGhlIHByb2plY3QgcGxlYXNlIHNlZSB0aGUKK1BQQ0Jvb3QgcHJvamVjdCBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvcHBjYm9vdAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzcwODYKLS0tIC9kZXYvbnVsbAorKysgYi9NQUlOVEFJTkVSUwpAQCAtMCwwICsxLDI0OSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIwkJCQkJCQkJCSMKKyMgUmVndWxhciBNYWludGFpbmVycyBmb3IgVS1Cb290IGJvYXJkIHN1cHBvcnQ6CQkJCSMKKyMJCQkJCQkJCQkjCisjIEZvciBhbnkgYm9hcmQgd2l0aG91dCBwZXJtYW5lbnQgbWFpbnRhaW5lciwgcGxlYXNlIGNvbnRhY3QJCSMKKyMgICAgZm9yIFBvd2VyUEMgc3lzdGVtczoJCQkJCQkjCisjCVdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CQkJCQkjCisjICAgIGZvciBBUk0gc3lzdGVtczoJCQkJCQkJIworIwlNYXJpdXMgR3L2Z2VyIDxtYWdAc3lzZ28uZGU+CQkJCQkjCisjIGFuZCBDYzogdGhlIDxVLUJvb3QtVXNlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PiBtYWlsaW5nIGxpc3RzLgkjCisjCQkJCQkJCQkJIworIyBOb3RlOiBsaXN0cyBzb3J0ZWQgYnkgTWFpbnRhaW5lciBOYW1lCQkJCQkjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIwkJCQkJCQkJCSMKKyMgTWFpbnRhaW5lciBOYW1lLCBFbWFpbCBBZGRyZXNzCQkJCQkjCisjCUJvYXJkCQkJQ1BVCQkJCQkjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0dyZWcgQWxsZW4gPGdhbGxlbkBhcmx1dC51dGV4YXMuZWR1PgorCisJVVRYODI0NQkJCU1QQzgyNDUKKworUGFudGVsaXMgQW50b25pb3UgPHBhbnRvQGludHJhY29tLmdyPgorCisJTkVUVklBCQkJTVBDOHh4CisKK0plcnJ5IFZhbiBCYXJlbiA8dmFuYmFyZW5fZ2VyYWxkQHNpLmNvbT4KKworCXNhY3NuZwkJCU1QQzgyNjAKKworT2xpdmVyIEJyb3duIDxvYnJvd25AYWR2ZW50bmV0d29ya3MuY29tPgorCisJc2JjODI2MAkJCU1QQzgyNjAKKwlndzgyNjAJCQlNUEM4MjYwCisKK0Nvbm4gQ2xhcmsgPGNsYXJrQGVzdGVlbS5jb20+CisKKwlFU1RFRU0xOTJFCQlNUEM4eHgKKworS+FyaSBEYXbt8HNzb24gPGtkQGZsYWdhLmlzPgorCisJRkxBR0FETQkJCU1QQzgyMworCitXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCisJQU1YODYwCQkJTVBDODYwCisJRVRYMDk0CQkJTVBDODUwCisJRlBTODUwTAkJCU1QQzg1MAorCUlDVTg2MgkJCU1QQzg2MgorCUlQODYwCQkJTVBDODYwCisJSVZNTDI0CQkJTVBDODYwCisJSVZNTDI0XzEyOAkJTVBDODYwCisJSVZNTDI0XzI1NgkJTVBDODYwCisJSVZNUzgJCQlNUEM4NjAKKwlJVk1TOF8xMjgJCU1QQzg2MAorCUlWTVM4XzI1NgkJTVBDODYwCisJTEFOVEVDCQkJTVBDODUwCisJUlJ2aXNpb24JCU1QQzgyMworCVNNODUwCQkJTVBDODUwCisJU1BEODIzVFMJCU1QQzgyMworCVRRTTgyM0wJCQlNUEM4MjMKKwlUUU04MjNMX0xDRAkJTVBDODIzCisJVFFNODUwTAkJCU1QQzg1MAorCVRRTTg1NUwJCQlNUEM4NTUKKwlUUU04NjBMCQkJTVBDODYwCisJVFFNODYwTF9GRUMJCU1QQzg2MAorCWMybW9uCQkJTVBDODU1CisJaGVybWVzCQkJTVBDODYwCisJbHdtb24JCQlNUEM4MjMKKwlwY3VfZQkJCU1QQzg1NQorCisJQ1U4MjQJCQlNUEM4MjQwCisJU2FuZHBvaW50ODI0MAkJTVBDODI0MAorCisJQ1BVODYJCQlNUEM4MjYwCisJUE04MjYJCQlNUEM4MjYwCisJVFFNODI2MAkJCU1QQzgyNjAKKworCVBDSVBQQzIJCQlNUEM3NTAKKwlQQ0lQUEM2CQkJTVBDNzUwCisKK0pvbiBEaWVrZW1hIDxkaWVrZW1hX2pvbkBzaS5jb20+CisKKwlzYmM4MjYwCQkJTVBDODI2MAorCitEYXZlIEVsbGlzIDxER0VAc2l4bmV0aW8uY29tPgorCisJU1hOSTg1NVQJCU1QQzh4eAorCitGcmFuayBHb3R0c2NobGluZyA8ZmdvdHRzY2hsaW5nQGVsdGVjLmRlPgorCisJTUhQQwkJCU1QQzh4eAorCisJQkFCN3h4CQkJTVBDNzQwL01QQzc1MAorCitXb2xmZ2FuZyBHcmFuZGVnZ2VyIDx3Z0BkZW54LmRlPgorCisJQ0NNCQkJTVBDODU1CisKKwlQTjYyCQkJTVBDODI0MAorCisJSVBIQVNFNDUzOQkJTVBDODI2MAorCVNDTQkJCU1QQzgyNjAKKworSG93YXJkIEdyYXkgPG12c2Vuc29yQG1hdHJpeC12aXNpb24uZGU+CisKKwlNVlMxCQkJTVBDODIzCisKK011cnJheSBKZW5zZW4gPE11cnJheS5KZW5zZW5AY21zdC5jc2lyby5hdT4KKworCWNvZ2VudF9tcGM4eHgJCU1QQzh4eAorCisJY29nZW50X21wYzgyNjAJCU1QQzgyNjAKKwloeW1vZAkJCU1QQzgyNjAKKworQnJhZCBLZW1wIDxCcmFkLktlbXBAc2VyYW5vYS5jb20+CisKKwlwcG1jODI2MAkJTVBDODI2MAorCitOeWUgTGl1IDxueWV0QHp1bWFuZXR3b3Jrcy5jb20+CisKKwlaVU1BCQkJTVBDN3h4Xzc0eHgKKworVGhvbWFzIExhbmdlIDx0aG9tYXNAY29yZWxhdHVzLmNvbT4KKworCUdUSAkJCU1QQzg2MAorCitFcmFuIE1hbiA8ZXJhbkBuYmFzZS5jby5pbD4KKworCUVWQjY0MjYwXzc1MENYCQlNUEM3NTBDWAorCitTY290dCBNY051dHQgPHNtY251dHRAYXJ0ZXN5bmNwLmNvbT4KKworCUVCT05ZCQkJUFBDNDQwR1AKKworS2VpdGggT3V0d2F0ZXIgPEtlaXRoX091dHdhdGVyQG12aXMuY29tPgorCisJR0VOODYwVAkJCU1QQzg2MFQKKworRnJhbmsgUGFubm8gPGZwYW5ub0BkZWxwaGludGVjaC5jb20+CisKKwllcDgyNjAJCQlNUEM4MjYwCisKK0RlbmlzIFBldGVyIDxkLnBldGVyQG1wbC5jaD4KKworCU1JUDQwNQkJCVBQQzR4eAorCVBJUDQwNQkJCVBQQzR4eAorCitTdGVmYW4gUm9lc2UgPHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tPgorCisJQURDSU9QCQkJSU9QNDgwIChQUEM0MDEpCisJQVI0MDUJCQlQUEM0MDVHUAorCUNBTkJUCQkJUFBDNDA1Q1IKKwlDUENJNDA1CQkJUFBDNDA1R1AKKwlDUENJNDQwCQkJUFBDNDQwR1AKKwlDUENJSVNFUjQJCVBQQzQwNUdQCisJREFTQV9TSU0JCUlPUDQ4MCAoUFBDNDAxKQorCURVNDA1CQkJUFBDNDA1R1AKKwlPQ1JUQwkJCVBQQzQwNUdQCisJT1JTRwkJCVBQQzQwNUdQCisKK1BldGVyIERlIFNjaHJpanZlciA8cDJAbWluZC5iZT4KKworCU1MMgkJCVBQQzR4eAorCitFcmlrIFRoZWlzZW4gPGV0aGVpc2VuQG1pbmRzcHJpbmcuY29tPgorCisJVzdPTE1DCQkJUFBDNHh4CisJVzdPTE1HCQkJUFBDNHh4CisKK0ppbSBUaG9tcHNvbiA8amltQG11c2Vua2kuY29tPgorCisJTVVTRU5LSQkJCU1QQzgyNDUvODI0MQorCVNhbmRwb2ludDgyNDUJCU1QQzgyNDUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVbmtub3duIC8gb3JwaGFuZWQgYm9hcmRzOgorCisJQURTODYwCQkJTVBDOHh4CisJRkFEUzgyMwkJCU1QQzh4eAorCUZBRFM4NTBTQVIJCU1QQzh4eAorCUZBRFM4NjBUCQlNUEM4eHgKKwlHRU5JRVRWCQkJTVBDOHh4CisJSUFEMjEwCQkJTVBDOHh4CisJTUJYCQkJTVBDOHh4CisJTUJYODYwVAkJCU1QQzh4eAorCU5YODIzCQkJTVBDOHh4CisJUlBYQ2xhc3NpYwkJTVBDOHh4CisJUlBYbGl0ZQkJCU1QQzh4eAorCisJQ1JBWUwxCQkJUFBDNHh4CisJRVJJQwkJCVBQQzR4eAorCVdBTE5VVDQwNQkJUFBDNHh4CisKKwlNT1VTU0UJCQlNUEM4MjR4CisKKwlNUEM4MjYwQURTCQlNUEM4MjYwCisJUlBYc3VwZXIJCU1QQzgyNjAKKwlyc2Rwcm90bwkJTVBDODI2MAorCisJRVZCNjQyNjAJCU1QQzd4eF83NHh4CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBUk0gU3lzdGVtczoJCQkJCQkJCSMKKyMJCQkJCQkJCQkjCisjIE1haW50YWluZXIgTmFtZSwgRW1haWwgQWRkcmVzcwkJCQkJIworIwlCb2FyZAkJCUNQVQkJCQkJIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitNYXJpdXMgR3L2Z2VyIDxtYWdAc3lzZ28uZGU+CisKKwlpbXBhNwkJCUFSTTcyMFQgKEVQNzIxMSkKKwllcDczMTIJCQlBUk03MjBUIChFUDczMTIpCisKK0t5bGUgSGFycmlzIDxraGFycmlzQG5leHVzLXRlY2gubmV0PgorCisJbHViYm9jawkJCXhzY2FsZQorCWNyYWRsZQkJCXhzY2FsZQorCitHYXJ5IEplbm5lam9obiA8Z2pAZGVueC5kZT4KKworCXNtZGsyNDAwCQlBUk05MjBUCisJdHJhYgkJCUFSTTkyMFQKKworRGF2aWQgTfxsbGVyIDxkLm11ZWxsZXJAZWxzb2Z0LmNoPgorCisJc21kazI0MTAJCUFSTTkyMFQKKworUm9sZiBPZmZlcm1hbm5zIDxyb2ZAc3lzZ28uZGU+CisKKwlzaGFubm9uCQkJU0ExMTAwCisKK1JvYmVydCBTY2h3ZWJlbCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4KKworCWNzYjIyNgkJCXhzY2FsZQorCitBbGV4IFr8cGtlIDxhenVAc3lzZ28uZGU+CisKKwlsYXJ0CQkJU0ExMTAwCisJZG5wMTExMAkJCVNBMTExMAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEVuZCBvZiBNQUlOVEFJTkVSUyBsaXN0CQkJCQkJIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvY3B1ODYvZmxhc2guYyBiL2JvYXJkL2NwdTg2L2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmNzYxZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NwdTg2L2ZsYXNoLmMKQEAgLTAsMCArMSw2MTUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEsIDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogRmxhc2ggUm91dGluZXMgZm9yIEludGVsIGRldmljZXMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSAiY3B1ODYuaCIKKworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordWxvbmcgZmxhc2hfaW50X2dldF9zaXplICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpiYXNlYWRkciwKKwkJCQkJICBmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworCXNob3J0IGk7CisJdW5zaWduZWQgbG9uZyBmbGFzaHRlc3RfaCwgZmxhc2h0ZXN0X2w7CisKKwlpbmZvLT5zZWN0b3JfY291bnQgPSBpbmZvLT5zaXplID0gMDsKKwlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisKKwkvKiBXcml0ZSBxdWVyeSBjb21tYW5kIHNlcXVlbmNlIGFuZCB0ZXN0IEZMQVNIIGFuc3dlcgorCSAqLworCWJhc2VhZGRyWzBdID0gMHgwMDk4MDA5ODsKKwliYXNlYWRkclsxXSA9IDB4MDA5ODAwOTg7CisKKwlmbGFzaHRlc3RfaCA9IGJhc2VhZGRyWzBdOwkvKiBtYW51ZmFjdHVyZXIgSUQJKi8KKwlmbGFzaHRlc3RfbCA9IGJhc2VhZGRyWzFdOworCisJaWYgKGZsYXNodGVzdF9oICE9IElOVEVMX01BTlVGQUNUIHx8IGZsYXNodGVzdF9sICE9IElOVEVMX01BTlVGQUNUKQorCQlyZXR1cm4gKDApOwkJLyogbm8gb3IgdW5rbm93biBmbGFzaAkqLworCisJZmxhc2h0ZXN0X2ggPSBiYXNlYWRkclsyXTsJLyogZGV2aWNlIElECSAgICAgICAgKi8KKwlmbGFzaHRlc3RfbCA9IGJhc2VhZGRyWzNdOworCisJaWYgKGZsYXNodGVzdF9oICE9IGZsYXNodGVzdF9sKQorCQlyZXR1cm4gKDApOworCisJc3dpdGNoIChmbGFzaHRlc3RfaCkgeworCWNhc2UgSU5URUxfSURfMjhGMTYwQzNCOgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIXzI4RjE2MEMzQjsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMzk7CisJCWluZm8tPnNpemUgPSAweDAwODAwMDAwOwkvKiA0ICogMiBNQiA9IDggTUIJKi8KKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9JRF8yOEYxNjBGM0I6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfMjhGMTYwRjNCOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAzOTsKKwkJaW5mby0+c2l6ZSA9IDB4MDA4MDAwMDA7CS8qIDQgKiAyIE1CID0gOCBNQiAgICAgICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAoMCk7CQkJLyogbm8gb3IgdW5rbm93biBmbGFzaAkqLworCX0KKworCWluZm8tPmZsYXNoX2lkIHw9IElOVEVMX01BTlVGQUNUIDw8IDE2OyAvKiBzZXQgbWFudWZhY3R1cmVyIG9mZnNldCAqLworCisJaWYgKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfQlRZUEUpIHsKKwkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdG1wID0gYmFzZWFkZHI7CisKKwkJLyogc2V0IHVwIHNlY3RvciBzdGFydCBhZHJlc3MgdGFibGUgKGJvdHRvbSBzZWN0b3IgdHlwZSkKKwkJICogQU5EIHVubG9jayB0aGUgc2VjdG9ycyAoaWYgb3VyIGNoaXAgaXMgMTYwQzMpCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfMjhGMTYwQzNCKSB7CisJCQkJdG1wWzBdID0gMHgwMDYwMDA2MDsKKwkJCQl0bXBbMV0gPSAweDAwNjAwMDYwOworCQkJCXRtcFswXSA9IDB4MDBEMDAwRDA7CisJCQkJdG1wWzFdID0gMHgwMEQwMDBEMDsKKwkJCX0KKwkJCWluZm8tPnN0YXJ0W2ldID0gKHVpbnQpIHRtcDsKKwkJCXRtcCArPSBpIDwgOCA/IDB4MjAwMCA6IDB4MTAwMDA7IC8qIHBvaW50ZXIgYXJpdGggICAgICAgKi8KKwkJfQorCX0KKworCW1lbXNldCAoaW5mby0+cHJvdGVjdCwgMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKworCWJhc2VhZGRyWzBdID0gMHgwMEZGMDBGRjsKKwliYXNlYWRkclsxXSA9IDB4MDBGRjAwRkY7CisKKwlyZXR1cm4gKGluZm8tPnNpemUpOworfQorCitzdGF0aWMgdWxvbmcgZmxhc2hfYW1kX2dldF9zaXplICh2dV9jaGFyICphZGRyLCBmbGFzaF9pbmZvX3QgKmluZm8pCit7CisJc2hvcnQgaTsKKwl1Y2hhciB2ZW5kb3IsIGRldmlkOworCXVsb25nIGJhc2UgPSAodWxvbmcpYWRkcjsKKworCS8qIFdyaXRlIGF1dG8gc2VsZWN0IGNvbW1hbmQ6IHJlYWQgTWFudWZhY3R1cmVyIElEICovCisJYWRkclsweDA1NTVdID0gMHhBQTsKKwlhZGRyWzB4MDJBQV0gPSAweDU1OworCWFkZHJbMHgwNTU1XSA9IDB4OTA7CisKKwl1ZGVsYXkoMTAwMCk7CisKKwl2ZW5kb3IgPSBhZGRyWzBdOworCWRldmlkID0gYWRkclsxXSAmIDB4ZmY7CisKKwkvKiBvbmx5IHN1cHBvcnQgQU1EICovCisJaWYgKHZlbmRvciAhPSAweDAxKSB7CisJCXJldHVybiAwOworCX0KKworCXZlbmRvciAmPSAweGY7CisJZGV2aWQgJj0gMHhmZjsKKworCWlmIChkZXZpZCA9PSBBTURfSURfRjA0MEIpIHsKKwkJaW5mby0+Zmxhc2hfaWQgICAgID0gdmVuZG9yIDw8IDE2IHwgZGV2aWQ7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDg7CisJCWluZm8tPnNpemUgICAgICAgICA9IGluZm8tPnNlY3Rvcl9jb3VudCAqIDB4MTAwMDA7CisJfQorCWVsc2UgaWYgKGRldmlkID09IEFNRF9JRF9GMDgwQikgeworCQlpbmZvLT5mbGFzaF9pZCAgICAgPSB2ZW5kb3IgPDwgMTYgfCBkZXZpZDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTY7CisJCWluZm8tPnNpemUgICAgICAgICA9IDQgKiBpbmZvLT5zZWN0b3JfY291bnQgKiAweDEwMDAwOworCX0KKwllbHNlIGlmIChkZXZpZCA9PSBBTURfSURfRjAxNkQpIHsKKwkJaW5mby0+Zmxhc2hfaWQgICAgID0gdmVuZG9yIDw8IDE2IHwgZGV2aWQ7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDMyOworCQlpbmZvLT5zaXplICAgICAgICAgPSA0ICogaW5mby0+c2VjdG9yX2NvdW50ICogMHgxMDAwMDsKKwl9CisJZWxzZSB7CisJCXByaW50ZiAoIiMjIFVua25vd24gRmxhc2ggVHlwZTogJTAyeFxuIiwgZGV2aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBjaGVjayBmb3IgcHJvdGVjdGVkIHNlY3RvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJLyogc2VjdG9yIGJhc2UgYWRkcmVzcyAqLworCQlpbmZvLT5zdGFydFtpXSA9IGJhc2UgKyBpICogKGluZm8tPnNpemUgLyBpbmZvLT5zZWN0b3JfY291bnQpOworCQkvKiByZWFkIHNlY3RvciBwcm90ZWN0aW9uIGF0IHNlY3RvciBhZGRyZXNzLCAoQTcgLi4gQTApID0gMHgwMiAqLworCQkvKiBEMCA9IDEgaWYgcHJvdGVjdGVkICovCisJCWFkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShpbmZvLT5zdGFydFtpXSk7CisJCWluZm8tPnByb3RlY3RbaV0gPSBhZGRyWzJdICYgMTsKKwl9CisKKwkvKgorCSAqIFByZXZlbnQgd3JpdGVzIHRvIHVuaW5pdGlhbGl6ZWQgRkxBU0guCisJICovCisJaWYgKGluZm8tPmZsYXNoX2lkICE9IEZMQVNIX1VOS05PV04pIHsKKwkJYWRkciA9ICh2dV9jaGFyICopaW5mby0+c3RhcnRbMF07CisJCWFkZHJbMF0gPSAweEYwOyAvKiByZXNldCBiYW5rICovCisJfQorCisJcmV0dXJuIChpbmZvLT5zaXplKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3Vuc2lnbmVkIGxvbmcgZmxhc2hfaW5pdCAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemVfYjAgPSAwOworCXVuc2lnbmVkIGxvbmcgc2l6ZV9iMSA9IDA7CisJaW50IGk7CisKKwkvKiBJbml0OiBubyBGTEFTSGVzIGtub3duCisJICovCisJZm9yIChpID0gMDsgaSA8IENGR19NQVhfRkxBU0hfQkFOS1M7ICsraSkgeworCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwl9CisKKwkvKiBEaXNhYmxlIGZsYXNoIHByb3RlY3Rpb24gKi8KKwlDUFU4Nl9CQ1IgfD0gKENQVTg2X0JDUl9GV1BUIHwgQ1BVODZfQkNSX0ZXUkUpOworCisJLyogU3RhdGljIEZMQVNIIEJhbmsgY29uZmlndXJhdGlvbiBoZXJlIChvbmx5IG9uZSBiYW5rKSAqLworCisJc2l6ZV9iMCA9IGZsYXNoX2ludF9nZXRfc2l6ZSAoKHVsb25nICopIENGR19GTEFTSF9CQVNFLCAmZmxhc2hfaW5mb1swXSk7CisJc2l6ZV9iMSA9IGZsYXNoX2FtZF9nZXRfc2l6ZSAoKHVjaGFyICopIENGR19CT09UUk9NX0JBU0UsICZmbGFzaF9pbmZvWzFdKTsKKworCWlmIChzaXplX2IwID4gMCB8fCBzaXplX2IxID4gMCkgeworCisJCXByaW50ZigiKCIpOworCisJCWlmIChzaXplX2IwID4gMCkgeworCQkJcHV0cyAoIkJhbmsjMSAtICIpOworCQkJcHJpbnRfc2l6ZSAoc2l6ZV9iMCwgKHNpemVfYjEgPiAwKSA/ICIsICIgOiAiKSAiKTsKKwkJfQorCisJCWlmIChzaXplX2IxID4gMCkgeworCQkJcHV0cyAoIkJhbmsjMiAtICIpOworCQkJcHJpbnRfc2l6ZSAoc2l6ZV9iMSwgIikgIik7CisJCX0KKwl9CisJZWxzZSB7CisJCXByaW50ZiAoIiMjIE5vIEZMQVNIIGZvdW5kLlxuIik7CisJCXJldHVybiAwOworCX0KKwkvKiBwcm90ZWN0IG1vbml0b3IgYW5kIGVudmlyb25tZW50IHNlY3RvcnMKKwkgKi8KKworI2lmIENGR19NT05JVE9SX0JBU0UgPj0gQ0ZHX0JPT1RST01fQkFTRQorCWlmIChzaXplX2IxKSB7CisJCS8qIElmIFUtQm9vdCBpcyBib290ZWQgZnJvbSBST00gdGhlIENGR19NT05JVE9SX0JBU0UgPiBDRkdfRkxBU0hfQkFTRQorCQkgKiBidXQgd2Ugc2hvdWxkbid0IHByb3RlY3QgaXQuCisJCSAqLworCisJCWZsYXNoX3Byb3RlY3QgIChGTEFHX1BST1RFQ1RfU0VULAorCQkJCUNGR19NT05JVE9SX0JBU0UsCisJCQkJQ0ZHX01PTklUT1JfQkFTRSArIENGR19NT05JVE9SX0xFTiAtIDEsICZmbGFzaF9pbmZvWzFdCisJCSk7CisJfQorI2Vsc2UKKyNpZiBDRkdfTU9OSVRPUl9CQVNFID49IENGR19GTEFTSF9CQVNFCisJZmxhc2hfcHJvdGVjdCAoRkxBR19QUk9URUNUX1NFVCwKKwkJICAgICAgIENGR19NT05JVE9SX0JBU0UsCisJCSAgICAgICBDRkdfTU9OSVRPUl9CQVNFICsgQ0ZHX01PTklUT1JfTEVOIC0gMSwgJmZsYXNoX2luZm9bMF0KKwkpOworI2VuZGlmCisjZW5kaWYKKworI2lmIChDRkdfRU5WX0lTX0lOX0ZMQVNIID09IDEpICYmIGRlZmluZWQoQ0ZHX0VOVl9BRERSKQorIyBpZm5kZWYgIENGR19FTlZfU0laRQorIyAgZGVmaW5lIENGR19FTlZfU0laRQlDRkdfRU5WX1NFQ1RfU0laRQorIyBlbmRpZgorIyBpZiBDRkdfRU5WX0FERFIgPj0gQ0ZHX0JPT1RST01fQkFTRQorCWlmIChzaXplX2IxKSB7CisJCWZsYXNoX3Byb3RlY3QgKEZMQUdfUFJPVEVDVF9TRVQsCisJCQkJQ0ZHX0VOVl9BRERSLAorCQkJCUNGR19FTlZfQUREUiArIENGR19FTlZfU0laRSAtIDEsICZmbGFzaF9pbmZvWzFdKTsKKwl9CisjIGVsc2UKKwlmbGFzaF9wcm90ZWN0IChGTEFHX1BST1RFQ1RfU0VULAorCQkgICAgICAgQ0ZHX0VOVl9BRERSLAorCQkgICAgICAgQ0ZHX0VOVl9BRERSICsgQ0ZHX0VOVl9TSVpFIC0gMSwgJmZsYXNoX2luZm9bMF0pOworIyBlbmRpZgorI2VuZGlmCisKKwlyZXR1cm4gKHNpemVfYjAgKyBzaXplX2IxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZsYXNoX3ByaW50X2luZm8gKGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJaW50IGk7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlwcmludGYgKCJtaXNzaW5nIG9yIHVua25vd24gRkxBU0ggdHlwZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKChpbmZvLT5mbGFzaF9pZCA+PiAxNikgJiAweGZmKSB7CisJY2FzZSAweDg5OgorCQlwcmludGYgKCJJTlRFTCAiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE6CisJCXByaW50ZiAoIkFNRCAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBWZW5kb3IgIik7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworCWNhc2UgRkxBU0hfMjhGMTYwQzNCOgorCQlwcmludGYgKCIyOEYxNjBDM0IgKDE2IE1iaXQsIGJvdHRvbSBzZWN0b3IpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF8yOEYxNjBGM0I6CisJCXByaW50ZiAoIjI4RjE2MEYzQiAoMTYgTWJpdCwgYm90dG9tIHNlY3RvcilcbiIpOworCQlicmVhazsKKwljYXNlIEFNRF9JRF9GMDQwQjoKKwkJcHJpbnRmICgiQU0yOUYwNDBCICg0IE1iaXQpXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBDaGlwIFR5cGVcbiIpOworCQlicmVhazsKKwl9CisKKwlpZiAoaW5mby0+c2l6ZSA8IDB4MTAwMDAwKQorCQlwcmludGYgKCIgIFNpemU6ICVsZCBLQiBpbiAlZCBTZWN0b3JzXG4iLAorCQkJCWluZm8tPnNpemUgPj4gMTAsIGluZm8tPnNlY3Rvcl9jb3VudCk7CisJZWxzZQorCQlwcmludGYgKCIgIFNpemU6ICVsZCBNQiBpbiAlZCBTZWN0b3JzXG4iLAorCQkJCWluZm8tPnNpemUgPj4gMjAsIGluZm8tPnNlY3Rvcl9jb3VudCk7CisKKwlwcmludGYgKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7CisJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgKytpKSB7CisJCWlmICgoaSAlIDUpID09IDApCisJCQlwcmludGYgKCJcbiAgICIpOworCQlwcmludGYgKCIgJTA4bFglcyIsCisJCQlpbmZvLT5zdGFydFtpXSwKKwkJCWluZm8tPnByb3RlY3RbaV0gPyAiIChSTykiIDogIiAgICAgIgorCQkpOworCX0KKwlwcmludGYgKCJcbiIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludCBmbGFzaF9lcmFzZSAoZmxhc2hfaW5mb190ICogaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisJdnVfY2hhciAqYWRkciA9ICh2dV9jaGFyICopKGluZm8tPnN0YXJ0WzBdKTsKKwlpbnQgZmxhZywgcHJvdCwgc2VjdCwgbF9zZWN0OworCXVsb25nIHN0YXJ0LCBub3csIGxhc3Q7CisKKwlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwkJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJCXByaW50ZiAoIi0gbWlzc2luZ1xuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCItIG5vIHNlY3RvcnMgdG8gZXJhc2VcbiIpOworCQl9CisJCXJldHVybiAxOworCX0KKworCXByb3QgPSAwOworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pCisJCQlwcm90Kys7CisJfQorCisJaWYgKHByb3QpIHsKKwkJcHJpbnRmICgiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhXG4iLAorCQkJCXByb3QpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIlxuIik7CisJfQorCisJLyogQ2hlY2sgdGhlIHR5cGUgb2YgZXJhc2VkIGZsYXNoCisJICovCisJaWYgKGluZm8tPmZsYXNoX2lkID4+IDE2ID09IDB4MSkgeworCQkvKiBFcmFzZSBBTUQgZmxhc2gKKwkJICovCisJCWxfc2VjdCA9IC0xOworCisJCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLworCQlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKwkJYWRkclsweDA1NTVdID0gMHhBQTsKKwkJYWRkclsweDAyQUFdID0gMHg1NTsKKwkJYWRkclsweDA1NTVdID0gMHg4MDsKKwkJYWRkclsweDA1NTVdID0gMHhBQTsKKwkJYWRkclsweDAyQUFdID0gMHg1NTsKKworCQkvKiB3YWl0IGF0IGxlYXN0IDgwdXMgLSBsZXQncyB3YWl0IDEgbXMgKi8KKwkJdWRlbGF5ICgxMDAwKTsKKworCQkvKiBTdGFydCBlcmFzZSBvbiB1bnByb3RlY3RlZCBzZWN0b3JzICovCisJCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3Q8PXNfbGFzdDsgc2VjdCsrKSB7CisJCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7IC8qIG5vdCBwcm90ZWN0ZWQgKi8KKwkJCQlhZGRyID0gKHZ1X2NoYXIgKikoaW5mby0+c3RhcnRbc2VjdF0pOworCQkJCWFkZHJbMF0gPSAweDMwOworCQkJCWxfc2VjdCA9IHNlY3Q7CisJCQl9CisJCX0KKworCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKGZsYWcpCisJCQllbmFibGVfaW50ZXJydXB0cygpOworCisJCS8qIHdhaXQgYXQgbGVhc3QgODB1cyAtIGxldCdzIHdhaXQgMSBtcyAqLworCQl1ZGVsYXkgKDEwMDApOworCisJCS8qCisJCSAqIFdlIHdhaXQgZm9yIHRoZSBsYXN0IHRyaWdnZXJlZCBzZWN0b3IKKwkJICovCisJCWlmIChsX3NlY3QgPCAwKQorCQkJZ290byBBTURfRE9ORTsKKworCQlzdGFydCA9IGdldF90aW1lciAoMCk7CisJCWxhc3QgID0gc3RhcnQ7CisJCWFkZHIgPSAodnVfY2hhciAqKShpbmZvLT5zdGFydFtsX3NlY3RdKTsKKwkJd2hpbGUgKChhZGRyWzBdICYgMHg4MCkgIT0gMHg4MCkgeworCQkJaWYgKChub3cgPSBnZXRfdGltZXIoc3RhcnQpKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7CisJCQkJcHJpbnRmICgiVGltZW91dFxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQkvKiBzaG93IHRoYXQgd2UncmUgd2FpdGluZyAqLworCQkJaWYgKChub3cgLSBsYXN0KSA+IDEwMDApIHsgICAgICAvKiBldmVyeSBzZWNvbmQgKi8KKwkJCQlzZXJpYWxfcHV0YyAoJy4nKTsKKwkJCQlsYXN0ID0gbm93OworCQkJfQorCQl9CisKK0FNRF9ET05FOgorCQkvKiByZXNldCB0byByZWFkIG1vZGUgKi8KKwkJYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopaW5mby0+c3RhcnRbMF07CisJCWFkZHJbMF0gPSAweEYwOyAgICAgLyogcmVzZXQgYmFuayAqLworCisJfSBlbHNlIHsKKwkJLyogRXJhc2UgSW50ZWwgZmxhc2gKKwkJICovCisKKwkJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycworCQkgKi8KKwkJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7IHNlY3QrKykgeworCQkJdm9sYXRpbGUgdWxvbmcgKmFkZHIgPQorCQkJCSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIGluZm8tPnN0YXJ0W3NlY3RdOworCisJCQlzdGFydCA9IGdldF90aW1lciAoMCk7CisJCQlsYXN0ID0gc3RhcnQ7CisJCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7CisJCQkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUKKwkJCSAqLworCQkJCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CisKKwkJCQkvKiBFcmFzZSB0aGUgYmxvY2sKKwkJCQkgKi8KKwkJCQlhZGRyWzBdID0gMHgwMDIwMDAyMDsKKwkJCQlhZGRyWzFdID0gMHgwMDIwMDAyMDsKKwkJCQlhZGRyWzBdID0gMHgwMEQwMDBEMDsKKwkJCQlhZGRyWzFdID0gMHgwMEQwMDBEMDsKKworCQkJCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIG5lY2Vzc2FyeQorCQkJCSAqLworCQkJCWlmIChmbGFnKQorCQkJCQllbmFibGVfaW50ZXJydXB0cyAoKTsKKworCQkJCS8qIHdhaXQgYXQgbGVhc3QgODB1cyAtIGxldCdzIHdhaXQgMSBtcworCQkJCSAqLworCQkJCXVkZWxheSAoMTAwMCk7CisKKwkJCQlsYXN0ID0gc3RhcnQ7CisJCQkJd2hpbGUgKChhZGRyWzBdICYgMHgwMDgwMDA4MCkgIT0gMHgwMDgwMDA4MCB8fAorCQkJCSAgIChhZGRyWzFdICYgMHgwMDgwMDA4MCkgIT0gMHgwMDgwMDA4MCkgeworCQkJCQlpZiAoKG5vdyA9IGdldF90aW1lciAoc3RhcnQpKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7CisJCQkJCQlwcmludGYgKCJUaW1lb3V0IChlcmFzZSBzdXNwZW5kZWQhKVxuIik7CisJCQkJCQkvKiBTdXNwZW5kIGVyYXNlCisJCQkJCQkgKi8KKwkJCQkJCWFkZHJbMF0gPSAweDAwQjAwMEIwOworCQkJCQkJYWRkclsxXSA9IDB4MDBCMDAwQjA7CisJCQkJCQlnb3RvIERPTkU7CisJCQkJCX0KKwkJCQkJLyogc2hvdyB0aGF0IHdlJ3JlIHdhaXRpbmcKKwkJCQkJICovCisJCQkJCWlmICgobm93IC0gbGFzdCkgPiAxMDAwKSB7CS8qIGV2ZXJ5IHNlY29uZCAqLworCQkJCQkJc2VyaWFsX3B1dGMgKCcuJyk7CisJCQkJCQlsYXN0ID0gbm93OworCQkJCQl9CisJCQkJfQorCQkJCWlmIChhZGRyWzBdICYgMHgwMDIyMDAyMiB8fCBhZGRyWzFdICYgMHgwMDIyMDAyMikgeworCQkJCQlwcmludGYgKCIqKiogRVJST1I6IGVyYXNlIGZhaWxlZCFcbiIpOworCQkJCQlnb3RvIERPTkU7CisJCQkJfQorCQkJfQorCQkJLyogQ2xlYXIgc3RhdHVzIHJlZ2lzdGVyIGFuZCByZXNldCB0byByZWFkIG1vZGUKKwkJCSAqLworCQkJYWRkclswXSA9IDB4MDA1MDAwNTA7CisJCQlhZGRyWzFdID0gMHgwMDUwMDA1MDsKKwkJCWFkZHJbMF0gPSAweDAwRkYwMEZGOworCQkJYWRkclsxXSA9IDB4MDBGRjAwRkY7CisJCX0KKwl9CisKKwlwcmludGYgKCIgZG9uZVxuIik7CisKK0RPTkU6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICosIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKiwgdWxvbmcpOworc3RhdGljIGludCB3cml0ZV9ieXRlIChmbGFzaF9pbmZvX3QgKmluZm8sIHVsb25nIGRlc3QsIHVjaGFyIGRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5IG1lbW9yeSB0byBmbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK2ludCB3cml0ZV9idWZmIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1Y2hhciAqIHNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQoreworCXVsb25nIHY7CisJaW50IGksIGwsIHJjLCBjYyA9IGNudCwgcmVzID0gMDsKKworCWlmIChpbmZvLT5mbGFzaF9pZCA+PiAxNiA9PSAweDEpIHsKKworCQkvKiBXcml0ZSB0byBBTUQgOC1iaXQgZmxhc2gKKwkJICovCisJCXdoaWxlIChjbnQgPiAwKSB7CisJCQlpZiAoKHJjID0gd3JpdGVfYnl0ZShpbmZvLCBhZGRyLCAqc3JjKSkgIT0gMCkgeworCQkJCXJldHVybiAocmMpOworCQkJfQorCQkJYWRkcisrOworCQkJc3JjKys7CisJCQljbnQtLTsKKwkJfQorCisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKworCQkvKiBXcml0ZSB0byBJbnRlbCA2NC1iaXQgZmxhc2gKKwkJICovCisJCWZvciAodj0wOyBjYyA+IDA7IGFkZHIgKz0gNCwgY2MgLT0gNCAtIGwpIHsKKwkJCWwgPSAoYWRkciAmIDMpOworCQkJYWRkciAmPSB+MzsKKworCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCXYgPSAodiA8PCA4KSArIChpIDwgbCB8fCBpIC0gbCA+PSBjYyA/CisJCQkJCSooKHVuc2lnbmVkIGNoYXIgKikgYWRkciArIGkpIDogKnNyYysrKTsKKwkJCX0KKworCQkJaWYgKChyZXMgPSB3cml0ZV93b3JkIChpbmZvLCAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSBhZGRyLCB2KSkgIT0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAocmVzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV3JpdGUgYSB3b3JkIHRvIEZsYXNoLCByZXR1cm5zOgorICogMCAtIE9LCisgKiAxIC0gd3JpdGUgdGltZW91dAorICogMiAtIEZsYXNoIG5vdCBlcmFzZWQKKyAqLworc3RhdGljIGludCB3cml0ZV93b3JkIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyLAorCQkJCQkgICB1bG9uZyBkYXRhKQoreworCWludCBmbGFnLCByZXMgPSAwOworCXVsb25nIHN0YXJ0OworCisJLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkCisJICovCisJaWYgKCgqYWRkciAmIGRhdGEpICE9IGRhdGEpCisJCXJldHVybiAoMik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUKKwkgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJKmFkZHIgPSAweDAwNDAwMDQwOworCSphZGRyID0gZGF0YTsKKworCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIG5lY2Vzc2FyeQorCSAqLworCWlmIChmbGFnKQorCQllbmFibGVfaW50ZXJydXB0cyAoKTsKKworCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKwl3aGlsZSAoKCphZGRyICYgMHgwMDgwMDA4MCkgIT0gMHgwMDgwMDA4MCkgeworCQlpZiAoZ2V0X3RpbWVyIChzdGFydCkgPiBDRkdfRkxBU0hfV1JJVEVfVE9VVCkgeworCQkJLyogU3VzcGVuZCBwcm9ncmFtCisJCQkgKi8KKwkJCSphZGRyID0gMHgwMEIwMDBCMDsKKwkJCXJlcyA9IDE7CisJCQlnb3RvIE9VVDsKKwkJfQorCX0KKworCWlmICgqYWRkciAmIDB4MDAyMjAwMjIpIHsKKwkJcHJpbnRmICgiKioqIEVSUk9SOiBwcm9ncmFtIGZhaWxlZCFcbiIpOworCQlyZXMgPSAxOworCX0KKworT1VUOgorCS8qIENsZWFyIHN0YXR1cyByZWdpc3RlciBhbmQgcmVzZXQgdG8gcmVhZCBtb2RlCisJICovCisJKmFkZHIgPSAweDAwNTAwMDUwOworCSphZGRyID0gMHgwMEZGMDBGRjsKKworCXJldHVybiAocmVzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV3JpdGUgYSBieXRlIHRvIEZsYXNoLCByZXR1cm5zOgorICogMCAtIE9LCisgKiAxIC0gd3JpdGUgdGltZW91dAorICogMiAtIEZsYXNoIG5vdCBlcmFzZWQKKyAqLworc3RhdGljIGludCB3cml0ZV9ieXRlIChmbGFzaF9pbmZvX3QgKmluZm8sIHVsb25nIGRlc3QsIHVjaGFyIGRhdGEpCit7CisJdnVfY2hhciAqYWRkciA9ICh2dV9jaGFyICopKGluZm8tPnN0YXJ0WzBdKTsKKwl1bG9uZyBzdGFydDsKKwlpbnQgZmxhZzsKKworCS8qIENoZWNrIGlmIEZsYXNoIGlzIChzdWZmaWNpZW50bHkpIGVyYXNlZCAqLworCWlmICgoKigodnVfY2hhciAqKWRlc3QpICYgZGF0YSkgIT0gZGF0YSkgeworCQlyZXR1cm4gKDIpOworCX0KKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKwlhZGRyWzB4MDU1NV0gPSAweEFBOworCWFkZHJbMHgwMkFBXSA9IDB4NTU7CisJYWRkclsweDA1NTVdID0gMHhBMDsKKworCSooKHZ1X2NoYXIgKilkZXN0KSA9IGRhdGE7CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCS8qIGRhdGEgcG9sbGluZyBmb3IgRDcgKi8KKwlzdGFydCA9IGdldF90aW1lciAoMCk7CisJd2hpbGUgKCgqKCh2dV9jaGFyICopZGVzdCkgJiAweDgwKSAhPSAoZGF0YSAmIDB4ODApKSB7CisJCWlmIChnZXRfdGltZXIoc3RhcnQpID4gQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQpIHsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCmRpZmYgLS1naXQgYS9ib2FyZC9sd21vbi9SRUFETUUua2V5YmQgYi9ib2FyZC9sd21vbi9SRUFETUUua2V5YmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3NTljNgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2x3bW9uL1JFQURNRS5rZXliZApAQCAtMCwwICsxLDEyNyBAQAorCitUYXN0YXR1cmFiZnJhZ2U6CisKK0RpZSBJbXBsZW1lbnRpZXJ1bmcgLyBEZWNvZGllcnVuZyBiZXJ1aHQgYXVmIGRlbiBBbmdhYmVuIGF1cyBkZW0gIERvLQora3VtZW50ICAiUElDIExXRS1UYXN0YXR1ciIgaW4gZGVyIEZhc3N1bmcgdm9tIDkuIDMuIDIwMDEsIGluc2Jlc29uZGUtCityZSBUYWJlbGxlIDMgaW0gS2FwaXRlbCA0LjMgVGFzdGVuY29kZXMuIEluICBVLUJvb3QgIHdlcmRlbiAgZGllICB2b20KK0tleWJvYXJkLUNvbnRyb2xsZXIgIGdlbGVzZW5lbiBEYXRlbiBoZXhhZGV6aW1hbCBjb2RpZXJ0IGluIGRlciBhdXRvLQorbWF0aXNjaCBhbmdlbGVndGVuIEVudmlyb25tZW50LVZhcmlhYmxlbiAia2V5YmQiIPxiZXJnZWJlbi4gSXN0ICBrZWktCituZSBUYXN0ZSBnZWRy/GNrdCB3b3JkZW4sIHN0ZWh0IGRvcnQ6CisKKwlrZXliZD0wMDAwMDAwMDAwMDAwMDAwMDAKKworRGVyIGRlY29kaWVydGUgVGFzdGVuY29kZSAoImtleWJkIikga2FubiBtaXQgZGVuICAiYm9vdGFyZ3MiICBhbiAgZGVuCitMaW51eC1LZXJuZWwgIPxiZXJnZWJlbiAgdW5kICBkb3J0IHouIEIuIGluIGVpbmVtIERldmljZS1UcmVpYmVyIG9kZXIKK2VpbmVyIEFwcGxpa2F0aW9uIGF1c2dld2VydGV0IHdlcmRlbi4KKworCisKK1NvbmRlcmZ1bmt0aW9uZW4gYmVpbSBCb290ZW46CisKK0VzIGxhc3NlbiBzaWNoIGVpbmUgb2RlciBtZWhyZXJlIChiZWxpZWJpZyB2aWVsZSkgVGFzdGVuIG9kZXIgVGFzdGVuLQora29tYmluYXRpb25lbiBkZWZpbmllcmVuLCBkaWUgU29uZGVyZnVua3Rpb25lbiBhdXNs9nNlbiwgIHdlbm4gIGRpZXNlCitUYXN0ZW4gYmVpbSBCb290ZW4gKFJlc2V0KSBnZWRy/GNrdCBzaW5kLgorCitXaXJkIGVpbmUgZWluZ2VzdGVsbHRlIFRhc3RlIGJ6dy4gVGFzdGVua29tYmluYXRpb24gZXJrYW5udCwgc28gIHdpcmQKK2luICBVLUJvb3Qgbm9jaCB2b3IgZGVtIFN0YXJ0IGRlcyAiQ291bnRkb3duIiB1bmQgc29taXQgdm9yIGplZGVtIGFuLQorZGVyZW4gS29tbWFuZG8gZGVyIEluaGFsdCBlaW5lciBkaWVzZXIgVGFzdGUgIGJ6dy4gIFRhc3RlbmtvbWJpbmF0aW9uCit6dWdlb3JkbmV0ZW4gRW52aXJvbm1lbnQtVmFyaWFibGVuIGF1c2b8aHJlbi4KKworCitEaWUgRW52aXJvbm1lbnQtVmFyaWFibGUgIm1hZ2ljX2tleXMiIHdpcmQgYWxzIExpc3RlIHZvbiBaZWljaGVuIHZlci0KK3N0YW5kZW4sIGRpZSBhbHMgU3VmZml4IGFuIGRlbiBOYW1lbiAia2V5X21hZ2ljIiBhbmdlZvxndCB3ZXJkZW4gIHVuZAorc28gIGRpZSAgTmFtZW4gIGRlciAgRW52aXJvbm1lbnQtVmFyaWFibGVuICBkZWZpbmllcmVuLCBtaXQgZGVuZW4gZGllCitUYXN0ZW4gKC1rb21iaW5hdGlvbmVuKSBmZXN0Z2VsZWd0IHdlcmRlbjoKKworSXN0ICJtYWdpY19rZXlzIiBOSUNIVCBkZWZpbmllcnQsIHNvIHdpcmQgbnVyIGRpZSBpbiBkZXIgRW52aXJvbm1lbnQtCitWYXJpYWJsZW4gImtleV9tYWdpYyIgY29kaWVydGUgIFRhc3RlbiAgKC1rb21iaW5hdGlvbikgIGdlcHL8ZnQsICB1bmQKK2dnZi4gIGRlciAgSW5oYWx0IGRlciBFbnZpcm9ubWVudC1WYXJpYWJsZW4gImtleV9jbWQiIGF1c2dlZvxocnQgKGdlLQorbmF1ZXI6IGRlciBJbmhhbHQgdm9uICJrZXlfY21kIiB3aXJkIGRlciBWYXJpYWJsZW4gInByZWJvb3QiIHp1Z2V3aWUtCitzZW4sIGRpZSBhdXNnZWb8aHJ0IHdpcmQsIHVubWl0dGVsYmFyIGJldm9yIGRpZSBpbnRlcmFrdGl2ZSBLb21tYW5kby0KK2ludGVycHJldGF0aW9uIGJlZ2lubnQpLgorCitFbnRo5Gx0ICJtYWdpY19rZXlzIiB6LiBCLiAgZGllICBaZWljaGVua2V0dGUgICIwMTIzQ0IqIiwgIHNvICB3ZXJkZW4KK25hY2hlaW5hbmRlciBmb2xnZW5kZSBBa3Rpb25lbiBhdXNnZWb8aHJ0OgorCisJcHL8ZmUgVGFzdGVuY29kZQlnZ2YuIGb8aHJlIGF1cyBLb21tYW5kbworCWluIFZhcmlhYmxlCQlpbiBWYXJpYWJsZQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJa2V5X21hZ2ljMAk9PT4Ja2V5X2NtZDAKKwlrZXlfbWFnaWMxCT09PglrZXlfY21kMQorCWtleV9tYWdpYzIJPT0+CWtleV9jbWQyCisJa2V5X21hZ2ljMwk9PT4Ja2V5X2NtZDMKKwlrZXlfbWFnaWNDCT09PglrZXlfY21kQworCWtleV9tYWdpY0IJPT0+CWtleV9jbWRCCisJa2V5X21hZ2ljQQk9PT4Ja2V5X2NtZEEKKwlrZXlfbWFnaWMqCT09PglrZXlfY21kKgorCitIaW53ZWlzOiBzb2JhbGQgZWluIGFrdGl2aWVydGVyIFRhc3RlbmNvZGUgZXJrYW5udCAgd3VyZGUsICB3aXJkICBkaWUKK0JlYXJiZWl0dW5nICBhYmdlYnJvY2hlbjsgZXMgd2lyZCBkYWhlciBo9mNoc3RlbnMgZWluZXMgZGVyIGRlZmluaWVyLQordGVuIEtvbW1hbmRvcyBhdXNnZWb8aHJ0LCB3b2JlaSBkaWUgUHJpb3JpdOR0IGR1cmNoICBkaWUgIFN1Y2hyZWloZW4tCitmb2xnZSAgZmVzdGdlbGVndCB3aXJkLCBhbHNvIGR1cmNoIGRpZSBSZWloZW5mb2xnZSBkZXIgWmVpY2hlbiBpbiBkZXIKK1ZhcnVpYWJsZW4gIm1hZ2ljX2tleXMiLgorCisKK0RpZSBDb2RpZXJ1bmcgZGVyIFRhc3RlbiwgZGllIGJlaW0gQm9vdGVuIGdlZHL8Y2t0IHdlcmRlbiBt/HNzZW4sIHVtCitlaW5lIEZ1bmt0aW9uIGF1c3p1bPZzZW4sIGVyZm9sZ3QgbmFjaCBkZXIgVGFzdGF0dXJ0YWJlbGxlLgorCitEaWUgRGVmaW5pdGlvbmVuCisKKwk9PiBzZXRlbnYga2V5X21hZ2ljMCAzYSszYgorCT0+IHNldGVudiBrZXlfY21kMCBzZXRlbnYgYm9vdGRlbGF5IDMwCisKK2JlZGV1dGVuIGRlbWVudHNwcmVjaGVuZCwgZGHfIGRpZSBUYXN0ZW4gbWl0IGRlbiAgQ29kZXMgIDB4M0EgIChUYXN0ZQorIkYxIikgIHVuZCAweDNCIChUYXN0ZSAiRjIiKSBnbGVpY2h6ZWl0aWcgZ2Vkcvxja3Qgd2VyZGVuIG38c3Nlbi4gU2llCitr9m5uZW4gZG9ydCBlaW5lIGJlbGllYmlnZSAgVGFzdGVua29tYmluYXRpb24gIGVpbnRyYWdlbiAgKGpld2VpbHMgIDIKK1plaWNoZW4gZvxyIGRpZSBIZXgtQ29kZXMgZGVyIFRhc3RlbiwgdW5kICcrJyBhbHMgVHJlbm56ZWljaGVuKS4KKworV2lyZCBkaWUgZWluZ2VzdGVsbHRlIFRhc3RlbmtvbWJpbmF0aW9uIGVya2FubnQsIHNvICB3aXJkICBpbiAgVS1Cb290Citub2NoICB2b3IgIGRlbSBTdGFydCBkZXMgIkNvdW50ZG93biIgdW5kIHNvbWl0IHZvciBqZWRlbSBhbmRlcmVuIEtvbS0KK21hbmRvIGRhcyBhbmdlYmVuZSBLb21tYW5kbyBhdXNnZWb8aHJ0IHVuZCAgc29taXQgIGVpbiAgbGFuZ2VzICBCb290LQorRGVsYXkgZWluZ2V0cmFnZW4uCisKK1ByYWt0aXNjaCBr9m5udGVuIFNpZSBhbHNvIGluIFUtQm9vdCAiYm9vdGRlbGF5IiAgYXVmICAwICBzZXR6ZW4gIHVuZAorc29taXQgIHN0ZXRzICBvaG5lICBqZWRlICBVc2VyLUludGVyYWt0aW9uIGF1dG9tYXRpc2NoIGJvb3RlbiwgYXXfZXIsCit3ZW5uIGRpZSBiZWlkZW4gVGFzdGVuICJGMSIgdW5kICJGMiIgIGJlaW0gIEJvb3RlbiAgZ2Vkcvxja3QgIHdlcmRlbjoKK2Rhbm4gd/xyZGUgZWluIEJvb3QtRGVsYXkgdm9uIDMwIFNla3VuZGVuIGVpbmdlZvxndC4KKworCitIaW53ZWlzOiBkZW0gWmVpY2hlbiAnIycga29tbXQgaW5uZXJoYWxiIHZvbiAibWFnaWNfa2V5cyIgZWluZSBiZXNvbi0KK2RlcmUgQmVkZXV0dW5nIHp1OiBkaWUgZGFkdXJjaCBkZWZpbmllcnRlICBLZXktU2VxdWVueiAgc2NoYWx0ZXQgIGRlbgorTW9uaXRvciBpbiBkZW4gIkRlYnVnLU1vZHVzIiAtIGRhcyBiZWRldXRldCB6dW7kY2hzdCwgZGHfIGFsbGUgd2VpdGUtCityZW4gIE1lbGR1bmdlbiAgdm9uICBVLUJvb3QgIPxiZXIgIGRhcyBMQ0QtRGlzcGxheSBhdXNnZWdlYmVuIHdlcmRlbjsKK2F132VyZGVtIGthbm4gbWFuIGR1cmNoIGRhcyBtaXQgZGllc2VyICBUYXN0ZW5rb21iaW5hdGlvbiAgdmVya278cGZ0ZQorS29tbWFuZG8gIHouIEIuIGRpZSBMaW51eC1Cb290bWVsZHVuZ2VuIGViZW5mYWxscyBhdWYgZGFzIExDRC1EaXNwbGF5CitsZWdlbiwgc28gZGHfIGRlciBCb290LVZvcmdhbmcgZGlyZWt0IHVuZCAgb2huZSAgd2VpdGVyZSAgSGlsZnNtaXR0ZWwKK2FuYWx5c2llcnQgd2VyZGVuIGthbm4uCisKK0JlaXNwaWVsOgorCitJbiBVLUJvb3Qgd2VyZGVuIGZvbGdlbmRlIEVudmlyb25tZW50LVZhcmlhYmxlbiBnZXNldHp0IHVuZCBhYmdlc3BlaS0KK2NoZXJ0OgorCisoMSkJPT4gc2V0ZW52IG1hZ2ljX2tleXMgMDEyMzQjWAorKDIpCT0+IHNldGVudiBrZXlfY21kIyBzZXRlbnYgYWRkZmIgc2V0ZW52IGJvb3RhcmdzIFxcJChib290YXJncykgY29uc29sZT10dHkwIGNvbnNvbGU9dHR5UzEsXFwkKGJhdWRyYXRlKQorKDMpCT0+IHNldGVudiBuZnNhcmdzIHNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3IG5mc3Jvb3Q9XCQoc2VydmVyaXApOlwkKHJvb3RwYXRoKQorKDQpCT0+IHNldGVudiBhZGRpcCBzZXRlbnYgYm9vdGFyZ3MgXCQoYm9vdGFyZ3MpIGlwPVwkKGlwYWRkcik6XCQoc2VydmVyaXApOlwkKGdhdGV3YXlpcCk6XCQobmV0bWFzayk6XCQoaG9zdG5hbWUpOjpvZmYgcGFuaWM9MQorKDUpCT0+IHNldGVudiBhZGRmYiBzZXRlbnYgYm9vdGFyZ3MgXCQoYm9vdGFyZ3MpIGNvbnNvbGU9dHR5UzEsXCQoYmF1ZHJhdGUpCisoNikJPT4gc2V0ZW52IGJvb3RjbWQgYm9vdHBcO3J1biBuZnNhcmdzXDtydW4gYWRkaXBcO3J1biBhZGRmYlw7Ym9vdG0KKworSGllcmJlaSB3aXJkIGRpZSBMaW51eCBDb21tYW5kbGluZSAoaW4gZGVyIFZhcmlhYmxlbiAgImJvb3RhcmdzIikgIGltCitCb290LUtvbW1hbmRvICAiYm9vdGNtZCIgICg2KSAgc2Nocml0dHdlaXNlIHp1c2FtbWVuZ2VzZXR6dDogenVu5GNoc3QKK3dlcmRlbiBkaWUgZvxyIFJvb3QtRmlsZXN5c3RlbSD8YmVyIE5GUyBlcmZvcmRlcmxpY2hlbiAgT3B0aW9uZW4gIGdlLQorc2V0enQgICgicnVuICBuZnNhcmdzIiwgdmdsLiAoMykpLCBkYW5uIGRpZSBOZXR6d2Vya2tvbmZpZ3VyYXRpb24gYW4tCitnZWb8Z3QgKCJydW4gYWRkaXAiLCB2Z2wuICg0KSksICB1bmQgIHNjaGxpZd9saWNoICBkaWUgIFN5c3RlbWNvbnNvbGUKK2RlZmluaWVydCAoInJ1biBhZGRmYiIpLgorCitEYWJlaSB3aXJkIGltIE5vcm1hbGZhbGwgZGllIERlZmluaXRpb24gKDUpICB2ZXJ3ZW5kdDsgIHd1cmRlICBhbGxlci0KK2RpbmdzICBiZWltICBSZXNldCBkaWUgZW50c3ByZWNoZW5kZSBUYXN0ZSBnZWRy/GNrdCBnZWhhbHRlbiwgc28gd2lyZAorZGllc2UgRGVmaW5pdGlvbiBiZWkgZGVyIEF1c2b8aHJ1bmcgZGVzIGluICgyKSBkZWZpbmllcnRlbiAgS29tbWFuZG9zCiv8YmVyc2NocmllYmVuLCAgc28gIGRh3yAgTGludXggZGllIEJvb3RtZWxkdW5nZW4gYXVjaCD8YmVyIGRhcyBGcmFtZS0KK2J1ZmZlci1EZXZpY2UgKD1MQ0QtRGlzcGxheSkgYXVzZ2lidC4KKworQmVhY2h0ZW4gU2llIGRpZSBWZXJkb3BwZWx1bmcgZGVyICdcJy1Fc2NhcGVzIGluIGRlciAgRGVmaW5pdGlvbiAgdm9uCisia2V5X2NtZCMiIC0gZGllc2UgaXN0IGVyZm9yZGVybGljaCwgd2VpbCBkZXIgU3RyaW5nIF96d2VpbWFsXyBpbnRlci0KK3ByZXRpZXJ0ICB3aXJkOiAgZGFzICBlcnN0ZSAgTWFsICBiZWkgZGVyIEVpbmdhYmUgdm9uICJrZXlfY21kIyIsIGRhcworendlaXRlIE1hbCwgd2VubiBkZXIgU3RyaW5nIChhbHMgIEluaGFsdCAgdm9uICAicHJlYm9vdCIpICBhdXNnZWb8aHJ0Cit3aXJkLgpkaWZmIC0tZ2l0IGEvYm9hcmQvbW91c3NlL2ZsYXNoLmMgYi9ib2FyZC9tb3Vzc2UvZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzRhODAyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbW91c3NlL2ZsYXNoLmMKQEAgLTAsMCArMSw5NDQgQEAKKy8qCisgKiBNT1VTU0UvTVBDODI0MCBCb2FyZCBkZWZpbml0aW9ucy4KKyAqIEZsYXNoIFJvdXRpbmVzIGZvciBNT1VTU0Ugb25ib2FyZCBBTUQyOUxWMTA2REIgZGV2aWNlcworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSwgYnkgQ3VydCBNY0Rvd2VsbCwgMDgtMDYtOTksIEJyb2FkY29tIENvcnAuCisgKiAoQykgQ29weXJpZ2h0IDIwMDEsIEphbWVzIERvdWdoZXJ0eSwgMDcvMTgvMDEsIEJyb2FkY29tIENvcnAuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzh4eC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgIm1vdXNzZS5oIgorI2luY2x1ZGUgImZsYXNoLmgiCisKK2ludCBmbGFzaExpYkRlYnVnID0gMDsKK2ludCBmbGFzaExpYkluaXRlZCA9IDA7CisKKyNkZWZpbmUgT0sgIDAKKyNkZWZpbmUgRVJST1IgLTEKKyNkZWZpbmUgU1RBVFVTIGludAorI2RlZmluZSBQUklOVEYJCQlpZiAoZmxhc2hMaWJEZWJ1ZykgcHJpbnRmCisjaWYgMAorI2RlZmluZSBQUklWQVRFCQkJc3RhdGljCisjZWxzZQorI2RlZmluZSBQUklWQVRFCisjZW5kaWYKKworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisKKyNkZWZpbmUgU0xFRVBfREVMQVkgICAgMTY2CisjZGVmaW5lIEZMQVNIX1NFQ1RPUl9TSVpFICAgKDY0KjEwMjQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBWaXJ0dWFsIEZsYXNoIERldmljZXMgb24gTW91c3NlIGJvYXJkCisgKgorICogVGhlc2UgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgZGVmaW5pdGlvbnMgaW4gZmxhc2hMaWIuaC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1BSSVZBVEUgZmxhc2hfZGV2X3QgZmxhc2hEZXZbXSA9IHsKKyAgICAvKiBCYW5rIDAgc2VjdG9yIFNBMCAoMTYga0IpICovCisgICAgewkiU0EwIixGTEFTSDBfQkFOSywgRkxBU0gwX1NFRzBfU1RBUlQsIDEsIDE0LAorCUZMQVNIMF9WRU5ET1JfSUQsIEZMQVNIMF9ERVZJQ0VfSUQKKyAgICB9LAorICAgIC8qIEJhbmsgMCBzZWN0b3IgU0ExICg4IGtCKSAqLworICAgIHsJIlNBMSIsIEZMQVNIMF9CQU5LLCBGTEFTSDBfU0VHMF9TVEFSVCArIDB4NDAwMCwgMSwgMTMsCisJRkxBU0gwX1ZFTkRPUl9JRCwgRkxBU0gwX0RFVklDRV9JRAorICAgIH0sCisgICAgLyogQmFuayAwIHNlY3RvciBTQTIgKDgga0IpICovCisgICAgewkiU0EyIiwgRkxBU0gwX0JBTkssIEZMQVNIMF9TRUcwX1NUQVJUICsgMHg2MDAwLCAxLCAxMywKKwlGTEFTSDBfVkVORE9SX0lELCBGTEFTSDBfREVWSUNFX0lECisgICAgfSwKKyAgICAvKiBCYW5rIDAgc2VjdG9yIFNBMyBpcyBvY2NsdWRlZCBieSBNb3Vzc2UgSS9PIGRldmljZXMgKi8KKyAgICAvKiBCYW5rIDAgc2VjdG9ycyBTQTQtU0ExOCwgYWZ0ZXIgTW91c3NlIGRldmljZXMgdXAgdG8gUExDQyAoOTYwIGtCKSAgKi8KKyAgICB7CSJLRVJORUwiLCBGTEFTSDBfQkFOSywgRkxBU0gwX1NFRzFfU1RBUlQsIDE1LCAxNiwKKwlGTEFTSDBfVkVORE9SX0lELCBGTEFTSDBfREVWSUNFX0lECisgICAgfSwKKyAgICAvKiBCYW5rIDAgc2VjdG9ycyBTQTE5LVNBMjYsIGp1bXBlciBjYW4gb2NjbHVkZSB0aGlzIGJ5IFBMQ0MgKDUxMiBrQikgKi8KKyAgICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBLYWhsdWEgYm9vdCB2ZWN0b3IgYW5kIGJvb3QgUk9NIGNvZGUgcmVzaWRlcy4gKi8KKyAgICB7CSJCT09UIixGTEFTSDBfQkFOSywgRkxBU0gwX1NFRzJfU1RBUlQsIDgsIDE2LAorCUZMQVNIMF9WRU5ET1JfSUQsIEZMQVNIMF9ERVZJQ0VfSUQKKyAgICB9LAorICAgIC8qIEJhbmsgMCBzZWN0b3JzIFNBMjctU0EzNCAoNTEyIGtCKSAqLworICAgIHsJIlJBTURJU0siLEZMQVNIMF9CQU5LLCBGTEFTSDBfU0VHM19TVEFSVCwgOCwgMTYsCisJRkxBU0gwX1ZFTkRPUl9JRCwgRkxBU0gwX0RFVklDRV9JRAorICAgIH0sCit9OworCitpbnQgZmxhc2hEZXZDb3VudCA9IChzaXplb2YgKGZsYXNoRGV2KSAvIHNpemVvZiAoZmxhc2hEZXZbMF0pKTsKKworI2RlZmluZSBERVYobm8pCQkJKCZmbGFzaERldltub10pCisjZGVmaW5lIERFVl9OTyhkZXYpCQkoKGRldikgLSBmbGFzaERldikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHJpdmF0ZSBGbGFzaCBSb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBjb252ZW50aW9uIGlzOgorICoKKyAqICJhZGRyIiBpcyBhbHdheXMgdGhlIFBST00gcmF3IGFkZHJlc3MsIHdoaWNoIGlzIHRoZSBhZGRyZXNzIG9mIGFuCisgKiA4LWJpdCBxdWFudGl0eSBmb3IgZmxhc2ggMCBhbmQgMTYtYml0IHF1YW50aXR5IGZvciBmbGFzaCAxLgorICoKKyAqICJwb3MiIGlzIGFsd2F5cyBhIGxvZ2ljYWwgYnl0ZSBwb3NpdGlvbiBmcm9tIHRoZSBQUk9NIGJlZ2lubmluZy4KKyAqLworCisjZGVmaW5lIEZMQVNIMF9BRERSKGRldiwgYWRkcikgXAorCSgodW5zaWduZWQgY2hhciAqKSAoKGRldiktPmJhc2UgKyAoYWRkcikpKQorCisjZGVmaW5lIEZMQVNIMF9XUklURShkZXYsIGFkZHIsIHZhbHVlKSBcCisJKCpGTEFTSDBfQUREUihkZXYsIGFkZHIpID0gKHZhbHVlKSkKKworI2RlZmluZSBGTEFTSDBfUkVBRChkZXYsIGFkZHIpIFwKKwkoKkZMQVNIMF9BRERSKGRldiwgYWRkcikpCisKK1BSSVZBVEUgaW50IGZsYXNoQ2hlY2soZmxhc2hfZGV2X3QgKmRldikKK3sKKyAgICBpZiAoISBmbGFzaExpYkluaXRlZCkgeworCXByaW50ZigiZmxhc2hDaGVjazogZmxhc2hMaWIgbm90IGluaXRpYWxpemVkXG4iKTsKKwlyZXR1cm4gRVJST1I7CisgICAgfQorCisgICAgaWYgKGRldiA8ICZmbGFzaERldlswXSB8fCBkZXYgPj0gJmZsYXNoRGV2W2ZsYXNoRGV2Q291bnRdKSB7CisJcHJpbnRmKCJmbGFzaENoZWNrOiBCYWQgZGV2IHBhcmFtZXRlclxuIik7CisJcmV0dXJuIEVSUk9SOworICAgIH0KKworICAgIGlmICghIGRldi0+Zm91bmQpIHsKKwlwcmludGYoImZsYXNoQ2hlY2s6IERldmljZSAlZCBub3QgYXZhaWxhYmxlXG4iLCBERVZfTk8oZGV2KSk7CisJcmV0dXJuIEVSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworUFJJVkFURSB2b2lkIGZsYXNoUmVzZXQoZmxhc2hfZGV2X3QgKmRldikKK3sKKyAgICBQUklOVEYoImZsYXNoUmVzZXQ6IGRldj0lZFxuIiwgREVWX05PKGRldikpOworCisgICAgaWYgKGRldi0+YmFuayA9PSBGTEFTSDBfQkFOSykgeworCUZMQVNIMF9XUklURShkZXYsIDB4NTU1LCAweGFhKTsKKwlGTEFTSDBfV1JJVEUoZGV2LCAweGFhYSwgMHg1NSk7CisJRkxBU0gwX1dSSVRFKGRldiwgMHg1NTUsIDB4ZjApOworICAgIH0KKworICAgIHVkZWxheShTTEVFUF9ERUxBWSk7CisKKyAgICBQUklOVEYoImZsYXNoUmVzZXQ6IGRvbmVcbiIpOworfQorCitQUklWQVRFIGludCBmbGFzaFByb2JlKGZsYXNoX2Rldl90ICpkZXYpCit7CisgICAgaW50CQkJcnYsIGRldmljZUlELCB2ZW5kb3JJRDsKKworICAgIFBSSU5URigiZmxhc2hQcm9iZTogZGV2PSVkXG4iLCBERVZfTk8oZGV2KSk7CisKKyAgICBpZiAoZGV2LT5iYW5rICE9IEZMQVNIMF9CQU5LKSB7CisgICAgCXJ2ID0gRVJST1I7CisJZ290byBET05FOworICAgIH0KKworICAgIEZMQVNIMF9XUklURShkZXYsIDB4YWFhLCAweGFhKTsKKyAgICBGTEFTSDBfV1JJVEUoZGV2LCAweDU1NSwgMHg1NSk7CisgICAgRkxBU0gwX1dSSVRFKGRldiwgMHhhYWEsIDB4OTApOworCisgICAgdWRlbGF5KFNMRUVQX0RFTEFZKTsKKworICAgIHZlbmRvcklEID0gRkxBU0gwX1JFQUQoZGV2LCAwKTsKKyAgICBkZXZpY2VJRCA9IEZMQVNIMF9SRUFEKGRldiwgMik7CisKKyAgICBGTEFTSDBfV1JJVEUoZGV2LCAwLCAweGYwKTsKKworICAgIFBSSU5URigiZmxhc2hQcm9iZTogdmVuZG9yPTB4JXggZGV2aWNlPTB4JXhcbiIsIHZlbmRvcklELCBkZXZpY2VJRCk7CisKKyAgICBpZiAodmVuZG9ySUQgPT0gZGV2LT52ZW5kb3JJRCAmJiBkZXZpY2VJRCA9PSBkZXYtPmRldmljZUlEKQorCXJ2ID0gT0s7CisgICAgZWxzZQorCXJ2ID0gRVJST1I7CisKK0RPTkU6CisgICAgUFJJTlRGKCJmbGFzaFByb2JlOiBydj0lZFxuIiwgcnYpOworCisgICAgcmV0dXJuIHJ2OworfQorCitQUklWQVRFIGludCBmbGFzaFdhaXQoZmxhc2hfZGV2X3QgKmRldiwgaW50IGFkZHIsIGludCBleHBlY3QsIGludCBlcmFzZSkKK3sKKyAgICBpbnQJCQlydiA9IEVSUk9SOworICAgIGludAkJCWksIGRhdGE7CisgICAgaW50CQkJcG9sbHM7CisjaWYgMAorICAgIFBSSU5URigiZmxhc2hXYWl0OiBkZXY9JWQgYWRkcj0weCV4IGV4cGVjdD0weCV4IGVyYXNlPSVkXG4iLAorCSAgIERFVl9OTyhkZXYpLCBhZGRyLCBleHBlY3QsIGVyYXNlKTsKKyNlbmRpZgorCisgICAgaWYgKGRldi0+YmFuayAhPSBGTEFTSDBfQkFOSykgeworCXJ2ID0gRVJST1I7CisJZ290byBkb25lOworICAgIH0KKworICAgIGlmIChlcmFzZSkKKwlwb2xscyA9IEZMQVNIX0VSQVNFX1NFQ1RPUl9USU1FT1VUOwkvKiBUaWNrcyAqLworICAgIGVsc2UKKwlwb2xscyA9IEZMQVNIX1BST0dSQU1fUE9MTFM7CQkvKiBMb29wcyAqLworCisgICAgZm9yIChpID0gMDsgaSA8IHBvbGxzOyBpKyspIHsKKwlpZiAoZXJhc2UpCisJICAgIHVkZWxheShTTEVFUF9ERUxBWSk7CisKKwlkYXRhID0gRkxBU0gwX1JFQUQoZGV2LCBhZGRyKTsKKworCWlmICgoKGRhdGEgXiBleHBlY3QpICYgMHg4MCkgPT0gMCkgeworCSAgICBydiA9IE9LOworCSAgICBnb3RvIGRvbmU7CisJfQorCisJaWYgKGRhdGEgJiAweDIwKSB7CisJICAgIC8qCisJICAgICAqIElmIHRoZSAweDIwIGJpdCBoYXMgY29tZSBvbiwgaXQgY291bGQgYWN0dWFsbHkgYmUgYmVjYXVzZQorCSAgICAgKiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCwgc28gY2hlY2sgdGhlIGRvbmUgYml0IGFnYWluLgorCSAgICAgKi8KKworCSAgICBkYXRhID0gRkxBU0gwX1JFQUQoZGV2LCBhZGRyKTsKKworCSAgICBpZiAoKChkYXRhIF4gZXhwZWN0KSAmIDB4ODApID09IDApIHsKKwkJcnYgPSBPSzsKKwkJZ290byBkb25lOworCSAgICB9CisKKwkgICAgcHJpbnRmKCJmbGFzaFdhaXQ6IFByb2dyYW0gZXJyb3IgKGRldjogJWQsIGFkZHI6IDB4JXgpXG4iLAorCQkgICBERVZfTk8oZGV2KSwgYWRkcik7CisKKwkgICAgZmxhc2hSZXNldChkZXYpOworCSAgICBydiA9IEVSUk9SOworCSAgICBnb3RvIGRvbmU7CisJfQorICAgIH0KKworICAgIHByaW50ZigiZmxhc2hXYWl0OiBUaW1lb3V0ICVzIChkZXY6ICVkLCBhZGRyOiAweCV4KVxuIiwKKwkgICBlcmFzZSA/ICJlcmFzaW5nIHNlY3RvciIgOiAicHJvZ3JhbW1pbmcgYnl0ZSIsCisJICAgREVWX05PKGRldiksIGFkZHIpOworCitkb25lOgorCisjaWYgMAorICAgIFBSSU5URigiZmxhc2hXYWl0OiBydj0lZFxuIiwgcnYpOworI2VuZGlmCisKKyAgICByZXR1cm4gcnY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFB1YmxpYyBGbGFzaCBSb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworU1RBVFVTIGZsYXNoTGliSW5pdCh2b2lkKQoreworICAgIGludAkJCWk7CisKKyAgICBQUklOVEYoImZsYXNoTGliSW5pdDogZGV2aWNlcz0lZFxuIiwgZmxhc2hEZXZDb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmxhc2hEZXZDb3VudDsgaSsrKSB7CisJZmxhc2hfZGV2X3QJKmRldiA9ICZmbGFzaERldltpXTsKKwkvKgorCSAqIEZvciBiYW5rIDEsIHByb2JlIGJvdGggd2l0aG91dCBhbmQgd2l0aCBieXRlIHN3YXBwYWdlLAorCSAqIHNvIHRoYXQgdGhpcyBtb2R1bGUgd29ya3Mgb24gYm90aCBvbGQgYW5kIG5ldyBNb3Vzc2UgYm9hcmRzLgorCSAqLworCisJZmxhc2hSZXNldChkZXYpOworCisJaWYgKGZsYXNoUHJvYmUoZGV2KSAhPSBFUlJPUikKKwkgICAgZGV2LT5mb3VuZCA9IDE7CisKKwkgICAgZmxhc2hSZXNldChkZXYpOworCisJICAgIGlmIChmbGFzaFByb2JlKGRldikgIT0gRVJST1IpCisJCWRldi0+Zm91bmQgPSAxOworCisJICAgIGRldi0+c3dhcCA9IDA7CisKKwkgICAgaWYoZGV2LT5mb3VuZCl7CisJICAgICAgUFJJTlRGKCJcbiAgRkxBU0ggJXNbJWRdOiBpb2Jhc2U9MHgleCAtICVkIHNlY3RvcnMgJWQgS0IiLAorCQkgICAgIGZsYXNoRGV2W2ldLm5hbWUsaSxmbGFzaERldltpXS5iYXNlLCBmbGFzaERldltpXS5zZWN0b3JzLAorCQkgICAgIChmbGFzaERldltpXS5zZWN0b3JzICogRkxBU0hfU0VDVE9SX1NJWkUpLzEwMjQpOworCisJICAgIH0KKyAgICB9CisKKyAgICBmbGFzaExpYkluaXRlZCA9IDE7CisKKyAgICBQUklOVEYoImZsYXNoTGliSW5pdDogZG9uZVxuIik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1NUQVRVUyBmbGFzaEVyYXNlU2VjdG9yKGZsYXNoX2Rldl90ICpkZXYsIGludCBzZWN0b3IpCit7CisgICAgaW50CQkJcG9zLCBhZGRyOworCisgICAgUFJJTlRGKCJmbGFzaEVyYXNlc2VjdG9yOiBkZXY9JWQgc2VjdG9yPSVkXG4iLCBERVZfTk8oZGV2KSwgc2VjdG9yKTsKKworICAgIGlmIChmbGFzaENoZWNrKGRldikgPT0gRVJST1IpCisJcmV0dXJuIEVSUk9SOworCisgICAgaWYgKHNlY3RvciA8IDAgfHwgc2VjdG9yID49IGRldi0+c2VjdG9ycykgeworCXByaW50ZigiZmxhc2hFcmFzZVNlY3RvcjogU2VjdG9yIG91dCBvZiByYW5nZSAoZGV2OiAlZCwgc2VjdG9yOiAlZClcbiIsCisJICAgICAgIERFVl9OTyhkZXYpLCBzZWN0b3IpOworCXJldHVybiBFUlJPUjsKKyAgICB9CisKKyAgICBwb3MgPSBGTEFTSF9TRUNUT1JfUE9TKGRldiwgc2VjdG9yKTsKKworICAgIGlmIChkZXYtPmJhbmsgIT0gRkxBU0gwX0JBTkspIHsKKwlyZXR1cm4gRVJST1I7CisgICAgfQorCisgICAgYWRkciA9IHBvczsKKworICAgIEZMQVNIMF9XUklURShkZXYsIDB4YWFhLCAweGFhKTsKKyAgICBGTEFTSDBfV1JJVEUoZGV2LCAweDU1NSwgMHg1NSk7CisgICAgRkxBU0gwX1dSSVRFKGRldiwgMHhhYWEsIDB4ODApOworICAgIEZMQVNIMF9XUklURShkZXYsIDB4YWFhLCAweGFhKTsKKyAgICBGTEFTSDBfV1JJVEUoZGV2LCAweDU1NSwgMHg1NSk7CisgICAgRkxBU0gwX1dSSVRFKGRldiwgYWRkciwgMHgzMCk7CisKKyAgICByZXR1cm4gZmxhc2hXYWl0KGRldiwgYWRkciwgMHhmZiwgMSk7Cit9CisKKy8qCisgKiBOb3RlOiBpdCB0YWtlcyBhYm91dCBhcyBsb25nIHRvIGZsYXNoIGFsbCBzZWN0b3JzIHRvZ2V0aGVyIHdpdGggQ2hpcAorICogRXJhc2UgYXMgaXQgZG9lcyB0byBmbGFzaCB0aGVtIG9uZSBhdCBhIHRpbWUgKGFib3V0IDMwIHNlY29uZHMgZm9yIDIKKyAqIE1CKS4gIEFsc28gc2luY2Ugd2Ugd2FudCB0byBiZSBhYmxlIHRvIHRyZWF0IHN1YnNldHMgb2Ygc2VjdG9ycyBhcyBpZgorICogdGhleSB3ZXJlIGNvbXBsZXRlIGRldmljZXMsIHdlIGRvbid0IHVzZSBDaGlwIEVyYXNlLgorICovCisKK1NUQVRVUyBmbGFzaEVyYXNlKGZsYXNoX2Rldl90ICpkZXYpCit7CisgICAgaW50CQkJc2VjdG9yOworCisgICAgUFJJTlRGKCJmbGFzaEVyYXNlOiBkZXY9JWQgc2VjdG9ycz0lZFxuIiwgREVWX05PKGRldiksIGRldi0+c2VjdG9ycyk7CisKKyAgICBpZiAoZmxhc2hDaGVjayhkZXYpID09IEVSUk9SKQorCXJldHVybiBFUlJPUjsKKworICAgIGZvciAoc2VjdG9yID0gMDsgc2VjdG9yIDwgZGV2LT5zZWN0b3JzOyBzZWN0b3IrKykgeworICAgICAgaWYgKGZsYXNoRXJhc2VTZWN0b3IoZGV2LCBzZWN0b3IpID09IEVSUk9SKQorCSAgICByZXR1cm4gRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFJlYWQgYW5kIHdyaXRlIGJ5dGVzCisgKi8KKworU1RBVFVTIGZsYXNoUmVhZChmbGFzaF9kZXZfdCAqZGV2LCBpbnQgcG9zLCBjaGFyICpidWYsIGludCBsZW4pCit7CisgICAgaW50CQkJYWRkciwgd29yZHM7CisKKyAgICBQUklOVEYoImZsYXNoUmVhZDogZGV2PSVkIHBvcz0weCV4IGJ1Zj0weCV4IGxlbj0weCV4XG4iLAorCSAgIERFVl9OTyhkZXYpLCBwb3MsIChpbnQpIGJ1ZiwgbGVuKTsKKworICAgIGlmIChmbGFzaENoZWNrKGRldikgPT0gRVJST1IpCisJcmV0dXJuIEVSUk9SOworCisgICAgaWYgKHBvcyA8IDAgfHwgbGVuIDwgMCB8fCBwb3MgKyBsZW4gPiBGTEFTSF9NQVhfUE9TKGRldikpIHsKKwlwcmludGYoImZsYXNoUmVhZDogUG9zaXRpb24gb3V0IG9mIHJhbmdlICIKKwkgICAgICAgIihkZXY6ICVkLCBwb3M6IDB4JXgsIGxlbjogMHgleClcbiIsCisJICAgICAgIERFVl9OTyhkZXYpLCBwb3MsIGxlbik7CisJcmV0dXJuIEVSUk9SOworICAgIH0KKworICAgIGlmIChsZW4gPT0gMCkKKwlyZXR1cm4gT0s7CisKKyAgICBpZiAoZGV2LT5iYW5rID09IEZMQVNIMF9CQU5LKSB7CisJYWRkciA9IHBvczsKKwl3b3JkcyA9IGxlbjsKKworCVBSSU5URigiZmxhc2hSZWFkOiBtZW1jcHkoMHgleCwgMHgleCwgMHgleClcbiIsCisJICAgICAgIChpbnQpIGJ1ZiwgKGludCkgRkxBU0gwX0FERFIoZGV2LCBwb3MpLCBsZW4pOworCisJbWVtY3B5KGJ1ZiwgRkxBU0gwX0FERFIoZGV2LCBhZGRyKSwgd29yZHMpOworCisgICAgfQorICAgIFBSSU5URigiZmxhc2hSZWFkOiBydj1PS1xuIik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1NUQVRVUyBmbGFzaFdyaXRlKGZsYXNoX2Rldl90ICpkZXYsIGludCBwb3MsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBpbnQgCQlhZGRyLCB3b3JkczsKKworICAgIFBSSU5URigiZmxhc2hXcml0ZTogZGV2PSVkIHBvcz0weCV4IGJ1Zj0weCV4IGxlbj0weCV4XG4iLAorCSAgIERFVl9OTyhkZXYpLCBwb3MsIChpbnQpIGJ1ZiwgbGVuKTsKKworICAgIGlmIChmbGFzaENoZWNrKGRldikgPT0gRVJST1IpCisJcmV0dXJuIEVSUk9SOworCisgICAgaWYgKHBvcyA8IDAgfHwgbGVuIDwgMCB8fCBwb3MgKyBsZW4gPiBGTEFTSF9NQVhfUE9TKGRldikpIHsKKwlwcmludGYoImZsYXNoV3JpdGU6IFBvc2l0aW9uIG91dCBvZiByYW5nZSAiCisJICAgICAgICIoZGV2OiAlZCwgcG9zOiAweCV4LCBsZW46IDB4JXgpXG4iLAorCSAgICAgICBERVZfTk8oZGV2KSwgcG9zLCBsZW4pOworCXJldHVybiBFUlJPUjsKKyAgICB9CisKKyAgICBpZiAobGVuID09IDApCisJcmV0dXJuIE9LOworCisgICAgaWYgKGRldi0+YmFuayA9PSBGTEFTSDBfQkFOSykgeworCXVuc2lnbmVkIGNoYXIgdG1wOworCisJYWRkciA9IHBvczsKKwl3b3JkcyA9IGxlbjsKKworCXdoaWxlICh3b3Jkcy0tKSB7CisJICAgIHRtcCA9ICpidWY7CisJICAgIGlmICh+RkxBU0gwX1JFQUQoZGV2LCBhZGRyKSAmIHRtcCkgeworCQlwcmludGYoImZsYXNoV3JpdGU6IEF0dGVtcHQgdG8gcHJvZ3JhbSAwIHRvIDEgIgorCQkgICAgICAgIihkZXY6ICVkLCBhZGRyOiAweCV4LCBkYXRhOiAweCV4KVxuIiwKKwkJICAgICAgIERFVl9OTyhkZXYpLCBhZGRyLCB0bXApOworCQlyZXR1cm4gRVJST1I7CisJICAgIH0KKwkgICAgRkxBU0gwX1dSSVRFKGRldiwgMHhhYWEsIDB4YWEpOworCSAgICBGTEFTSDBfV1JJVEUoZGV2LCAweDU1NSwgMHg1NSk7CisJICAgIEZMQVNIMF9XUklURShkZXYsIDB4YWFhLCAweGEwKTsKKwkgICAgRkxBU0gwX1dSSVRFKGRldiwgYWRkciwgdG1wKTsKKwkgICAgaWYgKGZsYXNoV2FpdChkZXYsIGFkZHIsIHRtcCwgMCkgPCAwKQorCQlyZXR1cm4gRVJST1I7CisJICAgIGJ1ZisrOworCSAgICBhZGRyKys7CisJfQorICAgIH0KKworICAgIFBSSU5URigiZmxhc2hXcml0ZTogcnY9T0tcbiIpOworCisgICAgcmV0dXJuIE9LOworfQorCisvKgorICogZmxhc2hXcml0YWJsZSByZXR1cm5zIFRSVUUgaWYgYSByYW5nZSBjb250YWlucyBhbGwgRidzLgorICovCisKK1NUQVRVUyBmbGFzaFdyaXRhYmxlKGZsYXNoX2Rldl90ICpkZXYsIGludCBwb3MsIGludCBsZW4pCit7CisgICAgaW50IAkJYWRkciwgd29yZHM7CisgICAgaW50CQkJcnYgPSBFUlJPUjsKKworICAgIFBSSU5URigiZmxhc2hXcml0YWJsZTogZGV2PSVkIHBvcz0weCV4IGxlbj0weCV4XG4iLAorCSAgIERFVl9OTyhkZXYpLCBwb3MsIGxlbik7CisKKyAgICBpZiAoZmxhc2hDaGVjayhkZXYpID09IEVSUk9SKQorCWdvdG8gZG9uZTsKKworICAgIGlmIChwb3MgPCAwIHx8IGxlbiA8IDAgfHwgcG9zICsgbGVuID4gRkxBU0hfTUFYX1BPUyhkZXYpKSB7CisJcHJpbnRmKCJmbGFzaFdyaXRhYmxlOiBQb3NpdGlvbiBvdXQgb2YgcmFuZ2UgIgorCSAgICAgICAiKGRldjogJWQsIHBvczogMHgleCwgbGVuOiAweCV4KVxuIiwKKwkgICAgICAgREVWX05PKGRldiksIHBvcywgbGVuKTsKKwlnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKGxlbiA9PSAwKSB7CisJcnYgPSAxOworCWdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBpZiAoZGV2LT5iYW5rID09IEZMQVNIMF9CQU5LKSB7CisJYWRkciA9IHBvczsKKwl3b3JkcyA9IGxlbjsKKworCXdoaWxlICh3b3Jkcy0tKSB7CisJICAgIGlmIChGTEFTSDBfUkVBRChkZXYsIGFkZHIpICE9IDB4ZmYpIHsKKwkJcnYgPSAwOworCQlnb3RvIGRvbmU7CisJICAgIH0KKwkgICAgYWRkcisrOworCX0KKyAgICB9CisKKyAgICBydiA9IDE7CisKKyBkb25lOgorICAgIFBSSU5URigiZmxhc2hXcml0ZTogcnY9JWRcbiIsIHJ2KTsKKyAgICByZXR1cm4gcnY7Cit9CisKKworLyoKKyAqIE5PVEU6IHRoZSBiZWxvdyBjb2RlIGNhbm5vdCBydW4gZnJvbSBGTEFTSCEhIQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGbGFzaCBEaWFnbm9zdGljcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworU1RBVFVTIGZsYXNoRGlhZyhmbGFzaF9kZXZfdCAqZGV2KQoreworICAgIHVuc2lnbmVkIGludAkqYnVmID0gMDsKKyAgICBpbnQJCQlpLCBsZW4sIHNlY3RvcjsKKyAgICBpbnQJCQlydiA9IEVSUk9SOworCisgICAgaWYgKGZsYXNoQ2hlY2soZGV2KSA9PSBFUlJPUikKKwlyZXR1cm4gRVJST1I7CisKKyAgICBwcmludGYoImZsYXNoRGlhZzogVGVzdGluZyBkZXZpY2UgJWQsICIKKwkgICAiYmFzZTogMHgleCwgJWQgc2VjdG9ycyBAICVkIGtCID0gJWQga0JcbiIsCisJICAgREVWX05PKGRldiksIGRldi0+YmFzZSwKKwkgICBkZXYtPnNlY3RvcnMsCisJICAgMSA8PCAoZGV2LT5sZ1NlY3RvclNpemUgLSAxMCksCisJICAgZGV2LT5zZWN0b3JzIDw8IChkZXYtPmxnU2VjdG9yU2l6ZSAtIDEwKSk7CisKKyAgICBsZW4gPSAxIDw8IGRldi0+bGdTZWN0b3JTaXplOworCisgICAgcHJpbnRmKCJmbGFzaERpYWc6IEVyYXNpbmdcbiIpOworCisgICAgaWYgKGZsYXNoRXJhc2UoZGV2KSA9PSBFUlJPUikgeworCXByaW50ZigiZmxhc2hEaWFnOiBFcmFzZSBmYWlsZWRcbiIpOworCWdvdG8gZG9uZTsKKyAgICB9CisgICAgcHJpbnRmKCIlZCBieXRlcyByZXF1ZXN0ZWQgLi4uXG4iLCBsZW4pOworICAgIGJ1ZiA9IG1hbGxvYyhsZW4pOworICAgIHByaW50ZigiYWxsb2NhdGVkICVkIGJ5dGVzIC4uLlxuIiwgbGVuKTsKKyAgICBpZiAoYnVmID09IDApIHsKKwlwcmludGYoImZsYXNoRGlhZzogT3V0IG9mIG1lbW9yeVxuIik7CisJZ290byBkb25lOworICAgIH0KKworICAgIC8qCisgICAgICogV3JpdGUgdW5pcXVlIGNvdW50aW5nIHBhdHRlcm4gdG8gZWFjaCBzZWN0b3IKKyAgICAgKi8KKworICAgIGZvciAoc2VjdG9yID0gMDsgc2VjdG9yIDwgZGV2LT5zZWN0b3JzOyBzZWN0b3IrKykgeworCXByaW50ZigiZmxhc2hEaWFnOiBXcml0ZSBzZWN0b3IgJWRcbiIsIHNlY3Rvcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuIC8gNDsgaSsrKQorCSAgICBidWZbaV0gPSBzZWN0b3IgPDwgMjQgfCBpOworCisJaWYgKGZsYXNoV3JpdGUoZGV2LAorCQkgICAgICAgc2VjdG9yIDw8IGRldi0+bGdTZWN0b3JTaXplLAorCQkgICAgICAgKGNoYXIgKikgYnVmLAorCQkgICAgICAgbGVuKSA9PSBFUlJPUikgeworCSAgICBwcmludGYoImZsYXNoRGlhZzogV3JpdGUgZmFpbGVkIChkZXY6ICVkLCBzZWN0b3I6ICVkKVxuIiwKKwkJICAgREVWX05PKGRldiksIHNlY3Rvcik7CisJICAgIGdvdG8gZG9uZTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBWZXJpZnkKKyAgICAgKi8KKworICAgIGZvciAoc2VjdG9yID0gMDsgc2VjdG9yIDwgZGV2LT5zZWN0b3JzOyBzZWN0b3IrKykgeworCXByaW50ZigiZmxhc2hEaWFnOiBWZXJpZnkgc2VjdG9yICVkXG4iLCBzZWN0b3IpOworCisJaWYgKGZsYXNoUmVhZChkZXYsCisJCSAgICAgIHNlY3RvciA8PCBkZXYtPmxnU2VjdG9yU2l6ZSwKKwkJICAgICAgKGNoYXIgKikgYnVmLAorCQkgICAgICBsZW4pID09IEVSUk9SKSB7CisJICAgIHByaW50ZigiZmxhc2hEaWFnOiBSZWFkIGZhaWxlZCAoZGV2OiAlZCwgc2VjdG9yOiAlZClcbiIsCisJCSAgIERFVl9OTyhkZXYpLCBzZWN0b3IpOworCSAgICBnb3RvIGRvbmU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbiAvIDQ7IGkrKykgeworCSAgICBpZiAoYnVmW2ldICE9IChzZWN0b3IgPDwgMjQgfCBpKSkgeworCQlwcmludGYoImZsYXNoRGlhZzogVmVyaWZ5IGVycm9yICIKKwkJICAgICAgICIoZGV2OiAlZCwgc2VjdG9yOiAlZCwgb2Zmc2V0OiAweCV4KVxuIiwKKwkJICAgICAgIERFVl9OTyhkZXYpLCBzZWN0b3IsIGkpOworCQlwcmludGYoImZsYXNoRGlhZzogRXhwZWN0ZWQgMHglMDh4LCBnb3QgMHglMDh4XG4iLAorCQkgICAgICAgc2VjdG9yIDw8IDI0IHwgaSwgYnVmW2ldKTsKKworCQlnb3RvIGRvbmU7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHJpbnRmKCJmbGFzaERpYWc6IEVyYXNpbmdcbiIpOworCisgICAgaWYgKGZsYXNoRXJhc2UoZGV2KSA9PSBFUlJPUikgeworCXByaW50ZigiZmxhc2hEaWFnOiBGaW5hbCBlcmFzZSBmYWlsZWRcbiIpOworCWdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBydiA9IE9LOworCisgZG9uZToKKyAgICBpZiAoYnVmKQorCWZyZWUoYnVmKTsKKworICAgIGlmIChydiA9PSBPSykKKwlwcmludGYoImZsYXNoRGlhZzogRGV2aWNlICVkIHBhc3NlZFxuIiwgREVWX05PKGRldikpOworICAgIGVsc2UKKwlwcmludGYoImZsYXNoRGlhZzogRGV2aWNlICVkIGZhaWxlZFxuIiwgREVWX05PKGRldikpOworCisgICAgcmV0dXJuIHJ2OworfQorCitTVEFUVVMgZmxhc2hEaWFnQWxsKHZvaWQpCit7CisgICAgaW50CQkJaTsKKyAgICBpbnQJCQlydiA9IE9LOworCisgICAgUFJJTlRGKCJmbGFzaERpYWdBbGw6IGRldmljZXM9JWRcbiIsIGZsYXNoRGV2Q291bnQpOworCisgICAgZm9yIChpID0gMDsgaSA8IGZsYXNoRGV2Q291bnQ7IGkrKykgeworCWZsYXNoX2Rldl90CSpkZXYgPSAmZmxhc2hEZXZbaV07CisKKwlpZiAoZGV2LT5mb3VuZCAmJiBmbGFzaERpYWcoZGV2KSA9PSBFUlJPUikKKwkgICAgcnYgPSBFUlJPUjsKKyAgICB9CisKKyAgICBpZiAocnYgPT0gT0spCisJcHJpbnRmKCJmbGFzaERpYWdBbGw6IFBhc3NlZFxuIik7CisgICAgZWxzZQorCXByaW50ZigiZmxhc2hEaWFnQWxsOiBGYWlsZWQgYmVjYXVzZSBvZiBlYXJsaWVyIGVycm9yc1xuIik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit1bnNpZ25lZCBsb25nIGZsYXNoX2luaXQgKHZvaWQpCit7CisgICAgdW5zaWduZWQgbG9uZyBzaXplID0gMDsKKyAgICBmbGFzaF9kZXZfdAkqZGV2ID0gTlVMTDsKKyAgICBmbGFzaExpYkluaXQoKTsKKworICAgIC8qCisgICAgICogUHJvdmlkZSBpbmZvIGZvciBGTEFTSCAodXAgdG8gOTYwSykgb2YgS2VybmVsIEltYWdlIGRhdGEuCisgICAgICovCisgICAgZGV2ID0gRkxBU0hfREVWX0JBTkswX0xPVzsKKyAgICBmbGFzaF9pbmZvW0ZMQVNIX0JBTktfS0VSTkVMXS5mbGFzaF9pZCA9CisgICAgICAoZGV2LT52ZW5kb3JJRCA8PCAxNikgfCBkZXYtPmRldmljZUlEOworICAgIGZsYXNoX2luZm9bRkxBU0hfQkFOS19LRVJORUxdLnNlY3Rvcl9jb3VudCA9IGRldi0+c2VjdG9yczsKKyAgICBmbGFzaF9pbmZvW0ZMQVNIX0JBTktfS0VSTkVMXS5zaXplID0KKyAgICAgIGZsYXNoX2luZm9bRkxBU0hfQkFOS19LRVJORUxdLnNlY3Rvcl9jb3VudCAqIEZMQVNIX1NFQ1RPUl9TSVpFOworICAgIGZsYXNoX2luZm9bRkxBU0hfQkFOS19LRVJORUxdLnN0YXJ0W0ZJUlNUX1NFQ1RPUl0gPSBkZXYtPmJhc2U7CisgICAgc2l6ZSArPSBmbGFzaF9pbmZvW0ZMQVNIX0JBTktfS0VSTkVMXS5zaXplOworCisgICAgLyoKKyAgICAgKiBQcm92aWRlIGluZm8gZm9yIDUxMksgUExDQyBGTEFTSCBST00gKFUtQm9vdCkKKyAgICAgKi8KKyAgICBkZXYgPSBGTEFTSF9ERVZfQkFOSzBfQk9PVDsKKyAgICBmbGFzaF9pbmZvW0ZMQVNIX0JBTktfQk9PVF0uZmxhc2hfaWQgPQorICAgICAgKGRldi0+dmVuZG9ySUQgPDwgMTYpIHwgZGV2LT5kZXZpY2VJRDsKKyAgICBmbGFzaF9pbmZvW0ZMQVNIX0JBTktfQk9PVF0uc2VjdG9yX2NvdW50ID0gZGV2LT5zZWN0b3JzOworICAgIGZsYXNoX2luZm9bRkxBU0hfQkFOS19CT09UXS5zaXplID0KKyAgICAgIGZsYXNoX2luZm9bRkxBU0hfQkFOS19CT09UXS5zZWN0b3JfY291bnQgKiBGTEFTSF9TRUNUT1JfU0laRTsKKyAgICBmbGFzaF9pbmZvW0ZMQVNIX0JBTktfQk9PVF0uc3RhcnRbRklSU1RfU0VDVE9SXSA9IGRldi0+YmFzZTsKKyAgICBzaXplICs9IGZsYXNoX2luZm9bRkxBU0hfQkFOS19CT09UXS5zaXplOworCisKKyAgICAvKgorICAgICAqIFByb3ZpZGUgaW5mbyBmb3IgNTEySyBGTEFTSDAgc2VnbWVudCAoVS1Cb290KQorICAgICAqLworICAgIGRldiA9IEZMQVNIX0RFVl9CQU5LMF9ISUdIOworICAgIGZsYXNoX2luZm9bRkxBU0hfQkFOS19BVVhdLmZsYXNoX2lkID0KKyAgICAgIChkZXYtPnZlbmRvcklEIDw8IDE2KSB8IGRldi0+ZGV2aWNlSUQ7CisgICAgZmxhc2hfaW5mb1tGTEFTSF9CQU5LX0FVWF0uc2VjdG9yX2NvdW50ID0gZGV2LT5zZWN0b3JzOworICAgIGZsYXNoX2luZm9bRkxBU0hfQkFOS19BVVhdLnNpemUgPQorICAgICAgZmxhc2hfaW5mb1tGTEFTSF9CQU5LX0FVWF0uc2VjdG9yX2NvdW50ICogRkxBU0hfU0VDVE9SX1NJWkU7CisgICAgZmxhc2hfaW5mb1tGTEFTSF9CQU5LX0FVWF0uc3RhcnRbRklSU1RfU0VDVE9SXSA9IGRldi0+YmFzZTsKKyAgICBzaXplICs9IGZsYXNoX2luZm9bRkxBU0hfQkFOS19BVVhdLnNpemU7CisKKworICAgIHJldHVybiAgc2l6ZTsKK30KKworLyoKKyAqIEdldCBmbGFzaCBkZXZpY2UgZnJvbSBVLUJvb3QgZmxhc2ggaW5mby4KKyAqLworZmxhc2hfZGV2X3QqCitnZXRGbGFzaERldkZyb21JbmZvKGZsYXNoX2luZm9fdCogaW5mbykKK3sKKyAgaW50IGk7CisKKyAgaWYoIWluZm8pCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IGZsYXNoRGV2Q291bnQ7IGkrKykgeworICAgIGZsYXNoX2Rldl90CSpkZXYgPSAmZmxhc2hEZXZbaV07CisgICAgaWYoZGV2LT5mb3VuZCAmJiAoZGV2LT5iYXNlID09IGluZm8tPnN0YXJ0WzBdKSkKKyAgICAgIHJldHVybiBkZXY7CisgIH0KKyAgcHJpbnRmKCJFUlJPUjogbm90aWNlLCBubyBGTEFTSCBtYXBwZWQgYXQgYWRkcmVzcyAweCV4XG4iLAorCSAodW5zaWduZWQgaW50KWluZm8tPnN0YXJ0WzBdKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3Vsb25nCitmbGFzaF9nZXRfc2l6ZSAodnVfbG9uZyAqYWRkciwgZmxhc2hfaW5mb190ICppbmZvKQoreworICAgIGludCBpOworICAgIGZvcihpID0gMDsgaSA8IGZsYXNoRGV2Q291bnQ7IGkrKykgeworICAgICAgZmxhc2hfZGV2X3QJKmRldiA9ICZmbGFzaERldltpXTsKKyAgICAgIGlmKGRldi0+Zm91bmQpeworCWlmKGRldi0+YmFzZSA9PSAodW5zaWduZWQgaW50KWFkZHIpeworCSAgaW5mby0+Zmxhc2hfaWQgPSAoZGV2LT52ZW5kb3JJRCA8PCAxNikgfCBkZXYtPmRldmljZUlEOworCSAgaW5mby0+c2VjdG9yX2NvdW50ID0gZGV2LT5zZWN0b3JzOworCSAgaW5mby0+c2l6ZSA9IGluZm8tPnNlY3Rvcl9jb3VudCAqIEZMQVNIX1NFQ1RPUl9TSVpFOworCSAgcmV0dXJuIGRldi0+c2VjdG9ycyAqIEZMQVNIX1NFQ1RPUl9TSVpFOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2ZsYXNoX3ByaW50X2luZm8gIChmbGFzaF9pbmZvX3QgKmluZm8pCit7CisgIGludCBpOworICB1bnNpZ25lZCBpbnQgY2hpcDsKKworICAgIGlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJcHJpbnRmICgibWlzc2luZyBvciB1bmtub3duIEZMQVNIIHR5cGVcbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKChpbmZvLT5mbGFzaF9pZCA+PiAxNikgJiAweGZmKSB7CisgICAgY2FzZSAweDE6CisJcHJpbnRmICgiQU1EICIpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcHJpbnRmICgiVW5rbm93biBWZW5kb3IgIik7CisJYnJlYWs7CisgICAgfQorICAgIGNoaXAgPSAodW5zaWduZWQgaW50KSBpbmZvLT5mbGFzaF9pZCAmIDB4MDAwMDAwZmY7CisKKyAgICBzd2l0Y2ggKGNoaXApIHsKKworICAgIGNhc2UgQU1EX0lEX0YwNDBCOgorCXByaW50ZiAoIkFNMjlGMDQwQiAoNCBNYml0KVxuIik7CisJYnJlYWs7CisKKyAgICBjYXNlIEFNRF9JRF9MVjE2MEI6CisgICAgY2FzZSBGTEFTSF9BTTE2MExWOgorICAgIGNhc2UgMHg0OToKKwlwcmludGYgKCJBTTI5TFYxNjBCICgxNiBNYml0IC8gMk0geCA4Yml0KVxuIik7CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmICgiVW5rbm93biBDaGlwIFR5cGU6MHgleFxuIiwgY2hpcCk7CisJYnJlYWs7CisgICAgfQorCisgICAgcHJpbnRmICgiICBTaXplOiAlbGQgYnl0ZXMgaW4gJWQgU2VjdG9yc1xuIiwKKwkgICAgaW5mby0+c2l6ZSwgaW5mby0+c2VjdG9yX2NvdW50KTsKKworICAgIHByaW50ZiAoIiAgU2VjdG9yIFN0YXJ0IEFkZHJlc3NlczoiKTsKKyAgICBmb3IgKGk9MDsgaTxpbmZvLT5zZWN0b3JfY291bnQ7ICsraSkgeworICAgICAgaWYgKChpICUgNSkgPT0gMCkKKwkgIHByaW50ZiAoIlxuICAgIik7CisJcHJpbnRmICgiICUwOGxYJXMiLAorCQlpbmZvLT5zdGFydFtGSVJTVF9TRUNUT1JdICsgaSpGTEFTSF9TRUNUT1JfU0laRSwKKwkJaW5mby0+cHJvdGVjdFtpXSA/ICIgKFJPKSIgOiAiICAgICAiCisJCSk7CisgICAgfQorICAgIHByaW50ZiAoIlxuIik7Cit9CisKKworLyoKKyAqIEVyYXNlIGEgcmFuZ2Ugb2YgZmxhc2ggc2VjdG9ycy4KKyAqLworaW50IGZsYXNoX2VyYXNlIChmbGFzaF9pbmZvX3QgKmluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworICAgIHZ1X2xvbmcgKmFkZHIgPSAodnVfbG9uZyopKGluZm8tPnN0YXJ0WzBdKTsKKyAgICBpbnQgcHJvdCwgc2VjdCwgbF9zZWN0OworICAgIGZsYXNoX2Rldl90KiBkZXYgPSBOVUxMOworCisgICAgaWYgKChzX2ZpcnN0IDwgMCkgfHwgKHNfZmlyc3QgPiBzX2xhc3QpKSB7CisJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkgICAgcHJpbnRmICgiLSBtaXNzaW5nXG4iKTsKKwl9IGVsc2UgeworCSAgICBwcmludGYgKCItIG5vIHNlY3RvcnMgdG8gZXJhc2VcbiIpOworCX0KKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBwcm90ID0gMDsKKyAgICBmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgc2VjdCsrKSB7CisJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKKwkgICAgcHJvdCsrOworCX0KKyAgICB9CisKKyAgICBpZiAocHJvdCkgeworCXByaW50ZiAoIi0gV2FybmluZzogJWQgcHJvdGVjdGVkIHNlY3RvcnMgd2lsbCBub3QgYmUgZXJhc2VkIVxuIiwKKwkJcHJvdCk7CisgICAgfSBlbHNlIHsKKwlwcmludGYgKCJcbiIpOworICAgIH0KKworICAgIGxfc2VjdCA9IC0xOworCisgICAgLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLworICAgIGRldiA9IGdldEZsYXNoRGV2RnJvbUluZm8oaW5mbyk7CisgICAgaWYoZGV2KXsKKyAgICAgIHByaW50ZigiRXJhc2UgRkxBU0hbJXNdIC0lZCBzZWN0b3JzOiIsIGRldi0+bmFtZSwgZGV2LT5zZWN0b3JzKTsKKyAgICAgIGZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3Q8PXNfbGFzdDsgc2VjdCsrKSB7CisJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgewkvKiBub3QgcHJvdGVjdGVkICovCisJICBhZGRyID0gKHZ1X2xvbmcqKShkZXYtPmJhc2UpOworCSAgLyogICBwcmludGYoImVyYXNlX3NlY3Rvcjogc2VjdG9yPSVkLCBhZGRyPTB4JXhcbiIsCisJICAgICAgIHNlY3QsIGFkZHIpOyAqLworCSAgcHJpbnRmKCIuIik7CisJICBpZihFUlJPUiA9PSBmbGFzaEVyYXNlU2VjdG9yKGRldiwgc2VjdCkpeworCSAgICBwcmludGYoIkVSUk9SOiBjb3VsZCBub3QgZXJhc2Ugc2VjdG9yICVkIG9uIEZMQVNIWyVzXVxuIiwKKwkJICAgc2VjdCwgZGV2LT5uYW1lKTsKKwkgICAgcmV0dXJuIDE7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgICBwcmludGYgKCIgZG9uZVxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGEgd29yZCB0byBGbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK3N0YXRpYyBpbnQKK3dyaXRlX3dvcmQgKGZsYXNoX2luZm9fdCAqaW5mbywgdWxvbmcgZGVzdCwgdWxvbmcgZGF0YSkKK3sKKworICBmbGFzaF9kZXZfdCogZGV2ID0gZ2V0Rmxhc2hEZXZGcm9tSW5mbyhpbmZvKTsKKyAgaW50IGFkZHIgPSBkZXN0IC0gaW5mby0+c3RhcnRbMF07CisKKyAgaWYgKCEgZGV2KQorICAgIHJldHVybiAxOworCisgIGlmKE9LICE9IGZsYXNoV3JpdGUoZGV2LCBhZGRyLCAoY2hhciopJmRhdGEsIHNpemVvZih1bG9uZykpKXsKKyAgICBwcmludGYoIkVSUk9SOiBjb3VsZCBub3Qgd3JpdGUgdG8gYWRkcj0weCV4LCBkYXRhPTB4JXhcbiIsCisJICAgKHVuc2lnbmVkIGludClhZGRyLCAodW5zaWduZWQpZGF0YSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZigoYWRkciAlIEZMQVNIX1NFQ1RPUl9TSVpFKSA9PSAwKQorICAgIHByaW50ZigiLiIpOworCisKKyAgUFJJTlRGKCJ3cml0ZV93b3JkOjB4JXgsIGJhc2U9MHgleCwgYWRkcj0weCV4LCBkYXRhPTB4JXhcbiIsCisJICh1bnNpZ25lZClpbmZvLT5zdGFydFswXSwKKwkgKHVuc2lnbmVkKWRlc3QsCisJICh1bnNpZ25lZCkoZGVzdCAtIGluZm8tPnN0YXJ0WzBdKSwKKwkgKHVuc2lnbmVkKWRhdGEpOworCisKKworICAgIHJldHVybiAoMCk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCisKK2ludCB3cml0ZV9idWZmIChmbGFzaF9pbmZvX3QgKmluZm8sIHVjaGFyICpzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKyAgICB1bG9uZyBjcCwgd3AsIGRhdGE7CisgICAgaW50IGksIGwsIHJjOworICAgIGZsYXNoX2Rldl90KiBkZXYgPSBnZXRGbGFzaERldkZyb21JbmZvKGluZm8pOworCisgICAgaWYoIGRldiApIHsKKyAgICAgIHByaW50ZigiRkxBU0hbJXNdOiIsIGRldi0+bmFtZSk7CisgICAgICB3cCA9IChhZGRyICYgfjMpOwkvKiBnZXQgbG93ZXIgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KKworICAgICAgLyoKKyAgICAgICAqIGhhbmRsZSB1bmFsaWduZWQgc3RhcnQgYnl0ZXMKKyAgICAgICAqLworICAgICAgaWYgKChsID0gYWRkciAtIHdwKSAhPSAwKSB7CisJZGF0YSA9IDA7CisJZm9yIChpPTAsIGNwPXdwOyBpPGw7ICsraSwgKytjcCkgeworCSAgZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJfQorCWZvciAoOyBpPDQgJiYgY250PjA7ICsraSkgeworCSAgZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworCSAgLS1jbnQ7CisJICArK2NwOworCX0KKwlmb3IgKDsgY250PT0wICYmIGk8NDsgKytpLCArK2NwKSB7CisJICBkYXRhID0gKGRhdGEgPDwgOCkgfCAoKih1Y2hhciAqKWNwKTsKKwl9CisJaWYgKChyYyA9IHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CisJICByZXR1cm4gKHJjKTsKKwl9CisJd3AgKz0gNDsKKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAqIGhhbmRsZSB3b3JkIGFsaWduZWQgcGFydAorICAgICAgICovCisgICAgICB3aGlsZSAoY250ID49IDQpIHsKKwlkYXRhID0gMDsKKwlmb3IgKGk9MDsgaTw0OyArK2kpIHsKKwkgIGRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKKwl9CisJaWYgKChyYyA9IHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CisJICByZXR1cm4gKHJjKTsKKwl9CisJd3AgICs9IDQ7CisJY250IC09IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChjbnQgPT0gMCkgeworCXJldHVybiAoMCk7CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAgKiBoYW5kbGUgdW5hbGlnbmVkIHRhaWwgYnl0ZXMKKyAgICAgICAqLworICAgICAgZGF0YSA9IDA7CisgICAgICBmb3IgKGk9MCwgY3A9d3A7IGk8NCAmJiBjbnQ+MDsgKytpLCArK2NwKSB7CisJZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworCS0tY250OworICAgICAgfQorICAgICAgZm9yICg7IGk8NDsgKytpLCArK2NwKSB7CisJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiAod3JpdGVfd29yZChpbmZvLCB3cCwgZGF0YSkpOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCmRpZmYgLS1naXQgYS9ib2FyZC9tb3Vzc2UvbTQ4dDU5eS5jIGIvYm9hcmQvbW91c3NlL200OHQ1OXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjA1YTk2Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbW91c3NlL200OHQ1OXkuYwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIFNHUyBNNDgtVDU5WSBUT0QvTlZSQU0gRHJpdmVyCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSwgYnkgQ3VydCBNY0Rvd2VsbCwgMDgtMDYtOTksIEJyb2FkY29tIENvcnAuCisgKgorICogKEMpIENvcHlyaWdodCAyMDAxLCBKYW1lcyBEb3VnaGVydHksIDA3LzE4LzAxLCBCcm9hZGNvbSBDb3JwLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBTR1MgTTQ4LVQ1OVkgVE9EL05WUkFNIERyaXZlcgorICoKKyAqIFRoZSBTR1MgTTQ4IGFuIDhLIE5WUkFNIHN0YXJ0aW5nIGF0IG9mZnNldCBNNDhfQkFTRV9BRERSIGFuZAorICogY29udGludWluZyBmb3IgODE3NiBieXRlcy4gQWZ0ZXIgdGhhdCBzdGFydHMgdGhlIFRpbWUtT2YtRGF5IChUT0QpCisgKiByZWdpc3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gc2V0L2dldCB0aGUgaW50ZXJuYWwgZGF0ZS90aW1lIGZ1bmN0aW9ucy4KKyAqCisgKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIFkySyBjb21wbGlhbmNlIGJ5IHRha2luZyBmdWxsIHllYXIgbnVtYmVycworICogYW5kIHRyYW5zbGF0aW5nIGJhY2sgYW5kIGZvcnRoIGZyb20gdGhlIFRPRCAyLWRpZ2l0IHllYXIuCisgKgorICogTk9URTogZm9yIHByb3BlciBpbnRlcmFjdGlvbiB3aXRoIGFuIG9wZXJhdGluZyBzeXN0ZW0sIHRoZSBUT0Qgc2hvdWxkCisgKiBiZSB1c2VkIHRvIHN0b3JlIFVuaXZlcnNhbCBDb29yZGluYXRlZCBUaW1lIChHTVQpIGFuZCB0aW1lem9uZQorICogY29udmVyc2lvbnMgc2hvdWxkIGJlIHVzZWQuCisgKgorICogSGVyZSBpcyBhIGRpYWdyYW0gb2YgdGhlIG1lbW9yeSBsYXlvdXQ6CisgKgorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMHhmZmUwYTAwMAorICogfCBOb24tdm9sYXRpbGUgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgIHwgLgorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLgorICogfCAoODE3NiBieXRlcyBvZiBOb24tdm9sYXRpbGUgbWVtb3J5KSAgICAgICAgIHwgLgorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLgorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMHhmZmUwYmZmMAorICogfCBGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIDB4ZmZlMGJmZjEKKyAqIHwgVW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAweGZmZTBiZmYyCisgKiB8IEFsYXJtIFNlY29uZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMHhmZmUwYmZmMworICogfCBBbGFybSBNaW51dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIDB4ZmZlMGJmZjQKKyAqIHwgQWxhcm0gRGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAweGZmZTBiZmY1CisgKiB8IEludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMHhmZmUwYmZmNgorICogfCBXYXRjaERvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIDB4ZmZlMGJmZjcKKyAqIHwgQ2FsaWJyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAweGZmZTBiZmY4CisgKiB8IFNlY29uZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMHhmZmUwYmZmOQorICogfCBNaW51dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIDB4ZmZlMGJmZmEKKyAqIHwgSG91cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAweGZmZTBiZmZiCisgKiB8IERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMHhmZmUwYmZmYworICogfCBEYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIDB4ZmZlMGJmZmQKKyAqIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAweGZmZTBiZmZlCisgKiB8IFllYXIgKDIgZGlnaXRzIG9ubHkpICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgMHhmZmUwYmZmZgorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cnRjLmg+CisjaW5jbHVkZSAibW91c3NlLmgiCisKKy8qCisgKiBJbXBvcnRlZCBmcm9tIG1vdXNzZS5oOgorICoKKyAqICAgVE9EX1JFR19CQVNFCQlCYXNlIG9mIG00OHQ1OXkgVE9EIHJlZ2lzdGVycworICogICBTWVNfVE9EX1VOUFJPVEVDVCgpCURpc2FibGUgTlZSQU0gd3JpdGUgcHJvdGVjdAorICogICBTWVNfVE9EX1BST1RFQ1QoKQkJUmUtZW5hYmxlIE5WUkFNIHdyaXRlIHByb3RlY3QKKyAqLworCisjZGVmaW5lIFlFQVIJCTB4ZgorI2RlZmluZSBNT05USAkJMHhlCisjZGVmaW5lIERBWQkJMHhkCisjZGVmaW5lIERBWV9PRl9XRUVLCTB4YworI2RlZmluZSBIT1VSCQkweGIKKyNkZWZpbmUgTUlOVVRFCQkweGEKKyNkZWZpbmUgU0VDT05ECQkweDkKKyNkZWZpbmUgQ09OVFJPTAkJMHg4CisjZGVmaW5lIFdBVENICQkweDcKKyNkZWZpbmUgSU5UQ1RMCQkweDYKKyNkZWZpbmUgV0RfREFURQkJMHg1CisjZGVmaW5lIFdEX0hPVVIJCTB4NAorI2RlZmluZSBXRF9NSU4JCTB4MworI2RlZmluZSBXRF9TRUMJCTB4MgorI2RlZmluZSBfVU5VU0VECQkweDEKKyNkZWZpbmUgRkxBR1MJCTB4MAorCisjZGVmaW5lIE00OF9BRERSCSgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBUT0RfUkVHX0JBU0UpCisKK2ludCBtNDhfdG9kX2luaXQodm9pZCkKK3sKKyAgICBTWVNfVE9EX1VOUFJPVEVDVCgpOworCisgICAgTTQ4X0FERFJbQ09OVFJPTF0gPSAwOworICAgIE00OF9BRERSW1dBVENIXSA9IDA7CisgICAgTTQ4X0FERFJbSU5UQ1RMXSA9IDA7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBvc2NpbGxhdG9yIGlzIGN1cnJlbnRseSBzdG9wcGVkIChhcyBvbiBhIG5ldyBwYXJ0IHNoaXBwZWQKKyAgICAgKiBmcm9tIHRoZSBmYWN0b3J5KSwgc3RhcnQgaXQgcnVubmluZy4KKyAgICAgKgorICAgICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiB0aGUgVE9EIGJ5dGVzIG9uIGEgYnJhbmQgbmV3IE00OFQ1OVkgcGFydDoKKyAgICAgKgkJMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgODggOGMgYzMgYmYgYzggZjUgMDEKKyAgICAgKi8KKworICAgIGlmIChNNDhfQUREUltTRUNPTkRdICYgMHg4MCkKKwlNNDhfQUREUltTRUNPTkRdID0gMDsKKworICAgIC8qIElzIGJhdHRlcnkgbG93ICovCisgICAgaWYgKCBNNDhfQUREUltGTEFHU10gJiAweDEwKSB7CisJIHByaW50ZigiTk9USUNFOiBCYXR0ZXJ5IGxvdyBvbiBSZWFsLVRpbWUgQ2xvY2sgKHJlcGxhY2UgU05BUEhBVCkuXG4iKTsKKyAgICB9CisKKyAgICBTWVNfVE9EX1BST1RFQ1QoKTsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogbTQ4X3RvZF9zZXQKKyAqLworCitzdGF0aWMgaW50IHRvX2JjZChpbnQgdmFsdWUpCit7CisgICAgcmV0dXJuIHZhbHVlIC8gMTAgKiAxNiArIHZhbHVlICUgMTA7Cit9CisKK3N0YXRpYyBpbnQgZnJvbV9iY2QoaW50IHZhbHVlKQoreworICAgIHJldHVybiB2YWx1ZSAvIDE2ICogMTAgKyB2YWx1ZSAlIDE2OworfQorCitzdGF0aWMgaW50IGRheV9vZl93ZWVrKGludCB5LCBpbnQgbSwgaW50IGQpCS8qIDAtNiA9PT4gU3VuLVNhdCAqLworeworICAgIHN0YXRpYyBpbnQgdFtdID0gezAsIDMsIDIsIDUsIDAsIDMsIDUsIDEsIDQsIDYsIDIsIDR9OworICAgIHkgLT0gbSA8IDM7CisgICAgcmV0dXJuICh5ICsgeS80IC0geS8xMDAgKyB5LzQwMCArIHRbbS0xXSArIGQpICUgNzsKK30KKworLyoKKyAqIE5vdGU6IHRoZSBUT0Qgc2hvdWxkIHN0b3JlIHRoZSBjdXJyZW50IEdNVAorICovCisKK2ludCBtNDhfdG9kX3NldChpbnQgeWVhciwJCS8qIDE5ODAtMjA3OSAqLworCQlpbnQgbW9udGgsCQkvKiAwMS0xMiAqLworCQlpbnQgZGF5LAkJLyogMDEtMzEgKi8KKwkJaW50IGhvdXIsCQkvKiAwMC0yMyAqLworCQlpbnQgbWludXRlLAkJLyogMDAtNTkgKi8KKwkJaW50IHNlY29uZCkJCS8qIDAwLTU5ICovCisKK3sKKyAgICBTWVNfVE9EX1VOUFJPVEVDVCgpOworCisgICAgTTQ4X0FERFJbQ09OVFJPTF0gfD0gMHg4MDsJLyogU2V0IFdSSVRFIGJpdCAqLworCisgICAgTTQ4X0FERFJbWUVBUl0gPSB0b19iY2QoeWVhciAlIDEwMCk7CisgICAgTTQ4X0FERFJbTU9OVEhdID0gdG9fYmNkKG1vbnRoKTsKKyAgICBNNDhfQUREUltEQVldID0gdG9fYmNkKGRheSk7CisgICAgTTQ4X0FERFJbREFZX09GX1dFRUtdID0gZGF5X29mX3dlZWsoeWVhciwgbW9udGgsIGRheSkgKyAxOworICAgIE00OF9BRERSW0hPVVJdID0gdG9fYmNkKGhvdXIpOworICAgIE00OF9BRERSW01JTlVURV0gPSB0b19iY2QobWludXRlKTsKKyAgICBNNDhfQUREUltTRUNPTkRdID0gdG9fYmNkKHNlY29uZCk7CisKKyAgICBNNDhfQUREUltDT05UUk9MXSAmPSB+MHg4MDsJLyogQ2xlYXIgV1JJVEUgYml0ICovCisKKyAgICBTWVNfVE9EX1BST1RFQ1QoKTsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogTm90ZTogdGhlIFRPRCBzaG91bGQgc3RvcmUgdGhlIGN1cnJlbnQgR01UCisgKi8KKworaW50IG00OF90b2RfZ2V0KGludCAqeWVhciwJCS8qIDE5ODAtMjA3OSAqLworCQlpbnQgKm1vbnRoLAkJLyogMDEtMTIgKi8KKwkJaW50ICpkYXksCQkvKiAwMS0zMSAqLworCQlpbnQgKmhvdXIsCQkvKiAwMC0yMyAqLworCQlpbnQgKm1pbnV0ZSwJCS8qIDAwLTU5ICovCisJCWludCAqc2Vjb25kKQkJLyogMDAtNTkgKi8KK3sKKyAgICBpbnQgeTsKKworICAgIFNZU19UT0RfVU5QUk9URUNUKCk7CisKKyAgICBNNDhfQUREUltDT05UUk9MXSB8PSAweDQwOwkvKiBTZXQgUkVBRCBiaXQgKi8KKworICAgIHkgPSBmcm9tX2JjZChNNDhfQUREUltZRUFSXSk7CisgICAgKnllYXIgPSB5IDwgODAgPyAyMDAwICsgeSA6IDE5MDAgKyB5OworICAgICptb250aCA9IGZyb21fYmNkKE00OF9BRERSW01PTlRIXSk7CisgICAgKmRheSA9IGZyb21fYmNkKE00OF9BRERSW0RBWV0pOworICAgIC8qIGRheV9vZl93ZWVrID0gTTQ4X0FERFJbREFZX09GX1dFRUtdICYgMHhmOyAqLworICAgICpob3VyID0gZnJvbV9iY2QoTTQ4X0FERFJbSE9VUl0pOworICAgICptaW51dGUgPSBmcm9tX2JjZChNNDhfQUREUltNSU5VVEVdKTsKKyAgICAqc2Vjb25kID0gZnJvbV9iY2QoTTQ4X0FERFJbU0VDT05EXSAmIDB4N2YpOworCisgICAgTTQ4X0FERFJbQ09OVFJPTF0gJj0gfjB4NDA7CS8qIENsZWFyIFJFQUQgYml0ICovCisKKyAgICBTWVNfVE9EX1BST1RFQ1QoKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgbTQ4X3RvZF9nZXRfc2Vjb25kKHZvaWQpCit7CisgICAgcmV0dXJuIGZyb21fYmNkKE00OF9BRERSW1NFQ09ORF0gJiAweDdmKTsKK30KKworLyoKKyAqIFdhdGNoZG9nIGZ1bmN0aW9uCisgKgorICogIElmIHVzZWMgaXMgMCwgdGhlIHdhdGNoZG9nIHRpbWVyIGlzIGRpc2FybWVkLgorICoKKyAqICBJZiB1c2VjIGlzIG5vbi16ZXJvLCB0aGUgd2F0Y2hkb2cgdGltZXIgaXMgYXJtZWQgKG9yIHJlLWFybWVkKSBmb3IKKyAqICAgIGFwcHJveGltYXRlbHkgdXNlYyBtaWNyb3NlY29uZHMgKGlmIHRoZSBleGFjdCByZXF1ZXN0ZWQgdXNlYyBpcworICogICAgbm90IHN1cHBvcnRlZCBieSB0aGUgY2hpcCwgdGhlIG5leHQgaGlnaGVyIGF2YWlsYWJsZSB2YWx1ZSBpcyB1c2VkKS4KKyAqCisgKiAgTWluaW11bSB3YXRjaGRvZyB0aW1lb3V0ID0gNjI1MDAgdXNlYworICogIE1heGltdW0gd2F0Y2hkb2cgdGltZW91dCA9IDEyNCBzZWMgKDEyNDAwMDAwMCB1c2VjKQorICovCisKK3ZvaWQgbTQ4X3dhdGNoZG9nX2FybShpbnQgdXNlYykKK3sKKyAgICBpbnQJCW1weSwgcmVzOworCisgICAgU1lTX1RPRF9VTlBST1RFQ1QoKTsKKworICAgIGlmICh1c2VjID09IDApIHsKKwlyZXMgPSAwOworCW1weSA9IDA7CisgICAgfSBlbHNlIGlmICh1c2VjIDwgMjAwMDAwMCkgewkvKiBSZXNvbHV0aW9uOiAxLzE2cyBpZiBiZWxvdyAycyAqLworCXJlcyA9IDA7CisJbXB5ID0gKHVzZWMgKyA2MjQ5OSkgLyA2MjUwMDsKKyAgICB9IGVsc2UgaWYgKHVzZWMgPCA4MDAwMDAwKSB7CS8qIFJlc29sdXRpb246IDEvNHMgaWYgYmVsb3cgOHMgKi8KKwlyZXMgPSAxOworCW1weSA9ICh1c2VjICsgMjQ5OTk5KSAvIDI1MDAwMDsKKyAgICB9IGVsc2UgaWYgKHVzZWMgPCAzMjAwMDAwMCkgewkvKiBSZXNvbHV0aW9uOiAxcyBpZiBiZWxvdyAzMnMgKi8KKwlyZXMgPSAyOworCW1weSA9ICh1c2VjICsgOTk5OTk5KSAvIDEwMDAwMDA7CisgICAgfSBlbHNlIHsJCQkJLyogUmVzb2x1dGlvbjogNHMgdXAgdG8gMTI0cyAqLworCXJlcyA9IDM7CisJbXB5ID0gKHVzZWMgKyAzOTk5OTk5KSAvIDQwMDAwMDA7CisJaWYgKG1weSA+IDMxKQorCSAgICBtcHkgPSAzMTsKKyAgICB9CisKKyAgICBNNDhfQUREUltXQVRDSF0gPSAoMHg4MCB8CQkvKiBTdGVlciB0byBSU1Qgc2lnbmFsIChJUlEgPSBOL0MpICovCisJCSAgICAgICBtcHkgPDwgMiB8CisJCSAgICAgICByZXMpOworCisgICAgU1lTX1RPRF9QUk9URUNUKCk7Cit9CisKKy8qCisgKiBVLUJvb3QgUlRDIHN1cHBvcnQuCisgKi8KK3ZvaWQKK3J0Y19nZXQoIHN0cnVjdCBydGNfdGltZSAqdG1wICkKK3sKKwltNDhfdG9kX2dldCgmdG1wLT50bV95ZWFyLAorCQkgICAgJnRtcC0+dG1fbW9uLAorCQkgICAgJnRtcC0+dG1fbWRheSwKKwkJICAgICZ0bXAtPnRtX2hvdXIsCisJCSAgICAmdG1wLT50bV9taW4sCisJCSAgICAmdG1wLT50bV9zZWMpOworCXRtcC0+dG1feWRheSA9IDA7CisJdG1wLT50bV9pc2RzdD0gMDsKKworI2lmZGVmIFJUQ19ERUJVRworCXByaW50ZiggIkdldCBEQVRFOiAlNGQtJTAyZC0lMDJkICh3ZGF5PSVkKSAgVElNRTogJTJkOiUwMmQ6JTAyZFxuIiwKKwkJdG1wLT50bV95ZWFyLCB0bXAtPnRtX21vbiwgdG1wLT50bV9tZGF5LCB0bXAtPnRtX3dkYXksCisJCXRtcC0+dG1faG91ciwgdG1wLT50bV9taW4sIHRtcC0+dG1fc2VjICk7CisjZW5kaWYKK30KKwordm9pZAorcnRjX3NldCggc3RydWN0IHJ0Y190aW1lICp0bXAgKQoreworCW00OF90b2Rfc2V0KHRtcC0+dG1feWVhciwJCS8qIDE5ODAtMjA3OSAqLworCQkgICAgdG1wLT50bV9tb24sCQkvKiAwMS0xMiAqLworCQkgICAgdG1wLT50bV9tZGF5LCAgICAgICAgICAgICAgLyogMDEtMzEgKi8KKwkJICAgIHRtcC0+dG1faG91ciwJCS8qIDAwLTIzICovCisJCSAgICB0bXAtPnRtX21pbiwJCS8qIDAwLTU5ICovCisJCSAgICB0bXAtPnRtX3NlYyk7CQkvKiAwMC01OSAqLworCisjaWZkZWYgUlRDX0RFQlVHCisJcHJpbnRmKCAiU2V0IERBVEU6ICU0ZC0lMDJkLSUwMmQgKHdkYXk9JWQpICBUSU1FOiAlMmQ6JTAyZDolMDJkXG4iLAorCQl0bXAtPnRtX3llYXIsIHRtcC0+dG1fbW9uLCB0bXAtPnRtX21kYXksIHRtcC0+dG1fd2RheSwKKwkJdG1wLT50bV9ob3VyLCB0bXAtPnRtX21pbiwgdG1wLT50bV9zZWMpOworI2VuZGlmCisKK30KKwordm9pZAorcnRjX3Jlc2V0ICh2b2lkKQoreworICBtNDhfdG9kX2luaXQoKTsKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvcG04MjYvZmxhc2guYyBiL2JvYXJkL3BtODI2L2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1MTQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3BtODI2L2ZsYXNoLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEsIDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogRmxhc2ggUm91dGluZXMgZm9yIEludGVsIGRldmljZXMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisKKworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordWxvbmcgZmxhc2hfZ2V0X3NpemUgKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmJhc2VhZGRyLAorCQkJCQkgIGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJc2hvcnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYXNodGVzdF9oLCBmbGFzaHRlc3RfbDsKKworCWluZm8tPnNlY3Rvcl9jb3VudCA9IGluZm8tPnNpemUgPSAwOworCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKworCS8qIFdyaXRlIHF1ZXJ5IGNvbW1hbmQgc2VxdWVuY2UgYW5kIHRlc3QgRkxBU0ggYW5zd2VyCisJICovCisJYmFzZWFkZHJbMF0gPSAweDAwOTgwMDk4OworCWJhc2VhZGRyWzFdID0gMHgwMDk4MDA5ODsKKworCWZsYXNodGVzdF9oID0gYmFzZWFkZHJbMF07CS8qIG1hbnVmYWN0dXJlciBJRAkqLworCWZsYXNodGVzdF9sID0gYmFzZWFkZHJbMV07CisKKwlpZiAoZmxhc2h0ZXN0X2ggIT0gSU5URUxfTUFOVUZBQ1QgfHwgZmxhc2h0ZXN0X2wgIT0gSU5URUxfTUFOVUZBQ1QpCisJCXJldHVybiAoMCk7CQkvKiBubyBvciB1bmtub3duIGZsYXNoCSovCisKKwlmbGFzaHRlc3RfaCA9IGJhc2VhZGRyWzJdOwkvKiBkZXZpY2UgSUQJICAgICAgICAqLworCWZsYXNodGVzdF9sID0gYmFzZWFkZHJbM107CisKKwlpZiAoZmxhc2h0ZXN0X2ggIT0gZmxhc2h0ZXN0X2wpCisJCXJldHVybiAoMCk7CisKKwlzd2l0Y2ggKGZsYXNodGVzdF9oKSB7CisJY2FzZSBJTlRFTF9JRF8yOEYxNjBDM0I6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfMjhGMTYwQzNCOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAzOTsKKwkJaW5mby0+c2l6ZSA9IDB4MDA4MDAwMDA7CS8qIDQgKiAyIE1CID0gOCBNQgkqLworCQlicmVhazsKKwljYXNlIElOVEVMX0lEXzI4RjE2MEYzQjoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF8yOEYxNjBGM0I7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDM5OworCQlpbmZvLT5zaXplID0gMHgwMDgwMDAwMDsJLyogNCAqIDIgTUIgPSA4IE1CICAgICAgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuICgwKTsJCQkvKiBubyBvciB1bmtub3duIGZsYXNoCSovCisJfQorCisJaW5mby0+Zmxhc2hfaWQgfD0gSU5URUxfTUFOVUZBQ1QgPDwgMTY7IC8qIHNldCBtYW51ZmFjdHVyZXIgb2Zmc2V0ICovCisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9CVFlQRSkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp0bXAgPSBiYXNlYWRkcjsKKworCQkvKiBzZXQgdXAgc2VjdG9yIHN0YXJ0IGFkcmVzcyB0YWJsZSAoYm90dG9tIHNlY3RvciB0eXBlKQorCQkgKiBBTkQgdW5sb2NrIHRoZSBzZWN0b3JzIChpZiBvdXIgY2hpcCBpcyAxNjBDMykKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCQkJaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSA9PSBGTEFTSF8yOEYxNjBDM0IpIHsKKwkJCQl0bXBbMF0gPSAweDAwNjAwMDYwOworCQkJCXRtcFsxXSA9IDB4MDA2MDAwNjA7CisJCQkJdG1wWzBdID0gMHgwMEQwMDBEMDsKKwkJCQl0bXBbMV0gPSAweDAwRDAwMEQwOworCQkJfQorCQkJaW5mby0+c3RhcnRbaV0gPSAodWludCkgdG1wOworCQkJdG1wICs9IGkgPCA4ID8gMHgyMDAwIDogMHgxMDAwMDsgLyogcG9pbnRlciBhcml0aCAgICAgICAqLworCQl9CisJfQorCisJbWVtc2V0IChpbmZvLT5wcm90ZWN0LCAwLCBpbmZvLT5zZWN0b3JfY291bnQpOworCisJYmFzZWFkZHJbMF0gPSAweDAwRkYwMEZGOworCWJhc2VhZGRyWzFdID0gMHgwMEZGMDBGRjsKKworCXJldHVybiAoaW5mby0+c2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordW5zaWduZWQgbG9uZyBmbGFzaF9pbml0ICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZV9iMCA9IDA7CisJaW50IGk7CisKKwkvKiBJbml0OiBubyBGTEFTSGVzIGtub3duCisJICovCisJZm9yIChpID0gMDsgaSA8IENGR19NQVhfRkxBU0hfQkFOS1M7ICsraSkgeworCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwl9CisKKwkvKiBTdGF0aWMgRkxBU0ggQmFuayBjb25maWd1cmF0aW9uIGhlcmUgKG9ubHkgb25lIGJhbmspICovCisKKwlzaXplX2IwID0gZmxhc2hfZ2V0X3NpemUgKCh1bG9uZyAqKSBDRkdfRkxBU0gwX0JBU0UsICZmbGFzaF9pbmZvWzBdKTsKKwlpZiAoZmxhc2hfaW5mb1swXS5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOIHx8IHNpemVfYjAgPT0gMCkgeworCQlwcmludGYgKCIjIyBVbmtub3duIEZMQVNIIG9uIEJhbmsgMCAtIFNpemUgPSAweCUwOGx4ID0gJWxkIE1CXG4iLAorCQkJCXNpemVfYjAsIHNpemVfYjAgPj4gMjApOworCX0KKworCS8qIHByb3RlY3QgbW9uaXRvciBhbmQgZW52aXJvbm1lbnQgc2VjdG9ycworCSAqLworCisjaWZuZGVmIENPTkZJR19CT09UX1JPTQorCS8qIElmIFUtQm9vdCBpcyAgYm9vdGVkIGZyb20gUk9NIHRoZSBDRkdfTU9OSVRPUl9CQVNFID4gQ0ZHX0ZMQVNIMF9CQVNFCisJICogYnV0IHdlIHNob3VsZG4ndCBwcm90ZWN0IGl0LgorCSAqLworCisjIGlmIENGR19NT05JVE9SX0JBU0UgPj0gQ0ZHX0ZMQVNIMF9CQVNFCisJZmxhc2hfcHJvdGVjdCAoRkxBR19QUk9URUNUX1NFVCwKKwkJICAgICAgIENGR19NT05JVE9SX0JBU0UsCisJCSAgICAgICBDRkdfTU9OSVRPUl9CQVNFICsgQ0ZHX01PTklUT1JfTEVOIC0gMSwgJmZsYXNoX2luZm9bMF0KKwkpOworIyBlbmRpZgorI2VuZGlmCS8qIENPTkZJR19CT09UX1JPTSAqLworCisjaWYgKENGR19FTlZfSVNfSU5fRkxBU0ggPT0gMSkgJiYgZGVmaW5lZChDRkdfRU5WX0FERFIpCisjIGlmbmRlZiAgQ0ZHX0VOVl9TSVpFCisjICBkZWZpbmUgQ0ZHX0VOVl9TSVpFCUNGR19FTlZfU0VDVF9TSVpFCisjIGVuZGlmCisJZmxhc2hfcHJvdGVjdCAoRkxBR19QUk9URUNUX1NFVCwKKwkJICAgICAgIENGR19FTlZfQUREUiwKKwkJICAgICAgIENGR19FTlZfQUREUiArIENGR19FTlZfU0laRSAtIDEsICZmbGFzaF9pbmZvWzBdKTsKKyNlbmRpZgorCisJcmV0dXJuIChzaXplX2IwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZsYXNoX3ByaW50X2luZm8gKGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJaW50IGk7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlwcmludGYgKCJtaXNzaW5nIG9yIHVua25vd24gRkxBU0ggdHlwZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKChpbmZvLT5mbGFzaF9pZCA+PiAxNikgJiAweGZmKSB7CisJY2FzZSAweDg5OgorCQlwcmludGYgKCJJTlRFTCAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBWZW5kb3IgIik7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworCWNhc2UgRkxBU0hfMjhGMTYwQzNCOgorCQlwcmludGYgKCIyOEYxNjBDM0IgKDE2IE0sIGJvdHRvbSBzZWN0b3IpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF8yOEYxNjBGM0I6CisJCXByaW50ZiAoIjI4RjE2MEYzQiAoMTYgTSwgYm90dG9tIHNlY3RvcilcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYgKCJVbmtub3duIENoaXAgVHlwZVxuIik7CisJCWJyZWFrOworCX0KKworCXByaW50ZiAoIiAgU2l6ZTogJWxkIE1CIGluICVkIFNlY3RvcnNcbiIsCisJCQlpbmZvLT5zaXplID4+IDIwLCBpbmZvLT5zZWN0b3JfY291bnQpOworCisJcHJpbnRmICgiICBTZWN0b3IgU3RhcnQgQWRkcmVzc2VzOiIpOworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7ICsraSkgeworCQlpZiAoKGkgJSA1KSA9PSAwKQorCQkJcHJpbnRmICgiXG4gICAiKTsKKwkJcHJpbnRmICgiICUwOGxYJXMiLAorCQkJaW5mby0+c3RhcnRbaV0sCisJCQlpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIKKwkJKTsKKwl9CisJcHJpbnRmICgiXG4iKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgZmxhc2hfZXJhc2UgKGZsYXNoX2luZm9fdCAqIGluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworCWludCBmbGFnLCBwcm90LCBzZWN0OworCXVsb25nIHN0YXJ0LCBub3csIGxhc3Q7CisKKwlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwkJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJCXByaW50ZiAoIi0gbWlzc2luZ1xuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCItIG5vIHNlY3RvcnMgdG8gZXJhc2VcbiIpOworCQl9CisJCXJldHVybiAxOworCX0KKworCXByb3QgPSAwOworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pCisJCQlwcm90Kys7CisJfQorCisJaWYgKHByb3QpIHsKKwkJcHJpbnRmICgiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhXG4iLAorCQkJCXByb3QpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIlxuIik7CisJfQorCisJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycworCSAqLworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKwkJdm9sYXRpbGUgdWxvbmcgKmFkZHIgPQorCQkJCSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIGluZm8tPnN0YXJ0W3NlY3RdOworCisJCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKwkJbGFzdCA9IHN0YXJ0OworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7CisJCQkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUKKwkJCSAqLworCQkJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKworCQkJLyogRXJhc2UgdGhlIGJsb2NrCisJCQkgKi8KKwkJCWFkZHJbMF0gPSAweDAwMjAwMDIwOworCQkJYWRkclsxXSA9IDB4MDAyMDAwMjA7CisJCQlhZGRyWzBdID0gMHgwMEQwMDBEMDsKKwkJCWFkZHJbMV0gPSAweDAwRDAwMEQwOworCisJCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkKKwkJCSAqLworCQkJaWYgKGZsYWcpCisJCQkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwkJCS8qIHdhaXQgYXQgbGVhc3QgODB1cyAtIGxldCdzIHdhaXQgMSBtcworCQkJICovCisJCQl1ZGVsYXkgKDEwMDApOworCisJCQlsYXN0ID0gc3RhcnQ7CisJCQl3aGlsZSAoKGFkZHJbMF0gJiAweDAwODAwMDgwKSAhPSAweDAwODAwMDgwIHx8CisJCQkJICAgKGFkZHJbMV0gJiAweDAwODAwMDgwKSAhPSAweDAwODAwMDgwKSB7CisJCQkJaWYgKChub3cgPSBnZXRfdGltZXIgKHN0YXJ0KSkgPiBDRkdfRkxBU0hfRVJBU0VfVE9VVCkgeworCQkJCQlwcmludGYgKCJUaW1lb3V0IChlcmFzZSBzdXNwZW5kZWQhKVxuIik7CisJCQkJCS8qIFN1c3BlbmQgZXJhc2UKKwkJCQkJICovCisJCQkJCWFkZHJbMF0gPSAweDAwQjAwMEIwOworCQkJCQlhZGRyWzFdID0gMHgwMEIwMDBCMDsKKwkJCQkJZ290byBET05FOworCQkJCX0KKwkJCQkvKiBzaG93IHRoYXQgd2UncmUgd2FpdGluZworCQkJCSAqLworCQkJCWlmICgobm93IC0gbGFzdCkgPiAxMDAwKSB7CS8qIGV2ZXJ5IHNlY29uZCAqLworCQkJCQlzZXJpYWxfcHV0YyAoJy4nKTsKKwkJCQkJbGFzdCA9IG5vdzsKKwkJCQl9CisJCQl9CisJCQlpZiAoYWRkclswXSAmIDB4MDAyMjAwMjIgfHwgYWRkclsxXSAmIDB4MDAyMjAwMjIpIHsKKwkJCQlwcmludGYgKCIqKiogRVJST1I6IGVyYXNlIGZhaWxlZCFcbiIpOworCQkJCWdvdG8gRE9ORTsKKwkJCX0KKwkJfQorCQkvKiBDbGVhciBzdGF0dXMgcmVnaXN0ZXIgYW5kIHJlc2V0IHRvIHJlYWQgbW9kZQorCQkgKi8KKwkJYWRkclswXSA9IDB4MDA1MDAwNTA7CisJCWFkZHJbMV0gPSAweDAwNTAwMDUwOworCQlhZGRyWzBdID0gMHgwMEZGMDBGRjsKKwkJYWRkclsxXSA9IDB4MDBGRjAwRkY7CisJfQorCisJcHJpbnRmICgiIGRvbmVcbiIpOworCitET05FOgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3dvcmQgKGZsYXNoX2luZm9fdCAqLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICosIHVsb25nKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCitpbnQgd3JpdGVfYnVmZiAoZmxhc2hfaW5mb190ICogaW5mbywgdWNoYXIgKiBzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKwl1bG9uZyB2OworCWludCBpLCBsLCBjYyA9IGNudCwgcmVzID0gMDsKKworCisJZm9yICh2PTA7IGNjID4gMDsgYWRkciArPSA0LCBjYyAtPSA0IC0gbCkgeworCQlsID0gKGFkZHIgJiAzKTsKKwkJYWRkciAmPSB+MzsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQl2ID0gKHYgPDwgOCkgKyAoaSA8IGwgfHwgaSAtIGwgPj0gY2MgPworCQkJCSooKHVuc2lnbmVkIGNoYXIgKikgYWRkciArIGkpIDogKnNyYysrKTsKKwkJfQorCisJCWlmICgocmVzID0gd3JpdGVfd29yZCAoaW5mbywgKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgYWRkciwgdikpICE9IDApCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKHJlcyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGEgd29yZCB0byBGbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICogaW5mbywgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciwKKwkJCQkJICAgdWxvbmcgZGF0YSkKK3sKKwlpbnQgZmxhZywgcmVzID0gMDsKKwl1bG9uZyBzdGFydDsKKworCS8qIENoZWNrIGlmIEZsYXNoIGlzIChzdWZmaWNpZW50bHkpIGVyYXNlZAorCSAqLworCWlmICgoKmFkZHIgJiBkYXRhKSAhPSBkYXRhKQorCQlyZXR1cm4gKDIpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlCisJICovCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKworCSphZGRyID0gMHgwMDQwMDA0MDsKKwkqYWRkciA9IGRhdGE7CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkKKwkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwlzdGFydCA9IGdldF90aW1lciAoMCk7CisJd2hpbGUgKCgqYWRkciAmIDB4MDA4MDAwODApICE9IDB4MDA4MDAwODApIHsKKwkJaWYgKGdldF90aW1lciAoc3RhcnQpID4gQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQpIHsKKwkJCS8qIFN1c3BlbmQgcHJvZ3JhbQorCQkJICovCisJCQkqYWRkciA9IDB4MDBCMDAwQjA7CisJCQlyZXMgPSAxOworCQkJZ290byBPVVQ7CisJCX0KKwl9CisKKwlpZiAoKmFkZHIgJiAweDAwMjIwMDIyKSB7CisJCXByaW50ZiAoIioqKiBFUlJPUjogcHJvZ3JhbSBmYWlsZWQhXG4iKTsKKwkJcmVzID0gMTsKKwl9CisKK09VVDoKKwkvKiBDbGVhciBzdGF0dXMgcmVnaXN0ZXIgYW5kIHJlc2V0IHRvIHJlYWQgbW9kZQorCSAqLworCSphZGRyID0gMHgwMDUwMDA1MDsKKwkqYWRkciA9IDB4MDBGRjAwRkY7CisKKwlyZXR1cm4gKHJlcyk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9zYWNzbmcvZmxhc2guYyBiL2JvYXJkL3NhY3NuZy9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDA0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYWNzbmcvZmxhc2guYwpAQCAtMCwwICsxLDUyMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlncy9zYWNzbmcuaD4KKworCisjdW5kZWYgIERFQlVHCisKKyNpZm5kZWYJQ0ZHX0VOVl9BRERSCisjZGVmaW5lIENGR19FTlZfQUREUgkoQ0ZHX0ZMQVNIX0JBU0UgKyBDRkdfRU5WX09GRlNFVCkKKyNlbmRpZgorI2lmbmRlZiBDRkdfRU5WX1NJWkUKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCUNGR19FTlZfU0VDVF9TSVpFCisjZW5kaWYKKworCitmbGFzaF9pbmZvX3QJZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsgLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb25zCisgKi8KK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZSAodnVfc2hvcnQgKmFkZHIsIGZsYXNoX2luZm9fdCAqaW5mbyk7CitzdGF0aWMgaW50IHdyaXRlX3dvcmQgKGZsYXNoX2luZm9fdCAqaW5mbywgdWxvbmcgZGVzdCwgdWxvbmcgZGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCit1bnNpZ25lZCBsb25nIGZsYXNoX2luaXQgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzaXplX2IwLCBzaXplX2IxOworCWludCBpOworCisJLyogSW5pdDogbm8gRkxBU0hlcyBrbm93biAqLworCWZvciAoaT0wOyBpPENGR19NQVhfRkxBU0hfQkFOS1M7ICsraSkgeworCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwl9CisKKwlzaXplX2IwID0gZmxhc2hfZ2V0X3NpemUoKHZ1X3Nob3J0ICopQ0ZHX0ZMQVNIMF9CQVNFLCAmZmxhc2hfaW5mb1swXSk7CisKKwlpZiAoZmxhc2hfaW5mb1swXS5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCXByaW50ZiAoIiMjIFVua25vd24gRkxBU0ggb24gQmFuayAwIC0gU2l6ZSA9IDB4JTA4bHggPSAlbGQgTUJcbiIsCisJCQlzaXplX2IwLCBzaXplX2IwPDwyMCk7CisJfQorCisJc2l6ZV9iMSA9IGZsYXNoX2dldF9zaXplKCh2dV9zaG9ydCAqKUNGR19GTEFTSDFfQkFTRSwgJmZsYXNoX2luZm9bMV0pOworCisjaWYgQ0ZHX01PTklUT1JfQkFTRSA+PSBDRkdfRkxBU0hfQkFTRQorCS8qIG1vbml0b3IgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisJZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkgICAgICBDRkdfTU9OSVRPUl9CQVNFLAorCQkgICAgICBDRkdfTU9OSVRPUl9CQVNFK0NGR19NT05JVE9SX0xFTi0xLAorCQkgICAgICAmZmxhc2hfaW5mb1swXSk7CisjZW5kaWYKKworI2lmZGVmCUNGR19FTlZfSVNfSU5fRkxBU0gKKwkvKiBFTlYgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisJZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkgICAgICBDRkdfRU5WX0FERFIsCisJCSAgICAgIENGR19FTlZfQUREUitDRkdfRU5WX1NJWkUtMSwKKwkJICAgICAgJmZsYXNoX2luZm9bMF0pOworI2VuZGlmCisKKwlpZiAoc2l6ZV9iMSkgeworI2lmIENGR19NT05JVE9SX0JBU0UgPj0gQ0ZHX0ZMQVNIX0JBU0UKKwkJLyogbW9uaXRvciBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKwkJZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkJICAgICAgQ0ZHX01PTklUT1JfQkFTRSwKKwkJCSAgICAgIENGR19NT05JVE9SX0JBU0UrQ0ZHX01PTklUT1JfTEVOLTEsCisJCQkgICAgICAmZmxhc2hfaW5mb1sxXSk7CisjZW5kaWYKKworI2lmZGVmCUNGR19FTlZfSVNfSU5fRkxBU0gKKwkJLyogRU5WIHByb3RlY3Rpb24gT04gYnkgZGVmYXVsdCAqLworCQlmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCQkgICAgICBDRkdfRU5WX0FERFIsCisJCQkgICAgICBDRkdfRU5WX0FERFIrQ0ZHX0VOVl9TSVpFLTEsCisJCQkgICAgICAmZmxhc2hfaW5mb1sxXSk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlmbGFzaF9pbmZvWzFdLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJZmxhc2hfaW5mb1sxXS5zZWN0b3JfY291bnQgPSAtMTsKKwl9CisKKwlmbGFzaF9pbmZvWzBdLnNpemUgPSBzaXplX2IwOworCWZsYXNoX2luZm9bMV0uc2l6ZSA9IHNpemVfYjE7CisKKwkvKgorCSAqIFdlIG9ubHkgcmVwb3J0IHRoZSBwcmltYXJ5IGZsYXNoIGZvciBVLUJvb3QncyB1c2UuCisJICovCisJcmV0dXJuIChzaXplX2IwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZsYXNoX3ByaW50X2luZm8gIChmbGFzaF9pbmZvX3QgKmluZm8pCit7CisJaW50IGk7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQlwcmludGYgKCJtaXNzaW5nIG9yIHVua25vd24gRkxBU0ggdHlwZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spIHsKKwljYXNlIEZMQVNIX01BTl9BTUQ6CXByaW50ZiAoIkFNRCAiKTsJCWJyZWFrOworCWNhc2UgRkxBU0hfTUFOX0ZVSjoJcHJpbnRmICgiRlVKSVRTVSAiKTsJCWJyZWFrOworCWRlZmF1bHQ6CQlwcmludGYgKCJVbmtub3duIFZlbmRvciAiKTsJYnJlYWs7CisJfQorCisJc3dpdGNoIChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSB7CisJY2FzZSBGTEFTSF9BTTQwMEI6CXByaW50ZiAoIkFNMjlMVjQwMEIgKDQgTWJpdCwgYm90dG9tIGJvb3Qgc2VjdClcbiIpOworCQkJCWJyZWFrOworCWNhc2UgRkxBU0hfQU00MDBUOglwcmludGYgKCJBTTI5TFY0MDBUICg0IE1iaXQsIHRvcCBib290IHNlY3RvcilcbiIpOworCQkJCWJyZWFrOworCWNhc2UgRkxBU0hfQU04MDBCOglwcmludGYgKCJBTTI5TFY4MDBCICg4IE1iaXQsIGJvdHRvbSBib290IHNlY3QpXG4iKTsKKwkJCQlicmVhazsKKwljYXNlIEZMQVNIX0FNODAwVDoJcHJpbnRmICgiQU0yOUxWODAwVCAoOCBNYml0LCB0b3AgYm9vdCBzZWN0b3IpXG4iKTsKKwkJCQlicmVhazsKKwljYXNlIEZMQVNIX0FNMTYwQjoJcHJpbnRmICgiQU0yOUxWMTYwQiAoMTYgTWJpdCwgYm90dG9tIGJvb3Qgc2VjdClcbiIpOworCQkJCWJyZWFrOworCWNhc2UgRkxBU0hfQU0xNjBUOglwcmludGYgKCJBTTI5TFYxNjBUICgxNiBNYml0LCB0b3AgYm9vdCBzZWN0b3IpXG4iKTsKKwkJCQlicmVhazsKKwljYXNlIEZMQVNIX0FNMzIwQjoJcHJpbnRmICgiQU0yOUxWMzIwQiAoMzIgTWJpdCwgYm90dG9tIGJvb3Qgc2VjdClcbiIpOworCQkJCWJyZWFrOworCWNhc2UgRkxBU0hfQU0zMjBUOglwcmludGYgKCJBTTI5TFYzMjBUICgzMiBNYml0LCB0b3AgYm9vdCBzZWN0b3IpXG4iKTsKKwkJCQlicmVhazsKKwlkZWZhdWx0OgkJcHJpbnRmICgiVW5rbm93biBDaGlwIFR5cGVcbiIpOworCQkJCWJyZWFrOworCX0KKworCXByaW50ZiAoIiAgU2l6ZTogJWxkIE1CIGluICVkIFNlY3RvcnNcbiIsCisJCWluZm8tPnNpemUgPj4gMjAsIGluZm8tPnNlY3Rvcl9jb3VudCk7CisKKwlwcmludGYgKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7CisJZm9yIChpPTA7IGk8aW5mby0+c2VjdG9yX2NvdW50OyArK2kpIHsKKwkJaWYgKChpICUgNSkgPT0gMCkKKwkJCXByaW50ZiAoIlxuICAgIik7CisJCXByaW50ZiAoIiAlMDhsWCVzIiwKKwkJCWluZm8tPnN0YXJ0W2ldLAorCQkJaW5mby0+cHJvdGVjdFtpXSA/ICIgKFJPKSIgOiAiICAgICAiCisJCSk7CisJfQorCXByaW50ZiAoIlxuIik7CisJcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBjYW5ub3QgYmUgcnVuIGZyb20gRkxBU0ghCisgKi8KKworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplICh2dV9zaG9ydCAqYWRkciwgZmxhc2hfaW5mb190ICppbmZvKQoreworCXNob3J0IGk7CisJdXNob3J0IHZhbHVlOworCXVsb25nICBiYXNlID0gKHVsb25nKWFkZHI7CisKKwkvKiBXcml0ZSBhdXRvIHNlbGVjdCBjb21tYW5kOiByZWFkIE1hbnVmYWN0dXJlciBJRCAqLworCWFkZHJbMHgwNTU1XSA9IDB4QUFBQTsKKwlhZGRyWzB4MDJBQV0gPSAweDU1NTU7CisJYWRkclsweDA1NTVdID0gMHg5MDkwOworCV9fYXNtX18gX192b2xhdGlsZV9fKCIgc3luY1xuICIpOworCisJdmFsdWUgPSBhZGRyWzBdOworI2lmZGVmIERFQlVHCisJcHJpbnRmKCJGbGFzaCBtYW51ZmFjdHVyZXIgMHglMDRYXG4iLCB2YWx1ZSk7CisjZW5kaWYKKworCWlmKHZhbHVlID09ICh1c2hvcnQpQU1EX01BTlVGQUNUKSB7CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX0FNRDsKKwl9IGVsc2UgaWYgKHZhbHVlID09ICh1c2hvcnQpRlVKX01BTlVGQUNUKSB7CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX0ZVSjsKKwl9IGVsc2UgeworI2lmZGVmIERFQlVHCisJCXByaW50ZigiVW5rbm93biBmbGFzaCBtYW51ZmFjdHVyZXIgMHglMDRYXG4iLCB2YWx1ZSk7CisjZW5kaWYKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAwOworCQlpbmZvLT5zaXplID0gMDsKKwkJcmV0dXJuICgwKTsJCQkvKiBubyBvciB1bmtub3duIGZsYXNoCSovCisJfQorCisJdmFsdWUgPSBhZGRyWzFdOwkJCS8qIGRldmljZSBJRAkJKi8KKyNpZmRlZiBERUJVRworCXByaW50ZigiRmxhc2ggdHlwZSAweCUwNFhcbiIsIHZhbHVlKTsKKyNlbmRpZgorCisJaWYodmFsdWUgPT0gKHVzaG9ydClBTURfSURfTFY0MDBUKSB7CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNNDAwVDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTE7CisJCWluZm8tPnNpemUgPSAweDAwMDgwMDAwOwkvKiA9PiAwLjUgTUIJCSovCisJfSBlbHNlIGlmKHZhbHVlID09ICh1c2hvcnQpQU1EX0lEX0xWNDAwQikgeworCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTQwMEI7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDExOworCQlpbmZvLT5zaXplID0gMHgwMDA4MDAwMDsJLyogPT4gMC41IE1CCQkqLworCX0gZWxzZSBpZih2YWx1ZSA9PSAodXNob3J0KUFNRF9JRF9MVjgwMFQpIHsKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU04MDBUOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAxOTsKKwkJaW5mby0+c2l6ZSA9IDB4MDAxMDAwMDA7CS8qID0+IDEgTUIJCSovCisJfSBlbHNlIGlmKHZhbHVlID09ICh1c2hvcnQpQU1EX0lEX0xWODAwQikgeworCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTgwMEI7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDE5OworCQlpbmZvLT5zaXplID0gMHgwMDEwMDAwMDsJLyogPT4gMSBNQgkJKi8KKwl9IGVsc2UgaWYodmFsdWUgPT0gKHVzaG9ydClBTURfSURfTFYxNjBUKSB7CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNMTYwVDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMzU7CisJCWluZm8tPnNpemUgPSAweDAwMjAwMDAwOwkvKiA9PiAyIE1CCQkqLworCX0gZWxzZSBpZih2YWx1ZSA9PSAodXNob3J0KUFNRF9JRF9MVjE2MEIpIHsKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0xNjBCOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAzNTsKKwkJaW5mby0+c2l6ZSA9IDB4MDAyMDAwMDA7CS8qID0+IDIgTUIJCSovCisJfSBlbHNlIGlmKHZhbHVlID09ICh1c2hvcnQpQU1EX0lEX0xWMzIwVCkgeworCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTMyMFQ7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDY3OworCQlpbmZvLT5zaXplID0gMHgwMDQwMDAwMDsJLyogPT4gNCBNQgkJKi8KKwl9IGVsc2UgaWYodmFsdWUgPT0gKHVzaG9ydClBTURfSURfTFYzMjBCKSB7CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNMzIwQjsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gNjc7CisJCWluZm8tPnNpemUgPSAweDAwNDAwMDAwOwkvKiA9PiA0IE1CCQkqLworCX0gZWxzZSB7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRmKCJVbmtub3duIGZsYXNoIHR5cGUgMHglMDRYXG4iLCB2YWx1ZSk7CisJCWluZm8tPnNpemUgPSBDRkdfRkxBU0hfU0laRTsKKyNlbHNlCisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJcmV0dXJuICgwKTsJCQkvKiA9PiBubyBvciB1bmtub3duIGZsYXNoICovCisjZW5kaWYKKwl9CisKKwkvKiBzZXQgdXAgc2VjdG9yIHN0YXJ0IGFkZHJlc3MgdGFibGUgKi8KKwlpZiAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9CVFlQRSkgeworCQkvKiBzZXQgc2VjdG9yIG9mZnNldHMgZm9yIGJvdHRvbSBib290IGJsb2NrIHR5cGUJKi8KKwkJaW5mby0+c3RhcnRbMF0gPSBiYXNlICsgMHgwMDAwMDAwMDsKKwkJaW5mby0+c3RhcnRbMV0gPSBiYXNlICsgMHgwMDAwNDAwMDsKKwkJaW5mby0+c3RhcnRbMl0gPSBiYXNlICsgMHgwMDAwNjAwMDsKKwkJaW5mby0+c3RhcnRbM10gPSBiYXNlICsgMHgwMDAwODAwMDsKKwkJZm9yIChpID0gNDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCQlpbmZvLT5zdGFydFtpXSA9IGJhc2UgKyAoKGkgLSAzKSAqIDB4MDAwMTAwMDApOworCQl9CisJfSBlbHNlIHsKKwkJLyogc2V0IHNlY3RvciBvZmZzZXRzIGZvciB0b3AgYm9vdCBibG9jayB0eXBlCQkqLworCQlpID0gaW5mby0+c2VjdG9yX2NvdW50IC0gMTsKKwkJaW5mby0+c3RhcnRbaS0tXSA9IGJhc2UgKyBpbmZvLT5zaXplIC0gMHgwMDAwNDAwMDsKKwkJaW5mby0+c3RhcnRbaS0tXSA9IGJhc2UgKyBpbmZvLT5zaXplIC0gMHgwMDAwNjAwMDsKKwkJaW5mby0+c3RhcnRbaS0tXSA9IGJhc2UgKyBpbmZvLT5zaXplIC0gMHgwMDAwODAwMDsKKwkJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCQlpbmZvLT5zdGFydFtpXSA9IGJhc2UgKyAoaSAqIDB4MDAwMTAwMDApOworCQl9CisJfQorCisJLyogY2hlY2sgZm9yIHByb3RlY3RlZCBzZWN0b3JzICovCisJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCS8qIHJlYWQgc2VjdG9yIHByb3RlY3Rpb24gYXQgc2VjdG9yIGFkZHJlc3MsIChBNyAuLiBBMCkgPSAweDAyICovCisJCS8qIEQwID0gMSBpZiBwcm90ZWN0ZWQgKi8KKwkJYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShpbmZvLT5zdGFydFtpXSk7CisJCWluZm8tPnByb3RlY3RbaV0gPSBhZGRyWzJdICYgMTsKKwl9CisKKwkvKgorCSAqIFByZXZlbnQgd3JpdGVzIHRvIHVuaW5pdGlhbGl6ZWQgRkxBU0guCisJICovCisJaWYgKGluZm8tPmZsYXNoX2lkICE9IEZMQVNIX1VOS05PV04pIHsKKwkJYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKWluZm8tPnN0YXJ0WzBdOworCisJfQorCisJYWRkclswXSA9IDB4RjBGMDsJLyogcmVzZXQgYmFuayAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKCIgc3luY1xuICIpOworCXJldHVybiAoaW5mby0+c2l6ZSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK2ludAlmbGFzaF9lcmFzZSAoZmxhc2hfaW5mb190ICppbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKwl2dV9zaG9ydCAqYWRkciA9ICh2dV9zaG9ydCopKGluZm8tPnN0YXJ0WzBdKTsKKwlpbnQgZmxhZywgcHJvdCwgc2VjdCwgbF9zZWN0OworCXVsb25nIHN0YXJ0LCBub3csIGxhc3Q7CisKKwlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwkJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJCXByaW50ZiAoIi0gbWlzc2luZ1xuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCItIG5vIHNlY3RvcnMgdG8gZXJhc2VcbiIpOworCQl9CisJCXJldHVybiAxOworCX0KKworCWlmICgoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgfHwKKwkgICAgKGluZm8tPmZsYXNoX2lkID4gRkxBU0hfQU1EX0NPTVApKSB7CisJCXByaW50ZiAoIkNhbid0IGVyYXNlIHVua25vd24gZmxhc2ggdHlwZSAlMDhseCAtIGFib3J0ZWRcbiIsCisJCQlpbmZvLT5mbGFzaF9pZCk7CisJCXJldHVybiAxOworCX0KKworCXByb3QgPSAwOworCWZvciAoc2VjdD1zX2ZpcnN0OyBzZWN0PD1zX2xhc3Q7ICsrc2VjdCkgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkgeworCQkJcHJvdCsrOworCQl9CisJfQorCisJaWYgKHByb3QpIHsKKwkJcHJpbnRmICgiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhXG4iLAorCQkJcHJvdCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmICgiXG4iKTsKKwl9CisKKwlsX3NlY3QgPSAtMTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLworCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCWFkZHJbMHgwNTU1XSA9IDB4QUFBQTsKKwlhZGRyWzB4MDJBQV0gPSAweDU1NTU7CisJYWRkclsweDA1NTVdID0gMHg4MDgwOworCWFkZHJbMHgwNTU1XSA9IDB4QUFBQTsKKwlhZGRyWzB4MDJBQV0gPSAweDU1NTU7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIiBzeW5jXG4gIik7CisKKwkvKiBTdGFydCBlcmFzZSBvbiB1bnByb3RlY3RlZCBzZWN0b3JzICovCisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdDw9c19sYXN0OyBzZWN0KyspIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgewkvKiBub3QgcHJvdGVjdGVkICovCisJCQlhZGRyID0gKHZ1X3Nob3J0KikoaW5mby0+c3RhcnRbc2VjdF0pOworCQkJYWRkclswXSA9IDB4MzAzMDsKKwkJCWxfc2VjdCA9IHNlY3Q7CisJCX0KKwl9CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCS8qIHdhaXQgYXQgbGVhc3QgODB1cyAtIGxldCdzIHdhaXQgMSBtcyAqLworCXVkZWxheSAoMTAwMCk7CisKKwkvKgorCSAqIFdlIHdhaXQgZm9yIHRoZSBsYXN0IHRyaWdnZXJlZCBzZWN0b3IKKwkgKi8KKwlpZiAobF9zZWN0IDwgMCkKKwkJZ290byBET05FOworCisJc3RhcnQgPSBnZXRfdGltZXIgKDApOworCWxhc3QgID0gc3RhcnQ7CisJYWRkciA9ICh2dV9zaG9ydCopKGluZm8tPnN0YXJ0W2xfc2VjdF0pOworCXdoaWxlICgoYWRkclswXSAmIDB4MDA4MCkgIT0gMHgwMDgwKSB7CisJCWlmICgobm93ID0gZ2V0X3RpbWVyKHN0YXJ0KSkgPiBDRkdfRkxBU0hfRVJBU0VfVE9VVCkgeworCQkJcHJpbnRmICgiVGltZW91dFxuIik7CisJCQlhZGRyWzBdID0gMHhGMEYwOwkvKiByZXNldCBiYW5rICovCisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiIHN5bmNcbiAiKTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qIHNob3cgdGhhdCB3ZSdyZSB3YWl0aW5nICovCisJCWlmICgobm93IC0gbGFzdCkgPiAxMDAwKSB7CS8qIGV2ZXJ5IHNlY29uZCAqLworCQkJcHV0YyAoJy4nKTsKKwkJCWxhc3QgPSBub3c7CisJCX0KKwl9CisKK0RPTkU6CisJLyogcmVzZXQgdG8gcmVhZCBtb2RlICovCisJYWRkciA9ICh2dV9zaG9ydCopaW5mby0+c3RhcnRbMF07CisJYWRkclswXSA9IDB4RjBGMDsJLyogcmVzZXQgYmFuayAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKCIgc3luY1xuICIpOworCisJcHJpbnRmICgiIGRvbmVcbiIpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5IG1lbW9yeSB0byBmbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KKworaW50IHdyaXRlX2J1ZmYgKGZsYXNoX2luZm9fdCAqaW5mbywgdWNoYXIgKnNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQoreworCXVsb25nIGNwLCB3cCwgZGF0YTsKKwlpbnQgaSwgbCwgcmM7CisKKwl3cCA9IChhZGRyICYgfjMpOwkvKiBnZXQgbG93ZXIgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCBieXRlcworCSAqLworCWlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpPTAsIGNwPXdwOyBpPGw7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJCX0KKwkJZm9yICg7IGk8NCAmJiBjbnQ+MDsgKytpKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisJCQktLWNudDsKKwkJCSsrY3A7CisJCX0KKwkJZm9yICg7IGNudD09MCAmJiBpPDQ7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJCX0KKworCQlpZiAoKHJjID0gd3JpdGVfd29yZChpbmZvLCB3cCwgZGF0YSkpICE9IDApIHsKKwkJCXJldHVybiAocmMpOworCQl9CisJCXdwICs9IDQ7CisJfQorCisJLyoKKwkgKiBoYW5kbGUgd29yZCBhbGlnbmVkIHBhcnQKKwkgKi8KKwl3aGlsZSAoY250ID49IDQpIHsKKwkJZGF0YSA9IDA7CisJCWZvciAoaT0wOyBpPDQ7ICsraSkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworCQl9CisJCWlmICgocmMgPSB3cml0ZV93b3JkKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJd3AgICs9IDQ7CisJCWNudCAtPSA0OworCX0KKworCWlmIChjbnQgPT0gMCkgeworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpPTAsIGNwPXdwOyBpPDQgJiYgY250PjA7ICsraSwgKytjcCkgeworCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisJCS0tY250OworCX0KKwlmb3IgKDsgaTw0OyArK2ksICsrY3ApIHsKKwkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJfQorCisJcmV0dXJuICh3cml0ZV93b3JkKGluZm8sIHdwLCBkYXRhKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGEgd29yZCB0byBGbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKQoreworCXZ1X3Nob3J0ICphZGRyID0gKHZ1X3Nob3J0KikoaW5mby0+c3RhcnRbMF0pOworCXVsb25nIHN0YXJ0OworCWludCBmbGFnOworCWludCBqOworCisJLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkICovCisJaWYgKCgoKih2dV9sb25nICopZGVzdCkgJiBkYXRhKSAhPSBkYXRhKSB7CisJCXJldHVybiAoMik7CisJfQorCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLworCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCS8qIFRoZSBvcmlnaW5hbCByb3V0aW5lIHdhcyBkZXNpZ25lZCB0byB3cml0ZSAzMiBiaXQgd29yZHMgdG8KKwkgKiAzMiBiaXQgd2lkZSBtZW1vcnkuCVdlIGhhdmUgMTYgYml0IHdpZGUgbWVtb3J5IHNvIHdlIGRvCisJICogdHdvIHdyaXRlcy4JV2Ugd3JpdGUgdGhlIExTQiBmaXJzdCBhdCBkZXN0KzIgYW5kIHRoZW4gdGhlCisJICogTVNCIGF0IGRlc3QgKGxvdXN5IGJpZyBlbmRpYW4pLgorCSAqLworCWRlc3QgKz0gMjsKKwlmb3IoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJYWRkclsweDA1NTVdID0gMHhBQUFBOworCQlhZGRyWzB4MDJBQV0gPSAweDU1NTU7CisJCWFkZHJbMHgwNTU1XSA9IDB4QTBBMDsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oIiBzeW5jXG4gIik7CisKKwkJKigodnVfc2hvcnQgKilkZXN0KSA9ICh1c2hvcnQpZGF0YTsKKworCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKGZsYWcpCisJCQllbmFibGVfaW50ZXJydXB0cygpOworCisJCS8qIGRhdGEgcG9sbGluZyBmb3IgRDcgKi8KKwkJc3RhcnQgPSBnZXRfdGltZXIgKDApOworCQl3aGlsZSAoKih2dV9zaG9ydCAqKWRlc3QgIT0gKHVzaG9ydClkYXRhKSB7CisJCQlpZiAoZ2V0X3RpbWVyKHN0YXJ0KSA+IENGR19GTEFTSF9XUklURV9UT1VUKSB7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJfQorCQlkZXN0IC09IDI7CisJCWRhdGEgPj49IDE2OworCX0KKwlyZXR1cm4gKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3NhbmRwb2ludC9SRUFETUUgYi9ib2FyZC9zYW5kcG9pbnQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDgxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYW5kcG9pbnQvUkVBRE1FCkBAIC0wLDAgKzEsMTUgQEAKK1RoaXMgcG9ydCBvZiBVLUJvb3Qgd2lsbCBydW4gb24gYSBNb3Rvcm9sYSBTYW5kcG9pbnQgMyBkZXZlbG9wbWVudAorc3lzdGVtIGVxdWlwcGVkIHdpdGggYSBVbml0eSBYNCBQUE1DIGNhcmQgKE1QQzgyNDAgQ1BVKSBvbmx5LiBJdCBpcyBhCitzbmFwc2hvdCBvZiB3b3JrIGluIHByb2dyZXNzIGFuZCBmYXIgZnJvbSBiZWluZyBjb21wbGV0ZWQuIEluIG9yZGVyCit0byBydW4gaXQgb24gdGhlIHRhcmdldCBzeXN0ZW0sIGl0IGhhcyB0byBiZSBkb3dubG9hZGVkIHVzaW5nIHRoZQorRElOSzMyIG1vbml0b3IgcHJvZ3JhbSB0aGF0IGNhbWUgd2l0aCB5b3VyIFNhbmRwb2ludCBzeXN0ZW0uIFBsZWFzZQorbm90ZSB0aGF0IERJTkszMiBkb2VzIG5vdCBhY2NlcHQgdGhlIFMtUmVjb3JkIGZpbGUgY3JlYXRlZCBieSB0aGUKK1UtQm9vdCBidWlsZCBwcm9jZXNzIHVubW9kaWZpZWQsIGJlY2F1c2UgaXQgY29udGFpbnMgQ1IvTEYgbGluZQordGVybWluYXRvcnMuIFlvdSBoYXZlIHRvIHN0cmlwIHRoZSBDUiBjaGFyYWN0ZXJzIGZpcnN0LiBUaGVyZSBpcyBhCit0aW55IHNjcmlwdCBuYW1lZCAnZGlua2RsJyBJIGNyZWF0ZWQgZm9yIHRoaXMgcHVycG9zZS4KKworVGhlIFNhbmRwb2ludCBwb3J0IGlzIGJhc2VkIG9uIHRoZSB3b3JrIG9mIFJvYiBUYXlsb3IsIHdobyBkb2VzIG5vdAorc2VlbSB0byBtYWludGFpbiBpdCBhbnkgbW9yZS4gSSBjYW4gYmUgcmVhY2hlZCBieSBtYWlsIGFzCit0a29lbGxlckBnbXgubmV0LgorCitUaG9tYXMgS29lbGxlcgpkaWZmIC0tZ2l0IGEvZGlzay9wYXJ0X2lzby5jIGIvZGlzay9wYXJ0X2lzby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ODUzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kaXNrL3BhcnRfaXNvLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIERlbmlzIFBldGVyLCBNUEwgQUcgU3dpdHplcmxhbmQsIGQucGV0ZXJAbXBsLmNoLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8Y21kX2Rpc2suaD4KKyNpbmNsdWRlICJwYXJ0X2lzby5oIgorCisjaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkpICYmIGRlZmluZWQoQ09ORklHX0lTT19QQVJUSVRJT04pCisKKyN1bmRlZglJU09fUEFSVF9ERUJVRworCisjaWZkZWYJSVNPX1BBUlRfREVCVUcKKyNkZWZpbmUJUFJJTlRGKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQorI2VuZGlmCisKKy8qIGVuYWJsZSB0aGlzIGlmIENEcyBhcmUgd3JpdHRlbiB3aXRoIHRoZSBQb3dlclBDIFBsYXRmb3JtIElEICovCisjdW5kZWYgQ0hFQ0tfRk9SX1BPV0VSUENfUExBVFRGT1JNCisjZGVmaW5lIENEX1NFQ1RTSVpFIDIwNDgKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdG1wYnVmW0NEX1NFQ1RTSVpFXTsKKworLyogQ29udmVydCBjaGFyWzRdIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0IHRvIHRoZSBob3N0IGZvcm1hdCBpbnRlZ2VyCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsZTMyX3RvX2ludCh1bnNpZ25lZCBjaGFyICpsZTMyKQoreworICAgIHJldHVybiAoKGxlMzJbM10gPDwgMjQpICsKKwkgICAgKGxlMzJbMl0gPDwgMTYpICsKKwkgICAgKGxlMzJbMV0gPDwgOCkgKworCSAgICAgbGUzMlswXQorCSAgICk7Cit9CisvKiBDb252ZXJ0IGNoYXJbMl0gaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgdG8gdGhlIGhvc3QgZm9ybWF0IGludGVnZXIKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBsZTE2X3RvX2ludCh1bnNpZ25lZCBjaGFyICpsZTE2KQoreworICAgIHJldHVybiAoKGxlMTZbMV0gPDwgOCkgKworCSAgIGxlMTZbMF0KKwkgICApOworfQorCisKKy8qIG9ubHkgYm9vdCByZWNvcmRzIHdpbGwgYmUgbGlzdGVkIGFzIHZhbGlkIHBhcnRpdGlvbnMgKi8KK2ludCBnZXRfcGFydGl0aW9uX2luZm9faXNvX3ZlcmIoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjLCBpbnQgcGFydF9udW0sIGRpc2tfcGFydGl0aW9uX3QgKiBpbmZvLCBpbnQgdmVyYikKK3sKKwlpbnQgaSxvZmZzZXQsZW50cnlfbnVtOworCXVuc2lnbmVkIHNob3J0ICpjaGtzdW1idWY7CisJdW5zaWduZWQgc2hvcnQgY2hrc3VtOworCXVuc2lnbmVkIGxvbmcgbmV3YmxrYWRkcixibGthZGRyLGxhc3RzZWN0LGJvb3RhZGRyOworCWlzb19ib290X3JlY190ICpwYnIgPSAoaXNvX2Jvb3RfcmVjX3QJKil0bXBidWY7IC8qIGJvb3QgcmVjb3JkICovCisJaXNvX3ByaV9yZWNfdCAqcHByID0gKGlzb19wcmlfcmVjX3QJKil0bXBidWY7CS8qIHByaW1hcnkgZGVzYyAqLworCWlzb192YWxfZW50cnlfdCAqcHZlID0gKGlzb192YWxfZW50cnlfdCAqKXRtcGJ1ZjsKKwlpc29faW5pdF9kZWZfZW50cnlfdCAqcGlkZTsKKworCS8qIHRoZSBmaXJzdCBzZWN0b3IgKHNlY3RvciAweDEwKSBtdXN0IGJlIGEgcHJpbWFyeSB2b2x1bWUgZGVzYyAqLworCWJsa2FkZHI9UFZEX09GRlNFVDsKKwlpZiAoZGV2X2Rlc2MtPmJsb2NrX3JlYWQgKGRldl9kZXNjLT5kZXYsIFBWRF9PRkZTRVQsIDEsICh1bG9uZyAqKSB0bXBidWYpICE9IDEpCisgICAJcmV0dXJuICgtMSk7CisJaWYocHByLT5kZXNjdHlwZSE9MHgwMSkgeworCQlpZih2ZXJiKQorCQkJcHJpbnRmICgiKiogRmlyc3QgZGVzY3JpcHRvciBpcyBOT1QgYSBwcmltYXJ5IGRlc2Mgb24gJWQ6JWQgKipcbiIsCisJCQkJZGV2X2Rlc2MtPmRldiwgcGFydF9udW0pOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYoc3RybmNtcChwcHItPnN0YW5kX2lkZW50LCJDRDAwMSIsNSkhPTApIHsKKwkJaWYodmVyYikKKwkJCXByaW50ZiAoIioqIFdyb25nIElTTyBJZGVudDogJXMgb24gJWQ6JWQgKipcbiIsCisJCQkJcHByLT5zdGFuZF9pZGVudCxkZXZfZGVzYy0+ZGV2LCBwYXJ0X251bSk7CisJCXJldHVybiAoLTEpOworCX0KKwlsYXN0c2VjdD0gKChwcHItPmZpcnN0c2VrX0xFcGF0aHRhYjFfTEUgJiAweDAwMDAwMGZmKTw8MjQpICsKKwkJICAoKHBwci0+Zmlyc3RzZWtfTEVwYXRodGFiMV9MRSAmIDB4MDAwMGZmMDApPDwgOCkgKworCQkgICgocHByLT5maXJzdHNla19MRXBhdGh0YWIxX0xFICYgMHgwMGZmMDAwMCk+PiA4KSArCisJCSAgKChwcHItPmZpcnN0c2VrX0xFcGF0aHRhYjFfTEUgJiAweGZmMDAwMDAwKT4+MjQpIDsKKwlpbmZvLT5ibGtzej1wcHItPnNlY3NpemVfQkU7IC8qIGFzc3VtaW5nIHNhbWUgYmxvY2sgc2l6ZSBmb3IgYWxsIGVudHJpZXMgKi8KKwlQUklOVEYoIiBMYXN0c2VjdDolMDhseFxuIixsYXN0c2VjdCk7CisJZm9yKGk9YmxrYWRkcjtpPGxhc3RzZWN0O2krKykgeworCQlpZiAoZGV2X2Rlc2MtPmJsb2NrX3JlYWQgKGRldl9kZXNjLT5kZXYsIGksIDEsICh1bG9uZyAqKSB0bXBidWYpICE9IDEpCisgIAkgCXJldHVybiAoLTEpOworCQlpZihwcHItPmRlc2N0eXBlPT0weDAwKQorCQkJYnJlYWs7IC8qIGJvb3QgZW50cnkgZm91bmQgKi8KKwkJaWYocHByLT5kZXNjdHlwZT09MHhmZikgeworCQkJaWYodmVyYikKKwkJCQlwcmludGYgKCIqKiBObyB2YWxpZCBib290IGNhdGFsb2cgZm91bmQgb24gJWQ6JWQgKipcbiIsCisJCQkJCWRldl9kZXNjLT5kZXYsIHBhcnRfbnVtKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorIAkvKiBib290IGVudHJ5IGZvdW5kICovCisJaWYoc3RybmNtcChwYnItPmlkZW50X3N0ciwiRUwgVE9SSVRPIFNQRUNJRklDQVRJT04iLDIzKSE9MCkgeworCQlpZih2ZXJiKQorCQkJcHJpbnRmICgiKiogV3JvbmcgRWwgVG9yaXRvIGlkZW50OiAlcyBvbiAlZDolZCAqKlxuIiwKKwkJCQlwYnItPmlkZW50X3N0cixkZXZfZGVzYy0+ZGV2LCBwYXJ0X251bSk7CisJCXJldHVybiAoLTEpOworCX0KKwlib290YWRkcj1sZTMyX3RvX2ludChwYnItPnBvaW50ZXIpOworCVBSSU5URigiIEJvb3QgRW50cnkgYXQ6ICUwOGxYXG4iLGJvb3RhZGRyKTsKKwlpZiAoZGV2X2Rlc2MtPmJsb2NrX3JlYWQgKGRldl9kZXNjLT5kZXYsIGJvb3RhZGRyLCAxLCAodWxvbmcgKikgdG1wYnVmKSAhPSAxKSB7CisJCWlmKHZlcmIpCisJCQlwcmludGYgKCIqKiBDYW4ndCByZWFkIEJvb3QgRW50cnkgYXQgJWxYIG9uICVkOiVkICoqXG4iLAorCQkJCWJvb3RhZGRyLGRldl9kZXNjLT5kZXYsIHBhcnRfbnVtKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWNoa3N1bT0wOworCWNoa3N1bWJ1ZiA9ICh1bnNpZ25lZCBzaG9ydCAqKXRtcGJ1ZjsKKwlmb3IoaT0wO2k8MHgxMDtpKyspCisJCWNoa3N1bSs9KChjaGtzdW1idWZbaV0gJjB4ZmYpPDw4KSsoKGNoa3N1bWJ1ZltpXSAmMHhmZjAwKT4+OCk7CisJaWYoY2hrc3VtIT0wKSB7CisJCWlmKHZlcmIpCisJCQlwcmludGYgKCIqKiBDaGVja3N1bSBFcnJvciBpbiBib290aW5nIGNhdGFsb2cgdmFsaWRhdGlvbiBlbnRyeSBvbiAlZDolZCAqKlxuIiwKKwkJCQlkZXZfZGVzYy0+ZGV2LCBwYXJ0X251bSk7CisJCXJldHVybiAoLTEpOworCX0KKwlpZigocHZlLT5rZXlbMF0hPTB4NTUpfHwocHZlLT5rZXlbMV0hPTB4QUEpKSB7CisJCWlmKHZlcmIpCisJCQlwcmludGYgKCIqKiBLZXkgMHg1NSAweEFBIGVycm9yIG9uICVkOiVkICoqXG4iLAorCQkJCWRldl9kZXNjLT5kZXYsIHBhcnRfbnVtKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisjaWZkZWYgQ0hFQ0tfRk9SX1BPV0VSUENfUExBVFRGT1JNCisJaWYocHZlLT5wbGF0Zm9ybSE9MHgwMSkgeworCQlpZih2ZXJiKQorCQkJcHJpbnRmICgiKiogTm8gUG93ZXJQQyBwbGF0Zm9ybSBDRCBvbiAlZDolZCAqKlxuIiwKKwkJCQlkZXZfZGVzYy0+ZGV2LCBwYXJ0X251bSk7CisJCXJldHVybigtMSk7CisJfQorI2VuZGlmCisJLyogdGhlIHZhbGlkYXRpb24gZW50cnkgc2VlbXMgdG8gYmUgb2ssIG5vdyBzZWFyY2ggdGhlICJwYXJ0aXRpb24iICovCisJZW50cnlfbnVtPTA7CisJb2Zmc2V0PTB4MjA7CisJc3ByaW50ZiAoaW5mby0+dHlwZSwgIlUtQm9vdCIpOworCXN3aXRjaChkZXZfZGVzYy0+aWZfdHlwZSkgeworCQljYXNlIElGX1RZUEVfSURFOgorCQljYXNlIElGX1RZUEVfQVRBUEk6CisJCQlzcHJpbnRmIChpbmZvLT5uYW1lLCAiaGQlYyVkXG4iLCAnYScgKyBkZXZfZGVzYy0+ZGV2LCBwYXJ0X251bSk7CisJCQlicmVhazsKKwkJY2FzZSBJRl9UWVBFX1NDU0k6CisJCQlzcHJpbnRmIChpbmZvLT5uYW1lLCAic2QlYyVkXG4iLCAnYScgKyBkZXZfZGVzYy0+ZGV2LCBwYXJ0X251bSk7CisJCQlicmVhazsKKwkJY2FzZSBJRl9UWVBFX1VTQjoKKwkJCXNwcmludGYgKGluZm8tPm5hbWUsICJ1c2JkJWMlZFxuIiwgJ2EnICsgZGV2X2Rlc2MtPmRldiwgcGFydF9udW0pOworCQkJYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9ET0M6CisJCQlzcHJpbnRmIChpbmZvLT5uYW1lLCAiZG9jZCVjJWRcbiIsICdhJyArIGRldl9kZXNjLT5kZXYsIHBhcnRfbnVtKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZiAoaW5mby0+bmFtZSwgInh4JWMlZFxuIiwgJ2EnICsgZGV2X2Rlc2MtPmRldiwgcGFydF9udW0pOworCQkJYnJlYWs7CisJfQorCS8qIHRoZSBib290Y2F0YWxvZyAoaW5jbHVkaW5nIHZhbGlkYXRpb24gRW50cnkpIGlzIGxpbWl0ZWQgdG8gMjA0OEJ5dGVzCisJICogKDYzIGJvb3QgZW50cmllcyArIHZhbGlkYXRpb24gZW50cnkpICovCisJIHdoaWxlKG9mZnNldDwyMDQ4KSB7CisJCXBpZGU9KGlzb19pbml0X2RlZl9lbnRyeV90ICopJnRtcGJ1ZltvZmZzZXRdOworCQlpZiAoKHBpZGUtPmJvb3RfaW5kPT0weDg4KSB8fAorCQkgICAgKHBpZGUtPmJvb3RfaW5kPT0weDAwKSkgeyAvKiBIZWFkZXIgSWQgZm9yIGRlZmF1bHQgU2VjdGlvbnMgRW50cmllcyAqLworCQkJaWYoZW50cnlfbnVtPT1wYXJ0X251bSkgeyAvKiBwYXJ0IGZvdW5kICovCisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJCWVudHJ5X251bSsrOyAvKiBjb3VudCBwYXJ0aXRpb25zIEVudHJpZXMgKGJvb3QgYW5kIG5vbiBib290YWJsZXMgKi8KKwkJCW9mZnNldCs9MHgyMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgocGlkZS0+Ym9vdF9pbmQ9PTB4OTApIHx8CS8qIFNlY3Rpb24gSGVhZGVyIEVudHJ5ICovCisJCSAgICAocGlkZS0+Ym9vdF9pbmQ9PTB4OTEpIHx8CS8qIFNlY3Rpb24gSGVhZGVyIEVudHJ5IChsYXN0KSAqLworCQkgICAgKHBpZGUtPmJvb3RfaW5kPT0weDQ0KSkgewkvKiBFeHRlbnNpb24gSW5kaWNhdG9yICovCisJCQlvZmZzZXQrPTB4MjA7IC8qIHNraXAgdW51c2VkIGVudHJpZXMgKi8KKwkJfQorCQllbHNlIHsKKwkJCWlmKHZlcmIpCisJCQkJcHJpbnRmICgiKiogUGFydGl0aW9uICVkIG5vdCBmb3VuZCBvbiBkZXZpY2UgJWQgKipcbiIsCisJCQkJCXBhcnRfbnVtLGRldl9kZXNjLT5kZXYpOworCQkJcmV0dXJuKC0xKTsKKwkJfQorCX0KKwkvKiBpZiB3ZSByZWFjaCB0aGlzIHBvaW50IGVudGlyZSBzZWN0b3IgaGFzIGJlZW4KKwkgKiBzZWFyY2hlZCB3L28gc3VjY3Nlc3MgKi8KKwlpZih2ZXJiKQorCQlwcmludGYgKCIqKiBQYXJ0aXRpb24gJWQgbm90IGZvdW5kIG9uIGRldmljZSAlZCAqKlxuIiwKKwkJCXBhcnRfbnVtLGRldl9kZXNjLT5kZXYpOworCXJldHVybigtMSk7Citmb3VuZDoKKwlpZihwaWRlLT5ib290X2luZCE9MHg4OCkgeworCQlpZih2ZXJiKQorCQkJcHJpbnRmICgiKiogUGFydGl0aW9uICVkIGlzIG5vdCBib290YWJsZSBvbiBkZXZpY2UgJWQgKipcbiIsCisJCQkJcGFydF9udW0sZGV2X2Rlc2MtPmRldik7CisJCXJldHVybiAoLTEpOworCX0KKwlzd2l0Y2gocGlkZS0+Ym9vdF9tZWRpYSkgeworCQljYXNlIDB4MDA6IC8qIG5vIGVtdWxhdGlvbiAqLworCQkJaW5mby0+c2l6ZT1sZTE2X3RvX2ludChwaWRlLT5zZWNfY250KT4+MjsKKwkJCWJyZWFrOworCQljYXNlIDB4MDE6CWluZm8tPnNpemU9MjQwMD4+MjsgYnJlYWs7IC8qIDEuMk1CeXRlIEZsb3BweSAqLworCQljYXNlIDB4MDI6CWluZm8tPnNpemU9Mjg4MD4+MjsgYnJlYWs7IC8qIDEuNDRNQnl0ZSBGbG9wcHkgKi8KKwkJY2FzZSAweDAzOglpbmZvLT5zaXplPTU3NjA+PjI7IGJyZWFrOyAvKiAyLjg4TUJ5dGUgRmxvcHB5ICovCisJCWNhc2UgMHgwNDoJaW5mby0+c2l6ZT0yODgwPj4yOyBicmVhazsgLyogZHVtbXkgKEhEIEVtdWxhdGlvbikgKi8KKwkJZGVmYXVsdDoJaW5mby0+c2l6ZT0wOyBicmVhazsKKwl9CisJbmV3YmxrYWRkcj1sZTMyX3RvX2ludChwaWRlLT5yZWxfYmxvY2tfYWRkcik7CisJaW5mby0+c3RhcnQ9bmV3YmxrYWRkcjsKKwlQUklOVEYoIiBwYXJ0ICVkIGZvdW5kIEAgJWx4IHNpemUgJWx4XG4iLHBhcnRfbnVtLG5ld2Jsa2FkZHIsaW5mby0+c2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfcGFydGl0aW9uX2luZm9faXNvKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnRfbnVtLCBkaXNrX3BhcnRpdGlvbl90ICogaW5mbykKK3sKKwlyZXR1cm4oZ2V0X3BhcnRpdGlvbl9pbmZvX2lzb192ZXJiKGRldl9kZXNjLCBwYXJ0X251bSwgaW5mbywgMSkpOworfQorCisKKwordm9pZCBwcmludF9wYXJ0X2lzbyhibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MpCit7CisJZGlza19wYXJ0aXRpb25fdCBpbmZvOworCWludCBpOworCWlmKGdldF9wYXJ0aXRpb25faW5mb19pc29fdmVyYihkZXZfZGVzYywwLCZpbmZvLDApPT0tMSkgeworCQlwcmludGYoIioqIE5vIGJvb3QgcGFydGl0aW9uIGZvdW5kIG9uIGRldmljZSAlZCAqKlxuIixkZXZfZGVzYy0+ZGV2KTsKKwkJcmV0dXJuOworCX0KKwlwcmludGYoIlBhcnQgICBTdGFydCAgICAgU2VjdCB4IFNpemUgVHlwZVxuIik7CisJaT0wOworCWRvIHsKKwkJcHJpbnRmICgiICUyZCAlOGxkICU4bGQgJTZsZCAlLjMyc1xuIiwKKwkJCWksIGluZm8uc3RhcnQsIGluZm8uc2l6ZSwgaW5mby5ibGtzeiwgaW5mby50eXBlKTsKKwkJaSsrOworCX0gd2hpbGUgKGdldF9wYXJ0aXRpb25faW5mb19pc29fdmVyYihkZXZfZGVzYyxpLCZpbmZvLDApIT0tMSk7Cit9CisKK2ludCB0ZXN0X3BhcnRfaXNvIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYykKK3sKKwlkaXNrX3BhcnRpdGlvbl90IGluZm87CisKKwlyZXR1cm4oZ2V0X3BhcnRpdGlvbl9pbmZvX2lzb192ZXJiKGRldl9kZXNjLDAsJmluZm8sMCkpOworfQorCisjZW5kaWYgLyogKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkpICYmIGRlZmluZWQoQ09ORklHX0lTT19QQVJUSVRJT04pICovCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLk9YQyBiL2RvYy9SRUFETUUuT1hDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YmI3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUkVBRE1FLk9YQwpAQCAtMCwwICsxLDI1IEBACitUaGlzIGRvY3VtZW50IGNvbnRhaW5zIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9ydAorb2YgVS1Cb290IGZvciB0aGUgT1hDIGJvYXJkIGRlc2lnbmVkIGJ5IEx1Y2VudCBUZWNobm9sb2dpZXMsCitJbmMuCisKKzEuIFNob3dpbmcgYWN0aXZpdHkKKworVS1Cb290IGZvciB0aGUgT1hDIGJvYXJkIGNhbiBzaG93IGl0cyBjdXJyZW50IHN0YXR1cyB1c2luZwordGhlIEFjdGl2ZSBMRUQuIFRoaXMgZmVhdHVyZSBpcyBjb25maWd1cmVkIGJ5IHRoZSBmb2xsb3dpbmcKK29wdGlvbnM6CisKK0NPTkZJR19TSE9XX0FDVElWSVRZCisKKyAgV2hlbiB0aGlzIG9wdGlvbiBpcyBvbiwgdGhlIEFjdGl2ZSBMRUQgaXMgYmxpbmtpbmcgZmFzdAord2hlbiBVLUJvb3QgcnVucyBpbiB0aGUgaWRsZSBsb29wIChpLmUuIHdhaXRzIGZvciB1c2VyCitjb21tYW5kcyBmcm9tIHNlcmlhbCBjb25zb2xlKSBhbmQgYmxpbmtpbmcgc2xvdyB3aGVuIGl0Citkb3dubG9hZHMgYW4gaW1hZ2Ugb3ZlciBuZXR3b3JrLiBXaGVuIFUtQm9vdCBsb2FkcyBhbiBpbWFnZQorb3ZlciBzZXJpYWwgbGluZSB0aGUgQWN0aXZlIExFRCBkb2VzIG5vdCBibGluayBhbmQgaXRzIHN0YXRlCitpcyByYW5kb20gKGkuZS4gZWl0aGVyIGNvbnN0YW50IG9uIG9yIGNvbnN0YW50IG9mZikuCisKK0NPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKKworICBXaGVuIHRoaXMgb3B0aW9uIGlzIG9uLCBVLUJvb3Qgc3dpdGNoZXMgdGhlIEFjdGl2ZSBMRUQKK29mZiBiZWZvcmUgYm9vdGluZyBhbiBpbWFnZSBhbmQgc3dpdGNoZXMgaXQgb24gaWYgYm9vdGluZworZmFpbGVkIGR1ZSB0byBzb21lIHJlYXNvbnMuCisKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuYXV0b2Jvb3QgYi9kb2MvUkVBRE1FLmF1dG9ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNzM2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUkVBRE1FLmF1dG9ib290CkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBEYXZlIEVsbGlzLCBTSVhORVQsIGRnZUBzaXhuZXRpby5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitVc2luZyBhdXRvYm9vdCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgYmFzaWMgYXV0b2Jvb3QgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkb2N1bWVudGVkIGluIHRoZSBtYWluCitVLUJvb3QgUkVBRE1FLiBTZWUgaXQgZm9yIGRldGFpbHMuIFRoZXkgYXJlOgorCisgIGJvb3RkZWxheQorICBib290Y21kCisgIENPTkZJR19CT09UREVMQVkKKyAgQ09ORklHX0JPT1RDT01NQU5ECisKK1NvbWUgYWRkaXRpb25hbCBvcHRpb25zIHRoYXQgbWFrZSBhdXRvYm9vdCBzYWZlciBpbiBhIHByb2R1Y3Rpb24KK3Byb2R1Y3QgYXJlIGRvY3VtZW50ZWQgaGVyZS4KKworV2h5IHVzZSB0aGVtPworLS0tLS0tLS0tLS0tLQorCitUaGUgYmFzaWMgYXV0b2Jvb3QgZmVhdHVyZSBhbGxvd3MgYSBzeXN0ZW0gdG8gYXV0b21hdGljYWxseSBib290IHRvCit0aGUgcmVhbCBhcHBsaWNhdGlvbiAoc3VjaCBhcyBMaW51eCkgd2l0aG91dCBhIHVzZXIgaGF2aW5nIHRvIGVudGVyCithbnkgY29tbWFuZHMuIElmIGFueSBrZXkgaXMgcHJlc3NlZCBiZWZvcmUgdGhlIGJvb3QgZGVsYXkgdGltZQorZXhwaXJlcywgVS1Cb290IHN0b3BzIHRoZSBhdXRvYm9vdCBwcm9jZXNzLCBnaXZlcyBhIFUtQm9vdCBwcm9tcHQKK2FuZCB3YWl0cyBmb3JldmVyIGZvciBhIGNvbW1hbmQuIFRoYXQncyBhIGdvb2QgdGhpbmcgaWYgeW91IHByZXNzZWQgYQora2V5IGJlY2F1c2UgeW91IHdhbnRlZCB0byBnZXQgdGhlIHByb21wdC4KKworSXQncyBub3Qgc28gZ29vZCBpZiB0aGUga2V5IHByZXNzIHdhcyBhIHN0cmF5IGNoYXJhY3RlciBvbiB0aGUKK2NvbnNvbGUgc2VyaWFsIHBvcnQsIHNheSBiZWNhdXNlIGEgdXNlciB3aG8ga25vd3Mgbm90aGluZyBhYm91dAorVS1Cb290IHByZXNzZWQgYSBrZXkgYmVmb3JlIHRoZSBzeXN0ZW0gaGFkIHRpbWUgdG8gYm9vdC4gSXQncyBldmVuCit3b3JzZSBvbiBhbiBlbWJlZGRlZCBwcm9kdWN0IHRoYXQgZG9lc24ndCBoYXZlIGEgY29uc29sZSBkdXJpbmcKK25vcm1hbCB1c2UuIFRoZSBtb2RlbSBwbHVnZ2VkIGludG8gdGhhdCBjb25zb2xlIHBvcnQgc2VuZHMgYQorY2hhcmFjdGVyIGF0IHRoZSB3cm9uZyB0aW1lIGFuZCB0aGUgc3lzdGVtIGhhbmdzLCB3aXRoIG5vIGNsdWUgYXMgdG8KK3doeSBpdCBpc24ndCB3b3JraW5nLgorCitZb3UgbWlnaHQgd2FudCB0aGUgc3lzdGVtIHRvIGF1dG9ib290IHRvIHJlY292ZXIgYWZ0ZXIgYW4gZXh0ZXJuYWwKK2NvbmZpZ3VyYXRpb24gcHJvZ3JhbSBzdG9wcyBhdXRvYm9vdC4gSWYgdGhlIGNvbmZpZ3VyYXRpb24gcHJvZ3JhbQorZGllcyBvciBsb3NlcyBpdHMgY29ubmVjdGlvbiAobW9kZW1zIGNhbiBkaXNjb25uZWN0IGF0IHRoZSB3b3JzdAordGltZSkgVS1Cb290IHdpbGwgcGF0aWVudGx5IHdhaXQgZm9yZXZlciBmb3IgaXQgdG8gZmluaXNoLgorCitUaGVzZSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBjYW4gaGVscCBwcm92aWRlIGEgc3lzdGVtIHRoYXQKK2Jvb3RzIHdoZW4gaXQgc2hvdWxkLCBidXQgc3RpbGwgYWxsb3dzIGFjY2VzcyB0byBVLUJvb3QuCisKK1doYXQgdGhleSBkbworLS0tLS0tLS0tLS0tCisKKyAgQ09ORklHX0JPT1RfUkVUUllfVElNRQorICBDT05GSUdfQk9PVF9SRVRSWV9NSU4KKworICBib290cmV0cnkgZW52aXJvbm1lbnQgdmFyaWFibGUKKworICAgICAgICBUaGVzZSBvcHRpb25zIGRldGVybWluZSB3aGF0IGhhcHBlbnMgYWZ0ZXIgYXV0b2Jvb3QgaXMKKyAgICAgICAgc3RvcHBlZCBhbmQgVS1Cb290IGlzIHdhaXRpbmcgZm9yIGNvbW1hbmRzLgorCisgICAgICAgIENPTkZJR19CT09UX1JFVFJZX1RJTUUgbXVzdCBiZSBkZWZpbmVkIHRvIGVuYWJsZSB0aGUgYm9vdAorICAgICAgICByZXRyeSBmZWF0dXJlLiBJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ2Jvb3RyZXRyeScgaXMKKyAgICAgICAgZm91bmQgdGhlbiBpdHMgdmFsdWUgaXMgdXNlZCwgb3RoZXJ3aXNlIHRoZSByZXRyeSB0aW1lb3V0IGlzCisgICAgICAgIENPTkZJR19CT09UX1JFVFJZX1RJTUUuIENPTkZJR19CT09UX1JFVFJZX01JTiBpcyBvcHRpb25hbCBhbmQKKyAgICAgICAgZGVmYXVsdHMgdG8gQ09ORklHX0JPT1RfUkVUUllfVElNRS4gQWxsIHRpbWVzIGFyZSBpbiBzZWNvbmRzLgorCisgICAgICAgIElmIHRoZSByZXRyeSB0aW1lb3V0IGlzIG5lZ2F0aXZlLCB0aGUgVS1Cb290IGNvbW1hbmQgcHJvbXB0CisgICAgICAgIG5ldmVyIHRpbWVzIG91dC4gT3RoZXJ3aXNlIGl0IGlzIGZvcmNlZCB0byBiZSBhdCBsZWFzdAorICAgICAgICBDT05GSUdfQk9PVF9SRVRSWV9NSU4gc2Vjb25kcy4gSWYgbm8gdmFsaWQgVS1Cb290IGNvbW1hbmQgaXMKKyAgICAgICAgZW50ZXJlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCB0aW1lIHRoZSBib290IGRlbGF5IHNlcXVlbmNlIGlzCisgICAgICAgIHJlc3RhcnRlZC4gRWFjaCBjb21tYW5kIHRoYXQgVS1Cb290IGV4ZWN1dGVzIHJlc3RhcnRzIHRoZQorICAgICAgICB0aW1lb3V0LgorCisgICAgICAgIElmIENPTkZJR19CT09UX1JFVFJZX1RJTUUgPCAwIHRoZSBmZWF0dXJlIGlzIHRoZXJlLCBidXQKKyAgICAgICAgZG9lc24ndCBkbyBhbnl0aGluZyB1bmxlc3MgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICAgICdib290cmV0cnknIGlzID49IDAuCisKKyAgQ09ORklHX0FVVE9CT09UX0tFWUVECisgIENPTkZJR19BVVRPQk9PVF9QUk9NUFQKKyAgQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUgorICBDT05GSUdfQVVUT0JPT1RfU1RPUF9TVFIKKyAgQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUjIKKyAgQ09ORklHX0FVVE9CT09UX1NUT1BfU1RSMgorCisgIGJvb3RkZWxheWtleQllbnZpcm9ubWVudCB2YXJpYWJsZQorICBib290c3RvcGtleQllbnZpcm9ubWVudCB2YXJpYWJsZQorICBib290ZGVsYXlrZXkyCWVudmlyb25tZW50IHZhcmlhYmxlCisgIGJvb3RzdG9wa2V5MgllbnZpcm9ubWVudCB2YXJpYWJsZQorCisgICAgICAgIFRoZXNlIG9wdGlvbnMgZ2l2ZSBtb3JlIGNvbnRyb2wgb3ZlciBzdG9wcGluZyBhdXRvYm9vdC4gV2hlbgorICAgICAgICB0aGV5IGFyZSB1c2VkIGEgc3BlY2lmaWMgY2hhcmFjdGVyIG9yIHN0cmluZyBpcyByZXF1aXJlZCB0bworICAgICAgICBzdG9wIG9yIGRlbGF5IGF1dG9ib290LgorCisJRGVmaW5lIENPTkZJR19BVVRPQk9PVF9LRVlFRCAobm8gdmFsdWUgcmVxdWlyZWQpIHRvIGVuYWJsZQorCXRoaXMgZ3JvdXAgb2Ygb3B0aW9ucy4gIENPTkZJR19BVVRPQk9PVF9ERUxBWV9TVFIsCisJQ09ORklHX0FVVE9CT09UX1NUT1BfU1RSIG9yIGJvdGggc2hvdWxkIGJlIHNwZWNpZmllZCAob3IKKwlzcGVjaWZpZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUpLAorCW90aGVyd2lzZSB0aGVyZSBpcyBubyB3YXkgdG8gc3RvcCBhdXRvYm9vdC4KKworICAgICAgICBDT05GSUdfQVVUT0JPT1RfUFJPTVBUIGlzIGRpc3BsYXllZCBiZWZvcmUgdGhlIGJvb3QgZGVsYXkKKyAgICAgICAgc2VsZWN0ZWQgYnkgQ09ORklHX0JPT1RERUxBWSBzdGFydHMuIElmIGl0IGlzIG5vdCBkZWZpbmVkCisgICAgICAgIHRoZXJlIGlzIG5vIG91dHB1dCBpbmRpY2F0aW5nIHRoYXQgYXV0b2Jvb3QgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICAgIElmICIlZCIgaXMgaW5jbHVkZWQsIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBudW1iZXIgb2Ygc2Vjb25kcworICAgICAgICByZW1haW5pbmcgYmVmb3JlIGF1dG9ib290IHdpbGwgc3RhcnQsIGJ1dCBpdCBkb2VzIG5vdCBjb3VudAorICAgICAgICBkb3duIHRoZSBzZWNvbmRzLiAiYXV0b2Jvb3QgaW4gJWQgc2Vjb25kc1xuIiBpcyBhIHJlYXNvbmFibGUKKyAgICAgICAgcHJvbXB0LgorCisgICAgICAgIElmIENPTkZJR19BVVRPQk9PVF9ERUxBWV9TVFIgb3IgYm9vdGRlbGF5a2V5IGlzIHNwZWNpZmllZCBhbmQKKyAgICAgICAgdGhpcyBzdHJpbmcgaXMgcmVjZWl2ZWQgZnJvbSBjb25zb2xlIGlucHV0IGJlZm9yZSBhdXRvYm9vdAorICAgICAgICBzdGFydHMgYm9vdGluZywgVS1Cb290IGdpdmVzIGEgY29tbWFuZCBwcm9tcHQuIFRoZSBVLUJvb3QKKyAgICAgICAgcHJvbXB0IHdpbGwgdGltZSBvdXQgaWYgQ09ORklHX0JPT1RfUkVUUllfVElNRSBpcyB1c2VkLAorICAgICAgICBvdGhlcndpc2UgaXQgbmV2ZXIgdGltZXMgb3V0LgorCisgICAgICAgIElmIENPTkZJR19BVVRPQk9PVF9TVE9QX1NUUiBvciBib290c3RvcGtleSBpcyBzcGVjaWZpZWQgYW5kCisgICAgICAgIHRoaXMgc3RyaW5nIGlzIHJlY2VpdmVkIGZyb20gY29uc29sZSBpbnB1dCBiZWZvcmUgYXV0b2Jvb3QKKyAgICAgICAgc3RhcnRzIGJvb3RpbmcsIFUtQm9vdCBnaXZlcyBhIGNvbW1hbmQgcHJvbXB0LiBUaGUgVS1Cb290CisgICAgICAgIHByb21wdCBuZXZlciB0aW1lcyBvdXQsIGV2ZW4gaWYgQ09ORklHX0JPT1RfUkVUUllfVElNRSBpcworICAgICAgICB1c2VkLgorCisgICAgICAgIFRoZSBzdHJpbmcgcmVjb2duaXRpb24gaXMgbm90IHZlcnkgc29waGlzdGljYXRlZC4gSWYgYQorICAgICAgICBwYXJ0aWFsIG1hdGNoIGlzIGRldGVjdGVkLCB0aGUgZmlyc3Qgbm9uLW1hdGNoaW5nIGNoYXJhY3RlcgorICAgICAgICBpcyBjaGVja2VkIHRvIHNlZSBpZiBzdGFydHMgYSBuZXcgbWF0Y2guIFRoZXJlIGlzIG5vIGNoZWNrCisgICAgICAgIGZvciBhIHNob3J0ZXIgcGFydGlhbCBtYXRjaCwgc28gaXQncyBiZXN0IGlmIHRoZSBmaXJzdAorICAgICAgICBjaGFyYWN0ZXIgb2YgYSBrZXkgc3RyaW5nIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgcmVzdCBvZiB0aGUKKyAgICAgICAgc3RyaW5nLgorCisgICAgICAgIFVzaW5nIHRoZSBDT05GSUdfQVVUT0JPT1RfREVMQVlfU1RSMiAvICBib290ZGVsYXlrZXkyICBhbmQvb3IKKyAgICAgICAgQ09ORklHX0FVVE9CT09UX1NUT1BfU1RSMiAgIC8gICBib290c3RvcGtleSAgI2RlZmluZXMgIGFuZC9vcgorICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgeW91IGNhbiAgc3BlY2lmeSAgYSAgc2Vjb25kLCAgYWx0ZXJuYXRlCisgICAgICAgIHN0cmluZyAod2hpY2ggYWxsb3dzIHlvdSB0byBoYXcgdHdvICJwYXNzd29yZCIgc3RyaW5ncykuCisKKyAgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCisKKyAgICAgICAgSWYgdGhpcyBvcHRpb24gaXMgZGVmaW5lZCwgeW91IGNhbiBzdG9wIHRoZSBhdXRvYm9vdCBwcm9jZXNzCisgICAgICAgIGJ5IGhpdHRpbmcgYSBrZXkgZXZlbiBpbiB0aGF0IGNhc2Ugd2hlbiAiYm9vdGRlbGF5IiBoYXMgYmVlbgorICAgICAgICBzZXQgdG8gMC4gWW91IGNhbiBzZXQgImJvb3RkZWxheSIgdG8gYSBuZWdhdGl2ZSB2YWx1ZSB0bworICAgICAgICBwcmV2ZW50IHRoZSBjaGVjayBmb3IgY29uc29sZSBpbnB1dC4KKworICBDT05GSUdfUkVTRVRfVE9fUkVUUlkKKworICAgICAgICAoT25seSBlZmZlY3RpdmUgd2hlbiBDT05GSUdfQk9PVF9SRVRSWV9USU1FIGlzIGFsc28gc2V0KQorICAgICAgICBBZnRlciB0aGUgY291bnRkb3duIHRpbWVkIG91dCwgdGhlIGJvYXJkIHdpbGwgYmUgcmVzZXQgdG8gcmVzdGFydAorICAgICAgICBhZ2Fpbi4KKwpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5jb25zb2xlIGIvZG9jL1JFQURNRS5jb25zb2xlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNDc3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUkVBRE1FLmNvbnNvbGUKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFBhb2xvIFNjYWZmYXJkaSwgQUlSVkVOVCBTQU0gcy5wLmEgLSBSSU1JTkkoSVRBTFkpLCBhcnNlbmlvQHRpbi5pdAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK1UtQm9vdCBjb25zb2xlIGhhbmRsaW5nCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworSE9XIFRIRSBDT05TT0xFIFdPUktTPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdCBzeXN0ZW0gc3RhcnR1cCBVLUJvb3QgaW5pdGlhbGl6ZXMgYSBzZXJpYWwgY29uc29sZS4gV2hlbiBVLUJvb3QKK3JlbG9jYXRlcyBpdHNlbGYgdG8gUkFNLCBhbGwgY29uc29sZSBkcml2ZXJzIGFyZSBpbml0aWFsaXplZCAodGhleQord2lsbCByZWdpc3RlciBhbGwgZGV0ZWN0ZWQgY29uc29sZSBkZXZpY2VzIHRvIHRoZSBzeXN0ZW0gZm9yIGZ1cnRoZXIKK3VzZSkuCisKK0lmIG5vdCBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudCwgdGhlIGZpcnN0IGlucHV0IGRldmljZSBpcyBhc3NpZ25lZAordG8gdGhlICdzdGRpbicgZmlsZSwgdGhlIGZpcnN0IG91dHB1dCBvbmUgdG8gJ3N0ZG91dCcgYW5kICdzdGRlcnInLgorCitZb3UgY2FuIHVzZSB0aGUgY29tbWFuZCAiY29uaW5mbyIgdG8gc2VlIGFsbCByZWdpc3RlcmVkIGNvbnNvbGUKK2RldmljZXMgYW5kIHRoZWlyIGZsYWdzLiBZb3UgY2FuIGFzc2lnbiBhIHN0YW5kYXJkIGZpbGUgKHN0ZGluLAorc3Rkb3V0IG9yIHN0ZGVycikgdG8gYW55IGRldmljZSB5b3Ugc2VlIGluIHRoYXQgbGlzdCBzaW1wbHkgYnkKK2Fzc2lnbmluZyBpdHMgbmFtZSB0byB0aGUgY29ycmVzcG9uZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRm9yCitleGFtcGxlOgorCisgICAgc2V0ZW52IHN0ZGluIHdsX2tiZAkJPC0gVG8gdXNlIHRoZSB3aXJlbGVzcyBrZXlib2FyZAorICAgIHNldGVudiBzdGRvdXQgdmlkZW8JCTwtIFRvIHVzZSB0aGUgdmlkZW8gY29uc29sZQorCitEbyBhIHNpbXBsZSAic2F2ZWVudiIgdG8gc2F2ZSB0aGUgY29uc29sZSBzZXR0aW5ncyBpbiB0aGUgZW52aXJvbm1lbnQKK2FuZCBnZXQgdGhlbSB3b3JraW5nIG9uIHRoZSBuZXh0IHN0YXJ0dXAsIHRvby4KKworSE9XIENBTiBJIFVTRSBTVEFOREFSRCBGSUxFIElOVE8gVEhFIFNPVVJDRVM/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdG8gYWNjZXNzIHRoZSBjb25zb2xlOgorCisqIFNURE9VVDoKKyAgICBwdXRjCSh0byBwdXQgYSBjaGFyIHRvIHN0ZG91dCkKKyAgICBwdXRzCSh0byBwdXQgYSBzdHJpbmcgdG8gc3Rkb3V0KQorICAgIHByaW50ZgkodG8gZm9ybWF0IGFuZCBwdXQgYSBzdHJpbmcgdG8gc3Rkb3V0KQorCisqIFNURElOOgorICAgIHRzdGMJKHRvIHRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGNoYXIgaW4gc3RkaW4pCisgICAgZ2V0YwkodG8gZ2V0IGEgY2hhciBmcm9tIHN0ZGluKQorCisqIFNUREVSUjoKKyAgICBlcHV0YwkodG8gcHV0IGEgY2hhciB0byBzdGRlcnIpCisgICAgZXB1dHMJKHRvIHB1dCBhIHN0cmluZyB0byBzdGRlcnIpCisgICAgZXByaW50ZgkodG8gZm9ybWF0IGFuZCBwdXQgYSBzdHJpbmcgdG8gc3RkZXJyKQorCisqIEZJTEUgKGNhbiBiZSAnc3RkaW4nLCAnc3Rkb3V0JywgJ3N0ZGVycicpOgorICAgIGZwdXRjCShsaWtlIHB1dGMgYnV0IHJlZGlyZWN0ZWQgdG8gYSBmaWxlKQorICAgIGZwdXRzCShsaWtlIHB1dHMgYnV0IHJlZGlyZWN0ZWQgdG8gYSBmaWxlKQorICAgIGZwcmludGYJKGxpa2UgcHJpbnRmIGJ1dCByZWRpcmVjdGVkIHRvIGEgZmlsZSkKKyAgICBmdHN0YwkobGlrZSB0c3RjIGJ1dCByZWRpcmVjdGVkIHRvIGEgZmlsZSkKKyAgICBmZ2V0YwkobGlrZSBnZXRjIGJ1dCByZWRpcmVjdGVkIHRvIGEgZmlsZSkKKworUmVtZW1iZXIgdGhhdCBhbGwgRklMRS1yZWxhdGVkIGZ1bmN0aW9ucyBDQU5OT1QgYmUgdXNlZCBiZWZvcmUKK1UtQm9vdCByZWxvY2F0aW9uIChkb25lIGluICdib2FyZF9pbml0X3InIGluIGNvbW1vbi9ib2FyZC5jKS4KKworSE9XIENBTiBJIFVTRSBTVEFOREFSRCBGSUxFIElOVE8gQVBQTElDQVRJT05TPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVc2UgdGhlICdiZF9tb25fZm5jJyBmaWVsZCBvZiB0aGUgYmRfdCBzdHJ1Y3R1cmUgcGFzc2VkIHRvIHRoZQorYXBwbGljYXRpb24gdG8gZG8gZXZlcnl0aGluZyB5b3Ugd2FudCB3aXRoIHRoZSBjb25zb2xlLgorCitCdXQgUkVNRU1CRVIgdGhhdCB0aGF0IHdpbGwgd29yayBvbmx5IGlmIHlvdSBoYXZlIG5vdCBvdmVyd3JpdHRlbiBhbnkKK1UtQm9vdCBjb2RlIHdoaWxlIGxvYWRpbmcgKG9yIHVuY29tcHJlc3NpbmcpIHRoZSBpbWFnZSBvZiB5b3VyCithcHBsaWNhdGlvbi4KKworRm9yIGV4YW1wbGUsIHlvdSB3b24ndCBnZXQgdGhlIGNvbnNvbGUgc3R1ZmYgcnVubmluZyBpbiB0aGUgTGludXgKK2tlcm5lbCBiZWNhdXNlIHRoZSBrZXJuZWwgb3ZlcndyaXRlcyBVLUJvb3QgYmVmb3JlIHJ1bm5pbmcuIE9ubHkKK3NvbWUgcGFyYW1ldGVycyBsaWtlIHRoZSBmcmFtZWJ1ZmZlciBkZXNjcmlwdG9ycyBhcmUgcGFzc2VkIHRvIHRoZQora2VybmVsIGluIHRoZSBoaWdoIG1lbW9yeSBhcmVhIHRvIGxldCB0aGUgYXBwbGljYXRpb25zICh0aGUga2VybmVsKQordXNlIHRoZSBmcmFtZWJ1ZmZlcnMgaW5pdGlhbGl6ZWQgYnkgVS1Cb290LgorCitTVVBQT1JURUQgRFJJVkVSUworLS0tLS0tLS0tLS0tLS0tLS0KKworV29ya2luZyBkcml2ZXJzOgorCisgICAgc2VyaWFsIAkoYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCBzZXJpYWwgc3R1ZmYpCisgICAgdmlkZW8gCShtcGM4eHggdmlkZW8gY29udHJvbGxlcikKKworV29yayBpbiBwcm9ncmVzczoKKworICAgIHdsX2tiZAkoV2lyZWxlc3MgNFBQTSBrZXlib2FyZCkKKworV2FpdGluZyBmb3Igdm9sb3VudGVlcnM6CisKKyAgICBsY2QJKG1wYzh4eCBsY2QgY29udHJvbGxlcjsgdG8gKQorCitURVNURUQgQ09ORklHVVJBVElPTlMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbnMgKHNlZQorQ1JFRElUUyBmb3Igb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbnMpOgorCistIE1QQzgyM0ZBRFMgd2l0aCBBRDcxNzYgb24gYSBQQUwgVFYgKFlDYllDcikgCS0gYXJzZW5pb0B0aW4uaXQKKy0gR0VOSUVUViAgICB3aXRoIEFENzE3NyBvbiBhIFBBTCBUViAoWUNiWUNyKQktIGFyc2VuaW9AdGluLml0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbTU3MHguYyBiL2RyaXZlcnMvYmNtNTcweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODg4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2JjbTU3MHguYwpAQCAtMCwwICsxLDE3MDkgQEAKKy8qCisgKiBCcm9hZGNvbSBCQ001NzB4IEV0aGVybmV0IERyaXZlciBmb3IgVS1Cb290LgorICogU3VwcG9ydCA1NzAxLCA1NzAyLCA1NzAzLCBhbmQgNTcwNC4gU2luZ2xlIGluc3RhbmNlIGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBKYW1lcyBGLiBEb3VnaGVydHkgKGpmZEBicm9hZGNvbS5jb20pCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAoIWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkpICYmIFwKKwlkZWZpbmVkKENPTkZJR19CQ001NzB4KQorCisjaWZkZWYgQ09ORklHX0JNVworI2luY2x1ZGUgPG1wYzgyNHguaD4KKyNlbmRpZgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgImJjbTU3MHhfbW0uaCIKKyNpbmNsdWRlICJiY201NzB4X2F1dG9uZWcuaCIKKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworCisKKy8qCisgKiBQQ0kgUmVnaXN0ZXJzIGFuZCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBQQ0lfQ01EX01BU0sJMHhmZmZmMDAwMAkvKiBtYXNrIHRvIHNhdmUgc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgUENJX0FOWV9JRCAofjApCisKKy8qCisgKiBQQ0kgbWVtb3J5IGJhc2UgZm9yIEV0aGVybmV0IGRldmljZSBhcyB3ZWxsIGFzIGRldmljZSBJbnRlcnJ1cHQuCisgKi8KKyNkZWZpbmUgQkNNNTcwWF9NQkFSIAkweDgwMTAwMDAwCisjZGVmaW5lIEJDTTU3MFhfSUxJTkUgICAxCisKKworCisjZGVmaW5lIFNFQ09ORF9VU0VDCTEwMDAwMDAKKyNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFIDE2MDAKKyNkZWZpbmUgTUFYX1VOSVRTICAgICAgIDQKKworLyogR2xvYmFscyB0byB0aGlzIG1vZHVsZSAqLworaW50IGluaXRpYWxpemVkID0gMDsKK3Vuc2lnbmVkIGludCBpb0Jhc2UgPSAwOwordm9sYXRpbGUgUExNX0RFVklDRV9CTE9DSyAgICBwRGV2aWNlID0gTlVMTDsgICAgICAgIC8qIDU3MHggc29mdGMgKi8KK3ZvbGF0aWxlIFBVTV9ERVZJQ0VfQkxPQ0sgICAgcFVtRGV2aWNlID0gTlVMTDsKKworLyogVXNlZCB0byBwYXNzIHRoZSBmdWxsLWR1cGxleCBmbGFnLCBldGMuICovCitpbnQgbGluZV9zcGVlZFtNQVhfVU5JVFNdID0gezAsMCwwLDB9Oworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdID0gezEsMSwxLDF9Oworc3RhdGljIGludCByeF9mbG93X2NvbnRyb2xbTUFYX1VOSVRTXSA9IHswLDAsMCwwfTsKK3N0YXRpYyBpbnQgdHhfZmxvd19jb250cm9sW01BWF9VTklUU10gPSB7MCwwLDAsMH07CitzdGF0aWMgaW50IGF1dG9fZmxvd19jb250cm9sW01BWF9VTklUU10gPSB7MCwwLDAsMH07CitzdGF0aWMgaW50IHR4X2NoZWNrc3VtW01BWF9VTklUU10gPSB7MSwxLDEsMX07CitzdGF0aWMgaW50IHJ4X2NoZWNrc3VtW01BWF9VTklUU10gPSB7MSwxLDEsMX07CitzdGF0aWMgaW50IGF1dG9fc3BlZWRbTUFYX1VOSVRTXSA9IHsxLDEsMSwxfTsKKworI2lmIEpVTUJPX0ZSQU1FUworLyogSnVtYm8gTVRVIGZvciBpbnRlcmZhY2VzLiAqLworc3RhdGljIGludCBtdHVbTUFYX1VOSVRTXSA9IHswLDAsMCwwfTsKKyNlbmRpZgorCisvKiBUdXJuIG9uIFdha2Utb24gbGFuIGZvciBhIGRldmljZSB1bml0ICovCitzdGF0aWMgaW50IGVuYWJsZV93b2xbTUFYX1VOSVRTXSA9IHswLDAsMCwwfTsKKworI2RlZmluZSBUWF9ERVNDX0NOVCBERUZBVUxUX1RYX1BBQ0tFVF9ERVNDX0NPVU5UCitzdGF0aWMgdW5zaWduZWQgaW50IHR4X3BrdF9kZXNjX2NudFtNQVhfVU5JVFNdID0KKwl7VFhfREVTQ19DTlQsVFhfREVTQ19DTlQsVFhfREVTQ19DTlQsIFRYX0RFU0NfQ05UfTsKKworI2RlZmluZSBSWF9ERVNDX0NOVCBERUZBVUxUX1NURF9SQ1ZfREVTQ19DT1VOVAorc3RhdGljIHVuc2lnbmVkIGludCByeF9zdGRfZGVzY19jbnRbTUFYX1VOSVRTXSA9CisJe1JYX0RFU0NfQ05ULFJYX0RFU0NfQ05ULFJYX0RFU0NfQ05ULFJYX0RFU0NfQ05UfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByeF9hZGFwdGl2ZV9jb2FsZXNjZVtNQVhfVU5JVFNdID0gezEsMSwxLDF9OworCisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorI2RlZmluZSBKQk9fREVTQ19DTlQgREVGQVVMVF9KVU1CT19SQ1ZfREVTQ19DT1VOVAorc3RhdGljIHVuc2lnbmVkIGludCByeF9qdW1ib19kZXNjX2NudFtNQVhfVU5JVFNdID0KKwl7SkJPX0RFU0NfQ05ULCBKQk9fREVTQ19DTlQsIEpCT19ERVNDX0NOVCwgSkJPX0RFU0NfQ05UfTsKKyNlbmRpZgorI2RlZmluZSBSWF9DT0FMX1RLIERFRkFVTFRfUlhfQ09BTEVTQ0lOR19USUNLUworc3RhdGljIHVuc2lnbmVkIGludCByeF9jb2FsZXNjZV90aWNrc1tNQVhfVU5JVFNdID0KKwl7UlhfQ09BTF9USywgUlhfQ09BTF9USywgUlhfQ09BTF9USywgUlhfQ09BTF9US307CisKKyNkZWZpbmUgUlhfQ09BTF9GTSBERUZBVUxUX1JYX01BWF9DT0FMRVNDRURfRlJBTUVTCitzdGF0aWMgdW5zaWduZWQgaW50IHJ4X21heF9jb2FsZXNjZV9mcmFtZXNbTUFYX1VOSVRTXSA9CisJe1JYX0NPQUxfRk0sIFJYX0NPQUxfRk0sIFJYX0NPQUxfRk0sIFJYX0NPQUxfRk19OworCisjZGVmaW5lIFRYX0NPQUxfVEsgREVGQVVMVF9UWF9DT0FMRVNDSU5HX1RJQ0tTCitzdGF0aWMgdW5zaWduZWQgaW50IHR4X2NvYWxlc2NlX3RpY2tzW01BWF9VTklUU10gPQorCXtUWF9DT0FMX1RLLCBUWF9DT0FMX1RLLCBUWF9DT0FMX1RLLCBUWF9DT0FMX1RLfTsKKworI2RlZmluZSBUWF9DT0FMX0ZNIERFRkFVTFRfVFhfTUFYX0NPQUxFU0NFRF9GUkFNRVMKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHhfbWF4X2NvYWxlc2NlX2ZyYW1lc1tNQVhfVU5JVFNdID0KKwl7VFhfQ09BTF9GTSwgVFhfQ09BTF9GTSwgVFhfQ09BTF9GTSwgVFhfQ09BTF9GTX07CisKKyNkZWZpbmUgU1RfQ09BTF9USyBERUZBVUxUX1NUQVRTX0NPQUxFU0NJTkdfVElDS1MKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhdHNfY29hbGVzY2VfdGlja3NbTUFYX1VOSVRTXSA9CisJe1NUX0NPQUxfVEssIFNUX0NPQUxfVEssIFNUX0NPQUxfVEssIFNUX0NPQUxfVEt9OworCisKKworLyoKKyAqIExlZ2l0aW1hdGUgdmFsdWVzIGZvciBCQ001NzB4IGRldmljZSB0eXBlcworICovCit0eXBlZGVmIGVudW0geworCUJDTTU3MDBWSUdJTCA9IDAsCisJQkNNNTcwMEE2LAorCUJDTTU3MDBUNiwKKwlCQ001NzAwQTksCisJQkNNNTcwMFQ5LAorCUJDTTU3MDAsCisJQkNNNTcwMUE1LAorCUJDTTU3MDFUMSwKKwlCQ001NzAxVDgsCisJQkNNNTcwMUE3LAorCUJDTTU3MDFBMTAsCisJQkNNNTcwMUExMiwKKwlCQ001NzAxLAorCUJDTTU3MDIsCisJQkNNNTcwMywKKwlCQ001NzAzQTMxLAorCVRDOTk2VCwKKwlUQzk5NlNULAorCVRDOTk2U1NYLAorCVRDOTk2U1gsCisJVEM5OTZCVCwKKwlUQzk5N1QsCisJVEM5OTdTWCwKKwlUQzEwMDBULAorCVRDOTQwQlIwMSwKKwlUQzk0MkJSMDEsCisJTkM2NzcwLAorCU5DNzc2MCwKKwlOQzc3NzAsCisJTkM3NzgwCit9IGJvYXJkX3Q7CisKKy8qIENoaXAtUmV2IG5hbWVzIGZvciBlYWNoIGRldmljZS10eXBlICovCitzdGF0aWMgc3RydWN0IHsKKyAgICBjaGFyKiBuYW1lOworfSBjaGlwX3JldltdID0geworICAgICAgIHsiQkNNNTcwMFZJR0lMIn0sCisgICAgICAgeyJCQ001NzAwQTYifSwKKyAgICAgICB7IkJDTTU3MDBUNiJ9LAorICAgICAgIHsiQkNNNTcwMEE5In0sCisgICAgICAgeyJCQ001NzAwVDkifSwKKyAgICAgICB7IkJDTTU3MDAifSwKKyAgICAgICB7IkJDTTU3MDFBNSJ9LAorICAgICAgIHsiQkNNNTcwMVQxIn0sCisgICAgICAgeyJCQ001NzAxVDgifSwKKyAgICAgICB7IkJDTTU3MDFBNyJ9LAorICAgICAgIHsiQkNNNTcwMUExMCJ9LAorICAgICAgIHsiQkNNNTcwMUExMiJ9LAorICAgICAgIHsiQkNNNTcwMSJ9LAorICAgICAgIHsiQkNNNTcwMiJ9LAorICAgICAgIHsiQkNNNTcwMyJ9LAorICAgICAgIHsiQkNNNTcwM0EzMSJ9LAorICAgICAgIHsiVEM5OTZUIn0sCisgICAgICAgeyJUQzk5NlNUIn0sCisgICAgICAgeyJUQzk5NlNTWCJ9LAorICAgICAgIHsiVEM5OTZTWCJ9LAorICAgICAgIHsiVEM5OTZCVCJ9LAorICAgICAgIHsiVEM5OTdUIn0sCisgICAgICAgeyJUQzk5N1NYIn0sCisgICAgICAgeyJUQzEwMDBUIn0sCisgICAgICAgeyJUQzk0MEJSMDEifSwKKyAgICAgICB7IlRDOTQyQlIwMSJ9LAorICAgICAgIHsiTkM2NzcwIn0sCisgICAgICAgeyJOQzc3NjAifSwKKyAgICAgICB7Ik5DNzc3MCJ9LAorICAgICAgIHsiTkM3NzgwIn0sCisgICAgICAgezB9Cit9OworCisKKy8qIGluZGV4ZWQgYnkgYm9hcmRfdCwgYWJvdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNoYXIgKm5hbWU7Cit9IGJvYXJkX2luZm9bXSA9IHsKKwl7ICJCcm9hZGNvbSBWaWdpbCBCNTcwMCAxMDAwQmFzZS1UIiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MDAgMTAwMEJhc2UtVCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlLVNYIiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MDAgMTAwMEJhc2UtU1giIH0sCisJeyAiQnJvYWRjb20gQkNNNTcwMCAxMDAwQmFzZS1UIiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MDAiIH0sCisJeyAiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MDEgMTAwMEJhc2UtVCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1TWCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MDEiIH0sCisJeyAiQnJvYWRjb20gQkNNNTcwMiAxMDAwQmFzZS1UIiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MDMgMTAwMEJhc2UtVCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzAzIDEwMDBCYXNlLVNYIiB9LAorCXsgIjNDb20gM0M5OTYgMTAvMTAwLzEwMDAgU2VydmVyIE5JQyIgfSwKKwl7ICIzQ29tIDNDOTk2IDEwLzEwMC8xMDAwIFNlcnZlciBOSUMiIH0sCisJeyAiM0NvbSAzQzk5NiBHaWdhYml0IEZpYmVyLVNYIFNlcnZlciBOSUMiIH0sCisJeyAiM0NvbSAzQzk5NiBHaWdhYml0IEZpYmVyLVNYIFNlcnZlciBOSUMiIH0sCisJeyAiM0NvbSAzQzk5NkIgR2lnYWJpdCBTZXJ2ZXIgTklDIiB9LAorCXsgIjNDb20gM0M5OTcgR2lnYWJpdCBTZXJ2ZXIgTklDIiB9LAorCXsgIjNDb20gM0M5OTcgR2lnYWJpdCBGaWJlci1TWCBTZXJ2ZXIgTklDIiB9LAorCXsgIjNDb20gM0MxMDAwIEdpZ2FiaXQgTklDIiB9LAorCXsgIjNDb20gM0M5NDAgR2lnYWJpdCBMT00gKDIxWDIxKSIgfSwKKwl7ICIzQ29tIDNDOTQyIEdpZ2FiaXQgTE9NICgzMVgzMSkiIH0sCisJeyAiQ29tcGFxIE5DNjc3MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIiB9LAorCXsgIkNvbXBhcSBOQzc3NjAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciIgfSwKKwl7ICJDb21wYXEgTkM3NzcwIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIiIH0sCisJeyAiQ29tcGFxIE5DNzc4MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIiB9LAorCXsgMCB9LAorfTsKKworLyogUENJIERldmljZXMgd2hpY2ggdXNlIHRoZSA1NzB4IGNoaXBzZXQgKi8KK3N0cnVjdCBwY2lfZGV2aWNlX3RhYmxlIHsKKyAgICB1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQsIGRldmljZV9pZDsgLyogVmVuZG9yL0RldmljZUlEICovCisgICAgdW5zaWduZWQgc2hvcnQgc3VidmVuZG9yLCBzdWJkZXZpY2U7IC8qIFN1YnN5c3RlbSBJRCdzIG9yIFBDSV9BTllfSUQgKi8KKyAgICB1bnNpZ25lZCBpbnQgY2xhc3MsIGNsYXNzX21hc2s7IC8qIChjbGFzcyxzdWJjbGFzcyxwcm9nLWlmKSB0cmlwbGV0ICovCisgICAgdW5zaWduZWQgbG9uZyBib2FyZF9pZDsJICAgIC8qIERhdGEgcHJpdmF0ZSB0byB0aGUgZHJpdmVyICovCisgICAgaW50IGlvX3NpemUsIG1pbl9sYXRlbmN5OworfSBiY201NzB4RGV2aWNlc1tdID0geworCXsweDE0ZTQsIDB4MTY0NCwgMHgxMDE0LCAweDAyNzcsIDAsIDAsIEJDTTU3MDBWSUdJTCAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDQsIDB4MTRlNCwgMHgxNjQ0LCAwLCAwLCBCQ001NzAwQTYgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ0LCAweDE0ZTQsIDB4MiwgMCwgMCwgQkNNNTcwMFQ2ICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NCwgMHgxNGU0LCAweDMsIDAsIDAsIEJDTTU3MDBBOSAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDQsIDB4MTRlNCwgMHg0LCAwLCAwLCBCQ001NzAwVDkgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ0LCAweDEwMjgsIDB4ZDEsIDAsIDAsIEJDTTU3MDAgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ0LCAweDEwMjgsIDB4MDEwNiwgMCwgMCwgQkNNNTcwMCAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDQsIDB4MTAyOCwgMHgwMTA5LCAwLCAwLCBCQ001NzAwICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NCwgMHgxMDI4LCAweDAxMGEsIDAsIDAsIEJDTTU3MDAgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwMCwgMCwgMCwgVEM5OTZUICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NCwgMHgxMGI3LCAweDEwMDEsIDAsIDAsIFRDOTk2U1QgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwMiwgMCwgMCwgVEM5OTZTU1ggLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwMywgMCwgMCwgVEM5OTdUICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NCwgMHgxMGI3LCAweDEwMDUsIDAsIDAsIFRDOTk3U1ggLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwOCwgMCwgMCwgVEM5NDJCUjAxICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQkNNNTcwMCAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDUsIDB4MTRlNCwgMSwgMCwgMCwgQkNNNTcwMUE1ICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCA1LCAwLCAwLCBCQ001NzAxVDEgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ1LCAweDE0ZTQsIDYsIDAsIDAsIEJDTTU3MDFUOCAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDUsIDB4MTRlNCwgNywgMCwgMCwgQkNNNTcwMUE3ICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCA4LCAwLCAwLCBCQ001NzAxQTEwICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCAweDgwMDgsIDAsIDAsIEJDTTU3MDFBMTIgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ1LCAweDBlMTEsIDB4YzEsIDAsIDAsIE5DNjc3MCAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDUsIDB4MGUxMSwgMHg3YywgMCwgMCwgTkM3NzcwICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NSwgMHgwZTExLCAweDg1LCAwLCAwLCBOQzc3ODAgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ1LCAweDEwMjgsIDB4MDEyMSwgMCwgMCwgQkNNNTcwMSAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDUsIDB4MTBiNywgMHgxMDA0LCAwLCAwLCBUQzk5NlNYICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NSwgMHgxMGI3LCAweDEwMDYsIDAsIDAsIFRDOTk2QlQgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ1LCAweDEwYjcsIDB4MTAwNywgMCwgMCwgVEMxMDAwVCAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDUsIDB4MTBiNywgMHgxMDA4LCAwLCAwLCBUQzk0MEJSMDEgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAxICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NiwgMHgxNGU0LCAweDgwMDksIDAsIDAsIEJDTTU3MDIgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ2LCAweDBlMTEsIDB4YmIsIDAsIDAsIE5DNzc2MCAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDIgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNmE2LCAweDE0ZTQsIDB4ODAwOSwgMCwgMCwgQkNNNTcwMiAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2YTYsIDB4MGUxMSwgMHhiYiwgMCwgMCwgTkM3NzYwICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTZhNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQkNNNTcwMiAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDcsIDB4MTRlNCwgMHgwMDA5LCAwLCAwLCBCQ001NzAzICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NywgMHgxNGU0LCAweDAwMGEsIDAsIDAsIEJDTTU3MDNBMzEgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ3LCAweDE0ZTQsIDB4MDAwYiwgMCwgMCwgQkNNNTcwMyAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDcsIDB4MTRlNCwgMHg4MDBhLCAwLCAwLCBCQ001NzAzICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTY0NywgMHgwZTExLCAweDlhLCAwLCAwLCBOQzc3NzAgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNjQ3LCAweDBlMTEsIDB4OTksIDAsIDAsIE5DNzc4MCAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2NDcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDMgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNmE3LCAweDE0ZTQsIDB4MDAwOSwgMCwgMCwgQkNNNTcwMyAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2YTcsIDB4MTRlNCwgMHgwMDBhLCAwLCAwLCBCQ001NzAzQTMxICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTZhNywgMHgxNGU0LCAweDAwMGIsIDAsIDAsIEJDTTU3MDMgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNmE3LCAweDE0ZTQsIDB4ODAwYSwgMCwgMCwgQkNNNTcwMyAsMTI4LDMyfSwKKwl7MHgxNGU0LCAweDE2YTcsIDB4MGUxMSwgMHg5YSwgMCwgMCwgTkM3NzcwICwxMjgsMzJ9LAorCXsweDE0ZTQsIDB4MTZhNywgMHgwZTExLCAweDk5LCAwLCAwLCBOQzc3ODAgLDEyOCwzMn0sCisJezB4MTRlNCwgMHgxNmE3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAzICwxMjgsMzJ9Cit9OworCisjZGVmaW5lIG41NzB4RGV2aWNlcyAgIChzaXplb2YoYmNtNTcweERldmljZXMpL3NpemVvZihiY201NzB4RGV2aWNlc1swXSkpCisKKworCisvKgorICogQWxsb2NhdGUgYSBwYWNrZXQgYnVmZmVyIGZyb20gdGhlIGJjbTU3MHggcGFja2V0IHBvb2wuCisgKi8KK3ZvaWQgKgorYmNtNTcweFBrdEFsbG9jKGludCB1LCBpbnQgcGtzaXplKQoreworICAgIHJldHVybiBtYWxsb2MocGtzaXplKTsKK30KKworLyoKKyAqIEZyZWUgYSBwYWNrZXQgcHJldmlvdXNseSBhbGxvY2F0ZWQgZnJvbSB0aGUgYmNtNTcweCBwYWNrZXQKKyAqIGJ1ZmZlciBwb29sLgorICovCit2b2lkCitiY201NzB4UGt0RnJlZShpbnQgdSwgdm9pZCAqcCkKK3sKKyAgICBmcmVlKHApOworfQorCitpbnQKK2JjbTU3MHhSZXBsZW5pc2hSeEJ1ZmZlcnMoUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UpCit7CisgICAgUExNX1BBQ0tFVCBwUGFja2V0OworICAgIFBVTV9QQUNLRVQgcFVtUGFja2V0OworICAgIHZvaWQgKnNrYjsKKyAgICBpbnQgcXVldWVfcnggPSAwOworICAgIGludCByZXQgPSAwOworCisgICAgd2hpbGUgKChwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkKKwkgICAgUVFfUG9wSGVhZCgmcFVtRGV2aWNlLT5yeF9vdXRfb2ZfYnVmX3EuQ29udGFpbmVyKSkgIT0gMCkgeworCisJcFBhY2tldCA9IChQTE1fUEFDS0VUKSBwVW1QYWNrZXQ7CisKKwkvKiByZXVzZSBhbiBvbGQgc2tiICovCisJaWYgKHBVbVBhY2tldC0+c2tidWZmKSB7CisJICAgIFFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJICAgIHF1ZXVlX3J4ID0gMTsKKwkgICAgY29udGludWU7CisJfQorCWlmICggKCBza2IgPSBiY201NzB4UGt0QWxsb2MocFVtRGV2aWNlLT5pbmRleCwKKwkJCQkgICAgIHBQYWNrZXQtPnUuUnguUnhCdWZmZXJTaXplICsgMikpID09IDApIHsKKwkgICAgUVFfUHVzaEhlYWQoJnBVbURldmljZS0+cnhfb3V0X29mX2J1Zl9xLkNvbnRhaW5lcixwUGFja2V0KTsKKwkgICAgcHJpbnRmKCJOT1RJQ0U6IE91dCBvZiBSWCBtZW1vcnkuXG4iKTsKKwkgICAgcmV0ID0gMTsKKwkgICAgYnJlYWs7CisJfQorCisJcFVtUGFja2V0LT5za2J1ZmYgPSBza2I7CisJUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKwlxdWV1ZV9yeCA9IDE7CisgICAgfQorCisgICAgaWYgKHF1ZXVlX3J4KSB7CisJTE1fUXVldWVSeFBhY2tldHMocERldmljZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFByb2JlLCBNYXAsIGFuZCBJbml0IDU3MHggZGV2aWNlLgorICovCitpbnQgZXRoX2luaXQoYmRfdCAqYmlzKQoreworICAgIGludCBpLCBydiwgZGV2Rm91bmQgPSBGQUxTRTsKKyAgICBwY2lfZGV2X3QgIGRldmJ1c2ZuOworICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKworICAgIC8qIEZpbmQgUENJIGRldmljZSwgaWYgaXQgZXhpc3RzLCBjb25maWd1cmUgLi4uICAqLworICAgIGZvciggaSA9IDA7IGkgPCBuNTcweERldmljZXM7IGkrKyl7CisJZGV2YnVzZm4gPSBwY2lfZmluZF9kZXZpY2UoYmNtNTcweERldmljZXNbaV0udmVuZG9yX2lkLAorCQkJCSAgIGJjbTU3MHhEZXZpY2VzW2ldLmRldmljZV9pZCwgMCk7CisJaWYoZGV2YnVzZm4gPT0gLTEpIHsKKwkgICAgY29udGludWU7IC8qIE5vIGRldmljZSBvZiB0aGF0IHZlbmRvci9kZXZpY2UgSUQgKi8KKwl9IGVsc2UgeworCisJICAgIC8qIFNldCBJTElORSAqLworCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2YnVzZm4sCisJCQkJICBQQ0lfSU5URVJSVVBUX0xJTkUsIEJDTTU3MFhfSUxJTkUpOworCisJICAgIC8qCisJICAgICAqIDB4MTAgLSAweDE0IGRlZmluZSBvbmUgNjQtYml0IE1CQVIuCisJICAgICAqIDB4MTQgaXMgdGhlIGhpZ2hlci1vcmRlciBhZGRyZXNzIGJpdHMgb2YgdGhlIEJBUi4KKwkgICAgICovCisJICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2YnVzZm4sCisJCQkJICAgUENJX0JBU0VfQUREUkVTU18xLCAwKTsKKworCSAgICBpb0Jhc2UgPSBCQ001NzBYX01CQVI7CisKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXZidXNmbiwKKwkJCQkgICBQQ0lfQkFTRV9BRERSRVNTXzAsIGlvQmFzZSk7CisKKwkgICAgLyoKKwkgICAgICogRW5hYmxlIFBDSSBtZW1vcnksIElPLCBhbmQgTWFzdGVyIC0tIGRvbid0CisJICAgICAqIHJlc2V0IGFueSBzdGF0dXMgYml0cyBpbiBkb2luZyBzby4KKwkgICAgICovCisJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldmJ1c2ZuLAorCQkJCSBQQ0lfQ09NTUFORCwgJnN0YXR1cyk7CisKKwkgICAgc3RhdHVzIHw9IFBDSV9DT01NQU5EX01FTU9SWXxQQ0lfQ09NTUFORF9NQVNURVI7CisKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldmJ1c2ZuLAorCQkJCSAgUENJX0NPTU1BTkQsIHN0YXR1cyk7CisKKwkgICAgcHJpbnRmKCJcbiVzOiBidXMgJWQsIGRldmljZSAlZCwgZnVuY3Rpb24gJWQ6IE1CQVI9MHgleFxuIiwKKwkJICAgYm9hcmRfaW5mb1tiY201NzB4RGV2aWNlc1tpXS5ib2FyZF9pZF0ubmFtZSwKKwkJICAgUENJX0JVUyhkZXZidXNmbiksCisJCSAgIFBDSV9ERVYoZGV2YnVzZm4pLAorCQkgICBQQ0lfRlVOQyhkZXZidXNmbiksCisJCSAgIGlvQmFzZSk7CisKKwkgICAgLyogQWxsb2NhdGUgb25jZSwgYnV0IGFsd2F5cyBjbGVhciBvbiBpbml0ICovCisJICAgIGlmICghcERldmljZSkgeworCQlwRGV2aWNlID0gbWFsbG9jKHNpemVvZihVTV9ERVZJQ0VfQkxPQ0spKTsKKwkJcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spcERldmljZTsKKwkJbWVtc2V0KHBEZXZpY2UsIDB4MCwgc2l6ZW9mKFVNX0RFVklDRV9CTE9DSykpOworCSAgICB9CisKKwkgICAgLyogQ29uZmlndXJlIHBjaSBkZXYgc3RydWN0dXJlICovCisJICAgIHBVbURldmljZS0+cGRldiA9IGRldmJ1c2ZuOworCSAgICBwVW1EZXZpY2UtPmluZGV4ID0gMDsKKwkgICAgcFVtRGV2aWNlLT50eF9wa3QgPSAwOworCSAgICBwVW1EZXZpY2UtPnJ4X3BrdCA9IDA7CisJICAgIGRldkZvdW5kID0gVFJVRTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGlmKCFkZXZGb3VuZCl7CisJcHJpbnRmKCJldGhfaW5pdDogRkFJTFVSRTogbm8gQkNNNTcweCBFdGhlcm5ldCBkZXZpY2VzIGZvdW5kLlxuIik7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFNldHVwIGRlZmF1bHRzIGZvciBjaGlwICovCisgICAgcERldmljZS0+VGFza1RvT2ZmbG9hZCA9IExNX1RBU0tfT0ZGTE9BRF9OT05FOworCisgICAgaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDBfQjApIHsKKwlwRGV2aWNlLT5UYXNrVG9PZmZsb2FkID0gTE1fVEFTS19PRkZMT0FEX05PTkU7CisgICAgfSBlbHNlIHsKKworCWlmIChyeF9jaGVja3N1bVtpXSkgeworCSAgICBwRGV2aWNlLT5UYXNrVG9PZmZsb2FkIHw9CisJCUxNX1RBU0tfT0ZGTE9BRF9SWF9UQ1BfQ0hFQ0tTVU0gfAorCQlMTV9UQVNLX09GRkxPQURfUlhfVURQX0NIRUNLU1VNOworCX0KKworCWlmICh0eF9jaGVja3N1bVtpXSkgeworCSAgICBwRGV2aWNlLT5UYXNrVG9PZmZsb2FkIHw9CisJCUxNX1RBU0tfT0ZGTE9BRF9UWF9UQ1BfQ0hFQ0tTVU0gfAorCQlMTV9UQVNLX09GRkxPQURfVFhfVURQX0NIRUNLU1VNOworCSAgICBwRGV2aWNlLT5Ob1R4UHNldWRvSGRyQ2hrc3VtID0gVFJVRTsKKwl9CisgICAgfQorCisgICAgLyogU2V0IERldmljZSBQQ0kgTWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgIHBEZXZpY2UtPnBNYXBwZWRNZW1CYXNlID0gKFBMTV9VSU5UOCkgaW9CYXNlOworCisgICAgLyogUHVsbCBkb3duIGFkYXB0ZXIgaW5mbyAqLworICAgIGlmICgocnYgPSBMTV9HZXRBZGFwdGVySW5mbyhwRGV2aWNlKSkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwlwcmludGYoImJjbTU3MHhFbmQ6IExNX0dldEFkYXB0ZXJJbmZvIGZhaWxlZDogcnY9JWQhXG4iLCBydiApOworCXJldHVybiAtMjsKKyAgICB9CisKKyAgICAvKiBMb2NrIG5vdCBuZWVkZWQgKi8KKyAgICBwVW1EZXZpY2UtPmRvX2dsb2JhbF9sb2NrID0gMDsKKworICAgIGlmIChUM19BU0lDX1JFVihwVW1EZXZpY2UtPmxtX2Rldi5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApIHsKKwkvKiBUaGUgNTcwMCBjaGlwIHdvcmtzIGJlc3Qgd2l0aG91dCBpbnRlcmxlYXZlZCByZWdpc3RlciAqLworCS8qIGFjY2Vzc2VzIG9uIGNlcnRhaW4gbWFjaGluZXMuICovCisJcFVtRGV2aWNlLT5kb19nbG9iYWxfbG9jayA9IDE7CisgICAgfQorCisgICAgLyogU2V0dXAgdGltZXIgZGVsYXlzICovCisgICAgaWYgKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCXBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cyA9IFRSVUU7CisJcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWjsKKyAgICB9CisgICAgZWxzZSB7CisJcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWiAvIDUwOworICAgIH0KKworICAgIC8qIEdyYWIgbmFtZSAuLi4uICovCisgICAgcFVtRGV2aWNlLT5uYW1lID0KKwkoY2hhciopbWFsbG9jKHN0cmxlbihib2FyZF9pbmZvW2JjbTU3MHhEZXZpY2VzW2ldLmJvYXJkX2lkXS5uYW1lKSsxKTsKKyAgICBzdHJjcHkocFVtRGV2aWNlLT5uYW1lLGJvYXJkX2luZm9bYmNtNTcweERldmljZXNbaV0uYm9hcmRfaWRdLm5hbWUpOworCisgICAgbWVtY3B5KHBEZXZpY2UtPk5vZGVBZGRyZXNzLCBiaXMtPmJpX2VuZXRhZGRyLCA2KTsKKyAgICBMTV9TZXRNYWNBZGRyZXNzKHBEZXZpY2UsIGJpcy0+YmlfZW5ldGFkZHIpOworICAgIC8qIEluaXQgcXVldWVzICAuLiAqLworICAgIFFRX0luaXRRdWV1ZSgmcFVtRGV2aWNlLT5yeF9vdXRfb2ZfYnVmX3EuQ29udGFpbmVyLAorCQkgTUFYX1JYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKKyAgICBwVW1EZXZpY2UtPnJ4X2xhc3RfY250ID0gcFVtRGV2aWNlLT50eF9sYXN0X2NudCA9IDA7CisKKyAgICAvKiBkZWxheSBmb3IgNCBzZWNvbmRzICovCisgICAgcFVtRGV2aWNlLT5kZWxheWVkX2xpbmtfaW5kID0KKwkoNCAqIENGR19IWikgLyBwVW1EZXZpY2UtPnRpbWVyX2ludGVydmFsOworCisgICAgcFVtRGV2aWNlLT5hZGFwdGl2ZV9leHBpcnkgPQorCUNGR19IWiAvIHBVbURldmljZS0+dGltZXJfaW50ZXJ2YWw7CisKKyAgICAvKiBTb21ldGltZXMgd2UgZ2V0IHNwdXJpb3VzIGludHMuIGFmdGVyIHJlc2V0IHdoZW4gbGluayBpcyBkb3duLiAqLworICAgIC8qIFRoaXMgZmllbGQgdGVsbHMgdGhlIGlzciB0byBzZXJ2aWNlIHRoZSBpbnQuIGV2ZW4gaWYgdGhlcmUgaXMgKi8KKyAgICAvKiBubyBzdGF0dXMgYmxvY2sgdXBkYXRlLiAqLworICAgIHBVbURldmljZS0+YWRhcHRlcl9qdXN0X2luaXRlZCA9CisJKDMgKiBDRkdfSFopIC8gcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbDsKKworICAgIC8qIEluaXRpYWxpemUgNTcweCAqLworICAgIGlmIChMTV9Jbml0aWFsaXplQWRhcHRlcihwRGV2aWNlKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCXByaW50ZigiRVJST1I6IEFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJcmV0dXJuIEVSUk9SOworICAgIH0KKworICAgIC8qIEVuYWJsZSBjaGlwIElTUiAqLworICAgIExNX0VuYWJsZUludGVycnVwdChwRGV2aWNlKTsKKworICAgIC8qIENsZWFyIE1DIHRhYmxlICovCisgICAgTE1fTXVsdGljYXN0Q2xlYXIocERldmljZSk7CisKKyAgICAvKiBFbmFibGUgTXVsdGljYXN0ICovCisgICAgTE1fU2V0UmVjZWl2ZU1hc2socERldmljZSwKKwkJICAgICAgcERldmljZS0+UmVjZWl2ZU1hc2sgfCBMTV9BQ0NFUFRfQUxMX01VTFRJQ0FTVCk7CisKKyAgICBwVW1EZXZpY2UtPm9wZW5lZCA9IDE7CisgICAgcFVtRGV2aWNlLT50eF9mdWxsID0gMDsKKyAgICBwVW1EZXZpY2UtPnR4X3BrdCA9IDA7CisgICAgcFVtRGV2aWNlLT5yeF9wa3QgPSAwOworICAgIHByaW50ZigiZXRoJWQ6ICVzIEAweCVseCwiLAorCSAgIHBEZXZpY2UtPmluZGV4LCBwVW1EZXZpY2UtPm5hbWUsICh1bnNpZ25lZCBsb25nKWlvQmFzZSk7CisgICAgcHJpbnRmKAkibm9kZSBhZGRyICIpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwlwcmludGYoIiUyLjJ4IiwgcERldmljZS0+Tm9kZUFkZHJlc3NbaV0pOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisKKyAgICBwcmludGYoImV0aCVkOiAiLCBwRGV2aWNlLT5pbmRleCk7CisgICAgcHJpbnRmKCIlcyB3aXRoICIsCisJICAgY2hpcF9yZXZbYmNtNTcweERldmljZXNbaV0uYm9hcmRfaWRdLm5hbWUpOworCisgICAgaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTQwMF9QSFlfSUQpCisJcHJpbnRmKCJCcm9hZGNvbSBCQ001NDAwIENvcHBlciAiKTsKKyAgICBlbHNlIGlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTU0MDFfUEhZX0lEKQorCXByaW50ZigiQnJvYWRjb20gQkNNNTQwMSBDb3BwZXIgIik7CisgICAgZWxzZSBpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NDExX1BIWV9JRCkKKwlwcmludGYoIkJyb2FkY29tIEJDTTU0MTEgQ29wcGVyICIpOworICAgIGVsc2UgaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTcwMV9QSFlfSUQpCisJcHJpbnRmKCJCcm9hZGNvbSBCQ001NzAxIEludGVncmF0ZWQgQ29wcGVyICIpOworICAgIGVsc2UgaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTcwM19QSFlfSUQpCisgICAgICAgIHByaW50ZigiQnJvYWRjb20gQkNNNTcwMyBJbnRlZ3JhdGVkIENvcHBlciAiKTsKKyAgICBlbHNlIGlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTgwMDJfUEhZX0lEKQorCXByaW50ZigiQnJvYWRjb20gQkNNODAwMiBTZXJEZXMgIik7CisgICAgZWxzZSBpZiAocERldmljZS0+RW5hYmxlVGJpKQorCXByaW50ZigiQWdpbGVudCBIRE1QLTE2MzYgU2VyRGVzICIpOworICAgIGVsc2UKKwlwcmludGYoIlVua25vd24gIik7CisgICAgcHJpbnRmKCJ0cmFuc2NlaXZlciBmb3VuZFxuIik7CisKKyAgICBwcmludGYoImV0aCVkOiAlcywgTVRVOiAlZCwiLAorCSAgIHBEZXZpY2UtPmluZGV4LCBwRGV2aWNlLT5CdXNTcGVlZFN0ciwgMTUwMCk7CisKKyAgICBpZiAoKHBEZXZpY2UtPkNoaXBSZXZJZCAhPSBUM19DSElQX0lEXzU3MDBfQjApICYmCisJcnhfY2hlY2tzdW1baV0pCisJcHJpbnRmKCJSeCBDaGVja3N1bSBPTlxuIik7CisgICAgZWxzZQorCXByaW50ZigiUnggQ2hlY2tzdW0gT0ZGXG4iKTsKKyAgICBpbml0aWFsaXplZCsrOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEV0aGVybmV0IEludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KK3ZvaWQKK2V0aF9pc3Iodm9pZCkKK3sKKyAgICBMTV9VSU5UMzIgb2xkdGFnLCBuZXd0YWc7CisgICAgaW50IGk7CisKKyAgICBwVW1EZXZpY2UtPmludGVycnVwdCA9IDE7CisKKyAgICBpZiAocERldmljZS0+VXNlVGFnZ2VkU3RhdHVzKSB7CisJaWYgKChwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICYgU1RBVFVTX0JMT0NLX1VQREFURUQpIHx8CisJICAgIHBVbURldmljZS0+YWRhcHRlcl9qdXN0X2luaXRlZCkgeworICAgICAgICAgICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guSW50ZXJydXB0WzBdLkxvdywgMSk7CisgICAgICAgICAgICBvbGR0YWcgPSBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzVGFnOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyA7IGkrKykgeworICAgICAgICAgICAgICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJj0gflNUQVRVU19CTE9DS19VUERBVEVEOworICAgICAgICAgICAgICAgIExNX1NlcnZpY2VJbnRlcnJ1cHRzKHBEZXZpY2UpOworICAgICAgICAgICAgICAgIG5ld3RhZyA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXNUYWc7CisgICAgICAgICAgICAgICAgaWYgKChuZXd0YWcgPT0gb2xkdGFnKSB8fCAoaSA+IDUwKSkgeworICAgICAgICAgICAgICAgICAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5JbnRlcnJ1cHRbMF0uTG93LCBuZXd0YWcgPDwgMjQpOworICAgICAgICAgICAgICAgICAgICBpZiAocERldmljZS0+VW5kaUZpeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsCisJCQkgICAgICAgcERldmljZS0+R3JjTG9jYWxDdHJsIHwgMHgyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCQlvbGR0YWcgPSBuZXd0YWc7CisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UgeworCXdoaWxlIChwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICYgU1RBVFVTX0JMT0NLX1VQREFURUQpIHsKKwkgICAgdW5zaWduZWQgaW50IGR1bW15OworCisJICAgIHBEZXZpY2UtPnBNZW1WaWV3LT5NYWlsYm94LkludGVycnVwdFswXS5Mb3cgPSAxOworCSAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICY9IH5TVEFUVVNfQkxPQ0tfVVBEQVRFRDsKKwkgICAgTE1fU2VydmljZUludGVycnVwdHMocERldmljZSk7CisJICAgIHBEZXZpY2UtPnBNZW1WaWV3LT5NYWlsYm94LkludGVycnVwdFswXS5Mb3cgPSAwOworCSAgICBkdW1teSA9IHBEZXZpY2UtPnBNZW1WaWV3LT5NYWlsYm94LkludGVycnVwdFswXS5Mb3c7CisJfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRlIG5ldyBSWCBidWZmZXJzICovCisgICAgaWYgKFFRX0dldEVudHJ5Q250KCZwVW1EZXZpY2UtPnJ4X291dF9vZl9idWZfcS5Db250YWluZXIpKSB7CisJYmNtNTcweFJlcGxlbmlzaFJ4QnVmZmVycyhwVW1EZXZpY2UpOworICAgIH0KKworICAgIC8qIFF1ZXVlIHBhY2tldHMgKi8KKyAgICBpZiAoUVFfR2V0RW50cnlDbnQoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKSkgeworCUxNX1F1ZXVlUnhQYWNrZXRzKHBEZXZpY2UpOworICAgIH0KKworICAgIGlmIChwVW1EZXZpY2UtPnR4X3F1ZXVlZCkgeworCXBVbURldmljZS0+dHhfcXVldWVkID0gMDsKKyAgICB9CisKKyAgICBpZihwVW1EZXZpY2UtPnR4X2Z1bGwpeworCWlmKHBEZXZpY2UtPkxpbmtTdGF0dXMgIT0gTE1fU1RBVFVTX0xJTktfRE9XTil7CisJICAgIHByaW50ZigiTk9USUNFOiB0eCB3YXMgcHJldmlvdXNseSBibG9ja2VkLCByZXN0YXJ0aW5nIE1VWFxuIik7CisJICAgIHBVbURldmljZS0+dHhfZnVsbCA9IDA7CisJfQorICAgIH0KKworICAgIHBVbURldmljZS0+aW50ZXJydXB0ID0gMDsKKworfQorCitpbnQKK2V0aF9zZW5kKHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKyNpZiBFVF9ERUJVRworICAgIHVuc2lnbmVkIGNoYXIqIHB0ciA9ICh1bnNpZ25lZCBjaGFyKilwYWNrZXQ7CisjZW5kaWYKKyAgICBQTE1fUEFDS0VUIHBQYWNrZXQ7CisgICAgUFVNX1BBQ0tFVCBwVW1QYWNrZXQ7CisKKyAgICAvKiBMaW5rIGRvd24sIHJldHVybiAqLworICAgIHdoaWxlKHBEZXZpY2UtPkxpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfRE9XTikgeworI2lmIDAKKyAgICAgICAgcHJpbnRmKCJldGglZDogbGluayBkb3duIC0gY2hlY2sgY2FibGUgb3IgbGluayBwYXJ0bmVyLlxuIiwKKyAgICAgICAgICAgICAgIHBVbURldmljZS0+aW5kZXgpOworI2VuZGlmCisJZXRoX2lzcigpOworCisJLyogV2FpdCB0byBzZWUgbGluayBmb3Igb25lLWhhbGYgYSBzZWNvbmQgYmVmb3JlIHNlbmRpbmcgLi4uICovCisJdWRlbGF5KDE1MDAwMDApOworCisgICAgfQorCisgICAgLyogQ2xlYXIgc2VudCBmbGFnICovCisgICAgcFVtRGV2aWNlLT50eF9wa3QgPSAwOworCisgICAgLyogUHJldmlvdXNseSBibG9ja2VkICovCisgICAgaWYocFVtRGV2aWNlLT50eF9mdWxsKXsKKwlwcmludGYoImV0aCVkOiB0eCBibG9ja2VkLlxuIiwgcFVtRGV2aWNlLT5pbmRleCk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgcFBhY2tldCA9IChQTE1fUEFDS0VUKQorCVFRX1BvcEhlYWQoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKKworICAgIGlmIChwUGFja2V0ID09IDApIHsKKwlwVW1EZXZpY2UtPnR4X2Z1bGwgPSAxOworCXByaW50ZigiYmNtNTcweEVuZFNlbmQ6IFRYIGZ1bGwhXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAocERldmljZS0+U2VuZEJkTGVmdC5jb3VudGVyID09IDApIHsKKwlwVW1EZXZpY2UtPnR4X2Z1bGwgPSAxOworCXByaW50ZigiYmNtNTcweEVuZFNlbmQ6IG5vIG1vcmUgVFggZGVzY3JpcHRvcnMhXG4iKTsKKwlRUV9QdXNoSGVhZCgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmIChsZW5ndGggPD0gMCl7CisJcHJpbnRmKCJldGg6IGJhZCBwYWNrZXQgc2l6ZTogJWRcbiIsIGxlbmd0aCk7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgLyogR2V0IHBhY2tldCBidWZmZXJzIGFuZCBmcmFnbWVudCBsaXN0ICovCisgICAgcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CisgICAgLyogU2luZ2xlIERNQSBEZXNjcmlwdG9yIHRyYW5zbWl0LgorICAgICAqIEZyYWdtZW50cyBtYXkgYmUgcHJvdmlkZWQsIGJ1dCBvbmUgRE1BIGRlc2NyaXB0b3IgbWF4IGlzCisgICAgICogdXNlZCB0byBzZW5kIHRoZSBwYWNrZXQuCisgICAgICovCisgICAgaWYgKE1NX0NvYWxlc2NlVHhCdWZmZXIgKHBEZXZpY2UsIHBQYWNrZXQpICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGlmIChwVW1QYWNrZXQtPnNrYnVmZiA9PSBOVUxMKXsKKwkgICAgLyogUGFja2V0IHdhcyBkaXNjYXJkZWQgKi8KKwkgICAgcHJpbnRmKCJUWDogZmFpbGVkICgxKVxuIik7CisJICAgIHN0YXR1cyA9IDE7CisJfSBlbHNleworCSAgICBwcmludGYoIlRYOiBmYWlsZWQgKDIpXG4iKTsKKwkgICAgc3RhdHVzID0gMjsKKwl9CisgICAgICAgIFFRX1B1c2hIZWFkICgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIENvcHkgcGFja2V0IHRvIERNQSBidWZmZXIgKi8KKyAgICBtZW1zZXQocFVtUGFja2V0LT5za2J1ZmYsIDB4MCwgTUFYX1BBQ0tFVF9TSVpFKTsKKyAgICBtZW1jcHkoKHZvaWQqKXBVbVBhY2tldC0+c2tidWZmLCAodm9pZCopcGFja2V0LCBsZW5ndGgpOworICAgIHBQYWNrZXQtPlBhY2tldFNpemUgPSBsZW5ndGg7CisgICAgcFBhY2tldC0+RmxhZ3MgfD0gU05EX0JEX0ZMQUdfRU5EfFNORF9CRF9GTEFHX0NPQUxfTk9XOworICAgIHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50ID0gMTsKKyAgICAvKiBXZSd2ZSBhbHJlYWR5IHByb3ZpZGVkIGEgZnJhbWUgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbiAqLworICAgIHBQYWNrZXQtPkZsYWdzICY9IH5TTkRfQkRfRkxBR19UQ1BfVURQX0NLU1VNOworCisgICAgaWYgKCBMTV9TZW5kUGFja2V0KHBEZXZpY2UsIHBQYWNrZXQpID09IExNX1NUQVRVU19GQUlMVVJFKXsKKyAgICAgICAgLyoKKyAgICAgICAgICogIEEgbG93ZXIgbGV2ZWwgc2VuZCBmYWlsdXJlIHdpbGwgcHVzaCB0aGUgcGFja2V0IGRlc2NyaXB0b3IgYmFjaworICAgICAgICAgKiAgaW4gdGhlIGZyZWUgcXVldWUsIHNvIGp1c3QgZGVhbCB3aXRoIHRoZSBWeFdvcmtzIGNsdXN0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBVbVBhY2tldC0+c2tidWZmID09IE5VTEwpeworCSAgICBwcmludGYoIlRYIGZhaWxlZCAoMSkhXG4iKTsKKwkgICAgLyogUGFja2V0IHdhcyBkaXNjYXJkZWQgKi8KKwkgICAgc3RhdHVzID0gMzsKKwl9IGVsc2UgeworCSAgICAvKiBBIHJlc291cmNlIHByb2JsZW0gLi4uICovCisJICAgIHByaW50ZigiVFggZmFpbGVkICgyKSFcbiIpOworCSAgICBzdGF0dXMgPSA0OworCX0KKworCWlmIChRUV9HZXRFbnRyeUNudCgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIpID09IDApIHsKKwkgICAgcHJpbnRmKCJUWDogZW1wdHlRIVxuIik7CisJICAgIHBVbURldmljZS0+dHhfZnVsbCA9IDE7CisJfQorICAgIH0KKworICAgIHdoaWxlKHBVbURldmljZS0+dHhfcGt0ID09IDApeworCS8qIFNlcnZpY2UgVFggKi8KKwlldGhfaXNyKCk7CisgICAgfQorI2lmIEVUX0RFQlVHCisgICAgcHJpbnRmKCJldGhfc2VuZDogMHgleCwgJWQgYnl0ZXNcbiIKKwkgICAiWyV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XSAuLi5cbiIsCisJICAgKGludClwUGFja2V0LCBsZW5ndGgsCisJICAgcHRyWzBdLHB0clsxXSxwdHJbMl0scHRyWzNdLHB0cls0XSxwdHJbNV0sCisJICAgcHRyWzZdLHB0cls3XSxwdHJbOF0scHRyWzldLHB0clsxMF0scHRyWzExXSxwdHJbMTJdLAorCSAgIHB0clsxM10scHRyWzE0XSxwdHJbMTVdKTsKKyNlbmRpZgorICAgIHBVbURldmljZS0+dHhfcGt0ID0gMDsKKyAgICBRUV9QdXNoSGVhZCgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCisgICAgLyogRG9uZSB3aXRoIHNlbmQgKi8KKyBvdXQ6CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBFdGhlcm5ldCByZWNlaXZlICovCitpbnQKK2V0aF9yeCh2b2lkKQoreworICAgIFBMTV9QQUNLRVQgICAgICAgICAgcFBhY2tldCA9IE5VTEw7CisgICAgUFVNX1BBQ0tFVCAgICAgICAgICBwVW1QYWNrZXQgPSBOVUxMOworICAgIHZvaWQgKnNrYjsKKyAgICBpbnQgc2l6ZT0wOworCisgICAgd2hpbGUoVFJVRSkgeworCisgICAgYmNtNTcweF9zZXJ2aWNlX2lzcjoKKwkvKiBQdWxsIGRvd24gcGFja2V0IGlmIGl0IGlzIHRoZXJlICovCisJZXRoX2lzcigpOworCisJLyogSW5kaWNhdGUgUlggcGFja2V0cyBjYWxsZWQgKi8KKwlpZihwVW1EZXZpY2UtPnJ4X3BrdCl7CisJICAgIC8qIHByaW50ZigiZXRoX3J4OiBnb3QgYSBwYWNrZXQuLi5cbiIpOyAqLworCSAgICBwVW1EZXZpY2UtPnJ4X3BrdCA9IDA7CisJfSBlbHNlIHsKKwkgICAgLyogcHJpbnRmKCJldGhfcng6IHdhaXRpbmcgZm9yIHBhY2tldC4uLlxuIik7ICovCisJICAgIGdvdG8gYmNtNTcweF9zZXJ2aWNlX2lzcjsKKwl9CisKKwlwUGFja2V0ID0gKFBMTV9QQUNLRVQpCisJICAgIFFRX1BvcEhlYWQoJnBEZXZpY2UtPlJ4UGFja2V0UmVjZWl2ZWRRLkNvbnRhaW5lcik7CisKKwlpZiAocFBhY2tldCA9PSAwKXsKKwkgICAgcHJpbnRmKCJldGhfcng6IGVtcHR5IHBhY2tldCFcbiIpOworCSAgICBnb3RvIGJjbTU3MHhfc2VydmljZV9pc3I7CisJfQorCisJcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CisjaWYgRVRfREVCVUcKKwlwcmludGYoImV0aF9yeDogcGFja2V0IEAweCV4XG4iLAorCSAgICAgICAoaW50KXBQYWNrZXQpOworI2VuZGlmCisJLyogSWYgdGhlIHBhY2tldCBnZW5lcmF0ZWQgYW4gZXJyb3IsIHJldXNlIGJ1ZmZlciAqLworCWlmICgocFBhY2tldC0+UGFja2V0U3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKSB8fAorCSAgICAoKHNpemUgPSBwUGFja2V0LT5QYWNrZXRTaXplKSA+IHBEZXZpY2UtPlJ4TXR1KSkgeworCisJICAgIC8qIHJldXNlIHNrYiAqLworCSAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCSAgICBwcmludGYoImV0aF9yeDogZXJyb3IgaW4gcGFja2V0IGRtYSFcbiIpOworCSAgICBnb3RvIGJjbTU3MHhfc2VydmljZV9pc3I7CisJfQorCisJLyogU2V0IHNpemUgYW5kIGFkZHJlc3MgKi8KKwlza2IgPSBwVW1QYWNrZXQtPnNrYnVmZjsKKwlzaXplID0gcFBhY2tldC0+UGFja2V0U2l6ZTsKKworCS8qIFBhc3MgdGhlIHBhY2tldCB1cCB0byB0aGUgcHJvdG9jb2wKKwkgKiBsYXllcnMuCisJICovCisJTmV0UmVjZWl2ZShza2IsIHNpemUpOworCisJLyogRnJlZSBwYWNrZXQgYnVmZmVyICovCisJYmNtNTcweFBrdEZyZWUgKHBVbURldmljZS0+aW5kZXgsIHNrYik7CisJcFVtUGFja2V0LT5za2J1ZmYgPSBOVUxMOworCisJLyogUmV1c2UgU0tCICovCisJUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKworCXJldHVybiAwOyAvKiBHb3QgYSBwYWNrZXQsIGJhaWwgLi4uICovCisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCisKKworLyogU2h1dCBkb3duIGRldmljZSAqLwordm9pZAorZXRoX2hhbHQodm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAoIGluaXRpYWxpemVkKQorICAgIGlmIChwRGV2aWNlICYmIHBVbURldmljZSAmJiBwVW1EZXZpY2UtPm9wZW5lZCl7CisJcHJpbnRmKCJcbmV0aCVkOiVzLCIsIHBVbURldmljZS0+aW5kZXgsIHBVbURldmljZS0+bmFtZSk7CisJcHJpbnRmKCJIQUxULCIpOworICAgICAgICAvKiBzdG9wIGRldmljZSAqLworICAgICAgICBMTV9IYWx0KHBEZXZpY2UpOworCXByaW50ZigiUE9XRVIgRE9XTiwiKTsKKyAgICAgICAgTE1fU2V0UG93ZXJTdGF0ZShwRGV2aWNlLCBMTV9QT1dFUl9TVEFURV9EMyk7CisKKyAgICAgICAgLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgZGV2aWNlIGluIHRpZ29uMyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFVtRGV2aWNlLT5tZW1fbGlzdF9udW07IGkrKykgIHsKKyAgICAgICAgICAgIGlmIChwVW1EZXZpY2UtPm1lbV9saXN0W2ldKSAgeworCQkvKiBzYW5pdHkgY2hlY2sgKi8KKyAgICAgICAgICAgICAgICBpZiAocFVtRGV2aWNlLT5kbWFfbGlzdFtpXSkgeyAgLyogY2FjaGUtc2FmZSBtZW1vcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgZnJlZShwVW1EZXZpY2UtPm1lbV9saXN0W2ldKTsKKwkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwVW1EZXZpY2UtPm1lbV9saXN0W2ldKTsgIC8qIG5vcm1hbCBtZW1vcnkgICAqLworCQl9CisJICAgIH0KKwl9CisJcFVtRGV2aWNlLT5vcGVuZWQgPSAwOworCWZyZWUocERldmljZSk7CisJcERldmljZSA9IE5VTEw7CisJcFVtRGV2aWNlID0gTlVMTDsKKwlpbml0aWFsaXplZCA9IDA7CisJcHJpbnRmKCJkb25lIC0gb2ZmbGluZS5cbiIpOworICAgIH0KK30KKworCisKKworLyoKKyAqCisgKiBNaWRkbGUgTW9kdWxlOiBJbnRlcmZhY2UgYmV0d2VlbiB0aGUgSFcgZHJpdmVyICh0aWdvbjMgbW9kdWxlcykgYW5kCisgKiB0aGUgbmF0aXZlIChTRU5TKSBkcml2ZXIuICBUaGVzZSByb3V0aW5lcyBpbXBsZW1lbnQgdGhlIHN5c3RlbQorICogaW50ZXJmYWNlIGZvciB0aWdvbjMgb24gVnhXb3Jrcy4KKyAqLworCisvKiBNaWRkbGUgbW9kdWxlIGRlcGVuZGVuY3kgLSBzaXplIG9mIGEgcGFja2V0IGRlc2NyaXB0b3IgKi8KK2ludCBNTV9QYWNrZXRfRGVzY19TaXplID0gc2l6ZW9mKFVNX1BBQ0tFVCk7CisKKworTE1fU1RBVFVTCitNTV9SZWFkQ29uZmlnMzIoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQlMTV9VSU5UMzIgT2Zmc2V0LAorCQlMTV9VSU5UMzIgKnBWYWx1ZTMyKQoreworICAgIFVNX0RFVklDRV9CTE9DSyAqcFVtRGV2aWNlOworICAgIHBVbURldmljZSA9IChVTV9ERVZJQ0VfQkxPQ0sgKikgcERldmljZTsKKyAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocFVtRGV2aWNlLT5wZGV2LAorCQkJICBPZmZzZXQsICh1MzIgKikgcFZhbHVlMzIpOworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworCitMTV9TVEFUVVMKK01NX1dyaXRlQ29uZmlnMzIoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkgTE1fVUlOVDMyIE9mZnNldCwKKwkJIExNX1VJTlQzMiBWYWx1ZTMyKQoreworICAgIFVNX0RFVklDRV9CTE9DSyAqcFVtRGV2aWNlOworICAgIHBVbURldmljZSA9IChVTV9ERVZJQ0VfQkxPQ0sgKikgcERldmljZTsKKyAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBVbURldmljZS0+cGRldiwKKwkJCSAgIE9mZnNldCwgVmFsdWUzMik7CisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCisKK0xNX1NUQVRVUworTU1fUmVhZENvbmZpZzE2KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJTE1fVUlOVDMyIE9mZnNldCwKKwkJTE1fVUlOVDE2ICpwVmFsdWUxNikKK3sKKyAgICBVTV9ERVZJQ0VfQkxPQ0sgKnBVbURldmljZTsKKyAgICBwVW1EZXZpY2UgPSAoVU1fREVWSUNFX0JMT0NLICopIHBEZXZpY2U7CisgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQocFVtRGV2aWNlLT5wZGV2LAorCQkJIE9mZnNldCwgKHUxNiopIHBWYWx1ZTE2KTsKKyAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0xNX1NUQVRVUworTU1fV3JpdGVDb25maWcxNihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCSBMTV9VSU5UMzIgT2Zmc2V0LAorCQkgTE1fVUlOVDE2IFZhbHVlMTYpCit7CisgICAgVU1fREVWSUNFX0JMT0NLICpwVW1EZXZpY2U7CisgICAgcFVtRGV2aWNlID0gKFVNX0RFVklDRV9CTE9DSyAqKSBwRGV2aWNlOworICAgIHBjaV93cml0ZV9jb25maWdfd29yZChwVW1EZXZpY2UtPnBkZXYsCisJCQkgIE9mZnNldCwgVmFsdWUxNik7CisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCisKK0xNX1NUQVRVUworTU1fQWxsb2NhdGVTaGFyZWRNZW1vcnkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQmxvY2tTaXplLAorCQkJUExNX1ZPSUQgKnBNZW1vcnlCbG9ja1ZpcnQsCisJCQlQTE1fUEhZU0lDQUxfQUREUkVTUyBwTWVtb3J5QmxvY2tQaHksCisJCQlMTV9CT09MIENhY2hlZCkKK3sKKyAgICBQTE1fVk9JRCBwdmlydDsKKyAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworICAgIGRtYV9hZGRyX3QgbWFwcGluZzsKKworICAgIHB2aXJ0ID0gbWFsbG9jKEJsb2NrU2l6ZSk7CisgICAgbWFwcGluZyA9IChkbWFfYWRkcl90KShwdmlydCk7CisgICAgaWYgKCFwdmlydCkKKwlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisKKyAgICBwVW1EZXZpY2UtPm1lbV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtXSA9IHB2aXJ0OworICAgIHBVbURldmljZS0+ZG1hX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW1dID0gbWFwcGluZzsKKyAgICBwVW1EZXZpY2UtPm1lbV9zaXplX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW0rK10gPSBCbG9ja1NpemU7CisgICAgbWVtc2V0KHB2aXJ0LCAwLCBCbG9ja1NpemUpOworCisgICAgKnBNZW1vcnlCbG9ja1ZpcnQgPSAoUExNX1ZPSUQpIHB2aXJ0OworICAgIE1NX1NldEFkZHIgKHBNZW1vcnlCbG9ja1BoeSwgKGRtYV9hZGRyX3QpIG1hcHBpbmcpOworCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCisKKworTE1fU1RBVFVTCitNTV9BbGxvY2F0ZU1lbW9yeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCbG9ja1NpemUsCisJUExNX1ZPSUQgKnBNZW1vcnlCbG9ja1ZpcnQpCit7CisgICAgUExNX1ZPSUQgcHZpcnQ7CisgICAgUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKworICAgIHB2aXJ0ID0gbWFsbG9jKEJsb2NrU2l6ZSk7CisKKyAgICBpZiAoIXB2aXJ0KQorCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKworICAgIHBVbURldmljZS0+bWVtX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW1dID0gcHZpcnQ7CisgICAgcFVtRGV2aWNlLT5kbWFfbGlzdFtwVW1EZXZpY2UtPm1lbV9saXN0X251bV0gPSAwOworICAgIHBVbURldmljZS0+bWVtX3NpemVfbGlzdFtwVW1EZXZpY2UtPm1lbV9saXN0X251bSsrXSA9IEJsb2NrU2l6ZTsKKyAgICBtZW1zZXQocHZpcnQsIDAsIEJsb2NrU2l6ZSk7CisgICAgKnBNZW1vcnlCbG9ja1ZpcnQgPSBwdmlydDsKKworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworTE1fU1RBVFVTCitNTV9NYXBNZW1CYXNlKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgICBwcmludGYoIkJDTTU3MHggUENJIE1lbW9yeSBiYXNlIGFkZHJlc3MgQDB4JXhcbiIsCisJICAgKHVuc2lnbmVkIGludClwRGV2aWNlLT5wTWFwcGVkTWVtQmFzZSk7CisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCitMTV9TVEFUVVMKK01NX0luaXRpYWxpemVVbVBhY2tldHMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworICAgIGludCBpOworICAgIHZvaWQqIHNrYjsKKyAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworICAgIFBVTV9QQUNLRVQgcFVtUGFja2V0ID0gTlVMTDsKKyAgICBQTE1fUEFDS0VUIHBQYWNrZXQgPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IHBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudDsgaSsrKSB7CisJcFBhY2tldCA9IFFRX1BvcEhlYWQoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKKwlwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKKworCWlmIChwUGFja2V0ID09IDApIHsKKwkgICAgcHJpbnRmKCJNTV9Jbml0aWFsaXplVW1QYWNrZXRzOiBCYWQgUnhQYWNrZXRGcmVlUVxuIik7CisJfQorCisJc2tiID0gYmNtNTcweFBrdEFsbG9jKHBVbURldmljZS0+aW5kZXgsCisJCQkgICAgICBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyU2l6ZSArIDIpOworCisJaWYgKHNrYiA9PSAwKSB7CisJICAgIHBVbVBhY2tldC0+c2tidWZmID0gMDsKKwkgICAgUVFfUHVzaFRhaWwoJnBVbURldmljZS0+cnhfb3V0X29mX2J1Zl9xLkNvbnRhaW5lciwgcFBhY2tldCk7CisJICAgIHByaW50ZigiTU1fSW5pdGlhbGl6ZVVtUGFja2V0czogb3V0IG9mIGJ1ZmZlci5cbiIpOworCSAgICBjb250aW51ZTsKKwl9CisKKwlwVW1QYWNrZXQtPnNrYnVmZiA9IHNrYjsKKwlRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworICAgIH0KKworICAgIHBVbURldmljZS0+cnhfbG93X2J1Zl90aHJlc2ggPSBwRGV2aWNlLT5SeFBhY2tldERlc2NDbnQgLyA4OworCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCitMTV9TVEFUVVMKK01NX0dldENvbmZpZyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisgICAgUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKyAgICBpbnQgaW5kZXggPSBwRGV2aWNlLT5pbmRleDsKKworICAgIGlmIChhdXRvX3NwZWVkW2luZGV4XSA9PSAwKQorCXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gVFJVRTsKKyAgICBlbHNlCisJcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBGQUxTRTsKKworICAgIGlmIChsaW5lX3NwZWVkW2luZGV4XSA9PSAwKSB7CisJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTzsKKwlwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IEZBTFNFOworICAgIH0KKyAgICBlbHNlIHsKKwlpZiAobGluZV9zcGVlZFtpbmRleF0gPT0gMTAwMCkgeworCSAgICBpZiAocERldmljZS0+RW5hYmxlVGJpKSB7CisJCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9CisJCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9GSUJFUl8xMDAwTUJQU19GVUxMX0RVUExFWDsKKwkgICAgfQorCSAgICBlbHNlIGlmIChmdWxsX2R1cGxleFtpbmRleF0pIHsKKwkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDAwTUJQU19GVUxMX0RVUExFWDsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDAwTUJQUzsKKwkgICAgfQorCSAgICBpZiAoIXBEZXZpY2UtPkVuYWJsZVRiaSkKKwkJcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBGQUxTRTsKKwl9CisJZWxzZSBpZiAobGluZV9zcGVlZFtpbmRleF0gPT0gMTAwKSB7CisJICAgIGlmIChmdWxsX2R1cGxleFtpbmRleF0pIHsKKwkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDBNQlBTX0ZVTExfRFVQTEVYOworCSAgICB9CisJICAgIGVsc2UgeworCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQorCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwME1CUFM7CisJICAgIH0KKwl9CisJZWxzZSBpZiAobGluZV9zcGVlZFtpbmRleF0gPT0gMTApIHsKKwkgICAgaWYgKGZ1bGxfZHVwbGV4W2luZGV4XSkgeworCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQorCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwTUJQU19GVUxMX0RVUExFWDsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xME1CUFM7CisJICAgIH0KKwl9CisJZWxzZSB7CisJICAgIHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9CisJCUxNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE87CisJICAgIHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gRkFMU0U7CisJfQorCisgICAgfQorICAgIHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwID0gMDsKKyAgICBpZiAocnhfZmxvd19jb250cm9sW2luZGV4XSAhPSAwKSB7CisJcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgfD0gTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0U7CisgICAgfQorICAgIGlmICh0eF9mbG93X2NvbnRyb2xbaW5kZXhdICE9IDApIHsKKwlwRGV2aWNlLT5GbG93Q29udHJvbENhcCB8PSBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0U7CisgICAgfQorICAgIGlmICgoYXV0b19mbG93X2NvbnRyb2xbaW5kZXhdICE9IDApICYmCisJKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID09IEZBTFNFKSkgeworCisJcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgfD0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0U7CisJaWYgKCh0eF9mbG93X2NvbnRyb2xbaW5kZXhdID09IDApICYmCisJICAgIChyeF9mbG93X2NvbnRyb2xbaW5kZXhdID09IDApKSB7CisJICAgIHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwIHw9CisJCUxNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSB8CisJCUxNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOworCX0KKyAgICB9CisKKyAgICAvKiBEZWZhdWx0IE1UVSBmb3Igbm93ICovCisgICAgcFVtRGV2aWNlLT5tdHUgPSAxNTAwOworCisjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAorICAgIGlmIChwVW1EZXZpY2UtPm10dSA+IDE1MDApIHsKKwlwRGV2aWNlLT5SeE10dSA9IHBVbURldmljZS0+bXR1OworCXBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ID0gREVGQVVMVF9KVU1CT19SQ1ZfREVTQ19DT1VOVDsKKyAgICB9CisgICAgZWxzZSB7CisJcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgPSAwOworICAgIH0KKyAgICBwRGV2aWNlLT5SeEp1bWJvRGVzY0NudCA9IHJ4X2p1bWJvX2Rlc2NfY250W2luZGV4XTsKKyNlbHNlCisgICAgcERldmljZS0+UnhNdHUgPSBwVW1EZXZpY2UtPm10dTsKKyNlbmRpZgorCisgICAgaWYgKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCXBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cyA9IFRSVUU7CisJcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWjsKKyAgICB9CisgICAgZWxzZSB7CisJcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWi81MDsKKyAgICB9CisKKyAgICBwRGV2aWNlLT5UeFBhY2tldERlc2NDbnQgPSB0eF9wa3RfZGVzY19jbnRbaW5kZXhdOworICAgIHBEZXZpY2UtPlJ4U3RkRGVzY0NudCA9IHJ4X3N0ZF9kZXNjX2NudFtpbmRleF07CisgICAgLyogTm90ZTogIGFkYXB0aXZlIGNvYWxlc2NlbmNlIHJlYWxseSBpc24ndCBhZGFwdGl2ZSBpbiB0aGlzIGRyaXZlciAqLworICAgIHBVbURldmljZS0+cnhfYWRhcHRpdmVfY29hbGVzY2UgPSByeF9hZGFwdGl2ZV9jb2FsZXNjZVtpbmRleF07CisgICAgaWYgKCFwVW1EZXZpY2UtPnJ4X2FkYXB0aXZlX2NvYWxlc2NlKSB7CisJcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3MgPSByeF9jb2FsZXNjZV90aWNrc1tpbmRleF07CisJaWYgKHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzID4gTUFYX1JYX0NPQUxFU0NJTkdfVElDS1MpCisJICAgIHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzID0gTUFYX1JYX0NPQUxFU0NJTkdfVElDS1M7CisJcFVtRGV2aWNlLT5yeF9jdXJyX2NvYWxlc2NlX3RpY2tzID1wRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrczsKKworCXBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzID0gcnhfbWF4X2NvYWxlc2NlX2ZyYW1lc1tpbmRleF07CisJaWYgKHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzPk1BWF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUykKKwkgICAgcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXMgPQorCQkJCU1BWF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKKwlwVW1EZXZpY2UtPnJ4X2N1cnJfY29hbGVzY2VfZnJhbWVzID0KKwkgICAgcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXM7CisJcERldmljZS0+U3RhdHNDb2FsZXNjaW5nVGlja3MgPSBzdGF0c19jb2FsZXNjZV90aWNrc1tpbmRleF07CisJaWYgKHBEZXZpY2UtPlN0YXRzQ29hbGVzY2luZ1RpY2tzPk1BWF9TVEFUU19DT0FMRVNDSU5HX1RJQ0tTKQorCSAgICBwRGV2aWNlLT5TdGF0c0NvYWxlc2NpbmdUaWNrcz0KKwkJTUFYX1NUQVRTX0NPQUxFU0NJTkdfVElDS1M7CisJfQorCWVsc2UgeworCSAgICBwVW1EZXZpY2UtPnJ4X2N1cnJfY29hbGVzY2VfZnJhbWVzID0KKwkJREVGQVVMVF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKKwkgICAgcFVtRGV2aWNlLT5yeF9jdXJyX2NvYWxlc2NlX3RpY2tzID0KKwkJREVGQVVMVF9SWF9DT0FMRVNDSU5HX1RJQ0tTOworCX0KKyAgICBwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrcyA9IHR4X2NvYWxlc2NlX3RpY2tzW2luZGV4XTsKKyAgICBpZiAocERldmljZS0+VHhDb2FsZXNjaW5nVGlja3MgPiBNQVhfVFhfQ09BTEVTQ0lOR19USUNLUykKKwlwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrcyA9IE1BWF9UWF9DT0FMRVNDSU5HX1RJQ0tTOworICAgIHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzID0gdHhfbWF4X2NvYWxlc2NlX2ZyYW1lc1tpbmRleF07CisgICAgaWYgKHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzID4gTUFYX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTKQorCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzID0gTUFYX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTOworCisgICAgaWYgKGVuYWJsZV93b2xbaW5kZXhdKSB7CisJcERldmljZS0+V2FrZVVwTW9kZUNhcCA9IExNX1dBS0VfVVBfTU9ERV9NQUdJQ19QQUNLRVQ7CisJcERldmljZS0+V2FrZVVwTW9kZSA9IExNX1dBS0VfVVBfTU9ERV9NQUdJQ19QQUNLRVQ7CisgICAgfQorICAgIHBEZXZpY2UtPk5pY1NlbmRCZCA9IFRSVUU7CisKKyAgICAvKiBEb24ndCB1cGRhdGUgc3RhdHVzIGJsb2NrcyBkdXJpbmcgaW50ZXJydXB0ICovCisgICAgcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSAwOworICAgIHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0gMDsKKworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKworfQorCisKK0xNX1NUQVRVUworTU1fU3RhcnRUeERtYShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCkKK3sKKyAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworICAgIHByaW50ZigiU3RhcnQgVFggRE1BOiBkZXY9JWQgcGFja2V0IEAweCV4XG4iLAorCSAgIChpbnQpcFVtRGV2aWNlLT5pbmRleCwgKHVuc2lnbmVkIGludClwUGFja2V0KTsKKworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworTE1fU1RBVFVTCitNTV9Db21wbGV0ZVR4RG1hKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQoreworICAgIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisgICAgcHJpbnRmKCJDb21wbGV0ZSBUWCBETUE6IGRldj0lZCBwYWNrZXQgQDB4JXhcbiIsCisJICAgKGludClwVW1EZXZpY2UtPmluZGV4LCAodW5zaWduZWQgaW50KXBQYWNrZXQpOworICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworCitMTV9TVEFUVVMKK01NX0luZGljYXRlU3RhdHVzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fU1RBVFVTIFN0YXR1cykKK3sKKyAgICBjaGFyIGJ1ZlsxMjhdOworICAgIGNoYXIgbGNkWzRdOworICAgIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisgICAgTE1fRkxPV19DT05UUk9MIGZsb3dfY29udHJvbDsKKworICAgIHBVbURldmljZS0+ZGVsYXllZF9saW5rX2luZCA9IDA7CisgICAgbWVtc2V0KGxjZCwgMHgwLCA0KTsKKworICAgIGlmIChTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfRE9XTikgeworCXNwcmludGYoYnVmLCJldGglZDogJXM6IE5JQyBMaW5rIGlzIGRvd25cbiIsCisJCXBVbURldmljZS0+aW5kZXgscFVtRGV2aWNlLT5uYW1lKTsKKyAgICAgICAgbGNkWzBdID0gJ0wnO2xjZFsxXT0nTic7bGNkWzJdPSdLJztsY2RbM10gPSAnPyc7CisgICAgfSBlbHNlIGlmIChTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKSB7CisJc3ByaW50ZihidWYsImV0aCVkOiVzOiAiLCBwVW1EZXZpY2UtPmluZGV4LCBwVW1EZXZpY2UtPm5hbWUpOworCisJaWYgKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTKXsKKwkgICAgc3RyY2F0KGJ1ZiwiMTAwMCBNYnBzICIpOworICAgICAgICAgICAgbGNkWzBdID0gJzEnO2xjZFsxXT0nRyc7bGNkWzJdPSdCJzsKKwl9IGVsc2UgaWYgKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwME1CUFMpeworCSAgICBzdHJjYXQoYnVmLCIxMDAgTWJwcyAiKTsKKyAgICAgICAgICAgIGxjZFswXSA9ICcxJztsY2RbMV09JzAnO2xjZFsyXT0nMCc7CisJfSBlbHNlIGlmIChwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xME1CUFMpeworCSAgICBzdHJjYXQoYnVmLCIxMCBNYnBzICIpOworICAgICAgICAgICAgbGNkWzBdID0gJzEnO2xjZFsxXT0nMCc7bGNkWzJdPScgJzsKKwl9CisJaWYgKHBEZXZpY2UtPkR1cGxleE1vZGUgPT0gTE1fRFVQTEVYX01PREVfRlVMTCl7CisJICAgIHN0cmNhdChidWYsICJmdWxsIGR1cGxleCIpOworICAgICAgICAgICAgbGNkWzNdID0gJ0YnOworCX0gZWxzZSB7CisJICAgIHN0cmNhdChidWYsICJoYWxmIGR1cGxleCIpOworICAgICAgICAgICAgbGNkWzNdID0gJ0gnOworCX0KKwlzdHJjYXQoYnVmLCAiIGxpbmsgdXAiKTsKKworCWZsb3dfY29udHJvbCA9IHBEZXZpY2UtPkZsb3dDb250cm9sICYKKwkgICAgKExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFIHwKKwkgICAgIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSk7CisKKwlpZiAoZmxvd19jb250cm9sKSB7CisJICAgIGlmIChmbG93X2NvbnRyb2wgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSkgeworCQlzdHJjYXQoYnVmLCIsIHJlY2VpdmUgIik7CisJCWlmIChmbG93X2NvbnRyb2wgJiBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UpCisJCSAgICBzdHJjYXQoYnVmLCIgJiB0cmFuc21pdCAiKTsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJc3RyY2F0KGJ1ZiwiLCB0cmFuc21pdCAiKTsKKwkgICAgfQorCSAgICBzdHJjYXQoYnVmLCJmbG93IGNvbnRyb2wgT04iKTsKKwl9IGVsc2UgeworCSAgICBzdHJjYXQoYnVmLCAiLCBmbG93IGNvbnRyb2wgT0ZGIik7CisJfQorICAgICAgICBzdHJjYXQoYnVmLCJcbiIpOworCXByaW50ZigiJXMiLGJ1Zik7CisgICAgfQorI2lmIDAKKyAgICBzeXNMZWREc3BseShsY2RbMF0sbGNkWzFdLGxjZFsyXSxsY2RbM10pOworI2VuZGlmCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCitMTV9TVEFUVVMKK01NX0ZyZWVSeEJ1ZmZlcihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCkKK3sKKworICAgIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisgICAgUFVNX1BBQ0tFVCBwVW1QYWNrZXQ7CisgICAgdm9pZCAqc2tiOworCisgICAgcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CisKKyAgICBpZiAoKHNrYiA9IHBVbVBhY2tldC0+c2tidWZmKSkKKwliY201NzB4UGt0RnJlZShwVW1EZXZpY2UtPmluZGV4LCBza2IpOworCisgICAgcFVtUGFja2V0LT5za2J1ZmYgPSAwOworCisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCit1bnNpZ25lZCBsb25nCitNTV9BbkdldEN1cnJlbnRUaW1lX3VzKFBBTl9TVEFURV9JTkZPIHBBbkluZm8pCit7CisgICAgcmV0dXJuIGdldF90aW1lcigwKTsKK30KKworLyoKKyAqICAgVHJhbnNmb3JtIGFuIE1CVUYgY2hhaW4gaW50byBhIHNpbmdsZSBNQlVGLgorICogICBUaGlzIHJvdXRpbmUgd2lsbCBmYWlsIGlmIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUKKyAqICAgY2hhaW4gb3ZlcmZsb3dzIGEgdHJhbnNtaXQgYnVmZmVyLiAgSW4gdGhhdCBjYXNlLAorICogICB0aGUgaW5jb21pbmcgTUJVRiBjaGFpbiB3aWxsIGJlIGZyZWVkLiAgVGhpcyByb3V0aW5lIGNhbgorICogICBhbHNvIGZhaWwgYnkgbm90IGJlaW5nIGFibGUgdG8gYWxsb2NhdGUgYSBuZXcgTUJVRiAoaW5jbHVkaW5nCisgKiAgIGNsdXN0ZXIgYW5kIG1idWYgaGVhZGVycykuICBJbiB0aGF0IGNhc2UgdGhlIGZhaWx1cmUgaXMKKyAqICAgbm9uLWZhdGFsLiAgVGhlIGluY29taW5nIGNsdXN0ZXIgY2hhaW4gaXMgbm90IGZyZWVkLCBnaXZpbmcKKyAqICAgdGhlIGNhbGxlciB0aGUgY2hvaWNlIG9mIHdoZXRoZXIgdG8gdHJ5IGEgcmV0cmFuc21pdCBsYXRlci4KKyAqLworTE1fU1RBVFVTCitNTV9Db2FsZXNjZVR4QnVmZmVyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQoreworICAgIFBVTV9QQUNLRVQgcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CisgICAgUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKyAgICB2b2lkICpza2JuZXc7CisgICAgaW50IGxlbiA9IDA7CisKKyAgICBpZiAobGVuID09IDApCisgICAgICAgIHJldHVybiAoTE1fU1RBVFVTX1NVQ0NFU1MpOworCisgICAgaWYgKGxlbiA+IE1BWF9QQUNLRVRfU0laRSl7CisgICAgICAgIHByaW50ZiAoImV0aCVkOiB4bWl0IGZyYW1lIGRpc2NhcmRlZCwgdG9vIGJpZyEsIHNpemUgPSAlZFxuIiwKKwkJcFVtRGV2aWNlLT5pbmRleCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIChMTV9TVEFUVVNfRkFJTFVSRSk7CisgICAgfQorCisgICAgc2tibmV3ID0gYmNtNTcweFBrdEFsbG9jKHBVbURldmljZS0+aW5kZXgsIE1BWF9QQUNLRVRfU0laRSk7CisKKyAgICBpZiAoc2tibmV3ID09IE5VTEwpIHsKKyAgICAgICAgcFVtRGV2aWNlLT50eF9mdWxsID0gMTsKKyAgICAgICAgcHJpbnRmICgiZXRoJWQ6IG91dCBvZiB0cmFuc21pdCBidWZmZXJzIiwgcFVtRGV2aWNlLT5pbmRleCk7CisgICAgICAgIHJldHVybiAoTE1fU1RBVFVTX0ZBSUxVUkUpOworICAgIH0KKworICAgIC8qIE5ldyBwYWNrZXQgdmFsdWVzICovCisgICAgcFVtUGFja2V0LT5za2J1ZmYgPSBza2JuZXc7CisgICAgcFVtUGFja2V0LT5sbV9wYWNrZXQudS5UeC5GcmFnQ291bnQgPSAxOworCisgICAgcmV0dXJuIChMTV9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKworTE1fU1RBVFVTCitNTV9JbmRpY2F0ZVJ4UGFja2V0cyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisgICAgUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKyAgICBwVW1EZXZpY2UtPnJ4X3BrdCA9IDE7CisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCitMTV9TVEFUVVMKK01NX0luZGljYXRlVHhQYWNrZXRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKyAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworICAgIFBMTV9QQUNLRVQgcFBhY2tldDsKKyAgICBQVU1fUEFDS0VUIHBVbVBhY2tldDsKKyAgICB2b2lkICpza2I7CisgICAgd2hpbGUgKCBUUlVFICkgeworCisJcFBhY2tldCA9IChQTE1fUEFDS0VUKQorCSAgICBRUV9Qb3BIZWFkKCZwRGV2aWNlLT5UeFBhY2tldFhtaXR0ZWRRLkNvbnRhaW5lcik7CisKKwlpZiAocFBhY2tldCA9PSAwKQorCSAgICBicmVhazsKKworCXBVbVBhY2tldCA9IChQVU1fUEFDS0VUKSBwUGFja2V0OworCXNrYiA9ICh2b2lkKilwVW1QYWNrZXQtPnNrYnVmZjsKKworICAgICAgICAvKgorICAgICAgICAqIEZyZWUgTUJMSyBpZiB3ZSB0cmFuc21pdHRlZCBhIGZyYWdtZW50ZWQgcGFja2V0IG9yIGEKKyAgICAgICAgKiBub24tZnJhZ21lbnRlZCBwYWNrZXQgc3RyYWlnaHQgZnJvbSB0aGUgVnhXb3JrcworICAgICAgICAqIGJ1ZmZlciBwb29sLiBJZiBwYWNrZXQgd2FzIGNvcGllZCB0byBhIGxvY2FsIHRyYW5zbWl0CisgICAgICAgICogYnVmZmVyLCB0aGVuIHRoZXJlJ3Mgbm8gTUJVRiB0byBmcmVlLCBqdXN0IGZyZWUKKyAgICAgICAgKiB0aGUgdHJhbnNtaXQgYnVmZmVyIGJhY2sgdG8gdGhlIGNsdXN0ZXIgcG9vbC4KKyAgICAgICAgKi8KKworCWlmIChza2IpCisJICAgIGJjbTU3MHhQa3RGcmVlIChwVW1EZXZpY2UtPmluZGV4LCBza2IpOworCisJcFVtUGFja2V0LT5za2J1ZmYgPSAwOworCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJcFVtRGV2aWNlLT50eF9wa3QgPSAxOworICAgIH0KKyAgICBpZiAocFVtRGV2aWNlLT50eF9mdWxsKSB7CisJaWYgKFFRX0dldEVudHJ5Q250KCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lcikgPj0KKwkgICAgKFFRX0dldFNpemUoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyKSA+PiAxKSkKKwkgICAgcFVtRGV2aWNlLT50eF9mdWxsID0gMDsKKyAgICB9CisgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorICogIFNjYW4gYW4gTUJVRiBjaGFpbiB1bnRpbCB3ZSByZWFjaCBmcmFnbWVudCBudW1iZXIgImZyYWciCisgKiAgUmV0dXJuIGl0cyBsZW5ndGggYW5kIHBoeXNpY2FsIGFkZHJlc3MuCisgKi8KK3ZvaWQgTU1fTWFwVHhEbWEKKyAgICAoCisgICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorICAgIHN0cnVjdCBfTE1fUEFDS0VUICpwUGFja2V0LAorICAgIFQzXzY0QklUX0hPU1RfQUREUiAqcGFkZHIsCisgICAgTE1fVUlOVDMyICpsZW4sCisgICAgaW50IGZyYWcpCit7CisgICAgUFVNX1BBQ0tFVCBwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKKyAgICAqbGVuID0gcFBhY2tldC0+UGFja2V0U2l6ZTsKKyAgICBNTV9TZXRUM0FkZHIocGFkZHIsIChkbWFfYWRkcl90KSBwVW1QYWNrZXQtPnNrYnVmZik7Cit9CisKKy8qCisgKiAgQ29udmVydCBhbiBtYnVmIGFkZHJlc3MsIGEgQ1BVIGxvY2FsIHZpcnR1YWwgYWRkcmVzcywKKyAqICB0byBhIHBoeXNpY2FsIGFkZHJlc3MgYXMgc2VlbiBmcm9tIGEgUENJIGRldmljZS4gIFN0b3JlIHRoZQorICogIHJlc3VsdCBhdCBwYWRkci4KKyAqLwordm9pZCBNTV9NYXBSeERtYSgKKwkJIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJIHN0cnVjdCBfTE1fUEFDS0VUICpwUGFja2V0LAorCQkgVDNfNjRCSVRfSE9TVF9BRERSICpwYWRkcikKK3sKKyAgICBQVU1fUEFDS0VUIHBVbVBhY2tldCA9IChQVU1fUEFDS0VUKSBwUGFja2V0OworICAgIE1NX1NldFQzQWRkcihwYWRkciwgKGRtYV9hZGRyX3QpIHBVbVBhY2tldC0+c2tidWZmKTsKK30KKwordm9pZAorTU1fU2V0QWRkciAoTE1fUEhZU0lDQUxfQUREUkVTUyAqcGFkZHIsIGRtYV9hZGRyX3QgYWRkcikKK3sKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKKyAgICAgICAgcGFkZHItPkhpZ2ggPSAoKHVuc2lnbmVkIGxvbmcpIGFkZHIpID4+IDMyOworICAgICAgICBwYWRkci0+TG93ID0gKCh1bnNpZ25lZCBsb25nKSBhZGRyKSAmIDB4ZmZmZmZmZmY7CisjZWxzZQorICAgICAgICBwYWRkci0+SGlnaCA9IDA7CisgICAgICAgIHBhZGRyLT5Mb3cgPSAodW5zaWduZWQgbG9uZykgYWRkcjsKKyNlbmRpZgorfQorCit2b2lkCitNTV9TZXRUM0FkZHIoVDNfNjRCSVRfSE9TVF9BRERSICpwYWRkciwgZG1hX2FkZHJfdCBhZGRyKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGJhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisgICAgICAgIHNldF82NGJpdF9hZGRyKHBhZGRyLCBiYWRkciAmIDB4ZmZmZmZmZmYsIGJhZGRyID4+IDMyKTsKKyNlbHNlCisgICAgICAgIHNldF82NGJpdF9hZGRyKHBhZGRyLCBiYWRkciwgMCk7CisjZW5kaWYKK30KKworLyoKKyAqIFRoaXMgY29tYmluYXRpb24gb2YgYGlubGluZScgYW5kIGBleHRlcm4nIGhhcyBhbG1vc3QgdGhlIGVmZmVjdCBvZiBhCisgKiBtYWNyby4gIFRoZSB3YXkgdG8gdXNlIGl0IGlzIHRvIHB1dCBhIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gYSBoZWFkZXIKKyAqIGZpbGUgd2l0aCB0aGVzZSBrZXl3b3JkcywgYW5kIHB1dCBhbm90aGVyIGNvcHkgb2YgdGhlIGRlZmluaXRpb24KKyAqIChsYWNraW5nIGBpbmxpbmUnIGFuZCBgZXh0ZXJuJykgaW4gYSBsaWJyYXJ5IGZpbGUuICBUaGUgZGVmaW5pdGlvbiBpbgorICogdGhlIGhlYWRlciBmaWxlIHdpbGwgY2F1c2UgbW9zdCBjYWxscyB0byB0aGUgZnVuY3Rpb24gdG8gYmUgaW5saW5lZC4KKyAqIElmIGFueSB1c2VzIG9mIHRoZSBmdW5jdGlvbiByZW1haW4sIHRoZXkgd2lsbCByZWZlciB0byB0aGUgc2luZ2xlIGNvcHkKKyAqIGluIHRoZSBsaWJyYXJ5LgorICovCit2b2lkCithdG9taWNfc2V0KGF0b21pY190KiBlbnRyeSwgaW50IHZhbCkKK3sKKyAgICBlbnRyeS0+Y291bnRlciA9IHZhbDsKK30KK2ludAorYXRvbWljX3JlYWQoYXRvbWljX3QqIGVudHJ5KQoreworICAgIHJldHVybiBlbnRyeS0+Y291bnRlcjsKK30KK3ZvaWQKK2F0b21pY19pbmMoYXRvbWljX3QqIGVudHJ5KQoreworICAgIGlmKGVudHJ5KQorCWVudHJ5LT5jb3VudGVyKys7Cit9CisKK3ZvaWQKK2F0b21pY19kZWMoYXRvbWljX3QqIGVudHJ5KQoreworICAgIGlmKGVudHJ5KQorCWVudHJ5LT5jb3VudGVyLS07Cit9CisKK3ZvaWQKK2F0b21pY19zdWIoaW50IGEsIGF0b21pY190KiBlbnRyeSkKK3sKKyAgICBpZihlbnRyeSkKKwllbnRyeS0+Y291bnRlciAtPSBhOworfQorCit2b2lkCithdG9taWNfYWRkKGludCBhLCBhdG9taWNfdCogZW50cnkpCit7CisgICAgaWYoZW50cnkpCisJZW50cnktPmNvdW50ZXIgKz0gYTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitRUV9Jbml0UXVldWUoCitQUVFfQ09OVEFJTkVSIHBRdWV1ZSwKK3Vuc2lnbmVkIGludCBRdWV1ZVNpemUpIHsKKyAgICBwUXVldWUtPkhlYWQgPSAwOworICAgIHBRdWV1ZS0+VGFpbCA9IDA7CisgICAgcFF1ZXVlLT5TaXplID0gUXVldWVTaXplKzE7CisgICAgYXRvbWljX3NldCgmcFF1ZXVlLT5FbnRyeUNudCwgMCk7Cit9IC8qIFFRX0luaXRRdWV1ZSAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyCitRUV9GdWxsKAorUFFRX0NPTlRBSU5FUiBwUXVldWUpIHsKKyAgICB1bnNpZ25lZCBpbnQgTmV3SGVhZDsKKworICAgIE5ld0hlYWQgPSAocFF1ZXVlLT5IZWFkICsgMSkgJSBwUXVldWUtPlNpemU7CisKKyAgICByZXR1cm4oTmV3SGVhZCA9PSBwUXVldWUtPlRhaWwpOworfSAvKiBRUV9GdWxsICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NoYXIKK1FRX0VtcHR5KAorUFFRX0NPTlRBSU5FUiBwUXVldWUpIHsKKyAgICByZXR1cm4ocFF1ZXVlLT5IZWFkID09IHBRdWV1ZS0+VGFpbCk7Cit9IC8qIFFRX0VtcHR5ICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludAorUVFfR2V0U2l6ZSgKK1BRUV9DT05UQUlORVIgcFF1ZXVlKSB7CisgICAgcmV0dXJuIHBRdWV1ZS0+U2l6ZTsKK30gLyogUVFfR2V0U2l6ZSAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQKK1FRX0dldEVudHJ5Q250KAorUFFRX0NPTlRBSU5FUiBwUXVldWUpIHsKKyAgICByZXR1cm4gYXRvbWljX3JlYWQoJnBRdWV1ZS0+RW50cnlDbnQpOworfSAvKiBRUV9HZXRFbnRyeUNudCAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRSVUUgZW50cnkgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGQUxTRSBxdWV1ZSBpcyBmdWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NoYXIKK1FRX1B1c2hIZWFkKAorUFFRX0NPTlRBSU5FUiBwUXVldWUsCitQUVFfRU5UUlkgcEVudHJ5KSB7CisgICAgdW5zaWduZWQgaW50IEhlYWQ7CisKKyAgICBIZWFkID0gKHBRdWV1ZS0+SGVhZCArIDEpICUgcFF1ZXVlLT5TaXplOworCisjaWYgIWRlZmluZWQoUVFfTk9fT1ZFUkZMT1dfQ0hFQ0spCisgICAgaWYoSGVhZCA9PSBwUXVldWUtPlRhaWwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSAvKiBpZiAqLworI2VuZGlmIC8qIFFRX05PX09WRVJGTE9XX0NIRUNLICovCisKKyAgICBwUXVldWUtPkFycmF5W3BRdWV1ZS0+SGVhZF0gPSBwRW50cnk7CisgICAgd21iKCk7CisgICAgcFF1ZXVlLT5IZWFkID0gSGVhZDsKKyAgICBhdG9taWNfaW5jKCZwUXVldWUtPkVudHJ5Q250KTsKKworICAgIHJldHVybiAtMTsKK30gLyogUVFfUHVzaEhlYWQgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUUlVFIGVudHJ5IHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRkFMU0UgcXVldWUgaXMgZnVsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyCitRUV9QdXNoVGFpbCgKK1BRUV9DT05UQUlORVIgcFF1ZXVlLAorUFFRX0VOVFJZIHBFbnRyeSkgeworICAgIHVuc2lnbmVkIGludCBUYWlsOworCisgICAgVGFpbCA9IHBRdWV1ZS0+VGFpbDsKKyAgICBpZihUYWlsID09IDApIHsKKyAgICAgICAgVGFpbCA9IHBRdWV1ZS0+U2l6ZTsKKyAgICB9IC8qIGlmICovCisgICAgVGFpbC0tOworCisjaWYgIWRlZmluZWQoUVFfTk9fT1ZFUkZMT1dfQ0hFQ0spCisgICAgaWYoVGFpbCA9PSBwUXVldWUtPkhlYWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSAvKiBpZiAqLworI2VuZGlmIC8qIFFRX05PX09WRVJGTE9XX0NIRUNLICovCisKKyAgICBwUXVldWUtPkFycmF5W1RhaWxdID0gcEVudHJ5OworICAgIHdtYigpOworICAgIHBRdWV1ZS0+VGFpbCA9IFRhaWw7CisgICAgYXRvbWljX2luYygmcFF1ZXVlLT5FbnRyeUNudCk7CisKKyAgICByZXR1cm4gLTE7Cit9IC8qIFFRX1B1c2hUYWlsICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1BRUV9FTlRSWQorUVFfUG9wSGVhZCgKK1BRUV9DT05UQUlORVIgcFF1ZXVlKSB7CisgICAgdW5zaWduZWQgaW50IEhlYWQ7CisgICAgUFFRX0VOVFJZIEVudHJ5OworCisgICAgSGVhZCA9IHBRdWV1ZS0+SGVhZDsKKworI2lmICFkZWZpbmVkKFFRX05PX1VOREVSRkxPV19DSEVDSykKKyAgICBpZihIZWFkID09IHBRdWV1ZS0+VGFpbCkgeworICAgICAgICByZXR1cm4gKFBRUV9FTlRSWSkgMDsKKyAgICB9IC8qIGlmICovCisjZW5kaWYgLyogUVFfTk9fVU5ERVJGTE9XX0NIRUNLICovCisKKyAgICBpZihIZWFkID09IDApIHsKKyAgICAgICAgSGVhZCA9IHBRdWV1ZS0+U2l6ZTsKKyAgICB9IC8qIGlmICovCisgICAgSGVhZC0tOworCisgICAgRW50cnkgPSBwUXVldWUtPkFycmF5W0hlYWRdOworICAgIG1lbWJhcigpOworCisgICAgcFF1ZXVlLT5IZWFkID0gSGVhZDsKKyAgICBhdG9taWNfZGVjKCZwUXVldWUtPkVudHJ5Q250KTsKKworICAgIHJldHVybiBFbnRyeTsKK30gLyogUVFfUG9wSGVhZCAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitQUVFfRU5UUlkKK1FRX1BvcFRhaWwoCitQUVFfQ09OVEFJTkVSIHBRdWV1ZSkgeworICAgIHVuc2lnbmVkIGludCBUYWlsOworICAgIFBRUV9FTlRSWSBFbnRyeTsKKworICAgIFRhaWwgPSBwUXVldWUtPlRhaWw7CisKKyNpZiAhZGVmaW5lZChRUV9OT19VTkRFUkZMT1dfQ0hFQ0spCisgICAgaWYoVGFpbCA9PSBwUXVldWUtPkhlYWQpIHsKKyAgICAgICAgcmV0dXJuIChQUVFfRU5UUlkpIDA7CisgICAgfSAvKiBpZiAqLworI2VuZGlmIC8qIFFRX05PX1VOREVSRkxPV19DSEVDSyAqLworCisgICAgRW50cnkgPSBwUXVldWUtPkFycmF5W1RhaWxdOworICAgIG1lbWJhcigpOworICAgIHBRdWV1ZS0+VGFpbCA9IChUYWlsICsgMSkgJSBwUXVldWUtPlNpemU7CisgICAgYXRvbWljX2RlYygmcFF1ZXVlLT5FbnRyeUNudCk7CisKKyAgICByZXR1cm4gRW50cnk7Cit9IC8qIFFRX1BvcFRhaWwgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworUFFRX0VOVFJZCitRUV9HZXRIZWFkKAorICAgIFBRUV9DT05UQUlORVIgcFF1ZXVlLAorICAgIHVuc2lnbmVkIGludCBJZHgpCit7CisgICAgaWYoSWR4ID49IGF0b21pY19yZWFkKCZwUXVldWUtPkVudHJ5Q250KSkKKyAgICB7CisgICAgICAgIHJldHVybiAoUFFRX0VOVFJZKSAwOworICAgIH0KKworICAgIGlmKHBRdWV1ZS0+SGVhZCA+IElkeCkKKyAgICB7CisgICAgICAgIElkeCA9IHBRdWV1ZS0+SGVhZCAtIElkeDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgSWR4ID0gcFF1ZXVlLT5TaXplIC0gKElkeCAtIHBRdWV1ZS0+SGVhZCk7CisgICAgfQorICAgIElkeC0tOworCisgICAgcmV0dXJuIHBRdWV1ZS0+QXJyYXlbSWR4XTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworUFFRX0VOVFJZCitRUV9HZXRUYWlsKAorICAgIFBRUV9DT05UQUlORVIgcFF1ZXVlLAorICAgIHVuc2lnbmVkIGludCBJZHgpCit7CisgICAgaWYoSWR4ID49IGF0b21pY19yZWFkKCZwUXVldWUtPkVudHJ5Q250KSkKKyAgICB7CisgICAgICAgIHJldHVybiAoUFFRX0VOVFJZKSAwOworICAgIH0KKworICAgIElkeCArPSBwUXVldWUtPlRhaWw7CisgICAgaWYoSWR4ID49IHBRdWV1ZS0+U2l6ZSkKKyAgICB7CisgICAgICAgIElkeCA9IElkeCAtIHBRdWV1ZS0+U2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gcFF1ZXVlLT5BcnJheVtJZHhdOworfQorCisjZW5kaWYJLyogQ0ZHX0NNRF9ORVQsICFDT05GSUdfTkVUX01VTFRJLCBDT05GSUdfQkNNNTcweCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbWRfZGlzay5oIGIvaW5jbHVkZS9jbWRfZGlzay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYmRiMzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NtZF9kaXNrLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogSGFyZGRpc2sgc3VwcG9ydAorICovCisjaWZuZGVmCV9DTURfRElTS19ICisjZGVmaW5lCV9DTURfRElTS19ICisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisKKy8qCisgKiBUeXBlIHN0cmluZyBmb3IgUFBDIGJvb3RhYmxlIHBhcnRpdGlvbnMKKyAqLworI2RlZmluZSBCT09UX1BBUlRfVFlQRQkiVS1Cb290IgorCisjaWYgMAorCit0eXBlZGVmCXN0cnVjdCBkaXNrX3BhcnRpdGlvbiB7CisJdWxvbmcJc3RhcnQ7CQkvKiAjIG9mIGZpcnN0IGJsb2NrIGluIHBhcnRpdGlvbgkqLworCXVsb25nCXNpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHBhcnRpdGlvbgkqLworCXVsb25nCWJsa3N6OwkJLyogYmxvY2sgc2l6ZSBpbiBieXRlcwkJCSovCisJdWNoYXIJbmFtZVszMl07CS8qIHBhcnRpdGlvbiBuYW1lCQkJKi8KKwl1Y2hhcgl0eXBlWzMyXTsJLyogc3RyaW5nIHR5cGUgZGVzY3JpcHRpb24JCSovCit9IGRpc2tfcGFydGl0aW9uX3Q7CisKK2ludCBnZXRfcGFydGl0aW9uX2luZm8gICAgIChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKTsKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgoraW50IGdldF9wYXJ0aXRpb25faW5mb19tYWMgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0RPU19QQVJUSVRJT04KK2ludCBnZXRfcGFydGl0aW9uX2luZm9fZG9zIChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKTsKKyNlbmRpZgorI2VuZGlmCS8qIDAgKi8KKworI2VuZGlmCS8qIF9DTURfRElTS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQU1YODYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvQU1YODYwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwY2QwOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9BTVg4NjAuaApAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogYm9hcmQvY29uZmlnLmggLSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGJvYXJkIHNwZWNpZmljCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKworI2RlZmluZSBDT05GSUdfTVBDODYwCQkxCisjZGVmaW5lIENPTkZJR19BTVg4NjAJCTEKKworI3VuZGVmCUNPTkZJR184eHhfQ09OU19TTUMxCQkvKiBDb25zb2xlIGlzIG9uIFNDQzIJCSovCisjdW5kZWYJQ09ORklHXzh4eF9DT05TX1NNQzIKKyNkZWZpbmUJQ09ORklHXzh4eF9DT05TX1NDQzIJMQorI3VuZGVmCUNPTkZJR184eHhfQ09OU19OT05FCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAorI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLworCisjZGVmaW5lIE1QQzhYWF9GQUNUCQkxMAkJLyogTXVsdGlwbHkgYnkgMTAJKi8KKyNkZWZpbmUgTVBDOFhYX1hJTgkJNTAwMDAwMAkJCS8qIDUgTUh6IGluCSovCisjZGVmaW5lIE1QQzhYWF9IWiAoKE1QQzhYWF9YSU4pICogKE1QQzhYWF9GQUNUKSkKKworI2RlZmluZQlDT05GSUdfQ0xPQ0tTX0lOX01IWgkxCS8qIGNsb2NrcyBwYXNzc2VkIHRvIExpbnV4IGluIE1IeiAqLworCisjaWYgMAorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCS0xCS8qIGF1dG9ib290IGRpc2FibGVkCQkqLworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLworI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECQkJCQkJCVwKKwkiYm9vdHA7IgkJCQkJCQkJXAorCSJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyBuZnNyb290PSQoc2VydmVyaXApOiQocm9vdHBhdGgpICIJXAorCSJpcD0kKGlwYWRkcik6JChzZXJ2ZXJpcCk6JChnYXRld2F5aXApOiQobmV0bWFzayk6JChob3N0bmFtZSk6Om9mZjsiCVwKKwkiYm9vdG0iCQkJCS8qIGF1dG9ib290IGNvbW1hbmQgKi8KKworI3VuZGVmIENPTkZJR19CT09UQVJHUworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLworI2RlZmluZQlDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLworI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCisjZGVmaW5lIENPTkZJR19LR0RCX0lOREVYCTEJLyogd2hpY2ggc2VyaWFsIGNoYW5uZWwgZm9yIGtnZGIgKi8KKyNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJOTYwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCBhdCAqLworI2VuZGlmCisKKworI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLworCisjZGVmaW5lCUNPTkZJR19TQ0MxX0VORVQJMQkvKiB1c2UgU0NDMSBldGhlcm5ldCAqLworCisjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLworCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAorCQkJCUNGR19DTURfREhDUAl8IFwKKwkJCQlDRkdfQ01EX0RBVEUJKQorCisjZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisKKy8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KKyNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUJQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbHNlCisjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2VuZGlmCisjZGVmaW5lCUNGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZQlDRkdfTUFYQVJHUwkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDEwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwMjAwMDAwCS8qIDEgLi4uIDQgTUIgaW4gRFJBTQkqLworCisjZGVmaW5lIENGR19MT0FEX0FERFIJIAkweDAwMTAwMDAwCisKKyNkZWZpbmUJQ0ZHX0haCQkxMDAwCQkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzCSovCisKKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKworLyoKKyAqIExvdyBMZXZlbCBDb25maWd1cmF0aW9uIFNldHRpbmdzCisgKiAoYWRkcmVzcyBtYXBwaW5ncywgcmVnaXN0ZXIgaW5pdGlhbCB2YWx1ZXMsIGV0Yy4pCisgKiBZb3Ugc2hvdWxkIGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGlmIHlvdSBtYWtlIGNoYW5nZXMgaGVyZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbnRlcm5hbCBNZW1vcnkgTWFwcGVkIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQ0ZHX0lNTVIJCQkweEZGMDAwMDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYSAoaW4gRFBSQU0pCisgKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJQ0ZHX0lNTVIKKyNkZWZpbmUJQ0ZHX0lOSVRfUkFNX0VORAkweDJGMDAJLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBEUFJBTQkqLworI2RlZmluZQlDRkdfR0JMX0RBVEFfU0laRQk2NCAgLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUJQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhcnQgYWRkcmVzc2VzIGZvciB0aGUgZmluYWwgbWVtb3J5IGNvbmZpZ3VyYXRpb24KKyAqIChTZXQgdXAgYnkgdGhlIHN0YXJ0dXAgY29kZSkKKyAqIFBsZWFzZSBub3RlIHRoYXQgQ0ZHX1NEUkFNX0JBU0UgX211c3RfIHN0YXJ0IGF0IDAKKyAqLworI2RlZmluZQlDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHg0MDAwMDAwMAorI2lmIGRlZmluZWQoREVCVUcpCisjZGVmaW5lCUNGR19NT05JVE9SX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IJKi8KKyNlbHNlCisjZGVmaW5lCUNGR19NT05JVE9SX0xFTgkJKDE5MiA8PCAxMCkJLyogUmVzZXJ2ZSAxOTIga0IgZm9yIE1vbml0b3IJKi8KKyNlbmRpZgorI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCUNGR19GTEFTSF9CQVNFCisjZGVmaW5lCUNGR19NQUxMT0NfTEVOCQkoMTI4IDw8IDEwKQkvKiBSZXNlcnZlIDEyOCBrQiBmb3IgbWFsbG9jKCkJKi8KKworLyoKKyAqIFUtQm9vdCBmb3IgQU1YIGJvYXJkIHN1cHBvcnRzIHR3byB0eXBlcyBvZiBtZW1vcnkgZXh0ZW5zaW9uCisgKiBtb2R1bGVzOiBvbmUgdGhhdCBwcm92aWRlcyA0IE1CIGZsYXNoIG1lbW9yeSwgYW5kIGFub3RoZXIgb25lIHdpdGgKKyAqIDE2IE1CIEVETyBEUkFNLgorICoKKyAqIFRoZSBmbGFzaCBtb2R1bGUgc3dhcHMgdGhlIENTMCBhbmQgQ1MxIHNpZ25hbHM6IGlmIHRoZSBtb2R1bGUgaXMKKyAqIGluc3RhbGxlZCwgQ1MwIGlzIGNvbm5lY3RlZCB0byBGbGFzaCBvbiB0aGUgbW9kdWxlIGFuZCBDUzEgaXMKKyAqIGNvbm5lY3RlZCB0byB0aGUgb24tYm9hcmQgRmxhc2guIFRoaXMgbWVhbnMgdGhhdCB5b3UgbXVzdCBpbnRhbGwKKyAqIFUtQm9vdCB3aGVuIHRoZSBGbGFzaCBtb2R1bGUgaXMgcGx1Z2dlZCBpbiwgaWYgeW91IHBsYW4gdG8gdXNlCisgKiBpdC4KKyAqCisgKiBUbyBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIERSQU0gZXh0ZW5zaW9uIGNhcmQsIENPTkZJR19BTVhfUkFNX0VYVAorICogbXVzdCBiZSBkZWZpbmVkLiBUaGUgRFJBTSBtb2R1bGUgdXNlcyBDUzEuCisgKgorICogT25seSBvbmUgb2YgdGhlc2UgbW9kdWxlcyBtYXkgYmUgaW5zdGFsbGVkIGF0IGEgdGltZS4gSWYgVS1Cb290CisgKiBpcyBjb21waWxlZCB3aXRoIHRoZSBDT05GSUdfQU1YX1JBTV9FWFQgb3B0aW9uIHNldCwgaXQgd2lsbCBub3QKKyAqIHdvcmsgaWYgdGhlIEZsYXNoIGV4dGVuc2lvbiBtb2R1bGUgaXMgaW5zdGFsbGVkIGluc3RlYWQgb2YgdGhlCisgKiBEUkFNIG1vZHVsZS4KKyAqLworI2RlZmluZSBDT05GSUdfQU1YX1JBTV9FWFQJLyogMTZNYiBFeHQuIERSQU0gbW9kdWxlIHN1cHBvcnQgKi8KKworLyoKKyAqIEZvciBib290aW5nIExpbnV4LCB0aGUgYm9hcmQgaW5mbyBhbmQgY29tbWFuZCBsaW5lIGRhdGEKKyAqIGhhdmUgdG8gYmUgaW4gdGhlIGZpcnN0IDggTUIgb2YgbWVtb3J5LCBzaW5jZSB0aGlzIGlzCisgKiB0aGUgbWF4aW11bSBtYXBwZWQgYnkgdGhlIExpbnV4IGtlcm5lbCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKgorICogVXNlIDQgTUIgZm9yIHdpdGhvdXQgYW5kIDggTUIgd2l0aCAxNiBNQiBEUkFNIGV4dGVuc2lvbiBtb2R1bGUKKyAqIChDT05GSUdfQU1YX1JBTV9FWFQpCisgKi8KKyNpZmRlZiBDT05GSUdfQU1YX1JBTV9FWFQKKyMgZGVmaW5lCUNGR19CT09UTUFQU1oJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXgJKi8KKyNlbHNlCisjIGRlZmluZQlDRkdfQk9PVE1BUFNaCSg0IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4CSovCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZMQVNIIG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMgkvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcwkJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTM1CS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKyNkZWZpbmUJQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCisjZGVmaW5lCUNGR19FTlZfT0ZGU0VUCQkweDgwMDAJLyogICBPZmZzZXQgICBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKyNkZWZpbmUJQ0ZHX0VOVl9TSVpFCQkweDQwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2FjaGUgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTWVBDUiAtIFN5c3RlbSBQcm90ZWN0aW9uIENvbnRyb2wJCQkJCTExLTkKKyAqIFNZUENSIGNhbiBvbmx5IGJlIHdyaXR0ZW4gb25jZSBhZnRlciByZXNldCEKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNvZnR3YXJlICYgQnVzIE1vbml0b3IgVGltZXIgbWF4LCBCdXMgTW9uaXRvciBlbmFibGUsIFNXIFdhdGNoZG9nIGZyZWV6ZQorICovCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisjZGVmaW5lIENGR19TWVBDUgkoU1lQQ1JfU1dUQyB8IFNZUENSX0JNVCB8IFNZUENSX0JNRSB8IFNZUENSX1NXRiB8IFwKKwkJCSBTWVBDUl9TV0UgIHwgU1lQQ1JfU1dSSXwgU1lQQ1JfU1dQKQorI2Vsc2UKKyNkZWZpbmUgQ0ZHX1NZUENSCShTWVBDUl9TV1RDIHwgU1lQQ1JfQk1UIHwgU1lQQ1JfQk1FIHwgU1lQQ1JfU1dGIHwgU1lQQ1JfU1dQKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNJVU1DUiAtIFNJVSBNb2R1bGUgQ29uZmlndXJhdGlvbgkJCQkJMTEtNgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUENNQ0lBIGNvbmZpZy4sIG11bHRpLWZ1bmN0aW9uIHBpbiB0cmktc3RhdGUKKyAqLworI2RlZmluZSBDRkdfU0lVTUNSCShTSVVNQ1JfREJHQzAwIHwgU0lVTUNSX0RCUEMwMCB8IFNJVU1DUl9NTFJDMDEpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRCU0NSIC0gVGltZSBCYXNlIFN0YXR1cyBhbmQgQ29udHJvbAkJCQkJMTEtMjYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENsZWFyIFJlZmVyZW5jZSBJbnRlcnJ1cHQgU3RhdHVzLCBUaW1lYmFzZSBmcmVlemluZyBlbmFibGVkCisgKi8KKyNkZWZpbmUgQ0ZHX1RCU0NSCShUQlNDUl9SRUZBIHwgVEJTQ1JfUkVGQiB8IFRCU0NSX1RCRSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUElTQ1IgLSBQZXJpb2RpYyBJbnRlcnJ1cHQgU3RhdHVzIGFuZCBDb250cm9sCQkxMS0zMQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2xlYXIgUGVyaW9kaWMgSW50ZXJydXB0IFN0YXR1cywgSW50ZXJydXB0IFRpbWVyIGZyZWV6aW5nIGVuYWJsZWQKKyAqLworI2RlZmluZSBDRkdfUElTQ1IJKFBJU0NSX1BTIHwgUElTQ1JfUElURikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUExQUkNSIC0gUExMLCBMb3ctUG93ZXIsIGFuZCBSZXNldCBDb250cm9sIFJlZ2lzdGVyCTE1LTMwCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXQgdGhlIFBMTCwgdGhlIGxvdy1wb3dlciBtb2RlcyBhbmQgdGhlIHJlc2V0IGNvbnRyb2wgKDE1LTI5KQorICovCisjZGVmaW5lIENGR19QTFBSQ1IJKCgoTVBDOFhYX0ZBQ1QtMSkgPDwgUExQUkNSX01GX1NISUZUKSB8CVwKKwkJCQlQTFBSQ1JfU1BMU1MgfCBQTFBSQ1JfVEVYUFMgfCBQTFBSQ1JfVE1JU1QpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNDQ1IgLSBTeXN0ZW0gQ2xvY2sgYW5kIHJlc2V0IENvbnRyb2wgUmVnaXN0ZXIJCTE1LTI3CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTZXQgY2xvY2sgb3V0cHV0LCB0aW1lYmFzZSBhbmQgUlRDIHNvdXJjZSBhbmQgZGl2aWRlciwKKyAqIHBvd2VyIG1hbmFnZW1lbnQgYW5kIHNvbWUgb3RoZXIgaW50ZXJuYWwgY2xvY2tzCisgKi8KKyNkZWZpbmUgU0NDUl9NQVNLCVNDQ1JfRUJERjExCisjZGVmaW5lIENGR19TQ0NSCShTQ0NSX1RCU3xTQ0NSX0NPTTAwfFNDQ1JfREZTWU5DMDB8U0NDUl9ERkJSRzAwfFNDQ1JfREZOTDAwMHxTQ0NSX0RGTkgwMDB8U0NDUl9ERkxDRDAwMHxTQ0NSX0RGQUxDRDAwKQorCisjZGVmaW5lIENGR19ERVIJCTAKKworLyoKKyAqIEluaXQgTWVtb3J5IENvbnRyb2xsZXI6CisgKgorICogQlIwLzEgYW5kIE9SMC8xIChGTEFTSCkKKyAqLworCisjZGVmaW5lIEZMQVNIX0JBU0UwX1BSRUxJTQkweDQwMDAwMDAwCS8qIEZMQVNIIGJhbmsgIzAJKi8KKyNpZm5kZWYgQ09ORklHX0FNWF9SQU1fRVhUCisjZGVmaW5lIEZMQVNIX0JBU0UxX1BSRUxJTQkweDYwMDAwMDAwCS8qIEZMQVNIIGJhbmsgIzEJKi8KKyNlbmRpZgorCisjZGVmaW5lIENGR19SRU1BUF9PUl9BTQkJMHg4MDAwMDAwMAkvKiBPUiBhZGRyIG1hc2sgKi8KKyNkZWZpbmUgQ0ZHX1BSRUxJTV9PUl9BTQkweEZGQzAwMDAwCS8qIE9SIGFkZHIgbWFzayAqLworCisvKiBGTEFTSCB0aW1pbmc6IEFDUyA9IDEwLCBUUkxYID0gMSwgQ1NOVCA9IDEsIFNDWSA9IDMsIEVIVFIgPSAwCSovCisvKgkJCQkgMHgwMDAwMDgwMAkweDAwMDAwNDAwIDB4MDAwMDAxMDAgMHgwMDAwMDAzMCAgICAgMHgwMDAwMDAwNCAqLworI2RlZmluZSBDRkdfT1JfVElNSU5HX0ZMQVNICShPUl9DU05UX1NBTSAgfCBPUl9BQ1NfRElWNCB8IE9SX0JJIHwgT1JfU0NZXzVfQ0xLIHwgT1JfVFJMWCkKKworI2RlZmluZSBDRkdfT1IwX1JFTUFQCShDRkdfUkVNQVBfT1JfQU0gIHwgQ0ZHX09SX1RJTUlOR19GTEFTSCkKKworI2RlZmluZSBDRkdfT1IwX1BSRUxJTQkweEZGQzAwOTU0CS8qIFJlYWwgdmFsdWVzIGZvciB0aGUgYm9hcmQgKi8KKyNkZWZpbmUgQ0ZHX0JSMF9QUkVMSU0JMHg0MDAwMDAwMQkvKiBSZWFsIHZhbHVlcyBmb3IgdGhlIGJvYXJkICovCisKKyNpZm5kZWYgQ09ORklHX0FNWF9SQU1fRVhUCisjZGVmaW5lIENGR19PUjFfUkVNQVAJQ0ZHX09SMF9SRU1BUAorI2RlZmluZSBDRkdfT1IxX1BSRUxJTQkweEZGQzAwOTU0CS8qIFJlYWwgdmFsdWVzIGZvciB0aGUgYm9hcmQgKi8KKyNkZWZpbmUgQ0ZHX0JSMV9QUkVMSU0JMHg2MDAwMDAwMQkvKiBSZWFsIHZhbHVlcyBmb3IgdGhlIGJvYXJkICovCisjZW5kaWYKKworLyogRFNQICgiR2x1ZSIpIFhpbGlueCAqLworI2RlZmluZSBDRkdfT1I2X1BSRUxJTQkweEZGRkY4MDAwCS8qIDMya0IsIDE1IHdhaXRzLCBjcyBhZnRlciBhZGRyLCBubyBidXJzdHMgKi8KKyNkZWZpbmUgQ0ZHX0JSNl9QUkVMSU0JMHg2MDAwMDQwMQkvKiB1c2UgR1BDTSBmb3IgQ1MgZ2VuZXJhdGlvbiwgOCBiaXQgcG9ydCAqLworCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUJQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvU1hOSTg1NVQuaCBiL2luY2x1ZGUvY29uZmlncy9TWE5JODU1VC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjVmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU1hOSTg1NVQuaApAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIFUtQm9vdCBjb25maWd1cmF0aW9uIGZvciBTSVhORVQgU1hOSTg1NVQgQ1BVIGJvYXJkLgorICogVGhpcyBib2FyZCBpcyBiYXNlZCAobG9vc2VseSkgb24gdGhlIE1vdG9yb2xhIEZBRFMgYm9hcmQsIHNvIHRoaXMKKyAqIGZpbGUgaXMgYmFzZWQgKGxvb3NlbHkpIG9uIGNvbmZpZ19GQURTODYwVC5oLCBzZWUgaXQgZm9yIGFkZGl0aW9uYWwKKyAqIGNyZWRpdHMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgRGF2ZSBFbGxpcywgU0lYTkVULCBkZ2VAc2l4bmV0aW8uY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qCisgKiBNZW1vcnkgbWFwOgorICoKKyAqICAgZmYxMDAwMDAgLT4gZmYxM2ZmZmYgOiBGUEdBICAgICAgICBDUzEKKyAqICAgZmYwMzAwMDAgLT4gZmYwM2ZmZmYgOiBFWFBBTlNJT04gICBDUzcKKyAqICAgZmYwMjAwMDAgLT4gZmYwMmZmZmYgOiBEQVRBIEZMQVNIICBDUzQKKyAqICAgZmYwMTgwMDAgLT4gZmYwMWZmZmYgOiBVQVJUIEIgICAgICBDUzYvVVBNQgorICogICBmZjAxMDAwMCAtPiBmZjAxN2ZmZiA6IFVBUlQgQSAgICAgIENTNS9VUE1CCisgKiAgIGZmMDAwMDAwIC0+IGZmMDBmZmZmIDogSU1BUCAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCB0byB0aGUgTVBDODU1VAorICogICBmODAwMDAwMCAtPiBmYmZmZmZmZiA6IEZMQVNIICAgICAgIENTMCAgICAgICAgdXAgdG8gNjRNQgorICogICBmNDAwMDAwMCAtPiBmN2ZmZmZmZiA6IE5WU1JBTSAgICAgIENTMiAgICAgICAgdXAgdG8gNjRNQgorICogICAwMDAwMDAwMCAtPiAwZmZmZmZmZiA6IFNEUkFNICAgICAgIENTMy9VUE1BICAgdXAgdG8gMjU2TUIKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBib2FyZC9jb25maWcuaCAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYm9hcmQgc3BlY2lmaWMKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworI2luY2x1ZGUgPG1wYzh4eF9pcnEuaD4KKworI2RlZmluZSBDT05GSUdfU1hOSTg1NVQJCTEJLyogU0lYTkVUIElQbSA4NTVUIENQVSBtb2R1bGUgKi8KKworLyogVGhlIDg1NVQgaXMganVzdCBhIHN0cmlwcGVkIDg2MFQgYW5kIG5lZWRzIGNvZGUgZm9yIDg2MCwgc28gZm9yIG5vdworICogYXQgbGVhc3QgZGVmaW5lIDg2MCwgODYwVCBhbmQgODU1VAorICovCisjZGVmaW5lIENPTkZJR19NUEM4NjAJCTEKKyNkZWZpbmUgQ09ORklHX01QQzg2MFQJCTEKKyNkZWZpbmUgQ09ORklHX01QQzg1NVQJCTEKKworI2RlZmluZQlDT05GSUdfOHh4X0NPTlNfU01DMQkxCS8qIENvbnNvbGUgaXMgb24gU01DMQkJKi8KKyN1bmRlZglDT05GSUdfOHh4X0NPTlNfU01DMgorI3VuZGVmCUNPTkZJR184eHhfQ09OU19TQ0MxCisjdW5kZWYJQ09ORklHXzh4eF9DT05TX05PTkUKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk5NjAwCisjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCisKKyNkZWZpbmUgTVBDOFhYX0ZBQ1QJCTEwCS8qIDUwIE1IeiBpcyA1IE1IeiBpbiB0aW1lcyAxMAkqLworCisjZGVmaW5lCUNPTkZJR19DTE9DS1NfSU5fTUhaCTEJLyogY2xvY2tzIHBhc3NzZWQgdG8gTGludXggaW4gTUh6ICovCisKKyNpZiAwCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCSovCisjZWxzZQorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzCSovCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIGY4MDQwMDAwIGY4MTAwMDAwIiAvKiBhdXRvYm9vdCBjb21tYW5kICovCisjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9yYW0gaXA9b2ZmIgorCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgkJLyogaGF2ZSBtaXNjX2luaXRfcigpIGZ1bmN0aW9uICovCisjZGVmaW5lIENPTkZJR19CT0FSRF9QT1NUQ0xLX0lOSVQJLyogaGF2ZSBib2FyZF9wb3N0Y2xrX2luaXQoKSBmdW5jdGlvbiAqLworCisjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCisKKyNkZWZpbmUJQ09ORklHX1JUQ19EUzEzMDYJCS8qIERhbGxhcyAxMzA2IHJlYWwgdGltZSBjbG9jawkqLworCisjZGVmaW5lCUNPTkZJR19TT0ZUX0kyQwkJCS8qIEkyQyBiaXQtYmFuZ2VkCQkqLworLyoKKyAqIFNvZnR3YXJlIChiaXQtYmFuZykgSTJDIGRyaXZlciBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgUEJfU0NMCQkweDAwMDAwMDIwCS8qIFBCIDI2ICovCisjZGVmaW5lIFBCX1NEQQkJMHgwMDAwMDAxMAkvKiBQQiAyNyAqLworCisjZGVmaW5lIEkyQ19JTklUCShpbW1yLT5pbV9jcG0uY3BfcGJkaXIgfD0gIFBCX1NDTCkKKyNkZWZpbmUgSTJDX0FDVElWRQkoaW1tci0+aW1fY3BtLmNwX3BiZGlyIHw9ICBQQl9TREEpCisjZGVmaW5lIEkyQ19UUklTVEFURQkoaW1tci0+aW1fY3BtLmNwX3BiZGlyICY9IH5QQl9TREEpCisjZGVmaW5lIEkyQ19SRUFECSgoaW1tci0+aW1fY3BtLmNwX3BiZGF0ICYgUEJfU0RBKSAhPSAwKQorI2RlZmluZSBJMkNfU0RBKGJpdCkJaWYoYml0KSBpbW1yLT5pbV9jcG0uY3BfcGJkYXQgfD0gIFBCX1NEQTsgXAorCQkJZWxzZSAgICBpbW1yLT5pbV9jcG0uY3BfcGJkYXQgJj0gflBCX1NEQQorI2RlZmluZSBJMkNfU0NMKGJpdCkJaWYoYml0KSBpbW1yLT5pbV9jcG0uY3BfcGJkYXQgfD0gIFBCX1NDTDsgXAorCQkJZWxzZSAgICBpbW1yLT5pbV9jcG0uY3BfcGJkYXQgJj0gflBCX1NDTAorI2RlZmluZSBJMkNfREVMQVkJdWRlbGF5KDUpCS8qIDEvNCBJMkMgY2xvY2sgZHVyYXRpb24gKi8KKworIyBkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNTAwMDAKKyMgZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4RkUKKyMgZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFIJMHg1MAkvKiBBdG1lbCAyNEM2NAkJCSovCisjIGRlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTiAyCS8qIHR3byBieXRlIGFkZHJlc3MJCSovCisKKyNkZWZpbmUJQ09ORklHX0ZFQ19FTkVUCQkxCS8qIHVzZSBGRUMgZXRoZXJuZXQgICovCisKKyNkZWZpbmUgQ0ZHX0RJU0NPVkVSX1BIWQorCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9FRVBST00gfCBDRkdfQ01EX0RBVEUpCisKKy8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KKyNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIGEgbGl0dGxlIG1lbW9yeSAqLworI2RlZmluZQlDRkdfUFJPTVBUCQkiPT4iCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZWxzZQorI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNlbmRpZgorI2RlZmluZQlDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUJQ0ZHX01BWEFSR1MJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDAxMDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDQwMDAwMAkvKiAxIC4uLiA0IE1CIGluIERSQU0JKi8KKworI2RlZmluZSBDRkdfTE9BRF9BRERSCSAJMHgwMDEwMDAwMAorCisjZGVmaW5lCUNGR19IWgkJMTAwMAkJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcwkqLworCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKy8qCisgKiBMb3cgTGV2ZWwgQ29uZmlndXJhdGlvbiBTZXR0aW5ncworICogKGFkZHJlc3MgbWFwcGluZ3MsIHJlZ2lzdGVyIGluaXRpYWwgdmFsdWVzLCBldGMuKQorICogWW91IHNob3VsZCBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBpZiB5b3UgbWFrZSBjaGFuZ2VzIGhlcmUuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVybmFsIE1lbW9yeSBNYXBwZWQgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBDRkdfSU1NUgkJMHhGRjAwMDAwMAorI2RlZmluZSBDRkdfSU1NUl9TSVpFCQkoKHVpbnQpKDY0ICogMTAyNCkpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYSAoaW4gRFBSQU0pCisgKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJQ0ZHX0lNTVIKKyNkZWZpbmUJQ0ZHX0lOSVRfUkFNX0VORAkweDJGMDAJLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBEUFJBTQkqLworI2RlZmluZQlDRkdfR0JMX0RBVEFfU0laRQk2NCAgLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUJQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhcnQgYWRkcmVzc2VzIGZvciB0aGUgZmluYWwgbWVtb3J5IGNvbmZpZ3VyYXRpb24KKyAqIChTZXQgdXAgYnkgdGhlIHN0YXJ0dXAgY29kZSkKKyAqIFBsZWFzZSBub3RlIHRoYXQgQ0ZHX1NEUkFNX0JBU0UgX211c3RfIHN0YXJ0IGF0IDAKKyAqLworI2RlZmluZQlDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZQlDRkdfU1JBTV9CQVNFCQkweEY0MDAwMDAwCisjZGVmaW5lCUNGR19TUkFNX1NJWkUJCTB4MDQwMDAwMDAJLyogYXV0b3NpemUgdXAgdG8gNjRNYnl0ZSAqLworCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEY4MDAwMDAwCisjZGVmaW5lIENGR19GTEFTSF9TSVpFCQkoKHVpbnQpKDggKiAxMDI0ICogMTAyNCkpCS8qIG1heCA4TWJ5dGUgKi8KKworI2RlZmluZSBDRkdfREZMQVNIX0JBU0UJCTB4ZmYwMjAwMDAgLyogRGlza09uQ2hpcCBvciBOQU5EIEZMQVNIICovCisjZGVmaW5lIENGR19ERkxBU0hfU0laRQkJMHgwMDAxMDAwMAorCisjZGVmaW5lIENGR19GUEdBX0JBU0UJCTB4RkYxMDAwMDAJLyogWGlsaW54IEZQR0EgKi8KKyNkZWZpbmUgQ0ZHX0ZQR0FfUFJPRwkJMHhGRjEzMDAwMAkvKiBQcm9ncmFtbWluZyBhZGRyZXNzICovCisjZGVmaW5lIENGR19GUEdBX1NJWkUJCTB4MDAwNDAwMDAJLyogMjU2S2lCIHVzYWJsZSAqLworCisjZGVmaW5lCUNGR19NT05JVE9SX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IJKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlDRkdfRkxBU0hfQkFTRQorI2RlZmluZQlDRkdfTUFMTE9DX0xFTgkJKDEyOCA8PCAxMCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIG1hbGxvYygpCSovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lCUNGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4CSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGTEFTSCBvcmdhbml6YXRpb24KKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJCSovCisvKiBJbnRlbCAyOEY2NDAgaGFzIDEzNSwgMTI3IDY0SyBzZWN0b3JzIGluIDhNQiwgKyA4IG1vcmUgZm9yIDhLIGJvb3QgYmxvY2tzLgorICogQU1EIDI5TFY2NDEgaGFzIDEyOCA2NEsgc2VjdG9ycyBpbiA4TUIKKyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMTM1CS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLworCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCisjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpCSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENhY2hlIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU1lQQ1IgLSBTeXN0ZW0gUHJvdGVjdGlvbiBDb250cm9sCQkJCQkxMS05CisgKiBTWVBDUiBjYW4gb25seSBiZSB3cml0dGVuIG9uY2UgYWZ0ZXIgcmVzZXQhCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTb2Z0d2FyZSAmIEJ1cyBNb25pdG9yIFRpbWVyIG1heCwgQnVzIE1vbml0b3IgZW5hYmxlLCBTVyBXYXRjaGRvZyBmcmVlemUKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorI2RlZmluZSBDRkdfU1lQQ1IJKFNZUENSX1NXVEMgfCBTWVBDUl9CTVQgfCBTWVBDUl9CTUUgfCBTWVBDUl9TV0YgfCBcCisJCQkgU1lQQ1JfU1dFICB8IFNZUENSX1NXUkl8IFNZUENSX1NXUCkKKyNlbHNlCisjZGVmaW5lIENGR19TWVBDUgkoU1lQQ1JfU1dUQyB8IFNZUENSX0JNVCB8IFNZUENSX0JNRSB8IFNZUENSX1NXRiB8IFNZUENSX1NXUCkKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTSVVNQ1IgLSBTSVUgTW9kdWxlIENvbmZpZ3VyYXRpb24JCQkJCTExLTYKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBDTUNJQSBjb25maWcuLCBtdWx0aS1mdW5jdGlvbiBwaW4gdHJpLXN0YXRlCisgKi8KKyNkZWZpbmUgQ0ZHX1NJVU1DUgkoU0lVTUNSX0RCR0MwMCB8IFNJVU1DUl9EQlBDMDAgfCBTSVVNQ1JfTUxSQzAxKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUQlNDUiAtIFRpbWUgQmFzZSBTdGF0dXMgYW5kIENvbnRyb2wJCQkJCTExLTI2CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDbGVhciBSZWZlcmVuY2UgSW50ZXJydXB0IFN0YXR1cywgVGltZWJhc2UgZnJlZXppbmcgZW5hYmxlZAorICovCisjZGVmaW5lIENGR19UQlNDUgkoVEJTQ1JfUkVGQSB8IFRCU0NSX1JFRkIgfCBUQlNDUl9UQkUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBJU0NSIC0gUGVyaW9kaWMgSW50ZXJydXB0IFN0YXR1cyBhbmQgQ29udHJvbAkJMTEtMzEKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENsZWFyIFBlcmlvZGljIEludGVycnVwdCBTdGF0dXMsIEludGVycnVwdCBUaW1lciBmcmVlemluZyBlbmFibGVkCisgKi8KKyNkZWZpbmUgQ0ZHX1BJU0NSCShQSVNDUl9QUyB8IFBJU0NSX1BJVEYpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBMUFJDUiAtIFBMTCwgTG93LVBvd2VyLCBhbmQgUmVzZXQgQ29udHJvbCBSZWdpc3RlcgkxNS0zMAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc2V0IHRoZSBQTEwsIHRoZSBsb3ctcG93ZXIgbW9kZXMgYW5kIHRoZSByZXNldCBjb250cm9sICgxNS0yOSkKKyAqLworI2RlZmluZSBDRkdfUExQUkNSCSgoKE1QQzhYWF9GQUNULTEpIDw8IFBMUFJDUl9NRl9TSElGVCkgfAlcCisJCQkJUExQUkNSX1NQTFNTIHwgUExQUkNSX1RFWFBTIHwgUExQUkNSX1RNSVNUKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTQ0NSIC0gU3lzdGVtIENsb2NrIGFuZCByZXNldCBDb250cm9sIFJlZ2lzdGVyCQkxNS0yNworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2V0IGNsb2NrIG91dHB1dCwgdGltZWJhc2UgYW5kIFJUQyBzb3VyY2UgYW5kIGRpdmlkZXIsCisgKiBwb3dlciBtYW5hZ2VtZW50IGFuZCBzb21lIG90aGVyIGludGVybmFsIGNsb2NrcworICovCisjZGVmaW5lIFNDQ1JfTUFTSwlTQ0NSX0VCREYxMQorI2RlZmluZSBDRkdfU0NDUgkoU0NDUl9UQlN8U0NDUl9DT00wMHxTQ0NSX0RGU1lOQzAwfFNDQ1JfREZCUkcwMHxTQ0NSX0RGTkwwMDB8U0NDUl9ERk5IMDAwfFNDQ1JfREZMQ0QwMDB8U0NDUl9ERkFMQ0QwMCkKKworIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjZGVmaW5lIENGR19ERVIJCTAKKworLyogQmVjYXVzZSBvZiB0aGUgd2F5IHRoZSA4NjAgc3RhcnRzIHVwIGFuZCBhc3NpZ25zIENTMCB0aGUKKyAqIGVudGlyZSBhZGRyZXNzIHNwYWNlLCB3ZSBoYXZlIHRvIHNldCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIKKyAqIGRpZmZlcmVudGx5LiAgTm9ybWFsbHksIHlvdSB3cml0ZSB0aGUgb3B0aW9uIHJlZ2lzdGVyCisgKiBmaXJzdCwgYW5kIHRoZW4gZW5hYmxlIHRoZSBjaGlwIHNlbGVjdCBieSB3cml0aW5nIHRoZQorICogYmFzZSByZWdpc3Rlci4gIEZvciBDUzAsIHlvdSBtdXN0IHdyaXRlIHRoZSBiYXNlIHJlZ2lzdGVyCisgKiBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIG9wdGlvbiByZWdpc3Rlci4KKyAqLworCisvKgorICogSW5pdCBNZW1vcnkgQ29udHJvbGxlcjoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQlIwIGFuZCBPUjAgKEZMQVNIKQorICovCisKKyNkZWZpbmUgQ0ZHX1BSRUxJTV9PUjBfQU0JMHhGQzAwMDAwMAkvKiBPUiBhZGRyIG1hc2sgKi8KKworLyogRkxBU0ggdGltaW5nOiBBQ1MgPSAxMCwgVFJMWCA9IDEsIENTTlQgPSAxLCBTQ1kgPSAzLCBFSFRSID0gMAkqLworI2RlZmluZSBDRkdfT1JfVElNSU5HX0ZMQVNICShPUl9DU05UX1NBTSAgfCBPUl9BQ1NfRElWNCB8IE9SX0JJIHwgT1JfU0NZXzNfQ0xLIHwgT1JfVFJMWCkKKworI2RlZmluZSBDRkdfT1IwX1BSRUxJTQkoQ0ZHX1BSRUxJTV9PUjBfQU0gfCBDRkdfT1JfVElNSU5HX0ZMQVNIKQorCisjZGVmaW5lIENPTkZJR19GTEFTSF8xNkJJVAorI2RlZmluZSBDRkdfQlIwX1BSRUxJTQkoKENGR19GTEFTSF9CQVNFICYgQlJfQkFfTVNLKSB8IEJSX1BTXzE2IHwgQlJfViApCisjZGVmaW5lIENGR19GTEFTSF9QUk9URUNUSU9OCS8qIG5lZWQgdG8gbG9jay91bmxvY2sgc2VjdG9ycyBpbiBoYXJkd2FyZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQlIxIGFuZCBPUjEgKEZQR0EpCisgKiBUaGVzZSBwcmVsaW1pbmFyeSB2YWx1ZXMgYXJlIGFsc28gdGhlIGZpbmFsIHZhbHVlcy4KKyAqLworI2RlZmluZSBDRkdfT1JfVElNSU5HX0ZQR0EgXAorCShPUl9DU05UX1NBTSB8IE9SX0FDU19ESVYyIHwgT1JfQkkgfCBPUl9TQ1lfNV9DTEsgfCBPUl9FSFRSKQorI2RlZmluZSBDRkdfQlIxX1BSRUxJTQkoKENGR19GUEdBX0JBU0UgJiBCUl9CQV9NU0spIHwgQlJfUFNfOCB8IEJSX1YgKQorI2RlZmluZSBDRkdfT1IxX1BSRUxJTQkoKCgtQ0ZHX0ZQR0FfU0laRSkgJiBPUl9BTV9NU0spIHwgQ0ZHX09SX1RJTUlOR19GUEdBKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQlI0IGFuZCBPUjQgKGRhdGEgZmxhc2gpCisgKiBUaGVzZSBwcmVsaW1pbmFyeSB2YWx1ZXMgYXJlIGFsc28gdGhlIGZpbmFsIHZhbHVlcy4KKyAqLworI2RlZmluZSBDRkdfT1JfVElNSU5HX0RGTEFTSCBcCisJKE9SX0NTTlRfU0FNIHwgT1JfQUNTX0RJVjQgfCBPUl9CSSB8IE9SX1NDWV81X0NMSyB8IE9SX0VIVFIpCisjZGVmaW5lIENGR19CUjRfUFJFTElNCSgoQ0ZHX0RGTEFTSF9CQVNFICYgQlJfQkFfTVNLKSB8IEJSX1BTXzggfCBCUl9WICkKKyNkZWZpbmUgQ0ZHX09SNF9QUkVMSU0JKCgoLUNGR19ERkxBU0hfU0laRSkgJiBPUl9BTV9NU0spIHwgQ0ZHX09SX1RJTUlOR19ERkxBU0gpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCUjUvNiBhbmQgT1I1LzYgKER1YWwgVUFSVCkKKyAqLworI2RlZmluZSBDRkdfRFVBUlRfU0laRQkweDgwMDAJLyogMzJLIHdpbmRvdywgb25seSB1c2VzIDggYnl0ZXMgKi8KKyNkZWZpbmUgQ0ZHX0RVQVJUQV9CQVNFCTB4ZmYwMTAwMDAKKyNkZWZpbmUgQ0ZHX0RVQVJUQl9CQVNFCTB4ZmYwMTgwMDAKKworI2RlZmluZSBEVUFSVF9NQk1SCTAKKyNkZWZpbmUgRFVBUlRfT1JfVkFMVUUgKE9STUFTSyhDRkdfRFVBUlRfU0laRSkgfCBPUl9HNUxTfCBPUl9CSSkKKyNkZWZpbmUgRFVBUlRfQlJfVkFMVUUgKEJSX01TX1VQTUIgfCBCUl9QU184IHwgQlJfVikKKyNkZWZpbmUgRFVBUlRfQlI1X1ZBTFVFICgoQ0ZHX0RVQVJUQV9CQVNFICYgQlJfQkFfTVNLICkgfCBEVUFSVF9CUl9WQUxVRSkKKyNkZWZpbmUgRFVBUlRfQlI2X1ZBTFVFICgoQ0ZHX0RVQVJUQl9CQVNFICYgQlJfQkFfTVNLICkgfCBEVUFSVF9CUl9WQUxVRSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUJQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCisKKyNkZWZpbmUgQ09ORklHX1JFU0VUX09OX1BBTklDCQkvKiByZXNldCBpZiBzeXN0ZW0gcGFuaWMoKSAqLworCisvKiB0byBwdXQgZW52aXJvbm1lbnQgaW4gRUVST00gKi8KKyNkZWZpbmUJQ0ZHX0VOVl9JU19JTl9FRVBST00JMQorI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJMAkvKiBTdGFydCByaWdodCBhdCBiZWdpbm5pbmcgb2YgTlZSQU0gKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkxMDI0CS8qIFVzZSBvbmx5IGEgcGFydCBvZiBpdCovCisKKyNpZiAxCisjZGVmaW5lIENPTkZJR19CT09UX1JFVFJZX1RJTUUJNjAJLyogYm9vdCBpZiBubyBjb21tYW5kIGluIDYwIHNlY29uZHMgKi8KKyNlbmRpZgorCisjaWYgMQorI2RlZmluZSBDT05GSUdfQVVUT0JPT1RfS0VZRUQJCS8qIHVzZSBrZXkgc3RyaW5ncyB0byBzdG9wIGF1dG9ib290ICovCisjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9QUk9NUFQJCSJhdXRvYm9vdCBpbiAlZCBzZWNvbmRzXG4iCisjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9ERUxBWV9TVFIJImRlbGF5YWJpdCIKKyNkZWZpbmUgQ09ORklHX0FVVE9CT09UX1NUT1BfU1RSCSIgIiAvKiBlYXN5IHRvIHN0b3AgZm9yIG5vdyAqLworI2VuZGlmCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCg==