LyoNCglGcmVlUlRPUy5vcmcgVjUuMi4wIC0gQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgUmljaGFyZCBCYXJyeS4NCg0KCVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlUlRPUy5vcmcgZGlzdHJpYnV0aW9uLg0KDQoJRnJlZVJUT1Mub3JnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgDQoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyKSBhcyBwdWJsaXNoZWQNCglieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBtb2RpZmllZCBieSB0aGUgRnJlZVJUT1MgZXhjZXB0aW9uLg0KDQoJRnJlZVJUT1Mub3JnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCWJ1dCBXSVRIT1VUDQoJQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIA0KCUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgDQoJbW9yZSBkZXRhaWxzLg0KDQoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgDQoJd2l0aCBGcmVlUlRPUy5vcmc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgDQoJVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQS4NCg0KCUEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBpcyBpbmNsdWRlZCB0byBhbGxvdyB5b3UgdG8gZGlzdHJpYnV0ZSBhIA0KCWNvbWJpbmVkIHdvcmsgdGhhdCBpbmNsdWRlcyBGcmVlUlRPUy5vcmcgd2l0aG91dCBiZWluZyBvYmxpZ2VkIHRvIHByb3ZpZGUNCgl0aGUgc291cmNlIGNvZGUgZm9yIGFueSBwcm9wcmlldGFyeSBjb21wb25lbnRzLiAgU2VlIHRoZSBsaWNlbnNpbmcgc2VjdGlvbg0KCW9mIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIGZvciBmdWxsIGRldGFpbHMuDQoNCg0KCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KCSogR2V0IHRoZSBGcmVlUlRPUyBlQm9vayEgIFNlZSBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9Eb2N1bWVudGF0aW9uICAgICAgKg0KCSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KCSogVGhpcyBpcyBhIGNvbmNpc2UsIHN0ZXAgYnkgc3RlcCwgJ2hhbmRzIG9uJyBndWlkZSB0aGF0IGRlc2NyaWJlcyBib3RoICAgKg0KCSogZ2VuZXJhbCBtdWx0aXRhc2tpbmcgY29uY2VwdHMgYW5kIEZyZWVSVE9TIHNwZWNpZmljcy4gSXQgcHJlc2VudHMgYW5kICAgKg0KCSogZXhwbGFpbnMgbnVtZXJvdXMgZXhhbXBsZXMgdGhhdCBhcmUgd3JpdHRlbiB1c2luZyB0aGUgRnJlZVJUT1MgQVBJLiAgICAgKg0KCSogRnVsbCBzb3VyY2UgY29kZSBmb3IgYWxsIHRoZSBleGFtcGxlcyBpcyBwcm92aWRlZCBpbiBhbiBhY2NvbXBhbnlpbmcgICAgKg0KCSogLnppcCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KCSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQoJMSB0YWIgPT0gNCBzcGFjZXMhDQoNCglQbGVhc2UgZW5zdXJlIHRvIHJlYWQgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHJlbGV2YW50IHBvcnQgc2VjdGlvbnMgb2YgdGhlDQoJb25saW5lIGRvY3VtZW50YXRpb24uDQoNCglodHRwOi8vd3d3LkZyZWVSVE9TLm9yZyAtIERvY3VtZW50YXRpb24sIGxhdGVzdCBpbmZvcm1hdGlvbiwgbGljZW5zZSBhbmQNCgljb250YWN0IGRldGFpbHMuDQoNCglodHRwOi8vd3d3LlNhZmVSVE9TLmNvbSAtIEEgdmVyc2lvbiB0aGF0IGlzIGNlcnRpZmllZCBmb3IgdXNlIGluIHNhZmV0eQ0KCWNyaXRpY2FsIHN5c3RlbXMuDQoNCglodHRwOi8vd3d3Lk9wZW5SVE9TLmNvbSAtIENvbW1lcmNpYWwgc3VwcG9ydCwgZGV2ZWxvcG1lbnQsIHBvcnRpbmcsDQoJbGljZW5zaW5nIGFuZCB0cmFpbmluZyBzZXJ2aWNlcy4NCiovDQoNCi8qDQogKiBCYXNpYyBpbnRlcnJ1cHQgZHJpdmVuIGRyaXZlciBmb3IgdGhlIEVNQUMgcGVyaXBoZXJhbC4gIFRoaXMgZHJpdmVyIGlzIG5vdA0KICogcmVlbnRyYW50IGFzIHdpdGggdUlQIHRoZSBidWZmZXJzIGFyZSBvbmx5IGV2ZXIgYWNjZXNzZWQgZnJvbSBhIHNpbmdsZSB0YXNrLg0KICoNCiAqIFRoZSBzaW1wbGUgYnVmZmVyIG1hbmFnZW1lbnQgdXNlZCB3aXRoaW4gdUlQIGFsbG93cyB0aGUgRU1BQyBkcml2ZXIgdG8gYWxzbw0KICogYmUgc2ltcGxpc3RpYy4gIFRoZSBkcml2ZXIgY29udGFpbmVkIHdpdGhpbiB0aGUgbHdJUCBkZW1vIGlzIG1vcmUNCiAqIGNvbXByZWhlbnNpdmUuDQogKi8NCg0KDQovKg0KQ2hhbmdlcyBmcm9tIFYzLjIuMg0KDQoJKyBDb3JyZWN0ZWQgdGhlIGJ5dGUgb3JkZXIgd2hlbiB3cml0aW5nIHRoZSBNQUMgYWRkcmVzcyB0byB0aGUgTUFDLg0KCSsgU3VwcG9ydCBhZGRlZCBmb3IgTUlJIGludGVyZmFjZXMuICBQcmV2aW91c2x5IG9ubHkgUk1JSSB3YXMgc3VwcG9ydGVkLg0KDQpDaGFuZ2VzIGZyb20gVjMuMi4zDQoNCgkrIFRoZSBNSUkgaW50ZXJmYWNlIGlzIG5vdyB0aGUgZGVmYXVsdC4NCgkrIE1vZGlmaWVkIHRoZSBpbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSBzbGlnaHRseSB0byBhbGxvdyBhdXRvIGluaXQgbW9yZQ0KCSAgdGltZSB0byBjb21wbGV0ZS4NCg0KQ2hhbmdlcyBmcm9tIFYzLjIuNA0KDQoJKyBBbHNvIHJlYWQgdGhlIEVNQUNfUlNSIHJlZ2lzdGVyIGluIHRoZSBFTUFDIElTUiBhcyBhIHdvcmsgYXJvdW5kIHRoZSANCgkgIHRoZSBFTUFDIGJ1ZyB0aGF0IGNhbiByZXNldCB0aGUgUlggYml0IGluIEVNQUNfSVNSIHJlZ2lzdGVyIGJlZm9yZSB0aGUNCgkgIGJpdCBoYXMgYmVlbiByZWFkLg0KDQpDaGFuZ2VzIGZyb20gVjQuMC40DQoNCgkrIENvcnJlY3RlZCB0aGUgUnggZnJhbWUgbGVuZ3RoIG1hc2sgd2hlbiBvYnRhaW5pbmcgdGhlIGxlbmd0aCBmcm9tIHRoZQ0KCSAgcnggZGVzY3JpcHRvci4NCg0KKi8NCg0KLyogU3RhbmRhcmQgaW5jbHVkZXMuICovDQojaW5jbHVkZSA8c3RyaW5nLmg+DQoNCi8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJGcmVlUlRPUy5oIg0KI2luY2x1ZGUgInNlbXBoci5oIg0KI2luY2x1ZGUgInRhc2suaCINCg0KLyogdUlQIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgInVpcC5oIg0KDQovKiBIYXJkd2FyZSBzcGVjaWZpYyBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJFbWFjLmgiDQojaW5jbHVkZSAibWlpLmgiDQoNCg0KLyogVVNFX1JNSUlfSU5URVJGQUNFIG11c3QgYmUgZGVmaW5lZCBhcyAxIHRvIHVzZSBhbiBSTUlJIGludGVyZmFjZSwgb3IgMA0KdG8gdXNlIGFuIE1JSSBpbnRlcmZhY2UuICovDQojZGVmaW5lIFVTRV9STUlJX0lOVEVSRkFDRSAwDQoNCi8qIFRoZSBidWZmZXIgYWRkcmVzc2VzIHdyaXR0ZW4gaW50byB0aGUgZGVzY3JpcHRvcnMgbXVzdCBiZSBhbGlnbmVkIHNvIHRoZQ0KbGFzdCBmZXcgYml0cyBhcmUgemVyby4gIFRoZXNlIGJpdHMgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBFTUFDDQpwZXJpcGhlcmFsIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBhZGRyZXNzLiAqLw0KI2RlZmluZSBlbWFjQUREUkVTU19NQVNLCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgMHhGRkZGRkZGQyApDQoNCi8qIEJpdCB1c2VkIHdpdGhpbiB0aGUgYWRkcmVzcyBzdG9yZWQgaW4gdGhlIGRlc2NyaXB0b3IgdG8gbWFyayB0aGUgbGFzdA0KZGVzY3JpcHRvciBpbiB0aGUgYXJyYXkuICovDQojZGVmaW5lIGVtYWNSWF9XUkFQX0JJVAkJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSAweDAyICkNCg0KLyogQml0IHVzZWQgd2l0aGluIHRoZSBUeCBkZXNjcmlwdG9yIHN0YXR1cyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQ0KZGVzY3JpcHRvciBpcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgRU1BQyBvciB0aGUgc29mdHdhcmUuICovDQojZGVmaW5lIGVtYWNUWF9CVUZfVVNFRAkJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSAweDgwMDAwMDAwICkNCg0KLyogQSBzaG9ydCBkZWxheSBpcyB1c2VkIHRvIHdhaXQgZm9yIGEgYnVmZmVyIHRvIGJlY29tZSBhdmFpbGFibGUsIHNob3VsZA0Kb25lIG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgd2hlbiB0cnlpbmcgdG8gdHJhbnNtaXQgYSBmcmFtZS4gKi8NCiNkZWZpbmUgZW1hY0JVRkZFUl9XQUlUX0RFTEFZCQkoIDIgKQ0KI2RlZmluZSBlbWFjTUFYX1dBSVRfQ1lDTEVTCQkJKCBjb25maWdUSUNLX1JBVEVfSFogLyA0MCApDQoNCi8qIE1pc2MgZGVmaW5lcy4gKi8NCiNkZWZpbmUgZW1hY0lOVEVSUlVQVF9MRVZFTAkJCSggNSApDQojZGVmaW5lIGVtYWNOT19ERUxBWQkJCQkoIDAgKQ0KI2RlZmluZSBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUJKCA1NCApDQojZGVmaW5lIGVtYWNQSFlfSU5JVF9ERUxBWQkJCSggNTAwMCAvIHBvcnRUSUNLX1JBVEVfTVMgKQ0KI2RlZmluZSBlbWFjUkVTRVRfS0VZCQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIDB4QTUwMDAwMDAgKQ0KI2RlZmluZSBlbWFjUkVTRVRfTEVOR1RICQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgKCAweDAxIDw8IDggKSApDQoNCi8qIFRoZSBBdG1lbCBoZWFkZXIgZmlsZSBvbmx5IGRlZmluZXMgdGhlIFRYIGZyYW1lIGxlbmd0aCBtYXNrLiAqLw0KI2RlZmluZSBlbWFjUlhfTEVOR1RIX0ZSQU1FCQkJKCAweGZmZiApDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKg0KICogUHJvdG90eXBlIGZvciB0aGUgRU1BQyBpbnRlcnJ1cHQgYXNtIHdyYXBwZXIuDQogKi8NCmV4dGVybiB2b2lkIHZFTUFDSVNSRW50cnkoIHZvaWQgKTsNCg0KLyoNCiAqIFByb3RvdHlwZSBmb3IgdGhlIEVNQUMgaW50ZXJydXB0IGZ1bmN0aW9uIC0gY2FsbGVkIGJ5IHRoZSBhc20gd3JhcHBlci4NCiAqLw0KX19hcm0gdm9pZCB2RU1BQ0lTUiggdm9pZCApOw0KDQovKg0KICogSW5pdGlhbGlzZSBib3RoIHRoZSBUeCBhbmQgUnggZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgRU1BQy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBEZXNjcmlwdG9ycyh2b2lkKTsNCg0KLyoNCiAqIFdyaXRlIG91ciBNQUMgYWRkcmVzcyBpbnRvIHRoZSBFTUFDLiAgVGhlIE1BQyBhZGRyZXNzIGlzIHNldCBhcyBvbmUgb2YgdGhlDQogKiB1aXAgb3B0aW9ucy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBNQUNBZGRyZXNzKCB2b2lkICk7DQoNCi8qDQogKiBDb25maWd1cmUgdGhlIEVNQUMgYW5kIEFJQyBmb3IgRU1BQyBpbnRlcnJ1cHRzLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoIHZvaWQgKTsNCg0KLyoNCiAqIFNvbWUgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zIHRha2VuIGZyb20gdGhlIEF0bWVsIEVNQUMgc2FtcGxlIGNvZGUuDQogKi8NCnN0YXRpYyB2b2lkIHZSZWFkUEhZKCB1bnNpZ25lZCBwb3J0Q0hBUiB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIHBvcnRDSEFSIHVjQWRkcmVzcywgdW5zaWduZWQgcG9ydExPTkcgKnB1bFZhbHVlICk7DQojaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCglzdGF0aWMgdm9pZCB2V3JpdGVQSFkoIHVuc2lnbmVkIHBvcnRDSEFSIHVjUEhZQWRkcmVzcywgdW5zaWduZWQgcG9ydENIQVIgdWNBZGRyZXNzLCB1bnNpZ25lZCBwb3J0TE9ORyB1bFZhbHVlKTsNCiNlbmRpZg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgeEdldExpbmtTcGVlZCggdm9pZCApOw0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgcHJ2UHJvYmVQSFkoIHZvaWQgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIEJ1ZmZlciB3cml0dGVuIHRvIGJ5IHRoZSBFTUFDIERNQS4gIE11c3QgYmUgYWxpZ25lZCBhcyBkZXNjcmliZWQgYnkgdGhlDQpjb21tZW50IGFib3ZlIHRoZSBlbWFjQUREUkVTU19NQVNLIGRlZmluaXRpb24uICovDQojcHJhZ21hIGRhdGFfYWxpZ25tZW50PTgNCnN0YXRpYyB2b2xhdGlsZSBwb3J0Q0hBUiBwY1J4QnVmZmVyWyBOQl9SWF9CVUZGRVJTICogRVRIX1JYX0JVRkZFUl9TSVpFIF07DQoNCi8qIEJ1ZmZlciByZWFkIGJ5IHRoZSBFTUFDIERNQS4gIE11c3QgYmUgYWxpZ25lZCBhcyBkZXNjcmliZWQgYnkgaGUgY29tbWVudA0KYWJvdmUgdGhlIGVtYWNBRERSRVNTX01BU0sgZGVmaW5pdGlvbi4gKi8NCiNwcmFnbWEgZGF0YV9hbGlnbm1lbnQ9OA0Kc3RhdGljIHBvcnRDSEFSIHBjVHhCdWZmZXJbIE5CX1RYX0JVRkZFUlMgKiBFVEhfVFhfQlVGRkVSX1NJWkUgXTsNCg0KLyogRGVzY3JpcHRvcnMgdXNlZCB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIHRoZSBwcm9ncmFtIGFuZCB0aGUgRU1BQyBwZXJpcGhlcmFsLg0KVGhlc2UgZGVzY3JpcHRvcnMgaG9sZCB0aGUgbG9jYXRpb25zIGFuZCBzdGF0ZSBvZiB0aGUgUnggYW5kIFR4IGJ1ZmZlcnMuICovDQpzdGF0aWMgdm9sYXRpbGUgQVQ5MVNfVHhUZERlc2NyaXB0b3IgeFR4RGVzY3JpcHRvcnNbIE5CX1RYX0JVRkZFUlMgXTsNCnN0YXRpYyB2b2xhdGlsZSBBVDkxU19SeFRkRGVzY3JpcHRvciB4UnhEZXNjcmlwdG9yc1sgTkJfUlhfQlVGRkVSUyBdOw0KDQovKiBUaGUgSVAgYW5kIEV0aGVybmV0IGFkZHJlc3NlcyBhcmUgcmVhZCBmcm9tIHRoZSB1SVAgc2V0dXAuICovDQpjb25zdCBwb3J0Q0hBUiBjTUFDQWRkcmVzc1sgNiBdID0geyBVSVBfRVRIQUREUjAsIFVJUF9FVEhBRERSMSwgVUlQX0VUSEFERFIyLCBVSVBfRVRIQUREUjMsIFVJUF9FVEhBRERSNCwgVUlQX0VUSEFERFI1IH07DQpjb25zdCB1bnNpZ25lZCBjaGFyIHVjSVBBZGRyZXNzWyA0IF0gID0geyBVSVBfSVBBRERSMCwgVUlQX0lQQUREUjEsIFVJUF9JUEFERFIyLCBVSVBfSVBBRERSMyB9Ow0KDQovKiBUaGUgc2VtYXBob3JlIHVzZWQgYnkgdGhlIEVNQUMgSVNSIHRvIHdha2UgdGhlIEVNQUMgdGFzay4gKi8NCnN0YXRpYyB4U2VtYXBob3JlSGFuZGxlIHhTZW1hcGhvcmUgPSBOVUxMOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KeFNlbWFwaG9yZUhhbmRsZSB4RU1BQ0luaXQoIHZvaWQgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKG1vZGlmaWVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBkaXNhYmxlIHB1bGwgdXAgb24gUlhEViA9PiBQSFkgbm9ybWFsIG1vZGUgKG5vdCBpbiB0ZXN0IG1vZGUpLA0KCVBIWSBoYXMgaW50ZXJuYWwgcHVsbCBkb3duLiAqLw0KCUFUOTFDX0JBU0VfUElPQi0+UElPX1BQVURSID0gMSA8PCAxNTsNCg0KCSNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCSAgCS8qIFBIWSBoYXMgaW50ZXJuYWwgcHVsbCBkb3duIDogc2V0IE1JSSBtb2RlLiAqLw0KCSAgCUFUOTFDX0JBU0VfUElPQi0+UElPX1BQVURSPSAxIDw8IDE2Ow0KCSNlbmRpZg0KDQoJLyogY2xlYXIgUEIxOCA8PT4gUEhZIHBvd2VyZG93bi4gKi8NCglBVDkxRl9QSU9fQ2ZnT3V0cHV0KCBBVDkxQ19CQVNFX1BJT0IsIDEgPDwgMTggKSA7DQoJQVQ5MUZfUElPX0NsZWFyT3V0cHV0KCBBVDkxQ19CQVNFX1BJT0IsICAxIDw8IDE4KSA7DQoNCgkvKiBBZnRlciBQSFkgcG93ZXIgdXAsIGhhcmR3YXJlIHJlc2V0LiAqLw0KCUFUOTFDX0JBU0VfUlNUQy0+UlNUQ19STVIgPSBlbWFjUkVTRVRfS0VZIHwgZW1hY1JFU0VUX0xFTkdUSDsNCglBVDkxQ19CQVNFX1JTVEMtPlJTVENfUkNSID0gZW1hY1JFU0VUX0tFWSB8IEFUOTFDX1JTVENfRVhUUlNUOw0KCQ0KCS8qIFdhaXQgZm9yIGhhcmR3YXJlIHJlc2V0IGVuZC4gKi8NCgl3aGlsZSggISggQVQ5MUNfQkFTRV9SU1RDLT5SU1RDX1JTUiAmIEFUOTFDX1JTVENfTlJTVEwgKSApDQoJew0KCQlfX2FzbSggIk5PUCIgKTsNCgl9DQoJX19hc20oICJOT1AiICk7DQogIAkNCgkvKiBFTUFDIElPIGluaXQgZm9yIEVNQUMtUEhZIGNvbS4gUmVtb3ZlIEVGMTAwIGNvbmZpZy4gKi8NCglBVDkxRl9FTUFDX0NmZ1BJTygpOw0KDQoJLyogRW5hYmxlIGNvbSBiZXR3ZWVuIEVNQUMgUEhZLg0KDQoJRW5hYmxlIG1hbmFnZW1lbnQgcG9ydC4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSIHw9IEFUOTFDX0VNQUNfTVBFOwkNCg0KCS8qIE1EQyA9IE1DSy8zMi4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgfD0gKCAyICkgPDwgMTA7CQ0KDQoJLyogV2FpdCBmb3IgUEhZIGF1dG8gaW5pdCBlbmQgKHJhdGhlciBjcnVkZSBkZWxheSEpLiAqLw0KCXZUYXNrRGVsYXkoIGVtYWNQSFlfSU5JVF9ERUxBWSApOw0KDQoJLyogUEhZIGNvbmZpZ3VyYXRpb24uICovDQoJI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQoJew0KCQl1bnNpZ25lZCBwb3J0TE9ORyB1bENvbnRyb2w7DQoNCgkJLyogUEhZIGhhcyBpbnRlcm5hbCBwdWxsIGRvd24gOiBkaXNhYmxlIE1JSSBpc29sYXRlLiAqLw0KCQl2UmVhZFBIWSggQVQ5MUNfUEhZX0FERFIsIE1JSV9CTUNSLCAmdWxDb250cm9sICk7DQoJCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsICZ1bENvbnRyb2wgKTsNCgkJdWxDb250cm9sICY9IH5CTUNSX0lTT0xBVEU7DQoJCXZXcml0ZVBIWSggQVQ5MUNfUEhZX0FERFIsIE1JSV9CTUNSLCB1bENvbnRyb2wgKTsNCgl9DQoJI2VuZGlmDQoNCgkvKiBEaXNhYmxlIG1hbmFnZW1lbnQgcG9ydCBhZ2Fpbi4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSICY9IH5BVDkxQ19FTUFDX01QRTsNCg0KCSNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCQkvKiBFbmFibGUgRU1BQyBpbiBNSUkgbW9kZSwgZW5hYmxlIGNsb2NrIEVSWENLIGFuZCBFVFhDSy4gKi8NCgkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1VTUklPID0gQVQ5MUNfRU1BQ19DTEtFTiA7DQoJI2Vsc2UNCgkJLyogRW5hYmxlIEVNQUMgaW4gUk1JSSBtb2RlLCBlbmFibGUgUk1JSSBjbG9jayAoNTBNSHogZnJvbSBvc2NpbGxhdG9yDQoJCW9uIEVSRkNLKS4gKi8NCgkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1VTUklPID0gQVQ5MUNfRU1BQ19STUlJIHwgQVQ5MUNfRU1BQ19DTEtFTiA7DQoJI2VuZGlmDQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJLyogU2V0dXAgdGhlIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzLiAqLw0KCXBydlNldHVwRGVzY3JpcHRvcnMoKTsNCgkNCgkvKiBMb2FkIG91ciBNQUMgYWRkcmVzcyBpbnRvIHRoZSBFTUFDLiAqLw0KCXBydlNldHVwTUFDQWRkcmVzcygpOw0KDQoJLyogVHJ5IHRvIGNvbm5lY3QuICovDQoJaWYoIHBydlByb2JlUEhZKCkgKQ0KCXsNCgkJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQhICovDQoJCXBydlNldHVwRU1BQ0ludGVycnVwdCgpOw0KCX0NCg0KCXJldHVybiB4U2VtYXBob3JlOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnBvcnRMT05HIGxFTUFDU2VuZCggdm9pZCApDQp7DQpzdGF0aWMgdW5zaWduZWQgcG9ydEJBU0VfVFlQRSB1eFR4QnVmZmVySW5kZXggPSAwOw0KcG9ydEJBU0VfVFlQRSB4V2FpdEN5Y2xlcyA9IDA7DQpwb3J0TE9ORyBsUmV0dXJuID0gcGRQQVNTOw0KcG9ydENIQVIgKnBjQnVmZmVyOw0KDQoJLyogSXMgYSBidWZmZXIgYXZhaWxhYmxlPyAqLw0KCXdoaWxlKCAhKCB4VHhEZXNjcmlwdG9yc1sgdXhUeEJ1ZmZlckluZGV4IF0uVV9TdGF0dXMuc3RhdHVzICYgQVQ5MUNfVFJBTlNNSVRfT0sgKSApDQoJew0KCQkvKiBUaGVyZSBpcyBubyByb29tIHRvIHdyaXRlIHRoZSBUeCBkYXRhIHRvIHRoZSBUeCBidWZmZXIuICBXYWl0IGENCgkJc2hvcnQgd2hpbGUsIHRoZW4gdHJ5IGFnYWluLiAqLw0KCQl4V2FpdEN5Y2xlcysrOw0KCQlpZiggeFdhaXRDeWNsZXMgPiBlbWFjTUFYX1dBSVRfQ1lDTEVTICkNCgkJew0KCQkJLyogR2l2ZSB1cC4gKi8NCgkJCWxSZXR1cm4gPSBwZEZBSUw7DQoJCQlicmVhazsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXZUYXNrRGVsYXkoIGVtYWNCVUZGRVJfV0FJVF9ERUxBWSApOw0KCQl9DQoJfQ0KDQoJLyogbFJldHVybiB3aWxsIG9ubHkgYmUgcGRQQVNTIGlmIGEgYnVmZmVyIGlzIGF2YWlsYWJsZS4gKi8NCglpZiggbFJldHVybiA9PSBwZFBBU1MgKQ0KCXsNCgkJLyogQ29weSB0aGUgaGVhZGVycyBpbnRvIHRoZSBUeCBidWZmZXIuICBUaGVzZSB3aWxsIGJlIGluIHRoZSB1SVAgYnVmZmVyLiAqLw0KCQlwY0J1ZmZlciA9ICggcG9ydENIQVIgKiApIHhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5hZGRyOw0KCQltZW1jcHkoICggdm9pZCAqICkgcGNCdWZmZXIsICggdm9pZCAqICkgdWlwX2J1ZiwgZW1hY1RPVEFMX0ZSQU1FX0hFQURFUl9TSVpFICk7DQoJCWlmKCB1aXBfbGVuID4gZW1hY1RPVEFMX0ZSQU1FX0hFQURFUl9TSVpFICkNCgkJew0KCQkJbWVtY3B5KCAoIHZvaWQgKiApICYoIHBjQnVmZmVyWyBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUgXSApLCAoIHZvaWQgKiApIHVpcF9hcHBkYXRhLCAoIHVpcF9sZW4gLSBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUgKSApOw0KCQl9DQoNCgkJLyogU2VuZC4gKi8JDQoJCXBvcnRFTlRFUl9DUklUSUNBTCgpOw0KCQl7DQoJCQlpZiggdXhUeEJ1ZmZlckluZGV4ID49ICggTkJfVFhfQlVGRkVSUyAtIDEgKSApDQoJCQl7DQoJCQkJLyogRmlsbCBvdXQgdGhlIG5lY2Vzc2FyeSBpbiB0aGUgZGVzY3JpcHRvciB0byBnZXQgdGhlIGRhdGEgc2VudC4gKi8NCgkJCQl4VHhEZXNjcmlwdG9yc1sgdXhUeEJ1ZmZlckluZGV4IF0uVV9TdGF0dXMuc3RhdHVzID0gCSggdWlwX2xlbiAmICggdW5zaWduZWQgcG9ydExPTkcgKSBBVDkxQ19MRU5HVEhfRlJBTUUgKQ0KCQkJCQkJCQkJCQkJCQkJCQkJfCBBVDkxQ19MQVNUX0JVRkZFUg0KCQkJCQkJCQkJCQkJCQkJCQkJfCBBVDkxQ19UUkFOU01JVF9XUkFQOw0KCQkJCXV4VHhCdWZmZXJJbmRleCA9IDA7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJLyogRmlsbCBvdXQgdGhlIG5lY2Vzc2FyeSBpbiB0aGUgZGVzY3JpcHRvciB0byBnZXQgdGhlIGRhdGEgc2VudC4gKi8NCgkJCQl4VHhEZXNjcmlwdG9yc1sgdXhUeEJ1ZmZlckluZGV4IF0uVV9TdGF0dXMuc3RhdHVzID0gCSggdWlwX2xlbiAmICggdW5zaWduZWQgcG9ydExPTkcgKSBBVDkxQ19MRU5HVEhfRlJBTUUgKQ0KCQkJCQkJCQkJCQkJCQkJCQkJfCBBVDkxQ19MQVNUX0JVRkZFUjsNCgkJCQl1eFR4QnVmZmVySW5kZXgrKzsNCgkJCX0NCgkNCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gQVQ5MUNfRU1BQ19UU1RBUlQ7DQoJCX0NCgkJcG9ydEVYSVRfQ1JJVElDQUwoKTsNCgl9DQoNCglyZXR1cm4gbFJldHVybjsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp1bnNpZ25lZCBwb3J0TE9ORyB1bEVNQUNQb2xsKCB2b2lkICkNCnsNCnN0YXRpYyB1bnNpZ25lZCBwb3J0QkFTRV9UWVBFIHVsTmV4dFJ4QnVmZmVyID0gMDsNCnVuc2lnbmVkIHBvcnRMT05HIHVsU2VjdGlvbkxlbmd0aCA9IDAsIHVsTGVuZ3RoU29GYXIgPSAwLCB1bEVPRiA9IHBkRkFMU0U7DQpwb3J0Q0hBUiAqcGNTb3VyY2U7DQoNCgkvKiBTa2lwIGFueSBmcmFnbWVudHMuICovDQoJd2hpbGUoICggeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmIEFUOTFDX09XTkVSU0hJUF9CSVQgKSAmJiAhKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5VX1N0YXR1cy5zdGF0dXMgJiBBVDkxQ19TT0YgKSApDQoJew0KCQkvKiBNYXJrIHRoZSBidWZmZXIgYXMgZnJlZSBhZ2Fpbi4gKi8NCgkJeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmPSB+KCBBVDkxQ19PV05FUlNISVBfQklUICk7CQkNCgkJdWxOZXh0UnhCdWZmZXIrKzsNCgkJaWYoIHVsTmV4dFJ4QnVmZmVyID49IE5CX1JYX0JVRkZFUlMgKQ0KCQl7DQoJCQl1bE5leHRSeEJ1ZmZlciA9IDA7DQoJCX0NCgl9DQoNCgkvKiBJcyB0aGVyZSBhIHBhY2tldCByZWFkeT8gKi8NCg0KCXdoaWxlKCAoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJiBBVDkxQ19PV05FUlNISVBfQklUICkgJiYgIXVsU2VjdGlvbkxlbmd0aCApDQoJew0KCQlwY1NvdXJjZSA9ICggcG9ydENIQVIgKiApKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICYgZW1hY0FERFJFU1NfTUFTSyApOw0KCQl1bFNlY3Rpb25MZW5ndGggPSB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5VX1N0YXR1cy5zdGF0dXMgJiBlbWFjUlhfTEVOR1RIX0ZSQU1FOw0KDQoJCWlmKCB1bFNlY3Rpb25MZW5ndGggPT0gMCApDQoJCXsNCgkJCS8qIFRoZSBmcmFtZSBpcyBsb25nZXIgdGhhbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdGhpcw0KCQkJZGVzY3JpcHRvciBzbyBjb3B5IHRoZSBlbnRpcmUgYnVmZmVyIHRvIHVJUCAtIHRoZW4gbW92ZSBvbnRvDQoJCQl0aGUgbmV4dCBkZXNjcmlwdG9yIHRvIGdldCB0aGUgcmVzdCBvZiB0aGUgZnJhbWUuICovDQoJCQlpZiggKCB1bExlbmd0aFNvRmFyICsgRVRIX1JYX0JVRkZFUl9TSVpFICkgPD0gVUlQX0JVRlNJWkUgKQ0KCQkJew0KCQkJCW1lbWNweSggJiggdWlwX2J1ZlsgdWxMZW5ndGhTb0ZhciBdICksIHBjU291cmNlLCBFVEhfUlhfQlVGRkVSX1NJWkUgKTsNCgkJCQl1bExlbmd0aFNvRmFyICs9IEVUSF9SWF9CVUZGRVJfU0laRTsNCgkJCX0JCQkNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8qIFRoaXMgaXMgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgZnJhbWUuICBDb3B5IHRoZSBzZWN0aW9uIHRvDQoJCQl1SVAuICovDQoJCQlpZiggdWxTZWN0aW9uTGVuZ3RoIDwgVUlQX0JVRlNJWkUgKQ0KCQkJew0KCQkJCS8qIFRoZSBzZWN0aW9uIGxlbmd0aCBob2xkcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUgZnJhbWUuDQoJCQkJdWxMZW5ndGhTb0ZhciBob2xkcyB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSBzZWN0aW9ucyBhbHJlYWR5DQoJCQkJY29waWVkIHRvIHVJUCwgc28gdGhlIGxlbmd0aCBvZiB0aGUgZmluYWwgc2VjdGlvbiBpcw0KCQkJCXVsU2VjdGlvbkxlbmd0aCAtIHVsTGVuZ3RoU29GYXI7ICovDQoJCQkJaWYoIHVsU2VjdGlvbkxlbmd0aCA+IHVsTGVuZ3RoU29GYXIgKQ0KCQkJCXsNCgkJCQkJbWVtY3B5KCAmKCB1aXBfYnVmWyB1bExlbmd0aFNvRmFyIF0gKSwgcGNTb3VyY2UsICggdWxTZWN0aW9uTGVuZ3RoIC0gdWxMZW5ndGhTb0ZhciApICk7DQoJCQkJfQ0KCQkJfQkJCQ0KDQoJCQkvKiBJcyB0aGlzIHRoZSBsYXN0IGJ1ZmZlciBmb3IgdGhlIGZyYW1lPyAgSWYgbm90IHdoeT8gKi8NCgkJCXVsRU9GID0geFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uVV9TdGF0dXMuc3RhdHVzICYgQVQ5MUNfRU9GOw0KCQl9DQoNCgkJLyogTWFyayB0aGUgYnVmZmVyIGFzIGZyZWUgYWdhaW4uICovDQoJCXhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJj0gfiggQVQ5MUNfT1dORVJTSElQX0JJVCApOw0KDQoJCS8qIEluY3JlbWVudCB0byB0aGUgbmV4dCBidWZmZXIsIHdyYXBwaW5nIGlmIG5lY2Vzc2FyeS4gKi8NCgkJdWxOZXh0UnhCdWZmZXIrKzsNCgkJaWYoIHVsTmV4dFJ4QnVmZmVyID49IE5CX1JYX0JVRkZFUlMgKQ0KCQl7DQoJCQl1bE5leHRSeEJ1ZmZlciA9IDA7DQoJCX0NCgl9DQoNCgkvKiBJZiB3ZSBvYnRhaW5lZCBkYXRhIGJ1dCBmb3Igc29tZSByZWFzb24gZGlkIG5vdCBmaW5kIHRoZSBlbmQgb2YgdGhlDQoJZnJhbWUgdGhlbiBkaXNjYXJkIHRoZSBkYXRhIGFzIGl0IG11c3QgY29udGFpbiBhbiBlcnJvci4gKi8NCglpZiggIXVsRU9GICkNCgl7DQoJCXVsU2VjdGlvbkxlbmd0aCA9IDA7DQoJfQ0KDQoJcmV0dXJuIHVsU2VjdGlvbkxlbmd0aDsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cERlc2NyaXB0b3JzKHZvaWQpDQp7DQp1bnNpZ25lZCBwb3J0QkFTRV9UWVBFIHhJbmRleDsNCnVuc2lnbmVkIHBvcnRMT05HIHVsQWRkcmVzczsNCg0KCS8qIEluaXRpYWxpc2UgeFJ4RGVzY3JpcHRvcnMgZGVzY3JpcHRvci4gKi8NCglmb3IoIHhJbmRleCA9IDA7IHhJbmRleCA8IE5CX1JYX0JVRkZFUlM7ICsreEluZGV4ICkNCgl7DQoJCS8qIENhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbnRoIGJ1ZmZlciB3aXRoaW4gdGhlIGFycmF5LiAqLw0KCQl1bEFkZHJlc3MgPSAoIHVuc2lnbmVkIHBvcnRMT05HICkoIHBjUnhCdWZmZXIgKyAoIHhJbmRleCAqIEVUSF9SWF9CVUZGRVJfU0laRSApICk7DQoNCgkJLyogV3JpdGUgdGhlIGJ1ZmZlciBhZGRyZXNzIGludG8gdGhlIGRlc2NyaXB0b3IuICBUaGUgRE1BIHdpbGwgcGxhY2UNCgkJdGhlIGRhdGEgYXQgdGhpcyBhZGRyZXNzIHdoZW4gdGhpcyBkZXNjcmlwdG9yIGlzIGJlaW5nIHVzZWQuICBNYXNrIG9mZg0KCQl0aGUgYm90dG9tIGJpdHMgb2YgdGhlIGFkZHJlc3MgYXMgdGhlc2UgaGF2ZSBzcGVjaWFsIG1lYW5pbmcuICovDQoJCXhSeERlc2NyaXB0b3JzWyB4SW5kZXggXS5hZGRyID0gdWxBZGRyZXNzICYgZW1hY0FERFJFU1NfTUFTSzsNCgl9CQ0KDQoJLyogVGhlIGxhc3QgYnVmZmVyIGhhcyB0aGUgd3JhcCBiaXQgc2V0IHNvIHRoZSBFTUFDIGtub3dzIHRvIHdyYXAgYmFjaw0KCXRvIHRoZSBmaXJzdCBidWZmZXIuICovDQoJeFJ4RGVzY3JpcHRvcnNbIE5CX1JYX0JVRkZFUlMgLSAxIF0uYWRkciB8PSBlbWFjUlhfV1JBUF9CSVQ7DQoNCgkvKiBJbml0aWFsaXNlIHhUeERlc2NyaXB0b3JzLiAqLw0KCWZvciggeEluZGV4ID0gMDsgeEluZGV4IDwgTkJfVFhfQlVGRkVSUzsgKyt4SW5kZXggKQ0KCXsNCgkJLyogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBudGggYnVmZmVyIHdpdGhpbiB0aGUgYXJyYXkuICovDQoJCXVsQWRkcmVzcyA9ICggdW5zaWduZWQgcG9ydExPTkcgKSggcGNUeEJ1ZmZlciArICggeEluZGV4ICogRVRIX1RYX0JVRkZFUl9TSVpFICkgKTsNCg0KCQkvKiBXcml0ZSB0aGUgYnVmZmVyIGFkZHJlc3MgaW50byB0aGUgZGVzY3JpcHRvci4gIFRoZSBETUEgd2lsbCByZWFkDQoJCWRhdGEgZnJvbSBoZXJlIHdoZW4gdGhlIGRlc2NyaXB0b3IgaXMgYmVpbmcgdXNlZC4gKi8NCgkJeFR4RGVzY3JpcHRvcnNbIHhJbmRleCBdLmFkZHIgPSB1bEFkZHJlc3MgJiBlbWFjQUREUkVTU19NQVNLOw0KCQl4VHhEZXNjcmlwdG9yc1sgeEluZGV4IF0uVV9TdGF0dXMuc3RhdHVzID0gQVQ5MUNfVFJBTlNNSVRfT0s7DQoJfQkNCg0KCS8qIFRoZSBsYXN0IGJ1ZmZlciBoYXMgdGhlIHdyYXAgYml0IHNldCBzbyB0aGUgRU1BQyBrbm93cyB0byB3cmFwIGJhY2sNCgl0byB0aGUgZmlyc3QgYnVmZmVyLiAqLw0KCXhUeERlc2NyaXB0b3JzWyBOQl9UWF9CVUZGRVJTIC0gMSBdLlVfU3RhdHVzLnN0YXR1cyA9IEFUOTFDX1RSQU5TTUlUX1dSQVAgfCBBVDkxQ19UUkFOU01JVF9PSzsNCg0KCS8qIFRlbGwgdGhlIEVNQUMgd2hlcmUgdG8gZmluZCB0aGUgZGVzY3JpcHRvcnMuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1JCUVAgPSAoIHVuc2lnbmVkIHBvcnRMT05HICkgeFJ4RGVzY3JpcHRvcnM7DQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1RCUVAgPSAoIHVuc2lnbmVkIHBvcnRMT05HICkgeFR4RGVzY3JpcHRvcnM7DQoJDQoJLyogQ2xlYXIgYWxsIHRoZSBiaXRzIGluIHRoZSByZWNlaXZlIHN0YXR1cyByZWdpc3Rlci4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfUlNSID0gKCBBVDkxQ19FTUFDX09WUiB8IEFUOTFDX0VNQUNfUkVDIHwgQVQ5MUNfRU1BQ19CTkEgKTsNCg0KCS8qIEVuYWJsZSB0aGUgY29weSBvZiBkYXRhIGludG8gdGhlIGJ1ZmZlcnMsIGlnbm9yZSBicm9hZGNhc3RzLA0KCWFuZCBkb24ndCBjb3B5IEZDUy4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgfD0gKCBBVDkxQ19FTUFDX0NBRiB8IEFUOTFDX0VNQUNfTkJDIHwgQVQ5MUNfRU1BQ19EUkZDUyk7DQoNCgkvKiBFbmFibGUgUnggYW5kIFR4LCBwbHVzIHRoZSBzdGF0cyByZWdpc3Rlci4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSIHw9ICggQVQ5MUNfRU1BQ19URSB8IEFUOTFDX0VNQUNfUkUgfCBBVDkxQ19FTUFDX1dFU1RBVCApOw0KfQkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cE1BQ0FkZHJlc3MoIHZvaWQgKQ0Kew0KCS8qIE11c3QgYmUgd3JpdHRlbiBTQTFMIHRoZW4gU0ExSC4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfU0ExTCA9CSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIGNNQUNBZGRyZXNzWyAzIF0gPDwgMjQgKSB8DQoJCQkJCQkJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSBjTUFDQWRkcmVzc1sgMiBdIDw8IDE2ICkgfA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgY01BQ0FkZHJlc3NbIDEgXSA8PCA4ICApIHwNCgkJCQkJCQkJCWNNQUNBZGRyZXNzWyAwIF07DQoNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfU0ExSCA9CSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIGNNQUNBZGRyZXNzWyA1IF0gPDwgOCApIHwNCgkJCQkJCQkJCWNNQUNBZGRyZXNzWyA0IF07DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBFTUFDSW50ZXJydXB0KCB2b2lkICkNCnsNCgkvKiBDcmVhdGUgdGhlIHNlbWFwaG9yZSB1c2VkIHRvIHRyaWdnZXIgdGhlIEVNQUMgdGFzay4gKi8NCgl2U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCB4U2VtYXBob3JlICk7DQoJaWYoIHhTZW1hcGhvcmUgKQ0KCXsNCgkJLyogV2Ugc3RhcnQgYnkgJ3Rha2luZycgdGhlIHNlbWFwaG9yZSBzbyB0aGUgSVNSIGNhbiAnZ2l2ZScgaXQgd2hlbiB0aGUNCgkJZmlyc3QgaW50ZXJydXB0IG9jY3Vycy4gKi8NCgkJeFNlbWFwaG9yZVRha2UoIHhTZW1hcGhvcmUsIGVtYWNOT19ERUxBWSApOw0KCQlwb3J0RU5URVJfQ1JJVElDQUwoKTsNCgkJew0KCQkJLyogV2Ugd2FudCB0byBpbnRlcnJ1cHQgb24gUnggZXZlbnRzLiAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX0lFUiA9IEFUOTFDX0VNQUNfUkNPTVA7DQoNCgkJCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0cyBpbiB0aGUgQUlDLiAqLw0KCQkJQVQ5MUZfQUlDX0NvbmZpZ3VyZUl0KCBBVDkxQ19CQVNFX0FJQywgQVQ5MUNfSURfRU1BQywgZW1hY0lOVEVSUlVQVF9MRVZFTCwgQVQ5MUNfQUlDX1NSQ1RZUEVfSU5UX0hJR0hfTEVWRUwsICggdm9pZCAoKikoIHZvaWQgKSApIHZFTUFDSVNSRW50cnkgKTsNCgkJCUFUOTFGX0FJQ19FbmFibGVJdCggQVQ5MUNfQkFTRV9BSUMsIEFUOTFDX0lEX0VNQUMgKTsNCgkJfQ0KCQlwb3J0RVhJVF9DUklUSUNBTCgpOw0KCX0NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpfX2FybSB2b2lkIHZFTUFDSVNSKCB2b2lkICkNCnsNCnZvbGF0aWxlIHVuc2lnbmVkIHBvcnRMT05HIHVsSW50U3RhdHVzLCB1bFJ4U3RhdHVzOw0KcG9ydEJBU0VfVFlQRSB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZEZBTFNFOw0KDQoJdWxJbnRTdGF0dXMgPSBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfSVNSOw0KCXVsUnhTdGF0dXMgPSBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfUlNSOw0KDQoJaWYoICggdWxJbnRTdGF0dXMgJiBBVDkxQ19FTUFDX1JDT01QICkgfHwgKCB1bFJ4U3RhdHVzICYgQVQ5MUNfRU1BQ19SRUMgKSApDQoJew0KCQkvKiBBIGZyYW1lIGhhcyBiZWVuIHJlY2VpdmVkLCBzaWduYWwgdGhlIHVJUCB0YXNrIHNvIGl0IGNhbiBwcm9jZXNzDQoJCXRoZSBSeCBkZXNjcmlwdG9ycy4gKi8NCgkJeFNlbWFwaG9yZUdpdmVGcm9tSVNSKCB4U2VtYXBob3JlLCAmeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7DQoJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19SU1IgPSBBVDkxQ19FTUFDX1JFQzsNCgl9DQoNCgkvKiBJZiBhIHRhc2sgd2FzIHdva2VuIGJ5IGVpdGhlciBhIGNoYXJhY3RlciBiZWluZyByZWNlaXZlZCBvciBhIGNoYXJhY3Rlcg0KCWJlaW5nIHRyYW5zbWl0dGVkIHRoZW4gd2UgbWF5IG5lZWQgdG8gc3dpdGNoIHRvIGFub3RoZXIgdGFzay4gKi8NCglwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOw0KDQoJLyogQ2xlYXIgdGhlIGludGVycnVwdC4gKi8NCglBVDkxQ19CQVNFX0FJQy0+QUlDX0VPSUNSID0gMDsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoNCg0KLyoNCiAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgdGFrZW4gZnJvbSB0aGUgQXRtZWwNCiAqIEVNQUMgc2FtcGxlIGNvZGUuDQogKi8NCg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgcHJ2UHJvYmVQSFkoIHZvaWQgKQ0Kew0KdW5zaWduZWQgcG9ydExPTkcgdWxQSFlJZDEsIHVsUEhZSWQyLCB1bFN0YXR1czsNCnBvcnRCQVNFX1RZUEUgeFJldHVybiA9IHBkUEFTUzsNCgkNCgkvKiBDb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIChyZWZvcm1hdHRlZCkgLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJLyogRW5hYmxlIG1hbmFnZW1lbnQgcG9ydCAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gQVQ5MUNfRU1BQ19NUEU7CQ0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiB8PSAoIDIgKSA8PCAxMDsNCg0KCS8qIFJlYWQgdGhlIFBIWSBJRC4gKi8NCgl2UmVhZFBIWSggQVQ5MUNfUEhZX0FERFIsIE1JSV9QSFlTSUQxLCAmdWxQSFlJZDEgKTsNCgl2UmVhZFBIWSggQVQ5MUNfUEhZX0FERFIsIE1JSV9QSFlTSUQyLCAmdWxQSFlJZDIgKTsNCg0KCS8qIEFNRCBBTTc5Qzg3NToNCgkJCVBIWV9JRDEgPSAweDAwMjINCgkJCVBIWV9JRDIgPSAweDU1NDENCgkJCUJpdHMgMzowIFJldmlzaW9uIE51bWJlciBGb3VyIGJpdCBtYW51ZmFjdHVyZXKScyByZXZpc2lvbiBudW1iZXIuDQoJCQkJMDAwMSBzdGFuZHMgZm9yIFJldi4gQSwgZXRjLg0KCSovDQoJaWYoICggKCB1bFBIWUlkMSA8PCAxNiApIHwgKCB1bFBIWUlkMiAmIDB4ZmZmMCApICkgIT0gTUlJX0RNOTE2MV9JRCApDQoJew0KCQkvKiBEaWQgbm90IGV4cGVjdCB0aGlzIElELiAqLw0KCQl4UmV0dXJuID0gcGRGQUlMOw0KCX0NCgllbHNlDQoJew0KCQl1bFN0YXR1cyA9IHhHZXRMaW5rU3BlZWQoKTsNCg0KCQlpZiggdWxTdGF0dXMgIT0gcGRQQVNTICkNCgkJew0KCQkJeFJldHVybiA9IHBkRkFJTDsNCgkJfQ0KCX0NCg0KCS8qIERpc2FibGUgbWFuYWdlbWVudCBwb3J0ICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiAmPSB+QVQ5MUNfRU1BQ19NUEU7CQ0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCXJldHVybiB4UmV0dXJuOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHZSZWFkUEhZKCB1bnNpZ25lZCBwb3J0Q0hBUiB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIHBvcnRDSEFSIHVjQWRkcmVzcywgdW5zaWduZWQgcG9ydExPTkcgKnB1bFZhbHVlICkNCnsNCgkvKiBDb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIChyZWZvcm1hdHRlZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTUFOID0gCShBVDkxQ19FTUFDX1NPRiAmICgweDAxPDwzMCkpDQoJCQkJCQkJCQl8ICgyIDw8IDE2KSB8ICgyIDw8IDI4KQ0KCQkJCQkJCQkJfCAoKHVjUEhZQWRkcmVzcyAmIDB4MWYpIDw8IDIzKQ0KCQkJCQkJCQkJfCAodWNBZGRyZXNzIDw8IDE4KTsNCg0KCS8qIFdhaXQgdW50aWwgSURMRSBiaXQgaW4gTmV0d29yayBTdGF0dXMgcmVnaXN0ZXIgaXMgY2xlYXJlZC4gKi8NCgl3aGlsZSggISggQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05TUiAmIEFUOTFDX0VNQUNfSURMRSApICkNCgl7DQoJCV9fYXNtKCAiTk9QIiApOw0KCX0NCg0KCSpwdWxWYWx1ZSA9ICggQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX01BTiAmIDB4MDAwMGZmZmYgKTsJDQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCiNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0Kc3RhdGljIHZvaWQgdldyaXRlUEhZKCB1bnNpZ25lZCBwb3J0Q0hBUiB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIHBvcnRDSEFSIHVjQWRkcmVzcywgdW5zaWduZWQgcG9ydExPTkcgdWxWYWx1ZSApDQp7DQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAocmVmb3JtYXR0ZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX01BTiA9ICgoIEFUOTFDX0VNQUNfU09GICYgKDB4MDE8PDMwKSkNCgkJCQkJCQkJfCAoMiA8PCAxNikgfCAoMSA8PCAyOCkNCgkJCQkJCQkJfCAoKHVjUEhZQWRkcmVzcyAmIDB4MWYpIDw8IDIzKQ0KCQkJCQkJCQl8ICh1Y0FkZHJlc3MgPDwgMTgpKQ0KCQkJCQkJCQl8ICh1bFZhbHVlICYgMHhmZmZmKTsNCg0KCS8qIFdhaXQgdW50aWwgSURMRSBiaXQgaW4gTmV0d29yayBTdGF0dXMgcmVnaXN0ZXIgaXMgY2xlYXJlZCAqLw0KCXdoaWxlKCAhKCBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTlNSICYgQVQ5MUNfRU1BQ19JRExFICkgKQ0KCXsNCgkJX19hc20oICJOT1AiICk7DQoJfTsNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQp9DQojZW5kaWYNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgcG9ydEJBU0VfVFlQRSB4R2V0TGlua1NwZWVkKCB2b2lkICkNCnsNCgl1bnNpZ25lZCBwb3J0TE9ORyB1bEJNU1IsIHVsQk1DUiwgdWxMUEEsIHVsTUFDQ2ZnLCB1bFNwZWVkLCB1bER1cGxleDsNCg0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBMaW5rIHN0YXR1cyBpcyBsYXRjaGVkLCBzbyByZWFkIHR3aWNlIHRvIGdldCBjdXJyZW50IHZhbHVlICovDQoJdlJlYWRQSFkoQVQ5MUNfUEhZX0FERFIsIE1JSV9CTVNSLCAmdWxCTVNSKTsNCgl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0JNU1IsICZ1bEJNU1IpOw0KDQoJaWYoICEoIHVsQk1TUiAmIEJNU1JfTFNUQVRVUyApICkNCgl7CQ0KCQkvKiBObyBMaW5rLiAqLw0KCQlyZXR1cm4gcGRGQUlMOw0KCX0NCg0KCXZSZWFkUEhZKEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgJnVsQk1DUik7DQoJaWYgKHVsQk1DUiAmIEJNQ1JfQU5FTkFCTEUpDQoJewkJCQkNCgkJLyogQXV0b05lZ290aWF0aW9uIGlzIGVuYWJsZWQuICovDQoJCWlmICghKHVsQk1TUiAmIEJNU1JfQU5FR0NPTVBMRVRFKSkNCgkJew0KCQkJLyogQXV0by1uZWdvdGlhdGlvbiBpbiBwcm9ncmVzcy4gKi8NCgkJCXJldHVybiBwZEZBSUw7CQkJCQ0KCQl9CQkNCg0KCQl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0xQQSwgJnVsTFBBKTsNCgkJaWYoICggdWxMUEEgJiBMUEFfMTAwRlVMTCApIHx8ICggdWxMUEEgJiBMUEFfMTAwSEFMRiApICkNCgkJew0KCQkJdWxTcGVlZCA9IFNQRUVEXzEwMDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXVsU3BlZWQgPSBTUEVFRF8xMDsNCgkJfQ0KDQoJCWlmKCAoIHVsTFBBICYgTFBBXzEwMEZVTEwgKSB8fCAoIHVsTFBBICYgTFBBXzEwRlVMTCApICkNCgkJew0KCQkJdWxEdXBsZXggPSBEVVBMRVhfRlVMTDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXVsRHVwbGV4ID0gRFVQTEVYX0hBTEY7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJdWxTcGVlZCA9ICggdWxCTUNSICYgQk1DUl9TUEVFRDEwMCApID8gU1BFRURfMTAwIDogU1BFRURfMTA7DQoJCXVsRHVwbGV4ID0gKCB1bEJNQ1IgJiBCTUNSX0ZVTExEUExYICkgPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOw0KCX0NCg0KCS8qIFVwZGF0ZSB0aGUgTUFDICovDQoJdWxNQUNDZmcgPSBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgJiB+KCBBVDkxQ19FTUFDX1NQRCB8IEFUOTFDX0VNQUNfRkQgKTsNCglpZiggdWxTcGVlZCA9PSBTUEVFRF8xMDAgKQ0KCXsNCgkJaWYoIHVsRHVwbGV4ID09IERVUExFWF9GVUxMICkNCgkJew0KCQkJLyogMTAwIEZ1bGwgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZyB8IEFUOTFDX0VNQUNfU1BEIHwgQVQ5MUNfRU1BQ19GRDsNCgkJfQ0KCQllbHNlDQoJCXsJCQkJCQ0KCQkJLyogMTAwIEhhbGYgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZyB8IEFUOTFDX0VNQUNfU1BEOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCWlmICh1bER1cGxleCA9PSBEVVBMRVhfRlVMTCkNCgkJew0KCQkJLyogMTAgRnVsbCBEdXBsZXggKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiA9IHVsTUFDQ2ZnIHwgQVQ5MUNfRU1BQ19GRDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8qIDEwIEhhbGYgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZzsNCgkJfQ0KCX0NCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglyZXR1cm4gcGRQQVNTOw0KfQ0K