LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKg0KKiBDb3B5cmlnaHQgMjAxMyBBbHRlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQoqDQoqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCioNCiogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKg0KKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQoqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24NCiogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQoqDQoqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cw0KKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCioNCiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUg0KKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GDQoqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFSRSBESVNDTEFJTUVELiBJTiBOTw0KKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsDQoqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQNCiogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTDQoqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElODQoqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcNCiogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZDQoqIE9GIFNVQ0ggREFNQUdFLg0KKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWZuZGVmIF9fQUxUX1NETU1DX0hfXw0KI2RlZmluZSBfX0FMVF9TRE1NQ19IX18NCg0KI2luY2x1ZGUgImh3bGliLmgiDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KZXh0ZXJuICJDIg0Kew0KI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiENCiAqIFxhZGR0b2dyb3VwIEFMVF9TRE1NQyBTRC9NTUMgQ29udHJvbGxlciBBUEkNCiAqDQogKiBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBBUEkgZm9yIGNvbnRyb2xsaW5nIGFuZCBhY2Nlc3NpbmcgZGV2aWNlcyB0aHJvdWdoIHRoZQ0KICogSFBTIFNEL01NQyBDb250cm9sbGVyLg0KICoNCiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHByb2dyYW1tYXRpYyBhY2Nlc3MgdG8gdGhlIFNEL01NQyBob3N0DQogKiBjb250cm9sbGVyIGZ1bmN0aW9ucyBmb3I6DQogKiAqIGNvbnRyb2wgYW5kIHN0YXR1cw0KICogKiBjYXJkL2RldmljZSBpbnRlcmZhY2UgY29uZmlndXJhdGlvbg0KICogKiBjb21tYW5kIHByb2Nlc3NvciBpbnRlcmZhY2UNCiAqICogaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXINCiAqICogRklGTw0KICoNCiAqIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBBUEkgaXMgdG8gYSBwcm92aWRlIGEgZ2VuZXJhbCBwdXJwb3NlIGZyYW1ld29yaw0KICogdGhhdCBjYW4gYmUgdXNlZCBmb3Igd3JpdGluZyBzb2Z0d2FyZSBkcml2ZXJzIHRoYXQgaW50ZXJhY3Qgd2l0aCBhIHdpZGUgcmFuZ2Ugb2YNCiAqIGNhcmQgYW5kIGRldmljZSB0eXBlcyB0aGF0IG1heSBpbnRlcmZhY2UgdG8gSFBTIHRocm91Z2ggdGhlIFNEL01NQyBob3N0IGNvbnRyb2xsZXIuDQogKiANCiAqIEFsdGhvdWdoIHRoZSBIUFMgU0QvTU1DIENvbnRyb2xsZXIgc3VwcG9ydHMgU0QsIFNESU8sIENFLUFUQSwgYW5kIE1NQyBjYXJkIGFuZA0KICogZGV2aWNlIHR5cGVzLCB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIGJsb2NrIHJlYWQvd3JpdGUgZGF0YSB0cmFuc2ZlcnMgdG8NCiAqIFNEIGFuZCBNTUMgc3RvcmFnZSBkZXZpY2VzLg0KICoNCiAqIFN1cHBvcnRlZDoNCiAqICAqIEludGVncmF0ZWQgRE1BIENvbnRyb2xsZXIgKElETUFDKQ0KICogICogSG9zdCBCdXM6IEFIQiAoMzItYml0KQ0KICogICogU0QvTU1DIGNvbnRyb2xsZXIgbWF5IGJlIHVzZWQgYnkgRlBHQQ0KICoNCiAqIFVuc3VwcG9ydGVkOg0KICogICogRHVhbCBEYXRhIFJhdGUgKEREUikNCiAqICAqIE1vcmUgdGhhbiBvbmUgY2FyZA0KICogICogU0RSMTA0LCBTRFI1MCwgYW5kIEREUjUgdGltaW5nIG1vZGVzDQogKg0KICogQ2xvY2sgU2lnbmFsczoNCiAqICAqIGw0X21wX2NsayAtIEFIQi9BUEIgQ2xvY2ssIEZyZXF1ZW5jeSBSYW5nZTogMC0xMDBNSHosIE11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEvMTAgY2Nsa19pbg0KICogICogc2RtbWNfY2xrIC0gQ2FyZCBpbnB1dCBjbG9jay4gQm90aCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgZWRnZXMgYXJlIHVzZWQsIEZyZXF1ZW5jeSBSYW5nZTogMC0yMDBNSHoNCiAqICAqIHNkbW1jX2NjbGtfb3V0IC0gQ2FyZCBDbG9jay4gT3V0cHV0IGZyb20gaW50ZXJuYWwgY2xvY2sgZGl2aWRlcnMuDQogKiAgKiBzZG1tY19mYl9jbGtfaW4gLSBGZWVkYmFjayB2ZXJzaW9uIG9mIGNjbGtfb3V0IHRvIGNvbXBlbnNhdGUgZm9yIGV4dGVybmFsIGRlbGF5cywgRnJlcXVlbmN5IFJhbmdlOiAwLTUwTUh6DQogKg0KICogSW50ZXJmYWNlIFNpZ25hbHM6DQogKiBTRC9NTUMgQ29udHJvbGxlciBJbnRlcmZhY2UgSS9PIFBpbnMNCiAqIFNpZ25hbCAgICAgICAgV2lkdGggICAgRGlyZWN0aW9uICAgICBEZXNjcmlwdGlvbg0KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogc2RtbWNfY2Nsa19vdXQgIDEgICAgICBPdXQgICAgICAgICAgIENsb2NrIGZyb20gY29udHJvbGxlciB0byB0aGUgY2FyZA0KICogc2RtbWNfY21kICAgICAgIDEgICAgICBJbi9PdXQgICAgICAgIENhcmQgY29tbWFuZA0KICogc2RtbWNfcHdyZW4gICAgIDEgICAgICBPdXQgICAgICAgICAgIEV4dGVybmFsIGRldmljZSBwb3dlciBlbmFibGUNCiAqIHNkbW1jX2RhdGEgICAgICA4ICAgICAgSW4vT3V0ICAgICAgICBDYXJkIGRhdGENCiAqDQogKiBJbnRlcnJ1cHRzOg0KICogICogVGhyZWUgKDMpIGludGVycnVwdCBvdXRwdXRzOg0KICogICAgLSBzZG1tY19pbnQNCiAqICAgICAgKyBTRElPIGNhcmQgaW50ZXJydXB0cw0KICogICAgICArIEVuZCBiaXQgZXJyb3IocmVhZCkvbm8gQ1JDKHdyaXRlKQ0KICogICAgICArIEF1dG8gY29tbWFuZCBkb25lDQogKiAgICAgICsgU3RhcnQgYml0IGVycm9yDQogKiAgICAgICsgSGFyZHdhcmUgbG9ja2VkIHdyaXRlIGVycm9yDQogKiAgICAgICsgRklGTyB1bmRlcnJ1bi9vdmVycnVuIGVycm9yDQogKiAgICAgICsgRGF0YSBzdGFydmF0aW9uIGJ5IGhvc3QgdGltZW91dA0KICogICAgICArIERhdGEgcmVhZCB0aW1lb3V0L2Jvb3QgZGF0YSBzdGFydA0KICogICAgICArIFJlc3BvbnNlIFRpbWVvdXQvQm9vdCBhY2sgcmVjZWl2ZWQNCiAqICAgICAgKyBEYXRhIENSQyBlcnJvcg0KICogICAgICArIFJlc3BvbnNlIENSQyBlcnJvcg0KICogICAgICArIFJlY2VpdmUgRklGTyBkYXRhIHJlcXVlc3QNCiAqICAgICAgKyBUcmFuc21pdCBGSUZPIGRhdGEgcmVxdWVzdA0KICogICAgICArIERhdGEgdHJhbnNmZXIgb3Zlcg0KICogICAgICArIENvbW1hbmQgZG9uZQ0KICogICAgICArIFJlc3BvbnNlIGVycm9yDQogKiAgICAtIHNkbW1jX3NiZXJyLCBzaW5nbGUgYml0IEVDQyBlcnJvcg0KICogICAgLSBzZG1tY19kYmVyciwgZG91YmxlIGJpdCBFQ0MgZXJyb3INCiAqDQogKiBSZWZlcmVuY2VzOg0KICogICogQWx0ZXJhLCBDeWNsb25lIFYgRGV2aWNlIEhhbmRib29rIFZvbHVtZSAzOiBIYXJkIFByb2Nlc3NvciBTeXN0ZW0NCiAqICAgIFRlY2huaWNhbCBSZWZlcmVuY2UgTWFudWFsLCBTRC9NTUMgQ29udHJvbGxlci4NCiAqICAqIFN5bm9wc3lzLCBEZXNpZ25XYXJlIENvcmVzIE1vYmlsZSBTdG9yYWdlIEhvc3QgRGF0YWJvb2ssIERXQ19tb2JpbGVfc3RvcmFnZQ0KICoNCiAqIE5vdGVzOg0KICogICogVG8gYXZvaWQgZ2xpdGNoZXMgaW4gdGhlIGNhcmQgY2xvY2sgb3V0cHV0cyAoY2Nsa19vdXQpLCB0aGUgc29mdHdhcmUgc2hvdWxkDQogKiAgICB1c2UgdGhlIHN0ZXBzIG91dGxpbmVkIGluIHNlY3Rpb24gNy40IFBoYXNlIFN3aXRjaGluZyBvZiB0aGUgZGF0YWJvb2sgd2hlbg0KICogICAgY2hhbmdpbmcgdGhlIGNhcmQgY2xvY2sgZnJlcXVlbmN5Lg0KICogICAgDQogKiAgKiBJbiBvcmRlciB0byB1dGlsaXplIEVDQywgZm9sbG93IHRoZSBlbWJlZGRlZCBSQU0gaW5pdGlhbGl6YXRpb24gcHJvY2VkdXJlIGluDQogKiAgICBzZWN0aW9uIDggRW5hYmxpbmcgRUNDIG9mIHRoZSBkYXRhIGJvb2suDQogKg0KICogICogVGhlIFNEL01NQyBjb250cm9sbGVyIGRvZXMgbm90IGRpcmVjdGx5IHN1cHBvcnQgdm9sdGFnZSBzd2l0Y2hpbmcsIGNhcmQNCiAqICAgIGludGVycnVwdHMsIG9yIGJhY2stZW5kIHBvd2VyIGNvbnRyb2wgb2YgZVNESU8gY2FyZCBkZXZpY2VzLiBIb3dldmVyLCB5b3UgY2FuDQogKiAgICBjb25uZWN0IHRoZXNlIHNpZ25hbHMgdG8gZ2VuZXJhbC1wdXJwb3NlIEkvT3MgKEdQSU9zKS4NCiAqDQogKiAgKiBUaGUgU0QvTU1DIGNvbnRyb2xsZXIgZG9lcyBub3QgY29udGFpbiBhIHJlc2V0IG91dHB1dCBhcyBwYXJ0IG9mIHRoZSBleHRlcm5hbA0KICogICAgY2FyZCBpbnRlcmZhY2UuIFRvIHJlc2V0IHRoZSBmbGFzaCBjYXJkIGRldmljZSwgY29uc2lkZXIgdXNpbmcgYSBnZW5lcmFsDQogKiAgICBwdXJwb3NlIG91dHB1dCBwaW4uDQogKg0KICogRmVhdHVyZXM6DQogKiAgKiBCbG9jayBSZWFkL1dyaXRlIHN1cHBvcnQNCiAqICAgIC0gSW50ZXJuYWwgRE1BIHVzZWQgZm9yIGVmZmljaWVuY3kNCiAqICAqIENvbW1hbmQgRW5naW5lIEludGVyZmFjZSANCiAqICAqIEludGVybmFsIERNQSBJbnRlcmZhY2UNCiAqICAqIENvbmZpZ3VyYXRpb24gYW5kIFN0YXR1cyBJbnRlcmZhY2UNCiAqICAqIEludGVycnVwdCBTdGF0dXMgYW5kIENvbnRyb2wgSW50ZXJmYWNlDQogKiBAew0KICovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiEgXGFkZHRvZ3JvdXAgQUxUX1NETU1DX0NTUiBHZW5lcmFsIENvbnRyb2wgYW5kIFN0YXR1cyBGdW5jdGlvbnMNCiAqDQogKiBUaGUgZGVjbGFyYXRpb25zIGFuZCBmdW5jdGlvbnMgaW4gdGhpcyBncm91cCBwcm92aWRlIGdlbmVyYWwgcHVycG9zZSBjb250cm9sDQogKiBhbmQgc3RhdHVzIGZ1bmN0aW9ucyBmb3IgdGhlIFNEL01NQyBDb250cm9sbGVyLg0KICogQHsNCiAqLw0KDQovKiENCiAqIFRoaXMgdHlwZSBlbnVtZXJhdGVzIHRoZSBwb3NzaWJsZSBjYXJkL2RldmljZSB0eXBlIHRoYXQgbWF5IGJlIGNvbm5lY3RlZCB0byB0aGUNCiAqIFNEL01NQyBjb250cm9sbGVyLg0KICovDQp0eXBlZGVmIGVudW0gQUxUX1NETU1DX0NBUkRfVFlQRV9lDQp7DQogICAgQUxUX1NETU1DX0NBUkRfVFlQRV9OT1RERVRFQ1QgID0gMCwgLyohPCBDYXJ0IHR5cGUgaGFzIG5vdCBpZGVudGlmaWVkIHlldCAqLw0KICAgIEFMVF9TRE1NQ19DQVJEX1RZUEVfTU1DICAgICAgICA9IDEsIC8qITwgTXVsdGlNZWRpYSBDYXJkICovDQogICAgQUxUX1NETU1DX0NBUkRfVFlQRV9TRCAgICAgICAgID0gMiwgLyohPCBTZWN1cmUgRGlnaXRhbCBNZW1vcnkgQ2FyZCAqLw0KICAgIEFMVF9TRE1NQ19DQVJEX1RZUEVfU0RJT0lPICAgICA9IDMsIC8qITwgU2VjdXJlIERpZ2l0YWwgSW5wdXQgT3V0cHV0ICovDQogICAgQUxUX1NETU1DX0NBUkRfVFlQRV9TRElPQ09NQk8gID0gNCwgLyohPCBTZWN1cmUgRGlnaXRhbCBJbnB1dCBPdXRwdXQgQ29tYm8gKi8NCiAgICBBTFRfU0RNTUNfQ0FSRF9UWVBFX1NESEMgICAgICAgPSA1LCAvKiE8IFNlY3VyZSBEaWdpdGFsIEhpZ2ggQ2FwYWNpdHkgKi8NCiAgICBBTFRfU0RNTUNfQ0FSRF9UWVBFX0NFQVRBICAgICAgPSA2LCAvKiE8IFNlcmlhbCBBVEEgaW50ZXJmYWNlIGJhc2VkIG9uIHRoZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIE11bHRpTWVkaWFDYXJkIHN0YW5kYXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQp9IEFMVF9TRE1NQ19DQVJEX1RZUEVfdDsNCg0KLyohDQogKiBUaGlzIHR5cGUgZGVmaW5lcyBhIHN0cnVjdHVyZSB0byBob2xkIGlkZW50aWZpY2F0aW9uIGFuZCB0eXBlIGluZm9ybWF0aW9uIGZvciBhDQogKiBjYXJkIGNvbm5lY3RlZCB0byB0aGUgU0QvTU1DIGNvbnRyb2xsZXIuDQogKg0KICogXGludGVybmFsDQogKiBTZWU6IENhcmRfaW5mbyBkZWNsYXJhdGlvbiBpbiBzeW5vcG1vYl9idXMuaA0KICogXGVuZGludGVybmFsDQogKi8NCnR5cGVkZWYgc3RydWN0IEFMVF9TRE1NQ19DQVJEX0lORk9fcw0Kew0KICAgIEFMVF9TRE1NQ19DQVJEX1RZUEVfdCAgIGNhcmRfdHlwZTsgICAgICAgICAgLyohPCBUeXBlIG9mIHRoZSBjYXJkICovDQogICAgdWludDMyX3QgICAgICAgICAgICAgICAgcmNhOyAgICAgICAgICAgICAgICAvKiE8IFJlbGVhdGl2ZSBDYXJkIEFkZHJlc3MgKFJDQSkgKi8NCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICB4ZmVyX3NwZWVkOyAgICAgICAgIC8qITwgVGhlIG1heGltdW0gZGF0YSB0cmFuc2ZlciByYXRlIChiaXQvcykgKi8NCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtYXhfcl9ibGtsbjsgICAgICAgIC8qITwgTWF4IHJlYWQgZGF0YSBibG9jayBsZW5ndGggKi8NCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtYXhfd19ibGtsbjsgICAgICAgIC8qITwgTWF4IHdyaXRlIGRhdGEgYmxvY2sgbGVuZ3RoICovDQogICAgYm9vbCAgICAgICAgICAgICAgICAgICAgcGFydGlhbF9yX2FsbG93ZWQ7ICAvKiE8IFBhcnRpYWwgYmxvY2tzIGZvciByZWFkIGFsbG93ZWQgKi8NCiAgICBib29sICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsX3dfYWxsb3dlZDsgIC8qITwgUGFydGlhbCBibG9ja3MgZm9yIHdyaXRlIGFsbG93ZWQgKi8NCn0gQUxUX1NETU1DX0NBUkRfSU5GT190Ow0KDQovKiENCiAqIEluaXRpYWxpemUgdGhlIFNEL01NQyBjb250cm9sbGVyLg0KICogDQogKiBJbml0aWFsaXplcyB0aGUgU0QvTU1DIGNvbnRyb2xsZXIgYnkgZ3JhY2VmdWxseSBicmluZ2luZyB0aGUgY29udHJvbGxlciBvdXQgb2YNCiAqIHJlc2V0LiBUaGlzIGZ1bmN0aW9uIGFsc28gaW5pdGlhbGl6ZXMgdGhlIHJlZ2lzdGVycywgRklGTyBidWZmZXIgcG9pbnRlcnMsIERNQQ0KICogaW50ZXJmYWNlIGNvbnRyb2xzLCBhbmQgc3RhdGUgbWFjaGluZXMgaW4gdGhlIGNvbnRyb2xsZXIuIEFsbCBpbnRlcnJ1cHRzIGFyZQ0KICogY2xlYXJlZCBhbmQgZGlzYWJsZWQgKG1hc2tlZCkgYW5kIHRpbWVvdXQgcGFyYW1ldGVycyBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBUaGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBUaGUgb3BlcmF0aW9uIGZhaWxlZC4NCiAqLw0KQUxUX1NUQVRVU19DT0RFIGFsdF9zZG1tY19pbml0KHZvaWQpOw0KDQovKiENCiAqIFVuaW5pdGlhbGl6ZXMgdGhlIFNEL01NQyBjb250cm9sbGVyIGJ5IHN0b3BwaW5nIGFueSBkYXRhIHRyYW5zZmVycyBpbiBwcm9ncmVzcyBhbmQNCiAqIHB1dHRpbmcgdGhlIGNvbnRyb2xsZXIgaW50byByZXNldC4NCiAqDQogKiBccmV0dmFsICAgICAgQUxUX0VfU1VDQ0VTUyAgIFRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuDQogKiBccmV0dmFsICAgICAgQUxUX0VfRVJST1IgICAgIFRoZSBvcGVyYXRpb24gZmFpbGVkLg0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX3VuaW5pdCh2b2lkKTsNCg0KLyohDQogKiBSZXNldCB0aGUgU0QvTU1DIGNvbnRyb2xsZXIgYnkgc3RvcHBpbmcgYW55IGRhdGEgdHJhbnNmZXJzIGluIHByb2dyZXNzIGFuZA0KICogcHV0dGluZyB0aGUgY29udHJvbGxlciBpbnRvIHJlc2V0IGFuZCByZWluaXQgaXQgYWZ0ZXIgcmVzZXQgY29tcGxldGUuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBUaGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBUaGUgb3BlcmF0aW9uIGZhaWxlZC4NCiAqLw0KQUxUX1NUQVRVU19DT0RFIGFsdF9zZG1tY19yZXNldCh2b2lkKTsNCg0KLyohDQogKiBUaGlzIHR5cGUgZW51bWVyYXRlcyB0aGUgU0RNTUMgZXZhaWxhYmxlIGNvbW1hbmRzLiBSZWFkIHNwZWNpZmljYXRpb24gDQogKiB0byB0aGUgYXBwcm9wcmlhdGUgY2FyZCB0eXBlDQogKi8NCnR5cGVkZWYgZW51bSBBTFRfU0RNTUNfQ01EX0lOREVYX2UNCnsNCiAgICAvKiBUQkQgLSBTdGFuZGFydCBzZG1tYyBjb21tYW5kcy4uLiAqLw0KICAgIEFMVF9TRE1NQ19HT19JRExFX1NUQVRFICAgICAgICAgID0gMCwNCiAgICBBTFRfU0RNTUNfQUxMX1NFTkRfQ0lEICAgICAgICAgICA9IDIsDQogICAgQUxUX1NETU1DX1NFVF9SRUxBVElWRV9BRERSICAgICAgPSAzLA0KICAgIEFMVF9TRE1NQ19TRVRfRFNSICAgICAgICAgICAgICAgID0gNCwNCiAgICBBTFRfU0RNTUNfU0VORF9PUF9DT05EICAgICAgICAgICA9IDUsDQogICAgQUxUX1NETU1DX1NXSVRDSCAgICAgICAgICAgICAgICAgPSA2LA0KICAgIEFMVF9TRE1NQ19TRUxfREVTX0NBUkQgICAgICAgICAgID0gNywNCiAgICBBTFRfU0RNTUNfSUZfQ09ORCAgICAgICAgICAgICAgICA9IDgsDQogICAgQUxUX1NETU1DX1NFTkRfRVhUX0NTRCAgICAgICAgICAgPSA4LA0KICAgIEFMVF9TRE1NQ19TRU5EX0NTRCAgICAgICAgICAgICAgID0gOSwNCiAgICBBTFRfU0RNTUNfU0VORF9DSUQgICAgICAgICAgICAgICA9IDEwLA0KICAgIEFMVF9TRE1NQ19SRUFEX0RBVF9VTlRJTF9TVE9QICAgID0gMTEsDQogICAgQUxUX1NETU1DX1NUT1BfVFJBTlNNSVNTSU9OICAgICAgPSAxMiwNCiAgICBBTFRfU0RNTUNfU0VORF9TVEFUVVMgICAgICAgICAgICA9IDEzLA0KICAgIEFMVF9TRE1NQ19HT19JTkFDVElWRV9TVEFURSAgICAgID0gMTUsDQogICAgQUxUX1NETU1DX1NFVF9CTE9DS0xFTiAgICAgICAgICAgPSAxNiwNCiAgICBBTFRfU0RNTUNfUkVBRF9TSU5HTEVfQkxPQ0sgICAgICA9IDE3LA0KICAgIEFMVF9TRE1NQ19SRUFEX01VTFRJUExFX0JMT0NLICAgID0gMTgsDQogICAgQUxUX1NETU1DX1dSSVRFX0RBVF9VTlRJTF9TVE9QICAgPSAyMCwNCiAgICBBTFRfU0RNTUNfV1JJVEVfQkxPQ0sgICAgICAgICAgICA9IDI0LA0KICAgIEFMVF9TRE1NQ19XUklURV9NVUxUSVBMRV9CTE9DSyAgID0gMjUsDQogICAgQUxUX1NETU1DX1BST0dSQU1fQ0lEICAgICAgICAgICAgPSAyNiwNCiAgICBBTFRfU0RNTUNfUFJPR1JBTV9DU0QgICAgICAgICAgICA9IDI3LA0KICAgIEFMVF9TRE1NQ19TRVRfV1JJVEVfUFJPVCAgICAgICAgID0gMjgsDQogICAgQUxUX1NETU1DX0NMUl9XUklURV9QUk9UICAgICAgICAgPSAyOSwNCiAgICBBTFRfU0RNTUNfU0VORF9XUklURV9QUk9UICAgICAgICA9IDMwLA0KICAgIEFMVF9TRE1NQ19UQUdfU0VDVE9SX1NUQVJUICAgICAgID0gMzIsDQogICAgQUxUX1NETU1DX1RBR19TRUNUT1JfRU5EICAgICAgICAgPSAzMywNCiAgICBBTFRfU0RNTUNfVU5UQUdfU0VDVE9SICAgICAgICAgICA9IDM0LA0KICAgIEFMVF9TRE1NQ19UQUdfRVJBU0VfR1JPVVBfU1RBUlQgID0gMzUsDQogICAgQUxUX1NETU1DX1RBR19FUkFTRV9HUk9VUF9FTkQgICAgPSAzNiwNCiAgICBBTFRfU0RNTUNfVU5UQUdfRVJBU0VfR1JPVVAgICAgICA9IDM3LA0KICAgIEFMVF9TRE1NQ19FUkFTRSAgICAgICAgICAgICAgICAgID0gMzgsDQogICAgQUxUX1NETU1DX0ZBU1RfSU8gICAgICAgICAgICAgICAgPSAzOSwNCiAgICBBTFRfU0RNTUNfR09fSVJRX1NUQVRFICAgICAgICAgICA9IDQwLA0KICAgIEFMVF9TRE1NQ19MT0NLX1VOTE9DSyAgICAgICAgICAgID0gNDIsDQogICAgQUxUX1NETU1DX0FQUF9DTUQgICAgICAgICAgICAgICAgPSA1NSwNCiAgICBBTFRfU0RNTUNfR0VOX0NNRCAgICAgICAgICAgICAgICA9IDU2LA0KICAgIEFMVF9TRE1NQ19SRUFEX09DUiAgICAgICAgICAgICAgID0gNTgsDQogICAgQUxUX1NETU1DX0NSQ19PTl9PRkYgICAgICAgICAgICAgPSA1OSwNCiAgICANCiAgICBBTFRfU0RNTUNfU1RBTkRBUlRfQ01EX0FMTCAgICAgICA9IDYwLA0KICAgIA0KICAgIC8qIFRCRCAtIENvbW1hbmRzIHNwZWNpZmljIGZvciBjYXJkIHR5cGUuICovDQogICAgQUxUX1NEX1NFVF9CVVNfV0lEVEggICAgICAgICAgICAgPSA2LA0KICAgIEFMVF9TRF9TRU5EX09QX0NPTkQgICAgICAgICAgICAgID0gNDEsDQogICAgQUxUX1NEX1NFTkRfU0NSICAgICAgICAgICAgICAgICAgPSA1MSwNCg0KICAgIC8qIFRCRCAtIENsb2NrIGNvbW1hbmQgb3IgY29tbWFuZCBpbmRleCBkb2VzIG5vdCBtYXR0ZXIuLi4gKi8NCiAgICBBTFRfU0RNTUNfQ0xLX0lOREVYICAgICAgICAgICAgICA9IC0xLA0KDQogICAgQUxUX1NETU1DX0NNRF9BTEwgICAgICAgICAgICAgICAgPSBBTFRfU0RNTUNfU1RBTkRBUlRfQ01EX0FMTCArIDENCn0gQUxUX1NETU1DX0NNRF9JTkRFWF90Ow0KDQovKiENCiAqIFRoaXMgdHlwZSBkZWZpbmVzIGEgc3RydWN0dXJlIGZvciBjb21tYW5kIHdpdGggb3B0aW9ucy4NCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgQUxUX1NETU1DX0NNRF9DT05GSUdfcyANCnsNCiAgICB1aW50MzJfdCAgICBjbWRfaW5kZXggICAgICAgICAgICAgICAgICAgICAgIDogNjsgLy8wLTUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21tYW5kIGluZGV4ICovDQogICAgdWludDMyX3QgICAgcmVzcG9uc2VfZXhwZWN0ICAgICAgICAgICAgICAgICA6IDE7IC8vNg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlc3BvbnNlIGV4cGVjdGVkIGZyb20gY2FyZCAqLw0KICAgIHVpbnQzMl90ICAgIHJlc3BvbnNlX2xlbmd0aF9sb25nICAgICAgICAgICAgOiAxOyAvLzcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMb25nIHJlc3BvbnNlIGV4cGVjdGVkIGZyb20gY2FyZCAqLw0KICAgIHVpbnQzMl90ICAgIGNoZWNrX3Jlc3BvbnNlX2NyYyAgICAgICAgICAgICAgOiAxOyAvLzgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGVjayByZXNwb25zZSBDUkMgKi8NCiAgICB1aW50MzJfdCAgICBkYXRhX2V4cGVjdGVkICAgICAgICAgICAgICAgICAgIDogMTsgLy85DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSB0cmFuc2ZlciBleHBlY3RlZCAocmVhZC93cml0ZSkgKi8NCiAgICB1aW50MzJfdCAgICB3cml0ZV9hY3RpdmUgICAgICAgICAgICAgICAgICAgIDogMTsgLy8xMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDAgliBSZWFkIGZyb20gY2FyZCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAxIJYgV3JpdGUgdG8gY2FyZCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgdWludDMyX3QgICAgc3RyZWFtX21vZGVfYWN0aXZlICAgICAgICAgICAgICA6IDE7IC8vMTENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTdHJlYW0gZGF0YSB0cmFuc2ZlciBjb21tYW5kICovDQogICAgdWludDMyX3QgICAgc2VuZF9hdXRvX3N0b3AgICAgICAgICAgICAgICAgICA6IDE7IC8vMTINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTZW5kIHN0b3AgY29tbWFuZCBhdCBlbmQgb2YgZGF0YSB0cmFuc2ZlciAqLw0KICAgIHVpbnQzMl90ICAgIHdhaXRfcHJ2ZGF0YV9jb21wbGV0ZSAgICAgICAgICAgOiAxOyAvLzEzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2FpdCBmb3IgcHJldmlvdXMgZGF0YSB0cmFuc2ZlciBjb21wbGV0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYmVmb3JlIHNlbmRpbmcgY29tbWFuZCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgdWludDMyX3QgICAgc3RvcF9hYm9ydF9jbWQgICAgICAgICAgICAgICAgICA6IDE7IC8vMTQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIG9yIGFib3J0IGNvbW1hbmQgaW50ZW5kZWQgdG8gc3RvcA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGN1cnJlbnQgZGF0YSB0cmFuc2ZlciBpbiBwcm9ncmVzcy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgdWludDMyX3QgICAgc2VuZF9pbml0aWFsaXphdGlvbiAgICAgICAgICAgICA6IDE7IC8vMTUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTZW5kIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGJlZm9yZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzZW5kaW5nIHRoaXMgY29tbWFuZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICB1aW50MzJfdCAgICBjYXJkX251bWJlciAgICAgICAgICAgICAgICAgICAgIDogNTsgLy8xNi0yMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcmQgbnVtYmVyIGluIHVzZS4gUmVwcmVzZW50cyBwaHlzaWNhbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHNsb3QgbnVtYmVyIG9mIGNhcmQgYmVpbmcgYWNjZXNzZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgIHVpbnQzMl90ICAgIHVwZGF0ZV9jbG9ja19yZWdpc3RlcnNfb25seSAgICAgOiAxOyAvLzIxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRG8gbm90IHNlbmQgY29tbWFuZHMsIGp1c3QgdXBkYXRlIGNsb2NrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcmVnaXN0ZXIgdmFsdWUgaW50byBjYXJkIGNsb2NrIGRvbWFpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICB1aW50MzJfdCAgICByZWFkX2NlYXRhX2RldmljZSAgICAgICAgICAgICAgIDogMTsgLy8yMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhvc3QgaXMgcGVyZm9ybWluZyByZWFkIGFjY2VzcyAoUldfUkVHIG9yIFJXX0JMSykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0b3dhcmRzIENFLUFUQSBkZXZpY2UgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgIHVpbnQzMl90ICAgIGNjc19leHBlY3RlZCAgICAgICAgICAgICAgICAgICAgOiAxOyAvLzIzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW50ZXJydXB0cyBhcmUgZW5hYmxlZCBpbiBDRS1BVEEgZGV2aWNlIChuSUVOID0gMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYW5kIFJXX0JMSyBjb21tYW5kIGV4cGVjdHMgY29tbWFuZCBjb21wbGV0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc2lnbmFsIGZyb20gQ0UtQVRBIGRldmljZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgdWludDMyX3QgICAgZW5hYmxlX2Jvb3QgICAgICAgICAgICAgICAgICAgICA6IDE7IC8vMjQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgQm9vdJd0aGlzIGJpdCBzaG91bGQgYmUgc2V0IG9ubHkgZm9yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgbWFuZGF0b3J5IGJvb3QgbW9kZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgdWludDMyX3QgICAgZXhwZWN0X2Jvb3RfYWNrICAgICAgICAgICAgICAgICA6IDE7IC8vMjUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFeHBlY3QgQm9vdCBBY2tub3dsZWRnZS4gV2hlbiBTb2Z0d2FyZSBzZXRzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhpcyBiaXQgYWxvbmcgd2l0aCBlbmFibGVfYm9vdCwgQ0lVIGV4cGVjdHMgYSBib290DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYWNrbm93bGVkZ2Ugc3RhcnQgcGF0dGVybiBvZiAwLTEtMCBmcm9tIHRoZSBzZWxlY3RlZCBjYXJkIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICB1aW50MzJfdCAgICBkaXNhYmxlX2Jvb3QgICAgICAgICAgICAgICAgICAgIDogMTsgLy8yNg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpc2FibGUgQm9vdC4gKi8NCiAgICB1aW50MzJfdCAgICBib290X21vZGUgICAgICAgICAgICAgICAgICAgICAgIDogMTsgLy8yNw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJvb3QgTW9kZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAwIC0gTWFuZGF0b3J5IEJvb3Qgb3BlcmF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgMSAtIEFsdGVybmF0ZSBCb290IG9wZXJhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICB1aW50MzJfdCAgICB2b2x0X3N3aXRjaCAgICAgICAgICAgICAgICAgICAgIDogMTsgLy8yOA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFZvbHRhZ2Ugc3dpdGNoaW5nIGVuYWJsZWQ7IG11c3QgYmUgc2V0IGZvciBDTUQxMSBvbmx5ICovDQogICAgdWludDMyX3QgICAgdXNlX2hvbGRfcmVnICAgICAgICAgICAgICAgICAgICA6IDE7IC8vMjkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDTUQgYW5kIERBVEEgc2VudCB0byBjYXJkIHRocm91Z2ggdGhlIEhPTEQgUmVnaXN0ZXIgKi8NCiAgICB1aW50MzJfdCAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgIDogMTsgLy8zMA0KICAgIHVpbnQzMl90ICAgIHN0YXJ0X2JpdCAgICAgICAgICAgICAgICAgICAgICAgOiAxOyAvLzMxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgY29tbWFuZC4gT25jZSBjb21tYW5kIGlzIHRha2VuIGJ5IENJVSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYml0IGlzIGNsZWFyZWQuIFdoZW4gYml0IGlzIHNldCwgaG9zdCBzaG91bGQgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgbm90IGF0dGVtcHQgdG8gd3JpdGUgdG8gYW55IGNvbW1hbmQgcmVnaXN0ZXJzLiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBJZiB3cml0ZSBpcyBhdHRlbXB0ZWQsIGhhcmR3YXJlIGxvY2sgZXJyb3IgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaXMgc2V0IGluIHJhdyBpbnRlcnJ1cHQgcmVnaXN0ZXIuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KfSBBTFRfU0RNTUNfQ01EX0NPTkZJR190Ow0KDQovKiENCiAqIFNlbmQgdGhlIGEgY29tbWFuZCBhbmQgY29tbWFuZCBhcmd1bWVudCB0byB0aGUgY2FyZCBhbmQgb3B0aW9uYWxseSByZXR1cm4gdGhlDQogKiBjb21tYW5kIHJlc3BvbnNlLg0KICoNCiAqIFxwYXJhbSAgICAgICBjb21tYW5kDQogKiAgICAgICAgICAgICAgVGhlIGNhcmQgY29tbWFuZC4NCiAqDQogKiBccGFyYW0gICAgICAgY29tbWFuZF9hcmcNCiAqICAgICAgICAgICAgICBUaGUgY2FyZCBjb21tYW5kIGFyZ3VtZW50Lg0KICoNCiAqIFxwYXJhbSAgICAgICByZXNwb25zZQ0KICogICAgICAgICAgICAgIFtvdXRdIEEgcG9pbnRlciB0byBhIDQgKDMyLWJpdCkgd29yZCB0byByZXR1cm4gdGhlIGNhcmQgY29tbWFuZA0KICogICAgICAgICAgICAgIHJlc3BvbnNlLiBJZiBOVUxMIGlzIHBhc3NlZCB0aGVuIGFueSBjYXJkIGNvbW1hbmQgcmVzcG9uc2UgaXMNCiAqICAgICAgICAgICAgICBpZ25vcmVkLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgVGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgVGhlIG9wZXJhdGlvbiBmYWlsZWQuDQogKi8NCkFMVF9TVEFUVVNfQ09ERSBhbHRfc2RtbWNfY29tbWFuZF9zZW5kKEFMVF9TRE1NQ19DTURfSU5ERVhfdCBjb21tYW5kLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbW1hbmRfYXJnLCB1aW50MzJfdCAqcmVzcG9uc2UpOw0KDQovKiENCiAqIFRoaXMgdHlwZSBkZWZpbmVzIGEgc3RydWN0dXJlIGZvciBnZXQgbG9uZyByZXNwb25zZSBvZiBsYXN0DQogKiBsYXN0IGNvbXBsZXRlIGNvbW1hbmQuDQogKi8NCnR5cGVkZWYgc3RydWN0IEFMVF9TRE1NQ19SRVNQT05TRV9zDQp7DQogICAgdWludDMyX3QgICAgIHJlc3AwOw0KICAgIHVpbnQzMl90ICAgICByZXNwMTsNCiAgICB1aW50MzJfdCAgICAgcmVzcDI7DQogICAgdWludDMyX3QgICAgIHJlc3AzOw0KIH0gQUxUX1NETU1DX1JFU1BPTlNFX3Q7DQoNCi8qIQ0KICogR2V0IHRoZSBsb25nIHJlc3BvbnNlIG9mIHRoZSBsYXN0IGNvbXBsZWF0ZWQgY29tbWFuZC4NCiAqDQogKiBccGFyYW0gICAgICAgcmVzcG9uc2UNCiAqICAgICAgICAgICAgICBbb3V0XSBQb2ludGVyIHRvIGEgXHJlZiBBTFRfU0RNTUNfUkVTUE9OU0VfdCBzdHJ1Y3R1cmUgdG8gaG9sZA0KICogICAgICAgICAgICAgIHRoZSBsb25nIHJlc3BvbnNlLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgU3VjY2Vzc2Z1bCBzdGF0dXMuDQogKiBccmV0dmFsICAgICAgQUxUX0VfRVJST1IgICAgIERldGFpbHMgYWJvdXQgZXJyb3Igc3RhdHVzIGNvZGUNCiAqLw0KQUxUX1NUQVRVU19DT0RFIGFsdF9zZG1tY19yZWFkX2xvbmdfcmVzcG9uc2UoQUxUX1NETU1DX1JFU1BPTlNFX3QgKnJlc3BvbnNlKTsNCg0KLyohDQogKiBSZXR1cm5zIHRoZSBTRC9NTUMgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHZhbHVlIHdoaWNoIHJlZmxlY3RzDQogKiBpbnRlcnJ1cHQgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzIGNvbmRpdGlvbnMgYmVmb3JlIG1hc2tpbmcuDQogKg0KICogXHJldHVybnMgICAgIFRoZSByYXcgdmFsdWUgb2YgdGhlIFNEL01NQyBjb250cm9sbGVyIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXINCiAqICAgICAgICAgICAgICB3aGljaCByZWZsZWN0cyB0aGUgY3VycmVudCBTRC9NTUMgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzDQogKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBiZWZvcmUgbWFza2luZy4NCiAqLw0KdWludDMyX3QgYWx0X3NkbW1jX2ludF9zdGF0dXNfZ2V0KHZvaWQpOw0KDQovKiENCiAqIFJldHVybnMgdGhlIFNEL01NQyBjb250cm9sbGVyIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIHZhbHVlIHdoaWNoIHJlZmxlY3RzIHRoZQ0KICogZW5hYmxlZCAoaS5lLiB1bm1hc2tlZCkgaW50ZXJydXB0IHN0YXR1cyBjb25kaXRpb25zLg0KICoNCiAqIFxyZXR1cm5zICAgICBUaGUgYWdncmVnYXRlIHZhbHVlIG9mIHRoZSBlbmFibGVkIFNEL01NQyBjb250cm9sbGVyIGludGVycnVwdCANCiAqICAgICAgICAgICAgICBzdGF0dXMgY29uZGl0aW9ucy4gIEEgc2V0ICgxKSBiaXQgaW4gdGhlIGNvcnJlc3BvbmRpbmcNCiAqICAgICAgICAgICAgICBBTFRfU0RNTUNfSU5UX1NUQVRVU190IHBvc2l0aW9uIGluZGljYXRlcyBhbiBpbnRlcnJ1cHQgdGhhdCBpcw0KICogICAgICAgICAgICAgIGVuYWJsZWQuIEEgY2xlYXIgKDApIGJpdCB0aGUgY29ycmVzcG9uZGluZyBBTFRfU0RNTUNfSU5UX1NUQVRVU190DQogKiAgICAgICAgICAgICAgcG9zaXRpb24gaW5kaWNhdGVzIGFuIGludGVycnVwdCB0aGF0IGlzIG1hc2tlZC4NCiAqLw0KdWludDMyX3QgYWx0X3NkbW1jX2ludF9tYXNrX2dldCh2b2lkKTsNCg0KLyohDQogKiBDbGVhcnMgdGhlIHNwZWNpZmllZCBTRC9NTUMgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzIGNvbmRpdGlvbnMgaWRlbnRpZmllZCBpbg0KICogdGhlIG1hc2suDQogKg0KICogVGhpcyBmdW5jdGlvbiBjbGVhcnMgb25lIG9yIG1vcmUgb2YgdGhlIHN0YXR1cyBjb25kaXRpb25zIGFzIGNvbnRyaWJ1dG9ycyB0byB0aGUNCiAqIFxiIEFMVF9JTlRfSU5URVJSVVBUX1NETU1DX0lSUSBpbnRlcnJ1cHQgc2lnbmFsIHN0YXRlLg0KICoNCiAqIFxwYXJhbSAgICAgICBtYXNrDQogKiAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBTRC9NTUMgY29udHJvbGxlciBzdGF0dXMgY29uZGl0aW9ucyB0byBjbGVhci4gIFxlIG1hc2sNCiAqICAgICAgICAgICAgICBpcyBhIG1hc2sgb2YgbG9naWNhbGx5IE9SJ2VkIFxyZWYgQUxUX1NETU1DX0lOVF9TVEFUVVNfdCB2YWx1ZXMgdGhhdA0KICogICAgICAgICAgICAgIGRlc2lnbmF0ZSB0aGUgc3RhdHVzIGNvbmRpdGlvbnMgdG8gY2xlYXIuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBJbmRpY2F0ZXMgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBJbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQuDQogKi8NCkFMVF9TVEFUVVNfQ09ERSBhbHRfc2RtbWNfaW50X2NsZWFyKGNvbnN0IHVpbnQzMl90IG1hc2spOw0KDQovKiENCiAqIERpc2FibGUgdGhlIHNwZWNpZmllZCBTRC9NTUMgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzIGNvbmRpdGlvbnMgaWRlbnRpZmllZCBpbg0KICogdGhlIG1hc2suDQogKg0KICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyBvbmUgb3IgbW9yZSBvZiB0aGUgc3RhdHVzIGNvbmRpdGlvbnMgYXMgY29udHJpYnV0b3JzIHRvDQogKiB0aGUgXGIgQUxUX0lOVF9JTlRFUlJVUFRfU0RNTUNfSVJRIGludGVycnVwdCBzaWduYWwgc3RhdGUuDQogKg0KICogTk9URTogQSBjbGVhcmVkIGJpdCBmb3IgYW55IHN0YXR1cyBjb25kaXRpb24gaW4gdGhlIG1hc2sgdmFsdWUgZG9lcyBub3QgaGF2ZSB0aGUNCiAqIGVmZmVjdCBvZiBlbmFibGluZyBpdCBhcyBhIGNvbnRyaWJ1dG9yIHRvIHRoZSBcYiBBTFRfSU5UX0lOVEVSUlVQVF9TRE1NQ19JUlENCiAqIGludGVycnVwdCBzaWduYWwgc3RhdGUuIFRoZSBmdW5jdGlvbiBhbHRfc2RtbWNfaW50X2VuYWJsZSgpIGlzIHVzZWQgdG8gZW5hYmxlDQogKiBzdGF0dXMgc291cmNlIGNvbmRpdGlvbnMuDQogKg0KICogXHBhcmFtICAgICAgIG1hc2sNCiAqICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHN0YXR1cyBjb25kaXRpb25zIHRvIGRpc2FibGUgYXMgaW50ZXJydXB0IHNvdXJjZQ0KICogICAgICAgICAgICAgIGNvbnRyaWJ1dG9ycy4gXGUgbWFzayBpcyBhIG1hc2sgb2YgbG9naWNhbGx5IE9SJ2VkIFxyZWYNCiAqICAgICAgICAgICAgICBBTFRfU0RNTUNfSU5UX1NUQVRVU190IHZhbHVlcyB0aGF0IGRlc2lnbmF0ZSB0aGUgc3RhdHVzIGNvbmRpdGlvbnMNCiAqICAgICAgICAgICAgICB0byBkaXNhYmxlLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgSW5kaWNhdGVzIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgSW5kaWNhdGVzIGFuIGVycm9yIG9jY3VycmVkLg0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2ludF9kaXNhYmxlKGNvbnN0IHVpbnQzMl90IG1hc2spOw0KDQovKiENCiAqIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNEL01NQyBjb250cm9sbGVyIGludGVycnVwdCBzdGF0dXMgY29uZGl0aW9ucyBpZGVudGlmaWVkIGluDQogKiB0aGUgbWFzay4NCiAqDQogKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgb25lIG9yIG1vcmUgb2YgdGhlIHN0YXR1cyBjb25kaXRpb25zIGFzIGNvbnRyaWJ1dG9ycyB0byB0aGUNCiAqIFxiIEFMVF9JTlRfSU5URVJSVVBUX1NETU1DX0lSUSBpbnRlcnJ1cHQgc2lnbmFsIHN0YXRlLg0KICoNCiAqIE5PVEU6IEEgY2xlYXJlZCBiaXQgZm9yIGFueSBzdGF0dXMgY29uZGl0aW9uIGluIHRoZSBtYXNrIHZhbHVlIGRvZXMgbm90IGhhdmUgdGhlDQogKiBlZmZlY3Qgb2YgZGlzYWJsaW5nIGl0IGFzIGEgY29udHJpYnV0b3IgdG8gdGhlIFxiIEFMVF9JTlRfSU5URVJSVVBUX1NETU1DX0lSUQ0KICogaW50ZXJydXB0IHNpZ25hbCBzdGF0ZS4gVGhlIGZ1bmN0aW9uIGFsdF9zZG1tY19pbnRfZGlzYWJsZSgpIGlzIHVzZWQgdG8gZGlzYWJsZQ0KICogc3RhdHVzIHNvdXJjZSBjb25kaXRpb25zLg0KICoNCiAqIFxwYXJhbSAgICAgICBtYXNrDQogKiAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBzdGF0dXMgY29uZGl0aW9ucyB0byBlbmFibGUgYXMgaW50ZXJydXB0IHNvdXJjZQ0KICogICAgICAgICAgICAgIGNvbnRyaWJ1dG9ycy4gXGUgbWFzayBpcyBhIG1hc2sgb2YgbG9naWNhbGx5IE9SJ2VkIFxyZWYNCiAqICAgICAgICAgICAgICBBTFRfU0RNTUNfSU5UX1NUQVRVU190IHZhbHVlcyB0aGF0IGRlc2lnbmF0ZSB0aGUgc3RhdHVzIGNvbmRpdGlvbnMNCiAqICAgICAgICAgICAgICB0byBlbmFibGUuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBJbmRpY2F0ZXMgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBJbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQuDQogKi8NCkFMVF9TVEFUVVNfQ09ERSBhbHRfc2RtbWNfaW50X2VuYWJsZShjb25zdCB1aW50MzJfdCBtYXNrKTsNCg0KLyohDQogKiBUaGlzIHR5cGUgZGVmaW5pdGlvbiBlbnVtZXJhdGVzIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGNvbmRpdGlvbnMgdGhhdCBjb250cmlidXRlDQogKiB0byB0aGUgXGIgQUxUX0lOVF9JTlRFUlJVUFRfU0RNTUNfSVJRIHNpZ25hbCBzdGF0ZS4NCiAqDQogKiBOT1RFOiBCb3RoIHRoZSBnZW5lcmFsIHB1cnBvc2UgaW50ZXJydXB0IHN0YXR1cyBjb25kaXRpb25zIGZvciB0aGUgU0QvTU1DDQogKiBjb250cm9sbGVyIChccmVmIEFMVF9TRE1NQ19JTlRfU1RBVFVTX3QpIGFuZCB0aGUgaW50ZXJydXB0IHN0YXR1cyBjb25kaXRpb25zDQogKiBmb3IgdGhlIGludGVybmFsIERNQSBjb250cm9sbGVyIChccmVmIEFMVF9TRE1NQ19ETUFfSU5UX1NUQVRVU190KSBjb250cmlidXRlIHRvDQogKiB0aGUgb3ZlcmFsbCBcYiBBTFRfSU5UX0lOVEVSUlVQVF9TRE1NQ19JUlEgc2lnbmFsIHN0YXRlDQogKi8NCnR5cGVkZWYgZW51bSBBTFRfU0RNTUNfSU5UX1NUQVRVU19lDQp7DQogICAgQUxUX1NETU1DX0lOVF9TVEFUVVNfQ0QgICAgID0gKDFVTCA8PCAwKSwgICAgLyohPCBDYXJkIERldGVjdCAoQ0QpICovDQogICAgQUxUX1NETU1DX0lOVF9TVEFUVVNfUkUgICAgID0gKDFVTCA8PCAxKSwgICAgLyohPCBSZXNwb25zZSBFcnJvciAoUkUpICovDQogICAgQUxUX1NETU1DX0lOVF9TVEFUVVNfQ01EICAgID0gKDFVTCA8PCAyKSwgICAgLyohPCBDb21tYW5kIERvbmUgKENNRCkgKi8NCiAgICBBTFRfU0RNTUNfSU5UX1NUQVRVU19EVE8gICAgPSAoMVVMIDw8IDMpLCAgICAvKiE8IERhdGEgVHJhbnNmZXIgT3ZlciAoRFRPKSAqLw0KICAgIEFMVF9TRE1NQ19JTlRfU1RBVFVTX1RYRFIgICA9ICgxVUwgPDwgNCksICAgIC8qITwgVHJhbnNtaXQgRklGTyBEYXRhIFJlcXVlc3QgKFRYRFIpICovDQogICAgQUxUX1NETU1DX0lOVF9TVEFUVVNfUlhEUiAgID0gKDFVTCA8PCA1KSwgICAgLyohPCBSZWNlaXZlIEZJRk8gRGF0YSBSZXF1ZXN0IChSWERSKSAqLw0KICAgIEFMVF9TRE1NQ19JTlRfU1RBVFVTX1JDUkMgICA9ICgxVUwgPDwgNiksICAgIC8qITwgUmVzcG9uc2UgQ1JDIEVycm9yIChSQ1JDKSAqLw0KICAgIEFMVF9TRE1NQ19JTlRfU1RBVFVTX0RDUkMgICA9ICgxVUwgPDwgNyksICAgIC8qITwgRGF0YSBDUkMgRXJyb3IgKERDUkMpICovDQogICAgQUxUX1NETU1DX0lOVF9TVEFUVVNfUlRPICAgID0gKDFVTCA8PCA4KSwgICAgLyohPCBSZXNwb25zZSBUaW1lb3V0IEJvb3QgQWNrIFJlY2VpdmVkIChSVE8pICovDQogICAgQUxUX1NETU1DX0lOVF9TVEFUVVNfRFJUTyAgID0gKDFVTCA8PCA5KSwgICAgLyohPCBEYXRhIFJlYWQgVGltZW91dCBCb290IERhdGEgU3RhcnQgKERSVE8pICovDQogICAgQUxUX1NETU1DX0lOVF9TVEFUVVNfSFRPICAgID0gKDFVTCA8PCAxMCksICAgLyohPCBEYXRhIFN0YXJ2YXRpb24gSG9zdCBUaW1lb3V0IChIVE8pIC8gVm9sdCBTd2l0Y2hfaW50ICovDQogICAgQUxUX1NETU1DX0lOVF9TVEFUVVNfRlJVTiAgID0gKDFVTCA8PCAxMSksICAgLyohPCBGSUZPIFVuZGVycnVuIE92ZXJydW4gRXJyb3IgKEZSVU4pICovDQogICAgQUxUX1NETU1DX0lOVF9TVEFUVVNfSExFICAgID0gKDFVTCA8PCAxMiksICAgLyohPCBIYXJkd2FyZSBMb2NrZWQgV3JpdGUgRXJyb3IgKEhMRSkgKi8NCiAgICBBTFRfU0RNTUNfSU5UX1NUQVRVU19TQkUgICAgPSAoMVVMIDw8IDEzKSwgICAvKiE8IFN0YXJ0LUJpdCBFcnJvciAoU0JFKSAqLw0KICAgIEFMVF9TRE1NQ19JTlRfU1RBVFVTX0FDRCAgICA9ICgxVUwgPDwgMTQpLCAgIC8qITwgQXV0byBDb21tYW5kIERvbmUgKEFDRCkgKi8NCiAgICBBTFRfU0RNTUNfSU5UX1NUQVRVU19FQkUgICAgPSAoMVVMIDw8IDE1KSwgICAvKiE8IEVuZC1CaXQgRXJyb3IgKHJlYWQpIC8gd3JpdGUgbm8gQ1JDIChFQkUpICovDQogICAgQUxUX1NETU1DX0lOVF9TVEFUVVNfU0RJT18wID0gKDFVTCA8PCAxNiksICAgIC8qITwgU0RJTyBJbnRlcnJ1cHQgQ2FyZCAwIC0gb25seSBvbmUgY2FyZCBzdXBwb3J0ZWQgKi8NCg0KICAgIEFMVF9TRE1NQ19JTlRfU1RBVFVTX0FMTCAgICA9IDB4MUZGRkYgICAgLyohPCBBbGwgcHJldmlvdXMgc3RhdHVzIHR5cGVzKi8NCn0gQUxUX1NETU1DX0lOVF9TVEFUVVNfdDsNCg0KLyohIEB9ICovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiEgXGFkZHRvZ3JvdXAgQUxUX1NETU1DX0NBUkRfSU5URkMgQ2FyZCBJbnRlcmZhY2UNCiAqDQogKiBUaGUgY2xvY2sgY29udHJvbCBibG9jayBwcm92aWRlcyBkaWZmZXJlbnQgY2xvY2sgZnJlcXVlbmNpZXMgcmVxdWlyZWQgZm9yDQogKiBTRC9NTUMvQ0UtQVRBIGNhcmRzLiBUaGUgY2xvY2sgY29udHJvbCBibG9jayBoYXMgb25lIGNsb2NrIGRpdmlkZXIsIHdoaWNoIGlzDQogKiB1c2VkIHRvIGdlbmVyYXRlIGRpZmZlcmVudCBjYXJkIGNsb2NrIGZyZXF1ZW5jaWVzLg0KICoNCiAqIFRoZSBjbG9jayBkaXZpZGVyIGlzIHVzZWQgdG8gZ2VuZXJhdGUgZGlmZmVyZW50IGNsb2NrIGZyZXF1ZW5jaWVzIHJlcXVpcmVkIGZvcg0KICogdGhlIGNhcmRzLiBUaGUgZGl2aXNpb24gZmFjdG9yIGZvciB0aGUgY2xvY2sgZGl2aWRlciBjYW4gYmUgc2V0IGJ5IGNhbGxpbmcgdGhlDQogKiBhbHRfc2RtbWNfY2FyZF9jbGtfZGl2X3NldCgpIGZ1bmN0aW9uLiBUaGUgY2xvY2sgZGl2aWRlciBpcyBhbiA4LWJpdCB2YWx1ZSB0aGF0DQogKiBwcm92aWRlcyBhIGNsb2NrIGRpdmlzaW9uIGZhY3RvciBmcm9tIDEgdG8gNTEwOyBhIHZhbHVlIG9mIDAgcmVwcmVzZW50cyBhDQogKiBjbG9jay1kaXZpZGVyIGJ5cGFzcywgYSB2YWx1ZSBvZiAxIHJlcHJlc2VudHMgYSBkaXZpZGUgYnkgMiwgYSB2YWx1ZSBvZiAyDQogKiByZXByZXNlbnRzIGEgZGl2aWRlIGJ5IDQsIGFuZCBzbyBvbi4NCiAqDQogKiBAew0KICovDQoNCi8qIQ0KICogVGhpcyB0eXBlIGVudW1lcmF0ZXMgdGhlIFNETU1DIGV2YWlsYWJsZSBidXMgd2lkdGguDQogKi8NCnR5cGVkZWYgZW51bSBBTFRfU0RNTUNfQlVTX1dJRFRIX2UNCnsNCiAgICBBTFRfU0RNTUNfQlVTX1dJRFRIXzEgICAgICAgICA9IDEsDQogICAgQUxUX1NETU1DX0JVU19XSURUSF80ICAgICAgICAgPSA0LA0KICAgIEFMVF9TRE1NQ19CVVNfV0lEVEhfOCAgICAgICAgID0gOA0KfUFMVF9TRE1NQ19CVVNfV0lEVEhfdDsNCg0KLyohDQogKiBUaGlzIHR5cGUgZGVmaW5lcyBhIHN0cnVjdHVyZSBmb3IgY29uZmlndXJhdGlvbiBvZiBtaXNjZWxsYW5lb3VzIGludGVyZmFjZQ0KICogcGFyYW1ldGVycyBmb3IgYW4gYXR0YWNoZWQgY2FyZC4NCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgQUxUX1NETU1DX0NBUkRfTUlTQ19zDQp7DQogICAgdWludDMyX3QgICAgICAgICAgICAgICAgIHJlc3BvbnNlX3RpbWVvdXQ7IC8qITwgQ2FyZCByZXNwb25zZSB0aW1lb3V0IHBlcmlvZCBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHNkbW1jX2NjbGtfb3V0IChTRC9NTUMgY2FyZCBjbG9jaykgdGlja3MuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBkYXRhX3RpbWVvdXQ7ICAgICAvKiE8IENhcmQgZGF0YSByZWFkIHRpbWVvdXQgcGVyaW9kIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc2RtbWNfY2Nsa19vdXQgKFNEL01NQyBjYXJkIGNsb2NrKSB0aWNrcy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgQUxUX1NETU1DX0JVU19XSURUSF90ICAgIGNhcmRfd2lkdGg7ICAgICAgIC8qITwgSW5kaWNhdGVzIGNhcmQgaW50ZXJmYWNlIHdpZHRoICgxLCA0LCBvcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIDggYml0cykuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBibG9ja19zaXplOyAgICAgICAvKiE8IFRoZSBjYXJkIGJsb2NrIHNpemUgaW4gYnl0ZXMuICovDQogICAgdWludDMyX3QgICAgICAgICAgICAgICAgIGRlYm91bmNlX2NvdW50OyAgIC8qITwgTnVtYmVyIG9mIGhvc3QgY2xvY2sgKGw0X21wX2NsaykgdGlja3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB1c2VkIHRvIGRlYm91bmNlIGNhcmQgaW50ZXJmYWNlIHNpZ25hbHMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KfSBBTFRfU0RNTUNfQ0FSRF9NSVNDX3Q7DQoNCi8qIQ0KICogR2V0IHRoZSBjdXJyZW50IGNhcmQgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGZvciB0aGUgbWlzY2VsbGFuZW91cyBzZXQNCiAqIG9mIHBhcmFtZXRlcnMuDQogKg0KICogXHBhcmFtICAgICAgIGNhcmRfbWlzY19jZmcNCiAqICAgICAgICAgICAgICBbb3V0XSBQb2ludGVyIHRvIGEgXHJlZiBBTFRfU0RNTUNfQ0FSRF9NSVNDX3Qgc3RydWN0dXJlIHRvIGhvbGQNCiAqICAgICAgICAgICAgICB0aGUgcmV0dXJuZWQgY2FyZCBpbnRlcmZhY2UgcGFyYW1ldGVycy4NCiAqDQogKiBccmV0dmFsICAgICAgQUxUX0VfU1VDQ0VTUyAgIFN1Y2Nlc3NmdWwgc3RhdHVzLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBEZXRhaWxzIGFib3V0IGVycm9yIHN0YXR1cyBjb2RlDQogKi8NCkFMVF9TVEFUVVNfQ09ERSBhbHRfc2RtbWNfY2FyZF9taXNjX2dldChBTFRfU0RNTUNfQ0FSRF9NSVNDX3QgKmNhcmRfbWlzY19jZmcpOw0KDQovKiENCiAqIFNldCB0aGUgc3BlY2lmaWVkIGNhcmQgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBtaXNjZWxsYW5lb3VzIHNldCBvZg0KICogcGFyYW1ldGVycy4NCiAqDQogKiBccGFyYW0gICAgICAgY2FyZF9taXNjX2NmZw0KICogICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBccmVmIEFMVF9TRE1NQ19DQVJEX01JU0NfdCBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgY2FyZA0KICogICAgICAgICAgICAgIGludGVyZmFjZSBwYXJhbWV0ZXJzIHRvIGNvbmZpZ3VyZS4NCiAqDQogKiBccmV0dmFsICAgICAgQUxUX0VfU1VDQ0VTUyAgIFN1Y2Nlc3NmdWwgc3RhdHVzLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBEZXRhaWxzIGFib3V0IGVycm9yIHN0YXR1cyBjb2RlDQogKi8NCkFMVF9TVEFUVVNfQ09ERSBhbHRfc2RtbWNfY2FyZF9taXNjX3NldChjb25zdCBBTFRfU0RNTUNfQ0FSRF9NSVNDX3QgKmNhcmRfbWlzY19jZmcpOw0KDQovKiENCiAqIFNldCB0aGUgYnVzIHdpZHRoIGFwcHJvcHJpYXRlIHN1cHBvcnRlZCBieSB0aGUgY2FyZCwgc2VuZCB0aGlzIHBhcmFtZXRlciB0byB0aGUgY2FyZC4NCiAqDQogKiBccGFyYW0gICAgICAgd2lkdGgNCiAqICAgICAgICAgICAgICBJbmRpY2F0ZXMgY2FyZCBpbnRlcmZhY2Ugd2lkdGguDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBTdWNjZXNzZnVsIHN0YXR1cy4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgRGV0YWlscyBhYm91dCBlcnJvciBzdGF0dXMgY29kZQ0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2NhcmRfYnVzX3dpZHRoX3NldChjb25zdCBBTFRfU0RNTUNfQlVTX1dJRFRIX3Qgd2lkdGgpOw0KDQovKiENCiAqIFNlbmQgYmxvY2sgc2l6ZSB0byB0aGUgY2FyZC4NCiAqDQogKiBccGFyYW0gICAgICAgYmxvY2tfc2l6ZQ0KICogICAgICAgICAgICAgIFRoZSBjYXJkIGJsb2NrIHNpemUgaW4gYnl0ZXMuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBTdWNjZXNzZnVsIHN0YXR1cy4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgRGV0YWlscyBhYm91dCBlcnJvciBzdGF0dXMgY29kZQ0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2NhcmRfYmxvY2tfc2l6ZV9zZXQoY29uc3QgdWludDE2X3QgYmxvY2tfc2l6ZSk7DQoNCi8qIQ0KICogRGV0ZWN0cyBhbmQgaWRlbnRpZmllcyBhbnkgY29ubmVjdGVkIGNhcmQuDQogKg0KICogRGV0ZWN0cyBhbnkgY29ubmVjdGVkIGNhcmQgKG9ubHkgb25lIGNvbm5lY3RlZCBjYXJkIGlzIHBvc3NpYmxlIGluIHRoaXMNCiAqIGltcGxlbWVudGF0aW9uKSBhbmQgcmV0dXJucyB0aGUgZGV2aWNlIGlkZW50aXR5IGFuZCBwcm9wZXJ0aWVzLg0KICoNCiAqIFxwYXJhbSAgICAgICBjYXJkX2luZm8NCiAqICAgICAgICAgICAgICBbb3V0XSBBIHBvaW50ZXIgdG8gYSBBTFRfU0RNTUNfQ0FSRF9JTkZPX3Qgc3RydWN0dXJlIHRvIGhvbGQNCiAqICAgICAgICAgICAgICBpZGVudGlmaWNhdGlvbiBhbmQgZGV2aWNlIHByb3BlcnR5IGluZm9ybWF0aW9uIGZvciBhbnkgZGV0ZWN0ZWQNCiAqICAgICAgICAgICAgICBjYXJkLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgU3VjY2Vzc2Z1bCBzdGF0dXMuDQogKiBccmV0dmFsICAgICAgQUxUX0VfRVJST1IgICAgIERldGFpbHMgYWJvdXQgZXJyb3Igc3RhdHVzIGNvZGUNCiAqLw0KQUxUX1NUQVRVU19DT0RFIGFsdF9zZG1tY19jYXJkX2lkZW50aWZ5KEFMVF9TRE1NQ19DQVJEX0lORk9fdCAqY2FyZF9pbmZvKTsNCg0KLyohDQogKiBHZXRzIHRoZSBjb25maWd1cmVkIGNhcmQgY2xvY2sgZGl2aWRlciB2YWx1ZSAoXGIgc2RtbWNfY2Nsa19vdXQpLg0KICoNCiAqIFJldHVybnMgdGhlIGNhcmQgY2xvY2sgZGl2aWRlciB2YWx1ZS4gQ2xvY2sgZGl2aXNpb24gaXMgYSAyICogbiB2YWx1ZS4gRm9yDQogKiBleGFtcGxlLCBhIHZhbHVlIG9mIDAgbWVhbnMgZGl2aWRlIGJ5IDIgKiAwID0gMCAobm8gZGl2aXNpb24sIGVmZmVjdGl2ZWx5IGENCiAqIGJ5cGFzcyksIGEgdmFsdWUgb2YgMSBtZWFucyBkaXZpZGUgYnkgMiAqIDEgPSAyLCB2YWx1ZSBvZiAweGZmIG1lYW5zIGRpdmlkZSBieSAyDQogKiAqIDI1NSA9IDUxMC4gVmFsaWQgcmFuZ2UgaXMgMCB0byAyNTUuDQogKiANCiAqIFxyZXR1cm5zICAgICBUaGUgY2xvY2sgZGl2aWRlciB2YWx1ZS4NCiAqLw0KdWludDMyX3QgYWx0X3NkbW1jX2NhcmRfY2xrX2Rpdl9nZXQodm9pZCk7DQoNCi8qIQ0KICogU2V0cyB0aGUgY2FyZCBjbG9jayBkaXZpZGVyIGNvbmZpZ3VyYXRpb24gKFxiIHNkbW1jX2NjbGtfb3V0KS4NCiAqDQogKiBccGFyYW0gICAgICAgY2xrX2Rpdg0KICogICAgICAgICAgICAgIENsb2NrIGRpdmlkZXIgdmFsdWUuIENsb2NrIGRpdmlzaW9uIGlzIDIgKiBuLiBGb3IgZXhhbXBsZSwgYSB2YWx1ZQ0KICogICAgICAgICAgICAgIG9mIDAgbWVhbnMgZGl2aWRlIGJ5IDIgKiAwID0gMCAobm8gZGl2aXNpb24sIGVmZmVjdGl2ZWx5IGEgYnlwYXNzKSwNCiAqICAgICAgICAgICAgICBhIHZhbHVlIG9mIDEgbWVhbnMgZGl2aWRlIGJ5IDIgKiAxID0gMiwgdmFsdWUgb2YgMHhmZiBtZWFucyBkaXZpZGUNCiAqICAgICAgICAgICAgICBieSAyICogMjU1ID0gNTEwLiBWYWxpZCByYW5nZSBpcyAwIHRvIDI1NS4NCiAqIA0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBUaGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBUaGUgb3BlcmF0aW9uIGZhaWxlZC4NCiAqICAgICAgICAgICAgICANCiAqIFxpbnRlcm5hbA0KICogVGhlIGNhcmQgY2xvY2sgbXVzdCBiZSBkaWVzYWJsZWQgYmVmb3JlIGNoYW5naW5nIHRoZSBjbGtfZGl2IHZhbHVlLg0KICogXGVuZGludGVybmFsDQogKi8NCkFMVF9TVEFUVVNfQ09ERSBhbHRfc2RtbWNfY2FyZF9jbGtfZGl2X3NldChjb25zdCB1aW50MzJfdCBjbGtfZGl2KTsNCg0KLyohDQogKiBHZXRzIHRoZSBjb25maWd1cmVkIGNhcmQgZGF0YSB0cmFuc2ZlciByYXRlIGluIGJpdC9zLiBUaGUgdW5pdHMgaXMNCiAqIGNvbXBhdGlibGUgd2l0aCBBTFRfU0RNTUNfQ0FSRF9JTkZPX3Q6OnRyYW5fc3BlZWQuDQogKg0KICogXHJldHVybnMgICAgIFRoZSBkYXRhIHRyYW5zZmVyIHJhdGUgaW4gYml0L3MuDQogKi8NCnVpbnQzMl90IGFsdF9zZG1tY19jYXJkX3NwZWVkX2dldCh2b2lkKTsNCg0KLyohDQogKiBTZXRzIHRoZSBjYXJkIGRhdGEgdHJhbnNmZXIgcmF0ZS4gVGhlIHVuaXRzIGlzIGNvbXBhdGlibGUgd2l0aA0KICogQUxUX1NETU1DX0NBUkRfSU5GT190Ojp0cmFuX3NwZWVkLg0KICoNCiAqIFxwYXJhbSAgICAgICBEZXNpcmVkIGRhdGEgdHJhbnNmZXIgcmF0ZSBpbiBiaXQvcy4NCiAqDQogKiBccmV0dmFsICAgICAgQUxUX0VfU1VDQ0VTUyAgIFRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuDQogKiBccmV0dmFsICAgICAgQUxUX0VfRVJST1IgICAgIFRoZSBvcGVyYXRpb24gZmFpbGVkLg0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2NhcmRfc3BlZWRfc2V0KHVpbnQzMl90IHhmZXJfc3BlZWQpOw0KDQovKiENCiAqIERpc2FibGVzIHRoZSBjYXJkIGNsb2NrIChcYiBzZG1tY19jY2xrX291dCkuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBUaGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBUaGUgb3BlcmF0aW9uIGZhaWxlZC4NCiAqLw0KQUxUX1NUQVRVU19DT0RFIGFsdF9zZG1tY19jYXJkX2Nsa19kaXNhYmxlKHZvaWQpOw0KDQovKiENCiAqIEVuYWJsZXMgdGhlIGNhcmQgY2xvY2sgKFxiIHNkbW1jX2NjbGtfb3V0KS4NCiAqDQogKiBccGFyYW0gICAgICAgdXNlX2xvd19wd3JfbW9kZQ0KICogICAgICAgICAgICAgIElmIHRydWUgdGhlbiBsb3ctcG93ZXIgbW9kZSBpcyBlbmFibGVkIHRvIHNhdmUgY2FyZCBwb3dlciwgdGhlIFxiDQogKiAgICAgICAgICAgICAgc2RtbWNfY2Nsa19vdXQgc2lnbmFsIGlzIGRpc2FibGVkIHdoZW4gdGhlIGNhcmQgaXMgaWRsZSBmb3IgYXQNCiAqICAgICAgICAgICAgICBsZWFzdCBlaWdodCBjYXJkIGNsb2NrIGN5Y2xlcy4gTG93LXBvd2VyIG1vZGUgaXMgZW5hYmxlZCB3aGVuIGENCiAqICAgICAgICAgICAgICBuZXcgY29tbWFuZCBpcyBsb2FkZWQgYW5kIHRoZSBjb21tYW5kIHBhdGggZ29lcyB0byBhIG5vbi1pZGxlDQogKiAgICAgICAgICAgICAgc3RhdGUuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBUaGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBUaGUgb3BlcmF0aW9uIGZhaWxlZC4NCiAqLw0KQUxUX1NUQVRVU19DT0RFIGFsdF9zZG1tY19jYXJkX2Nsa19lbmFibGUoY29uc3QgYm9vbCB1c2VfbG93X3B3cl9tb2RlKTsNCg0KLyohDQogKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNhcmQgY2xvY2sgKFxiIHNkbW1jX2NjbGtfb3V0KSBpcyBlbmFibGVkIG90aGVyd2lzZSByZXR1cm5zDQogKiBmYWxzZS4NCiAqDQogKiBccmV0dmFsICAgICAgdHJ1ZSAgICAgICAgICAgIFRoZSBjYXJkIGNsb2NrIGlzIGVuYWJsZWQuDQogKiBccmV0dmFsICAgICAgZmFsc2UgICAgICAgICAgIFRoZSBjYXJkIGNsb2NrIGlzIG5vdCBlbmFibGVkLg0KICovDQpib29sIGFsdF9zZG1tY19jYXJkX2Nsa19pc19lbmFibGVkKHZvaWQpOw0KDQovKiENCiAqIFJlc2V0IHRoZSBjYXJkIGRldmljZS4NCiAqDQogKiBccmV0dmFsICAgICAgQUxUX0VfU1VDQ0VTUyAgIFRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuDQogKiBccmV0dmFsICAgICAgQUxUX0VfRVJST1IgICAgIFRoZSBvcGVyYXRpb24gZmFpbGVkLg0KICoNCiAqIFxpbnRlcm5hbA0KICogTk9UIElNUExFTUVOVEVEDQogKiBUaGUgU0QvTU1DIGNvbnRyb2xsZXIgZG9lcyBub3QgY29udGFpbiBhIHJlc2V0IG91dHB1dCBhcyBwYXJ0IG9mIHRoZSBleHRlcm5hbA0KICogY2FyZCBpbnRlcmZhY2UuIFRvIHJlc2V0IHRoZSBmbGFzaCBjYXJkIGRldmljZSwgY29uc2lkZXIgdXNpbmcgYSBnZW5lcmFsDQogKiBwdXJwb3NlIG91dHB1dCBwaW4uDQogKiBcZW5kaW50ZXJuYWwNCiAqLw0KQUxUX1NUQVRVU19DT0RFIGFsdF9zZG1tY19jYXJkX3Jlc2V0KHZvaWQpOw0KDQovKiENCiAqIFJldHVybnMgdHJ1ZSBpZiBhIGNhcmQgcHJlc2VuY2UgaXMgZGV0ZWN0ZWQgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuDQogKg0KICogXHJldHZhbCAgICAgIHRydWUgICAgICAgICAgICBBIGNhcmQgaXMgcHJlc2VudC4NCiAqIFxyZXR2YWwgICAgICBmYWxzZSAgICAgICAgICAgQSBjYXJkIGlzIG5vdCBwcmVzZW50Lg0KICogICAgICAgICAgICAgIA0KICogXGludGVybmFsDQogKiBcZW5kaW50ZXJuYWwNCiAqLw0KYm9vbCBhbHRfc2RtbWNfY2FyZF9pc19kZXRlY3RlZCh2b2lkKTsNCg0KLyohDQogKiBSZXR1cm5zIHRydWUgaWYgY2FyZCB3cml0ZSBwcm90ZWN0aW9uIGlzIGVuYWJsZWQgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuDQogKg0KICogXHJldHZhbCAgICAgIHRydWUgICAgICAgICAgICBDYXJkIGlzIHdyaXRlIHByb3RlY3RlZC4NCiAqIFxyZXR2YWwgICAgICBmYWxzZSAgICAgICAgICAgQ2FyZCBpcyBub3Qgd3JpdGUgcHJvdGVjdGVkLg0KICogICAgICAgICAgICAgIA0KICogXGludGVybmFsDQogKiBcZW5kaW50ZXJuYWwNCiAqLw0KYm9vbCBhbHRfc2RtbWNfY2FyZF9pc193cml0ZV9wcm90ZWN0ZWQodm9pZCk7DQoNCi8qIQ0KICogUmV0dXJucyB0cnVlIGlmIHBvd2VyIGlzIG9uIChlbmFibGVkKSB0byB0aGUgY2FyZCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4NCiAqDQogKiBccmV0dmFsICAgICAgdHJ1ZSAgICAgICAgICAgIENhcmQgcG93ZXIgaXMgb24gKGVuYWJsZWQpLg0KICogXHJldHZhbCAgICAgIGZhbHNlICAgICAgICAgICBDYXJkIHBvd2VyIGlzIG9mZiAoZGlzYWJsZWQpLg0KICogICAgICAgICAgICAgIA0KICogXGludGVybmFsDQogKiBwd3Jlbg0KICogXGVuZGludGVybmFsDQogKi8NCmJvb2wgYWx0X3NkbW1jX2NhcmRfcHdyX2lzX29uKHZvaWQpOw0KDQovKiENCiAqIEVuYWJsZSAodHVybiBvbikgcG93ZXIgdG8gdGhlIGNhcmQgZGV2aWNlLg0KICoNCiAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBwb3dlciB0byB0aGUgY2FyZCBkZXZpY2UgYWxsb3dpbmcgZm9yIHBvd2VyIHJhbXAtdXAgdGltZQ0KICogYmVmb3JlIHJldHVybmluZy4NCiAqDQogKiBccmV0dmFsICAgICAgQUxUX0VfU1VDQ0VTUyAgIFN1Y2Nlc3NmdWwgc3RhdHVzLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBEZXRhaWxzIGFib3V0IGVycm9yIHN0YXR1cyBjb2RlDQogKi8NCkFMVF9TVEFUVVNfQ09ERSBhbHRfc2RtbWNfY2FyZF9wd3Jfb24odm9pZCk7DQoNCi8qIQ0KICogRGlzYWJsZSAodHVybiBvZmYpIHBvd2VyIHRvIHRoZSBjYXJkIGRldmljZS4NCiAqDQogKiBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIHBvd2VyIHRvIHRoZSBjYXJkIGRldmljZS4NCiAqDQogKiBccmV0dmFsICAgICAgQUxUX0VfU1VDQ0VTUyAgIFN1Y2Nlc3NmdWwgc3RhdHVzLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBEZXRhaWxzIGFib3V0IGVycm9yIHN0YXR1cyBjb2RlDQogKi8NCkFMVF9TVEFUVVNfQ09ERSBhbHRfc2RtbWNfY2FyZF9wd3Jfb2ZmKHZvaWQpOw0KDQovKiEgQH0gKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qISBcYWRkdG9ncm91cCBBTFRfU0RNTUNfRE1BIFNEL01NQyBDb250cm9sbGVyIEludGVybmFsIERNQQ0KICoNCiAqIFRoZSBpbnRlcm5hbCBETUEgY29udHJvbGxlciBoYXMgYSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgaW50ZXJmYWNlIGFuZCBhDQogKiBzaW5nbGUgdHJhbnNtaXQgb3IgcmVjZWl2ZSBlbmdpbmUsIHdoaWNoIHRyYW5zZmVycyBkYXRhIGZyb20gc3lzdGVtIG1lbW9yeSB0bw0KICogdGhlIGNhcmQgYW5kIHZpY2UgdmVyc2EuIFRoZSBjb250cm9sbGVyIHVzZXMgYSBkZXNjcmlwdG9yIG1lY2hhbmlzbSB0bw0KICogZWZmaWNpZW50bHkgbW92ZSBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHdpdGggbWluaW1hbCBob3N0IHByb2Nlc3Nvcg0KICogaW50ZXJ2ZW50aW9uLiBZb3UgY2FuIHNldCB1cCB0aGUgY29udHJvbGxlciB0byBpbnRlcnJ1cHQgdGhlIGhvc3QgcHJvY2Vzc29yIGluDQogKiBzaXR1YXRpb25zIHN1Y2ggYXMgdHJhbnNtaXQgYW5kIHJlY2VpdmUgZGF0YSB0cmFuc2ZlciBjb21wbGV0aW9uIGZyb20gdGhlIGNhcmQsDQogKiBhcyB3ZWxsIGFzIG90aGVyIG5vcm1hbCBvciBlcnJvciBjb25kaXRpb25zLiBUaGUgRE1BIGNvbnRyb2xsZXIgYW5kIHRoZSBob3N0DQogKiBkcml2ZXIgY29tbXVuaWNhdGUgdGhyb3VnaCBhIHNpbmdsZSBkYXRhIHN0cnVjdHVyZS4NCiAqDQogKiBUaGUgaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXIgdHJhbnNmZXJzIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGNhcmQgdG8gdGhlDQogKiBkYXRhIGJ1ZmZlciBpbiB0aGUgc3lzdGVtIG1lbW9yeSwgYW5kIHRyYW5zZmVycyB0cmFuc21pdCBkYXRhIGZyb20gdGhlIGRhdGENCiAqIGJ1ZmZlciBpbiB0aGUgbWVtb3J5IHRvIHRoZSBjb250cm9sbGVyJ3MgRklGTyBidWZmZXIuIERlc2NyaXB0b3JzIHRoYXQgcmVzaWRlDQogKiBpbiB0aGUgc3lzdGVtIG1lbW9yeSBhY3QgYXMgcG9pbnRlcnMgdG8gdGhlc2UgYnVmZmVycy4NCiAqDQogKiBBIGRhdGEgYnVmZmVyIHJlc2lkZXMgaW4gdGhlIHBoeXNpY2FsIG1lbW9yeSBzcGFjZSBvZiB0aGUgc3lzdGVtIG1lbW9yeSBhbmQNCiAqIGNvbnNpc3RzIG9mIGNvbXBsZXRlIG9yIHBhcnRpYWwgZGF0YS4gVGhlIGJ1ZmZlciBzdGF0dXMgaXMgbWFpbnRhaW5lZCBpbiB0aGUNCiAqIGRlc2NyaXB0b3IuIERhdGEgY2hhaW5pbmcgcmVmZXJzIHRvIGRhdGEgdGhhdCBzcGFucyBtdWx0aXBsZSBkYXRhDQogKiBidWZmZXJzLiBIb3dldmVyLCBhIHNpbmdsZSBkZXNjcmlwdG9yIGNhbm5vdCBzcGFuIG11bHRpcGxlIGRhdGEgYnVmZmVycy4NCiAqDQogKiBBIHNpbmdsZSBkZXNjcmlwdG9yIGlzIHVzZWQgZm9yIGJvdGggcmVjZXB0aW9uIGFuZCB0cmFuc21pc3Npb24uIFRoZSBiYXNlDQogKiBhZGRyZXNzIG9mIHRoZSBsaXN0IGlzIHdyaXR0ZW4gaW50byB0aGUgZGVzY3JpcHRvciBsaXN0IGJhc2UgYWRkcmVzcw0KICogcmVnaXN0ZXIuIEEgZGVzY3JpcHRvciBsaXN0IGlzIGZvcndhcmQgbGlua2VkLiBUaGUgbGFzdCBkZXNjcmlwdG9yIGNhbiBwb2ludA0KICogYmFjayB0byB0aGUgZmlyc3QgZW50cnkgdG8gY3JlYXRlIGEgcmluZyBzdHJ1Y3R1cmUuIFRoZSBkZXNjcmlwdG9yIGxpc3QgcmVzaWRlcw0KICogaW4gdGhlIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBob3N0LiBFYWNoIGRlc2NyaXB0b3IgY2FuIHBvaW50IHRvDQogKiBhIG1heGltdW0gb2YgdHdvIGRhdGEgYnVmZmVycy4NCiAqDQogKiBAew0KICovDQoNCi8qIQ0KICogVGhpcyB0eXBlIGRlZmluaXRpb24gZW51bWVyYXRlcyB0aGUgaW50ZXJydXB0IHN0YXR1cyBjb25kaXRpb25zIGZyb20gdGhlDQogKiBTRC9NTUMgaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXIgdGhhdCBjb250cmlidXRlIHRvIHRoZSBcYg0KICogQUxUX0lOVF9JTlRFUlJVUFRfU0RNTUNfSVJRIHNpZ25hbCBzdGF0ZS4NCiAqDQogKiBOT1RFOiBCb3RoIHRoZSBnZW5lcmFsIHB1cnBvc2UgaW50ZXJydXB0IHN0YXR1cyBjb25kaXRpb25zIGZvciB0aGUgU0QvTU1DDQogKiBjb250cm9sbGVyIChccmVmIEFMVF9TRE1NQ19JTlRfU1RBVFVTX3QpIGFuZCB0aGUgaW50ZXJydXB0IHN0YXR1cyBjb25kaXRpb25zDQogKiBmb3IgdGhlIGludGVybmFsIERNQSBjb250cm9sbGVyIChccmVmIEFMVF9TRE1NQ19ETUFfSU5UX1NUQVRVU190KSBjb250cmlidXRlIHRvDQogKiB0aGUgb3ZlcmFsbCBcYiBBTFRfSU5UX0lOVEVSUlVQVF9TRE1NQ19JUlEgc2lnbmFsIHN0YXRlDQogKi8NCnR5cGVkZWYgZW51bSBBTFRfU0RNTUNfRE1BX0lOVF9TVEFUVVNfZQ0Kew0KICAgIEFMVF9TRE1NQ19ETUFfSU5UX1NUQVRVU19USSAgID0gKDFVTCA8PCAwKSwgLyohPCBUcmFuc21pdCBJbnRlcnJ1cHQgRW5hYmxlICovDQogICAgQUxUX1NETU1DX0RNQV9JTlRfU1RBVFVTX1JJICAgPSAoMVVMIDw8IDEpLCAvKiE8IFJlY2VpdmUgSW50ZXJydXB0IEVuYWJsZSAqLw0KICAgIEFMVF9TRE1NQ19ETUFfSU5UX1NUQVRVU19GQkUgID0gKDFVTCA8PCAyKSwgLyohPCBGYXRhbCBCdXMgRXJyb3IgKi8NCiAgICBBTFRfU0RNTUNfRE1BX0lOVF9TVEFUVVNfRFUgICA9ICgxVUwgPDwgNCksIC8qITwgRGVzY3JpcHRvciBVbmF2YWlsYWJsZSBJbnRlcnJ1cHQgKi8NCiAgICBBTFRfU0RNTUNfRE1BX0lOVF9TVEFUVVNfQ0VTICA9ICgxVUwgPDwgNSksIC8qITwgQ2FyZCBFcnJvciBTdW1tYXJ5IEludGVycnVwdCBFbmFibGUgKi8NCiAgICBBTFRfU0RNTUNfRE1BX0lOVF9TVEFUVVNfTkkgICA9ICgxVUwgPDwgOCksIC8qITwgTm9ybWFsIEludGVycnVwdCBTdW1tYXJ5IEVuYWJsZSAqLw0KICAgIEFMVF9TRE1NQ19ETUFfSU5UX1NUQVRVU19BSSAgID0gKDFVTCA8PCA5KSwgLyohPCBBYm5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSBFbmFibGUuICovDQoNCiAgICBBTFRfU0RNTUNfRE1BX0lOVF9TVEFUVVNfQUxMICA9IDB4MzM3LA0KfSBBTFRfU0RNTUNfRE1BX0lOVF9TVEFUVVNfdDsNCg0KLyohDQogKiBUaGlzIHR5cGUgZGVmaW5lcyB0aGUgU0QvTU1DIGNvbnRyb2xsZXIgaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXIgZGVzY3JpcHRvcg0KICogc3RydWN0dXJlLg0KICoNCiAqIFRoZSBpbnRlcm5hbCBETUEgY29udHJvbGxlciB1c2VzIHRoZXNlIHR5cGVzIG9mIGRlc2NyaXB0b3Igc3RydWN0dXJlczoNCiAqICAgKiBEdWFsLWJ1ZmZlciBzdHJ1Y3R1cmUgLSBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gZGVzY3JpcHRvcnMgaXMgZGV0ZXJtaW5lZA0KICogICAgIGJ5IHRoZSBza2lwIGxlbmd0aCB2YWx1ZSB3cml0dGVuIHRvIHRoZSBkZXNjcmlwdG9yIHNraXAgbGVuZ3RoIGZpZWxkDQogKiAgICAgb2YgdGhlIGJ1cyBtb2RlIHJlZ2lzdGVyLg0KICogICAqIENoYWluIHN0cnVjdHVyZSAtIEVhY2ggZGVzY3JpcHRvciBwb2ludHMgdG8gYSB1bmlxdWUgYnVmZmVyLCBhbmQgdG8gdGhlIG5leHQNCiAqICAgICBkZXNjcmlwdG9yIGluIGEgbGlua2VkIGxpc3QuDQogKi8NCnR5cGVkZWYgc3RydWN0IEFMVF9TRE1NQ19ETUFfQlVGX0RFU0Nfcw0Kew0KICAvKiEgVGhlIERFUzAgZmllbGQgaW4gdGhlIGludGVybmFsIERNQSBjb250cm9sbGVyIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBhbmQNCiAgICogIHN0YXR1cyBpbmZvcm1hdGlvbi4NCiAgICovDQogIHVuaW9uIERFUzANCiAgew0KICAgIC8qISBTdHJ1Y3R1cmUgZm9yIERFUzAgcmVnaXN0ZXIgZGF0YSBmaWVsZHMuICovDQogICAgc3RydWN0DQogICAgew0KICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICA6ICAxOyAgICAgICAgICAgLyohPCBSZXNlcnZlZCAqLw0KICAgICAgdWludDMyX3QgIGRpYyAgICAgICAgICAgICA6ICAxOyAgICAgICAgICAgLyohPCBEaXNhYmxlIEludGVycnVwdCBvbiBDb21wbGV0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIChESUMpLiBXaGVuIHNldCB0byAxLCB0aGlzIGJpdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBwcmV2ZW50cyB0aGUgc2V0dGluZyBvZiB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgVEkvUkkgYml0IG9mIHRoZSBpbnRlcm5hbCBETUENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgY29udHJvbGxlciBzdGF0dXMgcmVnaXN0ZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgKGlkc3RzKSBmb3IgdGhlIGRhdGEgdGhhdCBlbmRzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGluIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0aGlzIGRlc2NyaXB0b3IuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgIHVpbnQzMl90ICBsZCAgICAgICAgICAgICAgOiAgMTsgICAgICAgICAgIC8qITwgTGFzdCBEZXNjcmlwdG9yIChMRCkuIFdoZW4gc2V0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRvIDEsIHRoaXMgYml0IGluZGljYXRlcyB0aGF0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoZSBidWZmZXJzIHBvaW50ZWQgdG8gYnkgdGhpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBkZXNjcmlwdG9yIGFyZSB0aGUgbGFzdCBidWZmZXJzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIG9mIHRoZSBkYXRhLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICB1aW50MzJfdCAgZnMgICAgICAgICAgICAgIDogIDE7ICAgICAgICAgICAvKiE8IEZpcnN0IERlc2NyaXB0b3IgKEZTKS4gV2hlbiBzZXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdG8gMSwgdGhpcyBiaXQgaW5kaWNhdGVzIHRoYXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhpcyBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBmaXJzdCBidWZmZXIgb2YgdGhlIGRhdGEuIElmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBidWZmZXIgaXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgMCwgbmV4dCBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBiZWdpbm5pbmcgb2YgdGhlIGRhdGEuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgIHVpbnQzMl90ICBjaCAgICAgICAgICAgICAgOiAgMTsgICAgICAgICAgIC8qITwgU2Vjb25kIEFkZHJlc3MgQ2hhaW5lZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAoQ0gpLiBXaGVuIHNldCB0byAxLCB0aGlzIGJpdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGFkZHJlc3MgaW4gdGhlIGRlc2NyaXB0b3IgaXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhlIG5leHQgZGVzY3JpcHRvciBhZGRyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHJhdGhlciB0aGFuIHRoZSBzZWNvbmQgYnVmZmVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGFkZHJlc3MuIFdoZW4gdGhpcyBiaXQgaXMgc2V0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRvIDEsIEJTMiAoREVTMVsyNToxM10pIG11c3QgYmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYWxsIHplcm9zLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICB1aW50MzJfdCAgZXIgICAgICAgICAgICAgIDogIDE7ICAgICAgICAgICAvKiE8IEVuZCBvZiBSaW5nIChFUikuIFdoZW4gc2V0IHRvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIDEsIHRoaXMgYml0IGluZGljYXRlcyB0aGF0IHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBkZXNjcmlwdG9yIGxpc3QgcmVhY2hlZCBpdHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZmluYWwgZGVzY3JpcHRvci4gVGhlIGludGVybmFsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIERNQSBjb250cm9sbGVyIHJldHVybnMgdG8gdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGJhc2UgYWRkcmVzcyBvZiB0aGUgbGlzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgY3JlYXRpbmcgYSBkZXNjcmlwdG9yIHJpbmcuIEVSDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGlzIG1lYW5pbmdmdWwgZm9yIG9ubHkgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBkdWFsLWJ1ZmZlciBkZXNjcmlwdG9yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHN0cnVjdHVyZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgdWludDMyX3QgIGNlcyAgICAgICAgICAgICA6ICAxOyAgICAgICAgICAgLyohPCBDYXJkIEVycm9yIFN1bW1hcnkgKENFUykuIFRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBDRVMgYml0IGluZGljYXRlcyB3aGV0aGVyIGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdHJhbnNhY3Rpb24gZXJyb3Igb2NjdXJyZWQuIFRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBDRVMgYml0IGlzIHRoZSBsb2dpY2FsIE9SIG9mDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoZSBmb2xsb3dpbmcgZXJyb3IgYml0cyBpbiB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcmludHN0cyByZWdpc3Rlci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgKiBFbmQtYml0IGVycm9yIChlYmUpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAqIFJlc3BvbnNlIHRpbWVvdXQgKHJ0bykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgKiBSZXNwb25zZSBDUkMgKHJjcmMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICogU3RhcnQtYml0IGVycm9yIChzYmUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICogRGF0YSByZWFkIHRpbWVvdXQgKGRydG8pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICogRGF0YSBDUkMgZm9yIHJlY2VpdmUgKGRjcmMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICogUmVzcG9uc2UgZXJyb3IgKHJlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgIDogMjQ7ICAgICAgICAgICAvKiE8IFJlc2VydmVkICovDQogICAgICB1aW50MzJfdCAgb3duICAgICAgICAgICAgIDogIDE7ICAgICAgICAgICAvKiE8IFdoZW4gc2V0IHRvIDEsIHRoaXMgYml0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGluZGljYXRlcyB0aGF0IHRoZSBkZXNjcmlwdG9yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGlzIG93bmVkIGJ5IHRoZSBpbnRlcm5hbCBETUENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgY29udHJvbGxlci4gV2hlbiB0aGlzIGJpdCBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzZXQgdG8gMCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRlc2NyaXB0b3IgaXMgb3duZWQgYnkgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGhvc3QuIFRoZSBpbnRlcm5hbCBETUENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgY29udHJvbGxlciByZXNldHMgdGhpcyBiaXQgdG8gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB3aGVuIGl0IGNvbXBsZXRlcyB0aGUgZGF0YQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0cmFuc2Zlci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgIH0gICAgICAgICBmbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVbmlvbiBkYXRhIG1lbWJlciBhY2Nlc3MgdG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgREVTMCBmaWVsZHMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICB1aW50MzJfdCAgcmF3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIERFUzAgcmF3IHJlZ2lzdGVyIGFnZ3JlZ2F0ZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICB9IGRlczA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgREVTMCBmaWVsZCBpbiB0aGUgaW50ZXJuYWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgRE1BIGNvbnRyb2xsZXIgZGVzY3JpcHRvcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjb250YWlucyBjb250cm9sIGFuZCBzdGF0dXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW5mb3JtYXRpb24uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyohIFRoZSBERVMxIGRlc2NyaXB0b3IgZmllbGQgY29udGFpbnMgdGhlIGJ1ZmZlciBzaXplLiAqLw0KICB1bmlvbiBERVMxDQogIHsNCiAgICAvKiEgU3RydWN0dXJlIGZvciBERVMxIHJlZ2lzdGVyIGRhdGEgZmllbGRzLiAqLw0KICAgIHN0cnVjdA0KICAgIHsNCiAgICAgICAgdWludDMyX3QgIGJzMSAgICAgICAgICAgICA6IDEzOyAgICAgICAgICAgLyohPCBCdWZmZXIgMSBTaXplIChCUzEpLiBJbmRpY2F0ZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0aGUgZGF0YSBidWZmZXIgYnl0ZSBzaXplLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHdoaWNoIG11c3QgYmUgYSBtdWx0aXBsZSBvZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZvdXIgYnl0ZXMuIFdoZW4gdGhlIGJ1ZmZlcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgZm91ciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0aGUgcmVzdWx0aW5nIGJlaGF2aW9yIGlzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdW5kZWZpbmVkLiBJZiB0aGlzIGZpZWxkIGlzIDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhlIERNQSBpZ25vcmVzIHRoZSBidWZmZXIgYW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcHJvY2VlZHMgdG8gdGhlIG5leHQgZGVzY3JpcHRvcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZvciBhIGNoYWluIHN0cnVjdHVyZSwgb3IgdG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0aGUgbmV4dCBidWZmZXIgZm9yIGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBkdWFsLWJ1ZmZlciBzdHJ1Y3R1cmUuIElmIHRoZXJlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaXMgb25seSBvbmUgZGVzY3JpcHRvciBhbmQgb25seQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIG9uZSBidWZmZXIgdG8gYmUgcHJvZ3JhbW1lZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB5b3UgbmVlZCB0byB1c2Ugb25seSBidWZmZXIgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGFuZCBub3QgYnVmZmVyIDIuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICB1aW50MzJfdCAgYnMyICAgICAgICAgICAgIDogMTM7ICAgICAgICAgICAvKiE8IEJ1ZmZlciAyIFNpemUgKEJTMikuIFRoZXNlIGJpdHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmRpY2F0ZSB0aGUgc2Vjb25kIGRhdGEgYnVmZmVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYnl0ZSBzaXplLiBUaGUgYnVmZmVyIHNpemUgbXVzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGJlIGEgbXVsdGlwbGUgb2YgZm91ci4gV2hlbiB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBidWZmZXIgc2l6ZSBpcyBub3QgYSBtdWx0aXBsZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIG9mIGZvdXIsIHRoZSByZXN1bHRpbmcgYmVoYXZpb3INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpcyB1bmRlZmluZWQuIFRoaXMgZmllbGQgaXMgbm90DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsaWQgaWYgREVTMFs0XSBpcyBzZXQgdG8gMS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgOiAgNjsgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQgKi8NCg0KICAgIH0gICAgICAgICBmbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVbmlvbiBkYXRhIG1lbWJlciBhY2Nlc3MgdG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgREVTMSBmaWVsZHMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICB1aW50MzJfdCAgcmF3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIERFUzEgcmF3IHJlZ2lzdGVyIGFnZ3JlZ2F0ZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICB9IGRlczE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgREVTMSBkZXNjcmlwdG9yIGZpZWxkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGNvbnRhaW5zIHRoZSBidWZmZXIgc2l6ZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiEgVGhlIERFUzIgZGVzY3JpcHRvciBmaWVsZCBjb250YWlucyB0aGUgYWRkcmVzcyBwb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlci4gKi8NCiAgdW5pb24gREVTMg0KICB7DQogICAgLyohIFN0cnVjdHVyZSBmb3IgREVTMiByZWdpc3RlciBkYXRhIGZpZWxkcy4gKi8NCiAgICBzdHJ1Y3QNCiAgICB7DQogICAgICB1aW50MzJfdCAgYmFwMSAgICAgICAgICAgIDogMzI7ICAgICAgICAgICAvKiE8IEJ1ZmZlciBBZGRyZXNzIFBvaW50ZXIgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAoQkFQMSkuIFRoZXNlIGJpdHMgaW5kaWNhdGUgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRhdGEgYnVmZmVyLiBUaGUgaW50ZXJuYWwgRE1BDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGNvbnRyb2xsZXIgaWdub3JlcyBERVMyIFsxOjBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBiZWNhdXNlIGl0IG9ubHkgcGVyZm9ybXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgMzItYml0LWFsaWduZWQgYWNjZXNzZXMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICB9ICAgICAgICAgZmxkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVW5pb24gZGF0YSBtZW1iZXIgYWNjZXNzIHRvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIERFUzIgZmllbGRzLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgdWludDMyX3QgIHJhdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBERVMyIHJhdyByZWdpc3RlciBhZ2dyZWdhdGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgfSBkZXMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIERFUzIgZGVzY3JpcHRvciBmaWVsZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjb250YWlucyB0aGUgYWRkcmVzcyBwb2ludGVyIHRvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoZSBkYXRhIGJ1ZmZlci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiEgVGhlIERFUzMgZGVzY3JpcHRvciBmaWVsZCBjb250YWlucyB0aGUgYWRkcmVzcyBwb2ludGVyIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3INCiAgICogIGlmIHRoZSBwcmVzZW50IGRlc2NyaXB0b3IgaXMgbm90IHRoZSBsYXN0IGRlc2NyaXB0b3IgaW4gYSBjaGFpbmVkIGRlc2NyaXB0b3INCiAgICogIHN0cnVjdHVyZSBvciB0aGUgc2Vjb25kIGJ1ZmZlciBhZGRyZXNzIGZvciBhIGR1YWwtYnVmZmVyIHN0cnVjdHVyZS4NCiAgICovDQogIHVuaW9uIERFUzMNCiAgew0KICAgIC8qISBTdHJ1Y3R1cmUgZm9yIERFUzMgcmVnaXN0ZXIgZGF0YSBmaWVsZHMuICovDQogICAgc3RydWN0DQogICAgew0KICAgICAgdWludDMyX3QgIGJhcDJfb3JfbmV4dCAgICA6IDMyOyAgICAgICAgICAgLyohPCBCdWZmZXIgQWRkcmVzcyBQb2ludGVyIDIgKEJBUDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIG9yIE5leHQgRGVzY3JpcHRvcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBBZGRyZXNzLiBUaGVzZSBiaXRzIGluZGljYXRlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzZWNvbmQgYnVmZmVyIHdoZW4gdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGR1YWwtYnVmZmVyIHN0cnVjdHVyZSBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB1c2VkLiBJZiB0aGUgU2Vjb25kIEFkZHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgQ2hhaW5lZCAoREVTMFs0XSkgYml0IGlzIHNldCB0bw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAxLCB0aGlzIGFkZHJlc3MgY29udGFpbnMgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHBvaW50ZXIgdG8gdGhlIHBoeXNpY2FsIG1lbW9yeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB3aGVyZSB0aGUgbmV4dCBkZXNjcmlwdG9yIGlzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHByZXNlbnQuIElmIHRoaXMgaXMgbm90IHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBsYXN0IGRlc2NyaXB0b3IsIHRoZSBuZXh0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRlc2NyaXB0b3IgYWRkcmVzcyBwb2ludGVyIG11c3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYmUgYWxpZ25lZCB0byAzMiBiaXRzLiBCaXRzIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYW5kIDAgYXJlIGlnbm9yZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICB9ICAgICAgICAgZmxkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVW5pb24gZGF0YSBtZW1iZXIgYWNjZXNzIHRvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIERFUzMgZmllbGRzLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgdWludDMyX3QgIHJhdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBERVMzIHJhdyByZWdpc3RlciBhZ2dyZWdhdGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgfSBkZXMzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIERFUzMgZGVzY3JpcHRvciBmaWVsZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjb250YWlucyB0aGUgYWRkcmVzcyBwb2ludGVyIHRvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoZSBuZXh0IGRlc2NyaXB0b3IgaWYgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHByZXNlbnQgZGVzY3JpcHRvciBpcyBub3QgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGxhc3QgZGVzY3JpcHRvciBpbiBhIGNoYWluZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgb3IgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHNlY29uZCBidWZmZXIgYWRkcmVzcyBmb3IgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBkdWFsLWJ1ZmZlciBzdHJ1Y3R1cmUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCg0KfSBBTFRfU0RNTUNfRE1BX0JVRl9ERVNDX3Q7DQoNCi8qIQ0KICogUmVzZXRzIHRoZSBTRC9NTUMgaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXIuDQogKg0KICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIFNEL01NQyBjb250cm9sbGVyIERNQSBpbnRlcmZhY2UgY29udHJvbCBsb2dpYyBhbmQgYWxsDQogKiBpbnRlcm5hbCByZWdpc3RlcnMgb2YgdGhlIERNQSBjb250cm9sbGVyLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgVGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgVGhlIG9wZXJhdGlvbiBmYWlsZWQuDQogKg0KICogXGludGVybmFsDQogKiBjdHJsLmRtYV9yZXNldA0KICogYm1vZC5zd3INCiAqIFdoYXQncyB0aGUgZGlmZmVyZW5jZSBpZiB0aGUgZWZmZWN0IG9mIHRoZXNlIHR3byBjb250cm9scz8NCiAqIFxlbmRpbnRlcm5hbA0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2RtYV9yZXNldCh2b2lkKTsNCg0KLyohDQogKiBEaXNhYmxlcyB1c2Ugb2YgdGhlIFNEL01NQyBjb250cm9sbGVyIGludGVybmFsIERNQSBmb3IgZGF0YSB0cmFuc2ZlcnMuDQogKg0KICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB1c2Ugb2YgdGhlIFNEL01NQyBjb250cm9sbGVyIGludGVybmFsIERNQSBmb3IgZGF0YQ0KICogdHJhbnNmZXJzIGFuZCByZXF1aXJlcyB0aGUgaG9zdCB0byBjb25kdWN0IGRhdGEgdHJhbnNmZXJzIHRocm91Z2ggdGhlIHNsYXZlDQogKiBpbnRlcmZhY2UuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBUaGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBUaGUgb3BlcmF0aW9uIGZhaWxlZC4NCiAqDQogKiBcaW50ZXJuYWwNCiAqIGN0cmwudXNlX2ludGVybmFsX2RtYWMNCiAqIGJtb2QuZGUNCiAqIFdoYXQncyB0aGUgZGlmZmVyZW5jZSBpZiB0aGUgZWZmZWN0IG9mIHRoZXNlIHR3byBjb250cm9scz8NCiAqIFxlbmRpbnRlcm5hbA0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2RtYV9kaXNhYmxlKHZvaWQpOw0KDQovKiENCiAqIEVuYWJsZXMgdXNlIG9mIHRoZSBTRC9NTUMgY29udHJvbGxlciBpbnRlcm5hbCBETUEgZm9yIGRhdGEgdHJhbnNmZXJzLg0KICoNCiAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB1c2Ugb2YgdGhlIFNEL01NQyBjb250cm9sbGVyIGludGVybmFsIERNQSBmb3IgZGF0YQ0KICogdHJhbnNmZXJzLCBvdGhlcndpc2UgdGhlIGhvc3QgbXVzdCBjb25kdWN0IGRhdGEgdHJhbnNmZXJzIHRocm91Z2ggdGhlIHNsYXZlDQogKiBpbnRlcmZhY2UuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBUaGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLg0KICogXHJldHZhbCAgICAgIEFMVF9FX0VSUk9SICAgICBUaGUgb3BlcmF0aW9uIGZhaWxlZC4NCiAqDQogKiBcaW50ZXJuYWwNCiAqIGN0cmwudXNlX2ludGVybmFsX2RtYWMNCiAqIGJtb2QuZGUNCiAqIFdoYXQncyB0aGUgZGlmZmVyZW5jZSBpZiB0aGUgZWZmZWN0IG9mIHRoZXNlIHR3byBjb250cm9scz8NCiAqIFxlbmRpbnRlcm5hbA0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2RtYV9lbmFibGUodm9pZCk7DQoNCi8qIQ0KICogVGhpcyB0eXBlIGVudW1lcmF0ZXMgdGhlIGhvc3QgYnVzIHByb2dyYW1tYWJsZSBidXJzdCBsZW5ndGggb3B0aW9ucw0KICogYXZhaWxhYmxlIHRvIHRoZSBTRC9NTUMgaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXIuDQogKi8NCnR5cGVkZWYgZW51bSBBTFRfU0RNTUNfRE1BX1BCTF9lDQp7DQogICAgQUxUX1NETU1DX0RNQV9QQkxfMSAgICAgPSAweDAsICAgICAgLyohPCAxIHRyYW5zZmVyIHVuaXQgICAgKi8NCiAgICBBTFRfU0RNTUNfRE1BX1BCTF80ICAgICA9IDB4MSwgICAgICAvKiE8IDQgdHJhbnNmZXIgdW5pdHMgICAqLw0KICAgIEFMVF9TRE1NQ19ETUFfUEJMXzggICAgID0gMHgyLCAgICAgIC8qITwgOCB0cmFuc2ZlciB1bml0cyAgICovDQogICAgQUxUX1NETU1DX0RNQV9QQkxfMTYgICAgPSAweDMsICAgICAgLyohPCAxNiB0cmFuc2ZlciB1bml0cyAgKi8NCiAgICBBTFRfU0RNTUNfRE1BX1BCTF8zMiAgICA9IDB4NCwgICAgICAvKiE8IDMyIHRyYW5zZmVyIHVuaXRzICAqLw0KICAgIEFMVF9TRE1NQ19ETUFfUEJMXzY0ICAgID0gMHg1LCAgICAgIC8qITwgNjQgdHJhbnNmZXIgdW5pdHMgICovDQogICAgQUxUX1NETU1DX0RNQV9QQkxfMTI4ICAgPSAweDYsICAgICAgLyohPCAxMjggdHJhbnNmZXIgdW5pdHMgKi8NCiAgICBBTFRfU0RNTUNfRE1BX1BCTF8yNTYgICA9IDB4NywgICAgICAvKiE8IDI1NiB0cmFuc2ZlciB1bml0cyAqLw0KICAgIA0KfSBBTFRfU0RNTUNfRE1BX1BCTF90Ow0KDQovKiENCiAqIFN0YXJ0cyB0aGUgU0QvTU1DIGludGVybmFsIERNQSB0cmFuc2ZlciB3aXRoIHRoZSBzcGVjaWZpZWQNCiAqIGRlc2NyaXB0b3IgYW4gYnVzIG1vZGUgdHJhbnNmZXIgY29uZmlndXJhdGlvbi4NCiAqDQogKiBccGFyYW0gICAgICAgYnVmX2Rlc2NfbGlzdA0KICogICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBhIFNEL01NQyBpbnRlcm5hbCBETUEgYnVmZmVyDQogKiAgICAgICAgICAgICAgZGVzY3JpcHRvciBsaXN0Lg0KICoNCiAqIFxwYXJhbSAgICAgICBkZXNjX3NraXBfbGVuDQogKiAgICAgICAgICAgICAgRGVzY3JpcHRvciBTa2lwIExlbmd0aC4gU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YNCiAqICAgICAgICAgICAgICBoYWxmL2Z1bGwvZG91YmxlIHdvcmRzIChkZXBlbmRpbmcgb24gMTYvMzIvNjQtYml0IGJ1cykNCiAqICAgICAgICAgICAgICB0byBza2lwIGJldHdlZW4gdHdvIHVuY2hhaW5lZCBkZXNjcmlwdG9ycy4gT25seQ0KICogICAgICAgICAgICAgIGFwcGxpY2FibGUgZm9yIGR1YWwgYnVmZmVyIHN0cnVjdHVyZXMgb3RoZXJ3aXNlDQogKiAgICAgICAgICAgICAgaWdub3JlZC4NCiAqDQogKiBccGFyYW0gICAgICAgYnVyc3RfbGVuDQogKiAgICAgICAgICAgICAgUHJvZ3JhbW1hYmxlIEJ1cnN0IExlbmd0aC4gU3BlY2lmaWVzIHRoZSBtYXhpbXVtDQogKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJlYXRzIHRvIGJlIHBlcmZvcm1lZCBpbiBvbmUgRE1BDQogKiAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uIFRoZSBETUEgd2lsbCBhbHdheXMgYXR0ZW1wdCB0byBidXJzdCBhcw0KICogICAgICAgICAgICAgIHNwZWNpZmllZCBlYWNoIHRpbWUgaXQgc3RhcnRzIGEgYnVyc3QgdHJhbnNmZXIgb24gdGhlDQogKiAgICAgICAgICAgICAgaG9zdCBidXMuDQogKg0KICogXHBhcmFtICAgICAgIHVzZV9maXhlZF9idXJzdA0KICogICAgICAgICAgICAgIEZpeGVkIEJ1cnN0LiBDb250cm9scyB3aGV0aGVyIHRoZSBBSEIgTWFzdGVyIGludGVyZmFjZQ0KICogICAgICAgICAgICAgIHBlcmZvcm1zIGZpeGVkIGJ1cnN0IHRyYW5zZmVycyBvciBub3QuIFdoZW4gc2V0LCB0aGUNCiAqICAgICAgICAgICAgICBBSEIgd2lsbCB1c2Ugb25seSBTSU5HTEUsIElOQ1I0LCBJTkNSOCBvciBJTkNSMTYNCiAqICAgICAgICAgICAgICBkdXJpbmcgc3RhcnQgb2Ygbm9ybWFsIGJ1cnN0IHRyYW5zZmVycy4gV2hlbiByZXNldCwNCiAqICAgICAgICAgICAgICB0aGUgQUhCIHdpbGwgdXNlIFNJTkdMRSBhbmQgSU5DUiBidXJzdCB0cmFuc2Zlcg0KICogICAgICAgICAgICAgIG9wZXJhdGlvbnMuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBTdWNjZXNzZnVsIHN0YXR1cy4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgRGV0YWlscyBhYm91dCBlcnJvciBzdGF0dXMgY29kZQ0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2RtYV9zdGFydChBTFRfU0RNTUNfRE1BX0JVRl9ERVNDX3QgKmJ1Zl9kZXNjX2xpc3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZGVzY19za2lwX2xlbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFMVF9TRE1NQ19ETUFfUEJMX3QgYnVyc3RfbGVuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB1c2VfZml4ZWRfYnVyc3QpOw0KDQovKiENCiAqIFNldHMgYW55IHZhbHVlIGZvciB0aGUgSURNQUMgRlNNIHRvIHJlc3VtZSBub3JtYWwgZGVzY3JpcHRvcg0KICogZmV0Y2ggb3BlcmF0aW9uLg0KICoNCiAqIFxwYXJhbSAgICAgICB2YWx1ZQ0KICogICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCB3cml0ZSBmb3IgdGhlIElETUFDIEZTTS4NCiAqDQogKiBccmV0dmFsICAgICAgQUxUX0VfU1VDQ0VTUyAgIFRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuDQogKiBccmV0dmFsICAgICAgQUxUX0VfRVJST1IgICAgIFRoZSBvcGVyYXRpb24gZmFpbGVkLg0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX3BvbGxfZGVtYW5kX3NldChjb25zdCB1aW50MzJfdCB2YWx1ZSk7DQoNCi8qIQ0KICogUmV0dXJucyB0aGUgU0QvTU1DIGludGVybmFsIERNQSBjb250cm9sbGVyIHN0YXR1cyByZWdpc3RlciB2YWx1ZSB3aGljaA0KICogcmVmbGVjdHMgY3VycmVudCBETUEgaW50ZXJydXB0IHN0YXR1cyBjb25kaXRpb25zLg0KICoNCiAqIFxyZXR1cm5zICAgICBUaGUgdmFsdWUgb2YgdGhlIFNEL01NQyBpbnRlcm5hbCBETUEgc3RhdHVzIHJlZ2lzdGVyIHdoaWNoDQogKiAgICAgICAgICAgICAgcmVmbGVjdHMgdGhlIGN1cnJlbnQgU0QvTU1DIGludGVybmFsIERNQSBpbnRlcnJ1cHQgc3RhdHVzDQogKiAgICAgICAgICAgICAgY29uZGl0aW9ucy4NCiAqLw0KdWludDMyX3QgYWx0X3NkbW1jX2RtYV9pbnRfc3RhdHVzX2dldCh2b2lkKTsNCg0KLyohDQogKiBSZXR1cm5zIHRoZSBTRC9NTUMgaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXIgaW50ZXJydXB0IG1hc2sgdmFsdWUgd2hpY2gNCiAqIHJlZmxlY3RzIHRoZSBlbmFibGVkIGludGVybmFsIERNQSBjb250cm9sbGVyIGludGVycnVwdCBzdGF0dXMgY29uZGl0aW9ucy4NCiAqDQogKiBccmV0dXJucyAgICAgVGhlIGFnZ3JlZ2F0ZSB2YWx1ZSBvZiB0aGUgZW5hYmxlZCBTRC9NTUMgaW50ZXJuYWwgRE1BDQogKiAgICAgICAgICAgICAgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzIGNvbmRpdGlvbnMuICBBIHNldCAoMSkgYml0IGluIHRoZQ0KICogICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgQUxUX1NETU1DX0RNQV9JTlRfU1RBVFVTX3QgcG9zaXRpb24gaW5kaWNhdGVzIGFuDQogKiAgICAgICAgICAgICAgaW50ZXJydXB0IHRoYXQgaXMgZW5hYmxlZC4gQSBjbGVhciAoMCkgYml0IHRoZSBjb3JyZXNwb25kaW5nDQogKiAgICAgICAgICAgICAgQUxUX1NETU1DX0RNQV9JTlRfU1RBVFVTX3QgcG9zaXRpb24gaW5kaWNhdGVzIGFuIGludGVycnVwdCB0aGF0DQogKiAgICAgICAgICAgICAgaXMgbWFza2VkLg0KICovDQp1aW50MzJfdCBhbHRfc2RtbWNfZG1hX2ludF9tYXNrX2dldCh2b2lkKTsNCg0KLyohDQogKiBDbGVhcnMgdGhlIHNwZWNpZmllZCBTRC9NTUMgaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXIgaW50ZXJydXB0IHN0YXR1cw0KICogY29uZGl0aW9ucyBpZGVudGlmaWVkIGluIHRoZSBtYXNrLg0KICoNCiAqIFRoaXMgZnVuY3Rpb24gY2xlYXJzIG9uZSBvciBtb3JlIG9mIHRoZSBzdGF0dXMgY29uZGl0aW9ucyBhcyBjb250cmlidXRvcnMgdG8NCiAqIHRoZSBcYiBBTFRfSU5UX0lOVEVSUlVQVF9TRE1NQ19JUlEgaW50ZXJydXB0IHNpZ25hbCBzdGF0ZS4NCiAqDQogKiBccGFyYW0gICAgICAgbWFzaw0KICogICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgU0QvTU1DIGludGVybmFsIERNQSBjb250cm9sbGVyIHN0YXR1cyBjb25kaXRpb25zDQogKiAgICAgICAgICAgICAgdG8gY2xlYXIuICBcZSBtYXNrIGlzIGEgbWFzayBvZiBsb2dpY2FsbHkgT1InZWQgXHJlZg0KICogICAgICAgICAgICAgIEFMVF9TRE1NQ19ETUFfSU5UX1NUQVRVU190IHZhbHVlcyB0aGF0IGRlc2lnbmF0ZSB0aGUgc3RhdHVzDQogKiAgICAgICAgICAgICAgY29uZGl0aW9ucyB0byBjbGVhci4NCiAqDQogKiBccmV0dmFsICAgICAgQUxUX0VfU1VDQ0VTUyAgIEluZGljYXRlcyBzdWNjZXNzZnVsIGNvbXBsZXRpb24uDQogKiBccmV0dmFsICAgICAgQUxUX0VfRVJST1IgICAgIEluZGljYXRlcyBhbiBlcnJvciBvY2N1cnJlZC4NCiAqLw0KQUxUX1NUQVRVU19DT0RFIGFsdF9zZG1tY19kbWFfaW50X2NsZWFyKGNvbnN0IHVpbnQzMl90IG1hc2spOw0KDQovKiENCiAqIERpc2FibGUgdGhlIHNwZWNpZmllZCBTRC9NTUMgaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXIgaW50ZXJydXB0IHN0YXR1cw0KICogY29uZGl0aW9ucyBpZGVudGlmaWVkIGluIHRoZSBtYXNrLg0KICoNCiAqIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgb25lIG9yIG1vcmUgb2YgdGhlIHN0YXR1cyBjb25kaXRpb25zIGFzIGNvbnRyaWJ1dG9ycw0KICogdG8gdGhlIFxiIEFMVF9JTlRfSU5URVJSVVBUX1NETU1DX0lSUSBpbnRlcnJ1cHQgc2lnbmFsIHN0YXRlLg0KICoNCiAqIE5PVEU6IEEgY2xlYXJlZCBiaXQgZm9yIGFueSBzdGF0dXMgY29uZGl0aW9uIGluIHRoZSBtYXNrIHZhbHVlIGRvZXMgbm90IGhhdmUNCiAqIHRoZSBlZmZlY3Qgb2YgZW5hYmxpbmcgaXQgYXMgYSBjb250cmlidXRvciB0byB0aGUgXGINCiAqIEFMVF9JTlRfSU5URVJSVVBUX1NETU1DX0lSUSBpbnRlcnJ1cHQgc2lnbmFsIHN0YXRlLiBUaGUgZnVuY3Rpb24NCiAqIGFsdF9zZG1tY19kbWFfaW50X2VuYWJsZSgpIGlzIHVzZWQgdG8gZW5hYmxlIHN0YXR1cyBzb3VyY2UgY29uZGl0aW9ucy4NCiAqDQogKiBccGFyYW0gICAgICAgbWFzaw0KICogICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgc3RhdHVzIGNvbmRpdGlvbnMgdG8gZGlzYWJsZSBhcyBpbnRlcnJ1cHQgc291cmNlDQogKiAgICAgICAgICAgICAgY29udHJpYnV0b3JzLiBcZSBtYXNrIGlzIGEgbWFzayBvZiBsb2dpY2FsbHkgT1InZWQgXHJlZg0KICogICAgICAgICAgICAgIEFMVF9TRE1NQ19ETUFfSU5UX1NUQVRVU190IHZhbHVlcyB0aGF0IGRlc2lnbmF0ZSB0aGUgc3RhdHVzDQogKiAgICAgICAgICAgICAgY29uZGl0aW9ucyB0byBkaXNhYmxlLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgSW5kaWNhdGVzIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgSW5kaWNhdGVzIGFuIGVycm9yIG9jY3VycmVkLg0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2RtYV9pbnRfZGlzYWJsZShjb25zdCB1aW50MzJfdCBtYXNrKTsNCg0KLyohDQogKiBFbmFibGUgdGhlIHNwZWNpZmllZCBTRC9NTUMgaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXIgaW50ZXJydXB0IHN0YXR1cyBjb25kaXRpb25zDQogKiBpZGVudGlmaWVkIGluIHRoZSBtYXNrLg0KICoNCiAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBvbmUgb3IgbW9yZSBvZiB0aGUgc3RhdHVzIGNvbmRpdGlvbnMgYXMgY29udHJpYnV0b3JzIHRvDQogKiB0aGUgXGIgQUxUX0lOVF9JTlRFUlJVUFRfU0RNTUNfSVJRIGludGVycnVwdCBzaWduYWwgc3RhdGUuDQogKg0KICogTk9URTogQSBjbGVhcmVkIGJpdCBmb3IgYW55IHN0YXR1cyBjb25kaXRpb24gaW4gdGhlIG1hc2sgdmFsdWUgZG9lcyBub3QgaGF2ZQ0KICogdGhlIGVmZmVjdCBvZiBkaXNhYmxpbmcgaXQgYXMgYSBjb250cmlidXRvciB0byB0aGUgXGINCiAqIEFMVF9JTlRfSU5URVJSVVBUX1NETU1DX0lSUSBpbnRlcnJ1cHQgc2lnbmFsIHN0YXRlLiBUaGUgZnVuY3Rpb24NCiAqIGFsdF9zZG1tY19kbWFfaW50X2Rpc2FibGUoKSBpcyB1c2VkIHRvIGRpc2FibGUgc3RhdHVzIHNvdXJjZSBjb25kaXRpb25zLg0KICoNCiAqIFxwYXJhbSAgICAgICBtYXNrDQogKiAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBzdGF0dXMgY29uZGl0aW9ucyB0byBlbmFibGUgYXMgaW50ZXJydXB0IHNvdXJjZQ0KICogICAgICAgICAgICAgIGNvbnRyaWJ1dG9ycy4gXGUgbWFzayBpcyBhIG1hc2sgb2YgbG9naWNhbGx5IE9SJ2VkIFxyZWYNCiAqICAgICAgICAgICAgICBBTFRfU0RNTUNfRE1BX0lOVF9TVEFUVVNfdCB2YWx1ZXMgdGhhdCBkZXNpZ25hdGUgdGhlIHN0YXR1cw0KICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgdG8gZW5hYmxlLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgSW5kaWNhdGVzIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgSW5kaWNhdGVzIGFuIGVycm9yIG9jY3VycmVkLg0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2RtYV9pbnRfZW5hYmxlKGNvbnN0IHVpbnQzMl90IG1hc2spOw0KDQovKiEgQH0gKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qISBcYWRkdG9ncm91cCBBTFRfU0RNTUNfRklGTyBTRC9NTUMgQ29udHJvbGxlciBGSUZPDQogKg0KICoNCiAqIEB7DQogKi8NCg0KLyohDQogKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgKGRlcHRoKSBvZiB0aGUgU0RNTUMgY29udHJvbGxlciBGSUZPLg0KICovDQojZGVmaW5lIEFMVF9TRE1NQ19GSUZPX05VTV9FTlRSSUVTICAgICAxMDI0DQoNCi8qIQ0KICogUmVzZXRzIHRoZSBTRC9NTUMgY29udHJvbGxlciBGSUZPLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgVGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgVGhlIG9wZXJhdGlvbiBmYWlsZWQuDQogKiANCiAqIFxpbnRlcm5hbA0KICogY3RybC5maWZvX3Jlc2V0IC0gd3JpdGUgMSB0byByZXNldCBGSUZPDQogKiBcZW5kaW50ZXJuYWwNCiAqLw0KQUxUX1NUQVRVU19DT0RFIGFsdF9zZG1tY19maWZvX3Jlc2V0KHZvaWQpOw0KDQovKiENCiAqIFRoaXMgdHlwZSBlbnVtZXJhdGVzIHRoZSBidXJzdCBzaXplIG9mIG11bHRpcGxlIHRyYW5zYWN0aW9uDQogKiBhdmFpbGFibGUgdG8gdGhlIFNEL01NQyBpbnRlcm5hbCBETUEgY29udHJvbGxlci4NCiAqLw0KdHlwZWRlZiBlbnVtIEFMVF9TRE1NQ19NVUxUX1RSQU5TX2UNCnsNCiAgICBBTFRfU0RNTUNfTVVMVF9UUkFOU19UWE1TSVpFMSAgICAgPSAweDAsICAgICAgLyohPCBNc2l6ZSAxIGFuZCBUWF9XTUFSSyAxLTEwMjMgKi8NCiAgICBBTFRfU0RNTUNfTVVMVF9UUkFOU19UWE1TSVpFNCAgICAgPSAweDEsICAgICAgLyohPCBNc2l6ZSAxIGFuZCBUWF9XTUFSSyAxLTEwMjMgKi8NCiAgICBBTFRfU0RNTUNfTVVMVF9UUkFOU19UWE1TSVpFSzggICAgPSAweDIsICAgICAgLyohPCBNc2l6ZSA0IGFuZCBUWF9XTUFSSyAyNTYgICAgKi8NCiAgICBBTFRfU0RNTUNfTVVMVF9UUkFOU19UWE1TSVpFSzE2ICAgPSAweDMsICAgICAgLyohPCBNc2l6ZSAxNiBhbmQgVFhfV01BUksgNjQgICAgKi8NCiAgICBBTFRfU0RNTUNfTVVMVF9UUkFOU19SWE1TSVpFSzEgICAgPSAweDUsICAgICAgLyohPCBNc2l6ZSAxIGFuZCBSWF9XTUFSSyA1MTIgICAgKi8NCiAgICBBTFRfU0RNTUNfTVVMVF9UUkFOU19SWE1TSVpFSzQgICAgPSAweDYsICAgICAgLyohPCBNc2l6ZSAxIGFuZCBSWF9XTUFSSyA1MTIgICAgKi8NCiAgICBBTFRfU0RNTUNfTVVMVF9UUkFOU19SWE1TSVpFOCAgICAgPSAweDcsICAgICAgLyohPCBNc2l6ZSA4IGFuZCBSWF9XTUFSSyA2NCAgICAgKi8NCn0gQUxUX1NETU1DX01VTFRfVFJBTlNfdDsNCg0KLyohDQogKiBHZXRzIHRoZSBjb25maWd1cmVkIEZJRk8gb3BlcmF0aW9uYWwgcGFyYW1ldGVyIHZhbHVlcy4NCiAqDQogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIEZJRk8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgc2V0IGZvciB0aGUgcmVjZWl2ZSBhbmQNCiAqIHRyYW5zbWl0IHdhdGVybWFyayB0aHJlc2hvbGQgdmFsdWVzIGFuZCB0aGUgRE1BIG11bHRpcGxlIHRyYW5zYWN0aW9uIHNpemUuDQogKg0KICogXHBhcmFtICAgICAgIHJ4X3d0cm1rDQogKiAgICAgICAgICAgICAgW291dF0gRklGTyB0aHJlc2hvbGQgd2F0ZXJtYXJrIHZhbHVlIHdoZW4gcmVjZWl2aW5nIGRhdGEgdG8gY2FyZC4NCiAqDQogKiBccGFyYW0gICAgICAgdHhfd3RybWsNCiAqICAgICAgICAgICAgICBbb3V0XSBGSUZPIHRocmVzaG9sZCB3YXRlcm1hcmsgdmFsdWUgd2hlbiB0cmFuc21pdHRpbmcgZGF0YSB0byBjYXJkLg0KICoNCiAqIFxwYXJhbSAgICAgICBtdWx0X3RyYW5zX3NpemUNCiAqICAgICAgICAgICAgICBbb3V0XSBCdXJzdCBzaXplIG9mIG11bHRpcGxlIHRyYW5zYWN0aW9uLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgVGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgVGhlIG9wZXJhdGlvbiBmYWlsZWQuDQogKi8NCg0KQUxUX1NUQVRVU19DT0RFIGFsdF9zZG1tY19maWZvX3BhcmFtX2dldCh1aW50MzJfdCAqcnhfd3RybWssIHVpbnQzMl90ICp0eF93dHJtaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMVF9TRE1NQ19NVUxUX1RSQU5TX3QgKm11bHRfdHJhbnNfc2l6ZSk7DQoNCi8qIQ0KICogU2V0cyB0aGUgY29uZmlndXJlZCBGSUZPIG9wZXJhdGlvbmFsIHBhcmFtZXRlciB2YWx1ZXMuDQogKg0KICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBGSUZPIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGZvciB0aGUgcmVjZWl2ZSBhbmQNCiAqIHRyYW5zbWl0IHdhdGVybWFyayB0aHJlc2hvbGQgdmFsdWVzIGFuZCB0aGUgRE1BIG11bHRpcGxlIHRyYW5zYWN0aW9uIHNpemUuDQogKg0KICogXHBhcmFtICAgICAgIHJ4X3d0cm1rDQogKiAgICAgICAgICAgICAgRklGTyB0aHJlc2hvbGQgd2F0ZXJtYXJrIHZhbHVlIHdoZW4gcmVjZWl2aW5nIGRhdGEgdG8gY2FyZC4NCiAqDQogKiBccGFyYW0gICAgICAgdHhfd3RybWsNCiAqICAgICAgICAgICAgICBGSUZPIHRocmVzaG9sZCB3YXRlcm1hcmsgdmFsdWUgd2hlbiB0cmFuc21pdHRpbmcgZGF0YSB0byBjYXJkLg0KICoNCiAqIFxwYXJhbSAgICAgICBtdWx0X3RyYW5zX3NpemUNCiAqICAgICAgICAgICAgICBCdXJzdCBzaXplIG9mIG11bHRpcGxlIHRyYW5zYWN0aW9uLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgVGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgVGhlIG9wZXJhdGlvbiBmYWlsZWQuDQogKi8NCkFMVF9TVEFUVVNfQ09ERSBhbHRfc2RtbWNfZmlmb19wYXJhbV9zZXQodWludDMyX3Qgcnhfd3RybWssIHVpbnQzMl90IHR4X3d0cm1rLCBBTFRfU0RNTUNfTVVMVF9UUkFOU190IG11bHRfdHJhbnNfc2l6ZSk7DQoNCi8qIQ0KICogUmV0dXJucyB0cnVlIGlmIFNEL01NQyBjb250cm9sbGVyIEZJRk8gaGFzIHJlYWNoZWQgdGhlIHJlY2VpdmUgd2F0ZXJtYXJrIGxldmVsDQogKiBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4NCiAqDQogKiBccmV0dmFsICAgICAgdHJ1ZSAgICAgICAgICAgIFRoZSBGSUZPIGhhcyByZWFjaGVkIHRoZSByZWNlaXZlIHdhdGVybWFyayBsZXZlbC4NCiAqIFxyZXR2YWwgICAgICBmYWxzZSAgICAgICAgICAgVGhlIEZJRk8gaGFzIG5vdCByZWFjaGVkIHRoZSByZWNlaXZlIHdhdGVybWFyayBsZXZlbC4NCiAqICAgICAgICAgICAgICANCiAqIFxpbnRlcm5hbA0KICogXGVuZGludGVybmFsDQogKi8NCmJvb2wgYWx0X3NkbW1jX2ZpZm9faXNfcnhfd3RybWtfcmVhY2hlZCh2b2lkKTsNCg0KLyohDQogKiBSZXR1cm5zIHRydWUgaWYgU0QvTU1DIGNvbnRyb2xsZXIgRklGTyBoYXMgcmVhY2hlZCB0aGUgdHJhbnNtaXQgd2F0ZXJtYXJrIGxldmVsDQogKiBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4NCiAqDQogKiBccmV0dmFsICAgICAgdHJ1ZSAgICAgICAgICAgIFRoZSBGSUZPIGhhcyByZWFjaGVkIHRoZSB0cmFuc21pdCB3YXRlcm1hcmsgbGV2ZWwuDQogKiBccmV0dmFsICAgICAgZmFsc2UgICAgICAgICAgIFRoZSBGSUZPIGhhcyBub3QgcmVhY2hlZCB0aGUgdHJhbnNtaXQgd2F0ZXJtYXJrIGxldmVsLg0KICogICAgICAgICAgICAgIA0KICogXGludGVybmFsDQogKiBcZW5kaW50ZXJuYWwNCiAqLw0KYm9vbCBhbHRfc2RtbWNfZmlmb19pc190eF93dHJta19yZWFjaGVkKHZvaWQpOw0KDQovKiENCiAqIFJldHVybnMgdHJ1ZSBpZiBTRC9NTUMgY29udHJvbGxlciBGSUZPIGlzIGVtcHR5IG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLg0KICoNCiAqIFxyZXR2YWwgICAgICB0cnVlICAgICAgICAgICAgVGhlIEZJRk8gaXMgZW1wdHkuDQogKiBccmV0dmFsICAgICAgZmFsc2UgICAgICAgICAgIFRoZSBGSUZPIGlzIG5vdCBlbXB0eS4NCiAqICAgICAgICAgICAgICANCiAqIFxpbnRlcm5hbA0KICogXGVuZGludGVybmFsDQogKi8NCmJvb2wgYWx0X3NkbW1jX2ZpZm9faXNfZW1wdHkodm9pZCk7DQoNCi8qIQ0KICogUmV0dXJucyB0cnVlIGlmIFNEL01NQyBjb250cm9sbGVyIEZJRk8gaXMgZnVsbCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4NCiAqDQogKiBccmV0dmFsICAgICAgdHJ1ZSAgICAgICAgICAgIFRoZSBGSUZPIGlzIGZ1bGwuDQogKiBccmV0dmFsICAgICAgZmFsc2UgICAgICAgICAgIFRoZSBGSUZPIGlzIG5vdCBmdWxsLg0KICogICAgICAgICAgICAgIA0KICogXGludGVybmFsDQogKiBcZW5kaW50ZXJuYWwNCiAqLw0KYm9vbCBhbHRfc2RtbWNfZmlmb19pc19mdWxsKHZvaWQpOw0KDQovKiENCiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWxsZWQgRklGTyBsb2NhdGlvbnMuDQogKg0KICogXHJldHVybnMgICAgIFRoZSBudW1iZXIgb2YgZmlsbGVkIEZJRk8gbG9jYXRpb25zLg0KICovDQppbnQzMl90IGFsdF9zZG1tY19maWZvX2NvdW50KHZvaWQpOw0KDQovKiENCiAqIFJlYWQgZGF0YSBmcm9tIHRoZSBTRC9NTUMgY29udHJvbGxlciBGSUZPLg0KICoNCiAqIFJlYWRzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzIChyb3VuZGVkIHVwIHRvIG5lYXJlc3Qgd2hvbGUgMzItYml0IHdvcmQpDQogKiBmcm9tIHRoZSBGSUZPLiBUaGUgZnVuY3Rpb24gcmV0dXJucyB3aGVuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzIGhhcyBiZWVuDQogKiByZWFkIGZyb20gdGhlIEZJRk8gb3IgaWYgYW4gZXJyb3Igb2NjdXJzLg0KICoNCiAqIFxwYXJhbSAgICAgICBkZXN0DQogKiAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIGEgdXNlciBzdXBwbGllZCBkZXN0aW5hdGlvbiBidWZmZXIgZm9yIHRoZSBkYXRhIHJlYWQNCiAqICAgICAgICAgICAgICBmcm9tIHRoZSBGSUZPLiBUaGUgYnVmZmVyIG11c3QgYmUgYXMgbGFyZ2UgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YNCiAqICAgICAgICAgICAgICBieXRlcyByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IDMyLWJpdCB3b3JkIHNpemUuDQogKg0KICogXHBhcmFtICAgICAgIHNpemUNCiAqICAgICAgICAgICAgICBUaGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIEZJRk8uDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBTdWNjZXNzZnVsIHN0YXR1cy4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgRGV0YWlscyBhYm91dCBlcnJvciBzdGF0dXMgY29kZQ0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2ZpZm9fcmVhZCh2b2lkICpkZXN0LCBjb25zdCBzaXplX3Qgc2l6ZSk7DQoNCi8qIQ0KICogV3JpdGVzIGRhdGEgdG8gdGhlIFNEL01NQyBjb250cm9sbGVyIEZJRk8uDQogKg0KICogV3JpdGVzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzIChyb3VuZGVkIHVwIHRvIG5lYXJlc3Qgd2hvbGUgMzItYml0IHdvcmQpDQogKiB0byB0aGUgRklGTy4gVGhlIGZ1bmN0aW9uIHJldHVybnMgd2hlbiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBoYXMgYmVlbg0KICogd3JpdHRlbiB0byB0aGUgRklGTyBvciBpZiBhbiBlcnJvciBvY2N1cnMuDQogKg0KICogXHBhcmFtICAgICAgIHNyYw0KICogICAgICAgICAgICAgIEEgcG9pbnRlciB0byANCiAqICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZQ0KICogICAgICAgICAgICAgIEZJRk8uIFRoZSBidWZmZXIgbXVzdCBiZSBhcyBsYXJnZSB0aGUgcmVxdWVzdGVkIG51bWJlciBvZg0KICogICAgICAgICAgICAgIGJ5dGVzIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3QgMzItYml0IHdvcmQgc2l6ZS4NCiAqDQogKiBccGFyYW0gICAgICAgc2l6ZQ0KICogICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgdG8gdGhlIEZJRk8uIElmIHNpemUgaXMgbm90IGENCiAqICAgICAgICAgICAgICBtdWx0aXBsZSBvZiA0IHRoZW4gdGhlIG51bWJlciBvZiBieXRlcyBpcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0DQogKiAgICAgICAgICAgICAgMzItYnV0IHdvcmQgc2l6ZSBhbmQgdGhlIGJ5dGUgZGlmZmVyZW5jZSBwYWRkZWQgd2l0aCB6ZXJvZXMuDQogKg0KICogXHJldHZhbCAgICAgIEFMVF9FX1NVQ0NFU1MgICBTdWNjZXNzZnVsIHN0YXR1cy4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgRGV0YWlscyBhYm91dCBlcnJvciBzdGF0dXMgY29kZQ0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX2ZpZm9fd3JpdGUoY29uc3Qgdm9pZCAqc3JjLCBjb25zdCBzaXplX3Qgc2l6ZSk7DQoNCi8qISBAfSAqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyohIFxhZGR0b2dyb3VwIEFMVF9TRE1NQ19CTEtJTyBHZW5lcmFsIFB1cnBvc2UgQmxvY2sgSS9PDQogKg0KICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGdyb3VwIHByb3ZpZGUgZ2VuZXJhbCBwdXJwb3NlIGJsb2NrIHJlYWQgYW5kIHdyaXRlIGZsYXNoDQogKiBmdW5jdGlvbnMuDQogKg0KICogQHsNCiAqLw0KDQovKiENCiAqIFJlYWRzIGEgYmxvY2sgb2YgZGF0YSBmcm9tIHRoZSBTRC9NTUMgZmxhc2ggY2FyZC4NCiAqDQogKiBSZWFkcyBhIGJsb2NrIG9mIFxlIHNpemUgZGF0YSBieXRlcyBmcm9tIHRoZSBTRC9NTUMgZmxhc2ggXGUgc3JjIGFkZHJlc3MgaW50byB0aGUNCiAqIHVzZXIgc3VwcGxpZWQgXGUgZGVzdCBidWZmZXIuDQogKg0KICogXHBhcmFtICAgICAgIGRlc3QNCiAqICAgICAgICAgICAgICBUaGUgYWRkcmVzcyBvZiBhIGNhbGxlciBzdXBwbGllZCBkZXN0aW5hdGlvbiBidWZmZXIgaW4gc3lzdGVtDQogKiAgICAgICAgICAgICAgbWVtb3J5IGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSByZXF1ZXN0ZWQgYmxvY2sgb2YgZmxhc2ggZGF0YS4NCiAqDQogKiBccGFyYW0gICAgICAgc3JjDQogKiAgICAgICAgICAgICAgVGhlIGZsYXNoIG1lbW9yeSBhZGRyZXNzIHRvIGJlZ2luIHJlYWRpbmcgZGF0YSBmcm9tLg0KICoNCiAqIFxwYXJhbSAgICAgICBzaXplDQogKiAgICAgICAgICAgICAgVGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgZGF0YSBieXRlcyB0byByZWFkIGZyb20gdGhlIGZsYXNoIGRldmljZS4NCiAqDQogKiBccmV0dmFsICAgICAgQUxUX0VfU1VDQ0VTUyAgIFRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuDQogKiBccmV0dmFsICAgICAgQUxUX0VfRVJST1IgICAgIFRoZSBvcGVyYXRpb24gZmFpbGVkLg0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX3JlYWQodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCBjb25zdCBzaXplX3Qgc2l6ZSk7DQoNCi8qIQ0KICogV3JpdGUgYSBibG9jayBvZiBkYXRhIHRvIHRoZSBTRC9NTUMgZmxhc2ggY2FyZC4NCiAqDQogKiBXcml0ZXMgYSBibG9jayBvZiBcZSBzaXplIGRhdGEgYnl0ZXMgdG8gdGhlIFNEL01NQyBmbGFzaCBcZSBkZXN0IGFkZHJlc3MgZnJvbSB0aGUNCiAqIGRlc2lnbmF0ZWQgXGUgc3JjIGJ1ZmZlci4gVGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgZmxhc2ggY2FyZCBpcw0KICogXGUgc2l6ZSBieXRlcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IHdob2xlIG11bHRpcGxlIGZsYXNoIGNhcmQgYmxvY2sgc2l6ZS4gVGhhdA0KICogaXM6IA0KICogXGUgYWN0dWFsX2J5dGVzX3dyaXR0ZW4gPSAoKFxlIHNpemUgLyBcZSBmbGFzaF9ibG9ja19zaXplKSArIDEpICogXGUgZmxhc2hfYmxvY2tfc2l6ZQ0KICoNCiAqDQogKiBccGFyYW0gICAgICAgZGVzdA0KICogICAgICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBmbGFzaCBtZW1vcnkgYWRkcmVzcyB0byBiZWdpbiB3cml0aW5nIGRhdGEgdG8uDQogKg0KICogXHBhcmFtICAgICAgIHNyYw0KICogICAgICAgICAgICAgIFRoZSBzb3VyY2UgYWRkcmVzcyBpbiBzeXN0ZW0gbWVtb3J5IHRvIGJlZ2luIHdyaXRpbmcgZGF0YSBmcm9tLg0KICoNCiAqIFxwYXJhbSAgICAgICBzaXplDQogKiAgICAgICAgICAgICAgVGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgZGF0YSBieXRlcyB0byB3cml0ZSB0byB0aGUgZmxhc2ggZGV2aWNlLg0KICoNCiAqIFxyZXR2YWwgICAgICBBTFRfRV9TVUNDRVNTICAgSW5kaWNhdGVzIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4NCiAqIFxyZXR2YWwgICAgICBBTFRfRV9FUlJPUiAgICAgSW5kaWNhdGVzIGFuIGVycm9yIG9jY3VycmVkLg0KICovDQpBTFRfU1RBVFVTX0NPREUgYWx0X3NkbW1jX3dyaXRlKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgY29uc3Qgc2l6ZV90IHNpemUpOw0KDQovKiEgQH0gKi8NCg0KLyohIEB9ICovDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KfQ0KI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLw0KDQojZW5kaWYgIC8qIF9fQUxUX1NETU1DX0hfXyAqLw0K