LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChjKSBDb3B5cmlnaHQgMjAwOS0yMDE1IE1pY3Jvc2VtaSBTb0MgUHJvZHVjdHMgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICogDQogKiBDb3JlSTJDIHNvZnR3YXJlIGRyaXZlciBBcHBsaWNhdGlvbiBQcm9ncmFtbWluZyBJbnRlcmZhY2UuDQogKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5lcyBhbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGFsbG93aW5nIHRvIGludGVyZmFjZQ0KICogd2l0aCB0aGUgQ29yZUkyQyBzb2Z0d2FyZSBkcml2ZXIuDQogKiANCiAqIFNWTiAkUmV2aXNpb246IDc5ODQgJA0KICogU1ZOICREYXRlOiAyMDE1LTEwLTEyIDEyOjA3OjQwICswNTMwIChNb24sIDEyIE9jdCAyMDE1KSAkDQogKi8NCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovLyoqDQogIEBtYWlucGFnZSBDb3JlSTJDIEJhcmUgTWV0YWwgRHJpdmVyLg0KICAgVGhlIENvcmVJMkMgYmFyZSBtZXRhbCBzb2Z0d2FyZSBkcml2ZXIgc3VwcG9ydHMgSTJDIG1hc3RlciBhbmQgc2xhdmUNCiAgIG9wZXJhdGlvbnMuDQoNCiAgQHNlY3Rpb24gaW50cm9fc2VjIEludHJvZHVjdGlvbg0KICBUaGUgQ29yZUkyQyBkcml2ZXIgcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGZvciBjb250cm9sbGluZyB0aGUgTWljcm9zZW1pDQogIENvcmVJMkMgaGFyZHdhcmUgSVAuIFRoZSBkcml2ZXIgc3VwcG9ydHMgdXAgdG8gMTYgc2VwYXJhdGUgSTJDIGNoYW5uZWxzIHBlcg0KICBDb3JlSTJDIGluc3RhbmNlLCB3aXRoIGNvbW1vbiBzbGF2ZSBhZGRyZXNzIHNldHRpbmdzIHNoYXJlZCBiZXR3ZWVuIGNoYW5uZWxzDQogIG9uIGEgZGV2aWNlLg0KICANCiAgT3B0aW9uYWwgZmVhdHVyZXMgb2YgdGhlIENvcmVJMkMgYWxsb3cgaXQgb3BlcmF0ZSB3aXRoIEkyQyBiYXNlZCBwcm90b2NvbHMNCiAgc3VjaCBhcyBTeXN0ZW0gTWFuYWdlbWVudCBCdXMgKFNNQnVzKSwgUG93ZXIgTWFuYWdlbWVudCBCdXMgKFBNQnVzKSBhbmQNCiAgSW50ZWxsaWdlbnQgUGxhdGZvcm0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKElQTUkpLiBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0DQogIGZvciB0aGVzZSBmZWF0dXJlcyB3aGVuIGVuYWJsZWQgaW4gdGhlIENvcmVJMkMgSVAuDQogIA0KICBUaGUgbWFqb3IgZmVhdHVyZXMgcHJvdmlkZWQgYnkgQ29yZUkyQyBkcml2ZXIgYXJlOg0KICAgIC0gU3VwcG9ydCBmb3IgY29uZmlndXJpbmcgdGhlIEkyQyBjaGFubmVscyBvZiBlYWNoIENvcmVJMkMgcGVyaXBoZXJhbC4NCiAgICAtIEkyQyBtYXN0ZXIgb3BlcmF0aW9ucy4NCiAgICAtIEkyQyBzbGF2ZSBvcGVyYXRpb25zLg0KICAgIC0gU01CdXMgcmVsYXRlZCBvcGVyYXRpb25zLg0KDQogIFRoaXMgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgYSBiYXJlIG1ldGFsIHN5c3RlbSB3aGVyZSBubyBvcGVyYXRpbmcgDQogIHN5c3RlbSAgaXMgYXZhaWxhYmxlLiBUaGUgZHJpdmVyIGNhbiBiZSBhZGFwdGVkIGZvciB1c2UgYXMgcGFydCBvZiBhbiANCiAgb3BlcmF0aW5nIHN5c3RlbSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRhcHRhdGlvbiBsYXllciBiZXR3ZWVuIHRoZSANCiAgZHJpdmVyIGFuZCAgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBkcml2ZXIgbW9kZWwgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyANCiAgZHJpdmVyLg0KICANCiAgQHNlY3Rpb24gaHdfZGVwZW5kZW5jaWVzIEhhcmR3YXJlIEZsb3cgRGVwZW5kZW5jaWVzDQogIFlvdXIgYXBwbGljYXRpb24gc29mdHdhcmUgc2hvdWxkIGNvbmZpZ3VyZSB0aGUgQ29yZUkyQyBkcml2ZXIgdGhyb3VnaA0KICBjYWxscyB0byB0aGUgSTJDX2luaXQoKSBmdW5jdGlvbiBmb3IgZWFjaCBDb3JlSTJDIGluc3RhbmNlIGluIHRoZQ0KICBoYXJkd2FyZSBkZXNpZ24uICBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGluY2x1ZGUgdGhlIENvcmVJMkMgaGFyZHdhcmUNCiAgaW5zdGFuY2UgYmFzZSBhZGRyZXNzIGFuZCBvdGhlciBydW50aW1lIHBhcmFtZXRlcnMsIHN1Y2ggYXMgdGhlIEkyQyBzZXJpYWwNCiAgY2xvY2sgZnJlcXVlbmN5IGFuZCBJMkMgZGV2aWNlIGFkZHJlc3MuDQogIA0KICBPbmNlIGNoYW5uZWwgMCBvZiBhIENvcmVJMkMgcGVyaXBoZXJhbCBoYXMgYmVlbiBpbml0aWFsaXplZCB2aWEgSTJDX2luaXQoKSwNCiAgYW55IGFkZGl0aW9uYWwgY2hhbm5lbHMgcHJlc2VudCBzaG91bGQgYmUgY29uZmlndXJlZCBieSBjYWxsaW5nDQogIEkyQ19jaGFubmVsX2luaXQoKSBmb3IgZWFjaCBvZiB0aGUgcmVtYWluaW5nIGNoYW5uZWxzLg0KICANCiAgTm8gQ29yZUkyQyBoYXJkd2FyZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIHVzZWQgYnkgdGhlIGRyaXZlciwgYXBhcnQNCiAgZnJvbSB0aGUgQ29yZUkyQyBoYXJkd2FyZSBpbnN0YW5jZSBiYXNlIGFkZHJlc3MuIEhlbmNlLCBubyBhZGRpdGlvbmFsDQogIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIHJlcXVpcmVkIHRvIHVzZSB0aGUgZHJpdmVyLiANCiAgDQogIEludGVycnVwdCBDb250cm9sDQogIFRoZSBDb3JlSTJDIGRyaXZlciBoYXMgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIGludGVycnVwdHMgYnkNCiAgQ29yZUkyQyBhdCB2YXJpb3VzIHRpbWVzIHdoZW4gaXQgaXMgb3BlcmF0aW5nLiBUaGlzIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgb2YNCiAgaW50ZXJydXB0cyBtdXN0IGJlIGRvbmUgdGhyb3VnaCB0aGUgc3lzdGVtknMgaW50ZXJydXB0IGNvbnRyb2xsZXIuIEZvciB0aGF0DQogIHJlYXNvbiwgdGhlIG1ldGhvZCBvZiBjb250cm9sbGluZyB0aGUgQ29yZUkyQyBpbnRlcnJ1cHQgaXMgc3lzdGVtIHNwZWNpZmljDQogIGFuZCBpdCBpcyBuZWNlc3NhcnkgdG8gY3VzdG9taXplIHRoZSBJMkNfZW5hYmxlX2lycSgpIGFuZCBJMkNfZGlzYWJsZV9pcnEoKQ0KICBmdW5jdGlvbnMuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZm91bmQgaW4gdGhlIGZpbGUgaTJjX2ludGVycnVwdC5jLiBUaGVpcg0KICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZpcmVzIGFuIGFzc2VydGlvbiB0byBhdHRyYWN0IGF0dGVudGlvbiB0byB0aGUgZmFjdA0KICB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIG1vZGlmaWVkLg0KICANCiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJMkNfZW5hYmxlX2lycSgpIGZ1bmN0aW9uIHNob3VsZCBwZXJtaXQgaW50ZXJydXB0cw0KICBnZW5lcmF0ZWQgYnkgYSBDb3JlSTJDIGluc3RhbmNlIHRvIGludGVycnVwdCB0aGUgcHJvY2Vzc29yLiBUaGUgaW1wbGVtZW50YXRpb24NCiAgb2YgdGhlIEkyQ19kaXNhYmxlX2lycSgpIGZ1bmN0aW9uIHNob3VsZCBwcmV2ZW50IGludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IGENCiAgQ29yZUkyQyBpbnN0YW5jZSBmcm9tIGludGVycnVwdGluZyB0aGUgcHJvY2Vzc29yLiBQbGVhc2UgcmVmZXIgdG8gdGhlIHByb3ZpZGVkDQogIGV4YW1wbGUgcHJvamVjdHMgZm9yIGEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMuDQogIA0KICBUaGUgZnVuY3Rpb24gSTJDX3JlZ2lzdGVyX3dyaXRlX2hhbmRsZXIoKSBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgd3JpdGUgaGFuZGxlcg0KICBmdW5jdGlvbiB3aXRoIHRoZSBDb3JlSTJDIGRyaXZlciB0aGF0IGl0IGNhbGxzIG9uIGNvbXBsZXRpb24gb2YgYW4gSTJDIHdyaXRlDQogIHRyYW5zYWN0aW9uIGJ5IHRoZSBDb3JlSTJDIHNsYXZlLiBJdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGNyZWF0ZSBhbmQNCiAgcmVnaXN0ZXIgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHByb2Nlc3NlcyBvcg0KICB0cmlnZ2VyIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSByZWNlaXZlZCBkYXRhLg0KICANCiAgVGhlIFNNQlNVUyBhbmQgU01CQUxFUlQgaW50ZXJydXB0cyBhcmUgcmVsYXRlZCB0byB0aGUgU01CdXMgaW50ZXJmYWNlIGFuZCBhcmUNCiAgZW5hYmxlZCBhbmQgZGlzYWJsZWQgdGhyb3VnaCBJMkNfZW5hYmxlX3NtYnVzX2lycSgpIGFuZCANCiAgSTJDX2Rpc2FibGVfc21idXNfaXJxKCkgcmVzcGVjdGl2ZWx5LiBJdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGNyZWF0ZQ0KICBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbnMgaW4geW91ciBhcHBsaWNhdGlvbiB0byBnZXQgdGhlIGRlc2lyZWQgcmVzcG9uc2UNCiAgZm9yIHRoZSBTTUJ1cyBpbnRlcnJ1cHRzLg0KDQogIE5vdGU6IFlvdSBtdXN0IGluY2x1ZGUgdGhlIHBhdGggdG8gYW55IGFwcGxpY2F0aW9uIGhlYWRlciBmaWxlcyB0aGF0IGFyZQ0KICAgICAgICBpbmNsdWRlZCBpbiB0aGUgaTJjX2ludGVycnVwdC5jIGZpbGUsIGFzIGFuIGluY2x1ZGUgcGF0aCBpbiB5b3VyDQogICAgICAgIHByb2plY3SScyBjb21waWxlciBzZXR0aW5ncy4gVGhlIGRldGFpbHMgb2YgaG93IHRvIGRvIHRoaXMgd2lsbCBkZXBlbmQNCiAgICAgICAgb24geW91ciBkZXZlbG9wbWVudCBzb2Z0d2FyZS4NCg0KICBTTUJ1cyBMb2dpYyBvcHRpb25zDQogIFNNQnVzIHJlbGF0ZWQgQVBJcyB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QgaWYgaW4gQ29yZUkyQyBoYXJkd2FyZQ0KICBjb25maWd1cmF0aW9uICJHZW5lcmF0ZSBTTUJ1cyBMb2dpYyIgaXMgbm90IGVuYWJsZWQuIFRoZSBBUElzIHdoaWNoIHdpbGwgbm90DQogIGdpdmUgZGVzaXJlZCByZXN1bHRzIGluIGNhc2UgU01CdXMgTG9naWMgaXMgZGlzYWJsZWQgYXJlOg0KICANCiAgICAgIEkyQ19zbWJ1c19pbml0KCkNCiAgICAgIEkyQ19yZXNldF9zbWJ1cygpDQogICAgICBJMkNfZW5hYmxlX3NtYnVzX2lycSgpDQogICAgICBJMkNfZGlzYWJsZV9zbWJ1c19pcnEoKQ0KICAgICAgSTJDX3N1c3BlbmRfc21idXNfc2xhdmUoKQ0KICAgICAgSTJDX3Jlc3VtZV9zbWJ1c19zbGF2ZSgpDQogICAgICBJMkNfc2V0X3Ntc2J1c19hbGVydCgpDQogICAgICBJMkNfY2xlYXJfc21zYnVzX2FsZXJ0KCkNCiAgICAgIEkyQ19nZXRfaXJxX3N0YXR1cygpIA0KDQogIEZpeGVkIEJhdWQgUmF0ZSBWYWx1ZXMNCiAgVGhlIHNlcmlhbCBjbG9jayBmcmVxdWVuY3kgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgSTJDX2luaXQoKSBhbmQgDQogIEkyQ19jaGFubmVsX2luaXQoKSBmdW5jdGlvbnMgbWF5IG5vdCBoYXZlIGFueSBlZmZlY3QgaWYgZml4ZWQgdmFsdWVzIHdlcmUNCiAgc2VsZWN0ZWQgZm9yIEJhdWQgcmF0ZSBpbiB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBvZiBDb3JlSTJDLiBXaGVuIGZpeGVkDQogIHZhbHVlcyBhcmUgc2VsZWN0ZWQgZm9yIHRoZXNlIGJhdWQgcmF0ZXMsIHRoZSBkcml2ZXIgY2Fubm90IG92ZXJ3cml0ZQ0KICB0aGUgZml4ZWQgdmFsdWVzLg0KDQogIEZpeGVkIFNsYXZlIEFkZHJlc3MgT3B0aW9ucyBWYWx1ZXMNCiAgVGhlIHByaW1hcnkgc2xhdmUgYWRkcmVzcyAgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgSTJDX2luaXQoKSBmdW5jdGlvbiwgYW5kDQogIHNlY29uZGFyeSBhZGRyZXNzIHZhbHVlIHBhc3NlZCB0byB0aGUgSTJDX3NldF9zbGF2ZV9zZWNvbmRfYWRkcigpIGZ1bmN0aW9uLA0KICBtYXkgbm90IGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0IGlmIGZpeGVkIHZhbHVlcyB3ZXJlIHNlbGVjdGVkIGZvciB0aGUgc2xhdmUgMA0KICBhZGRyZXNzIGFuZCBzbGF2ZSAxIGFkZHJlc3MgcmVzcGVjdGl2ZWx5LiBQcm9wZXIgb3BlcmF0aW9uIG9mIHRoaXMgdmVyc2lvbiBvZg0KICB0aGUgZHJpdmVyIHJlcXVpcmVzIHRoZSBzbGF2ZSBhZGRyZXNzZXMgdG8gYmUgcHJvZ3JhbW1hYmxlLg0KDQogIEBzZWN0aW9uIHRoZW9yeV9vcCBUaGVvcnkgb2YgT3BlcmF0aW9uDQogIFRoZSBDb3JlSTJDIHNvZnR3YXJlIGRyaXZlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgY29udHJvbCBvZiBtdWx0aXBsZQ0KICBpbnN0YW5jZXMgb2YgQ29yZUkyQyB3aXRoIG9uZSBvciBtb3JlIEkyQyBjaGFubmVscy4gRWFjaCBjaGFubmVsIGluIGFuDQogIGluc3RhbmNlIG9mIENvcmVJMkMgaW4gdGhlIGhhcmR3YXJlIGRlc2lnbiBpcyBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgDQogIGluc3RhbmNlIG9mIHRoZSBpMmNfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgaW4gdGhlIHNvZnR3YXJlLiBZb3UgbXVzdCBhbGxvY2F0ZQ0KICBtZW1vcnkgZm9yIG9uZSB1bmlxdWUgaTJjX2luc3RhbmNlX3Qgc3RydWN0dXJlIGluc3RhbmNlIGZvciBlYWNoIGNoYW5uZWwgb2YNCiAgZWFjaCBDb3JlSTJDIGhhcmR3YXJlIGluc3RhbmNlLiBUaGUgY29udGVudHMgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGFyZQ0KICBpbml0aWFsaXNlZCBkdXJpbmcgY2FsbHMgdG8gSTJDX2luaXQoKSBhbmQgaWYgbmVjZXNzYXJ5IEkyQ19jaGFubmVsX2luaXQoKS4NCiAgQSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgaXMgcGFzc2VkIHRvIHN1YnNlcXVlbnQgZHJpdmVyIGZ1bmN0aW9ucyBpbiBvcmRlcg0KICB0byBpZGVudGlmeSB0aGUgQ29yZUkyQyBoYXJkd2FyZSBpbnN0YW5jZSBhbmQgY2hhbm5lbCB5b3Ugd2lzaCB0byBwZXJmb3JtIHRoZQ0KICByZXF1ZXN0ZWQgb3BlcmF0aW9uLg0KDQogIE5vdGU6IERvIG5vdCBhdHRlbXB0IHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUgdGhlIGNvbnRlbnRzIG9mIGkyY19pbnN0YW5jZV90DQogICAgICAgc3RydWN0dXJlcy4gVGhlc2Ugc3RydWN0dXJlcyBhcmUgb25seSBpbnRlbmRlZCB0byBiZSBtb2RpZmllZCBieSB0aGUgZHJpdmVyDQogICAgICAgZnVuY3Rpb25zLg0KDQogIFRoZSBDb3JlSTJDIGRyaXZlciBmdW5jdGlvbnMgYXJlIGdyb3VwZWQgaW50byB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXM6DQogICAgLSBJbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCiAgICAtIEludGVycnVwdCBjb250cm9sDQogICAgLSBJMkMgc2xhdmUgYWRkcmVzc2luZyBmdW5jdGlvbnMNCiAgICAtIEkyQyBtYXN0ZXIgb3BlcmF0aW9ucyBmdW5jdGlvbnMgdG8gaGFuZGxlIHdyaXRlLCByZWFkIGFuZCB3cml0ZS1yZWFkIA0KICAgICAgdHJhbnNhY3Rpb25zDQogICAgLSBJMkMgc2xhdmUgb3BlcmF0aW9ucyBmdW5jdGlvbnMgdG8gaGFuZGxlIHdyaXRlLCByZWFkIGFuZCB3cml0ZS1yZWFkIA0KICAgICAgdHJhbnNhY3Rpb25zDQogICAgLSBNaXhlZCBtYXN0ZXItc2xhdmUgb3BlcmF0aW9ucyANCiAgICAtIFNNQnVzIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGFuZCBjb250cm9sLg0KICAgIA0KICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbg0KICAgIFRoZSBDb3JlSTJDIGRldmljZSBpcyBmaXJzdCBpbml0aWFsaXplZCB0aHJvdWdoIGEgY2FsbCB0byB0aGUgSTJDX2luaXQoKQ0KICAgIGZ1bmN0aW9uLiBTaW5jZSBlYWNoIENvcmVJMkMgcGVyaXBoZXJhbCBzdXBwb3J0cyB1cCB0byAxNiBjaGFubmVscywgYW4NCiAgICBhZGRpdGlvbmFsIGZ1bmN0aW9uLCBJMkNfY2hhbm5lbF9pbml0KCksIGlzIHJlcXVpcmVkIHRvIGluaXRpYWxpemUgdGhlDQogICAgcmVtYWluaW5nIGNoYW5uZWxzIHdpdGggdGhlaXIgb3duIGRhdGEgc3RydWN0dXJlcy4NCg0KICAgIEkyQ19pbml0KCkgaW5pdGlhbGl6ZXMgY2hhbm5lbCAwIG9mIGEgQ29yZUkyQyBhbmQgdGhlIGkyY19pbnN0YW5jZV90IGZvcg0KICAgIGNoYW5uZWwgMCBhY3RzIGFzIHRoZSBiYXNpcyBmb3IgZnVydGhlciBjaGFubmVsIGluaXRpYWxpemF0aW9uIGFzIHRoZQ0KICAgIGhhcmR3YXJlIGJhc2UgYWRkcmVzcyBhbmQgSTJDIHNlcmlhbCBhZGRyZXNzIGFyZSBzYW1lIGFjcm9zcyBhbGwgdGhlDQogICAgY2hhbm5lbHMuIEkyQ19pbml0KCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciAgSTJDIGRyaXZlciBmdW5jdGlvbg0KICAgIGNhbGxzLiBUaGUgSTJDX2luaXQoKSBjYWxsIGZvciBlYWNoIENvcmVJMkMgdGFrZXMgdGhlIEkyQyBzZXJpYWwgYWRkcmVzcw0KICAgIGFzc2lnbmVkIHRvIHRoZSBJMkMgYW5kIHRoZSBzZXJpYWwgY2xvY2sgZGl2aWRlciB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIGl0cw0KICAgIEkyQyBjbG9jayBhcyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuIA0KICAgIA0KICAgIEkyQ19jaGFubmVsX2luaXQoKSB0YWtlcyBhcyBpbnB1dCBwYXJhbWV0ZXJzIGEgcG9pbnRlciB0byB0aGUgQ29yZUkyQyANCiAgICBpMmNfaW5zdGFuY2VfdCB3aGljaCBoYXMgYmVlbiBpbml0aWFsaXplZCB2aWEgSTJDX2luaXQoKSBhbmQgYSBwb2ludGVyIHRvIGENCiAgICBzZXBhcmF0ZSBpMmNfaW5zdGFuY2VfdCB3aGljaCByZXByZXNlbnRzIHRoaXMgbmV3IGNoYW5uZWwuIEFub3RoZXIgaW5wdXQNCiAgICBwYXJhbWV0ZXIgd2hpY2ggaXMgcmVxdWlyZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBzZXJpYWwgY2xvY2sgZGl2aWRlciB3aGljaA0KICAgIGdlbmVyYXRlcyBpdHMgSTJDIGNsb2NrLiANCiAgICANCiAgSW50ZXJydXB0IENvbnRyb2wNCiAgICBUaGUgQ29yZUkyQyBkcml2ZXIgaXMgaW50ZXJydXB0IGRyaXZlbiBhbmQgaXQgdXNlcyBlYWNoIGNoYW5uZWxzIElOVA0KICAgIGludGVycnVwdCB0byBkcml2ZSB0aGUgc3RhdGUgbWFjaGluZSB3aGljaCBpcyBhdCB0aGUgaGVhcnQgb2YgdGhlIGRyaXZlci4NCiAgICBUaGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyB0aGUgbGluayBiZXR3ZWVuIHRoZSBpbnRlcnJ1cHQNCiAgICBnZW5lcmF0aW5nIGhhcmR3YXJlIGFuZCB0aGUgQ29yZUkyQyBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgbXVzdCBlbnN1cmUgdGhhdA0KICAgIHRoZSBJMkNfaXNyKCkgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGNvcnJlY3QgaTJjX2luc3RhbmNlX3Qgc3RydWN0dXJlDQogICAgcG9pbnRlciBmb3IgdGhlIENvcmVJMkMgY2hhbm5lbCBpbml0aWF0aW5nIHRoZSBpbnRlcnJ1cHQuDQogICAgDQogICAgVGhlIGRyaXZlciBlbmFibGVzIGFuZCBkaXNhYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiBJTlQgaW50ZXJydXB0cyBieSBDb3JlSTJDDQogICAgYXQgdmFyaW91cyB0aW1lcyB3aGVuIGl0IGlzIG9wZXJhdGluZyB0aHJvdWdoIHRoZSB1c2VyIHN1cHBsaWVkDQogICAgSTJDX2VuYWJsZV9pcnEoKSBhbmQgSTJDX2Rpc2FibGVfaXJxKCkgZnVuY3Rpb25zLiANCiAgICANCiAgICBUaGUgZnVuY3Rpb24gSTJDX3JlZ2lzdGVyX3dyaXRlX2hhbmRsZXIoKSBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgd3JpdGUNCiAgICBoYW5kbGVyIGZ1bmN0aW9uIHdpdGggdGhlIENvcmVJMkMgZHJpdmVyIHdoaWNoIGlzIGNhbGxlZCBvbiBjb21wbGV0aW9uDQogICAgb2YgYW4gSTJDIHdyaXRlIHRyYW5zYWN0aW9uIGJ5IHRoZSBDb3JlSTJDIHNsYXZlLiBJdCBpcyB0aGUgdXNlcg0KICAgIGFwcGxpY2F0aW9ucyByZXNwb25zaWJpbGl0eSB0byBjcmVhdGUgYW5kIHJlZ2lzdGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBvZg0KICAgIHRoaXMgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHByb2Nlc3NlcyBvciB0cmlnZ2VycyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUNCiAgICByZWNlaXZlZCBkYXRhLiANCiAgICANCiAgICBUaGUgb3RoZXIgdHdvIGludGVycnVwdCBzb3VyY2VzIGluIHRoZSBDb3JlSTJDLCBhcmUgcmVsYXRlZCB0byBTTUJ1cw0KICAgIG9wZXJhdGlvbiBhbmQgYXJlIGVuYWJsZWQgYW5kIGRpc2FibGVkIHRocm91Z2ggSTJDX2VuYWJsZV9zbWJ1c19pcnEoKSBhbmQNCiAgICBJMkNfZGlzYWJsZV9zbWJ1c19pcnEoKSByZXNwZWN0aXZlbHkuIER1ZSB0byB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWMNCiAgICBuYXR1cmUgb2YgdGhlIHJlc3BvbnNlIHRvIFNNQnVzIGludGVycnVwdHMsIHlvdSBtdXN0IGRlc2lnbiBpbnRlcnJ1cHQNCiAgICBoYW5kbGVyIGZ1bmN0aW9ucyBpbiB0aGUgYXBwbGljYXRpb24gdG8gZ2V0IHRoZSBkZXNpcmVkIGJlaGF2aW91ciBmb3INCiAgICBTTUJ1cyByZWxhdGVkIGludGVycnVwdHMuDQogICAgDQogICAgSWYgZW5hYmxlZCwgdGhlIFNNQkFfSU5UIHNpZ25hbCBmcm9tIHRoZSBDb3JlSTJDIGlzIGFzc2VydGVkIGlmIGFuDQogICAgU01CQUxFUlQgY29uZGl0aW9uIGlzIHNpZ25hbGxlZCBvbiB0aGUgU01CQUxFUlRfTkkgaW5wdXQgZm9yIHRoZSBjaGFubmVsLg0KICAgIA0KICAgIElmIGVuYWJsZWQsIHRoZSBTTUJTX0lOVCBzaWduYWwgZnJvbSB0aGUgQ29yZUkyQyBpcyBhc3NlcnRlZCBpZiBhbg0KICAgIFNNQlNVU1BFTkQgY29uZGl0aW9uIGlzIHNpZ25hbGxlZCBvbiB0aGUgU01CU1VTX05JIGlucHV0IGZvciB0aGUgY2hhbm5lbC4NCg0KICBJMkMgc2xhdmUgYWRkcmVzc2luZyBmdW5jdGlvbnMNCiAgICBBIENvcmVJMkMgcGVyaXBoZXJhbCBjYW4gcmVzcG9uZCB0byB0aHJlZSBzbGF2ZSBhZGRyZXNzZXM6DQogICAgLSBTbGF2ZSBhZGRyZXNzIDAgLSBUaGlzIGlzIHRoZSBwcmltYXJ5IHNsYXZlIGFkZHJlc3Mgd2hpY2ggaXMgdXNlZCBmb3INCiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2luZyBhIENvcmVJMkMgY2hhbm5lbCB3aGVuIGl0IGFjdHMgYXMgYSBzbGF2ZSBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgSTJDIHRyYW5zYWN0aW9ucy4gWW91IG11c3QgY29uZmlndXJlIHRoZSBwcmltYXJ5IHNsYXZlDQogICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHZpYSBJMkNfaW5pdCgpLg0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgLSBTbGF2ZSBhZGRyZXNzIDEgLSBUaGlzIGlzIHRoZSBzZWNvbmRhcnkgc2xhdmUgYWRkcmVzcyB3aGljaCBtaWdodCBiZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgaW4gY2VydGFpbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBzY2VuYXJpb3MuDQogICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2Vjb25kYXJ5IHNsYXZlIGFkZHJlc3MgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhDQogICAgICAgICAgICAgICAgICAgICAgICBJMkNfc2V0X3NsYXZlX3NlY29uZF9hZGRyKCkgYW5kIGRpc2FibGVkIHZpYSANCiAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19kaXNhYmxlX3NsYXZlX3NlY29uZF9hZGRyKCkuDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAtIEdlbmVyYWwgY2FsbCBhZGRyZXNzIC0gQSBDb3JlSTJDIHNsYXZlIGNhbiBiZSBjb25maWd1cmVkIHRvIHJlc3BvbmQgdG8NCiAgICAgICAgICAgICAgICAgICAgICAgIGEgYnJvYWRjYXN0IGNvbW1hbmQgYnkgYSBtYXN0ZXIgdHJhbnNtaXR0aW5nIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhbCBjYWxsIGFkZHJlc3Mgb2YgMHgwMC4gVXNlIHRoZSBJMkNfc2V0X2djYSgpDQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0byBlbmFibGUgdGhlIHNsYXZlIHRvIHJlc3BvbmQgdG8gdGhlIGdlbmVyYWwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgYWRkcmVzcy4gSWYgdGhlIENvcmVJMkMgc2xhdmUgaXMgbm90IHJlcXVpcmVkIHRvDQogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25kIHRvIHRoZSBnZW5lcmFsIGNhbGwgYWRkcmVzcywgZGlzYWJsZSB0aGlzDQogICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGJ5IGNhbGxpbmcgSTJDX2NsZWFyX2djYSgpLg0KDQogICAgTm90ZTogQWxsIGNoYW5uZWxzIG9uIGEgQ29yZUkyQyBpbnN0YW5jZSBzaGFyZSB0aGUgc2FtZSBzbGF2ZSBhZGRyZXNzIGxvZ2ljLg0KICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0aGV5IGNhbm5vdCBoYXZlIHNlcGFyYXRlIHNsYXZlIGFkZHJlc3NlcyBhbmQgcmVseSBvbg0KICAgICAgICAgIHRoZSBzZXBhcmF0ZSBwaHlzaWNhbCBJMkMgYnVzIGNvbm5lY3Rpb25zIHRvIGRpc3Rpbmd1aXNoIHRoZW0uDQogICAgICAgICAgDQogIFRyYW5zYWN0aW9uIFR5cGVzDQogICAgVGhlIEkyQyBkcml2ZXIgaXMgZGVzaWduZWQgdG8gaGFuZGxlIHRocmVlIHR5cGVzIG9mIEkyQyB0cmFuc2FjdGlvbjoNCiAgICAgIFdyaXRlIHRyYW5zYWN0aW9ucw0KICAgICAgUmVhZCB0cmFuc2FjdGlvbnMNCiAgICAgIFdyaXRlLXJlYWQgdHJhbnNhY3Rpb25zDQogDQogICAgV3JpdGUgdHJhbnNhY3Rpb24NCiAgICAgIFRoZSBtYXN0ZXIgSTJDIGRldmljZSBpbml0aWF0ZXMgYSB3cml0ZSB0cmFuc2FjdGlvbiBieSBzZW5kaW5nIGEgU1RBUlQgYml0DQogICAgICBhcyBzb29uIGFzIHRoZSBidXMgYmVjb21lcyBmcmVlLiBUaGUgU1RBUlQgYml0IGlzIGZvbGxvd2VkIGJ5IHRoZSA3LWJpdA0KICAgICAgc2VyaWFsIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBzbGF2ZSBkZXZpY2UgZm9sbG93ZWQgYnkgdGhlIHJlYWQvd3JpdGUgYml0DQogICAgICBpbmRpY2F0aW5nIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGUgc2xhdmUgYWNrbm93bGVkZ2VzIHRoZQ0KICAgICAgcmVjZWlwdCBvZiBpdCdzIGFkZHJlc3Mgd2l0aCBhbiBhY2tub3dsZWRnZSBiaXQuIFRoZSBtYXN0ZXIgc2VuZHMgZGF0YSBvbmUNCiAgICAgIGJ5dGUgYXQgYSB0aW1lIHRvIHRoZSBzbGF2ZSwgd2hpY2ggbXVzdCBhY2tub3dsZWRnZSByZWNlaXB0IG9mIGVhY2ggYnl0ZQ0KICAgICAgZm9yIHRoZSBuZXh0IGJ5dGUgdG8gYmUgc2VudC4gVGhlIG1hc3RlciBzZW5kcyBhIFNUT1AgYml0IHRvIGNvbXBsZXRlIHRoZQ0KICAgICAgdHJhbnNhY3Rpb24uIFRoZSBzbGF2ZSBjYW4gYWJvcnQgdGhlIHRyYW5zYWN0aW9uIGJ5IHJlcGx5aW5nIHdpdGggYSANCiAgICAgIG5vbi1hY2tub3dsZWRnZSBiaXQgaW5zdGVhZCBvZiBhbiBhY2tub3dsZWRnZS4NCiAgICAgIA0KICAgICAgVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgY2FuIGNob29zZSBub3QgdG8gc2VuZCBhIFNUT1AgYml0IGF0IHRoZSBlbmQgb2YNCiAgICAgIHRoZSB0cmFuc2FjdGlvbiBjYXVzaW5nIHRoZSBuZXh0IHRyYW5zYWN0aW9uIHRvIGJlZ2luIHdpdGggYSByZXBlYXRlZCANCiAgICAgIFNUQVJUIGJpdC4NCiAgICAgIA0KICAgIFJlYWQgdHJhbnNhY3Rpb24NCiAgICAgIFRoZSBtYXN0ZXIgSTJDIGRldmljZSBpbml0aWF0ZXMgYSByZWFkIHRyYW5zYWN0aW9uIGJ5IHNlbmRpbmcgYSBTVEFSVCBiaXQNCiAgICAgIGFzIHNvb24gYXMgdGhlIGJ1cyBiZWNvbWVzIGZyZWUuIFRoZSBTVEFSVCBiaXQgaXMgZm9sbG93ZWQgYnkgdGhlIDctYml0DQogICAgICBzZXJpYWwgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IHNsYXZlIGRldmljZSBmb2xsb3dlZCBieSB0aGUgcmVhZC93cml0ZSBiaXQNCiAgICAgIGluZGljYXRpbmcgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoZSBzbGF2ZSBhY2tub3dsZWRnZXMNCiAgICAgIHJlY2VpcHQgb2YgaXQncyBzbGF2ZSBhZGRyZXNzIHdpdGggYW4gYWNrbm93bGVkZ2UgYml0LiBUaGUgc2xhdmUgc2VuZHMNCiAgICAgIGRhdGEgb25lIGJ5dGUgYXQgYSB0aW1lIHRvIHRoZSBtYXN0ZXIsIHdoaWNoIG11c3QgYWNrbm93bGVkZ2UgcmVjZWlwdCBvZg0KICAgICAgZWFjaCBieXRlIGZvciB0aGUgbmV4dCBieXRlIHRvIGJlIHNlbnQuIFRoZSBtYXN0ZXIgc2VuZHMgYSBub24tYWNrbm93bGVkZ2UNCiAgICAgIGJpdCBmb2xsb3dpbmcgdGhlIGxhc3QgYnl0ZSBpdCB3aXNoZXMgdG8gcmVhZCBmb2xsb3dlZCBieSBhIFNUT1AgYml0Lg0KICAgICAgDQogICAgICBUaGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lciBjYW4gY2hvb3NlIG5vdCB0byBzZW5kIGEgU1RPUCBiaXQgYXQgdGhlIGVuZCBvZg0KICAgICAgdGhlIHRyYW5zYWN0aW9uIGNhdXNpbmcgdGhlIG5leHQgdHJhbnNhY3Rpb24gdG8gYmVnaW4gd2l0aCBhIHJlcGVhdGVkIA0KICAgICAgU1RBUlQgYml0Lg0KIA0KICAgIFdyaXRlLXJlYWQgdHJhbnNhY3Rpb24NCiAgICAgIFRoZSB3cml0ZS1yZWFkIHRyYW5zYWN0aW9uIGlzIGEgY29tYmluYXRpb24gb2YgYSB3cml0ZSB0cmFuc2FjdGlvbg0KICAgICAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSByZWFkIHRyYW5zYWN0aW9uLiBUaGVyZSBpcyBubyBTVE9QIGJpdCBiZXR3ZWVuDQogICAgICB0aGUgd3JpdGUgYW5kIHJlYWQgcGhhc2VzIG9mIGEgd3JpdGUtcmVhZCB0cmFuc2FjdGlvbi4gQSByZXBlYXRlZCBTVEFSVA0KICAgICAgYml0IGlzIHNlbnQgYmV0d2VlbiB0aGUgd3JpdGUgYW5kIHJlYWQgcGhhc2VzLg0KICAgICAgDQogICAgICBXaGlsc3QgdGhlIHdyaXRlIGhhbmRsZXIgaXMgYmVpbmcgZXhlY3V0ZWQsIHRoZSBzbGF2ZSBob2xkcyB0aGUgY2xvY2sgbGluZQ0KICAgICAgbG93IHRvIHN0cmV0Y2ggdGhlIGNsb2NrIHVudGlsIHRoZSByZXNwb25zZSBpcyByZWFkeS4NCiAgICAgIA0KICAgICAgVGhlIHdyaXRlLXJlYWQgdHJhbnNhY3Rpb24gaXMgdHlwaWNhbGx5IHVzZWQgdG8gc2VuZCBhIGNvbW1hbmQgb3Igb2Zmc2V0DQogICAgICBpbiB0aGUgd3JpdGUgdHJhbnNhY3Rpb24gc3BlY2lmeWluZyB0aGUgbG9naWNhbCBkYXRhIHRvIGJlIHRyYW5zZmVycmVkDQogICAgICBkdXJpbmcgdGhlIHJlYWQgcGhhc2UuDQogICAgICANCiAgICAgIFRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyIGNhbiBjaG9vc2Ugbm90IHRvIHNlbmQgYSBTVE9QIGJpdCBhdCB0aGUgZW5kIG9mDQogICAgICB0aGUgdHJhbnNhY3Rpb24gY2F1c2luZyB0aGUgbmV4dCB0cmFuc2FjdGlvbiB0byBiZWdpbiB3aXRoIGEgcmVwZWF0ZWQNCiAgICAgIFNUQVJUIGJpdC4NCg0KICBNYXN0ZXIgT3BlcmF0aW9ucw0KICAgIFRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoZSBJMkNfd3JpdGUoKSwgSTJDX3JlYWQoKSBhbmQgSTJDX3dyaXRlX3JlYWQoKQ0KICAgIGZ1bmN0aW9ucyB0byBpbml0aWF0ZSBhbiBJMkMgYnVzIHRyYW5zYWN0aW9uLiBUaGUgYXBwbGljYXRpb24gY2FuIHRoZW4gd2FpdA0KICAgIGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUgdXNpbmcgdGhlIEkyQ193YWl0X2NvbXBsZXRlKCkgZnVuY3Rpb24NCiAgICBvciBwb2xsIHRoZSBzdGF0dXMgb2YgdGhlIEkyQyB0cmFuc2FjdGlvbiB1c2luZyB0aGUgSTJDX2dldF9zdGF0dXMoKQ0KICAgIGZ1bmN0aW9uIHVudGlsIGl0IHJldHVybnMgYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSBJMkNfSU5fUFJPR1JFU1MuIFRoZQ0KICAgIEkyQ19zeXN0ZW1fdGljaygpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHNldCBhIHRpbWUgYmFzZSBmb3IgdGhlDQogICAgSTJDX3dhaXRfY29tcGxldGUoKSBmdW5jdGlvbpJzIHRpbWUgb3V0IGRlbGF5Lg0KDQogIFNsYXZlIE9wZXJhdGlvbnMNCiAgICBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGUgIEkyQyBkcml2ZXIgdG8gb3BlcmF0ZSBhcyBhbiBJMkMgc2xhdmUgcmVxdWlyZXMNCiAgICB0aGUgdXNlIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOg0KICAgICAgIEkyQ19zZXRfc2xhdmVfdHhfYnVmZmVyKCkNCiAgICAgICBJMkNfc2V0X3NsYXZlX3J4X2J1ZmZlcigpDQogICAgICAgSTJDX3NldF9zbGF2ZV9tZW1fb2Zmc2V0X2xlbmd0aCgpDQogICAgICAgSTJDX3JlZ2lzdGVyX3dyaXRlX2hhbmRsZXIoKQ0KICAgICAgIEkyQ19lbmFibGVfc2xhdmUoKQ0KICAgICAgIA0KICAgIFVzZSBvZiBhbGwgZnVuY3Rpb25zIGlzIG5vdCByZXF1aXJlZCBpZiB0aGUgc2xhdmUgSTJDIGRvZXMgbm90IG5lZWQgdG8gc3VwcG9ydA0KICAgIGFsbCB0eXBlcyBvZiBJMkMgcmVhZCB0cmFuc2FjdGlvbnMuIFRoZSBzdWJzZXF1ZW50IHNlY3Rpb25zIGxpc3QgdGhlIGZ1bmN0aW9ucw0KICAgIHRoYXQgbXVzdCBiZSB1c2VkIHRvIHN1cHBvcnQgZWFjaCB0cmFuc2FjdGlvbiB0eXBlLiANCiAgICANCiAgICBSZXNwb25kaW5nIHRvIHJlYWQgdHJhbnNhY3Rpb25zDQogICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb25maWd1cmUgdGhlICBDb3JlSTJDIGRyaXZlciB0bw0KICAgICAgcmVzcG9uZCB0byBJMkMgcmVhZCB0cmFuc2FjdGlvbnM6DQogICAgICAgIEkyQ19zZXRfc2xhdmVfdHhfYnVmZmVyKCkNCiAgICAgICAgSTJDX2VuYWJsZV9zbGF2ZSgpDQogICAgICAgIA0KICAgICAgVGhlIGZ1bmN0aW9uIEkyQ19zZXRfc2xhdmVfdHhfYnVmZmVyKCkgc3BlY2lmaWVzIHRoZSBkYXRhIGJ1ZmZlciB0aGF0DQogICAgICB3aWxsIGJlIHRyYW5zbWl0dGVkIHdoZW4gdGhlIEkyQyBzbGF2ZSBpcyB0aGUgdGFyZ2V0IG9mIGFuIEkyQyByZWFkDQogICAgICB0cmFuc2FjdGlvbi4gSXQgaXMgdGhlbiB1cCB0byB0aGUgYXBwbGljYXRpb24gdG8gbWFuYWdlIHRoZSBjb250ZW50IG9mDQogICAgICB0aGF0IGJ1ZmZlciB0byBjb250cm9sIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCB0byB0aGUgSTJDDQogICAgICBtYXN0ZXIgYXMgYSByZXN1bHQgb2YgdGhlIHJlYWQgdHJhbnNhY3Rpb24uDQogICAgICANCiAgICAgIFRoZSBmdW5jdGlvbiBJMkNfZW5hYmxlX3NsYXZlKCkgZW5hYmxlcyB0aGUgIEkyQyBoYXJkd2FyZSBpbnN0YW5jZQ0KICAgICAgdG8gcmVzcG9uZCB0byBJMkMgdHJhbnNhY3Rpb25zLiBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgIEkyQyBkcml2ZXINCiAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gcmVzcG9uZCB0byB0aGUgcmVxdWlyZWQgdHJhbnNhY3Rpb24gdHlwZXMuDQoNCiAgICBSZXNwb25kaW5nIHRvIHdyaXRlIHRyYW5zYWN0aW9ucw0KICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSAgSTJDIGRyaXZlciB0byByZXNwb25kDQogICAgICB0byBJMkMgd3JpdGUgdHJhbnNhY3Rpb25zOg0KICAgICAgICBJMkNfc2V0X3NsYXZlX3J4X2J1ZmZlcigpDQogICAgICAgIEkyQ19yZWdpc3Rlcl93cml0ZV9oYW5kbGVyKCkNCiAgICAgICAgSTJDX2VuYWJsZV9zbGF2ZSgpDQogICAgICAgIA0KICAgICAgVGhlIGZ1bmN0aW9uIEkyQ19zZXRfc2xhdmVfcnhfYnVmZmVyKCkgc3BlY2lmaWVzIHRoZSBkYXRhIGJ1ZmZlciB0aGF0DQogICAgICB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIEkyQyBzbGF2ZSB3aGVuIGl0IGlzIHRoZQ0KICAgICAgdGFyZ2V0IGFuIEkyQyAgd3JpdGUgdHJhbnNhY3Rpb24uDQogICAgICANCiAgICAgIFRoZSBmdW5jdGlvbiBJMkNfcmVnaXN0ZXJfd3JpdGVfaGFuZGxlcigpIHNwZWNpZmllcyB0aGUgaGFuZGxlciBmdW5jdGlvbg0KICAgICAgdGhhdCBtdXN0IGJlIGNhbGxlZCBvbiBjb21wbGV0aW9uIG9mIHRoZSBJMkMgd3JpdGUgdHJhbnNhY3Rpb24uIEl0IGlzIHRoaXMNCiAgICAgIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBwcm9jZXNzZXMgb3IgdHJpZ2dlcnMgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHJlY2VpdmVkDQogICAgICBkYXRhLg0KICAgICAgDQogICAgICBUaGUgZnVuY3Rpb24gSTJDX2VuYWJsZV9zbGF2ZSgpIGVuYWJsZXMgdGhlICBJMkMgaGFyZHdhcmUgaW5zdGFuY2UNCiAgICAgIHRvIHJlc3BvbmQgdG8gSTJDIHRyYW5zYWN0aW9ucy4gSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlICBJMkMgZHJpdmVyDQogICAgICBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHJlc3BvbmQgdG8gdGhlIHJlcXVpcmVkIHRyYW5zYWN0aW9uIHR5cGVzLg0KDQogICAgUmVzcG9uZGluZyB0byB3cml0ZS1yZWFkIHRyYW5zYWN0aW9ucw0KICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBDb3JlSTJDIGRyaXZlciB0byANCiAgICAgIHJlc3BvbmQgdG8gd3JpdGUtcmVhZCB0cmFuc2FjdGlvbnM6DQogICAgICAgIEkyQ19zZXRfc2xhdmVfbWVtX29mZnNldF9sZW5ndGgoKQ0KICAgICAgICBJMkNfc2V0X3NsYXZlX3R4X2J1ZmZlcigpDQogICAgICAgIEkyQ19zZXRfc2xhdmVfcnhfYnVmZmVyKCkNCiAgICAgICAgSTJDX3JlZ2lzdGVyX3dyaXRlX2hhbmRsZXIoKQ0KICAgICAgICBJMkNfZW5hYmxlX3NsYXZlKCkNCiAgICAgICAgDQogICAgICBUaGUgZnVuY3Rpb24gSTJDX3NldF9zbGF2ZV9tZW1fb2Zmc2V0X2xlbmd0aCgpIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mDQogICAgICBieXRlcyBleHBlY3RlZCBieSB0aGUgSTJDIHNsYXZlIGR1cmluZyB0aGUgd3JpdGUgcGhhc2Ugb2YgdGhlIHdyaXRlLXJlYWQNCiAgICAgIHRyYW5zYWN0aW9uLg0KICAgICAgDQogICAgICBUaGUgZnVuY3Rpb24gSTJDX3NldF9zbGF2ZV90eF9idWZmZXIoKSBzcGVjaWZpZXMgdGhlIGRhdGEgdGhhdCB3aWxsIGJlDQogICAgICB0cmFuc21pdHRlZCB0byB0aGUgSTJDIG1hc3RlciBkdXJpbmcgdGhlIHJlYWQgcGhhc2Ugb2YgdGhlIHdyaXRlLXJlYWQNCiAgICAgIHRyYW5zYWN0aW9uLiBUaGUgdmFsdWUgcmVjZWl2ZWQgYnkgdGhlIEkyQyBzbGF2ZSBkdXJpbmcgdGhlIHdyaXRlIHBoYXNlIG9mDQogICAgICB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSB1c2VkIGFzIGFuIGluZGV4IGludG8gdGhlIHRyYW5zbWl0IGJ1ZmZlcg0KICAgICAgc3BlY2lmaWVkIGJ5IHRoaXMgZnVuY3Rpb24gdG8gZGVjaWRlIHdoaWNoIHBhcnQgb2YgdGhlIHRyYW5zbWl0IGJ1ZmZlcg0KICAgICAgd2lsbCBiZSB0cmFuc21pdHRlZCB0byB0aGUgSTJDIG1hc3RlciBhcyBwYXJ0IG9mIHRoZSByZWFkIHBoYXNlIG9mIHRoZQ0KICAgICAgd3JpdGUtcmVhZCB0cmFuc2FjdGlvbi4gDQogICAgICANCiAgICAgIFRoZSBmdW5jdGlvbiBJMkNfc2V0X3NsYXZlX3J4X2J1ZmZlcigpIHNwZWNpZmllcyB0aGUgZGF0YSBidWZmZXIgdGhhdA0KICAgICAgd2lsbCBiZSB1c2VkIHRvIHN0b3JlIHRoZSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBJMkMgc2xhdmUgZHVyaW5nIHRoZSB3cml0ZQ0KICAgICAgcGhhc2Ugb2YgdGhlIHdyaXRlLXJlYWQgdHJhbnNhY3Rpb24uIFRoaXMgYnVmZmVyIG11c3QgYmUgYXQgbGVhc3QgbGFyZ2UNCiAgICAgIGVub3VnaCB0byBhY2NvbW1vZGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQ0KICAgICAgSTJDX3NldF9zbGF2ZV9tZW1fb2Zmc2V0X2xlbmd0aCgpIGZ1bmN0aW9uLg0KICAgICAgDQogICAgICBUaGUgZnVuY3Rpb24gSTJDX3JlZ2lzdGVyX3dyaXRlX2hhbmRsZXIoKSBjYW4gb3B0aW9uYWxseSBiZSB1c2VkIHRvDQogICAgICBzcGVjaWZ5IGEgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBvbiBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBwaGFzZQ0KICAgICAgb2YgdGhlIEkyQyB3cml0ZS1yZWFkIHRyYW5zYWN0aW9uLiBJZiBhIGhhbmRsZXIgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCwgaXQNCiAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBkYXRhIGluIHRoZSBzbGF2ZSByZWNlaXZlDQogICAgICBidWZmZXIgYW5kIHBvcHVsYXRpbmcgdGhlIHNsYXZlIHRyYW5zbWl0IGJ1ZmZlciB3aXRoIHRoZSBkYXRhIHRoYXQgd2lsbCBiZQ0KICAgICAgdHJhbnNtaXR0ZWQgdG8gdGhlIEkyQyBtYXN0ZXIgYXMgcGFydCBvZiB0aGUgcmVhZCBwaGFzZSBvZiB0aGUgd3JpdGUtcmVhZA0KICAgICAgdHJhbnNhY3Rpb24uDQogICAgICANCiAgICAgIFRoZSBmdW5jdGlvbiBJMkNfZW5hYmxlX3NsYXZlKCkgZW5hYmxlcyB0aGUgQ29yZUkyQyBoYXJkd2FyZSBpbnN0YW5jZSB0byANCiAgICAgIHJlc3BvbmQgdG8gSTJDIHRyYW5zYWN0aW9ucy4gSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIENvcmVJMkMgZHJpdmVyDQogICAgICBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHJlc3BvbmQgdG8gdGhlIHJlcXVpcmVkIHRyYW5zYWN0aW9uIHR5cGVzLg0KDQogIE1peGVkIE1hc3Rlci1TbGF2ZSBPcGVyYXRpb25zDQogICAgVGhlIENvcmVJMkMgZGV2aWNlIHN1cHBvcnRzIG1peGVkIG1hc3RlciBhbmQgc2xhdmUgb3BlcmF0aW9ucy4gSWYgdGhlIA0KICAgIENvcmVJMkMgc2xhdmUgaGFzIGEgdHJhbnNhY3Rpb24gaW4gcHJvZ3Jlc3MgYW5kIHlvdXIgYXBwbGljYXRpb24gYXR0ZW1wdHMgdG8NCiAgICBiZWdpbiBhIG1hc3RlciBtb2RlIHRyYW5zYWN0aW9uLCB0aGUgQ29yZUkyQyBkcml2ZXIgcXVldTNlcyB0aGUgbWFzdGVyIG1vZGUNCiAgICB0cmFuc2FjdGlvbiB1bnRpbCB0aGUgYnVzIGlzIHJlbGVhc2VkIGFuZCB0aGUgQ29yZUkyQyBjYW4gc3dpdGNoIHRvIG1hc3Rlcg0KICAgIG1vZGUgYW5kIGFjcXVpcmUgdGhlIGJ1cy4gVGhlIENvcmVJMkMgbWFzdGVyIHRoZW4gc3RhcnRzIHRoZSBwcmV2aW91c2x5DQogICAgcXVldWVkIG1hc3RlciB0cmFuc2FjdGlvbi4NCiAgICANCiAgU01CdXMgQ29udHJvbA0KICAgIFRoZSBDb3JlSTJDIGRyaXZlciBlbmFibGVzIHRoZSBDb3JlSTJDIHBlcmlwaGVyYWyScyBTTUJ1cyBmdW5jdGlvbmFsaXR5DQogICAgdXNpbmcgdGhlIEkyQ19zbWJ1c19pbml0KCkgZnVuY3Rpb24uDQogICAgDQogICAgVGhlIEkyQ19zdXNwZW5kX3NtYnVzX3NsYXZlKCkgZnVuY3Rpb24gaXMgdXNlZCwgd2l0aCBhIG1hc3RlciBtb2RlIENvcmVJMkMsDQogICAgdG8gZm9yY2Ugc2xhdmUgZGV2aWNlcyBvbiB0aGUgU01CdXMgdG8gZW50ZXIgdGhlaXIgcG93ZXItZG93bi9zdXNwZW5kIG1vZGUuDQogICAgVGhlIEkyQ19yZXN1bWVfc21idXNfc2xhdmUoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGVuZCB0aGUgc3VzcGVuZCBvcGVyYXRpb24NCiAgICBvbiB0aGUgU01CdXMuDQogICAgDQogICAgVGhlIEkyQ19yZXNldF9zbWJ1cygpIGZ1bmN0aW9uIGlzIHVzZWQsIHdpdGggYSBtYXN0ZXIgbW9kZSBDb3JlSTJDLCB0byBmb3JjZQ0KICAgIGFsbCBkZXZpY2VzIG9uIHRoZSBTTUJ1cyB0byByZXNldCB0aGVpciBTTUJVcyBpbnRlcmZhY2UuDQogICAgDQogICAgVGhlIEkyQ19zZXRfc21zYnVzX2FsZXJ0KCkgZnVuY3Rpb24gaXMgdXNlZCwgYnkgYSBzbGF2ZSBtb2RlIENvcmVJMkMsIHRvDQogICAgZm9yY2UgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBTTUJ1cyBtYXN0ZXIuIE9uY2UgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUNCiAgICBtYXN0ZXIgaXMgaW5pdGlhdGVkLCB0aGUgSTJDX2NsZWFyX3Ntc2J1c19hbGVydCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXINCiAgICB0aGUgYWxlcnQgY29uZGl0aW9uLg0KICAgIA0KICAgIFRoZSBJMkNfZW5hYmxlX3NtYnVzX2lycSgpIGFuZCBJMkNfZGlzYWJsZV9zbWJ1c19pcnEoKSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8NCiAgICBlbmFibGUgYW5kIGRpc2FibGUgdGhlIFNNQlNVUyBhbmQgU01CQUxFUlQgU01CdXMgaW50ZXJydXB0cy4NCg0KICovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCg0KI2lmbmRlZiBDT1JFX0kyQ19IXw0KI2RlZmluZSBDT1JFX0kyQ19IXw0KDQojaW5jbHVkZSAiY3B1X3R5cGVzLmgiDQojaWZkZWYgX19jcGx1c3BsdXMNCmV4dGVybiAiQyIgew0KI2VuZGlmIA0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgSTJDX1JFTEVBU0VfQlVTIGNvbnN0YW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgb3B0aW9ucyBwYXJhbWV0ZXIgdG8NCiAgZnVuY3Rpb25zIEkyQ19yZWFkKCksIEkyQ193cml0ZSgpIGFuZCBJMkNfd3JpdGVfcmVhZCgpIHRvIGluZGljYXRlDQogIHRoYXQgYSBTVE9QIGJpdCBtdXN0IGJlIGdlbmVyYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBJMkMgdHJhbnNhY3Rpb24gdG8gcmVsZWFzZQ0KICB0aGUgYnVzLg0KICovDQojZGVmaW5lIEkyQ19SRUxFQVNFX0JVUyAgICAgMHgwMHUNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEkyQ19IT0xEX0JVUyBjb25zdGFudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG9wdGlvbnMgcGFyYW1ldGVyIHRvDQogIGZ1bmN0aW9ucyBJMkNfcmVhZCgpLCBJMkNfd3JpdGUoKSBhbmQgSTJDX3dyaXRlX3JlYWQoKSB0byBpbmRpY2F0ZQ0KICB0aGF0IGEgU1RPUCBiaXQgbXVzdCBub3QgYmUgZ2VuZXJhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIEkyQyB0cmFuc2FjdGlvbiBpbg0KICBvcmRlciB0byByZXRhaW4gdGhlIGJ1cyBvd25lcnNoaXAuIFRoaXMgY2F1c2VzIHRoZSBuZXh0IHRyYW5zYWN0aW9uIHRvDQogIGJlZ2luIHdpdGggYSByZXBlYXRlZCBTVEFSVCBiaXQgYW5kIG5vIFNUT1AgYml0IGJldHdlZW4gdGhlIHRyYW5zYWN0aW9ucy4NCiAqLw0KI2RlZmluZSBJMkNfSE9MRF9CVVMgICAgICAgIDB4MDF1DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHNwZWNpZnkgdGhlIGludGVycnVwdCBpZGVudGlmaWVyIG51bWJlciB3aGljaCB3aWxsIGJlDQogIHNvbGVseSB1c2VkIGJ5IGRyaXZlciBBUEkuIFRoaXMgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBoYXJkd2FyZSBpbnRlcnJ1cHQgbGluZS4NCiAgSTJDX0lOVF9JUlEgaXMgdGhlIHByaW1hcnkgaW50ZXJydXB0IHNpZ25hbCB3aGljaCBkcml2ZXMgdGhlIHN0YXRlIG1hY2hpbmUNCiAgb2YgdGhlIENvcmVJMkMgZHJpdmVyLiBUaGUgSTJDX1NNQkFMRVJUX0lSUSBhbmQgSTJDX1NNQlVTX0lSUSBhcmUgdXNlZCBieQ0KICBTTUJ1cyBpbnRlcnJ1cHQgZW5hYmxlIGFuZCBkaXNhYmxlIGZ1bmN0aW9ucy4gVGhlc2UgSVJRIG51bWJlcnMgYXJlIGFsc28gdXNlZA0KICBieSBJMkNfZ2V0X2lycV9zdGF0dXMoKS4NCiAqLw0KI2RlZmluZSBJMkNfTk9fSVJRICAgICAgICAgICAgIDB4MDB1DQojZGVmaW5lIEkyQ19TTUJBTEVSVF9JUlEgICAgICAgMHgwMXUNCiNkZWZpbmUgSTJDX1NNQlNVU19JUlEgICAgICAgICAweDAydQ0KI2RlZmluZSBJMkNfSU5UUl9JUlEgICAgICAgICAgIDB4MDR1DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBJMkNfTk9fVElNRU9VVCBjb25zdGFudCBpcyB1c2VkIGFzIHBhcmFtZXRlciB0byB0aGUgSTJDX3dhaXRfY29tcGxldGUoKQ0KICBmdW5jdGlvbiB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3YWl0IGZvciBjb21wbGV0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQNCiAgbm90IHRpbWUgb3V0Lg0KICovDQojZGVmaW5lIEkyQ19OT19USU1FT1VUICAwdQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgaTJjX2NoYW5uZWxfbnVtYmVyX3QgdHlwZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYW5uZWwgbnVtYmVyIG9mIGENCiAgQ29yZUkyQyBpbnN0YW5jZS4NCiAqLw0KdHlwZWRlZiBlbnVtIGkyY19jaGFubmVsX251bWJlciB7DQogICAgSTJDX0NIQU5ORUxfMCA9IDB1LA0KICAgIEkyQ19DSEFOTkVMXzEsDQogICAgSTJDX0NIQU5ORUxfMiwNCiAgICBJMkNfQ0hBTk5FTF8zLA0KICAgIEkyQ19DSEFOTkVMXzQsDQogICAgSTJDX0NIQU5ORUxfNSwNCiAgICBJMkNfQ0hBTk5FTF82LA0KICAgIEkyQ19DSEFOTkVMXzcsDQogICAgSTJDX0NIQU5ORUxfOCwNCiAgICBJMkNfQ0hBTk5FTF85LA0KICAgIEkyQ19DSEFOTkVMXzEwLA0KICAgIEkyQ19DSEFOTkVMXzExLA0KICAgIEkyQ19DSEFOTkVMXzEyLA0KICAgIEkyQ19DSEFOTkVMXzEzLA0KICAgIEkyQ19DSEFOTkVMXzE0LA0KICAgIEkyQ19DSEFOTkVMXzE1LA0KICAgIEkyQ19NQVhfQ0hBTk5FTFMgPSAxNnUNCn0gaTJjX2NoYW5uZWxfbnVtYmVyX3Q7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBpMmNfY2xvY2tfZGl2aWRlcl90IHR5cGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXZpZGVyIHRvIGJlIGFwcGxpZWQNCiAgdG8gdGhlIEkyQyBQQ0xLIG9yIEJDTEsgc2lnbmFsIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBJMkMgY2xvY2suDQogIFRoZSBJMkNfQkNMS19ESVZfOCB2YWx1ZSBzZWxlY3RzIGEgY2xvY2sgZnJlcXVlbmN5IGJhc2VkIG9uIGRpdmlzaW9uIG9mIEJDTEssDQogIGFsbCBvdGhlciB2YWx1ZXMgc2VsZWN0IGEgY2xvY2sgZnJlcXVlbmN5IGJhc2VkIG9uIGRpdmlzaW9uIG9mIFBDTEsuDQogKi8NCnR5cGVkZWYgZW51bSBpMmNfY2xvY2tfZGl2aWRlciB7DQogICAgSTJDX1BDTEtfRElWXzI1NiA9IDB1LA0KICAgIEkyQ19QQ0xLX0RJVl8yMjQsDQogICAgSTJDX1BDTEtfRElWXzE5MiwNCiAgICBJMkNfUENMS19ESVZfMTYwLA0KICAgIEkyQ19QQ0xLX0RJVl85NjAsDQogICAgSTJDX1BDTEtfRElWXzEyMCwNCiAgICBJMkNfUENMS19ESVZfNjAsDQogICAgSTJDX0JDTEtfRElWXzgNCn0gaTJjX2Nsb2NrX2RpdmlkZXJfdDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIGkyY19zdGF0dXNfdCB0eXBlIGlzIHVzZWQgdG8gcmVwb3J0IHRoZSBzdGF0dXMgb2YgSTJDIHRyYW5zYWN0aW9ucy4NCiAqLw0KdHlwZWRlZiBlbnVtIGkyY19zdGF0dXMNCnsNCiAgICBJMkNfU1VDQ0VTUyA9IDB1LA0KICAgIEkyQ19JTl9QUk9HUkVTUywNCiAgICBJMkNfRkFJTEVELA0KICAgIEkyQ19USU1FRF9PVVQNCn0gaTJjX3N0YXR1c190Ow0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgaTJjX3NsYXZlX2hhbmRsZXJfcmV0X3QgdHlwZSBpcyB1c2VkIGJ5IHNsYXZlIHdyaXRlIGhhbmRsZXIgZnVuY3Rpb25zDQogIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZSByZWNlaXZlZCBkYXRhIGJ1ZmZlciBzaG91bGQgYmUgcmVsZWFzZWQuDQogKi8NCnR5cGVkZWYgZW51bSBpMmNfc2xhdmVfaGFuZGxlcl9yZXQgew0KICAgIEkyQ19SRUVOQUJMRV9TTEFWRV9SWCA9IDB1LA0KICAgIEkyQ19QQVVTRV9TTEFWRV9SWCA9IDF1DQp9IGkyY19zbGF2ZV9oYW5kbGVyX3JldF90Ow0KDQp0eXBlZGVmIHN0cnVjdCBpMmNfaW5zdGFuY2UgaTJjX2luc3RhbmNlX3QgOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBTbGF2ZSB3cml0ZSBoYW5kbGVyIGZ1bmN0aW9ucyBwcm90b3R5cGUuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBUaGlzIGRlZmluZXMgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZSB0aGF0IG11c3QgYmUgZm9sbG93ZWQgYnkgIEkyQyBzbGF2ZSB3cml0ZQ0KICBoYW5kbGVyIGZ1bmN0aW9ucy4gVGhlc2UgZnVuY3Rpb25zIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIENvcmVJMkMgZHJpdmVyDQogIHRocm91Z2ggdGhlIEkyQ19yZWdpc3Rlcl93cml0ZV9oYW5kbGVyKCkgZnVuY3Rpb24uDQoNCiAgRGVjbGFyaW5nIGFuZCBJbXBsZW1lbnRpbmcgU2xhdmUgV3JpdGUgSGFuZGxlciBGdW5jdGlvbnM6DQogICAgU2xhdmUgd3JpdGUgaGFuZGxlciBmdW5jdGlvbnMgc2hvdWxkIGZvbGxvdyB0aGUgZm9sbG93aW5nIHByb3RvdHlwZToNCiAgICBpMmNfc2xhdmVfaGFuZGxlcl9yZXRfdCB3cml0ZV9oYW5kbGVyDQogICAgKCANCiAgICAgICAgaTJjX2luc3RhbmNlX3QgKmluc3RhbmNlLCB1aW50OF90ICogZGF0YSwgdWludDE2X3Qgc2l6ZSANCiAgICApOw0KDQogICAgVGhlIGluc3RhbmNlIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGZvciB3aGljaCB0aGlzDQogICAgc2xhdmUgd3JpdGUgaGFuZGxlciBoYXMgYmVlbiBkZWNsYXJlZC4NCiAgICANCiAgICBUaGUgZGF0YSBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIChyZWNlaXZlZCBkYXRhIGJ1ZmZlcikgaG9sZGluZw0KICAgIHRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlIEkyQyBzbGF2ZS4NCiAgICANCiAgICBEZWZpbmluZyB0aGUgbWFjcm8gSU5DTFVERV9TTEFfSU5fUlhfUEFZTE9BRCBjYXVzZXMgdGhlIGRyaXZlciB0byBpbnNlcnQgdGhlDQogICAgYWN0dWFsIGFkZHJlc3MgdXNlZCB0byBhY2Nlc3MgdGhlIHNsYXZlIGFzIHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIuDQogICAgVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIHRhaWxvciB0aGVpciByZXNwb25zZSBiYXNlZCBvbiB0aGUgYWN0dWFsIGFkZHJlc3MNCiAgICB1c2VkIHRvIGFjY2VzcyB0aGUgc2xhdmUgKHByaW1hcnkgYWRkcmVzcywgc2Vjb25kYXJ5IGFkZHJlc3Mgb3IgR0NBKS4NCiAgICANCiAgICBUaGUgc2l6ZSBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiBieXRlcyBoZWxkIGluIHRoZSByZWNlaXZlZCBkYXRhIGJ1ZmZlci4NCiAgICBIYW5kbGVyIGZ1bmN0aW9ucyBtdXN0IHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICAgICAgIEkyQ19SRUVOQUJMRV9TTEFWRV9SWA0KICAgICAgICBJMkNfUEFVU0VfU0xBVkVfUlguDQogICAgICAgIA0KICAgIElmIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHJldHVybnMgSTJDX1JFRU5BQkxFX1NMQVZFX1JYLCB0aGUgZHJpdmVyIHJlbGVhc2VzDQogICAgdGhlIHJlY2VpdmVkIGRhdGEgYnVmZmVyIGFuZCBhbGxvd3MgZnVydGhlciBJMkMgd3JpdGUgdHJhbnNhY3Rpb25zIHRvIHRoZQ0KICAgIEkyQyBzbGF2ZSB0byB0YWtlIHBsYWNlLg0KICAgIA0KICAgIElmIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHJldHVybnMgSTJDX1BBVVNFX1NMQVZFX1JYLCB0aGUgSTJDIHNsYXZlIHJlc3BvbmRzDQogICAgdG8gc3Vic2VxdWVudCB3cml0ZSByZXF1ZXN0cyB3aXRoIGEgbm9uLWFja25vd2xlZGdlIGJpdCAoTkFDSyksIHVudGlsIHRoZQ0KICAgIHJlY2VpdmVkIGRhdGEgYnVmZmVyIGNvbnRlbnQgaGFzIGJlZW4gcHJvY2Vzc2VkIGJ5IHNvbWUgb3RoZXIgcGFydCBvZiB0aGUNCiAgICBzb2Z0d2FyZSBhcHBsaWNhdGlvbi4NCiAgICANCiAgICBBIGNhbGwgdG8gSTJDX2VuYWJsZV9zbGF2ZSgpIGlzIHJlcXVpcmVkIGF0IHNvbWUgcG9pbnQgYWZ0ZXIgcmV0dXJuaW5nDQogICAgSTJDX1BBVVNFX1NMQVZFX1JYIGluIG9yZGVyIHRvIHJlbGVhc2UgdGhlIHJlY2VpdmVkIGRhdGEgYnVmZmVyIHNvIGl0IGNhbg0KICAgIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSByZWNlaXZlZCBieSBzdWJzZXF1ZW50IEkyQyB3cml0ZSB0cmFuc2FjdGlvbnMuDQogKi8NCnR5cGVkZWYgaTJjX3NsYXZlX2hhbmRsZXJfcmV0X3QgKCppMmNfc2xhdmVfd3JfaGFuZGxlcl90KShpMmNfaW5zdGFuY2VfdCAqaW5zdGFuY2UsIHVpbnQ4X3QgKiwgdWludDE2X3QgKTsNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBpMmNfaW5zdGFuY2VfdA0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgdmFyaW91cyBDb3JlSTJDIGhhcmR3YXJlIGluc3RhbmNlcyBpbg0KICB5b3VyIHN5c3RlbSBhbmQgdGhlIEkyQyBjaGFubmVscyB3aXRoaW4gdGhlbS4gWW91ciBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQNCiAgZGVjbGFyZSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgZm9yIGVhY2ggY2hhbm5lbCBvZiBlYWNoIGluc3RhbmNlIG9mDQogIENvcmVJMkMgaW4geW91ciBzeXN0ZW0uIFRoZSBmdW5jdGlvbnMgSTJDX2luaXQoKSBhbmQgSTJDX2NoYW5uZWxfaW5pdCgpIA0KICBpbml0aWFsaXplIHRoaXMgc3RydWN0dXJlIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIGNoYW5uZWwgMCBvciBvbmUgb2YgdGhlDQogIGFkZGl0aW9uYWwgY2hhbm5lbHMgcmVzcGVjdGl2ZWx5LiBBIHBvaW50ZXIgdG8gYW4gaW5pdGlhbGl6ZWQgaW5zdGFuY2Ugb2YgdGhlDQogIHN0cnVjdHVyZSBzaG91bGQgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gdGhlIENvcmVJMkMgZHJpdmVyDQogIGZ1bmN0aW9ucywgdG8gaWRlbnRpZnkgd2hpY2ggQ29yZUkyQyBoYXJkd2FyZSBpbnN0YW5jZSBhbmQgY2hhbm5lbCBzaG91bGQNCiAgcGVyZm9ybSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4NCiAgDQogIFRoZSBjb250ZW50cyBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgb3IgdXNlZCBvdXRzaWRlIG9mDQogIHRoZSBDb3JlSTJDIGRyaXZlci4gU29mdHdhcmUgdXNpbmcgdGhlIENvcmVJMkMgZHJpdmVyIHNob3VsZCBvbmx5IG5lZWQgdG8gDQogIGNyZWF0ZSBvbmUgc2luZ2xlIGluc3RhbmNlIG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgZm9yIGVhY2ggY2hhbm5lbCBvZiBlYWNoIA0KICBDb3JlSTJDIGhhcmR3YXJlIGluc3RhbmNlIGluIHRoZSBzeXN0ZW0gdGhlbiBwYXNzIGEgcG9pbnRlciB0byB0aGVzZSBkYXRhDQogIHN0cnVjdHVyZXMgd2l0aCBlYWNoIGNhbGwgdG8gdGhlIENvcmVJMkMgZHJpdmVyIGluIG9yZGVyIHRvIGlkZW50aWZ5IHRoZQ0KICBDb3JlSTJDIGhhcmR3YXJlIGluc3RhbmNlIGl0IHdpc2hlcyB0byB1c2UuDQogKi8NCnN0cnVjdCBpMmNfaW5zdGFuY2UNCnsNCiAgICBhZGRyX3QgYmFzZV9hZGRyZXNzOw0KICAgIHVpbnRfZmFzdDhfdCBzZXJfYWRkcmVzczsNCg0KICAgIC8qIFRyYW5zbWl0IHJlbGF0ZWQgaW5mbzoqLw0KICAgIHVpbnRfZmFzdDhfdCB0YXJnZXRfYWRkcjsNCg0KICAgIC8qIEN1cnJlbnQgdHJhbnNhY3Rpb24gdHlwZSAoV1JJVEUsIFJFQUQsIFJBTkRPTV9SRUFEKSovDQogICAgdWludDhfdCB0cmFuc2FjdGlvbjsNCiAgICANCiAgICB1aW50X2Zhc3QxNl90IHJhbmRvbV9yZWFkX2FkZHI7DQoNCiAgICB1aW50OF90IG9wdGlvbnM7DQogICAgDQogICAgLyogTWFzdGVyIFRYIElORk86ICovDQogICAgY29uc3QgdWludDhfdCAqIG1hc3Rlcl90eF9idWZmZXI7DQogICAgdWludF9mYXN0MTZfdCBtYXN0ZXJfdHhfc2l6ZTsNCiAgICB1aW50X2Zhc3QxNl90IG1hc3Rlcl90eF9pZHg7DQogICAgdWludF9mYXN0OF90IGRpcjsNCiAgICANCiAgICAvKiBNYXN0ZXIgUlggSU5GTzogKi8NCiAgICB1aW50OF90ICogbWFzdGVyX3J4X2J1ZmZlcjsNCiAgICB1aW50X2Zhc3QxNl90IG1hc3Rlcl9yeF9zaXplOw0KICAgIHVpbnRfZmFzdDE2X3QgbWFzdGVyX3J4X2lkeDsNCg0KICAgIC8qIE1hc3RlciBTdGF0dXMgKi8NCiAgICB2b2xhdGlsZSBpMmNfc3RhdHVzX3QgbWFzdGVyX3N0YXR1czsNCiAgICB1aW50MzJfdCBtYXN0ZXJfdGltZW91dF9tczsNCg0KICAgIC8qIFNsYXZlIFRYIElORk8gKi8NCiAgICBjb25zdCB1aW50OF90ICogc2xhdmVfdHhfYnVmZmVyOw0KICAgIHVpbnRfZmFzdDE2X3Qgc2xhdmVfdHhfc2l6ZTsNCiAgICB1aW50X2Zhc3QxNl90IHNsYXZlX3R4X2lkeDsNCiAgICANCiAgICAvKiBTbGF2ZSBSWCBJTkZPICovDQogICAgdWludDhfdCAqIHNsYXZlX3J4X2J1ZmZlcjsNCiAgICB1aW50X2Zhc3QxNl90IHNsYXZlX3J4X3NpemU7DQogICAgdWludF9mYXN0MTZfdCBzbGF2ZV9yeF9pZHg7DQogICAgLyogU2xhdmUgU3RhdHVzICovDQogICAgdm9sYXRpbGUgaTJjX3N0YXR1c190IHNsYXZlX3N0YXR1czsNCiAgICANCiAgICAvKiBTbGF2ZSBkYXRhOiAqLw0KICAgIHVpbnRfZmFzdDhfdCBzbGF2ZV9tZW1fb2Zmc2V0X2xlbmd0aDsNCiAgICBpMmNfc2xhdmVfd3JfaGFuZGxlcl90IHNsYXZlX3dyaXRlX2hhbmRsZXI7DQogICAgdWludDhfdCBpc19zbGF2ZV9lbmFibGVkOw0KICAgIA0KICAgIC8qIHVzZXIgIHNwZWNpZmljIGRhdGEgKi8NCiAgICB2b2lkICpwX3VzZXJfZGF0YSA7DQoNCiAgICAvKiBJMkMgYnVzIHN0YXR1cyAqLw0KICAgIHVpbnQ4X3QgYnVzX3N0YXR1czsNCg0KICAgIC8qIElzIHRyYW5zYWN0aW9uIHBlbmRpbmcgZmxhZyAqLw0KICAgIHVpbnQ4X3QgaXNfdHJhbnNhY3Rpb25fcGVuZGluZzsNCg0KICAgIC8qIEkyQyBQZW5kaW5nIHRyYW5zYWN0aW9uICovDQogICAgdWludDhfdCBwZW5kaW5nX3RyYW5zYWN0aW9uOw0KfTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgSTJDIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBUaGUgSTJDX2luaXQoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBjaGFubmVsIDAgb2YgYSBDb3JlSTJDIGluc3RhbmNlLg0KICBJdCBzZXRzIHRoZSBiYXNlIGhhcmR3YXJlIGFkZHJlc3Mgd2hpY2ggaXMgdXNlZCB0byBsb2NhdGUgdGhlIENvcmVJMkMgaW5zdGFuY2UNCiAgaW4gbWVtb3J5IGFuZCBhbHNvIHVzZWQgaW50ZXJuYWxseSBieSBJMkNfY2hhbm5lbF9pbml0KCkgdG8gY2FsY3VsYXRlIHRoZQ0KICByZWdpc3RlciBhZGRyZXNzZXMgZm9yIGFueSBhZGRpdGlvbmFsIGNoYW5uZWxzLiBUaGUgc2xhdmUgc2VyaWFsIGFkZHJlc3Mgc2V0DQogIGlzIHNoYXJlZCBieSBhbGwgY2hhbm5lbHMgb24gYSBDb3JlSTJDIGluc3RhbmNlLiANCiAgDQogIElmIG9ubHkgb25lIGNoYW5uZWwgaXMgY29uZmlndXJlZCBpbiBhIENvcmVJMkMsIHRoZSBhZGRyZXNzIG9mIHRoZSANCiAgaTJjX2luc3RhbmNlX3QgdXNlZCBpbiBJMkNfSW5pdCgpIHdpbGwgYWxzbyBiZSB1c2VkIGluIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlDQogIENvcmVJMkMgZHJpdmVyIGZ1bmN0aW9ucy4gSWYgbW9yZSB0aGFuIG9uZSBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgaW4gdGhlDQogIENvcmVJMkMsIEkyQ19jaGFubmVsX2luaXQoKSB3aWxsIGJlIGNhbGxlZCBhZnRlciBJMkNfaW5pdCgpLCB3aGljaCBpbml0aWFsaXplcw0KICB0aGUgaTJjX2luc3RhbmNlX3QgZGF0YSBzdHJ1Y3R1cmUgZm9yIGEgc3BlY2lmaWMgY2hhbm5lbC4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogQHBhcmFtIHRoaXNfaTJjOg0KICAgIFBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlIHdoaWNoIHdpbGwgaG9sZCBhbGwgZGF0YQ0KICAgIHJlbGF0ZWQgdG8gY2hhbm5lbCAwIG9mIHRoZSBDb3JlSTJDIGluc3RhbmNlIGJlaW5nIGluaXRpYWxpemVkLiBBIHBvaW50ZXINCiAgICB0byB0aGlzIHN0cnVjdHVyZSB3aWxsIGJlIHVzZWQgaW4gYWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gQ29yZUkyQyBkcml2ZXINCiAgICBmdW5jdGlvbnMgd2hpY2ggYXJlIHRvIG9wZXJhdGUgb24gY2hhbm5lbCAwIG9mIHRoaXMgQ29yZUkyQyBpbnN0YW5jZS4NCiAgDQogIEBwYXJhbSBiYXNlX2FkZHJlc3M6DQogICAgQmFzZSBhZGRyZXNzIGluIHRoZSBwcm9jZXNzb3IncyBtZW1vcnkgbWFwIG9mIHRoZSByZWdpc3RlcnMgb2YgdGhlIENvcmVJMkMNCiAgICBpbnN0YW5jZSBiZWluZyBpbml0aWFsaXplZC4NCiANCiAgQHBhcmFtIHNlcl9hZGRyZXNzOg0KICAgIFRoaXMgcGFyYW1ldGVyIHNldHMgdGhlIHByaW1hcnkgSTJDIHNlcmlhbCBhZGRyZXNzIChTTEFWRTAgYWRkcmVzcykgZm9yIHRoZQ0KICAgIENvcmVJMkMgYmVpbmcgaW5pdGlhbGl6ZWQuIEl0IGlzIHRoZSBwcmluY2lwYWwgSTJDIGJ1cyBhZGRyZXNzIHRvIHdoaWNoIHRoZQ0KICAgIENvcmVJMkMgaW5zdGFuY2Ugd2lsbCByZXNwb25kLiBDb3JlSTJDIGNhbiBvcGVyYXRlIGluIG1hc3RlciBtb2RlIG9yIHNsYXZlDQogICAgbW9kZSBhbmQgdGhlIHNlcmlhbCBhZGRyZXNzIGlzIHNpZ25pZmljYW50IG9ubHkgaW4gdGhlIGNhc2Ugb2YgSTJDIHNsYXZlDQogICAgbW9kZS4gSW4gbWFzdGVyIG1vZGUsIENvcmVJMkMgZG9lcyBub3QgcmVxdWlyZSBhIHNlcmlhbCBhZGRyZXNzIGFuZCB0aGUNCiAgICB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgaW1wb3J0YW50LiBJZiB5b3UgZG8gbm90IGludGVuZCB0byB1c2UgdGhlDQogICAgQ29yZUkyQyBkZXZpY2UgaW4gc2xhdmUgbW9kZSwgdGhlbiBhbnkgZHVtbXkgc2xhdmUgYWRkcmVzcyB2YWx1ZSBjYW4gYmUNCiAgICBwcm92aWRlZCB0byB0aGlzIHBhcmFtZXRlci4gSG93ZXZlciwgaW4gc3lzdGVtcyB3aGVyZSB0aGUgQ29yZUkyQyBtYXkgYmUNCiAgICBleHBlY3RlZCB0byBzd2l0Y2ggZnJvbSBtYXN0ZXIgbW9kZSB0byBzbGF2ZSBtb2RlLCBpdCBpcyBhZHZpc2FibGUgdG8NCiAgICBpbml0aWFsaXplIHRoZSBDb3JlSTJDIGRldmljZSB3aXRoIGEgdmFsaWQgc2VyaWFsIHNsYXZlIGFkZHJlc3MuDQogICAgDQogICAgWW91IG5lZWQgdG8gY2FsbCB0aGUgSTJDX2luaXQoKSBmdW5jdGlvbiB3aGVuZXZlciBpdCBpcyByZXF1aXJlZCB0byBjaGFuZ2UgDQogICAgdGhlIHByaW1hcnkgc2xhdmUgYWRkcmVzcyBhcyB0aGVyZSBpcyBubyBzZXBhcmF0ZSBmdW5jdGlvbiB0byBzZXQgdGhlDQogICAgcHJpbWFyeSBzbGF2ZSBhZGRyZXNzIG9mIHRoZSBJMkMgZGV2aWNlLiBUaGUgc2VyaWFsIGFkZHJlc3MgYmVpbmcNCiAgICBpbml0aWFsaXplZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IHRoZSBwcmltYXJ5IHNsYXZlIGFkZHJlc3Mgb3INCiAgICBzbGF2ZSBhZGRyZXNzMC4gSTJDX3NldF9zbGF2ZV9zZWNvbmRfYWRkcigpIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUNCiAgICBzZWNvbmRhcnkgc2xhdmUgYWRkcmVzcyBvciBzbGF2ZSBhZGRyZXNzIDEuDQogICAgTm90ZSA6IHNlcl9hZGRyZXNzIHBhcmFtZXRlciBkb2VzIG5vdCBoYXZlIGFueSBhZmZlY3QgaWYgZml4ZWQgc2xhdmUgDQogICAgICAgICAgIGFkZHJlc3MgaXMgZW5hYmxlZCBpbiBDb3JlSTJDIGhhcmR3YXJlIGRlc2lnbi4gQ29yZUkyQyB3aWxsIA0KICAgICAgICAgICBiZSBhbHdheXMgYWRkcmVzc2VkIHdpdGggdGhlIGhhcmR3YXJlIGNvbmZpZ3VyZWQgZml4ZWQgc2xhdmUNCiAgICAgICAgICAgYWRkcmVzcy4NCiAgICBOb3RlIDogc2VyX2FkZHJlc3MgcGFyYW1ldGVyIHdpbGwgbm90IGhhdmUgYW55IGFmZmVjdCBpZiB0aGUgQ29yZUkyQw0KICAgICAgICAgICBpbnN0YW5jZSBpcyBvbmx5IHVzZWQgaW4gbWFzdGVyIG1vZGUuDQoNCiAgQHBhcmFtIHNlcl9jbG9ja19zcGVlZDoNCiAgICBUaGlzIHBhcmFtZXRlciBzZXRzIHRoZSBJMkMgc2VyaWFsIGNsb2NrIGZyZXF1ZW5jeS4gSXQgc2VsZWN0cyB0aGUgZGl2aWRlcg0KICAgIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzZXJpYWwgY2xvY2sgZnJvbSB0aGUgQVBCIFBDTEsgb3IgZnJvbQ0KICAgIHRoZSBCQ0xLLiBJdCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6DQogICAgICAgIEkyQ19QQ0xLX0RJVl8yNTYNCiAgICAgICAgSTJDX1BDTEtfRElWXzIyNA0KICAgICAgICBJMkNfUENMS19ESVZfMTkyDQogICAgICAgIEkyQ19QQ0xLX0RJVl8xNjANCiAgICAgICAgSTJDX1BDTEtfRElWXzk2MA0KICAgICAgICBJMkNfUENMS19ESVZfMTIwDQogICAgICAgIEkyQ19QQ0xLX0RJVl82MA0KICAgICAgICBJMkNfQkNMS19ESVZfOA0KICAgIE5vdGU6IHNlcmlhbF9jbG9ja19zcGVlZCB2YWx1ZSB3aWxsIGhhdmUgbm8gYWZmZWN0IGlmIEZpeGVkIGJhdWQgcmF0ZSBpcyANCiAgICAgICAgICBlbmFibGVkIGluIENvcmVJMkMgaGFyZHdhcmUgaW5zdGFuY2UgY29uZmlndXJhdGlvbiBkaWFsb2d1ZSB3aW5kb3cuIA0KICAgICAgICAgIFRoZSBmaXhlZCBiYXVkIHJhdGUgZGl2aWRlciB2YWx1ZSB3aWxsIG92ZXJyaWRlIHRoZSB2YWx1ZQ0KICAgICAgICAgIHBhc3NlZCBhcyBwYXJhbWV0ZXIgaW4gdGhpcyBmdW5jdGlvbi4NCiAgICBOb3RlOiBzZXJpYWxfY2xvY2tfc3BlZWQgdmFsdWUgaXMgbm90IGNyaXRpY2FsIGZvciBkZXZpY2VzIHRoYXQgb25seSBvcGVyYXRlDQogICAgICAgICAgYXMgc2xhdmVzIGFuZCBjYW4gYmUgc2V0IHRvIGFueSBvZiB0aGUgYWJvdmUgdmFsdWVzLiAgDQoNCiAgQHJldHVybiBub25lLiAgDQogIA0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgICNkZWZpbmUgQ09SRUkyQ19CQVNFX0FERFIgIDB4QzAwMDAwMDB1DQogICAgI2RlZmluZSBDT1JFSTJDX1NFUl9BRERSICAgMHgxMHUNCg0KICAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQoNCiAgICB2b2lkIHN5c3RlbV9pbml0KCB2b2lkICkNCiAgICB7DQogICAgICAgIEkyQ19pbml0KCAmZ19pMmNfaW5zdCwgQ09SRUkyQ19CQVNFX0FERFIsIENPUkVJMkNfU0VSX0FERFIsDQogICAgICAgICAgICAgICAgICBJMkNfUENMS19ESVZfMjU2ICk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIEkyQ19pbml0DQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYywNCiAgICBhZGRyX3QgYmFzZV9hZGRyZXNzLA0KICAgIHVpbnQ4X3Qgc2VyX2FkZHJlc3MsDQogICAgaTJjX2Nsb2NrX2RpdmlkZXJfdCBzZXJfY2xvY2tfc3BlZWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIEkyQyBjaGFubmVsIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBUaGUgSTJDX2NoYW5uZWxfaW5pdCgpIGZ1bmN0aW9uIGluaXRpYWxpemVzIGFuZCBjb25maWd1cmVzIGhhcmR3YXJlIGFuZCBkYXRhDQogIHN0cnVjdHVyZXMgb2Ygb25lIG9mIHRoZSBhZGRpdGlvbmFsIGNoYW5uZWxzIG9mIGEgQ29yZUkyQyBpbnN0YW5jZS4NCiAgSTJDX2luaXQoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgQ29yZUkyQw0KICBpbnN0YW5jZSBoYXJkd2FyZSBiYXNlIGFkZHJlc3MgYW5kIEkyQyBzZXJpYWwgYWRkcmVzcy4gSTJDX2NoYW5uZWxfaW5pdCgpIGFsc28NCiAgaW5pdGlhbGl6ZXMgSTJDIHNlcmlhbCBjbG9jayBkaXZpZGVyIHRvIHNldCB0aGUgc2VyaWFsIGNsb2NrIGJhdWQgcmF0ZS4gIA0KICBUaGUgcG9pbnRlciB0byBkYXRhIHN0cnVjdHVyZSBpMmNfaW5zdGFuY2VfdCB1c2VkIGZvciBhIHBhcnRpY3VsYXIgY2hhbm5lbA0KICB3aWxsIGJlIHVzZWQgYXMgYW4gaW5wdXQgcGFyYW1ldGVyIHRvIHN1YnNlcXVlbnQgQ29yZUkyQyBkcml2ZXIgZnVuY3Rpb25zDQogIHdoaWNoIG9wZXJhdGUgb24gdGhpcyBjaGFubmVsLg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQHBhcmFtIHRoaXNfaTJjX2NoYW5uZWwNCiAgICBQb2ludGVyIHRvIHRoZSBpMmNfaW5zdGFuY2VfdCBkYXRhIHN0cnVjdHVyZSBob2xkaW5nIGFsbCBkYXRhIHJlbGF0ZWQgdG8gdGhlDQogICAgQ29yZUkyQyBjaGFubmVsIGJlaW5nIGluaXRpYWxpemVkLiBBIHBvaW50ZXIgdG8gdGhlIHNhbWUgZGF0YSBzdHJ1Y3R1cmUgd2lsbA0KICAgIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxscyB0byB0aGUgQ29yZUkyQyBkcml2ZXIgZnVuY3Rpb25zIGluIG9yZGVyIHRvDQogICAgaWRlbnRpZnkgdGhlIENvcmVJMkMgY2hhbm5lbCBpbnN0YW5jZSB0aGF0IHNob3VsZCBwZXJmb3JtIHRoZSBvcGVyYXRpb24gDQogICAgaW1wbGVtZW50ZWQgYnkgdGhlIGNhbGxlZCBkcml2ZXIgZnVuY3Rpb24uDQoNCiAgQHBhcmFtIHRoaXNfaTJjOg0KICAgIFRoaXMgaXMgYSBwb2ludGVyIHRvIGFuIGkyY19pbnN0YW5jZV90IHN0cnVjdHVyZSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGJ5DQogICAgSTJDX2luaXQoKS4gSXQgaG9sZHMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBoYXJkd2FyZSBiYXNlIGFkZHJlc3MgYW5kDQogICAgSTJDIHNlcmlhbCBhZGRyZXNzIGZvciB0aGUgQ29yZUkyQyBjb250YWluaW5nIHRoZSBjaGFubmVsIHRvIGJlDQogICAgaW5pdGlhbGl6ZWQuIFRoaXMgaW5mb3JtYXRpb24gaXMgcmVxdWlyZWQgYnkgSTJDX2NoYW5uZWxfaW5pdCgpIHRvDQogICAgaW5pdGlhbGl6ZSB0aGUgaTJjX2luc3RhbmNlX3Qgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhpc19pMmNfY2hhbm5lbCBhcw0KICAgIGFsbCBjaGFubmVscyBpbiBhIENvcmVJMkMgaW5zdGFuY2Ugc2hhcmUgdGhlIHNhbWUgYmFzZSBhZGRyZXNzIGFuZCBzZXJpYWwNCiAgICBhZGRyZXNzLiBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZSBpMmNfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgcG9pbnRlZCB0bw0KICAgIGJ5IHRoaXNfaTJjIGhhcyBiZWVuIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgd2l0aCBhIGNhbGwgdG8gSTJDX2luaXQoKS4NCiAgICANCiAgQHBhcmFtIGNoYW5uZWxfbnVtYmVyOg0KICAgIFRoaXMgcGFyYW1ldGVyIG9mIHR5cGUgaTJjX2NoYW5uZWxfbnVtYmVyX3QgaWRlbnRpZmllcyB0aGUgY2hhbm5lbCB0byBiZQ0KICAgIGluaXRpYWxpemVkLg0KDQogIEBwYXJhbSBzZXJfY2xvY2tfc3BlZWQ6DQogICAgVGhpcyBwYXJhbWV0ZXIgc2V0cyB0aGUgSTJDIHNlcmlhbCBjbG9jayBmcmVxdWVuY3kuIEl0IHNlbGVjdHMgdGhlIGRpdmlkZXINCiAgICB0aGF0IHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgc2VyaWFsIGNsb2NrIGZyb20gdGhlIEFQQiBQQ0xLIG9yIGZyb20NCiAgICB0aGUgQkNMSy4gSXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOg0KICAgICAgICBJMkNfUENMS19ESVZfMjU2DQogICAgICAgIEkyQ19QQ0xLX0RJVl8yMjQNCiAgICAgICAgSTJDX1BDTEtfRElWXzE5Mg0KICAgICAgICBJMkNfUENMS19ESVZfMTYwDQogICAgICAgIEkyQ19QQ0xLX0RJVl85NjANCiAgICAgICAgSTJDX1BDTEtfRElWXzEyMA0KICAgICAgICBJMkNfUENMS19ESVZfNjANCiAgICAgICAgSTJDX0JDTEtfRElWXzgNCiAgICANCiAgICBOb3RlOiBzZXJpYWxfY2xvY2tfc3BlZWQgdmFsdWUgd2lsbCBoYXZlIG5vIGFmZmVjdCBpZiBGaXhlZCBiYXVkIHJhdGUgaXMgDQogICAgICAgICAgZW5hYmxlZCBpbiBDb3JlSTJDIGhhcmR3YXJlIGluc3RhbmNlIGNvbmZpZ3VyYXRpb24gZGlhbG9ndWUgd2luZG93LiANCiAgICAgICAgICBUaGUgZml4ZWQgYmF1ZCByYXRlIGRpdmlkZXIgdmFsdWUgd2lsbCBzdXBlcnNlZGUgdGhlIHZhbHVlIA0KICAgICAgICAgIHBhc3NlZCBhcyBwYXJhbWV0ZXIgaW4gdGhpcyBmdW5jdGlvbi4NCg0KICAgIE5vdGU6IHNlcl9jbG9ja19zcGVlZCB2YWx1ZSBpcyBub3QgY3JpdGljYWwgZm9yIGRldmljZXMgdGhhdCBvbmx5IG9wZXJhdGUNCiAgICAgICAgICBhcyBzbGF2ZXMgYW5kIGNhbiBiZSBzZXQgdG8gYW55IG9mIHRoZSBhYm92ZSB2YWx1ZXMuICANCiAgQHJldHVybiBub25lLiAgDQogIA0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgICNkZWZpbmUgQ09SRUkyQ19CQVNFX0FERFIgIDB4QzAwMDAwMDB1DQogICAgI2RlZmluZSBDT1JFSTJDX1NFUl9BRERSICAgMHgxMHUNCiAgICAjZGVmaW5lIERBVEFfTEVOR1RIICAgICAgICAxNnUNCg0KICAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQogICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfY2hhbm5lbF8xX2luc3Q7DQoNCiAgICB1aW50OF90ICB0eF9idWZmZXJbREFUQV9MRU5HVEhdOw0KICAgIHVpbnQ4X3QgIHdyaXRlX2xlbmd0aCA9IERBVEFfTEVOR1RIOw0KDQogICAgdm9pZCBzeXN0ZW1faW5pdCggdm9pZCApDQogICAgew0KICAgICAgICB1aW50OF90ICB0YXJnZXRfc2xhdmVfYWRkciA9IDB4MTI7DQogICAgICAgIA0KICAgICAgICAvLyBJbml0aWFsaXplIGJhc2UgQ29yZUkyQyBpbnN0YW5jZQ0KICAgICAgICBJMkNfaW5pdCggJmdfaTJjX2luc3QsIENPUkVJMkNfQkFTRV9BRERSLCBDT1JFSTJDX1NFUl9BRERSLA0KICAgICAgICAgICAgICAgICAgSTJDX1BDTEtfRElWXzI1NiApOw0KICAgICAgICANCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBDb3JlSTJDIGNoYW5uZWwgMSB3aXRoIGRpZmZlcmVudCBjbG9jayBzcGVlZA0KICAgICAgICBJMkNfY2hhbm5lbF9pbml0KCAmZ19pMmNfY2hhbm5lbF8xX2luc3QsICZnX2kyY19pbnN0LCBJMkNfQ0hBTk5FTF8xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfUENMS19ESVZfMjI0ICk7DQogICAgICAgIA0KICAgICAgICAvLyBXcml0ZSBkYXRhIHRvIENoYW5uZWwgMSBvZiBDb3JlSTJDIGluc3RhbmNlLg0KICAgICAgICBJMkNfd3JpdGUoICZnX2kyY19jaGFubmVsXzFfaW5zdCwgdGFyZ2V0X3NsYXZlX2FkZHIsIHR4X2J1ZmZlciwNCiAgICAgICAgICAgICAgICAgICB3cml0ZV9sZW5ndGgsIEkyQ19SRUxFQVNFX0JVUyApOw0KICAgIH0NCiAgQGVuZGNvZGUNCiAgICAgICAgICANCiovDQp2b2lkIEkyQ19jaGFubmVsX2luaXQNCigNCiAgICBpMmNfaW5zdGFuY2VfdCAqIHRoaXNfaTJjX2NoYW5uZWwsDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYywNCiAgICBpMmNfY2hhbm5lbF9udW1iZXJfdCBjaGFubmVsX251bWJlciwNCiAgICBpMmNfY2xvY2tfZGl2aWRlcl90IHNlcl9jbG9ja19zcGVlZA0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQ29yZUkyQyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICBUaGUgZnVuY3Rpb24gSTJDX2lzciBpcyB0aGUgQ29yZUkyQyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiBVc2VyIG11c3QNCiAgICBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGVpciBhcHBsaWNhdGlvbiBsZXZlbCBDb3JlSTJDIGludGVycnVwdCBoYW5kbGVyDQogICAgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gcnVucyB0aGUgSTJDIHN0YXRlIG1hY2hpbmUgYmFzZWQgb24gcHJldmlvdXMgYW5kIA0KICAgIGN1cnJlbnQgc3RhdHVzLg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KICAgIA0KICAgIEByZXR1cm4gbm9uZQ0KICAgIA0KICAgIEV4YW1wbGU6DQogICAgQGNvZGUNCiAgICANCiAgICAjZGVmaW5lIENPUkVJMkNfQkFTRV9BRERSICAweEMwMDAwMDAwdQ0KICAgICNkZWZpbmUgQ09SRUlOVEVSUlVQVF9CQVNFX0FERFIgIDB4Q0MwMDAwMDB1DQogICAgI2RlZmluZSBDT1JFSTJDX1NFUl9BRERSICAgMHgxMHUNCiAgICAjZGVmaW5lIEkyQ19JUlFfTkIgICAgICAgICAgIDJ1DQogICAgDQogICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfaW5zdDsNCg0KICAgIHZvaWQgY29yZV9pMmNfaXNyKCB2b2lkICkNCiAgICB7DQogICAgICAgSTJDX2lzciggJmdfaTJjX2luc3QgKTsNCiAgICB9DQogICAgDQogICB2b2lkIG1haW4oIHZvaWQgKQ0KICAgIHsNCiAgICAgICAgQ0lDX2luaXQoIENPUkVJTlRFUlJVUFRfQkFTRV9BRERSICk7DQogICAgICAgIE5WSUNfaW5pdCgpOw0KICAgICAgICBDSUNfc2V0X2lycV9oYW5kbGVyKCBJMkNfSVJRX05CLCBjb3JlX2kyY19pc3IgKTsNCiAgICAgICAgSTJDX2luaXQoICZnX2kyY19pbnN0LCBDT1JFSTJDX0JBU0VfQUREUiwgQ09SRUkyQ19TRVJfQUREUiwNCiAgICAgICAgICAgICAgICAgIEkyQ19QQ0xLX0RJVl8yNTYgKTsNCiAgICAgICAgTlZJQ19lbmFibGVfaW50ZXJydXB0KCBOVklDX0lSUV8wICk7DQogICAgfQ0KICAgIEBlbmRjb2RlDQogKi8NCnZvaWQgSTJDX2lzcg0KKA0KICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc3RlciBzcGVjaWZpYyBmdW5jdGlvbnMNCiAqIA0KICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG9ubHkgdXNlZCB3aXRoaW4gYW4gSTJDIG1hc3RlcidzIGltcGxlbWVudGF0aW9uLg0KICovDQogDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBJMkMgbWFzdGVyIHdyaXRlIGZ1bmN0aW9uLg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgVGhpcyBmdW5jdGlvbiBpbml0aWF0ZXMgYW4gSTJDIG1hc3RlciB3cml0ZSB0cmFuc2FjdGlvbi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zDQogIGltbWVkaWF0ZWx5IGFmdGVyIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uLiBUaGUgY29udGVudCBvZiB0aGUgd3JpdGUgYnVmZmVyDQogIHBhc3NlZCBhcyBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCB1bnRpbCB0aGUgd3JpdGUgdHJhbnNhY3Rpb24NCiAgY29tcGxldGVzLiBJdCBhbHNvIG1lYW5zIHRoYXQgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSB3cml0ZSBidWZmZXIgc2hvdWxkDQogIG5vdCBiZSBmcmVlZCBvciBzaG91bGQgbm90IGdvIG91dCBvZiBzY29wZSBiZWZvcmUgdGhlIHdyaXRlIGNvbXBsZXRlcy4gWW91IGNhbg0KICBjaGVjayBmb3IgdGhlIHdyaXRlIHRyYW5zYWN0aW9uIGNvbXBsZXRpb24gdXNpbmcgdGhlIEkyQ19zdGF0dXMoKSBmdW5jdGlvbi4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEBwYXJhbSB0aGlzX2kyYzoNCiAgICBUaGUgdGhpc19pMmMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgaTJjX2luc3RhbmNlX3QgZGF0YSBzdHJ1Y3R1cmUNCiAgICBob2xkaW5nIGFsbCBkYXRhIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBDb3JlSTJDIGNoYW5uZWwuIEZvciBleGFtcGxlLCBpZiBvbmx5DQogICAgb25lIGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQsIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIA0KICAgIGNoYW5uZWwgMCBvZiB0aGUgaW5zdGFudGlhdGVkIENvcmVJMkMgaGFyZHdhcmUuDQoNCiAgQHBhcmFtIHNlcmlhbF9hZGRyOg0KICAgIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc2VyaWFsIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBJMkMgZGV2aWNlLg0KICANCiAgQHBhcmFtIHdyaXRlX2J1ZmZlcjoNCiAgICBUaGlzIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgaG9sZGluZyB0aGUgZGF0YSB0byBiZSB3cml0dGVuIHRvDQogICAgdGhlIHRhcmdldCBJMkMgZGV2aWNlLg0KICAgIENhcmUgbXVzdCBiZSB0YWtlbiBub3QgdG8gcmVsZWFzZSB0aGUgbWVtb3J5IHVzZWQgYnkgdGhpcyBidWZmZXIgYmVmb3JlIHRoZQ0KICAgIHdyaXRlIHRyYW5zYWN0aW9uIGNvbXBsZXRlcy4gRm9yIGV4YW1wbGUsIGl0IGlzIG5vdCBhcHByb3ByaWF0ZSB0byByZXR1cm4NCiAgICBmcm9tIGEgZnVuY3Rpb24gYWxsb2NhdGluZyB0aGlzIGJ1ZmZlciBhcyBhbiBhdXRvIGFycmF5IHZhcmlhYmxlIGJlZm9yZSB0aGUNCiAgICB3cml0ZSB0cmFuc2FjdGlvbiBjb21wbGV0ZXMgYXMgdGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIGJ1ZmZlcidzIG1lbW9yeSANCiAgICBiZWluZyBkZS1hbGxvY2F0ZWQgZnJvbSB0aGUgc3RhY2sgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucy4gVGhpcyBtZW1vcnkNCiAgICBjb3VsZCB0aGVuIGJlIHN1YnNlcXVlbnRseSByZXVzZWQgYW5kIG1vZGlmaWVkIGNhdXNpbmcgdW5leHBlY3RlZCBkYXRhIHRvIA0KICAgIGJlIHdyaXR0ZW4gdG8gdGhlIHRhcmdldCBJMkMgZGV2aWNlLg0KICANCiAgQHBhcmFtIHdyaXRlX3NpemU6DQogICAgTnVtYmVyIG9mIGJ5dGVzIGhlbGQgaW4gdGhlIHdyaXRlX2J1ZmZlciB0byBiZSB3cml0dGVuIHRvIHRoZSB0YXJnZXQgSTJDDQogICAgZGV2aWNlLg0KIA0KICBAcGFyYW0gb3B0aW9uczoNCiAgICBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBpbmRpY2F0ZSBpZiB0aGUgSTJDIGJ1cyBzaG91bGQgYmUgcmVsZWFzZWQNCiAgICBvbiBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSB0cmFuc2FjdGlvbi4gVXNpbmcgdGhlIEkyQ19SRUxFQVNFX0JVUw0KICAgIGNvbnN0YW50IGZvciB0aGUgb3B0aW9ucyBwYXJhbWV0ZXIgY2F1c2VzIGEgU1RPUCBiaXQgdG8gYmUgZ2VuZXJhdGVkIGF0IHRoZQ0KICAgIGVuZCBvZiB0aGUgd3JpdGUgdHJhbnNhY3Rpb24gY2F1c2luZyB0aGUgYnVzIHRvIGJlIHJlbGVhc2VkIGZvciBvdGhlciBJMkMNCiAgICBkZXZpY2VzIHRvIHVzZS4gVXNpbmcgdGhlIEkyQ19IT0xEX0JVUyBjb25zdGFudCBhcyBvcHRpb25zIHBhcmFtZXRlcg0KICAgIHByZXZlbnRzIGEgU1RPUCBiaXQgZnJvbSBiZWluZyBnZW5lcmF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgd3JpdGUNCiAgICB0cmFuc2FjdGlvbiwgcHJldmVudGluZyBvdGhlciBJMkMgZGV2aWNlcyBmcm9tIGluaXRpYXRpbmcgYSBidXMgdHJhbnNhY3Rpb24uDQogIA0KICBAcmV0dXJuIG5vbmUuICANCiAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgI2RlZmluZSBDT1JFSTJDX0JBU0VfQUREUiAgMHhDMDAwMDAwMHUNCiAgICAjZGVmaW5lIENPUkVJMkNfRFVNTVlfQUREUiAgIDB4MTB1DQogICAgI2RlZmluZSBEQVRBX0xFTkdUSCAgICAgICAgICAgMTZ1DQoNCiAgICBpMmNfaW5zdGFuY2VfdCBnX2kyY19pbnN0Ow0KDQogICAgdWludDhfdCAgdHhfYnVmZmVyW0RBVEFfTEVOR1RIXTsNCiAgICB1aW50OF90ICB3cml0ZV9sZW5ndGggPSBEQVRBX0xFTkdUSDsgICAgIA0KDQogICAgdm9pZCBtYWluKCB2b2lkICkNCiAgICB7DQogICAgICAgIHVpbnQ4X3QgIHRhcmdldF9zbGF2ZV9hZGRyID0gMHgxMjsNCiAgICAgICAgaTJjX3N0YXR1c190IHN0YXR1czsNCiAgICAgICAgDQogICAgICAgIC8vIEluaXRpYWxpemUgYmFzZSBDb3JlSTJDIGluc3RhbmNlDQogICAgICAgIEkyQ19pbml0KCAmZ19pMmNfaW5zdCwgQ09SRUkyQ19CQVNFX0FERFIsIENPUkVJMkNfRFVNTVlfQUREUiwNCiAgICAgICAgICAgICAgICAgIEkyQ19QQ0xLX0RJVl8yNTYgKTsNCiAgICAgICAgDQogICAgICAgIC8vIFdyaXRlIGRhdGEgdG8gQ2hhbm5lbCAwIG9mIENvcmVJMkMgaW5zdGFuY2UuDQogICAgICAgIEkyQ193cml0ZSggJmdfaTJjX2luc3QsIHRhcmdldF9zbGF2ZV9hZGRyLCB0eF9idWZmZXIsIHdyaXRlX2xlbmd0aCwNCiAgICAgICAgICAgICAgICAgICBJMkNfUkVMRUFTRV9CVVMgKTsNCiAgICAgICAgICAgICAgICAgICANCiAgICAgICAgLy8gV2FpdCBmb3IgY29tcGxldGlvbiBhbmQgcmVjb3JkIHRoZSBvdXRjb21lDQogICAgICAgIHN0YXR1cyA9IEkyQ193YWl0X2NvbXBsZXRlKCAmZ19pMmNfaW5zdCwgSTJDX05PX1RJTUVPVVQgKTsNCiAgICB9DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgSTJDX3dyaXRlDQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYywNCiAgICB1aW50OF90IHNlcmlhbF9hZGRyLA0KICAgIGNvbnN0IHVpbnQ4X3QgKiB3cml0ZV9idWZmZXIsDQogICAgdWludDE2X3Qgd3JpdGVfc2l6ZSwNCiAgICB1aW50OF90IG9wdGlvbnMNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIEkyQyBtYXN0ZXIgcmVhZC4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIGFuIEkyQyBtYXN0ZXIgcmVhZCB0cmFuc2FjdGlvbi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zDQogIGltbWVkaWF0ZWx5IGFmdGVyIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uLg0KICBUaGUgY29udGVudHMgb2YgdGhlIHJlYWQgYnVmZmVyIHBhc3NlZCBhcyBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBtb2RpZmllZA0KICB1bnRpbCB0aGUgcmVhZCB0cmFuc2FjdGlvbiBjb21wbGV0ZXMuIEl0IGFsc28gbWVhbnMgdGhhdCB0aGUgbWVtb3J5IGFsbG9jYXRlZA0KICBmb3IgdGhlIHJlYWQgYnVmZmVyIHNob3VsZCBub3QgYmUgZnJlZWQgb3Igc2hvdWxkIG5vdCBnbyBvdXQgb2Ygc2NvcGUgYmVmb3JlDQogIHRoZSByZWFkIGNvbXBsZXRlcy4gWW91IGNhbiBjaGVjayBmb3IgdGhlIHJlYWQgdHJhbnNhY3Rpb24gY29tcGxldGlvbiB1c2luZyANCiAgdGhlIEkyQ19zdGF0dXMoKSBmdW5jdGlvbi4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEBwYXJhbSB0aGlzX2kyYzoNCiAgICBUaGUgdGhpc19pMmMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgaTJjX2luc3RhbmNlX3QgZGF0YSBzdHJ1Y3R1cmUNCiAgICBob2xkaW5nIGFsbCBkYXRhIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBDb3JlSTJDIGNoYW5uZWwuIEZvciBleGFtcGxlLCBpZiBvbmx5DQogICAgb25lIGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQsIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIA0KICAgIGNoYW5uZWwgMCBvZiB0aGUgaW5zdGFudGlhdGVkIENvcmVJMkMgaGFyZHdhcmUuDQogIA0KICBAcGFyYW0gc2VyaWFsX2FkZHI6DQogICAgVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzZXJpYWwgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IEkyQyBkZXZpY2UuDQogIA0KICBAcGFyYW0gcmVhZF9idWZmZXINCiAgICBUaGlzIGlzIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB3aGVyZSB0aGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSB0YXJnZXQgZGV2aWNlDQogICAgd2lsbCBiZSBzdG9yZWQuDQogICAgQ2FyZSBtdXN0IGJlIHRha2VuIG5vdCB0byByZWxlYXNlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGlzIGJ1ZmZlciBiZWZvcmUgdGhlDQogICAgcmVhZCB0cmFuc2FjdGlvbiBjb21wbGV0ZXMuIEZvciBleGFtcGxlLCBpdCBpcyBub3QgYXBwcm9wcmlhdGUgdG8gcmV0dXJuDQogICAgZnJvbSBhIGZ1bmN0aW9uIGFsbG9jYXRpbmcgdGhpcyBidWZmZXIgYXMgYW4gYXV0byBhcnJheSB2YXJpYWJsZSBiZWZvcmUgdGhlDQogICAgcmVhZCB0cmFuc2FjdGlvbiBjb21wbGV0ZXMgYXMgdGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIGJ1ZmZlcidzIG1lbW9yeSBiZWluZw0KICAgIGRlLWFsbG9jYXRlZCBmcm9tIHRoZSBzdGFjayB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLiBUaGlzIG1lbW9yeSBjb3VsZA0KICAgIHRoZW4gYmUgc3Vic2VxdWVudGx5IHJlYWxsb2NhdGVkIHJlc3VsdGluZyBpbiB0aGUgcmVhZCB0cmFuc2FjdGlvbg0KICAgIGNvcnJ1cHRpbmcgdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkuIA0KDQogIEBwYXJhbSByZWFkX3NpemU6DQogICAgVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSB0YXJnZXQgZGV2aWNlLg0KICAgIFRoaXMgc2l6ZSBtdXN0IG5vdCBleGNlZWQgdGhlIHNpemUgb2YgdGhlIHJlYWRfYnVmZmVyIGJ1ZmZlci4NCiANCiAgQHBhcmFtIG9wdGlvbnM6DQogICAgVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gaW5kaWNhdGUgaWYgdGhlIEkyQyBidXMgc2hvdWxkIGJlIHJlbGVhc2VkDQogICAgb24gY29tcGxldGlvbiBvZiB0aGUgcmVhZCB0cmFuc2FjdGlvbi4gVXNpbmcgdGhlIEkyQ19SRUxFQVNFX0JVUw0KICAgIGNvbnN0YW50IGZvciB0aGUgb3B0aW9ucyBwYXJhbWV0ZXIgY2F1c2VzIGEgU1RPUCBiaXQgdG8gYmUgZ2VuZXJhdGVkIGF0IHRoZQ0KICAgIGVuZCBvZiB0aGUgcmVhZCB0cmFuc2FjdGlvbiBjYXVzaW5nIHRoZSBidXMgdG8gYmUgcmVsZWFzZWQgZm9yIG90aGVyIEkyQw0KICAgIGRldmljZXMgdG8gdXNlLiBVc2luZyB0aGUgSTJDX0hPTERfQlVTIGNvbnN0YW50IGFzIG9wdGlvbnMgcGFyYW1ldGVyDQogICAgcHJldmVudHMgYSBTVE9QIGJpdCBmcm9tIGJlaW5nIGdlbmVyYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSByZWFkIHRyYW5zYWN0aW9uLA0KICAgIHByZXZlbnRpbmcgb3RoZXIgSTJDIGRldmljZXMgZnJvbSBpbml0aWF0aW5nIGEgYnVzIHRyYW5zYWN0aW9uLg0KICAgIA0KICBAcmV0dXJuIG5vbmUuICANCiAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgI2RlZmluZSBDT1JFSTJDX0JBU0VfQUREUiAgMHhDMDAwMDAwMHUNCiAgICAjZGVmaW5lIENPUkVJMkNfRFVNTVlfQUREUiAgIDB4MTB1DQogICAgI2RlZmluZSBEQVRBX0xFTkdUSCAgICAgICAgICAgMTZ1DQoNCiAgICBpMmNfaW5zdGFuY2VfdCBnX2kyY19pbnN0Ow0KDQogICAgdWludDhfdCAgcnhfYnVmZmVyW0RBVEFfTEVOR1RIXTsNCiAgICB1aW50OF90ICByZWFkX2xlbmd0aCA9IERBVEFfTEVOR1RIOyAgICAgDQoNCiAgICB2b2lkIG1haW4oIHZvaWQgKQ0KICAgIHsNCiAgICAgICAgdWludDhfdCAgdGFyZ2V0X3NsYXZlX2FkZHIgPSAweDEyOw0KICAgICAgICBpMmNfc3RhdHVzX3Qgc3RhdHVzOw0KICAgICAgICANCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBiYXNlIENvcmVJMkMgaW5zdGFuY2UNCiAgICAgICAgSTJDX2luaXQoICZnX2kyY19pbnN0LCBDT1JFSTJDX0JBU0VfQUREUiwgQ09SRUkyQ19EVU1NWV9BRERSLA0KICAgICAgICAgICAgICAgICAgSTJDX1BDTEtfRElWXzI1NiApOw0KICAgICAgICANCiAgICAgICAgLy8gUmVhZCBkYXRhIGZyb20gdGFyZ2V0IHNsYXZlIENoYW5uZWwgMCBvZiBDb3JlSTJDIGluc3RhbmNlLg0KICAgICAgICBJMkNfcmVhZCggJmdfaTJjX2luc3QsIHRhcmdldF9zbGF2ZV9hZGRyLCByeF9idWZmZXIsIHJlYWRfbGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgSTJDX1JFTEVBU0VfQlVTICk7DQogICAgICAgIA0KICAgICAgICBzdGF0dXMgPSBJMkNfd2FpdF9jb21wbGV0ZSggJmdfaTJjX2luc3QsIEkyQ19OT19USU1FT1VUICk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIEkyQ19yZWFkDQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYywNCiAgICB1aW50OF90IHNlcmlhbF9hZGRyLA0KICAgIHVpbnQ4X3QgKiByZWFkX2J1ZmZlciwNCiAgICB1aW50MTZfdCByZWFkX3NpemUsDQogICAgdWludDhfdCBvcHRpb25zDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBJMkMgbWFzdGVyIHdyaXRlLXJlYWQNCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIGFuIEkyQyB3cml0ZS1yZWFkIHRyYW5zYWN0aW9uIHdoZXJlIGRhdGEgaXMgZmlyc3QNCiAgd3JpdHRlbiB0byB0aGUgdGFyZ2V0IGRldmljZSBiZWZvcmUgaXNzdWluZyBhIHJlc3RhcnQgY29uZGl0aW9uIGFuZCBjaGFuZ2luZw0KICB0aGUgZGlyZWN0aW9uIG9mIHRoZSBJMkMgdHJhbnNhY3Rpb24gaW4gb3JkZXIgdG8gcmVhZCBmcm9tIHRoZSB0YXJnZXQgZGV2aWNlLg0KICANCiAgVGhlIHNhbWUgd2FybmluZ3MgYWJvdXQgYnVmZmVyIGFsbG9jYXRpb24gaW4gSTJDX3dyaXRlKCkgYW5kIEkyQ19yZWFkKCkgDQogIGFwcGx5IHRvIHRoaXMgZnVuY3Rpb24uDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZg0KICAgIGNoYW5uZWwgMCBvZiB0aGUgaW5zdGFudGlhdGVkIENvcmVJMkMgaGFyZHdhcmUuDQogIA0KICBAcGFyYW0gc2VyaWFsX2FkZHI6DQogICAgVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzZXJpYWwgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IEkyQyBkZXZpY2UuDQogIA0KICBAcGFyYW0gYWRkcl9vZmZzZXQ6DQogICAgVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0aGF0IHdpbGwgYmUNCiAgICBzZW50IHRvIHRoZSBzbGF2ZSBkdXJpbmcgdGhlIHdyaXRlIHBoYXNlIG9mIHRoZSB3cml0ZS1yZWFkIHRyYW5zYWN0aW9uLiBUaGlzDQogICAgZGF0YSBpcyB0eXBpY2FsbHkgdXNlZCB0byBzcGVjaWZ5IGFuIGFkZHJlc3Mgb2Zmc2V0IHNwZWNpZnlpbmcgdG8gdGhlIEkyQw0KICAgIHNsYXZlIGRldmljZSB3aGF0IGRhdGEgaXQgbXVzdCByZXR1cm4gZHVyaW5nIHRoZSByZWFkIHBoYXNlIG9mIHRoZQ0KICAgIHdyaXRlLXJlYWQgdHJhbnNhY3Rpb24uDQogIA0KICBAcGFyYW0gb2Zmc2V0X3NpemU6DQogICAgVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygb2Zmc2V0IGJ5dGVzIHRvIGJlIHdyaXR0ZW4gZHVyaW5nIHRoZQ0KICAgIHdyaXRlIHBoYXNlIG9mIHRoZSB3cml0ZS1yZWFkIHRyYW5zYWN0aW9uLiBUaGlzIGlzIHR5cGljYWxseSB0aGUgc2l6ZSBvZiB0aGUNCiAgICBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgYWRkcl9vZmZzZXQgcGFyYW1ldGVyLg0KICANCiAgQHBhcmFtIHJlYWRfYnVmZmVyOg0KICAgIFRoaXMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUgSTJDDQogICAgc2xhdmUgd2lsbCBiZSBzdG9yZWQuDQogIA0KICBAcGFyYW0gcmVhZF9zaXplOg0KICAgIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgdGFyZ2V0IEkyQw0KICAgIHNsYXZlIGRldmljZS4gVGhpcyBzaXplIG11c3Qgbm90IGV4Y2VlZCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkNCiAgICB0aGUgcmVhZF9idWZmZXIgcGFyYW1ldGVyLg0KIA0KICBAcGFyYW0gb3B0aW9uczoNCiAgICBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBpbmRpY2F0ZSBpZiB0aGUgSTJDIGJ1cyBzaG91bGQgYmUgcmVsZWFzZWQNCiAgICBvbiBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZS1yZWFkIHRyYW5zYWN0aW9uLiBVc2luZyB0aGUgSTJDX1JFTEVBU0VfQlVTDQogICAgY29uc3RhbnQgZm9yIHRoZSBvcHRpb25zIHBhcmFtZXRlciBjYXVzZXMgYSBTVE9QIGJpdCB0byBiZSBnZW5lcmF0ZWQgYXQgdGhlDQogICAgZW5kIG9mIHRoZSB3cml0ZS1yZWFkIHRyYW5zYWN0aW9uIGNhdXNpbmcgdGhlIGJ1cyB0byBiZSByZWxlYXNlZCBmb3Igb3RoZXINCiAgICBJMkMgZGV2aWNlcyB0byB1c2UuIFVzaW5nIHRoZSBJMkNfSE9MRF9CVVMgY29uc3RhbnQgYXMgb3B0aW9ucyBwYXJhbWV0ZXINCiAgICBwcmV2ZW50cyBhIFNUT1AgYml0IGZyb20gYmVpbmcgZ2VuZXJhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIHdyaXRlLXJlYWQNCiAgICB0cmFuc2FjdGlvbiwgcHJldmVudGluZyBvdGhlciBJMkMgZGV2aWNlcyBmcm9tIGluaXRpYXRpbmcgYSBidXMgdHJhbnNhY3Rpb24uDQogICAgICAgIA0KICBAcmV0dXJuIG5vbmUuICANCiAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgI2RlZmluZSBDT1JFSTJDX0JBU0VfQUREUiAgICAweEMwMDAwMDAwdQ0KICAgICNkZWZpbmUgQ09SRUkyQ19EVU1NWV9BRERSICAgMHgxMHUNCiAgICAjZGVmaW5lIFRYX0xFTkdUSCAgICAgICAgICAgIDE2dQ0KICAgICNkZWZpbmUgUlhfTEVOR1RIICAgICAgICAgICAgOHUNCg0KICAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQogICAgdWludDhfdCAgcnhfYnVmZmVyW1JYX0xFTkdUSF07DQogICAgdWludDhfdCAgcmVhZF9sZW5ndGggPSBSWF9MRU5HVEg7ICAgICANCiAgICB1aW50OF90ICB0eF9idWZmZXJbVFhfTEVOR1RIXTsNCiAgICB1aW50OF90ICB3cml0ZV9sZW5ndGggPSBUWF9MRU5HVEg7ICANCiAgICANCiAgICB2b2lkIG1haW4oIHZvaWQgKQ0KICAgIHsNCiAgICAgICAgdWludDhfdCAgdGFyZ2V0X3NsYXZlX2FkZHIgPSAweDEyOw0KICAgICAgICBpMmNfc3RhdHVzX3Qgc3RhdHVzOw0KICAgICAgICAvLyBJbml0aWFsaXplIGJhc2UgQ29yZUkyQyBpbnN0YW5jZQ0KICAgICAgICBJMkNfaW5pdCggJmdfaTJjX2luc3QsIENPUkVJMkNfQkFTRV9BRERSLCBDT1JFSTJDX0RVTU1ZX0FERFIsDQogICAgICAgICAgICAgICAgICBJMkNfUENMS19ESVZfMjU2ICk7DQogICAgICAgICAgICAgICAgICANCiAgICAgICAgSTJDX3dyaXRlX3JlYWQoICZnX2kyY19pbnN0LCB0YXJnZXRfc2xhdmVfYWRkciwgdHhfYnVmZmVyLCB3cml0ZV9sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgICAgICByeF9idWZmZXIsIHJlYWRfbGVuZ3RoLCBJMkNfUkVMRUFTRV9CVVMgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICBzdGF0dXMgPSBJMkNfd2FpdF9jb21wbGV0ZSggJmdfaTJjX2luc3QsIEkyQ19OT19USU1FT1VUICk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIEkyQ193cml0ZV9yZWFkDQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYywNCiAgICB1aW50OF90IHNlcmlhbF9hZGRyLA0KICAgIGNvbnN0IHVpbnQ4X3QgKiBhZGRyX29mZnNldCwNCiAgICB1aW50MTZfdCBvZmZzZXRfc2l6ZSwNCiAgICB1aW50OF90ICogcmVhZF9idWZmZXIsDQogICAgdWludDE2X3QgcmVhZF9zaXplLA0KICAgIHVpbnQ4X3Qgb3B0aW9ucw0KKTsNCiAgICANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIEkyQyBzdGF0dXMNCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIFRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgQ29yZUkyQyBjaGFubmVsLg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQHBhcmFtIHRoaXNfaTJjOg0KICAgIFRoZSB0aGlzX2kyYyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBpMmNfaW5zdGFuY2VfdCBkYXRhIHN0cnVjdHVyZQ0KICAgIGhvbGRpbmcgYWxsIGRhdGEgcmVsYXRlZCB0byBhIHNwZWNpZmljIENvcmVJMkMgY2hhbm5lbC4gRm9yIGV4YW1wbGUsIGlmIG9ubHkNCiAgICBvbmUgY2hhbm5lbCBpcyBpbml0aWFsaXplZCwgdGhpcyBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgDQogICAgY2hhbm5lbCAwIG9mIHRoZSBpbnN0YW50aWF0ZWQgQ29yZUkyQyBoYXJkd2FyZS4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEByZXR1cm4NCiAgICBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIENvcmVJMkMgY2hhbm5lbCBvciB0aGUNCiAgICBvdXRjb21lIG9mIHRoZSBwcmV2aW91cyB0cmFuc2FjdGlvbiBpZiBubyB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVzcy4gDQogICAgUG9zc2libGUgcmV0dXJuIHZhbHVlcyBhcmU6DQogICAgICBJMkNfU1VDQ0VTUw0KICAgICAgICBUaGUgbGFzdCBJMkMgdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuICANCiAgICAgIEkyQ19JTl9QUk9HUkVTUw0KICAgICAgICBUaGVyZSBpcyBhbiBJMkMgdHJhbnNhY3Rpb24gaW4gcHJvZ3Jlc3MuDQogICAgICBJMkNfRkFJTEVEDQogICAgICAgIFRoZSBsYXN0IEkyQyB0cmFuc2FjdGlvbiBmYWlsZWQuDQogICAgICBJMkNfVElNRURfT1VUDQogICAgICAgIFRoZSByZXF1ZXN0IGhhcyBmYWlsZWQgdG8gY29tcGxldGUgaW4gdGhlIGFsbG90dGVkIHRpbWUuICAgICAgDQogIA0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQogICAgDQogICAgd2hpbGUoIEkyQ19JTl9QUk9HUkVTUyA9PSBJMkNfZ2V0X3N0YXR1cyggJmdfaTJjX2luc3QgKSApDQogICAgew0KICAgICAgICAvLyBEbyBzb21ldGhpbmcgdXNlZnVsIHdoaWxlIHdhaXRpbmcgZm9yIEkyQyBvcGVyYXRpb24gdG8gY29tcGxldGUNCiAgICAgICAgb3VyX2kyY19idXN5X3Rhc2soKTsNCiAgICB9DQogICAgDQogICAgaWYoIEkyQ19TVUNDRVNTICE9IEkyQ19nZXRfc3RhdHVzKCAmZ19pMmNfaW5zdCApICkNCiAgICB7DQogICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nLi4uIA0KICAgICAgICBvdXJfaTJjX2Vycm9yX3JlY292ZXJ5KCAmZ19pMmNfaW5zdCApOw0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0KaTJjX3N0YXR1c190IEkyQ19nZXRfc3RhdHVzDQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYw0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgV2FpdCBmb3IgSTJDIHRyYW5zYWN0aW9uIGNvbXBsZXRpb24uDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciB0aGUgY3VycmVudCBJMkMgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUuIFRoZSByZXR1cm4NCiAgdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxhc3QgSTJDIHRyYW5zYWN0aW9uIHdhcyBzdWNjZXNzZnVsIG9yIG5vdC4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEBwYXJhbSB0aGlzX2kyYzoNCiAgICBUaGUgdGhpc19pMmMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgaTJjX2luc3RhbmNlX3QgZGF0YSBzdHJ1Y3R1cmUNCiAgICBob2xkaW5nIGFsbCBkYXRhIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBDb3JlSTJDIGNoYW5uZWwuIEZvciBleGFtcGxlLCBpZiBvbmx5DQogICAgb25lIGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQsIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mDQogICAgY2hhbm5lbCAwIG9mIHRoZSBpbnN0YW50aWF0ZWQgQ29yZUkyQyBoYXJkd2FyZS4NCiAgQHBhcmFtIHRpbWVvdXRfbXM6DQogICAgVGhlIHRpbWVvdXRfbXMgcGFyYW1ldGVyIHNwZWNpZmllZCB0aGUgZGVsYXkgd2l0aGluIHdoaWNoIHRoZSBjdXJyZW50IEkyQyANCiAgICB0cmFuc2FjdGlvbiBpcyBleHBlY3RlZCB0byBjb21wbGV0ZS4gVGhlIHRpbWUgb3V0IGRlbGF5IGlzIGdpdmVuIGluIA0KICAgIG1pbGxpc2Vjb25kcy4gSTJDX3dhaXRfY29tcGxldGUoKSB3aWxsIHJldHVybiBJMkNfVElNRURfT1VUIGlmIHRoZSBjdXJyZW50DQogICAgdHJhbnNhY3Rpb24gaGFzIG5vdCBjb21wbGV0ZWQgYWZ0ZXIgdGhlIHRpbWUgb3V0IGRlbGF5IGhhcyBleHBpcmVkLiBUaGlzDQogICAgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gSTJDX05PX1RJTUVPVVQgdG8gaW5kaWNhdGUgdGhhdCBJMkNfd2FpdF9jb21wbGV0ZSgpDQogICAgbXVzdCBub3QgdGltZSBvdXQuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcmV0dXJuDQogICAgVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG91dGNvbWUgb2YgdGhlIGxhc3QgSTJDIHRyYW5zYWN0aW9uLiBJdCBjYW4NCiAgICBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogDQogICAgICBJMkNfU1VDQ0VTUw0KICAgICAgICBUaGUgbGFzdCBJMkMgdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuDQogICAgICBJMkNfRkFJTEVEDQogICAgICAgIFRoZSBsYXN0IEkyQyB0cmFuc2FjdGlvbiBmYWlsZWQuDQogICAgICBJMkNfVElNRURfT1VUDQogICAgICAgIFRoZSBsYXN0IHRyYW5zYWN0aW9uIGZhaWxlZCB0byBjb21wbGV0ZSB3aXRoaW4gdGhlIHRpbWUgb3V0IGRlbGF5IGdpdmVuDQogICAgICAgIGFzIHNlY29uZCBwYXJhbWV0ZXIuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICAjZGVmaW5lIENPUkVJMkNfQkFTRV9BRERSICAweEMwMDAwMDAwdQ0KICAgICNkZWZpbmUgQ09SRUkyQ19EVU1NWV9BRERSICAgMHgxMHUNCiAgICAjZGVmaW5lIERBVEFfTEVOR1RIICAgICAgICAgICAxNnUNCg0KICAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQoNCiAgICB1aW50OF90ICByeF9idWZmZXJbREFUQV9MRU5HVEhdOw0KICAgIHVpbnQ4X3QgIHJlYWRfbGVuZ3RoID0gREFUQV9MRU5HVEg7ICAgICANCg0KICAgIHZvaWQgbWFpbiggdm9pZCApDQogICAgew0KICAgICAgICB1aW50OF90ICB0YXJnZXRfc2xhdmVfYWRkciA9IDB4MTI7DQogICAgICAgIGkyY19zdGF0dXNfdCBzdGF0dXM7DQogICAgICAgIA0KICAgICAgICAvLyBJbml0aWFsaXplIGJhc2UgQ29yZUkyQyBpbnN0YW5jZQ0KICAgICAgICBJMkNfaW5pdCggJmdfaTJjX2luc3QsIENPUkVJMkNfQkFTRV9BRERSLCBDT1JFSTJDX0RVTU1ZX0FERFIsDQogICAgICAgICAgICAgICAgICBJMkNfUENMS19ESVZfMjU2ICk7DQogICAgICAgIA0KICAgICAgICAvLyBSZWFkIGRhdGEgZnJvbSBDaGFubmVsIDAgb2YgQ29yZUkyQyBpbnN0YW5jZS4NCiAgICAgICAgSTJDX3JlYWQoICZnX2kyY19pbnN0LCB0YXJnZXRfc2xhdmVfYWRkciwgcnhfYnVmZmVyLCByZWFkX2xlbmd0aCwNCiAgICAgICAgICAgICAgICAgIEkyQ19SRUxFQVNFX0JVUyApOw0KICAgICAgICANCiAgICAgICAgLy8gV2FpdCBmb3IgY29tcGxldGlvbiBhbmQgcmVjb3JkIHRoZSBvdXRjb21lDQogICAgICAgIHN0YXR1cyA9IEkyQ193YWl0X2NvbXBsZXRlKCAmZ19pMmNfaW5zdCwgSTJDX05PX1RJTUVPVVQgKTsNCiAgICB9DQogIEBlbmRjb2RlDQogKi8NCmkyY19zdGF0dXNfdCBJMkNfd2FpdF9jb21wbGV0ZQ0KKA0KICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMsDQogICAgdWludDMyX3QgdGltZW91dF9tcw0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGltZSBvdXQgZGVsYXkgZXhwaXJhdGlvbi4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjb250cm9sIHRoZSBleHBpcmF0aW9uIG9mIHRoZSB0aW1lIG91dCBkZWxheQ0KICBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIEkyQ193YWl0X2NvbXBsZXRlKCkgZnVuY3Rpb24uIEl0IG11c3QgYmUNCiAgY2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgb2YgYSBwZXJpb2RpYyBpbnRlcnJ1cHQgc291cmNlIHN1Y2gNCiAgYXMgdGhlIENvcnRleC1NMyBTeXNUaWNrIHRpbWVyIGludGVycnVwdC4gSXQgdGFrZXMgdGhlIHBlcmlvZCBvZiB0aGUgaW50ZXJydXB0DQogIHNvdXJjZSBhcyBpdHMgbXNfc2luY2VfbGFzdF90aWNrIHBhcmFtZXRlciBhbmQgdXNlcyBpdCBhcyB0aGUgdGltZSBiYXNlIGZvcg0KICB0aGUgSTJDX3dhaXRfY29tcGxldGUoKSBmdW5jdGlvbpJzIHRpbWUgb3V0IGRlbGF5Lg0KICANCiAgTm90ZTogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGNhbGxlZCBpZiB0aGUgSTJDX3dhaXRfY29tcGxldGUoKQ0KICAgICAgICBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhIHRpbWVvdXRfbXMgdmFsdWUgb2YgSTJDX05PX1RJTUVPVVQuDQogIE5vdGU6IElmIHRoaXMgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCB0aGVuIHRoZSBJMkNfd2FpdF9jb21wbGV0ZSgpIGZ1bmN0aW9uDQogICAgICAgIHdpbGwgYmVoYXZlIGFzIGlmIGl0cyB0aW1lb3V0X21zIHdhcyBzcGVjaWZpZWQgYXMgSTJDX05PX1RJTUVPVVQgYW5kIGl0DQogICAgICAgIHdpbGwgbm90IHRpbWUgb3V0Lg0KICBOb3RlOiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBoYW5kbGVyIChlLmcgU3lzVGljaykNCiAgICAgICAgaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIGNhbGxpbmcgaW50ZXJydXB0IGhhdmUgYSBsb3dlciBwcmlvcml0eSB0aGFuDQogICAgICAgIHRoZSBDb3JlSTJDIGludGVycnVwdChzKSB0byBlbnN1cmUgYW55IHVwZGF0ZXMgdG8gc2hhcmVkIGRhdGEgYXJlDQogICAgICAgIHByb3RlY3RlZC4NCiAgDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KICBAcGFyYW0gbXNfc2luY2VfbGFzdF90aWNrOg0KICAgIFRoZSBtc19zaW5jZV9sYXN0X3RpY2sgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0DQogICAgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIEkyQ19zeXN0ZW1fdGljaygpLiBUaGlzIHBhcmFtZXRlciB3b3VsZA0KICAgIHR5cGljYWxseSBiZSBhIGNvbnN0YW50IHNwZWNpZnlpbmcgdGhlIGludGVycnVwdCByYXRlIG9mIGEgdGltZXIgdXNlZCB0bw0KICAgIGdlbmVyYXRlIHN5c3RlbSB0aWNrcy4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEByZXR1cm4NCiAgICBub25lLg0KDQogIEV4YW1wbGU6DQogICAgVGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgYW4gZXhhbXBsZSBvZiBob3cgdGhlIEkyQ19zeXN0ZW1fdGljaygpIGZ1bmN0aW9uDQogICAgd291bGQgYmUgY2FsbGVkIGluIGEgQ29ydGV4LU0zIGJhc2VkIHN5c3RlbS4gSTJDX3N5c3RlbV90aWNrKCkgaXMgY2FsbGVkIGZvcg0KICAgIGVhY2ggSTJDIGNoYW5uZWwgZnJvbSB0aGUgQ29ydGV4LU0zIFN5c1RpY2sgdGltZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4NCiAgICBUaGUgU3lzVGljayBpcyBjb25maWd1cmVkIHRvIGdlbmVyYXRlIGFuIGludGVycnVwdCBldmVyeSAxMCBtaWxsaXNlY29uZHMgaW4NCiAgICB0aGUgZXhhbXBsZSBiZWxvdy4NCiAgQGNvZGUNCiAgICAjZGVmaW5lIFNZU1RJQ0tfSU5URVJWQUxfTVMgMTANCiAgIA0KICAgIHZvaWQgU3lzVGlja19IYW5kbGVyKHZvaWQpDQogICAgew0KICAgICAgICBJMkNfc3lzdGVtX3RpY2soJmdfY29yZV9pMmMwLCBTWVNUSUNLX0lOVEVSVkFMX01TKTsNCiAgICAgICAgSTJDX3N5c3RlbV90aWNrKCZnX2NvcmVfaTJjMiwgU1lTVElDS19JTlRFUlZBTF9NUyk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIEkyQ19zeXN0ZW1fdGljaw0KKA0KICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMsDQogICAgdWludDMyX3QgbXNfc2luY2VfbGFzdF90aWNrDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIA0KICogICAgICAgICAgICAgICAgICAgICAgICAgICBTbGF2ZSBzcGVjaWZpYyBmdW5jdGlvbnMNCiAqIA0KICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG9ubHkgdXNlZCB3aXRoaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIGFuIEkyQw0KICogc2xhdmUgZGV2aWNlLg0KICovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIEkyQyBzbGF2ZSB0cmFuc21pdCBidWZmZXIgY29uZmlndXJhdGlvbi4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIFRoaXMgZnVuY3Rpb24gc3BlY2lmaWVzIHRoZSBtZW1vcnkgYnVmZmVyIGhvbGRpbmcgdGhlIGRhdGEgdGhhdCB3aWxsIGJlIHNlbnQNCiAgdG8gdGhlIEkyQyBtYXN0ZXIgd2hlbiB0aGlzIENvcmVJMkMgY2hhbm5lbCBpcyB0aGUgdGFyZ2V0IG9mIGFuIEkyQyByZWFkIG9yDQogIHdyaXRlLXJlYWQgdHJhbnNhY3Rpb24uDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KICANCiAgQHBhcmFtIHR4X2J1ZmZlcjoNCiAgICBUaGlzIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBidWZmZXIgaG9sZGluZyB0aGUgZGF0YSB0byBiZQ0KICAgIHJldHVybmVkIHRvIHRoZSBJMkMgbWFzdGVyIHdoZW4gdGhpcyBDb3JlSTJDIGNoYW5uZWwgaXMgdGhlIHRhcmdldCBvZiBhbg0KICAgIEkyQyByZWFkIG9yIHdyaXRlLXJlYWQgdHJhbnNhY3Rpb24uDQogIA0KICBAcGFyYW0gdHhfc2l6ZToNCiAgICBTaXplIG9mIHRoZSB0cmFuc21pdCBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgdHhfYnVmZmVyIHBhcmFtZXRlci4NCg0KICBAcmV0dXJuIG5vbmUuICANCiAgICAgIA0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgICNkZWZpbmUgQ09SRUkyQ19CQVNFX0FERFIgICAgMHhDMDAwMDAwMHUNCiAgICAjZGVmaW5lIFNMQVZFX1NFUl9BRERSICAgICAgIDB4MTB1DQogICAgI2RlZmluZSBTTEFWRV9UWF9CVUZGRVJfU0laRSAxMHUNCg0KICAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQoNCiAgICB1aW50OF90IGdfc2xhdmVfdHhfYnVmZmVyW1NMQVZFX1RYX0JVRkZFUl9TSVpFXSA9IHsgMSwgMiwgMywgNCwgNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgNywgOCwgOSwgMTAgfTsNCg0KICAgIHZvaWQgbWFpbiggdm9pZCApDQogICAgew0KICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBDb3JlSTJDIGRyaXZlciB3aXRoIGl0cyBiYXNlIGFkZHJlc3MsIEkyQyBzZXJpYWwNCiAgICAgICAgLy8gYWRkcmVzcyBhbmQgc2VyaWFsIGNsb2NrIGRpdmlkZXIuDQogICAgICAgIEkyQ19pbml0KCAmZ19pMmNfaW5zdCwgQ09SRUkyQ19CQVNFX0FERFIsIFNMQVZFX1NFUl9BRERSLA0KICAgICAgICAgICAgICAgICAgSTJDX1BDTEtfRElWXzI1NiApOw0KICAgICAgIA0KICAgICAgICAvLyBTcGVjaWZ5IHRoZSB0cmFuc21pdCBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0aGF0IHdpbGwgYmUNCiAgICAgICAgLy8gcmV0dXJuZWQgdG8gdGhlIG1hc3RlciBkdXJpbmcgcmVhZCBhbmQgd3JpdGUtcmVhZCB0cmFuc2FjdGlvbnMuDQogICAgICAgIEkyQ19zZXRfc2xhdmVfdHhfYnVmZmVyKCAmZ19pMmNfaW5zdCwgZ19zbGF2ZV90eF9idWZmZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdfc2xhdmVfdHhfYnVmZmVyKSApOw0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBJMkNfc2V0X3NsYXZlX3R4X2J1ZmZlcg0KKA0KICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMsDQogICAgY29uc3QgdWludDhfdCAqIHR4X2J1ZmZlciwNCiAgICB1aW50MTZfdCB0eF9zaXplDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBJMkMgc2xhdmUgcmVjZWl2ZSBidWZmZXIgY29uZmlndXJhdGlvbi4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIFRoaXMgZnVuY3Rpb24gc3BlY2lmaWVzIHRoZSBtZW1vcnkgYnVmZmVyIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBDb3JlSTJDDQogIGNoYW5uZWwgdG8gcmVjZWl2ZSBkYXRhIHdoZW4gaXQgaXMgYSBzbGF2ZS4gVGhpcyBidWZmZXIgaXMgdGhlIG1lbW9yeSB3aGVyZQ0KICBkYXRhIHdpbGwgYmUgc3RvcmVkIHdoZW4gdGhlIENvcmVJMkMgY2hhbm5lbCBpcyB0aGUgdGFyZ2V0IG9mIGFuIEkyQyBtYXN0ZXINCiAgd3JpdGUgdHJhbnNhY3Rpb24gKGkuZS4gd2hlbiBpdCBpcyB0aGUgc2xhdmUpLg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQHBhcmFtIHRoaXNfaTJjOg0KICAgIFRoZSB0aGlzX2kyYyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBpMmNfaW5zdGFuY2VfdCBkYXRhIHN0cnVjdHVyZQ0KICAgIGhvbGRpbmcgYWxsIGRhdGEgcmVsYXRlZCB0byBhIHNwZWNpZmljIENvcmVJMkMgY2hhbm5lbC4gRm9yIGV4YW1wbGUsIGlmIG9ubHkNCiAgICBvbmUgY2hhbm5lbCBpcyBpbml0aWFsaXplZCwgdGhpcyBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgDQogICAgY2hhbm5lbCAwIG9mIHRoZSBpbnN0YW50aWF0ZWQgQ29yZUkyQyBoYXJkd2FyZS4NCiAgDQogIEBwYXJhbSByeF9idWZmZXI6DQogICAgVGhpcyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgYnVmZmVyIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyDQogICAgc29mdHdhcmUgdG8gYmUgdXNlZCBhcyBhIHNsYXZlIHJlY2VpdmUgYnVmZmVyLg0KICANCiAgQHBhcmFtIHJ4X3NpemU6DQogICAgU2l6ZSBvZiB0aGUgc2xhdmUgcmVjZWl2ZSBidWZmZXIuIFRoaXMgaXMgdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBpcw0KICAgIGFsbG9jYXRlZCB0byB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgcnhfYnVmZmVyLg0KICAgIE5vdGU6ICAgVGhpcyBidWZmZXIgc2l6ZSBpbmRpcmVjdGx5IHNwZWNpZmllcyB0aGUgbWF4aW11bSBJMkMgd3JpdGUNCiAgICAgICAgICAgIHRyYW5zYWN0aW9uIGxlbmd0aCB0aGlzIENvcmVJMkMgY2hhbm5lbCBjYW4gYmUgdGhlIHRhcmdldCBvZi4gVGhpcw0KICAgICAgICAgICAgaXMgYmVjYXVzZSB0aGlzIENvcmVJMkMgY2hhbm5lbCByZXNwb25kcyB0byBmdXJ0aGVyIHJlY2VpdmVkDQogICAgICAgICAgICBieXRlcyB3aXRoIGEgbm9uLWFja25vd2xlZGdlIGJpdCAoTkFDSykgYXMgc29vbiBhcyBpdHMgcmVjZWl2ZQ0KICAgICAgICAgICAgYnVmZmVyIGlzIGZ1bGwuIFRoaXMgY2F1c2VzIHRoZSB3cml0ZSB0cmFuc2FjdGlvbiB0byBmYWlsLg0KICAgICAgICAgICAgDQogIEByZXR1cm4gbm9uZS4gIA0KICAgICAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgI2RlZmluZSBDT1JFSTJDX0JBU0VfQUREUiAgICAweEMwMDAwMDAwdQ0KICAgICNkZWZpbmUgU0xBVkVfU0VSX0FERFIgICAgICAgMHgxMHUNCiAgICAjZGVmaW5lIFNMQVZFX1JYX0JVRkZFUl9TSVpFIDEwdQ0KDQogICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfaW5zdDsNCg0KICAgIHVpbnQ4X3QgZ19zbGF2ZV9yeF9idWZmZXJbU0xBVkVfUlhfQlVGRkVSX1NJWkVdOw0KDQogICAgdm9pZCBtYWluKCB2b2lkICkNCiAgICB7DQogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIENvcmVJMkMgZHJpdmVyIHdpdGggaXRzIGJhc2UgYWRkcmVzcywgSTJDIHNlcmlhbA0KICAgICAgICAvLyBhZGRyZXNzIGFuZCBzZXJpYWwgY2xvY2sgZGl2aWRlci4NCiAgICAgICAgSTJDX2luaXQoICZnX2kyY19pbnN0LCBDT1JFSTJDX0JBU0VfQUREUiwgU0xBVkVfU0VSX0FERFIsDQogICAgICAgICAgICAgICAgICBJMkNfUENMS19ESVZfMjU2ICk7DQogICAgICAgDQogICAgICAgIC8vIFNwZWNpZnkgdGhlIGJ1ZmZlciB1c2VkIHRvIHN0b3JlIHRoZSBkYXRhIHdyaXR0ZW4gYnkgdGhlIEkyQyBtYXN0ZXIuDQogICAgICAgIEkyQ19zZXRfc2xhdmVfcnhfYnVmZmVyKCAmZ19pMmNfaW5zdCwgZ19zbGF2ZV9yeF9idWZmZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdfc2xhdmVfcnhfYnVmZmVyKSApOw0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBJMkNfc2V0X3NsYXZlX3J4X2J1ZmZlcg0KKA0KICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMsDQogICAgdWludDhfdCAqIHJ4X2J1ZmZlciwNCiAgICB1aW50MTZfdCByeF9zaXplDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBJMkMgc2xhdmUgbWVtb3J5IG9mZnNldCBsZW5ndGggY29uZmlndXJhdGlvbi4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgQ29yZUkyQyBjaGFubmVsIGZvcg0KICBvcGVyYXRpb24gYXMgYSBzbGF2ZSBzdXBwb3J0aW5nIHdyaXRlLXJlYWQgdHJhbnNhY3Rpb25zLiBJdCBzcGVjaWZpZXMgdGhlDQogIG51bWJlciBvZiBieXRlcyBleHBlY3RlZCBhcyBwYXJ0IG9mIHRoZSB3cml0ZSBwaGFzZSBvZiBhIHdyaXRlLXJlYWQNCiAgdHJhbnNhY3Rpb24uIFRoZSBieXRlcyByZWNlaXZlZCBkdXJpbmcgdGhlIHdyaXRlIHBoYXNlIG9mIGEgd3JpdGUtcmVhZA0KICB0cmFuc2FjdGlvbiB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIG9mZnNldCBpbnRvIHRoZSBzbGF2ZSdzIHRyYW5zbWl0IGJ1ZmZlci4NCiAgVGhpcyBhbGxvd3MgcmFuZG9tIGFjY2VzcyBpbnRvIHRoZSBJMkMgc2xhdmUgdHJhbnNtaXQgYnVmZmVyIGZyb20gYSByZW1vdGUNCiAgSTJDIG1hc3Rlci4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEBwYXJhbSB0aGlzX2kyYzoNCiAgICBUaGUgdGhpc19pMmMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgaTJjX2luc3RhbmNlX3QgZGF0YSBzdHJ1Y3R1cmUNCiAgICBob2xkaW5nIGFsbCBkYXRhIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBDb3JlSTJDIGNoYW5uZWwuIEZvciBleGFtcGxlLCBpZiBvbmx5DQogICAgb25lIGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQsIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIA0KICAgIGNoYW5uZWwgMCBvZiB0aGUgaW5zdGFudGlhdGVkIENvcmVJMkMgaGFyZHdhcmUuDQogIA0KICBAcGFyYW0gb2Zmc2V0X2xlbmd0aDoNCiAgICBUaGUgb2Zmc2V0X2xlbmd0aCBwYXJhbWV0ZXIgY29uZmlndXJlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGludGVycHJldGVkDQogICAgYnkgdGhlIENvcmVJMkMgc2xhdmUgYXMgYSBtZW1vcnkgb2Zmc2V0IHZhbHVlIGR1cmluZyB0aGUgd3JpdGUgcGhhc2Ugb2YNCiAgICB3cml0ZS1yZWFkIHRyYW5zYWN0aW9ucy4gVGhlIG1heGltdW0gdmFsdWUgZm9yIHRoZSBvZmZzZXRfbGVuZ3RoIHBhcmFtZXRlcg0KICAgIGlzIHR3by4gVGhlIHZhbHVlIG9mIG9mZnNldF9sZW5ndGggaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0IG9uIHRoZSANCiAgICBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmVjZWl2ZWQgZGF0YS4NCiAgICANCiAgICAgIElmIG9mZnNldF9sZW5ndGggaXMgMCwgdGhlIG9mZnNldCBpbnRvIHRoZSB0cmFuc21pdCBidWZmZXIgaXMgZml4ZWQgYXQgMC4NCiAgICAgIA0KICAgICAgSWYgb2Zmc2V0X2xlbmd0aCBpcyAxLCBhIHNpbmdsZSBieXRlIG9mIHJlY2VpdmVkIGRhdGEgaXMgaW50ZXJwcmV0ZWQgYXMgYW4NCiAgICAgIHVuc2lnbmVkIDggYml0IG9mZnNldCB2YWx1ZSBpbiB0aGUgcmFuZ2UgMCB0byAyNTUuDQogICAgICANCiAgICAgIElmIG9mZnNldF9sZW5ndGggaXMgMiwgMiBieXRlcyBvZiByZWNlaXZlZCBkYXRhIGFyZSBpbnRlcnByZXRlZCBhcyBhbg0KICAgICAgdW5zaWduZWQgMTYgYml0IG9mZnNldCB2YWx1ZSBpbiB0aGUgcmFuZ2UgMCB0byA2NTUzNS4gVGhlIGZpcnN0IGJ5dGUNCiAgICAgIHJlY2VpdmVkIGluIHRoaXMgY2FzZSBwcm92aWRlcyB0aGUgaGlnaCBvcmRlciBiaXRzIG9mIHRoZSBvZmZzZXQgYW5kDQogICAgICB0aGUgc2Vjb25kIGJ5dGUgcHJvdmlkZXMgdGhlIGxvdyBvcmRlciBiaXRzLg0KICAgICAgDQogICAgSWYgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBkb2VzIG5vdCBtYXRjaCB0aGUgbm9uIDAgdmFsdWUgb2YNCiAgICBvZmZzZXRfbGVuZ3RoIHRoZSB0cmFuc21pdCBidWZmZXIgb2Zmc2V0IGlzIHNldCB0byAwLg0KICAgICAgICAgICAgDQogIEByZXR1cm4gbm9uZS4gIA0KICAgICAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgI2RlZmluZSBDT1JFSTJDX0JBU0VfQUREUiAgICAweEMwMDAwMDAwdQ0KICAgICNkZWZpbmUgU0xBVkVfU0VSX0FERFIgICAgICAgMHgxMHUNCiAgICAjZGVmaW5lIFNMQVZFX1RYX0JVRkZFUl9TSVpFIDEwdQ0KDQogICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfaW5zdDsNCg0KICAgIHVpbnQ4X3QgZ19zbGF2ZV90eF9idWZmZXJbU0xBVkVfVFhfQlVGRkVSX1NJWkVdID0geyAxLCAyLCAzLCA0LCA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCA3LCA4LCA5LCAxMCB9Ow0KDQogICAgdm9pZCBtYWluKCB2b2lkICkNCiAgICB7DQogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIENvcmVJMkMgZHJpdmVyIHdpdGggaXRzIGJhc2UgYWRkcmVzcywgSTJDIHNlcmlhbA0KICAgICAgICAvLyBhZGRyZXNzIGFuZCBzZXJpYWwgY2xvY2sgZGl2aWRlci4NCiAgICAgICAgSTJDX2luaXQoICZnX2kyY19pbnN0LCBDT1JFSTJDX0JBU0VfQUREUiwgU0xBVkVfU0VSX0FERFIsDQogICAgICAgICAgICAgICAgICBJMkNfUENMS19ESVZfMjU2ICk7DQogICAgICAgIEkyQ19zZXRfc2xhdmVfdHhfYnVmZmVyKCAmZ19pMmNfaW5zdCwgZ19zbGF2ZV90eF9idWZmZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdfc2xhdmVfdHhfYnVmZmVyKSApOw0KICAgICAgICBJMkNfc2V0X3NsYXZlX21lbV9vZmZzZXRfbGVuZ3RoKCAmZ19pMmNfaW5zdCwgMSApOw0KICAgIH0NCiAgQGVuZGNvZGUgICAgICAgIA0KICovDQp2b2lkIEkyQ19zZXRfc2xhdmVfbWVtX29mZnNldF9sZW5ndGgNCigNCiAgICBpMmNfaW5zdGFuY2VfdCAqIHRoaXNfaTJjLA0KICAgIHVpbnQ4X3Qgb2Zmc2V0X2xlbmd0aA0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgSTJDIHdyaXRlIGhhbmRsZXIgcmVnaXN0cmF0aW9uLiANCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIFJlZ2lzdGVyIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBwcm9jZXNzIHRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhpcw0KICBDb3JlSTJDIGNoYW5uZWwgd2hlbiBpdCBpcyB0aGUgc2xhdmUgaW4gYW4gSTJDIHdyaXRlIHRyYW5zYWN0aW9uLg0KICBOb3RlOiBJZiBhIHdyaXRlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCwgaXQgaXMgY2FsbGVkIG9uIGNvbXBsZXRpb24gb2YgdGhlDQogICAgICAgIHdyaXRlIHBoYXNlIG9mIGEgd3JpdGUtcmVhZCB0cmFuc2FjdGlvbiBhbmQgcmVzcG9uc2libGUgZm9yIHByb2Nlc3NpbmcNCiAgICAgICAgdGhlIHJlY2VpdmVkIGRhdGEgaW4gdGhlIHNsYXZlIHJlY2VpdmUgYnVmZmVyIGFuZCBwb3B1bGF0aW5nIHRoZSBzbGF2ZQ0KICAgICAgICB0cmFuc21pdCBidWZmZXIgd2l0aCB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQgdG8gdGhlIEkyQyBtYXN0ZXINCiAgICAgICAgYXMgcGFydCBvZiB0aGUgcmVhZCBwaGFzZSBvZiB0aGUgd3JpdGUtcmVhZCB0cmFuc2FjdGlvbi4gSWYgYSB3cml0ZQ0KICAgICAgICBoYW5kbGVyIGlzIG5vdCByZWdpc3RlcmVkLCB0aGUgd3JpdGUgZGF0YSBvZiBhIHdyaXRlIHJlYWQgdHJhbnNhY3Rpb24gaXMNCiAgICAgICAgaW50ZXJwcmV0ZWQgYXMgYW4gb2Zmc2V0IGludG8gdGhlIHNsYXZlknMgdHJhbnNtaXQgYnVmZmVyIGFuZCBoYW5kbGVkIGJ5DQogICAgICAgIHRoZSBkcml2ZXIuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KICANCiAgQHBhcmFtIGhhbmRsZXI6DQogICAgUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHByb2Nlc3MgdGhlIEkyQyB3cml0ZSByZXF1ZXN0Lg0KICAgICAgICAgICAgDQogIEByZXR1cm4gbm9uZS4gIA0KICAgICAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgI2RlZmluZSBDT1JFSTJDX0JBU0VfQUREUiAgICAweEMwMDAwMDAwdQ0KICAgICNkZWZpbmUgU0xBVkVfU0VSX0FERFIgICAgICAgMHgxMHUNCiAgICAjZGVmaW5lIFNMQVZFX1RYX0JVRkZFUl9TSVpFIDEwdQ0KDQogICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfaW5zdDsNCg0KICAgIHVpbnQ4X3QgZ19zbGF2ZV90eF9idWZmZXJbU0xBVkVfVFhfQlVGRkVSX1NJWkVdID0geyAxLCAyLCAzLCA0LCA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDcsIDgsIDksIDEwIH07DQoNCiAgICAvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGUNCiAgICB2b2lkIHNsYXZlX3dyaXRlX2hhbmRsZXINCiAgICAoDQogICAgICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMsDQogICAgICAgIHVpbnQ4X3QgKiBwX3J4X2RhdGEsDQogICAgICAgIHVpbnQxNl90IHJ4X3NpemUNCiAgICApOw0KDQogICAgdm9pZCBtYWluKCB2b2lkICkNCiAgICB7DQogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIENvcmVJMkMgZHJpdmVyIHdpdGggaXRzIGJhc2UgYWRkcmVzcywgSTJDIHNlcmlhbA0KICAgICAgICAvLyBhZGRyZXNzIGFuZCBzZXJpYWwgY2xvY2sgZGl2aWRlci4NCiAgICAgICAgSTJDX2luaXQoICZnX2kyY19pbnN0LCBDT1JFSTJDX0JBU0VfQUREUiwgU0xBVkVfU0VSX0FERFIsIA0KICAgICAgICAgICAgICAgICAgSTJDX1BDTEtfRElWXzI1NiApOw0KICAgICAgICBJMkNfc2V0X3NsYXZlX3R4X2J1ZmZlciggJmdfaTJjX2luc3QsIGdfc2xhdmVfdHhfYnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihnX3NsYXZlX3R4X2J1ZmZlcikgKTsNCiAgICAgICAgSTJDX3NldF9zbGF2ZV9tZW1fb2Zmc2V0X2xlbmd0aCggJmdfaTJjX2luc3QsIDEgKTsNCiAgICAgICAgSTJDX3JlZ2lzdGVyX3dyaXRlX2hhbmRsZXIoICZnX2kyY19pbnN0LCBzbGF2ZV93cml0ZV9oYW5kbGVyICk7DQogICAgfQ0KICBAZW5kY29kZSAgICANCiovDQp2b2lkIEkyQ19yZWdpc3Rlcl93cml0ZV9oYW5kbGVyDQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYywNCiAgICBpMmNfc2xhdmVfd3JfaGFuZGxlcl90IGhhbmRsZXINCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIEkyQyBzbGF2ZSBlbmFibGUuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgc2xhdmUgbW9kZSBvcGVyYXRpb24gZm9yIGEgQ29yZUkyQyBjaGFubmVsLiBJdCBlbmFibGVzIA0KICB0aGUgQ29yZUkyQyBzbGF2ZSB0byByZWNlaXZlIGRhdGEgd2hlbiBpdCBpcyB0aGUgdGFyZ2V0IG9mIGFuIEkyQyByZWFkLCB3cml0ZQ0KICBvciB3cml0ZS1yZWFkIHRyYW5zYWN0aW9uLg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQHBhcmFtIHRoaXNfaTJjOg0KICAgIFRoZSB0aGlzX2kyYyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBpMmNfaW5zdGFuY2VfdCBkYXRhIHN0cnVjdHVyZQ0KICAgIGhvbGRpbmcgYWxsIGRhdGEgcmVsYXRlZCB0byBhIHNwZWNpZmljIENvcmVJMkMgY2hhbm5lbC4gRm9yIGV4YW1wbGUsIGlmIG9ubHkNCiAgICBvbmUgY2hhbm5lbCBpcyBpbml0aWFsaXplZCwgdGhpcyBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgDQogICAgY2hhbm5lbCAwIG9mIHRoZSBpbnN0YW50aWF0ZWQgQ29yZUkyQyBoYXJkd2FyZS4NCg0KICBAcmV0dXJuIG5vbmUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICAvLyBFbmFibGUgSTJDIHNsYXZlDQogICAgSTJDX2VuYWJsZV9zbGF2ZSggJmdfaTJjX2luc3QgKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBJMkNfZW5hYmxlX3NsYXZlDQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYw0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgSTJDIHNsYXZlIGRpc2FibGUuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIHNsYXZlIG1vZGUgb3BlcmF0aW9uIGZvciBhIENvcmVJMkMgY2hhbm5lbC4gSXQgc3RvcHMNCiAgdGhlIENvcmVJMkMgc2xhdmUgYWNrbm93bGVkZ2luZyBJMkMgcmVhZCwgd3JpdGUgb3Igd3JpdGUtcmVhZCB0cmFuc2FjdGlvbnMNCiAgdGFyZ2V0ZWQgYXQgaXQuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KDQogIEByZXR1cm4gbm9uZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgLy8gRGlzYWJsZSBJMkMgc2xhdmUNCiAgIEkyQ19kaXNhYmxlX3NsYXZlKCAmZ19pMmNfaW5zdCApOw0KICBAZW5kY29kZQ0KICovDQp2b2lkIEkyQ19kaXNhYmxlX3NsYXZlDQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYw0KKTsNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFNldCBJMkMgc2xhdmUgc2Vjb25kIGFkZHJlc3MuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBUaGUgZnVuY3Rpb24gSTJDX3NldF9zbGF2ZV9zZWNvbmRfYWRkcigpIHNldHMgdGhlIHNlY29uZGFyeSBzbGF2ZSBhZGRyZXNzIGZvcg0KICBhIENvcmVJMkMgc2xhdmUgZGV2aWNlLiBUaGlzIGlzIGFuIGFkZGl0aW9uYWwgc2xhdmUgYWRkcmVzcyB3aGljaCBtaWdodCBiZQ0KICByZXF1aXJlZCBpbiBjZXJ0YWluIGFwcGxpY2F0aW9ucywgZm9yIGV4YW1wbGUgdG8gZW5hYmxlIGZhaWwtc2FmZSBvcGVyYXRpb24gaW4NCiAgYSBzeXN0ZW0uIEFzIHRoZSBDb3JlSTJDIGRldmljZSBzdXBwb3J0cyA3LWJpdCBhZGRyZXNzaW5nLCB0aGUgaGlnaGVzdCB2YWx1ZQ0KICB3aGljaCBjYW4gYmUgYXNzaWduZWQgdG8gc2Vjb25kIHNsYXZlIGFkZHJlc3MgaXMgMTI3ICgweDdGKS4NCiAgTm90ZTogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IENvcmVJMkMgaGFyZHdhcmUgY29uZmlndXJlZCB3aXRoIGEgZml4ZWQgDQogICAgICBzZWNvbmQgc2xhdmUgYWRkcmVzcy4gIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBBRERSMVswXSByZWdpc3Rlcg0KICAgICAgYml0IG1ha2VzIGl0IGRpZmZpY3VsdCBmb3IgdGhlIGRyaXZlciB0byBzdXBwb3J0IGJvdGggcHJvZ3JhbW1hYmxlIGFuZA0KICAgICAgZml4ZWQgc2Vjb25kIHNsYXZlIGFkZHJlc3MsIHNvIHdlIGNob29zZSB0byBzdXBwb3J0IHByb2dyYW1tYWJsZSBvbmx5Lg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQHBhcmFtIHRoaXNfaTJjOg0KICAgIFRoZSB0aGlzX2kyYyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBpMmNfaW5zdGFuY2VfdCBkYXRhIHN0cnVjdHVyZQ0KICAgIGhvbGRpbmcgYWxsIGRhdGEgcmVsYXRlZCB0byBhIHNwZWNpZmljIENvcmVJMkMgY2hhbm5lbC4gRm9yIGV4YW1wbGUsIGlmIG9ubHkNCiAgICBvbmUgY2hhbm5lbCBpcyBpbml0aWFsaXplZCwgdGhpcyBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgDQogICAgY2hhbm5lbCAwIG9mIHRoZSBpbnN0YW50aWF0ZWQgQ29yZUkyQyBoYXJkd2FyZS4NCg0KICBAcGFyYW0gc2Vjb25kX3NsYXZlX2FkZHI6DQogICAgVGhlIHNlY29uZF9zbGF2ZV9hZGRyIHBhcmFtZXRlciBpcyB0aGUgc2Vjb25kYXJ5IHNsYXZlIGFkZHJlc3Mgb2YgdGhlIEkyQw0KICAgIGRldmljZS4NCg0KICBAcmV0dXJuDQogICAgbm9uZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgICNkZWZpbmUgQ09SRUkyQ19CQVNFX0FERFIgIDB4QzAwMDAwMDB1DQogICAgI2RlZmluZSBTTEFWRV9TRVJfQUREUiAgICAgMHgxMHUNCiAgICAjZGVmaW5lIFNFQ09ORF9TTEFWRV9BRERSICAweDIwdQ0KDQogICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfaW5zdDsNCiAgICB2b2lkIG1haW4oIHZvaWQgKQ0KICAgIHsNCiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgQ29yZUkyQyBkcml2ZXIgd2l0aCBpdHMgYmFzZSBhZGRyZXNzLCBwcmltYXJ5IEkyQw0KICAgICAgICAvLyBzZXJpYWwgYWRkcmVzcyBhbmQgc2VyaWFsIGNsb2NrIGRpdmlkZXIuDQogICAgICAgIEkyQ19pbml0KCAmZ19pMmNfaW5zdCwgQ09SRUkyQ19CQVNFX0FERFIsIFNMQVZFX1NFUl9BRERSLCANCiAgICAgICAgICAgICAgICAgIEkyQ19QQ0xLX0RJVl8yNTYgKTsNCiAgICAgICAgSTJDX3NldF9zbGF2ZV9zZWNvbmRfYWRkciggJmdfaTJjX2luc3QsIFNFQ09ORF9TTEFWRV9BRERSICk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIEkyQ19zZXRfc2xhdmVfc2Vjb25kX2FkZHINCigNCiAgICBpMmNfaW5zdGFuY2VfdCAqIHRoaXNfaTJjLA0KICAgIHVpbnQ4X3Qgc2Vjb25kX3NsYXZlX2FkZHINCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIERpc2FibGUgc2Vjb25kIHNsYXZlIGFkZHJlc3MuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBUaGUgZnVuY3Rpb24gSTJDX2Rpc2FibGVfc2xhdmVfc2Vjb25kX2FkZHIoKSBkaXNhYmxlcyB0aGUgc2Vjb25kYXJ5IHNsYXZlDQogIGFkZHJlc3Mgb2YgdGhlIENvcmVJMkMgc2xhdmUgZGV2aWNlLiANCiAgTm90ZTogVGhpcyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgb25seSBzdXBwb3J0cyBDb3JlSTJDIGhhcmR3YXJlIGNvbmZpZ3VyZWQNCiAgICAgICAgd2l0aCBhIHByb2dyYW1tYWJsZSBzZWNvbmQgc2xhdmUgYWRkcmVzcy4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEBwYXJhbSB0aGlzX2kyYzoNCiAgICBUaGUgdGhpc19pMmMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgaTJjX2luc3RhbmNlX3QgZGF0YSBzdHJ1Y3R1cmUNCiAgICBob2xkaW5nIGFsbCBkYXRhIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBDb3JlSTJDIGNoYW5uZWwuIEZvciBleGFtcGxlLCBpZiBvbmx5DQogICAgb25lIGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQsIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIA0KICAgIGNoYW5uZWwgMCBvZiB0aGUgaW5zdGFudGlhdGVkIENvcmVJMkMgaGFyZHdhcmUuDQoNCiAgQHJldHVybg0KICAgIG5vbmUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBpMmNfaW5zdGFuY2VfdCBnX2kyY19pbnN0Ow0KICAgIEkyQ19kaXNhYmxlX3NsYXZlX3NlY29uZF9hZGRyKCAmZ19pMmNfaW5zdCk7DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgSTJDX2Rpc2FibGVfc2xhdmVfc2Vjb25kX2FkZHINCigNCiAgICBpMmNfaW5zdGFuY2VfdCAqIHRoaXNfaTJjDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgSTJDX3NldF9nY2EoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgZ2VuZXJhbCBjYWxsIGFja25vd2xlZGdlbWVudCBiaXQNCiAgb2YgYSBDb3JlSTJDIHNsYXZlIGRldmljZS4gVGhpcyBhbGxvd3MgYWxsIGNoYW5uZWxzIG9mIHRoZSBDb3JlSTJDIHNsYXZlDQogIGRldmljZSByZXNwb25kIHRvIGEgZ2VuZXJhbCBjYWxsIG9yIGJyb2FkY2FzdCBtZXNzYWdlIGZyb20gYW4gSTJDIG1hc3Rlci4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEBwYXJhbSB0aGlzX2kyYzoNCiAgICBUaGUgdGhpc19pMmMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgaTJjX2luc3RhbmNlX3QgZGF0YSBzdHJ1Y3R1cmUNCiAgICBob2xkaW5nIGFsbCBkYXRhIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBDb3JlSTJDIGNoYW5uZWwuIEZvciBleGFtcGxlLCBpZiBvbmx5DQogICAgb25lIGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQsIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIA0KICAgIGNoYW5uZWwgMCBvZiB0aGUgaW5zdGFudGlhdGVkIENvcmVJMkMgaGFyZHdhcmUuDQoNCiAgQHJldHVybg0KICAgIG5vbmUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBpMmNfaW5zdGFuY2VfdCBnX2kyY19pbnN0Ow0KDQogICAgLy8gRW5hYmxlIHJlY29nbml0aW9uIG9mIHRoZSBHZW5lcmFsIENhbGwgQWRkcmVzcw0KICAgIEkyQ19zZXRfZ2NhKCAmZ19pMmNfaW5zdCApOyANCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBJMkNfc2V0X2djYQ0KKA0KICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBJMkNfY2xlYXJfZ2NhKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBjbGVhciB0aGUgZ2VuZXJhbCBjYWxsIGFja25vd2xlZGdlbWVudA0KICBiaXQgb2YgYSBDb3JlSTJDIHNsYXZlIGRldmljZS4gVGhpcyB3aWxsIHN0b3AgYWxsIGNoYW5uZWxzIG9mIHRoZSBJMkMgc2xhdmUNCiAgZGV2aWNlIHJlc3BvbmRpbmcgdG8gYW55IGdlbmVyYWwgY2FsbCBvciBicm9hZGNhc3QgbWVzc2FnZSBmcm9tIHRoZSBtYXN0ZXIuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KDQogIEByZXR1cm4NCiAgICBub25lLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfaW5zdDsNCg0KICAgIC8vIERpc2FibGUgcmVjb2duaXRpb24gb2YgdGhlIEdlbmVyYWwgQ2FsbCBBZGRyZXNzDQogICAgSTJDX2NsZWFyX2djYSggJmdfaTJjX2luc3QgKTsNCiAgQGVuZGNvZGUNCiAqLw0KDQp2b2lkIEkyQ19jbGVhcl9nY2ENCigNCiAgICBpMmNfaW5zdGFuY2VfdCAqIHRoaXNfaTJjDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAgICAgICAgICAgICAgIEkyQyBTTUJVUyBzcGVjaWZpYyBBUElzDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBJMkNfc21idXNfaW5pdCgpIGZ1bmN0aW9uIGVuYWJsZXMgU01CdXMgdGltZW91dHMgYW5kIHN0YXR1cyBsb2dpYyBmb3IgYQ0KICBDb3JlSTJDIGNoYW5uZWwuDQogIE5vdGU6IFRoaXMgYW5kIGFueSBvZiB0aGUgb3RoZXIgU01CdXMgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHdpbGwgb25seSBoYXZlIGFuDQogICAgICAgIGVmZmVjdCBpZiB0aGUgQ29yZUkyQyB3YXMgaW5zdGFudGlhdGVkIHdpdGggdGhlIEdlbmVyYXRlIFNNQnVzIExvZ2ljDQogICAgICAgIG9wdGlvbiBjaGVja2VkLg0KICBOb3RlOiBJZiB0aGUgQ29yZUkyQyB3YXMgaW5zdGFudGlhdGVkIHdpdGggdGhlIEdlbmVyYXRlIElQTUkgTG9naWMgb3B0aW9uDQogICAgICAgIGNoZWNrZWQgdGhpcyBmdW5jdGlvbiB3aWxsIGVuYWJsZSB0aGUgSVBNSSAzbVMgU0NMIGxvdyB0aW1lb3V0IGJ1dCBub25lDQogICAgICAgIG9mIHRoZSBvdGhlciBTTUJ1cyBmdW5jdGlvbnMgd2lsbCBoYXZlIGFueSBlZmZlY3QuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KDQogIEByZXR1cm4NCiAgICBub25lLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAjZGVmaW5lIENPUkVJMkNfQkFTRV9BRERSICAweEMwMDAwMDAwdQ0KICAgI2RlZmluZSBTTEFWRV9TRVJfQUREUiAgICAgMHgxMHUNCg0KICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfaW5zdDsNCg0KICAgdm9pZCBzeXN0ZW1faW5pdCggdm9pZCApDQogICB7DQogICAgICAgIEkyQ19pbml0KCAmZ19pMmNfaW5zdCwgQ09SRUkyQ19CQVNFX0FERFIsIFNMQVZFX1NFUl9BRERSLA0KICAgICAgICAgICAgICAgICAgSTJDX1BDTEtfRElWXzI1NiApOw0KICAgICAgICANCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBTTUJ1cyBmZWF0dXJlDQogICAgICAgIEkyQ19zbWJ1c19pbml0KCAmZ19pMmNfaW5zdCk7DQogICB9DQogIEBlbmRjb2RlICAgIA0KICovDQp2b2lkIEkyQ19zbWJ1c19pbml0DQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYw0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEkyQ19lbmFibGVfc21idXNfaXJxKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBlbmFibGUgdGhlIENvcmVJMkMgY2hhbm5lbJJzIA0KICBTTUJTVVMgYW5kIFNNQkFMRVJUIFNNQnVzIGludGVycnVwdHMuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KDQogIEBwYXJhbSBpcnFfdHlwZQ0KICAgIFRoZSBpcnFfdHlwZSBzcGVjaWZ5IHRoZSBTTUJVUyBpbnRlcnJ1cHQocykgd2hpY2ggd2lsbCBiZSBlbmFibGVkLg0KICAgIFRoZSB0d28gcG9zc2libGUgaW50ZXJydXB0cyBhcmU6DQogICAgICBJMkNfU01CQUxFUlRfSVJRDQogICAgICBJMkNfU01CU1VTX0lSUQ0KICAgIFRvIGVuYWJsZSBib3RoIGludHMgaW4gb25lIGNhbGwsIHVzZSBJMkNfU01CQUxFUlRfSVJRIHwgSTJDX1NNQlNVU19JUlEuDQogICAgDQogIEByZXR1cm4NCiAgICBub25lDQogIA0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgICNkZWZpbmUgQ09SRUkyQ19CQVNFX0FERFIgIDB4QzAwMDAwMDB1DQogICAgI2RlZmluZSBTTEFWRV9TRVJfQUREUiAgICAgMHgxMHUNCg0KICAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQoNCiAgICB2b2lkIG1haW4oIHZvaWQgKQ0KICAgIHsNCiAgICAgICAgSTJDX2luaXQoICZnX2kyY19pbnN0LCBDT1JFSTJDX0JBU0VfQUREUiwgU0xBVkVfU0VSX0FERFIsDQogICAgICAgICAgICAgICAgICBJMkNfUENMS19ESVZfMjU2ICk7DQogICAgICAgIA0KICAgICAgICAvLyBJbml0aWFsaXplIFNNQnVzIGZlYXR1cmUNCiAgICAgICAgSTJDX3NtYnVzX2luaXQoICZnX2kyY19pbnN0ICk7DQogICAgICAgIA0KICAgICAgICAvLyBFbmFibGUgYm90aCBJMkNfU01CQUxFUlRfSVJRICYgSTJDX1NNQlNVU19JUlEgaW50ZXJydXB0cw0KICAgICAgICBJMkNfZW5hYmxlX3NtYnVzX2lycSggJmdfaTJjX2luc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoSTJDX1NNQkFMRVJUX0lSUSB8IEkyQ19TTUJTVVNfSVJRKSApOw0KICAgfQ0KICAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBJMkNfZW5hYmxlX3NtYnVzX2lycQ0KKA0KICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMsDQogICAgdWludDhfdCAgaXJxX3R5cGUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBJMkNfZGlzYWJsZV9zbWJ1c19pcnEoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGRpc2FibGUgdGhlIENvcmVJMkMgY2hhbm5lbJJzDQogIFNNQlNVUyBhbmQgU01CQUxFUlQgU01CdXMgaW50ZXJydXB0cy4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEBwYXJhbSB0aGlzX2kyYzoNCiAgICBUaGUgdGhpc19pMmMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgaTJjX2luc3RhbmNlX3QgZGF0YSBzdHJ1Y3R1cmUNCiAgICBob2xkaW5nIGFsbCBkYXRhIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBDb3JlSTJDIGNoYW5uZWwuIEZvciBleGFtcGxlLCBpZiBvbmx5DQogICAgb25lIGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQsIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIA0KICAgIGNoYW5uZWwgMCBvZiB0aGUgaW5zdGFudGlhdGVkIENvcmVJMkMgaGFyZHdhcmUuDQoNCiAgQHBhcmFtIGlycV90eXBlDQogICAgVGhlIGlycV90eXBlIHNwZWNpZmllcyB0aGUgU01CVVMgaW50ZXJydXB0KHMpIHdoaWNoIHdpbGwgYmUgZGlzYWJsZWQuDQogICAgVGhlIHR3byBwb3NzaWJsZSBpbnRlcnJ1cHRzIGFyZToNCiAgICAgIEkyQ19TTUJBTEVSVF9JUlENCiAgICAgIEkyQ19TTUJTVVNfSVJRDQogICAgVG8gZGlzYWJsZSBib3RoIGludHMgaW4gb25lIGNhbGwsIHVzZSBJMkNfU01CQUxFUlRfSVJRIHwgSTJDX1NNQlNVU19JUlEuDQoNCiAgQHJldHVybg0KICAgIG5vbmUuDQogICAgICANCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICAjZGVmaW5lIENPUkVJMkNfQkFTRV9BRERSICAweEMwMDAwMDAwdQ0KICAgICNkZWZpbmUgU0xBVkVfU0VSX0FERFIgICAgIDB4MTB1DQoNCiAgICBpMmNfaW5zdGFuY2VfdCBnX2kyY19pbnN0Ow0KDQogICAgdm9pZCBtYWluKCB2b2lkICkNCiAgICB7DQogICAgICAgIEkyQ19pbml0KCAmZ19pMmNfaW5zdCwgQ09SRUkyQ19CQVNFX0FERFIsIFNMQVZFX1NFUl9BRERSLA0KICAgICAgICAgICAgICAgICAgSTJDX1BDTEtfRElWXzI1NiApOw0KICAgICAgICANCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBTTUJ1cyBmZWF0dXJlDQogICAgICAgIEkyQ19zbWJ1c19pbml0KCAmZ19pMmNfaW5zdCApOw0KICAgICAgICANCiAgICAgICAgLy8gRW5hYmxlIGJvdGggU01CQUxFUlQgJiBTTUJTVVMgaW50ZXJydXB0cw0KICAgICAgICBJMkNfZW5hYmxlX3NtYnVzX2lycSggJmdfaTJjX2luc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoSTJDX1NNQkFMRVJUX0lSUSB8IEkyQ19TTUJTVVNfSVJRKSk7DQogICAgICAgIA0KICAgICAgICAuLi4gICAgICAgIA0KDQogICAgICAgIC8vIERpc2FibGUgdGhlIFNNQkFMRVJUIGludGVycnVwdA0KICAgICAgICBJMkNfZGlzYWJsZV9zbWJ1c19pcnEoICZnX2kyY19pbnN0LCBJMkNfU01CQUxFUlRfSVJRICk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIEkyQ19kaXNhYmxlX3NtYnVzX2lycQ0KKA0KICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMsDQogICAgdWludDhfdCAgaXJxX3R5cGUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBmdW5jdGlvbiBJMkNfc3VzcGVuZF9zbWJ1c19zbGF2ZSgpIGZvcmNlcyBhbnkgU01CVVMgc2xhdmUgZGV2aWNlcw0KICBjb25uZWN0ZWQgdG8gYSBDb3JlSTJDIGNoYW5uZWwgaW50byBwb3dlciBkb3duIG9yIHN1c3BlbmQgbW9kZSBieSBhc3NlcnRpbmcNCiAgdGhlIGNoYW5uZWwncyBTTUJTVVMgc2lnbmFsLiBUaGUgQ29yZUkyQyBjaGFubmVsIGlzIHRoZSBTTUJ1cyBtYXN0ZXIgaW4gdGhpcw0KICBjYXNlLg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQHBhcmFtIHRoaXNfaTJjOg0KICAgIFRoZSB0aGlzX2kyYyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBpMmNfaW5zdGFuY2VfdCBkYXRhIHN0cnVjdHVyZQ0KICAgIGhvbGRpbmcgYWxsIGRhdGEgcmVsYXRlZCB0byBhIHNwZWNpZmljIENvcmVJMkMgY2hhbm5lbC4gRm9yIGV4YW1wbGUsIGlmIG9ubHkNCiAgICBvbmUgY2hhbm5lbCBpcyBpbml0aWFsaXplZCwgdGhpcyBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgDQogICAgY2hhbm5lbCAwIG9mIHRoZSBpbnN0YW50aWF0ZWQgQ29yZUkyQyBoYXJkd2FyZS4NCg0KICBAcmV0dXJuDQogICAgbm9uZS4NCiAgICANCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICAjZGVmaW5lIENPUkVJMkNfQkFTRV9BRERSICAweEMwMDAwMDAwdQ0KICAgICNkZWZpbmUgU0xBVkVfU0VSX0FERFIgICAgIDB4MTB1DQoNCiAgICBpMmNfaW5zdGFuY2VfdCBnX2kyY19pbnN0Ow0KICAgIA0KICAgIHZvaWQgbWFpbiggdm9pZCApDQogICAgew0KICAgICAgICBJMkNfaW5pdCggJmdfaTJjX2luc3QsIENPUkVJMkNfQkFTRV9BRERSLCBTTEFWRV9TRVJfQUREUiwgDQogICAgICAgICAgICAgICAgICBJMkNfUENMS19ESVZfMjU2ICk7DQoNCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBTTUJ1cyBmZWF0dXJlDQogICAgICAgIEkyQ19zbWJ1c19pbml0KCAmZ19pMmNfaW5zdCApOw0KDQogICAgICAgIC8vIHN1c3BlbmQgU01CdXMgc2xhdmVzDQogICAgICAgIEkyQ19zdXNwZW5kX3NtYnVzX3NsYXZlKCAmZ19pMmNfaW5zdCApOw0KDQogICAgICAgIC4uLg0KDQogICAgICAgIC8vIFJlLWVuYWJsZSBTTUJ1cyBzbGF2ZXMNCiAgICAgICAgSTJDX3Jlc3VtZV9zbWJ1c19zbGF2ZSggJmdfaTJjX2luc3QgKTsNCiAgICB9DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgSTJDX3N1c3BlbmRfc21idXNfc2xhdmUNCigNCiAgICBpMmNfaW5zdGFuY2VfdCAqIHRoaXNfaTJjDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgZnVuY3Rpb24gSTJDX3Jlc3VtZV9zbWJ1c19zbGF2ZSgpIGRlLWFzc2VydHMgdGhlIENvcmVJMkMgY2hhbm5lbCdzIFNNQlNVUw0KICBzaWduYWwgdG8gdGFrZSBhbnkgY29ubmVjdGVkIHNsYXZlIGRldmljZXMgb3V0IG9mIHN1c3BlbmQgbW9kZS4gVGhlIENvcmVJMkMNCiAgY2hhbm5lbCBpcyB0aGUgU01CdXMgbWFzdGVyIGluIHRoaXMgY2FzZS4NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEBwYXJhbSB0aGlzX2kyYzoNCiAgICBUaGUgdGhpc19pMmMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgaTJjX2luc3RhbmNlX3QgZGF0YSBzdHJ1Y3R1cmUNCiAgICBob2xkaW5nIGFsbCBkYXRhIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBDb3JlSTJDIGNoYW5uZWwuIEZvciBleGFtcGxlLCBpZiBvbmx5DQogICAgb25lIGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQsIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIA0KICAgIGNoYW5uZWwgMCBvZiB0aGUgaW5zdGFudGlhdGVkIENvcmVJMkMgaGFyZHdhcmUuDQoNCiAgQHJldHVybg0KICAgIG5vbmUuDQogICAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgI2RlZmluZSBDT1JFSTJDX0JBU0VfQUREUiAgMHhDMDAwMDAwMHUNCiAgICAjZGVmaW5lIFNMQVZFX1NFUl9BRERSICAgICAweDEwdQ0KDQogICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfaW5zdDsNCiAgICANCiAgICB2b2lkIG1haW4oIHZvaWQgKQ0KICAgIHsNCiAgICAgICAgSTJDX2luaXQoICZnX2kyY19pbnN0LCBDT1JFSTJDX0JBU0VfQUREUiwgU0xBVkVfU0VSX0FERFIsIA0KICAgICAgICAgICAgICAgICAgSTJDX1BDTEtfRElWXzI1NiApOw0KDQogICAgICAgIC8vIEluaXRpYWxpemUgU01CdXMgZmVhdHVyZQ0KICAgICAgICBJMkNfc21idXNfaW5pdCggJmdfaTJjX2luc3QgKTsNCg0KICAgICAgICAvLyBzdXNwZW5kIFNNQnVzIHNsYXZlcw0KICAgICAgICBJMkNfc3VzcGVuZF9zbWJ1c19zbGF2ZSggJmdfaTJjX2luc3QgKTsNCg0KICAgICAgICAuLi4NCg0KICAgICAgICAvLyBSZS1lbmFibGUgU01CdXMgc2xhdmVzDQogICAgICAgIEkyQ19yZXN1bWVfc21idXNfc2xhdmUoICZnX2kyY19pbnN0ICk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIEkyQ19yZXN1bWVfc21idXNfc2xhdmUNCigNCiAgICBpMmNfaW5zdGFuY2VfdCAqIHRoaXNfaTJjDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgSTJDX3Jlc2V0X3NtYnVzKCkgZnVuY3Rpb24gcmVzZXRzIHRoZSBDb3JlSTJDIGNoYW5uZWwncyBTTUJ1cyBjb25uZWN0aW9uDQogIGJ5IGZvcmNpbmcgU0NMSyBsb3cgZm9yIDM1bVMuIFRoZSByZXNldCBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYWZ0ZXIgMzVtcw0KICBoYXZlIGVsYXBzZWQuIFRoZSBDb3JlSTJDIGNoYW5uZWwgaXMgdGhlIFNNQnVzIG1hc3RlciBpbiB0aGlzIGNhc2UuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KDQogIEByZXR1cm4NCiAgICBub25lLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgI2RlZmluZSBDT1JFSTJDX0JBU0VfQUREUiAgMHhDMDAwMDAwMHUNCiAgICAjZGVmaW5lIFNMQVZFX1NFUl9BRERSICAgICAweDEwdQ0KDQogICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfaW5zdDsNCiAgICANCiAgICB2b2lkIG1haW4oIHZvaWQgKQ0KICAgIHsNCiAgICAgICAgSTJDX2luaXQoICZnX2kyY19pbnN0LCBDT1JFSTJDX0JBU0VfQUREUiwgU0xBVkVfU0VSX0FERFIsIA0KICAgICAgICAgICAgICAgICAgSTJDX1BDTEtfRElWXzI1NiApOw0KDQogICAgICAgIC8vIEluaXRpYWxpemUgU01CdXMgZmVhdHVyZQ0KICAgICAgICBJMkNfc21idXNfaW5pdCggJmdfaTJjX2luc3QgKTsNCg0KICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIFNNQnVzIGNoYW5uZWwgaXMgaW4gYSBrbm93biBzdGF0ZSBieSByZXNldHRpbmcgaXQNCiAgICAgICAgSTJDX3Jlc2V0X3NtYnVzKCAmZ19pMmNfaW5zdCApOyANCiAgICB9DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgSTJDX3Jlc2V0X3NtYnVzDQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYw0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEkyQ19zZXRfc21idXNfYWxlcnQoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGZvcmNlIG1hc3RlciBjb21tdW5pY2F0aW9uIHdpdGgNCiAgYW4gSTJDIHNsYXZlIGRldmljZSBieSBhc3NlcnRpbmcgdGhlIENvcmVJMkMgY2hhbm5lbJJzIFNNQkFMRVJUIHNpZ25hbC4gVGhlDQogIENvcmVJMkMgY2hhbm5lbCBpcyB0aGUgU01CdXMgc2xhdmUgaW4gdGhpcyBjYXNlLg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQHBhcmFtIHRoaXNfaTJjOg0KICAgIFRoZSB0aGlzX2kyYyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBpMmNfaW5zdGFuY2VfdCBkYXRhIHN0cnVjdHVyZQ0KICAgIGhvbGRpbmcgYWxsIGRhdGEgcmVsYXRlZCB0byBhIHNwZWNpZmljIENvcmVJMkMgY2hhbm5lbC4gRm9yIGV4YW1wbGUsIGlmIG9ubHkNCiAgICBvbmUgY2hhbm5lbCBpcyBpbml0aWFsaXplZCwgdGhpcyBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgDQogICAgY2hhbm5lbCAwIG9mIHRoZSBpbnN0YW50aWF0ZWQgQ29yZUkyQyBoYXJkd2FyZS4NCg0KICBAcmV0dXJuDQogICAgbm9uZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgICNkZWZpbmUgQ09SRUkyQ19CQVNFX0FERFIgIDB4QzAwMDAwMDB1DQogICAgI2RlZmluZSBTTEFWRV9TRVJfQUREUiAgICAgMHgxMHUNCg0KICAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQogICAgDQogICAgdm9pZCBtYWluKCB2b2lkICkNCiAgICB7DQogICAgICAgIEkyQ19pbml0KCAmZ19pMmNfaW5zdCwgQ09SRUkyQ19CQVNFX0FERFIsIFNMQVZFX1NFUl9BRERSLCANCiAgICAgICAgICAgICAgICAgIEkyQ19QQ0xLX0RJVl8yNTYgKTsNCg0KICAgICAgICAvLyBJbml0aWFsaXplIFNNQnVzIGZlYXR1cmUNCiAgICAgICAgSTJDX3NtYnVzX2luaXQoICZnX2kyY19pbnN0ICk7DQoNCiAgICAgICAgLy8gR2V0IHRoZSBTTUJ1cyBtYXN0ZXJzIGF0dGVudGlvbg0KICAgICAgICBJMkNfc2V0X3NtYnVzX2FsZXJ0KCAmZ19pMmNfaW5zdCApOw0KDQogICAgICAgIC4uLg0KDQogICAgICAgIC8vIE9uY2Ugd2UgYXJlIGhhcHB5LCBkcm9wIHRoZSBhbGVydA0KICAgICAgICBJMkNfY2xlYXJfc21idXNfYWxlcnQoICZnX2kyY19pbnN0ICk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIEkyQ19zZXRfc21idXNfYWxlcnQNCigNCiAgICBpMmNfaW5zdGFuY2VfdCAqIHRoaXNfaTJjDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgSTJDX2NsZWFyX3NtYnVzX2FsZXJ0KCkgZnVuY3Rpb24gaXMgdXNlZCBkZS1hc3NlcnQgdGhlIENvcmVJMkMgY2hhbm5lbJJzIA0KICBTTUJBTEVSVCBzaWduYWwgb25jZSBhIHNsYXZlIGRldmljZSBoYXMgaGFkIGEgcmVzcG9uc2UgZnJvbSB0aGUgbWFzdGVyLiBUaGUNCiAgQ29yZUkyQyBjaGFubmVsIGlzIHRoZSBTTUJ1cyBzbGF2ZSBpbiB0aGlzIGNhc2UuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KDQogIEByZXR1cm4NCiAgICBub25lLg0KICAgIA0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgICNkZWZpbmUgQ09SRUkyQ19CQVNFX0FERFIgIDB4QzAwMDAwMDB1DQogICAgI2RlZmluZSBTTEFWRV9TRVJfQUREUiAgICAgMHgxMHUNCg0KICAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQogICAgDQogICAgdm9pZCBtYWluKCB2b2lkICkNCiAgICB7DQogICAgICAgIEkyQ19pbml0KCAmZ19pMmNfaW5zdCwgQ09SRUkyQ19CQVNFX0FERFIsIFNMQVZFX1NFUl9BRERSLCANCiAgICAgICAgICAgICAgICAgIEkyQ19QQ0xLX0RJVl8yNTYgKTsNCg0KICAgICAgICAvLyBJbml0aWFsaXplIFNNQnVzIGZlYXR1cmUNCiAgICAgICAgSTJDX3NtYnVzX2luaXQoICZnX2kyY19pbnN0ICk7DQoNCiAgICAgICAgLy8gR2V0IHRoZSBTTUJ1cyBtYXN0ZXJzIGF0dGVudGlvbg0KICAgICAgICBJMkNfc2V0X3NtYnVzX2FsZXJ0KCAmZ19pMmNfaW5zdCApOw0KDQogICAgICAgIC4uLg0KDQogICAgICAgIC8vIE9uY2Ugd2UgYXJlIGhhcHB5LCBkcm9wIHRoZSBhbGVydA0KICAgICAgICBJMkNfY2xlYXJfc21idXNfYWxlcnQoICZnX2kyY19pbnN0ICk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIEkyQ19jbGVhcl9zbWJ1c19hbGVydA0KKA0KICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBJMkNfZ2V0X2lycV9zdGF0dXMgZnVuY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBvbiB3aGljaCBpbnRlcnJ1cHRzIGFyZQ0KICBjdXJyZW50bHkgcGVuZGluZyBpbiBhIENvcmVJMkMgY2hhbm5lbC4NCiAgVGhlIGludGVycnVwdHMgc3VwcG9ydGVkIGJ5IENvcmVJMkMgYXJlOg0KICAgICogU01CVVNBTEVSVA0KICAgICogU01CU1VTDQogICAgKiBJTlRSDQogIFRoZSBtYWNyb3MgSTJDX05PX0lSUSwgSTJDX1NNQkFMRVJUX0lSUSwgSTJDX1NNQlNVU19JUlEgYW5kIEkyQ19JTlRSX0lSUSBhcmUNCiAgcHJvdmlkZWQgZm9yIHVzZSB3aXRoIHRoaXMgZnVuY3Rpb24uDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgQ29yZUkyQyBjaGFubmVsknMgaW50ZXJydXB0cyBhcyBhIA0KICAgIHNpbmdsZSBieXRlIGJpdG1hcCB3aGVyZSBhIGJpdCBpcyBzZXQgdG8gaW5kaWNhdGUgYSBwZW5kaW5nIGludGVycnVwdC4NCiAgICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgYml0IHBvc2l0aW9ucyBhc3NvY2lhdGVkIHdpdGggZWFjaCBpbnRlcnJ1cHQgdHlwZToNCiAgICAgICAgQml0IDAgLSBTTUJVU19BTEVSVF9JUlENCiAgICAgICAgQml0IDEgLSBTTUJTVVNfSVJRDQogICAgICAgIEJpdCAyIC0gSU5UUl9JUlENCiAgICBJdCByZXR1cm5zIDAsIGlmIHRoZXJlIGFyZSBubyBwZW5kaW5nIGludGVycnVwdHMuDQoNCiAgRXhhbXBsZQ0KICBAY29kZQ0KICAgI2RlZmluZSBDT1JFSTJDX0JBU0VfQUREUiAgMHhDMDAwMDAwMHUNCiAgICNkZWZpbmUgU0xBVkVfU0VSX0FERFIgICAgIDB4MTB1DQoNCiAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQogICANCiAgIHZvaWQgbWFpbiggdm9pZCApDQogICB7DQogICAgICAgIHVpbnQ4X3QgaXJxX3RvX2VuYWJsZSA9IEkyQ19TTUJBTEVSVF9JUlEgfCBJMkNfU01CU1VTX0lSUTsNCiAgICAgICAgdWludDhfdCBwZW5kaW5nX2lycSA9IDB1Ow0KICAgICAgICANCiAgICAgICAgSTJDX2luaXQoICZnX2kyY19pbnN0LCBDT1JFSTJDX0JBU0VfQUREUiwgU0xBVkVfU0VSX0FERFIsDQogICAgICAgICAgICAgICAgICBJMkNfUENMS19ESVZfMjU2ICk7DQoNCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBTTUJ1cyBmZWF0dXJlDQogICAgICAgIEkyQ19zbWJ1c19pbml0KCAmZ19pMmNfaW5zdCApOw0KDQogICAgICAgIC8vIEVuYWJsZSBib3RoIEkyQ19TTUJBTEVSVF9JUlEgJiBJMkNfU01CU1VTX0lSUSBpcnENCiAgICAgICAgSTJDX2VuYWJsZV9zbWJ1c19pcnEoICZnX2kyY19pbnN0LCBpcnFfdG9fZW5hYmxlICk7DQoNCiAgICAgICAgLy8gR2V0IEkyQyBJUlEgdHlwZQ0KICAgICAgICBwZW5kaW5nX2lycSA9IEkyQ19nZXRfaXJxX3N0YXR1cyggJmdfaTJjX2luc3QgKTsNCg0KICAgICAgICAvLyBMZXQncyBhc3N1bWUsIGluIHN5c3RlbSwgSU5UUiBhbmQgU01CQUxFUlQgSVJRIGlzIHBlbmRpbmcuDQogICAgICAgIC8vIFNvIHBlbmRpbmdfaXJxIHdpbGwgcmV0dXJuIHN0YXR1cyBvZiBib3RoIHRoZSBJUlFzDQoNCiAgICAgICAgaWYoIHBlbmRpbmdfaXJxICYgSTJDX1NNQkFMRVJUX0lSUSApDQogICAgICAgIHsNCiAgICAgICAgICAgLy8gaWYgdHJ1ZSwgaXQgbWVhbnMgU01CQUxFUlRfSVJRIGlzIHRoZXJlIGluIHBlbmRpbmcgSVJRIGxpc3QNCiAgICAgICAgfQ0KICAgICAgICBpZiggcGVuZGluZ19pcnEgJiBJMkNfSU5UUl9JUlEgKQ0KICAgICAgICB7DQogICAgICAgICAgIC8vIGlmIHRydWUsIGl0IG1lYW5zIEkyQ19JTlRSX0lSUSBpcyB0aGVyZSBpbiBwZW5kaW5nIElSUSBsaXN0DQogICAgICAgIH0NCiAgIH0NCiAgQGVuZGNvZGUNCiAqLw0KdWludDhfdCBJMkNfZ2V0X2lycV9zdGF0dXMNCigNCiAgICBpMmNfaW5zdGFuY2VfdCAqIHRoaXNfaTJjDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgSTJDX3NldF91c2VyX2RhdGEoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSBhc3NvY2lhdGlvbiBvZiBhIGJsb2NrDQogIG9mIGFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgd2l0aCBhIENvcmVJMkMgY2hhbm5lbC4gVGhlIGNvbXBvc2l0aW9uIG9mIHRoZSANCiAgZGF0YSBibG9jayBpcyBhbiBhcHBsaWNhdGlvbiBtYXR0ZXIgYW5kIHRoZSBkcml2ZXIgc2ltcGx5IHByb3ZpZGVzIHRoZSBtZWFucw0KICBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHNldCBhbmQgcmV0cmlldmUgdGhlIHBvaW50ZXIuIFRoaXMgbWF5IGZvciBleGFtcGxlIGJlDQogIHVzZWQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGNoYW5uZWwgc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gdGhlIHNsYXZlIHdyaXRlIA0KICBoYW5kbGVyLg0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQHBhcmFtIHRoaXNfaTJjOg0KICAgIFRoZSB0aGlzX2kyYyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBpMmNfaW5zdGFuY2VfdCBkYXRhIHN0cnVjdHVyZQ0KICAgIGhvbGRpbmcgYWxsIGRhdGEgcmVsYXRlZCB0byBhIHNwZWNpZmljIENvcmVJMkMgY2hhbm5lbC4gRm9yIGV4YW1wbGUsIGlmIG9ubHkNCiAgICBvbmUgY2hhbm5lbCBpcyBpbml0aWFsaXplZCwgdGhpcyBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgDQogICAgY2hhbm5lbCAwIG9mIHRoZSBpbnN0YW50aWF0ZWQgQ29yZUkyQyBoYXJkd2FyZS4NCg0KICBAcGFyYW0gcF91c2VyX2RhdGE6DQogICAgVGhlIHBfdXNlcl9kYXRhIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgc3BlY2lmaWMgZGF0YSBibG9jayBmb3INCiAgICB0aGlzIGNoYW5uZWwuIEl0IGlzIGRlZmluZWQgYXMgdm9pZCAqIGFzIHRoZSBkcml2ZXIgZG9lcyBub3Qga25vdyB0aGUgYWN0dWFsDQogICAgdHlwZSBvZiBkYXRhIGJlaW5nIHBvaW50ZWQgdG8gYW5kIHNpbXBseSBzdG9yZXMgdGhlIHBvaW50ZXIgZm9yIGxhdGVyDQogICAgcmV0cmlldmFsIGJ5IHRoZSBhcHBsaWNhdGlvbi4NCg0KICBAcmV0dXJuDQogICAgbm9uZS4NCiAgICANCiAgRXhhbXBsZQ0KICBAY29kZQ0KICAgICNkZWZpbmUgQ09SRUkyQ19CQVNFX0FERFIgIDB4QzAwMDAwMDB1DQogICAgI2RlZmluZSBTTEFWRV9TRVJfQUREUiAgICAgMHgxMHUNCg0KICAgIGkyY19pbnN0YW5jZV90IGdfaTJjX2luc3Q7DQogICAgYXBwX2RhdGFfdCBjaGFubmVsX3hkYXRhOw0KICANCiAgICB2b2lkIG1haW4oIHZvaWQgKQ0KICAgIHsNCiAgICAgICAgYXBwX2RhdGFfdCAqcF94ZGF0YTsNCg0KICAgICAgICBJMkNfaW5pdCggJmdfaTJjX2luc3QsIENPUkVJMkNfQkFTRV9BRERSLCBTTEFWRV9TRVJfQUREUiwgDQogICAgICAgICAgICAgICAgICBJMkNfUENMS19ESVZfMjU2ICk7DQoNCiAgICAgICAgLy8gU3RvcmUgbG9jYXRpb24gb2YgdXNlciBkYXRhIGluIGluc3RhbmNlIHN0cnVjdHVyZQ0KICAgICAgICBJMkNfc2V0X3VzZXJfZGF0YSggJmdfaTJjX2luc3QsICh2b2lkICopJmNoYW5uZWxfeGRhdGEgKTsNCg0KICAgICAgICAuLi4NCg0KICAgICAgICAvLyBSZXRyaWV2ZSBsb2NhdGlvbiBvZiB1c2VyIGRhdGEgYW5kIGRvIHNvbWUgd29yayBvbiBpdA0KICAgICAgICBwX3hkYXRhID0gKGFwcF9kYXRhX3QgKilJMkNfZ2V0X3VzZXJfZGF0YSggJmdfaTJjX2luc3QgKTsNCiAgICAgICAgaWYoIE5VTEwgIT0gcF94ZGF0YSApDQogICAgICAgIHsNCiAgICAgICAgICAgIHBfeGRhdGEtPmZvbyA9IDEyMzsNCiAgICAgICAgfQ0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBJMkNfc2V0X3VzZXJfZGF0YQ0KKA0KICAgIGkyY19pbnN0YW5jZV90ICogdGhpc19pMmMsDQogICAgdm9pZCAqIHBfdXNlcl9kYXRhDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgSTJDX2dldF91c2VyX2RhdGEoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSByZXRyaWV2YWwgb2YgdGhlIGFkZHJlc3MNCiAgb2YgYSBibG9jayBvZiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIENvcmVJMkMgY2hhbm5lbC4NCiAgVGhlIGNvbXBvc2l0aW9uIG9mIHRoZSBkYXRhIGJsb2NrIGlzIGFuIGFwcGxpY2F0aW9uIG1hdHRlciBhbmQgdGhlIGRyaXZlciANCiAgc2ltcGx5IHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHNldCBhbmQgcmV0cmlldmUgdGhlIHBvaW50ZXIuDQogIFRoaXMgbWF5IGZvciBleGFtcGxlIGJlIHVzZWQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGNoYW5uZWwgc3BlY2lmaWMNCiAgaW5mb3JtYXRpb24gdG8gdGhlIHNsYXZlIHdyaXRlIGhhbmRsZXIuDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBAcGFyYW0gdGhpc19pMmM6DQogICAgVGhlIHRoaXNfaTJjIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGkyY19pbnN0YW5jZV90IGRhdGEgc3RydWN0dXJlDQogICAgaG9sZGluZyBhbGwgZGF0YSByZWxhdGVkIHRvIGEgc3BlY2lmaWMgQ29yZUkyQyBjaGFubmVsLiBGb3IgZXhhbXBsZSwgaWYgb25seQ0KICAgIG9uZSBjaGFubmVsIGlzIGluaXRpYWxpemVkLCB0aGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiANCiAgICBjaGFubmVsIDAgb2YgdGhlIGluc3RhbnRpYXRlZCBDb3JlSTJDIGhhcmR3YXJlLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB1c2VyIHNwZWNpZmljIGRhdGEgYmxvY2sgZm9yIHRoaXMgDQogICAgY2hhbm5lbC4gSXQgaXMgZGVmaW5lZCBhcyB2b2lkICogYXMgdGhlIGRyaXZlciBkb2VzIG5vdCBrbm93IHRoZSBhY3R1YWwgdHlwZQ0KICAgIG9mIGRhdGEgYmVpbmcgcG9pbnRlZC4gSWYgbm8gdXNlciBkYXRhIGhhcyBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY2hhbm5lbA0KICAgIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLg0KICAgIA0KICBFeGFtcGxlDQogIEBjb2RlDQogICAgI2RlZmluZSBDT1JFSTJDX0JBU0VfQUREUiAgMHhDMDAwMDAwMHUNCiAgICAjZGVmaW5lIFNMQVZFX1NFUl9BRERSICAgICAweDEwdQ0KDQogICAgaTJjX2luc3RhbmNlX3QgZ19pMmNfaW5zdDsNCiAgICBhcHBfZGF0YV90IGNoYW5uZWxfeGRhdGE7DQogIA0KICAgIHZvaWQgbWFpbiggdm9pZCApDQogICAgew0KICAgICAgICBhcHBfZGF0YV90ICpwX3hkYXRhOw0KDQogICAgICAgIEkyQ19pbml0KCAmZ19pMmNfaW5zdCwgQ09SRUkyQ19CQVNFX0FERFIsIFNMQVZFX1NFUl9BRERSLA0KICAgICAgICAgICAgICAgICAgSTJDX1BDTEtfRElWXzI1NiApOw0KDQogICAgICAgIC8vIFN0b3JlIGxvY2F0aW9uIG9mIHVzZXIgZGF0YSBpbiBpbnN0YW5jZSBzdHJ1Y3R1cmUNCiAgICAgICAgSTJDX3NldF91c2VyX2RhdGEoICZnX2kyY19pbnN0LCAodm9pZCAqKSZjaGFubmVsX3hkYXRhICk7DQoNCiAgICAgICAgLi4uDQogICAgICAgIA0KICAgICAgICAvLyBSZXRyaWV2ZSBsb2NhdGlvbiBvZiB1c2VyIGRhdGEgYW5kIGRvIHNvbWUgd29yayBvbiBpdA0KICAgICAgICBwX3hkYXRhID0gKGFwcF9kYXRhX3QgKilJMkNfZ2V0X3VzZXJfZGF0YSggJmdfaTJjX2luc3QgKTsNCiAgICAgICAgaWYoIE5VTEwgIT0gcF94ZGF0YSApDQogICAgICAgIHsNCiAgICAgICAgICAgIHBfeGRhdGEtPmZvbyA9IDEyMzsNCiAgICAgICAgfQ0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCAqIEkyQ19nZXRfdXNlcl9kYXRhDQooDQogICAgaTJjX2luc3RhbmNlX3QgKiB0aGlzX2kyYw0KKTsNCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQp9DQojZW5kaWYNCg0KI2VuZGlmDQo=