LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChjKSBDb3B5cmlnaHQgMjAwOCBBY3RlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKiANCiAqIFNtYXJ0RnVzaW9uIG1pY3JvY29udHJvbGxlciBzdWJzeXN0ZW0gUGVyaXBoZXJhbCBETUEgYmFyZSBtZXRhbCBzb2Z0d2FyZQ0KICogZHJpdmVyIHB1YmxpYyBBUEkuDQogKg0KICogU1ZOICRSZXZpc2lvbjogMjExMCAkDQogKiBTVk4gJERhdGU6IDIwMTAtMDItMDUgMTU6MjQ6MTkgKzAwMDAgKEZyaSwgMDUgRmViIDIwMTApICQNCiAqLw0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKioNCiAgQG1haW5wYWdlIFNtYXJ0RnVzaW9uIE1TUyBHUElPIEJhcmUgTWV0YWwgRHJpdmVyLg0KDQogIEBzZWN0aW9uIGludHJvX3NlYyBJbnRyb2R1Y3Rpb24NCiAgVGhlIFNtYXJ0RnVzaW9uIE1pY3JvY29udHJvbGxlciBTdWJzeXN0ZW0gKE1TUykgaW5jbHVkZXMgYW4gOCBjaGFubmVsDQogIFBlcmlwaGVyYWwgRE1BIChQRE1BKSBjb250cm9sbGVyLg0KICBUaGlzIHNvZnR3YXJlIGRyaXZlciBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSBNU1MgUERNQQ0KICBjb250cm9sbGVyIGFzIHBhcnQgb2YgYSBiYXJlIG1ldGFsIHN5c3RlbSB3aGVyZSBubyBvcGVyYXRpbmcgc3lzdGVtIGlzIGF2YWlsYWJsZS4NCiAgVGhpcyBkcml2ZXIgY2FuIGJlIGFkYXB0ZWQgZm9yIHVzZSBhcyBwYXJ0IG9mIGFuIG9wZXJhdGluZyBzeXN0ZW0gYnV0IHRoZQ0KICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRhcHRhdGlvbiBsYXllciBiZXR3ZWVuIHRoaXMgZHJpdmVyIGFuZCB0aGUgb3BlcmF0aW5nDQogIHN5c3RlbSdzIGRyaXZlciBtb2RlbCBpcyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGRyaXZlci4NCiAgDQogIEBzZWN0aW9uIHRoZW9yeV9vcCBUaGVvcnkgb2YgT3BlcmF0aW9uDQogIFRoZSBNU1MgUERNQSBkcml2ZXIgdXNlcyB0aGUgU21hcnRGdXNpb24gIkNvcnRleCBNaWNyb2NvbnRyb2xlciBTb2Z0d2FyZQ0KICBJbnRlcmZhY2UgU3RhbmRhcmQgLSBQZXJpcGhlcmFsIEFjY2VzcyBMYXllciIgKENNU0lTLVBBTCkgdG8gYWNjZXNzIE1TUyBoYXJkd2FyZQ0KICByZWdpc3RlcnMuIFlvdSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBTbWFydEZ1c2lvbiBDTVNJUy1QQUwgaXMgZWl0aGVyIGluY2x1ZGVkDQogIGluIHRoZSBzb2Z0d2FyZSB0b29sY2hhaW4gdXNlZCB0byBidWlsZCB5b3VyIHByb2plY3Qgb3IgaXMgaW5jbHVkZWQgaW4geW91cg0KICBwcm9qZWN0LiBUaGUgbW9zdCB1cC10by1kYXRlIFNtYXJ0RnVzaW9uIENNU0lTLVBBTCBmaWxlcyBjYW4gYmUgb2J0YWluZWQgdXNpbmcNCiAgdGhlIEFjdGVsIEZpcm13YXJlIENhdGFsb2cuDQogIA0KICBUaGUgTVNTIFBETUEgZHJpdmVyIGZ1bmN0aW9ucyBhcmUgZ3JvdXBlZCBpbnRvIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcmllczoNCiAgICAtIEluaXRpYWxpemF0aW9uDQogICAgLSBDb25maWd1cmF0aW9uDQogICAgLSBETUEgdHJhbnNmZXIgY29udHJvbA0KICAgIC0gSW50ZXJydXB0IGNvbnRyb2wNCiAgDQogIFRoZSBNU1MgUERNQSBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQgdGhyb3VnaCBhIGNhbGwgdG8gdGhlIFBETUFfaW5pdCgpIGZ1bmN0aW9uLg0KICBUaGUgUERNQV9pbml0KCkgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBQRE1BIGRyaXZlciBmdW5jdGlvbnMNCiAgY2FuIGJlIGNhbGxlZC4NCiAgDQogIEVhY2ggUERNQSBjaGFubmVsIGlzIGluZGl2aWR1YWxseSBjb25maWd1cmVkIHRocm91Z2ggYSBjYWxsIHRvIHRoZSBQRE1BX2NvbmZpZ3VyZSgpDQogIGZ1bmN0aW9uLiBDb25maWd1cmF0aW9uIGluY2x1ZGVzOg0KICAgIC0gY2hhbm5lbCBwcmlvcml0eQ0KICAgIC0gdHJhbnNmZXIgc2l6ZQ0KICAgIC0gc291cmNlIGFuZC9vciBkZXN0aW5hdGlvbiBhZGRyZXNzIGluY3JlbWVudA0KICAgIC0gc291cmNlIG9yIGRlc3RpbmF0aW9uIG9mIHRoZSBETUEgdHJhbnNmZXINCiAgUERNQSBjaGFubmVscyBjYW4gYmUgZGl2aWRlZCBpbnRvIGhpZ2ggYW5kIGxvdyBwcmlvcml0eSBjaGFubmVscy4gSGlnaCBwcmlvcml0eQ0KICBjaGFubmVscyBhcmUgZ2l2ZW4gbW9yZSBvcHBvcnR1bml0aWVzIHRvIHBlcmZvcm0gdHJhbnNmZXJzIHRoYW4gbG93IHByaW9yaXR5DQogIGNoYW5uZWxzIHdoZW4gdGhlcmUgYXJlIGNvbnRpbnVvdXMgaGlnaCBwcmlvcml0eSBjaGFubmVscyByZXF1ZXN0cy4gVGhlIHJhdGlvDQogIG9mIGhpZ2ggcHJpb3JpdHkgdG8gbG93IHByaW9yaXR5IFBETUEgdHJhbnNmZXJzIGlzIGNvbmZpZ3VyYWJsZSB0aHJvdWdoIHRoZQ0KICBQRE1BX3NldF9wcmlvcml0eSgpIGZ1bmN0aW9uLg0KICBQRE1BIGNoYW5uZWxzIGNhbiBiZSBjb25maWd1cmVkIHRvIHBlcmZvcm0gYnl0ZSAoOCBiaXRzKSwgaGFsZi13b3JkICgxNiBiaXRzKQ0KICBvciB3b3JkICgzMiBiaXRzKSB0cmFuc2ZlcnMuDQogIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgYSBQRE1BIGNoYW5uZWyScyB0cmFuc2ZlcnMgY2FuIGJlDQogIGluZGVwZW5kZW50bHkgY29uZmlndXJlZCB0byBpbmNyZW1lbnQgYnkgMCwgMSwgMiBvciA0IGJ5dGVzLiBGb3IgZXhhbXBsZSwgdGhlDQogIGNvbnRlbnQgb2YgYSBieXRlIGJ1ZmZlciBsb2NhdGVkIGluIFJBTSBjYW4gYmUgdHJhbnNmZXJyZWQgaW50byBhIHBlcmlwaGVyYWyScw0KICB0cmFuc21pdCByZWdpc3RlciBieSBjb25maWd1cmluZyB0aGUgc291cmNlIGFkZHJlc3MgaW5jcmVtZW50IHRvIG9uZSBieXRlIGFuZA0KICBubyBpbmNyZW1lbnQgb2YgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MuDQogIFRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb2YgYSBQRE1BIGNoYW5uZWyScyB0cmFuc2ZlcnMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8NCiAgYmUgb25lIG9mIHRoZSBNU1MgcGVyaXBoZXJhbHMuIFRoaXMgYWxsb3dzIHRoZSBQRE1BIGNvbnRyb2xsZXIgdG8gdXNlIHNvbWUNCiAgaGFyZHdhcmUgZmxvdyBjb250cm9sIHNpZ25hbGluZyB3aXRoIHRoZSBwZXJpcGhlcmFsIHRvIGF2b2lkIG92ZXJydW5uaW5nIHRoZQ0KICBwZXJpcGhlcmFsknMgZGF0YSBidWZmZXIgd2hlbiB0aGUgcGVyaXBoZXJhbCBpcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIERNQQ0KICB0cmFuc2Zlciwgb3IgYXR0ZW1wdGluZyB0byByZWFkIGRhdGEgZnJvbSB0aGUgcGVyaXBoZXJhbCB3aGlsZSBpdCBpcyBub3QgcmVhZHkNCiAgd2hlbiB0aGUgcGVyaXBoZXJhbCBpcyB0aGUgc291cmNlIG9mIHRoZSB0cmFuc2Zlci4NCiAgQSBQRE1BIGNoYW5uZWwgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byB0cmFuc2ZlciBkYXRhIGJldHdlZW4gdHdvIG1lbW9yeQ0KICBtYXBwZWQgbG9jYXRpb25zIChtZW1vcnkgdG8gbWVtb3J5KS4gTm8gaGFyZHdhcmUgZmxvdyBjb250cm9sIGlzIHVzZWQgYnkgdGhlDQogIFBETUEgY29udHJvbGxlciBmb3IgZGF0YSB0cmFuc2ZlciBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uDQogIA0KICBBIERNQSB0cmFuc2ZlciBjYW4gYmUgaW5pdGlhdGVkIGJ5IGEgY2FsbCB0byB0aGUgUERNQV9zdGFydCgpIGZ1bmN0aW9uIGFmdGVyIGENCiAgUERNQSBjaGFubmVsIGhhcyBiZWVuIGNvbmZpZ3VyZWQuIE9uY2Ugc3RhcnRlZCwgZnVydGhlciBkYXRhIGNhbiBiZSBwdXNoZWQNCiAgdGhyb3VnaCB0aGUgUERNQSBjaGFubmVsIGJ5IGNhbGxpbmcgdGhlIFBETUFfbG9hZF9uZXh0X2J1ZmZlcigpIGZ1bmN0aW9uLiBUaGUNCiAgUERNQV9sb2FkX25leHRfYnVmZmVyKCkgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY2FsbCB0byB0aGUNCiAgUERNQV9zdGF0dXMoKSBmdW5jdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUgUERNQSBjaGFubmVsIHVzZWQgZm9yIHRoZSB0cmFuc2Zlcg0KICBoYXMgYSBmcmVlIGJ1ZmZlciBvciBpdCBjYW4gYmUgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIGEgUERNQSBpbnRlcnJ1cHQuDQogIA0KICBBIERNQSB0cmFuc2ZlciBjYW4gYmUgcGF1c2VkIGFuZCByZXN1bWVkIHRocm91Z2ggY2FsbHMgdG8gZnVuY3Rpb25zIFBETUFfcGF1c2UoKQ0KICBhbmQgUERNQV9yZXN1bWUoKS4NCiAgDQogIFlvdXIgYXBwbGljYXRpb24gY2FuIG1hbmFnZSBETUEgdHJhbnNmZXJzIHVzaW5nIGludGVycnVwdHMgdGhyb3VnaCB0aGUgdXNlIG9mDQogIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOg0KICAgIC0gUERNQV9zZXRfaXJxX2hhbmRsZXIoKQ0KICAgIC0gUERNQV9lbmFibGVfaXJxKCkNCiAgICAtIFBETUFfY2xlYXJfaXJxKCkNCiAgICAtIFBETUFfZGlzYWJsZV9pcnEoKQ0KICBUaGUgUERNQV9zZXRfaXJxX2hhbmRsZXIoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIFBETUEgY2hhbm5lbCBpbnRlcnJ1cHQNCiAgaGFuZGxlciBmdW5jdGlvbnMgd2l0aCB0aGUgZHJpdmVyLiBZb3UgbXVzdCBjcmVhdGUgYW5kIHJlZ2lzdGVyIGFuIGludGVycnVwdA0KICBoYW5kbGVyIGZ1bmN0aW9uIGZvciBlYWNoIGludGVycnVwdCBkcml2ZW4gUERNQSBjaGFubmVsIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLg0KICBVc2UgdGhlIFBETUFfZW5hYmxlX2lycSgpIGZ1bmN0aW9uIHRvIGVuYWJsZSBpbnRlcnJ1cHRzIGZvciB0aGUgUERNQSBjaGFubmVscy4gDQogIEV2ZXJ5IHRpbWUgYSBQRE1BIGNoYW5uZWwgY29tcGxldGVzIHRoZSB0cmFuc2ZlciBvZiBhIGJ1ZmZlciBpdCBjYXVzZXMgYSBQRE1BDQogIGludGVycnVwdCB0byBvY2N1ciBhbmQgdGhlIFBETUEgZHJpdmVyIHdpbGwgY2FsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXINCiAgcmVnaXN0ZXJlZCBieSB0aGUgYXBwbGljYXRpb24gZm9yIHRoYXQgUERNQSBjaGFubmVsLg0KICANCiAqLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQojaWZuZGVmIF9fTVNTX1BFUklQSEVSQUxfRE1BX0hfDQojZGVmaW5lIF9fTVNTX1BFUklQSEVSQUxfRE1BX0hfDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KZXh0ZXJuICJDIiB7DQojZW5kaWYgDQoNCiNpbmNsdWRlICIuLi8uLi9DTVNJUy9hMmZ4eHhtMy5oIg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgcGRtYV9jaGFubmVsX2lkX3QgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpZGVudGlmeSBwZXJpcGhlcmFsIERNQSBjaGFubmVscy4NCiAgSXQgaXMgdXNlZCBhcyBmdW5jdGlvbiBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgUERNQSBjaGFubmVsIHVzZWQuDQogKi8NCnR5cGVkZWYgZW51bSBfX3BkbWFfY2hhbm5lbF9pZA0Kew0KICAgIFBETUFfQ0hBTk5FTF8wID0gMCwNCiAgICBQRE1BX0NIQU5ORUxfMSwNCiAgICBQRE1BX0NIQU5ORUxfMiwNCiAgICBQRE1BX0NIQU5ORUxfMywNCiAgICBQRE1BX0NIQU5ORUxfNCwNCiAgICBQRE1BX0NIQU5ORUxfNSwNCiAgICBQRE1BX0NIQU5ORUxfNiwNCiAgICBQRE1BX0NIQU5ORUxfNw0KfSBwZG1hX2NoYW5uZWxfaWRfdDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIHBkbWFfc3JjX2Rlc3RfdCBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbg0KICBvZiB0cmFuc2ZlcnMgb24gYSBQRE1BIGNoYW5uZWwuIEl0IHNwZWNpZmllcyB3aGljaCBoYXJkd2FyZSBwZXJpcGhlcmFsIHdpbGwgYmUNCiAgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBvZiBETUEgdHJhbnNmZXJzLiBUaGlzIGFsbG93cyB0aGUgUERNQSBjb250cm9sbGVyDQogIHRvIHVzZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgc2lnbmFscyB0byBhdm9pZCBvdmVycnVubmluZyBhDQogIGRlc3RpbmF0aW9uIHBlcmlwaGVyYWwgd2l0aCBkYXRhIGl0IGlzIG5vdCByZWFkeSB0byByZWNlaXZlLCBvciBhdHRlbXB0aW5nIHRvDQogIHRyYW5zZmVyIGRhdGEgZnJvbSBhIHBlcmlwaGVyYWwgd2hpbGUgaXQgaGFzIG5vIGRhdGEgcmVhZHkgdG8gdHJhbnNmZXIuDQogIFRoZSBwZG1hX3NyY19kZXN0X3QgZW51bWVyYXRpb24gY2FuIGFsc28gYmUgdXNlZCB0byBzcGVjaWZ5IHRoYXQgYSBQRE1BIGNoYW5uZWwNCiAgaXMgY29uZmlndXJlZCB0byB0cmFuc2ZlciBkYXRhIGJldHdlZW4gdHdvIG1lbW9yeSBtYXBwZWQgbG9jYXRpb25zDQogIChtZW1vcnkgdG8gbWVtb3J5KS4gTm8gaGFyZHdhcmUgZGF0YSBmbG93IGNvbnRyb2wgaXMgdXNlZCBieSB0aGUgUERNQQ0KICBjb250cm9sbGVyIGluIHRoaXMgY29uZmlndXJhdGlvbi4NCiAgVGhpcyBlbnVtZXJhdGlvbiBpcyB1c2VkIGFzIHBhcmFtZXRlciB0byBmdW5jdGlvbiBQRE1BX2NvbmZpZ3VyZSgpLg0KICovDQp0eXBlZGVmIGVudW0gX19wZG1hX3NyY19kZXN0DQp7DQogICAgUERNQV9GUk9NX1VBUlRfMCA9IDAsDQogICAgUERNQV9UT19VQVJUXzAsDQogICAgUERNQV9GUk9NX1VBUlRfMSwNCiAgICBQRE1BX1RPX1VBUlRfMSwNCiAgICBQRE1BX0ZST01fU1BJXzAsDQogICAgUERNQV9UT19TUElfMCwNCiAgICBQRE1BX0ZST01fU1BJXzEsDQogICAgUERNQV9UT19TUElfMSwNCiAgICBQRE1BX0ZST01fRlBHQV8xLA0KICAgIFBETUFfVE9fRlBHQV8xLA0KICAgIFBETUFfRlJPTV9GUEdBXzAsDQogICAgUERNQV9UT19GUEdBXzAsDQogICAgUERNQV9UT19BQ0UsDQogICAgUERNQV9GUk9NX0FDRSwNCiAgICBQRE1BX01FTV9UT19NRU0NCn0gcGRtYV9zcmNfZGVzdF90Ow0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgcGRtYV9wcmlvcml0eV9yYXRpb190IGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSByYXRpbyBvZiBoaWdoDQogIHByaW9yaXR5IHRvIGxvdyBwcmlvcml0eSBQRE1BIGNoYW5uZWxzLiAgVGhpcyByYXRpbyBzcGVjaWZpZXMgaG93IG1hbnkgRE1BDQogIHRyYW5zZmVyIG9wcG9ydHVuaXRpZXMgd2lsbCBiZSBnaXZlbiB0byBoaWdoIHByaW9yaXR5IGNoYW5uZWxzIGJlZm9yZSBhIERNQQ0KICB0cmFuc2ZlciBvcHBvcnR1bml0eSBpcyBnaXZlbiB0byBhIGxvdyBwcmlvcml0eSBjaGFubmVsIHdoZW4gdGhlcmUgYXJlDQogIGNvbnRpbnVvdXMgcmVxdWVzdHMgZnJvbSBoaWdoIHByaW9yaXR5IGNoYW5uZWxzLiBUaGlzIGVudW1lcmF0aW9uIGlzIHVzZWQgYXMNCiAgcGFyYW1ldGVyIHRvIGZ1bmN0aW9uIFBETUFfc2V0X3ByaW9yaXR5X3JhdGlvKCkuDQogKi8NCnR5cGVkZWYgZW51bSBfX3BkbWFfcHJpb3JpdHlfcmF0aW9fdA0Kew0KICAgIFBETUFfUk9VTkRfUk9CSU4gPSAwLA0KICAgIFBETUFfUkFUSU9fSElHSF9MT1dfMV9UT18xID0gMSwNCiAgICBQRE1BX1JBVElPX0hJR0hfTE9XXzNfVE9fMSA9IDMsDQogICAgUERNQV9SQVRJT19ISUdIX0xPV183X1RPXzEgPSA3LA0KICAgIFBETUFfUkFUSU9fSElHSF9MT1dfMTVfVE9fMSA9IDE1LA0KICAgIFBETUFfUkFUSU9fSElHSF9MT1dfMzFfVE9fMSA9IDMxLA0KICAgIFBETUFfUkFUSU9fSElHSF9MT1dfNjNfVE9fMSA9IDYzLA0KICAgIFBETUFfUkFUSU9fSElHSF9MT1dfMTI3X1RPXzEgPSAxMjcsDQogICAgUERNQV9SQVRJT19ISUdIX0xPV18yNTVfVE9fMSA9IDI1NQ0KfSBwZG1hX3ByaW9yaXR5X3JhdGlvX3Q7DQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIHBkbWFfY2hhbm5lbF9pc3JfdCB0eXBlIGlzIGEgcG9pbnRlciB0byBhIFBETUEgY2hhbm5lbCBpbnRlcnJ1cHQgaGFuZGxlcg0KICBmdW5jdGlvbi4gSXQgc3BlY2lmaWVzIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlDQogIHJlZ2lzdGVyZWQgYXMgUERNQSBjaGFubmVsIGludGVycnVwdCBoYW5kbGVycy4gSXQgaXMgdXNlZCBhcyBwYXJhbWV0ZXIgdG8NCiAgZnVuY3Rpb24gUERNQV9zZXRfaXJxX2hhbmRsZXIoKS4NCiAqLw0KdHlwZWRlZiB2b2lkICgqcGRtYV9jaGFubmVsX2lzcl90KSggdm9pZCApOw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIHRvIGJ1aWxkIHRoZSBjaGFubmVsX2NmZyBwYXJhbWV0ZXIgb2YgdGhlDQogIFBETUFfY29uZmlndXJlKCkgZnVuY3Rpb24uIFRoZXkgc3BlY2lmeSB3aGV0aGVyIGEgY2hhbm5lbCBpcyBhIGhpZ2ggb3IgbG93DQogIHByaW9yaXR5IGNoYW5uZWwuDQogKi8NCiNkZWZpbmUgUERNQV9MT1dfUFJJT1JJVFkgICAgMHgwMDAwDQojZGVmaW5lIFBETUFfSElHSF9QUklPUklUWSAgIDB4MDIwMA0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgdG8gYnVpbGQgdGhlIGNoYW5uZWxfY2ZnIHBhcmFtZXRlciBvZiB0aGUNCiAgUERNQV9jb25maWd1cmUoKSBmdW5jdGlvbi4gVGhleSBzcGVjaWZ5IHRoZSBkYXRhIHdpZHRoIG9mIHRoZSB0cmFuc2ZlcnMNCiAgcGVyZm9ybWVkIGJ5IGEgUERNQSBjaGFubmVsLg0KICovDQojZGVmaW5lIFBETUFfQllURV9UUkFOU0ZFUiAgICAgICAweDAwMDAgICAgIC8qIEJ5dGUgdHJhbnNmZXJzICg4IGJpdHMpICovDQojZGVmaW5lIFBETUFfSEFMRldPUkRfVFJBTlNGRVIgICAweDAwMDQgICAgIC8qIEhhbGYtd29yZCB0cmFuc2ZlcnMgKDE2IGJpdHMpICovDQojZGVmaW5lIFBETUFfV09SRF9UUkFOU0ZFUiAgICAgICAweDAwMDggICAgIC8qIFdvcmQgdHJhbnNmZXJzICgzMiBiaXRzKSAqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgdG8gYnVpbGQgdGhlIGNoYW5uZWxfY2ZnIHBhcmFtZXRlciBvZiB0aGUNCiAgUERNQV9jb25maWd1cmUoKSBmdW5jdGlvbi4gVGhleSBzcGVjaWZ5IHRoZSBQRE1BIGNoYW5uZWyScyBzb3VyY2UgYW5kDQogIGRlc3RpbmF0aW9uIGFkZHJlc3MgaW5jcmVtZW50Lg0KICovDQojZGVmaW5lIFBETUFfTk9fSU5DICAwDQojZGVmaW5lIFBETUFfSU5DX1NSQ19PTkVfQllURSAgICAweDA0MDANCiNkZWZpbmUgUERNQV9JTkNfU1JDX1RXT19CWVRFUyAgIDB4MDgwMA0KI2RlZmluZSBQRE1BX0lOQ19TUkNfRk9VUl9CWVRFUyAgMHgwQzAwDQojZGVmaW5lIFBETUFfSU5DX0RFU1RfT05FX0JZVEUgICAweDEwMDANCiNkZWZpbmUgUERNQV9JTkNfREVTVF9UV09fQllURVMgIDB4MjAwMA0KI2RlZmluZSBQRE1BX0lOQ19ERVNUX0ZPVVJfQllURVMgMHgzMDAwDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBNYXNrIGZvciB2YXJpb3VzIGNvbnRyb2wgcmVnaXN0ZXIgYml0cy4NCiAqLw0KI2RlZmluZSBQRE1BX0lSUV9FTkFCTEVfTUFTSyAgICAodWludDMyX3QpMHgwMDAwMDA0MA0KI2RlZmluZSBQRE1BX1BBVVNFX01BU0sgICAgICAgICAodWludDMyX3QpMHgwMDAwMDAxMA0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3JjX2FkZHIgcGFyYW1ldGVyIHRvIHRoZSBQRE1BX3N0YXJ0KCkNCiAgYW5kIFBETUFfbG9hZF9uZXh0X2J1ZmZlcigpIGZ1bmN0aW9ucy4gVGhleSBzcGVjaWZ5IHRoZSByZWNlaXZlIHJlZ2lzdGVyDQogIGFkZHJlc3Mgb2YgcGVyaXBoZXJhbHMgdGhhdCBjYW4gYmUgdGhlIHNvdXJjZSBvZiBhIERNQSB0cmFuc2Zlci4gDQogIFdoZW4gYSBQRE1BIGNoYW5uZWwgaXMgY29uZmlndXJlZCBmb3IgRE1BIHRyYW5zZmVycyBmcm9tIGEgcGVyaXBoZXJhbCB0byBtZW1vcnksDQogIHRoZSBjb25zdGFudCBzcGVjaWZ5aW5nIHRoYXQgcGVyaXBoZXJhbJJzIHJlY2VpdmUgcmVnaXN0ZXIgYWRkcmVzcyBtdXN0IGJlIHVzZWQNCiAgYXMgdGhlIHNyY19hZGRyIHBhcmFtZXRlci4NCiAqLw0KI2RlZmluZSBQRE1BX1NQSTBfUlhfUkVHSVNURVIgICAgICAgMHg0MDAwMTAxMHVMDQojZGVmaW5lIFBETUFfU1BJMV9SWF9SRUdJU1RFUiAgICAgICAweDQwMDExMDEwdUwNCiNkZWZpbmUgUERNQV9VQVJUMF9SWF9SRUdJU1RFUiAgICAgIDB4NDAwMDAwMDB1TA0KI2RlZmluZSBQRE1BX1VBUlQxX1JYX1JFR0lTVEVSICAgICAgMHg0MDAxMDAwMHVMDQojZGVmaW5lIFBETUFfQUNFX1BQRV9EQVRBT1VUICAgICAgICAweDQwMDIxMzA4dUwNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGRlc3RfYWRkciBwYXJhbWV0ZXIgdG8gdGhlIFBETUFfc3RhcnQoKQ0KICBhbmQgUERNQV9sb2FkX25leHRfYnVmZmVyKCkgZnVuY3Rpb25zLiBUaGV5IHNwZWNpZnkgdGhlIHRyYW5zbWl0IHJlZ2lzdGVyDQogIGFkZHJlc3Mgb2YgcGVyaXBoZXJhbHMgdGhhdCBjYW4gYmUgdGhlIGRlc3RpbmF0aW9uIG9mIGEgRE1BIHRyYW5zZmVyLiANCiAgV2hlbiBhIFBETUEgY2hhbm5lbCBpcyBjb25maWd1cmVkIGZvciBETUEgdHJhbnNmZXJzIGZyb20gbWVtb3J5IHRvIGEgcGVyaXBoZXJhbCwNCiAgdGhlIGNvbnN0YW50IHNwZWNpZnlpbmcgdGhhdCBwZXJpcGhlcmFsknMgdHJhbnNtaXQgcmVnaXN0ZXIgYWRkcmVzcyBtdXN0IGJlIHVzZWQNCiAgYXMgdGhlIGRlc3RfYWRkciBwYXJhbWV0ZXIuDQogKi8NCiNkZWZpbmUgUERNQV9TUEkwX1RYX1JFR0lTVEVSICAgICAgIDB4NDAwMDEwMTR1TA0KI2RlZmluZSBQRE1BX1NQSTFfVFhfUkVHSVNURVIgICAgICAgMHg0MDAxMTAxNHVMDQojZGVmaW5lIFBETUFfVUFSVDBfVFhfUkVHSVNURVIgICAgICAweDQwMDAwMDAwdUwNCiNkZWZpbmUgUERNQV9VQVJUMV9UWF9SRUdJU1RFUiAgICAgIDB4NDAwMTAwMDB1TA0KI2RlZmluZSBQRE1BX0FDRV9TU0VfREFUQUlOICAgICAgICAgMHg0MDAyMDcwMHVMDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBQRE1BX0RFRkFVTFRfV1JJVEVfQURKIGNvbnN0YW50IHByb3ZpZGVzIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlDQogIFBETUFfY29uZmlndXJlKCkgZnVuY3Rpb24gd3JpdGVfYWRqdXN0IHBhcmFtZXRlci4NCiAqLw0KI2RlZmluZSBQRE1BX0RFRkFVTFRfV1JJVEVfQURKICAgICAgMTB1DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBQRE1BX2luaXQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgcGVyaXBoZXJhbCBETUEgaGFyZHdhcmUgYW5kIGRyaXZlcg0KICBpbnRlcm5hbCBkYXRhLiBJdCByZXNldHMgdGhlIFBETUEgYW5kIGl0IGFsc28gY2xlYXJzIGFueSBwZW5kaW5nIFBETUENCiAgaW50ZXJydXB0cyBpbiB0aGUgQ29ydGV4LU0zIGludGVycnVwdCBjb250cm9sbGVyLiBXaGVuIHRoZSBmdW5jdGlvbiBleGl0cywgaXQNCiAgdGFrZXMgdGhlIFBETUEgYmxvY2sgb3V0IG9mIHJlc2V0Lg0KICovDQp2b2lkIFBETUFfaW5pdCggdm9pZCApOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgUERNQV9jb25maWd1cmUoKSBmdW5jdGlvbiBjb25maWd1cmVzIGEgUERNQSBjaGFubmVsLg0KICBJdCBzcGVjaWZpZXM6DQogICAtIFRoZSBwZXJpcGhlcmFsIHdoaWNoIHdpbGwgYmUgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBvZiB0aGUgRE1BIHRyYW5zZmVyLg0KICAgLSBXaGV0aGVyIHRoZSBETUEgY2hhbm5lbCB3aWxsIGJlIGEgaGlnaCBvciBsb3cgcHJpb3JpdHkgY2hhbm5lbA0KICAgLSBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzIGluY3JlbWVudCB0aGF0IHdpbGwgdGFrZSBwbGFjZSBhZnRlcg0KICAgICBlYWNoIHRyYW5zZmVyLg0KIA0KICBAcGFyYW0gY2hhbm5lbF9pZA0KICAgIFRoZSBjaGFubmVsX2lkIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBQRE1BIGNoYW5uZWwgdXNlZCBieSB0aGUgZnVuY3Rpb24uDQogDQogIEBwYXJhbSBzcmNfZGVzdA0KICAgIFRoZSBzcmNfZGVzdCBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb2YgdGhlIERNQQ0KICAgIHRyYW5zZmVycyB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkLiBJdCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6DQogICAgICAgIC0gUERNQV9GUk9NX1VBUlRfMA0KICAgICAgICAtIFBETUFfVE9fVUFSVF8wDQogICAgICAgIC0gUERNQV9GUk9NX1VBUlRfMQ0KICAgICAgICAtIFBETUFfVE9fVUFSVF8xDQogICAgICAgIC0gUERNQV9GUk9NX1NQSV8wDQogICAgICAgIC0gUERNQV9UT19TUElfMA0KICAgICAgICAtIFBETUFfRlJPTV9TUElfMQ0KICAgICAgICAtIFBETUFfVE9fU1BJXzENCiAgICAgICAgLSBQRE1BX0ZST01fRlBHQV8xDQogICAgICAgIC0gUERNQV9UT19GUEdBXzENCiAgICAgICAgLSBQRE1BX0ZST01fRlBHQV8wDQogICAgICAgIC0gUERNQV9UT19GUEdBXzANCiAgICAgICAgLSBQRE1BX1RPX0FDRQ0KICAgICAgICAtIFBETUFfRlJPTV9BQ0UNCiAgICAgICAgLSBQRE1BX01FTV9UT19NRU0NCiANCiAgQHBhcmFtIGNoYW5uZWxfY2ZnDQogICAgVGhlIGNoYW5uZWxfY2ZnIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFBETUEgY2hhbm5lbC4NCiAgICBUaGUgY29uZmlndXJhdGlvbiBpbmNsdWRlczoNCiAgICAgICAgLSBjaGFubmVsIHByaW9yaXR5DQogICAgICAgIC0gdHJhbnNmZXIgc2l6ZQ0KICAgICAgICAtIHNvdXJjZSBhbmQvb3IgZGVzdGluYXRpb24gYWRkcmVzcyBpbmNyZW1lbnQNCiAgICBUaGUgY2hhbm5lbF9jZmcgcGFyYW1ldGVyIHZhbHVlIGlzIGEgbG9naWNhbCBPUiBvZjoNCiAgICAgICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gc3BlY2lmeSB0aGUgY2hhbm5lbCBwcmlvcml0eToNCiAgICAgICAgICAgLSBQRE1BX0xPV19QUklPUklUWQ0KICAgICAgICAgICAtIFBETUFfSElHSF9QUklPUklUWQ0KICAgICAgICBPbmUgb2YgdGhlIGZvbGxvd2luZyB0byBzcGVjaWZ5IHRoZSB0cmFuc2ZlciBzaXplOg0KICAgICAgICAgICAtIFBETUFfQllURV9UUkFOU0ZFUg0KICAgICAgICAgICAtIFBETUFfSEFMRldPUkRfVFJBTlNGRVINCiAgICAgICAgICAgLSBQRE1BX1dPUkRfVFJBTlNGRVINCiAgICAgICAgT25lIG9yIHR3byBvZiB0aGUgZm9sbG93aW5nIHRvIHNwZWNpZnkgdGhlIHNvdXJjZSBhbmQvb3IgZGVzdGluYXRpb24gYWRkcmVzcw0KICAgICAgICBpbmNyZW1lbnQ6DQogICAgICAgICAgIC0gUERNQV9OT19JTkMNCiAgICAgICAgICAgLSBQRE1BX0lOQ19TUkNfT05FX0JZVEUNCiAgICAgICAgICAgLSBQRE1BX0lOQ19TUkNfVFdPX0JZVEVTDQogICAgICAgICAgIC0gUERNQV9JTkNfU1JDX0ZPVVJfQllURVMNCiAgICAgICAgICAgLSBQRE1BX0lOQ19ERVNUX09ORV9CWVRFDQogICAgICAgICAgIC0gUERNQV9JTkNfREVTVF9UV09fQllURVMNCiAgICAgICAgICAgLSBQRE1BX0lOQ19ERVNUX0ZPVVJfQllURVMNCiAgDQogIEBwYXJhbSB3cml0ZV9hZGp1c3QNCiAgICBUaGUgd3JpdGVfYWRqdXN0IHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBDb3J0ZXgtTTMgY2xvY2sgY3ljbGVzDQogICAgdGhlIFBETUEgY29udHJvbGxlciB3aWxsIHdhaXQgYmVmb3JlIGF0dGVtcHRpbmcgYW5vdGhlciB0cmFuc2ZlciBjeWNsZS4gVGhpcw0KICAgIGRlbGF5IGlzIG5lY2Vzc2FyeSB3aGVuIHBlcmlwaGVyYWxzIGFyZSB1c2VkIGFzIGRlc3RpbmF0aW9uIG9mIGEgRE1BIHRyYW5zZmVyDQogICAgdG8gZW5zdXJlIHRoZSBETUEgY29udHJvbGxlciBpbnRlcnByZXRzIHRoZSBzdGF0ZSBvZiB0aGUgcGVyaXBoZXJhbJJzIHJlYWR5DQogICAgc2lnbmFsIG9ubHkgYWZ0ZXIgZGF0YSBoYXMgYWN0dWFsbHkgYmVlbiB3cml0dGVuIHRvIHRoZSBwZXJpcGhlcmFsLiBUaGlzIGRlbGF5DQogICAgYWNjb3VudHMgZm9yIHBvc3RlZCB3cml0ZXMgKGR1bXAgYW5kIHJ1bikgZm9yIHdyaXRlIGFjY2Vzc2VzIHRvIHBlcmlwaGVyYWxzLiANCiAgICBUaGUgZWZmZWN0IG9mIHBvc3RlZCB3cml0ZXMgaXMgdGhhdCBpZiB0aGUgUERNQSBwZXJmb3JtcyBhIHdyaXRlIG9wZXJhdGlvbiB0bw0KICAgIGEgcGVyaXBoZXJhbCwgdGhlIGRhdGEgaXMgbm90IGFjdHVhbGx5IHdyaXR0ZW4gaW50byB0aGUgcGVyaXBoZXJhbCB1bnRpbA0KICAgIHNvbWV0aW1lIGFmdGVyIHRoZSBQRE1BIGNvbnRyb2xsZXIgdGhpbmtzIGl0IGlzIHdyaXR0ZW4uDQogICAgQSBzdWl0YWJsZSB2YWx1ZSBmb3Igd3JpdGVfYWRqdXN0IGRlcGVuZHMgb24gdGhlIHRhcmdldCBvZiB0aGUgRE1BIHRyYW5zZmVyLg0KICAgIEd1aWRlbGluZXMgZm9yIGNob29zaW5nIHRoaXMgdmFsdWUgYXJlIGFzIGZvbGxvd3M6DQogICAgICAgIJUgVGhlIFBETUFfREVGQVVMVF9XUklURV9BREogY29uc3RhbnQgcHJvdmlkZXMgYSBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlDQogICAgICAgICAgZm9yIHRoZSB3cml0ZV9hZGp1c3QgcGFyYW1ldGVyIHdoZW4gdGhlIFBETUEgY2hhbm5lbCBpcyBjb25maWd1cmVkIGZvcg0KICAgICAgICAgIHRyYW5zZmVycyB3aXRoIE1TUyBwZXJpcGhlcmFscy4NCiAgICAgICAglSBUaGUgUERNQV9ERUZBVUxUX1dSSVRFX0FESiBjb25zdGFudCBjYW4gYWxzbyBiZSB1c2VkIGZvciBETUEgdHJhbnNmZXJzDQogICAgICAgICAgd2l0aCBGUEdBIGZhYnJpYyBpbXBsZW1lbnRlZCBwZXJpcGhlcmFscyBtYWtpbmcgdXNlIG9mIHRoZSBETUFSRUFEWTAgb3INCiAgICAgICAgICBETUFSRUFEWTFmYWJyaWMgaW50ZXJmYWNlIHNpZ25hbCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwZXJpcGhlcmFsIGlzDQogICAgICAgICAgcmVhZHkgZm9yIGFub3RoZXIgRE1BIHRyYW5zZmVyLg0KICAgICAgICCVIFRoZSB3cml0ZV9hZGp1c3QgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gemVybyB0byBhY2hpZXZlIG1heGltdW0gdHJhbnNmZXINCiAgICAgICAgICBzcGVlZCBmb3IgZ2VudWluZSBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVycy4gDQogICAgICAgIJUgVGhlIGludGVybmFsIGxhdGVuY3kgb2YgRlBHQSBpbXBsZW1lbnRlZCBwZXJpcGhlcmFscyB3aWxsIGRlY2lkZSB0aGUNCiAgICAgICAgICB3cml0ZV9hZGp1c3QgdmFsdWUgZm9yIGZhYnJpYyBwZXJpcGhlcmFscyB0aGF0IGRvIG5vdCB1c2UgdGhlIERNQVJFQURZMA0KICAgICAgICAgIG9yIERNQVJFQURZMSBmYWJyaWMgaW50ZXJmYWNlIHNpZ25hbHMuIFlvdSBuZWVkIHRvIGNoZWNrIHRoZSBmYWJyaWMNCiAgICAgICAgICBwZXJpcGhlcmFsIGRvY3VtZW50YXRpb24gZm9yIHRoZSB2YWx1ZSB0byB1c2UuDQogICAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICBQRE1BX2NvbmZpZ3VyZQ0KICAgKA0KICAgICAgIFBETUFfQ0hBTk5FTF8wLA0KICAgICAgIFBETUFfVE9fU1BJXzEsDQogICAgICAgUERNQV9MT1dfUFJJT1JJVFkgfCBQRE1BX0JZVEVfVFJBTlNGRVIgfCBQRE1BX0lOQ19TUkNfT05FX0JZVEUsDQogICAgICAgUERNQV9ERUZBVUxUX1dSSVRFX0FESg0KICAgKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBQRE1BX2NvbmZpZ3VyZQ0KKA0KICAgIHBkbWFfY2hhbm5lbF9pZF90IGNoYW5uZWxfaWQsDQogICAgcGRtYV9zcmNfZGVzdF90IHNyY19kZXN0LA0KICAgIHVpbnQzMl90IGNoYW5uZWxfY2ZnLA0KICAgIHVpbnQ4X3Qgd3JpdGVfYWRqdXN0DQopOw0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBQRE1BX3NldF9wcmlvcml0eV9yYXRpbygpIGZ1bmN0aW9uIHNldHMgdGhlIHJhdGlvIG9mIGhpZ2ggcHJpb3JpdHkgdG8gbG93DQogIHByaW9yaXR5IERNQSBhY2Nlc3Mgb3Bwb3J0dW5pdGllcy4gVGhpcyByYXRpbyBpcyB1c2VkIGJ5IHRoZSBQRE1BIGNvbnRyb2xsZXINCiAgYXJiaXRlciB0byBkZWNpZGUgd2hpY2ggUERNQSBjaGFubmVsIHdpbGwgYmUgZ2l2ZW4gdGhlIG9wcG9ydHVuaXR5IHRvIHBlcmZvcm0NCiAgYSB0cmFuc2ZlciB3aGVuIG11bHRpcGxlIFBETUEgY2hhbm5lbHMgYXJlIHJlcXVlc3RpbmcgdG8gdHJhbnNmZXIgZGF0YSBhdCB0aGUNCiAgc2FtZSB0aW1lLiBUaGUgcHJpb3JpdHkgcmF0aW8gc3BlY2lmaWVzIGhvdyBtYW55IERNQSB0cmFuc2ZlciBvcHBvcnR1bml0aWVzDQogIHdpbGwgYmUgZ2l2ZW4gdG8gaGlnaCBwcmlvcml0eSBjaGFubmVscyBiZWZvcmUgYSBETUEgdHJhbnNmZXIgb3Bwb3J0dW5pdHkgaXMNCiAgZ2l2ZW4gdG8gYSBsb3cgcHJpb3JpdHkgY2hhbm5lbCB3aGVuIHRoZXJlIGFyZSBjb250aW51b3VzIHJlcXVlc3RzIGZyb20gaGlnaA0KICBwcmlvcml0eSBjaGFubmVscy4NCiANCiAgQHBhcmFtIHByaW9yaXR5X3JhdGlvDQogICAgVGhlIHByaW9yaXR5X3JhdGlvIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJhdGlvIG9mIERNQSBhY2Nlc3Mgb3Bwb3J0dW5pdGllcw0KICAgIGdpdmVuIHRvIGhpZ2ggcHJpb3JpdHkgY2hhbm5lbHMgdmVyc3VzIGxvdyBwcmlvcml0eSBjaGFubmVscy4NCiAgICBBbGxvd2VkIHZhbHVlcyBmb3IgdGhpcyBwYXJhbWV0ZXIgYXJlOg0KICAgICAgIC0gUERNQV9ST1VORF9ST0JJTg0KICAgICAgIC0gUERNQV9SQVRJT19ISUdIX0xPV18xX1RPXzENCiAgICAgICAtIFBETUFfUkFUSU9fSElHSF9MT1dfM19UT18xDQogICAgICAgLSBQRE1BX1JBVElPX0hJR0hfTE9XXzdfVE9fMQ0KICAgICAgIC0gUERNQV9SQVRJT19ISUdIX0xPV18xNV9UT18xDQogICAgICAgLSBQRE1BX1JBVElPX0hJR0hfTE9XXzMxX1RPXzENCiAgICAgICAtIFBETUFfUkFUSU9fSElHSF9MT1dfNjNfVE9fMQ0KICAgICAgIC0gUERNQV9SQVRJT19ISUdIX0xPV18xMjdfVE9fMQ0KICAgICAgIC0gUERNQV9SQVRJT19ISUdIX0xPV18yNTVfVE9fMQ0KIA0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgUERNQV9zZXRfcHJpb3JpdHlfcmF0aW8oIFBETUFfUk9VTkRfUk9CSU4gKTsNCiAgQGVuZGNvZGUNCiAqLw0Kc3RhdGljIF9fSU5MSU5FIHZvaWQgUERNQV9zZXRfcHJpb3JpdHlfcmF0aW8NCigNCiAgICBwZG1hX3ByaW9yaXR5X3JhdGlvX3QgcHJpb3JpdHlfcmF0aW8NCikNCnsNCiAgICBQRE1BLT5SQVRJT19ISUdIX0xPVyA9ICh1aW50MzJfdClwcmlvcml0eV9yYXRpbzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIFBETUFfc3RhcnQoKSBmdW5jdGlvbiAgaW5pdGlhdGVzIGEgRE1BIHRyYW5zZmVyLiBJdCBzcGVjaWZpZXMgdGhlIHNvdXJjZQ0KICBhbmQgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgdHJhbnNmZXIgYXMgd2VsbCBhcyB0aGUgbnVtYmVyIG9mIHRyYW5zZmVycw0KICB0aGF0IG11c3QgdGFrZSBwbGFjZS4gVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzIGNhbiBiZSB0aGUgYWRkcmVzcw0KICBvZiBwZXJpcGhlcmFsIHJlZ2lzdGVycy4NCiANCiAgQHBhcmFtIGNoYW5uZWxfaWQNCiAgICBUaGUgY2hhbm5lbF9pZCBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgUERNQSBjaGFubmVsIHVzZWQgYnkgdGhlIGZ1bmN0aW9uLg0KIA0KICBAcGFyYW0gc3JjX2FkZHINCiAgICBUaGUgc3JjX2FkZHIgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgYWRkcmVzcyBsb2NhdGlvbiBvZiB0aGUgZGF0YSB0byBiZQ0KICAgIHRyYW5zZmVycmVkLiBZb3UgbXVzdCBlbnN1cmUgdGhhdCB0aGlzIHNvdXJjZSBhZGRyZXNzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUNCiAgICBETUEgc291cmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsIHVzaW5nIHRoZSBQRE1BX2NvbmZpZ3VyZSgpDQogICAgZnVuY3Rpb24uDQogICAgRm9yIERNQSB0cmFuc2ZlcnMgZnJvbSBNU1MgcGVyaXBoZXJhbCB0byBtZW1vcnksIHRoZSBmb2xsb3dpbmcgc3JjX2FkZHINCiAgICBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBhbGxvd2VkOg0KICAgICAgICCVIFBETUFfU1BJMF9SWF9SRUdJU1RFUg0KICAgICAgICCVIFBETUFfU1BJMV9SWF9SRUdJU1RFUg0KICAgICAgICCVIFBETUFfVUFSVDBfUlhfUkVHSVNURVINCiAgICAgICAglSBQRE1BX1VBUlQxX1JYX1JFR0lTVEVSDQogICAgICAgIJUgUERNQV9BQ0VfUFBFX0RBVEFPVVQNCiAgICBGb3IgRE1BIHRyYW5zZmVycyBmcm9tIEZQR0EgZmFicmljIHBlcmlwaGVyYWwgdG8gbWVtb3J5LCB0aGUgZm9sbG93aW5nDQogICAgc3JjX2FkZHIgcGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsb3dlZDoNCiAgICAgICAglSBBbiBhZGRyZXNzIGluIHRoZSBGUEdBIGZhYnJpYyBhZGRyZXNzIHNwYWNlICgweDQwMDUwMDAwLTB4NDAwRkZGRkYpDQogICAgRm9yIERNQSB0cmFuc2ZlcnMgZnJvbSBtZW1vcnkgdG8gTVNTIHBlcmlwaGVyYWwsIG9yIGZyb20gbWVtb3J5IHRvIEZQR0ENCiAgICBmYWJyaWMgcGVyaXBoZXJhbCwgb3IgZnJvbSBtZW1vcnkgdG8gbWVtb3J5LCB0aGUgZm9sbG93aW5nIHNyY19hZGRyDQogICAgcGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsb3dlZDoNCiAgICAgICAglSBBbnkgbWVtb3J5IG1hcHBlZCBhZGRyZXNzLg0KDQogIEBwYXJhbSBkZXN0X2FkZHINCiAgICBUaGUgZGVzdF9hZGRyIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIFBETUENCiAgICB0cmFuc2Zlci4gWW91IG11c3QgZW5zdXJlIHRoYXQgdGhpcyBtYXRjaGVzIHdpdGggdGhlIERNQSBkZXN0aW5hdGlvbg0KICAgIGNvbmZpZ3VyZWQgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLg0KICAgIEZvciBETUEgdHJhbnNmZXJzIGZyb20gbWVtb3J5IHRvIE1TUyBwZXJpcGhlcmFsLCB0aGUgZm9sbG93aW5nIGRlc3RfYWRkciBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBhbGxvd2VkOg0KICAgICAgICCVIFBETUFfU1BJMF9UWF9SRUdJU1RFUg0KICAgICAgICCVIFBETUFfU1BJMV9UWF9SRUdJU1RFUg0KICAgICAgICCVIFBETUFfVUFSVDBfVFhfUkVHSVNURVINCiAgICAgICAglSBQRE1BX1VBUlQxX1RYX1JFR0lTVEVSDQogICAgICAgIJUgUERNQV9BQ0VfU1NFX0RBVEFJTg0KICAgIEZvciBETUEgdHJhbnNmZXJzIGZyb20gbWVtb3J5IHRvIEZQR0EgZmFicmljIHBlcmlwaGVyYWwsIHRoZSBmb2xsb3dpbmcNCiAgICBkZXN0X2FkZHIgcGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsb3dlZDoNCiAgICAgICAglSBBbiBhZGRyZXNzIGluIHRoZSBGUEdBIGZhYnJpYyBhZGRyZXNzIHNwYWNlICgweDQwMDUwMDAwLTB4NDAwRkZGRkYpDQogICAgRm9yIERNQSB0cmFuc2ZlcnMgZnJvbSBNU1MgcGVyaXBoZXJhbCB0byBtZW1vcnksIG9yIGZyb20gRlBHQSBmYWJyaWMNCiAgICBwZXJpcGhlcmFsIHRvIG1lbW9yeSwgb3IgZnJvbSBtZW1vcnkgdG8gbWVtb3J5LCB0aGUgZm9sbG93aW5nIGRlc3RfYWRkcg0KICAgIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGFsbG93ZWQ6DQogICAgICAgIJUgQW55IG1lbW9yeSBtYXBwZWQgYWRkcmVzcy4NCg0KICBAcGFyYW0gdHJhbnNmZXJfY291bnQNCiAgICBUaGUgdHJhbnNmZXJfY291bnQgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRyYW5zZmVycyB0byBiZQ0KICAgIHBlcmZvcm1lZC4gSXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlciBpZiB0aGUgUERNQSBjaGFubmVsIGlzDQogICAgY29uZmlndXJlZCBmb3IgYnl0ZSB0cmFuc2ZlciwgdGhlIG51bWJlciBvZiBoYWxmLXdvcmRzIHRvIHRyYW5zZmVyIGlmIHRoZQ0KICAgIFBETUEgY2hhbm5lbCBpcyBjb25maWd1cmVkIGZvciBoYWxmLXdvcmQgdHJhbnNmZXIsIG9yIHRoZSBudW1iZXIgb2Ygd29yZHMNCiAgICB0byB0cmFuc2ZlciBpZiB0aGUgUERNQSBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgZm9yIHdvcmQgdHJhbnNmZXIuDQogDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgUERNQV9zdGFydA0KICAgICAgKA0KICAgICAgICAgIFBETUFfQ0hBTk5FTF8zLA0KICAgICAgICAgIFBETUFfU1BJMV9SWF9SRUdJU1RFUiwNCiAgICAgICAgICAodWludDMyX3Qpc2xhdmVfcnhfYnVmZmVyLA0KICAgICAgICAgIHNpemVvZihzbGF2ZV9yeF9idWZmZXIpDQogICAgICApOyANCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBQRE1BX3N0YXJ0DQooDQogICAgcGRtYV9jaGFubmVsX2lkX3QgY2hhbm5lbF9pZCwNCiAgICB1aW50MzJfdCBzcmNfYWRkciwNCiAgICB1aW50MzJfdCBkZXN0X2FkZHIsDQogICAgdWludDE2X3QgdHJhbnNmZXJfY291bnQNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBQRE1BX2xvYWRfbmV4dF9idWZmZXIoKSBmdW5jdGlvbiBzZXRzIHRoZSBuZXh0IGJ1ZmZlciB0byBiZSB0cmFuc2ZlcnJlZC4NCiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYSB0cmFuc2ZlciBoYXMgYmVlbiBpbml0aWF0ZWQgdXNpbmcgdGhlDQogIFBETUFfc3RhcnQoKSBmdW5jdGlvbi4gSXRzIHB1cnBvc2UgaXMgdG8ga2VlcCBmZWVkaW5nIGEgUERNQSBjaGFubmVsIHdpdGggZGF0YQ0KICBidWZmZXJzLg0KIA0KICBAcGFyYW0gY2hhbm5lbF9pZA0KICAgIFRoZSBjaGFubmVsX2lkIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBQRE1BIGNoYW5uZWwgdXNlZCBieSB0aGUgZnVuY3Rpb24uDQogDQogIEBwYXJhbSBzcmNfYWRkcg0KICAgIFRoZSBzcmNfYWRkciBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIGxvY2F0aW9uIG9mIHRoZSBkYXRhIHRvIGJlDQogICAgdHJhbnNmZXJyZWQuIFlvdSBtdXN0IGVuc3VyZSB0aGF0IHRoaXMgc291cmNlIGFkZHJlc3MgaXMgY29uc2lzdGVudCB3aXRoIHRoZQ0KICAgIERNQSBzb3VyY2UgY29uZmlndXJlZCBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwgdXNpbmcgdGhlIFBETUFfY29uZmlndXJlKCkNCiAgICBmdW5jdGlvbi4NCiAgICBGb3IgRE1BIHRyYW5zZmVycyBmcm9tIE1TUyBwZXJpcGhlcmFsIHRvIG1lbW9yeSwgdGhlIGZvbGxvd2luZyBzcmNfYWRkciBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBhbGxvd2VkOg0KICAgICAgICCVIFBETUFfU1BJMF9SWF9SRUdJU1RFUg0KICAgICAgICCVIFBETUFfU1BJMV9SWF9SRUdJU1RFUg0KICAgICAgICCVIFBETUFfVUFSVDBfUlhfUkVHSVNURVINCiAgICAgICAglSBQRE1BX1VBUlQxX1JYX1JFR0lTVEVSDQogICAgICAgIJUgUERNQV9BQ0VfUFBFX0RBVEFPVVQNCiAgICBGb3IgRE1BIHRyYW5zZmVycyBmcm9tIEZQR0EgZmFicmljIHBlcmlwaGVyYWwgdG8gbWVtb3J5LCB0aGUgZm9sbG93aW5nIHNyY19hZGRyIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGFsbG93ZWQ6DQogICAgICAgIJUgQW4gYWRkcmVzcyBpbiB0aGUgRlBHQSBmYWJyaWMgYWRkcmVzcyBzcGFjZSAoMHg0MDA1MDAwMC0weDQwMEZGRkZGKQ0KICAgIEZvciBETUEgdHJhbnNmZXJzIGZyb20gbWVtb3J5IHRvIE1TUyBwZXJpcGhlcmFsLCBvciBmcm9tIG1lbW9yeSB0byBGUEdBIGZhYnJpYyBwZXJpcGhlcmFsLCBvciBmcm9tIG1lbW9yeSB0byBtZW1vcnksIHRoZSBmb2xsb3dpbmcgc3JjX2FkZHIgcGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsb3dlZDoNCiAgICAgICAglSBBbnkgbWVtb3J5IG1hcHBlZCBhZGRyZXNzLg0KDQogIEBwYXJhbSBkZXN0X2FkZHINCiAgICBUaGUgZGVzdF9hZGRyIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIFBETUENCiAgICB0cmFuc2Zlci4gWW91IG11c3QgZW5zdXJlIHRoYXQgdGhpcyBtYXRjaGVzIHdpdGggdGhlIERNQSBkZXN0aW5hdGlvbg0KICAgIGNvbmZpZ3VyZWQgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLg0KICAgIEZvciBETUEgdHJhbnNmZXJzIGZyb20gbWVtb3J5IHRvIE1TUyBwZXJpcGhlcmFsLCB0aGUgZm9sbG93aW5nIGRlc3RfYWRkciBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBhbGxvd2VkOg0KICAgICAgICCVIFBETUFfU1BJMF9UWF9SRUdJU1RFUg0KICAgICAgICCVIFBETUFfU1BJMV9UWF9SRUdJU1RFUg0KICAgICAgICCVIFBETUFfVUFSVDBfVFhfUkVHSVNURVINCiAgICAgICAglSBQRE1BX1VBUlQxX1RYX1JFR0lTVEVSDQogICAgICAgIJUgUERNQV9BQ0VfU1NFX0RBVEFJTg0KICAgIEZvciBETUEgdHJhbnNmZXJzIGZyb20gbWVtb3J5IHRvIEZQR0EgZmFicmljIHBlcmlwaGVyYWwsIHRoZSBmb2xsb3dpbmcgZGVzdF9hZGRyIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGFsbG93ZWQ6DQogICAgICAgIJUgQW4gYWRkcmVzcyBpbiB0aGUgRlBHQSBmYWJyaWMgYWRkcmVzcyBzcGFjZSAoMHg0MDA1MDAwMC0weDQwMEZGRkZGKQ0KICAgIEZvciBETUEgdHJhbnNmZXJzIGZyb20gTVNTIHBlcmlwaGVyYWwgdG8gbWVtb3J5LCBvciBmcm9tIEZQR0EgZmFicmljIHBlcmlwaGVyYWwgdG8gbWVtb3J5LCBvciBmcm9tIG1lbW9yeSB0byBtZW1vcnksIHRoZSBmb2xsb3dpbmcgZGVzdF9hZGRyIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGFsbG93ZWQ6DQogICAgICAgIJUgQW55IG1lbW9yeSBtYXBwZWQgYWRkcmVzcy4NCiANCiAgQHBhcmFtIHRyYW5zZmVyX2NvdW50DQogICAgVGhlIHRyYW5zZmVyX2NvdW50IHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0cmFuc2ZlcnMgdG8gYmUNCiAgICBwZXJmb3JtZWQuIEl0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgaWYgdGhlIFBETUEgY2hhbm5lbCBpcw0KICAgIGNvbmZpZ3VyZWQgZm9yIGJ5dGUgdHJhbnNmZXIsIHRoZSBudW1iZXIgb2YgaGFsZi13b3JkcyB0byB0cmFuc2ZlciBpZiB0aGUNCiAgICBQRE1BIGNoYW5uZWwgaXMgY29uZmlndXJlZCBmb3IgaGFsZi13b3JkIHRyYW5zZmVyIG9yIHRoZSBudW1iZXIgb2Ygd29yZHMgdG8NCiAgICB0cmFuc2ZlciBpZiB0aGUgUERNQSBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgZm9yIHdvcmQgdHJhbnNmZXIuDQogICAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogIHZvaWQgd3JpdGVfY21kX2RhdGENCiAgKA0KICAgICAgbXNzX3NwaV9pbnN0YW5jZV90ICogdGhpc19zcGksDQogICAgICBjb25zdCB1aW50OF90ICogY21kX2J1ZmZlciwNCiAgICAgIHVpbnQxNl90IGNtZF9ieXRlX3NpemUsDQogICAgICB1aW50OF90ICogZGF0YV9idWZmZXIsDQogICAgICB1aW50MTZfdCBkYXRhX2J5dGVfc2l6ZQ0KICApDQogIHsNCiAgICAgIHVpbnQzMl90IHRyYW5zZmVyX3NpemU7DQogICAgICANCiAgICAgIHRyYW5zZmVyX3NpemUgPSBjbWRfYnl0ZV9zaXplICsgZGF0YV9ieXRlX3NpemU7DQogIA0KICAgICAgTVNTX1NQSV9kaXNhYmxlKCB0aGlzX3NwaSApOw0KICAgICAgTVNTX1NQSV9zZXRfdHJhbnNmZXJfYnl0ZV9jb3VudCggdGhpc19zcGksIHRyYW5zZmVyX3NpemUgKTsNCiAgDQogICAgICBQRE1BX3N0YXJ0DQogICAgICAgICAgKA0KICAgICAgICAgICAgICBQRE1BX0NIQU5ORUxfMCwNCiAgICAgICAgICAgICAgKHVpbnQzMl90KWNtZF9idWZmZXIsDQogICAgICAgICAgICAgIFBETUFfU1BJMV9UWF9SRUdJU1RFUiwNCiAgICAgICAgICAgICAgY21kX2J5dGVfc2l6ZQ0KICAgICAgICAgICk7DQogICAgICANCiAgICAgIFBETUFfbG9hZF9uZXh0X2J1ZmZlcg0KICAgICAgICAgICgNCiAgICAgICAgICAgICAgUERNQV9DSEFOTkVMXzAsDQogICAgICAgICAgICAgICh1aW50MzJfdClkYXRhX2J1ZmZlciwNCiAgICAgICAgICAgICAgUERNQV9TUEkxX1RYX1JFR0lTVEVSLA0KICAgICAgICAgICAgICBkYXRhX2J5dGVfc2l6ZQ0KICAgICAgICAgICk7DQogICAgICANCiAgICAgIE1TU19TUElfZW5hYmxlKCB0aGlzX3NwaSApOw0KICAgICAgDQogICAgICB3aGlsZSAoICFNU1NfU1BJX3R4X2RvbmUodGhpc19zcGkpICkNCiAgICAgIHsNCiAgICAgICAgICA7DQogICAgICB9DQogIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBQRE1BX2xvYWRfbmV4dF9idWZmZXINCigNCiAgICBwZG1hX2NoYW5uZWxfaWRfdCBjaGFubmVsX2lkLA0KICAgIHVpbnQzMl90IHNyY19hZGRyLA0KICAgIHVpbnQzMl90IGRlc3RfYWRkciwNCiAgICB1aW50MTZfdCB0cmFuc2Zlcl9jb3VudA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIFBETUFfc3RhdHVzKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3RhdHVzIG9mIGEgRE1BIGNoYW5uZWwuDQogIFRoZSByZXR1cm5lZCB2YWx1ZSBpbmRpY2F0ZXMgaWYgdHJhbnNmZXJzIGhhdmUgYmVlbiBjb21wbGV0ZWQgdXNpbmcgYnVmZmVyIEENCiAgb3IgYnVmZmVyIEIgb2YgdGhlIFBETUEgaGFyZHdhcmUgYmxvY2suDQogDQogIEBwYXJhbSBjaGFubmVsX2lkDQogICAgVGhlIGNoYW5uZWxfaWQgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIFBETUEgY2hhbm5lbCB1c2VkIGJ5IHRoZSBmdW5jdGlvbi4NCiANCiAgQHJldHVybg0KICAgIGJpdCAwIG9mIHRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIGJ1ZmZlciBBIGhhcyBiZWVuIHRyYXNuZmVyZWQuIEl0IGlzDQogICAgc2V0IHRvIDEgaWYgdGhlIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQuDQogICAgYml0IDEgb2YgdGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgYnVmZmVyIEIgaGFzIGJlZW4gdHJhbnNmZXJlZC4gSXQgaXMNCiAgICBzZXQgdG8gMSBpZiB0aGUgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZC4NCiAqLw0KdWludDMyX3QgUERNQV9zdGF0dXMNCigNCiAgICBwZG1hX2NoYW5uZWxfaWRfdCAgY2hhbm5lbF9pZA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIFBETUFfcGF1c2UoKSBmdW5jdGlvbiB0ZW1wb3JhcmlseSBwYXVzZXMgYSBQRE1BIHRyYW5zZmVyIHRha2luZyBwbGFjZSBvbg0KICB0aGUgc3BlY2lmaWVkIFBETUEgY2hhbm5lbC4gVGhlIHRyYW5zZmVyIGNhbiBsYXRlciBiZSByZXN1bWVkIGJ5IHVzaW5nIHRoZQ0KICBQRE1BX3Jlc3VtZSgpIGZ1bmN0aW9uLg0KIA0KICBAcGFyYW0gY2hhbm5lbF9pZA0KICAgIFRoZSBjaGFubmVsX2lkIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBQRE1BIGNoYW5uZWwgdXNlZCBieSB0aGUgZnVuY3Rpb24uDQogKi8NCnN0YXRpYyBfX0lOTElORSB2b2lkIFBETUFfcGF1c2UoIHBkbWFfY2hhbm5lbF9pZF90IGNoYW5uZWxfaWQgKQ0Kew0KICAgIFBETUEtPkNIQU5ORUxbY2hhbm5lbF9pZF0uQ1JUTCB8PSBQRE1BX1BBVVNFX01BU0s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBQRE1BX3Jlc3VtZSgpIGZ1bmN0aW9uIHJlc3VtZXMgYSB0cmFuc2ZlciBwcmV2aW91c2x5IHBhdXNlZCB1c2luZyB0aGUNCiAgUERNQV9wYXVzZSgpIGZ1bmN0aW9uLg0KIA0KICBAcGFyYW0gY2hhbm5lbF9pZCAgICBUaGUgY2hhbm5lbF9pZCBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgUERNQSBjaGFubmVsDQogICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIGZ1bmN0aW9uLg0KICovDQpzdGF0aWMgX19JTkxJTkUgdm9pZCBQRE1BX3Jlc3VtZSggcGRtYV9jaGFubmVsX2lkX3QgY2hhbm5lbF9pZCApDQp7DQogICAgUERNQS0+Q0hBTk5FTFtjaGFubmVsX2lkXS5DUlRMICY9IH5QRE1BX1BBVVNFX01BU0s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBQRE1BX2VuYWJsZV9pcnEoKSBlbmFibGVzIHRoZSBQRE1BIGhhcmR3YXJlIHRvIGdlbmVyYXRlIGFuIGludGVycnVwdCB3aGVuDQogIGEgRE1BIHRyYW5zZmVyIGNvbXBsZXRlcyBvbiB0aGUgc3BlY2lmaWVkIFBETUEgY2hhbm5lbC4gVGhpcyBmdW5jdGlvbiBhbHNvDQogIGVuYWJsZXMgdGhlIFBETUEgaW50ZXJydXB0IGluIHRoZSBDb3J0ZXgtTTMgaW50ZXJydXB0IGNvbnRyb2xsZXIuDQogDQogIEBwYXJhbSBjaGFubmVsX2lkDQogICAgVGhlIGNoYW5uZWxfaWQgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIFBETUEgY2hhbm5lbCB1c2VkIGJ5IHRoZSBmdW5jdGlvbi4NCiAqLw0Kdm9pZCBQRE1BX2VuYWJsZV9pcnEoIHBkbWFfY2hhbm5lbF9pZF90IGNoYW5uZWxfaWQgKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIFBETUFfZGlzYWJsZV9pcnEoKSBkaXNhYmxlcyBpbnRlcnJ1cHRzIGZvciBhIHNwZWNpZmljIFBETUEgY2hhbm5lbC4NCiANCiAgQHBhcmFtIGNoYW5uZWxfaWQNCiAgICBUaGUgY2hhbm5lbF9pZCBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgUERNQSBjaGFubmVsIHVzZWQgYnkgdGhlIGZ1bmN0aW9uLg0KICovDQpzdGF0aWMgX19JTkxJTkUgdm9pZCBQRE1BX2Rpc2FibGVfaXJxKCBwZG1hX2NoYW5uZWxfaWRfdCBjaGFubmVsX2lkICkNCnsNCiAgICBQRE1BLT5DSEFOTkVMW2NoYW5uZWxfaWRdLkNSVEwgJj0gflBETUFfSVJRX0VOQUJMRV9NQVNLOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgUERNQV9zZXRfaXJxX2hhbmRsZXIoKSBmdW5jdGlvbiByZWdpc3RlcnMgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvcg0KICBpbnRlcnJ1cHRzIGdlbmVyYXRlZCBvbiB0aGUgY29tcGxldGlvbiBvZiBhIHRyYW5zZmVyIG9uIGEgc3BlY2lmaWMgUERNQQ0KICBjaGFubmVsLiBUaGlzIGZ1bmN0aW9uIGFsc28gZW5hYmxlcyB0aGUgUERNQSBpbnRlcnJ1cHQgYm90aCBpbiB0aGUgUERNQQ0KICBjb250cm9sbGVyIGFuZCBpbiB0aGUgQ29ydGV4LU0zIGludGVycnVwdCBjb250cm9sbGVyLg0KIA0KICBAcGFyYW0gY2hhbm5lbF9pZA0KICAgIFRoZSBjaGFubmVsX2lkIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBQRE1BIGNoYW5uZWwgdXNlZCBieSB0aGUgZnVuY3Rpb24uDQogICAgDQogIEBwYXJhbSBoYW5kbGVyDQogICAgVGhlIGhhbmRsZXIgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuDQogICAgYSB0cmFuc2ZlciBjb21wbGV0ZXMgb24gdGhlIFBETUEgY2hhbm5lbCBpZGVudGlmaWVkIGJ5IGNoYW5uZWxfaWQgYW5kIHRoZQ0KICAgIGludGVycnVwdCBpcyBlbmFibGVkIGZvciB0aGF0IGNoYW5uZWwuDQogICAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogIHZvaWQgc2xhdmVfZG1hX2lycV9oYW5kbGVyKCB2b2lkICkNCiAgew0KICAgICAgaWYgKCBnX3NwaTFfcnhfYnVmZmVyWzJdID09IDB4OTkgKQ0KICAgICAgew0KICAgICAgICAgIFBETUFfbG9hZF9uZXh0X2J1ZmZlcg0KICAgICAgICAgICgNCiAgICAgICAgICAgICAgUERNQV9DSEFOTkVMXzAsDQogICAgICAgICAgICAgICh1aW50MzJfdClnX3NwaTFfdHhfYnVmZmVyX2IsDQogICAgICAgICAgICAgIFBETUFfU1BJMV9UWF9SRUdJU1RFUiwNCiAgICAgICAgICAgICAgc2l6ZW9mKGdfc3BpMV90eF9idWZmZXJfYikNCiAgICAgICAgICApOyAgICAgIA0KICAgICAgfQ0KICAgICAgUERNQV9kaXNhYmxlX2lycSggUERNQV9DSEFOTkVMXzMgKTsNCiAgfQ0KICANCiAgdm9pZCBzZXR1cF9kbWEoIHZvaWQgKQ0KICB7DQogICAgICBQRE1BX2luaXQoKTsNCiAgICAgIFBETUFfY29uZmlndXJlDQogICAgICAoDQogICAgICAgICAgIFBETUFfQ0hBTk5FTF8wLCANCiAgICAgICAgICAgUERNQV9UT19TUElfMSwgDQogICAgICAgICAgIFBETUFfTE9XX1BSSU9SSVRZIHwgUERNQV9CWVRFX1RSQU5TRkVSIHwgUERNQV9JTkNfU1JDX09ORV9CWVRFDQogICAgICApOw0KICAgICAgUERNQV9jb25maWd1cmUNCiAgICAgICggDQogICAgICAgICAgIFBETUFfQ0hBTk5FTF8zLA0KICAgICAgICAgICBQRE1BX0ZST01fU1BJXzEsDQogICAgICAgICAgIFBETUFfSElHSF9QUklPUklUWSB8IFBETUFfQllURV9UUkFOU0ZFUiB8IFBETUFfSU5DX0RFU1RfT05FX0JZVEUNCiAgICAgICk7DQogICAgICBQRE1BX3NldF9pcnFfaGFuZGxlciggUERNQV9DSEFOTkVMXzMsIHNsYXZlX2RtYV9pcnFfaGFuZGxlciApOw0KICAgICAgUERNQV9zdGFydCggUERNQV9DSEFOTkVMXzMsIFBETUFfU1BJMV9SWF9SRUdJU1RFUiwgKHVpbnQzMl90KWdfc3BpMV9yeF9idWZmZXIsIDMgKTsgDQogIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBQRE1BX3NldF9pcnFfaGFuZGxlcg0KKA0KICAgIHBkbWFfY2hhbm5lbF9pZF90IGNoYW5uZWxfaWQsDQogICAgcGRtYV9jaGFubmVsX2lzcl90IGhhbmRsZXINCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBQRE1BX2NsZWFyX2lycSgpIGZ1bmN0aW9uIGNsZWFycyBpbnRlcnJ1cHRzIGZvciBhIHNwZWNpZmljIFBETUEgY2hhbm5lbC4NCiAgVGhpcyBmdW5jdGlvbiBhbHNvIGNsZWFycyB0aGUgUERNQSBpbnRlcnJ1cHQgaW4gdGhlIENvcnRleC1NMyBOVklDLg0KIA0KICBAcGFyYW0gY2hhbm5lbF9pZA0KICAgIFRoZSBjaGFubmVsX2lkIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBQRE1BIGNoYW5uZWwgdXNlZCBieSB0aGUgZnVuY3Rpb24uDQogKi8NCnZvaWQgUERNQV9jbGVhcl9pcnENCigNCiAgICBwZG1hX2NoYW5uZWxfaWRfdCBjaGFubmVsX2lkDQopOw0KDQojaWZkZWYgX19jcGx1c3BsdXMNCn0NCiNlbmRpZg0KDQojZW5kaWYgIC8qIF9fTVNTX1BFUklQSEVSQUxfRE1BX0hfICovDQo=