PGh0bWw+CjxoZWFkPgoJPHRpdGxlPnRlY2huaXF1ZXMuaHRtbDwvdGl0bGU+Cgk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXMuY3NzIj4KCTxzdHlsZT4KCQl1IHsgZm9udC13ZWlnaHQ6ICBub3JtYWw7IHRleHQtZGVjb3JhdGlvbjogIG5vbmU7IH0KCTwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CjxoND5UZWNobmlxdWVzPC9oND4KPGRpdj4KCVRoZSBwcmVwcm9jZXNzb3IgbWV0YXByb2dyYW1taW5nIHRlY2huaXF1ZXMgYXJlIHByZXNlbnRlZCBpbiBleGFtcGxlIGZvcm1hdC4KPC9kaXY+Cgo8aDQ+RXhhbXBsZTx1PiAtIFVzZSBhIGxvY2FsIG1hY3JvIHRvIGF2b2lkIHNtYWxsIHNjYWxlIHJlcGV0aXRpb24uPC91PjwvaDQ+CjxkaXYgY2xhc3M9ImNvZGUiPjxwcmU+CiNkZWZpbmUgQk9PU1RfUFBfREVGKG9wKSAvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovIFwKICAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCwgaW50IG4mZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB2ZWMmbHQ7VCwgbiZndDsgb3BlcmF0b3Igb3AgIyMgPSh2ZWMmbHQ7VCwgbiZndDsgbGhzLCBjb25zdCB2ZWMmbHQ7VCwgbiZndDsmIHJocykgeyBcCiAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgbjsgKytpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgbGhzKGkpIG9wICMjID0gcmhzKGkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgLyoqLwoKQk9PU1RfUFBfREVGKCspCkJPT1NUX1BQX0RFRigtKQpCT09TVF9QUF9ERUYoKikKQk9PU1RfUFBfREVGKC8pCgojdW5kZWYgQk9PU1RfUFBfREVGCjwvcHJlPjwvZGl2Pgo8ZGl2PgoJPGI+VGlwOjwvYj4mbmJzcDsgSXQgaXMgdXN1YWxseSBva2F5IHRvIHVzZSBhIHN0YW5kYXJkIG1hY3JvIG5hbWUgbGlrZSA8Y29kZT5CT09TVF9QUF9ERUY8L2NvZGU+IGZvciB0aGlzIGtpbmQgb2YgY29kZQoJYmVjYXVzZSB0aGUgbWFjcm8gaXMgYm90aCBkZWZpbmVkIGFuZCB1bmRlZmluZWQgaW4gdGhlIGltbWVkaWF0ZSBzaXRlIG9mIGl0cyB1c2UuCjwvZGl2Pgo8ZGl2PgoJPGI+VGlwOjwvYj4mbmJzcDsgSXQgaXMgZWFzaWVyIHRvIHZlcmlmeSBwcm9wZXIgdXNlIG9mIHRoZSBsaW5lIGNvbnRpbnVhdGlvbiBvcGVyYXRvciB3aGVuIHRoZXkgYXJlIGFsaWduZWQuCjwvZGl2Pgo8ZGl2PgoJPGI+Tm90ZXM6PC9iPiZuYnNwOyBZb3UgY2FuIGV4dGVuZCB0aGlzIGV4YW1wbGUgYnkgZGVmaW5pbmcgbW9yZSBhbmQgZGlmZmVyZW50IGtpbmRzIG9mIG9wZXJhdG9ycy4mbmJzcDsKCUJlZm9yZSBkb2luZyBzbywgY29uc2lkZXIgdXNpbmcgdGhlIDxpPmFsZ2VicmFpYyBjYXRlZ29yaWVzPC9pPiB0ZWNobmlxdWUgaW50cm9kdWNlZCBpbiA8YSBocmVmPSIuLi9iaWJsaW9ncmFwaHkuaHRtbCNiYXJ0b24iPltCYXJ0b25dPC9hPgoJb3IgYSA8aT5sYXllcmVkIGFyY2hpdGVjdHVyZTwvaT4gKHNlZSBmb3IgaW5zdGFuY2UgPGEgaHJlZj0iLi4vYmlibGlvZ3JhcGh5Lmh0bWwjY3phcm5lY2tpIj5bQ3phcm5lY2tpXTwvYT4pLiZuYnNwOwoJSG93ZXZlciwgYXQgc29tZSBwb2ludCB5b3UgbXVzdCB0eXBlIHRoZSBvcGVyYXRvciB0b2tlbnMgPGNvZGU+KjwvY29kZT4sIDxjb2RlPi88L2NvZGU+LCA8Y29kZT4rPC9jb2RlPiwgPGNvZGU+LTwvY29kZT4sIGV0Yy4sCgliZWNhdXNlIGl0IGlzIGltcG9zc2libGUgdG8gZ2VuZXJhdGUgdGhlbSB1c2luZyB0ZW1wbGF0ZXMuJm5ic3A7CglUaGUgcmVzdWx0aW5nIDxpPmNhdGVnb3JpY2FsIHJlcGV0aXRpb248L2k+IG9mIHRva2VucyBjYW4gYmUgZWxpbWluYXRlZCBieSB1c2luZyBwcmVwcm9jZXNzb3IgbWV0YXByb2dyYW1taW5nLgo8L2Rpdj4KCjxoND5FeGFtcGxlPHU+IC0gVXNlIEJPT1NUX1BQX0VNUFRZIGFzIGFuIHVudXNlZCBwYXJhbWV0ZXIgaW4gbG9jYWwgbWFjcm8gaW5zdGFudGlhdGlvbnMuPC91PjwvaDQ+CjxkaXYgY2xhc3M9ImNvZGUiPjxwcmU+CiNkZWZpbmUgQk9PU1RfUFBfREVGKGN2KSAvKiAuLi4gKi8gXAogICB0ZW1wbGF0ZSZsdDtjbGFzcyBiYXNlJmd0OyAgICAgICAgICAgIFwKICAgY3YoKSB0eXBlbmFtZSBpbXBsZW1lbnRfc3Vic2NyaXB0X3VzaW5nX2JlZ2luX3N1YnNjcmlwdCZsdDtiYXNlJmd0Ozo6dmFsdWVfdHlwZSYgXAogICBpbXBsZW1lbnRfc3Vic2NyaXB0X3VzaW5nX2JlZ2luX3N1YnNjcmlwdCZsdDtiYXNlJmd0Ozo6b3BlcmF0b3JbXShpbmRleF90eXBlIGkpIGN2KCkgeyBcCiAgICAgIHJldHVybiBiYXNlOjpiZWdpbigpW2ldOyAgICAgXAogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgLyoqLwoKICAgQk9PU1RfUFBfREVGKEJPT1NUX1BQX0VNUFRZKQogICBCT09TVF9QUF9ERUYoQk9PU1RfUFBfSURFTlRJVFkoY29uc3QpKQo8L3ByZT48L2Rpdj4KPGRpdj4KCTxiPkhvdzo8L2I+Jm5ic3A7IEJPT1NUX1BQX0VNUFRZKCkgZXhwYW5kcyB0byBub3RoaW5nIGFuZCBjYW4gYmUgdXNlZCBhcyBhbiB1bnVzZWQgcGFyYW1ldGVyLgo8L2Rpdj4KPGRpdj4KCTxiPk5vdGU6PC9iPiZuYnNwOyBCT09TVF9QUF9FTVBUWSB3aXRoIHRoZSAoKSBuZXZlciBnZXRzIGV4cGFuZGVkLiZuYnNwOwoJVGhlICgpIGlzIG5lY2Vzc2FyeSB0byBpbnZva2UgYSBmdW5jdGlvbi1saWtlIG1hY3JvLgo8L2Rpdj4KPGRpdj4KCTxiPkNhdmVhdDo8L2I+Jm5ic3A7IFlvdSBjYW5ub3Qgc2FmZWx5IHVzZSBjb25jYXRlbmF0aW9uIHdoaWxlIHVzaW5nIEJPT1NUX1BQX0VNUFRZKCkuCjwvZGl2Pgo8ZGl2PgoJPGI+VGlwOjwvYj4mbmJzcDsgT2NjYXNpb25hbGx5LCBvbmUgb3IgdHdvIGxpbmVzIGFyZSBjb25zaWRlcmFibHkgbG9uZ2VyIHRoYW4gdGhlIHJlc3QuJm5ic3A7CglJdCBjYW4gb2Z0ZW4gc2F2ZSBzb21lIHdvcmsgdG8gPGk+bm90PC9pPiBhbGlnbiBhbGwgdGhlIGxpbmUgY29udGludWF0aW9uIG9wZXJhdG9ycyB3aXRob3V0IG1ha2luZyB0aGUgY29kZSB0b28gdW5yZWFkYWJsZS4KPC9kaXY+CjxkaXY+Cgk8Yj5UaXA6PC9iPiZuYnNwOyBVc2Ugc3ludGF4IGhpZ2hsaWdodGluZyBvbiBwcmVwcm9jZXNzb3IgbWV0YXByb2dyYW1taW5nIG1hY3JvIGlkZW50aWZpZXJzIHN1Y2ggYXM6Cgk8dWw+CgkJPGxpPkJPT1NUX1BQX0RFRjwvbGk+CgkJPGxpPkJPT1NUX1BQX0VNUFRZPC9saT4KCQk8bGk+Qk9PU1RfUFBfUkVQRUFUPC9saT4KCQk8bGk+Li4uPC9saT4KCTwvdWw+CglJdCBjYW4gZ3JlYXRseSBpbXByb3ZlIHJlYWRhYmlsaXR5Lgo8L2Rpdj4KCjxoND5FeGFtcGxlPHU+IC0gVXNlIEJPT1NUX1BQX0NBVCBpbnN0ZWFkIG9mICMjIHdoZW4gbmVjZXNzYXJ5LjwvdT48L2g0Pgo8ZGl2IGNsYXNzPSJjb2RlIj48cHJlPgojZGVmaW5lIFNUQVRJQ19BU1NFUlQoZXhwcikgXAogICBlbnVtIHsgQk9PU1RfUFBfQ0FUKHN0YXRpY19jaGVja18sIF9fTElORV9fKSA9IChleHByKSA/IDEgOiAtMSB9OyBcCiAgIHR5cGVkZWYgY2hhciBcCiAgICAgIEJPT1NUX1BQX0NBVChzdGF0aWNfYXNzZXJ0XywgX19MSU5FX18pW0JPT1NUX1BQX0NBVChzdGF0aWNfY2hlY2tfLCBfX0xJTkVfXyldIFwKICAgLyoqLwoKLy8gLi4uCgpTVEFUSUNfQVNTRVJUKHNpemVvZihpbnQpICZsdDs9IHNpemVvZihsb25nKSk7CjwvcHJlPjwvZGl2Pgo8ZGl2PgoJPGI+V2h5OjwvYj4mbmJzcDsgTWFjcm8gZXhwYW5zaW9uIHByb2NlZWRzIHJlY3Vyc2l2ZWx5IGluICJsYXllcnMuIiZuYnNwOwoJVG9rZW4gcGFzdGluZyBwcmV2ZW50cyB0aGUgcHJlcHJvY2Vzc29yIGZyb20gcGVyZm9ybWluZyBtYWNybyBleHBhbnNpb24sCgl0aGVyZWZvcmUgaXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5IHRvIGRlbGF5IHRva2VuIGNvbmNhdGVuYXRpb24uCjwvZGl2PgoKPGg0PkV4YW1wbGU8dT4gLSBVc2UgQk9PU1RfUFBfU1RSSU5HSVpFIGluc3RlYWQgb2YgIyB3aGVuZXZlciBuZWNlc3NhcnkuPC91PjwvaDQ+CjxkaXYgY2xhc3M9ImNvZGUiPjxwcmU+CiNkZWZpbmUgTk9URShzdHIpIFwKICAgbWVzc2FnZShfX0ZJTEVfXyAiKCIgQk9PU1RfUFBfU1RSSU5HSVpFKF9fTElORV9fKSAiKSA6ICIgc3RyKSBcCiAgIC8qKi8KCi8vIC4uLgoKI3ByYWdtYSBOT1RFKCJUQkQhIikKPC9wcmU+PC9kaXY+CjxkaXY+Cgk8Yj5XaHk6PC9iPiZuYnNwOyBNYWNybyBleHBhbnNpb24gcHJvY2VlZHMgcmVjdXJzaXZlbHkgaW4gImxheWVycy4iJm5ic3A7CglTdHJpbmdpemF0aW9uIHByZXZlbnRzIHRoZSBwcmVwcm9jZXNzb3IgZnJvbSBwZXJmb3JtaW5nIG1hY3JvIGV4cGFuc2lvbiwgdGhlcmVmb3JlIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byBkZWxheSBzdHJpbmdpemF0aW9uLgo8L2Rpdj4KCjxoND5FeGFtcGxlPHU+IC0gVXNlIEJPT1NUX1BQX0VOVU1fUEFSQU1TIChhbmQgaXRzIHZhcmlhbnRzKSBvciBCT09TVF9QUF9SRVBFQVQgYW5kIEJPT1NUX1BQX0NPTU1BX0lGIHRvIGF2b2lkIDxpPk88L2k+KDxpPm48L2k+KSByZXBldGl0aW9uIG9uIGxpc3RzIGluIGdlbmVyYWwuPC91PjwvaDQ+CjxkaXYgY2xhc3M9ImNvZGUiPjxwcmU+CnN0cnVjdCBtYWtlX3R5cGVfbGlzdF9lbmQ7Cgp0ZW1wbGF0ZSZsdDsKICAgQk9PU1RfUFBfRU5VTV9QQVJBTVNfV0lUSF9BX0RFRkFVTFQoCiAgICAgIE1BS0VfVFlQRV9MSVNUX01BWF9MRU5HVEgsIAogICAgICBjbGFzcyBULCAKICAgICAgbWFrZV90eXBlX2xpc3RfZW5kCiAgICkKJmd0OwpzdHJ1Y3QgbWFrZV90eXBlX2xpc3QgewogICBwcml2YXRlOgogICAgICBlbnVtIHsgZW5kID0gaXNfc2FtZSZsdDtUMCwgbWFrZV90eXBlX2xpc3RfZW5kJmd0Ozo6dmFsdWUgfTsKICAgcHVibGljOgogICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfaWYmbHQ7CiAgICAgICAgIGVuZCwgdHlwZV9jb25zX2VtcHR5LAogICAgICAgICB0eXBlX2NvbnMmbHQ7CiAgICAgICAgICAgIFQwLAogICAgICAgICAgICB0eXBlbmFtZSB0eXBlX2lubmVyX2lmJmx0OwogICAgICAgICAgICAgICBlbmQsIHR5cGVfaWRlbnRpdHkmbHQ7ZW5kJmd0OywKICAgICAgICAgICAgICAgbWFrZV90eXBlX2xpc3QmbHQ7CiAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX0VOVU1fU0hJRlRFRF9QQVJBTVMoCiAgICAgICAgICAgICAgICAgICAgIE1BS0VfVFlQRV9MSVNUX01BWF9MRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgIFQKICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAmZ3Q7CiAgICAgICAgICAgICZndDs6OnR5cGUKICAgICAgICAgJmd0OwogICAgICAmZ3Q7Ojp0eXBlIHR5cGU7Cn07CjwvcHJlPjwvZGl2Pgo8ZGl2PgoJPGI+SG93OjwvYj4mbmJzcDsgQk9PU1RfUFBfUkVQRUFUIHVzZXMgc2ltdWxhdGVkIHJlY3Vyc2lvbiAocHNldWRvIGNvZGUpOgo8L2Rpdj4KPGRpdj48cHJlPgojZGVmaW5lIEJPT1NUX1BQX1JFUEVBVChuLCBtLCBwKSBCT09TVF9QUF9SRVBFQVQgIyMgbihtLCBwKQoKI2RlZmluZSBCT09TVF9QUF9SRVBFQVQwKG0sIHApCiNkZWZpbmUgQk9PU1RfUFBfUkVQRUFUMShtLCBwKSBtKDAsIHApCiNkZWZpbmUgQk9PU1RfUFBfUkVQRUFUMihtLCBwKSBtKDAsIHApIG0oMSwgcCkKI2RlZmluZSBCT09TVF9QUF9SRVBFQVQzKG0sIHApIEJPT1NUX1BQX1JFUEVBVDIobSwgcCkgbSgyLCBwKQojZGVmaW5lIEJPT1NUX1BQX1JFUEVBVDQobSwgcCkgQk9PU1RfUFBfUkVQRUFUMyhtLCBwKSBtKDMsIHApCi8vIC4uLgo8L3ByZT48L2Rpdj4KPGRpdj4KCTxpPk5vdGU6Jm5ic3A7IFRoaXMgaXMgbm8gbG9uZ2VyIGhvdyBCT09TVF9QUF9SRVBFQVQgaXMgaW1wbGVtZW50ZWQsIHNvIHRoZSBjb2RlIGFib3ZlIGlzIGlsbHVzdHJhdGl2ZSBvbmx5ISZuYnNwOzwvaT4KPC9kaXY+CjxkaXY+CglCT09TVF9QUF9FTlVNX1BBUkFNUyBhbmQgaXRzIHZhcmlhdGlvbnMgdXNlIEJPT1NUX1BQX1JFUEVBVC4mbmJzcDsKCUJPT1NUX1BQX0NPTU1BX0lGKEkpIGV4cGFuZHMgdG8gYSBjb21tYSBpZiBJICE9IDAuJm5ic3A7CglCT09TVF9QUF9JTkMoSSkgZXNzZW50aWFsbHkgZXhwYW5kcyB0byAiSSsxLCIgYW5kIEJPT1NUX1BQX0RFQyhJKSBlc3NlbnRpYWxseSBleHBhbmRzIHRvICJJLTEuIi4KPC9kaXY+Cgo8aDQ+RXhhbXBsZTx1PiAtIFVzZSBhIDxpPmNvbmRpdGlvbmFsIG1hY3JvIGRlZmluaXRpb248L2k+IHRvIGVuYWJsZSB1c2VyIGNvbmZpZ3VyYXRpb24gb2YgY29kZSByZXBldGl0aW9uIGJhc2VkIG9uIG5lZWQgcmF0aGVyIHRoYW4gc29tZSAicmVhc29uYWJsZSIgdXBwZXIgbGltaXQuPC91PjwvaDQ+CjxkaXYgY2xhc3M9ImNvZGUiPjxwcmU+CiNpZm5kZWYgTUFLRV9UWVBFX0xJU1RfTUFYX0xFTkdUSAojZGVmaW5lIE1BS0VfVFlQRV9MSVNUX01BWF9MRU5HVEggOAojZW5kaWYKPC9wcmU+PC9kaXY+CjxkaXY+CglOb3cgdGhlIHVzZXIgY2FuIGNvbmZpZ3VyZSB0aGUgPGNvZGU+bWFrZV90eXBlX2xpc3Q8L2NvZGU+IHByaW1pdGl2ZSB3aXRob3V0IG1vZGlmeWluZyBsaWJyYXJ5IGNvZGUuCjwvZGl2PgoKPGg0PkV4YW1wbGU8dT4gLSBVc2UgQk9PU1RfUFBfUkVQRUFUIGFuZCBhIDxpPnRva2VuIGxvb2stdXAgZnVuY3Rpb248L2k+IHRvIGVsaW1pbmF0ZSBjYXRlZ29yaWNhbCByZXBldGl0aW9uLjwvdT48L2g0Pgo8ZGl2IGNsYXNzPSJjb2RlIj48cHJlPgovLyBDQVZFQVQ6ICBNeSBjb21waWxlciBpcyBub3Qgc3RhbmRhcmQgb24gYXJpdGhtZXRpYyB0eXBlcy4KI2RlZmluZSBBUklUSE1FVElDX1RZUEUoSSkgQVJJVEhNRVRJQ19UWVBFICMjIEkKCiNkZWZpbmUgQVJJVEhNRVRJQ19UWVBFMCAgICBib29sCiNkZWZpbmUgQVJJVEhNRVRJQ19UWVBFMSAgICBjaGFyCiNkZWZpbmUgQVJJVEhNRVRJQ19UWVBFMiAgICBzaWduZWQgY2hhcgojZGVmaW5lIEFSSVRITUVUSUNfVFlQRTMgICAgdW5zaWduZWQgY2hhcgojZGVmaW5lIEFSSVRITUVUSUNfVFlQRTQgICAgc2hvcnQKI2RlZmluZSBBUklUSE1FVElDX1RZUEU1ICAgIHVuc2lnbmVkIHNob3J0CiNkZWZpbmUgQVJJVEhNRVRJQ19UWVBFNiAgICBpbnQKI2RlZmluZSBBUklUSE1FVElDX1RZUEU3ICAgIHVuc2lnbmVkIGludAojZGVmaW5lIEFSSVRITUVUSUNfVFlQRTggICAgbG9uZwojZGVmaW5lIEFSSVRITUVUSUNfVFlQRTkgICAgdW5zaWduZWQgbG9uZwojZGVmaW5lIEFSSVRITUVUSUNfVFlQRTEwICAgZmxvYXQKI2RlZmluZSBBUklUSE1FVElDX1RZUEUxMSAgIGRvdWJsZQojZGVmaW5lIEFSSVRITUVUSUNfVFlQRTEyICAgbG9uZyBkb3VibGUKCiNkZWZpbmUgQVJJVEhNRVRJQ19UWVBFX0NOVCAxMwoKLy8gLi4uCgojZGVmaW5lIEJPT1NUX1BQX0RFRih6LCBJLCBfKSAvKiAuLi4gKi8gXAogICBjYXRjaCAoQVJJVEhNRVRJQ19UWVBFKEkpIHQpIHsgICAgICAgXAogICAgICByZXBvcnRfdHlwZWlkKHQpOyAgICAgICAgICAgICAgICAgXAogICAgICByZXBvcnRfdmFsdWUodCk7ICAgICAgICAgICAgICAgICAgXAogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAvKiovCgpCT09TVF9QUF9SRVBFQVQoQVJJVEhNRVRJQ19UWVBFX0NOVCwgQk9PU1RfUFBfREVGLCBfKQoKI3VuZGVmIEJPT1NUX1BQX0RFRgo8L3ByZT48L2Rpdj4KPGRpdj4KCTxiPk5vdGU6PC9iPiZuYnNwOyBUaGUgcmVwZXRpdGlvbiBvZiB0aGUgYWJvdmUgZXhhbXBsZSBjYW4gYmUgZWxpbWluYXRlZCB1c2luZyB0ZW1wbGF0ZSBtZXRhcHJvZ3JhbW1pbmcgPGEgaHJlZj0iLi4vYmlibGlvZ3JhcGh5Lmh0bWwjY3phcm5lY2tpIj5bQ3phcm5lY2tpXTwvYT4gYXMgd2VsbC4mbmJzcDsKCUhvd2V2ZXIgY2F0ZWdvcmljYWwgcmVwZXRpdGlvbiBvZiBvcGVyYXRvciB0b2tlbnMgY2Fubm90IGJlIGNvbXBsZXRlbHkgZWxpbWluYXRlZCBieSB1c2luZyB0ZW1wbGF0ZSBtZXRhcHJvZ3JhbW1pbmcuCjwvZGl2PgoKPGg0PkV4YW1wbGU8dT4gLSBVc2UgQk9PU1RfUFBfUkVQRUFUIHRvIGF2b2lkIDxpPk88L2k+KDxpPm48L2k+KjxpPm48L2k+KSByZXBldGl0aW9uLjwvdT48L2g0Pgo8ZGl2IGNsYXNzPSJjb2RlIj48cHJlPgojaWZuZGVmIE1BWF9WRUNfQVJHX0NOVAojZGVmaW5lIE1BWF9WRUNfQVJHX0NOVCA4CiNlbmRpZgoKLy8gLi4uCgojZGVmaW5lIEFSR19GVU4oeiwgaSwgXykgQk9PU1RfUFBfQ09NTUFfSUYoaSkgVCBhICMjIGkKI2RlZmluZSBBU1NJR05fRlVOKHosIGksICkgKCp0aGlzKVtpXSA9IGEgIyMgaTsKCiNkZWZpbmUgREVGX1ZFQ19DVE9SX0ZVTih6LCBpLCBfKSAvKiAuLi4gKi8gXAogICB2ZWMoQk9PU1RfUFBfUkVQRUFUKGksIEFSR19GVU4sIF8pKSB7IFwKICAgICAgQk9PU1RfUFBfUkVQRUFUKGksIEFTU0lHTl9GVU4sIF8pICBcCiAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAvKiovCgpCT09TVF9QUF9SRVBFQVQoQk9PU1RfUFBfSU5DKE1BWF9WRUNfQVJHX0NOVCksIERFRl9WRUNfQ1RPUl9GVU4sIF8pCgojdW5kZWYgQVJHX0ZVTgojdW5kZWYgQVNTSUdOX0ZVTgojdW5kZWYgREVGX1ZFQ19DVE9SX0ZVTgoKLy8gLi4uCjwvcHJlPjwvZGl2Pgo8ZGl2PgoJPGI+SG93OjwvYj4mbmJzcDsgQk9PU1RfUFBfUkVQRUFUIGlzIGltcGxlbWVudGVkIGlzIGEgc3BlY2lhbCB3YXkgdG8gZW5hYmxlIDxpPmF1dG9tYXRpYyByZWN1cnNpb248L2k+Lgo8L2Rpdj4KCjxoND5FeGFtcGxlPHU+IC0gVXNlIEJPT1NUX1BQX0lGIHRvIGltcGxlbWVudCBzcGVjaWFsIGNhc2UgZm9yIHRoZSBmaXJzdCBlbGVtZW50LjwvdT48L2g0Pgo8ZGl2IGNsYXNzPSJjb2RlIj48cHJlPgojZGVmaW5lIENPTU1BX0lGKGMpIFwKICAgQk9PU1RfUFBfSUYoYywgQk9PU1RfUFBfQ09NTUEsIEJPT1NUX1BQX0VNUFRZKSgpIFwKICAgLyoqLwoKQk9PU1RfUFBfSUYoMCwgdHJ1ZSwgZmFsc2UpID09IGZhbHNlOwpCT09TVF9QUF9JRigxLCB0cnVlLCBmYWxzZSkgPT0gdHJ1ZTsKPC9wcmU+PC9kaXY+CjxkaXY+CglCT09TVF9QUF9JRiBlbmFibGVzIGNvbnZlbmllbnQgZ2VuZXJhdGlvbiBvZiBsaXN0cyB1c2luZyBCT09TVF9QUF9SRVBFQVQuCjwvZGl2Pgo8ZGl2PgoJPGI+Tm90ZTo8L2I+Jm5ic3A7IDxpPlRIRU48L2k+IGFuZCA8aT5FTFNFPC9pPiBkb24ndCBoYXZlIHRvIGJlIG1hY3Jvcy4mbmJzcDsKCUhvd2V2ZXIsIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIGEgZnVuY3Rpb24tbGlrZSBtYWNybywgYW5kIHlvdSB3YW50IGl0IGJlIGV4cGFuZGVkIGNvbmRpdGlvbmFsbHksCgl5b3UgaGF2ZSB0byBtYWtlIHRoZSBvdGhlciBwYXJhbWV0ZXIgYSBmdW5jdGlvbi1saWtlIG1hY3JvIHRvby4mbmJzcDsKCVRoaXMgY2FuIG9mdGVuIGJlIGRvbmUgdXNpbmcgQk9PU1RfUFBfSURFTlRJVFkuJm5ic3A7CglDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGUgKGJ5IEFsZWtzZXkgR3VydG92b3kpOgo8L2Rpdj4KPGRpdj48cHJlPgojZGVmaW5lIE5VTUJFUkVEX0VYUFJFU1NJT04oaSwgeCkgLyogLi4uICovIFwKICAgQk9PU1RfUFBfSUYoICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBCT09TVF9QUF9JREVOVElUWSh4ICMjIGkpICAgICAgICAgICAgIFwKICAgICAgQk9PU1RfUFBfRU1QVFkgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICkoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAvKiovCjwvcHJlPjwvZGl2Pgo8ZGl2PgoJPGI+Tm90ZTo8L2I+Jm5ic3A7IExpa2UgaW4gdGhlIGFib3ZlIGltcGxlbWVudGF0aW9uIG9mIENPTU1BX0lGLCB0aGUgcmVzdWx0IG9mIEJPT1NUX1BQX0lGIGlzIG9mdGVuIGludm9rZWQgYW5kIG5vdCB0aGUgPGk+VEhFTjwvaT4gYW5kIDxpPkVMU0U8L2k+IHBhcmFtZXRlcnMuJm5ic3A7CglJZiB0aGUgcGFyYW1ldGVycyB3ZXJlIGludm9rZWQsIHRoZSBjb2RlIHdvdWxkIG5vdCBleHBhbmQgY29ycmVjdGx5LCBiZWNhdXNlIHRoZSBCT09TVF9QUF9FTVBUWSBwYXJhbWV0ZXIgd291bGQgZ2V0IGV4cGFuZGVkCgl0byBub3RoaW5nIGJlZm9yZSB0aGUgPGI+Qk9PU1RfUFBfSUY8L2I+IHdvdWxkIGJlIHByb3Blcmx5IGV4cGFuZGVkLgo8L2Rpdj4KPGRpdj4KCTxiPkhvdzo8L2I+Jm5ic3A7IEJPT1NUX1BQX0lGIGlzIGRlZmluZWQgZm9yIHRoZSBlbnRpcmUgcmVwZWF0IHJhbmdlIChwc3VlZG8gY29kZSk6CjwvZGl2Pgo8ZGl2PjxwcmU+CiNkZWZpbmUgQk9PU1RfUFBfSUYoYywgVEhFTiwgRUxTRSkgQk9PU1RfUFBfSUYgIyMgYyhUSEVOLCBFTFNFKQoKI2RlZmluZSBCT09TVF9QUF9JRjAoVEhFTiwgRUxTRSkgRUxTRQojZGVmaW5lIEJPT1NUX1BQX0lGMShUSEVOLCBFTFNFKSBUSEVOCiNkZWZpbmUgQk9PU1RfUFBfSUYxKFRIRU4sIEVMU0UpIFRIRU4KLy8gLi4uCjwvcHJlPjwvZGl2PgoKPGg0PkV4YW1wbGU6PHU+Jm5ic3A7IFVzZSBhcml0aG1ldGljLCBsb2dpY2FsLCBhbmQgY29tcGFyaXNvbiBvcGVyYXRpb25zIHdoZW4gbmVjZXNzYXJ5LjwvdT48L2g0Pgo8ZGl2IGNsYXNzPSJjb2RlIj48cHJlPgojZGVmaW5lIFNQRUNJQUxfTlVNQkVSRURfTElTVChuLCBpLCBlbGVtLCBzcGVjaWFsKSBcCiAgIEJPT1NUX1BQX0FTU0VSVF9NU0coICAgICAgICAgICAgICAgICAgICAgXAogICAgICBCT09TVF9QUF9MRVNTKGksIG4pLCAgICAgICAgICAgICAgICAgIFwKICAgICAgYmFkIHBhcmFtcyBmb3IgU1BFQ0lBTF9OVU1CRVJFRF9MSVNUISBcCiAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBCT09TVF9QUF9FTlVNX1BBUkFNUyhpLCBlbGVtKSAgICAgICAgICAgIFwKICAgQk9PU1RfUFBfQ09NTUFfSUYoaSkgc3BlY2lhbCAgICAgICAgICAgICBcCiAgIEJPT1NUX1BQX1JFUEVBVCggICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBCT09TVF9QUF9TVUIoQk9PU1RfUFBfREVDKG4pLCBpKSwgICAgIFwKICAgICAgU1BFQ0lBTF9OVU1CRVJFRF9MSVNUX0hFTFBFUiwgICAgICAgICBcCiAgICAgIChlbGVtLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgLyoqLwoKI2RlZmluZSBTUEVDSUFMX05VTUJFUkVEX0xJU1RfSEVMUEVSKHosIGksIGVsZW1fYmFzZSkgXAogICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBCT09TVF9QUF9DQVQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBCT09TVF9QUF9UVVBMRV9FTEVNKDIsIDAsIGVsZW1fYmFzZSksICAgXAogICAgICBCT09TVF9QUF9BREQoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBCT09TVF9QUF9UVVBMRV9FTEVNKDIsIDEsIGVsZW1fYmFzZSkgXAogICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAvKiovCgpTUEVDSUFMX05VTUJFUkVEX0xJU1QoMywgMCwgRSwgUykKU1BFQ0lBTF9OVU1CRVJFRF9MSVNUKDMsIDEsIEUsIFMpClNQRUNJQUxfTlVNQkVSRURfTElTVCgzLCAyLCBFLCBTKQpTUEVDSUFMX05VTUJFUkVEX0xJU1QoMywgMywgRSwgUykKPC9wcmU+PC9kaXY+Cgo8aHIgc2l6ZT0iMSI+CjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAwcHg7Ij4KCTxpPqkgQ29weXJpZ2h0IDxhIGhyZWY9Imh0dHA6Ly93d3cuaG91c2VtYXJxdWUuY29tIiB0YXJnZXQ9Il90b3AiPkhvdXNlbWFycXVlIE95PC9hPiAyMDAyPC9pPgo8L2Rpdj4KPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDBweDsiPgpQZXJtaXNzaW9uIHRvIGNvcHksIHVzZSwgbW9kaWZ5LCBzZWxsIGFuZCBkaXN0cmlidXRlIHRoaXMgZG9jdW1lbnQgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLiZuYnNwOwpUaGlzIGRvY3VtZW50IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkgYW5kIHdpdGggbm8gY2xhaW0gYXMgdG8gaXRzIHN1aXRhYmlsaXR5IGZvciBhbnkgcHVycG9zZS4KPC9kaXY+Cgk8aHIgc2l6ZT0iMSI+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMHB4OyI+CgkJPGk+qSBDb3B5cmlnaHQgPGEgaHJlZj0iaHR0cDovL3d3dy5ob3VzZW1hcnF1ZS5jb20iIHRhcmdldD0iX3RvcCI+SG91c2VtYXJxdWUgT3k8L2E+IDIwMDI8L2k+CgkJPC9icj48aT6pIENvcHlyaWdodCBQYXVsIE1lbnNvbmlkZXMgMjAwMjwvaT4KCTwvZGl2PgoJPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDBweDsiPgoJCTxwPjxzbWFsbD5EaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKCQlhY2NvbXBhbnlpbmcgZmlsZSA8YSBocmVmPSIuLi8uLi8uLi8uLi9MSUNFTlNFXzFfMC50eHQiPkxJQ0VOU0VfMV8wLnR4dDwvYT4gb3IKCQljb3B5IGF0IDxhIGhyZWY9CgkJImh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCI+d3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ8L2E+KTwvc21hbGw+PC9wPgoJPC9kaXY+CjwvYm9keT4KPC9odG1sPgo=