LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQovKiAgZnRzeXN0ZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi8qICAgIEFtaWdhLXNwZWNpZmljIEZyZWVUeXBlIGxvdy1sZXZlbCBzeXN0ZW0gaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICovDQovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZyBhbmQgRGV0bGVmIFf8cmtuZXIuICAgICAgICovDQovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8NCi8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovDQovKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLw0KLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8NCi8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQW1pZ2EgaW50ZXJmYWNlIHVzZWQgYnkgRnJlZVR5cGUgdG8gYWNjZXNzICAgICAqLw0KICAvKiBsb3ctbGV2ZWwsIGkuZS4gbWVtb3J5IG1hbmFnZW1lbnQsIGkvbyBhY2Nlc3MgYXMgd2VsbCBhcyB0aHJlYWQgICAgICAgKi8NCiAgLyogc3luY2hyb25pc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KDQogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogTWFpbnRhaW5lZCBieSBEZXRsZWYgV/xya25lciA8VGV0aVNvZnRAYXBnLmxhaG4uZGU+ICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiBCYXNlZCBvbiB0aGUgb3JpZ2luYWwgZnRzeXN0ZW0uYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogbW9kaWZpZWQgdG8gYXZvaWQgZm9wZW4oKSwgZmNsb3NlKCksIGZyZWFkKCksIGZzZWVrKCksIGZ0ZWxsKCksICAgICAgICovDQogIC8qIG1hbGxvYygpLCByZWFsbG9jKCksIGFuZCBmcmVlKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogVGhvc2UgQyBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgb2Z0ZW4gbm90IHRocmVhZC1zYWZlIG9yIGNhbnQgYmUgICAgICAgICovDQogIC8qIHVzZWQgaW4gYSBzaGFyZWQgQW1pZ2EgbGlicmFyeS4gSWYgdGhhdCdzIG5vdCBhIHByb2JsZW0gZm9yIHlvdSwgICAgICAgKi8NCiAgLyogeW91IGNhbiBvZiBjb3Vyc2UgdXNlIHRoZSBkZWZhdWx0IGZ0c3lzdGVtLmMgd2l0aCBDIGxpYnJhcnkgY2FsbHMgICAgICovDQogIC8qIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBuZWVkcyBleGVjIFYzOSsgYmVjYXVzZSBpdCB1c2VzIEFsbG9jUG9vbGVkKCkgZXRjICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2RlZmluZSBfX05PTElCQkFTRV9fDQojZGVmaW5lIF9fTk9HTE9CQUxJRkFDRV9fDQojZGVmaW5lIF9fVVNFX0lOTElORV9fDQojaW5jbHVkZSA8cHJvdG8vZXhlYy5oPg0KI2luY2x1ZGUgPGRvcy9zdGRpby5oPg0KI2luY2x1ZGUgPHByb3RvL2Rvcy5oPg0KI2lmZGVmIF9fYW1pZ2FvczRfXw0KZXh0ZXJuIHN0cnVjdCBFeGVjSUZhY2UgKklFeGVjOw0KZXh0ZXJuIHN0cnVjdCBET1NJRmFjZSAgKklET1M7DQojZWxzZQ0KZXh0ZXJuIHN0cnVjdCBMaWJyYXJ5ICAgKlN5c0Jhc2U7DQpleHRlcm4gc3RydWN0IExpYnJhcnkgICAqRE9TQmFzZTsNCiNlbmRpZg0KDQojZGVmaW5lIElPQlVGX1NJWkUgNTEyDQoNCi8qIHN0cnVjdHVyZSB0aGF0IGhlbHBzIHVzIHRvIGF2b2lkDQogKiB1c2VsZXNzIGNhbGxzIG9mIFNlZWsoKSBhbmQgUmVhZCgpDQogKi8NCnN0cnVjdCBTeXNGaWxlDQp7DQogIEJQVFIgIGZpbGU7DQogIFVMT05HIGlvYnVmX3N0YXJ0Ow0KICBVTE9ORyBpb2J1Zl9lbmQ7DQogIFVCWVRFIGlvYnVmW0lPQlVGX1NJWkVdOw0KfTsNCg0KI2lmbmRlZiBfX2FtaWdhb3M0X18NCi8qIEMgaW1wbGVtZW50YXRpb24gb2YgQWxsb2NWZWNQb29sZWQgKHNlZSBhdXRvZG9jIGV4ZWMvQWxsb2NQb29sZWQpICovDQpBUFRSDQpBbGxvY19WZWNQb29sZWQoIEFQVFIgICBwb29sSGVhZGVyLA0KICAgICAgICAgICAgICAgICBVTE9ORyAgbWVtU2l6ZSApDQp7DQogIFVMT05HICBuZXdTaXplID0gbWVtU2l6ZSArIHNpemVvZiAoIFVMT05HICk7DQogIFVMT05HICAqbWVtID0gQWxsb2NQb29sZWQoIHBvb2xIZWFkZXIsIG5ld1NpemUgKTsNCg0KICBpZiAoICFtZW0gKQ0KICAgIHJldHVybiBOVUxMOw0KICAqbWVtID0gbmV3U2l6ZTsNCiAgcmV0dXJuIG1lbSArIDE7DQp9DQoNCi8qIEMgaW1wbGVtZW50YXRpb24gb2YgRnJlZVZlY1Bvb2xlZCAoc2VlIGF1dG9kb2MgZXhlYy9BbGxvY1Bvb2xlZCkgKi8NCnZvaWQNCkZyZWVfVmVjUG9vbGVkKCBBUFRSICBwb29sSGVhZGVyLA0KICAgICAgICAgICAgICAgIEFQVFIgIG1lbW9yeSApDQp7DQogIFVMT05HICAqcmVhbG1lbSA9IChVTE9ORyAqKW1lbW9yeSAtIDE7DQoNCiAgRnJlZVBvb2xlZCggcG9vbEhlYWRlciwgcmVhbG1lbSwgKnJlYWxtZW0gKTsNCn0NCiNlbmRpZg0KDQojaW5jbHVkZSA8ZnQyYnVpbGQuaD4NCiNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSA0KI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSA0KI2luY2x1ZGUgRlRfU1lTVEVNX0gNCiNpbmNsdWRlIEZUX0VSUk9SU19IDQojaW5jbHVkZSBGVF9UWVBFU19IDQoNCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KDQoNCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgTUVNT1JZIE1BTkFHRU1FTlQgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkbyBhbnkgZXJyb3IgY2hlY2tpbmcgZm9yIHRoZSAgICAgICAgICAgICAgICAgICovDQogIC8qIGFsbG9jYXRpb24tcmVsYXRlZCBmdW5jdGlvbnMuICBUaGlzIGlzIGRvbmUgYnkgdGhlIGhpZ2hlciBsZXZlbCAgICAgICAqLw0KICAvKiByb3V0aW5lcyBsaWtlIGZ0X21lbV9hbGxvYygpIG9yIGZ0X21lbV9yZWFsbG9jKCkuICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQoNCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgZnRfYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgVGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgbWVtb3J5IDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICBzaXplICAgOjogVGhlIHJlcXVlc3RlZCBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICBUaGUgYWRkcmVzcyBvZiBuZXdseSBhbGxvY2F0ZWQgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIEZUX0NBTExCQUNLX0RFRiggdm9pZCogKQ0KICBmdF9hbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksDQogICAgICAgICAgICBsb25nICAgICAgIHNpemUgKQ0KICB7DQojaWZkZWYgX19hbWlnYW9zNF9fDQogICAgcmV0dXJuIEFsbG9jVmVjUG9vbGVkKCBtZW1vcnktPnVzZXIsIHNpemUgKTsNCiNlbHNlDQogICAgcmV0dXJuIEFsbG9jX1ZlY1Bvb2xlZCggbWVtb3J5LT51c2VyLCBzaXplICk7DQojZW5kaWYNCiAgfQ0KDQoNCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgZnRfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgVGhlIG1lbW9yeSByZWFsbG9jYXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgbWVtb3J5ICAgOjogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICBjdXJfc2l6ZSA6OiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgIG5ld19zaXplIDo6IFRoZSBuZXdseSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgYmxvY2sgICAgOjogVGhlIGN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgYmxvY2sgaW4gbWVtb3J5LiAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHJlYWxsb2NhdGVkIG1lbW9yeSBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICBGVF9DQUxMQkFDS19ERUYoIHZvaWQqICkNCiAgZnRfcmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksDQogICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsDQogICAgICAgICAgICAgIGxvbmcgICAgICAgbmV3X3NpemUsDQogICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQ0KICB7DQogICAgdm9pZCogbmV3X2Jsb2NrOw0KDQojaWZkZWYgX19hbWlnYW9zNF9fDQogICAgbmV3X2Jsb2NrID0gQWxsb2NWZWNQb29sZWQgKCBtZW1vcnktPnVzZXIsIG5ld19zaXplICk7DQojZWxzZQ0KICAgIG5ld19ibG9jayA9IEFsbG9jX1ZlY1Bvb2xlZCAoIG1lbW9yeS0+dXNlciwgbmV3X3NpemUgKTsNCiNlbmRpZg0KICAgIGlmICggbmV3X2Jsb2NrICE9IE5VTEwgKQ0KICAgIHsNCiAgICAgIENvcHlNZW0gKCBibG9jaywgbmV3X2Jsb2NrLA0KICAgICAgICAgICAgICAgICggbmV3X3NpemUgPiBjdXJfc2l6ZSApID8gY3VyX3NpemUgOiBuZXdfc2l6ZSApOw0KI2lmZGVmIF9fYW1pZ2FvczRfXw0KICAgICAgRnJlZVZlY1Bvb2xlZCAoIG1lbW9yeS0+dXNlciwgYmxvY2sgKTsNCiNlbHNlDQogICAgICBGcmVlX1ZlY1Bvb2xlZCAoIG1lbW9yeS0+dXNlciwgYmxvY2sgKTsNCiNlbmRpZg0KICAgIH0NCiAgICByZXR1cm4gbmV3X2Jsb2NrOw0KICB9DQoNCg0KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICBmdF9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICBUaGUgbWVtb3J5IHJlbGVhc2UgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICBtZW1vcnkgIDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgIGJsb2NrICAgOjogVGhlIGFkZHJlc3Mgb2YgYmxvY2sgaW4gbWVtb3J5IHRvIGJlIGZyZWVkLiAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkNCiAgZnRfZnJlZSggRlRfTWVtb3J5ICBtZW1vcnksDQogICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQ0KICB7DQojaWZkZWYgX19hbWlnYW9zNF9fDQogICAgRnJlZVZlY1Bvb2xlZCggbWVtb3J5LT51c2VyLCBibG9jayApOw0KI2Vsc2UNCiAgICBGcmVlX1ZlY1Bvb2xlZCggbWVtb3J5LT51c2VyLCBibG9jayApOw0KI2VuZGlmDQogIH0NCg0KDQogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KDQogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovDQogIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLw0KICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQojdW5kZWYgIEZUX0NPTVBPTkVOVA0KI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2lvDQoNCiAgLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fRklMRSBmb3IgY29udmVuaWVuY2UgdG8gZXh0cmFjdCB0aGUgICAgICAgKi8NCiAgLyogc3lzdGVtLXNwZWNpZmljIHN0cmVhbSBoYW5kbGUgZnJvbSBhIGdpdmVuIEZyZWVUeXBlIHN0cmVhbSBvYmplY3QgKi8NCiNkZWZpbmUgU1RSRUFNX0ZJTEUoIHN0cmVhbSApICAoIChzdHJ1Y3QgU3lzRmlsZSAqKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyICkNCg0KDQogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgIGZ0X2FtaWdhX3N0cmVhbV9jbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgIFRoZSBmdW5jdGlvbiB0byBjbG9zZSBhIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgIHN0cmVhbSA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkNCiAgZnRfYW1pZ2Ffc3RyZWFtX2Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApDQogIHsNCiAgICBzdHJ1Y3QgU3lzRmlsZSogc3lzZmlsZTsNCg0KICAgIHN5c2ZpbGUgPSBTVFJFQU1fRklMRSggc3RyZWFtICk7DQogICAgQ2xvc2UgKCBzeXNmaWxlLT5maWxlICk7DQogICAgRnJlZU1lbSAoIHN5c2ZpbGUsIHNpemVvZiAoIHN0cnVjdCBTeXNGaWxlICkpOw0KDQogICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOw0KICAgIHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgID0gMDsNCiAgICBzdHJlYW0tPmJhc2UgICAgICAgICAgICAgICA9IDA7DQogIH0NCg0KDQogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgIGZ0X2FtaWdhX3N0cmVhbV9pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgIFRoZSBmdW5jdGlvbiB0byBvcGVuIGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgIHN0cmVhbSA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogICAgb2Zmc2V0IDo6IFRoZSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBzdHJlYW0gdG8gc3RhcnQgcmVhZGluZy4gICAgICAgICovDQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICBidWZmZXIgOjogVGhlIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEuICAgICAgICAgICAgKi8NCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgIGNvdW50ICA6OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtLiAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogIC8qICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgRlRfQ0FMTEJBQ0tfREVGKCB1bnNpZ25lZCBsb25nICkNCiAgZnRfYW1pZ2Ffc3RyZWFtX2lvKCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLA0KICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQsDQogICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgY291bnQgKQ0KICB7DQogICAgc3RydWN0IFN5c0ZpbGUqIHN5c2ZpbGU7DQogICAgdW5zaWduZWQgbG9uZyAgIHJlYWRfYnl0ZXM7DQoNCiAgICBpZiAoIGNvdW50ICE9IDAgKQ0KICAgIHsNCiAgICAgIHN5c2ZpbGUgPSBTVFJFQU1fRklMRSggc3RyZWFtICk7DQoNCiAgICAgIC8qIGhhbmRsZSB0aGUgc2VlayAqLw0KICAgICAgaWYgKCAob2Zmc2V0IDwgc3lzZmlsZS0+aW9idWZfc3RhcnQpIHx8IChvZmZzZXQgKyBjb3VudCA+IHN5c2ZpbGUtPmlvYnVmX2VuZCkgKQ0KICAgICAgew0KICAgICAgICAvKiByZXF1ZXN0ZWQgb2Zmc2V0IGltcGxpZXMgd2UgbmVlZCBhIGJ1ZmZlciByZWZpbGwgKi8NCiAgICAgICAgaWYgKCAhc3lzZmlsZS0+aW9idWZfZW5kIHx8IG9mZnNldCAhPSBzeXNmaWxlLT5pb2J1Zl9lbmQgKQ0KICAgICAgICB7DQogICAgICAgICAgLyogYSBwaHlzaWNhbCBzZWVrIGlzIG5lY2Vzc2FyeSAqLw0KICAgICAgICAgIFNlZWsoIHN5c2ZpbGUtPmZpbGUsIG9mZnNldCwgT0ZGU0VUX0JFR0lOTklORyApOw0KICAgICAgICB9DQogICAgICAgIHN5c2ZpbGUtPmlvYnVmX3N0YXJ0ID0gb2Zmc2V0Ow0KICAgICAgICBzeXNmaWxlLT5pb2J1Zl9lbmQgPSAwOyAvKiB0cmlnZ2VyIGEgYnVmZmVyIHJlZmlsbCAqLw0KICAgICAgfQ0KDQogICAgICAvKiBoYW5kbGUgdGhlIHJlYWQgKi8NCiAgICAgIGlmICggb2Zmc2V0ICsgY291bnQgPD0gc3lzZmlsZS0+aW9idWZfZW5kICkNCiAgICAgIHsNCiAgICAgICAgLyogd2UgaGF2ZSBidWZmZXIgYW5kIHJlcXVlc3RlZCBieXRlcyBhcmUgYWxsIGluc2lkZSBvdXIgYnVmZmVyICovDQogICAgICAgIENvcHlNZW0oICZzeXNmaWxlLT5pb2J1ZltvZmZzZXQgLSBzeXNmaWxlLT5pb2J1Zl9zdGFydF0sIGJ1ZmZlciwgY291bnQgKTsNCiAgICAgICAgcmVhZF9ieXRlcyA9IGNvdW50Ow0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICAvKiAocmUpZmlsbCBidWZmZXIgKi8NCiAgICAgICAgaWYgKCBjb3VudCA8PSBJT0JVRl9TSVpFICkNCiAgICAgICAgew0KICAgICAgICAgIC8qIHJlcXVlc3RlZCBieXRlcyBpcyBhIHN1YnNldCBvZiB0aGUgYnVmZmVyICovDQogICAgICAgICAgcmVhZF9ieXRlcyA9IFJlYWQoIHN5c2ZpbGUtPmZpbGUsIHN5c2ZpbGUtPmlvYnVmLCBJT0JVRl9TSVpFICk7DQogICAgICAgICAgaWYgKCByZWFkX2J5dGVzID09IC0xVUwgKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8qIGVycm9yICovDQogICAgICAgICAgICByZWFkX2J5dGVzID0gMDsNCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIHN5c2ZpbGUtPmlvYnVmX2VuZCA9IG9mZnNldCArIHJlYWRfYnl0ZXM7DQogICAgICAgICAgICBDb3B5TWVtKCBzeXNmaWxlLT5pb2J1ZiwgYnVmZmVyLCBjb3VudCApOw0KICAgICAgICAgICAgaWYgKCByZWFkX2J5dGVzID4gY291bnQgKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICByZWFkX2J5dGVzID0gY291bnQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgIC8qIHdlIGFjdHVhbGx5IG5lZWQgbW9yZSB0aGFuIG91ciBidWZmZXIgY2FuIGhvbGQsIHNvIHdlIGRlY2lkZQ0KICAgICAgICAgICoqIHRvIGRvIGEgc2luZ2xlIGJpZyByZWFkLCBhbmQgdGhlbiBjb3B5IHRoZSBsYXN0IElPQlVGX1NJWkUNCiAgICAgICAgICAqKiBieXRlcyBvZiB0aGF0IHRvIG91ciBpbnRlcm5hbCBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLw0KICAgICAgICAgIHJlYWRfYnl0ZXMgPSBSZWFkKCBzeXNmaWxlLT5maWxlLCBidWZmZXIsIGNvdW50ICk7DQogICAgICAgICAgaWYgKCByZWFkX2J5dGVzID09IC0xVUwgKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8qIGVycm9yICovDQogICAgICAgICAgICByZWFkX2J5dGVzID0gMDsNCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIFVMT05HIGJ1ZnNpemU7DQoNCiAgICAgICAgICAgIGJ1ZnNpemUgPSAoIHJlYWRfYnl0ZXMgPiBJT0JVRl9TSVpFICkgPyBJT0JVRl9TSVpFIDogcmVhZF9ieXRlczsNCiAgICAgICAgICAgIHN5c2ZpbGUtPmlvYnVmX2VuZCA9IG9mZnNldCArIHJlYWRfYnl0ZXM7DQogICAgICAgICAgICBzeXNmaWxlLT5pb2J1Zl9zdGFydCA9IHN5c2ZpbGUtPmlvYnVmX2VuZCAtIGJ1ZnNpemU7DQogICAgICAgICAgICBDb3B5TWVtKCAmYnVmZmVyW3JlYWRfYnl0ZXMgLSBidWZzaXplXSAsIHN5c2ZpbGUtPmlvYnVmLCBidWZzaXplICk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICByZWFkX2J5dGVzID0gMDsNCiAgICB9DQoNCiAgICByZXR1cm4gcmVhZF9ieXRlczsNCiAgfQ0KDQoNCiAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLw0KDQogIEZUX0JBU0VfREVGKCBGVF9FcnJvciApDQogIEZUX1N0cmVhbV9PcGVuKCBGVF9TdHJlYW0gICAgc3RyZWFtLA0KICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSApDQogIHsNCiAgICBzdHJ1Y3QgRmlsZUluZm9CbG9jayogIGZpYjsNCiAgICBzdHJ1Y3QgU3lzRmlsZSogICAgICAgIHN5c2ZpbGU7DQoNCg0KICAgIGlmICggIXN0cmVhbSApDQogICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX0hhbmRsZSApOw0KDQojaWZkZWYgX19hbWlnYW9zNF9fDQogICAgc3lzZmlsZSA9IEFsbG9jTWVtICggc2l6ZW9mIChzdHJ1Y3QgU3lzRmlsZSApLCBNRU1GX1NIQVJFRCApOw0KI2Vsc2UNCiAgICBzeXNmaWxlID0gQWxsb2NNZW0gKCBzaXplb2YgKHN0cnVjdCBTeXNGaWxlICksIE1FTUZfUFVCTElDICk7DQojZW5kaWYNCiAgICBpZiAoICFzeXNmaWxlICkNCiAgICB7DQogICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOw0KICAgICAgRlRfRVJST1IoKCAiIGNvdWxkIG5vdCBvcGVuIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsNCg0KICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOw0KICAgIH0NCiAgICBzeXNmaWxlLT5maWxlID0gT3BlbiggKFNUUlBUUilmaWxlcGF0aG5hbWUsIE1PREVfT0xERklMRSApOw0KICAgIGlmICggIXN5c2ZpbGUtPmZpbGUgKQ0KICAgIHsNCiAgICAgIEZyZWVNZW0gKCBzeXNmaWxlLCBzaXplb2YgKCBzdHJ1Y3QgU3lzRmlsZSApKTsNCiAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7DQogICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IG9wZW4gYCVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOw0KDQogICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7DQogICAgfQ0KDQogICAgZmliID0gQWxsb2NEb3NPYmplY3QoIERPU19GSUIsIE5VTEwgKTsNCiAgICBpZiAoICFmaWIgKQ0KICAgIHsNCiAgICAgIENsb3NlICggc3lzZmlsZS0+ZmlsZSApOw0KICAgICAgRnJlZU1lbSAoIHN5c2ZpbGUsIHNpemVvZiAoIHN0cnVjdCBTeXNGaWxlICkpOw0KICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsNCiAgICAgIEZUX0VSUk9SKCggIiBjb3VsZCBub3Qgb3BlbiBgJXMnXG4iLCBmaWxlcGF0aG5hbWUgKSk7DQoNCiAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsNCiAgICB9DQogICAgaWYgKCAhKCBFeGFtaW5lRkgoIHN5c2ZpbGUtPmZpbGUsIGZpYiApICkgKQ0KICAgIHsNCiAgICAgIEZyZWVEb3NPYmplY3QoIERPU19GSUIsIGZpYiApOw0KICAgICAgQ2xvc2UgKCBzeXNmaWxlLT5maWxlICk7DQogICAgICBGcmVlTWVtICggc3lzZmlsZSwgc2l6ZW9mICggc3RydWN0IFN5c0ZpbGUgKSk7DQogICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOw0KICAgICAgRlRfRVJST1IoKCAiIGNvdWxkIG5vdCBvcGVuIGAlcydcbiIsIGZpbGVwYXRobmFtZSApKTsNCg0KICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOw0KICAgIH0NCiAgICBzdHJlYW0tPnNpemUgPSBmaWItPmZpYl9TaXplOw0KICAgIEZyZWVEb3NPYmplY3QoIERPU19GSUIsIGZpYiApOw0KDQogICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSAodm9pZCAqKXN5c2ZpbGU7DQogICAgc3RyZWFtLT5wYXRobmFtZS5wb2ludGVyICAgPSAoY2hhciopZmlsZXBhdGhuYW1lOw0KICAgIHN5c2ZpbGUtPmlvYnVmX3N0YXJ0ICAgICAgID0gMDsNCiAgICBzeXNmaWxlLT5pb2J1Zl9lbmQgICAgICAgICA9IDA7DQogICAgc3RyZWFtLT5wb3MgICAgICAgICAgICAgICAgPSAwOw0KDQogICAgc3RyZWFtLT5yZWFkICA9IGZ0X2FtaWdhX3N0cmVhbV9pbzsNCiAgICBzdHJlYW0tPmNsb3NlID0gZnRfYW1pZ2Ffc3RyZWFtX2Nsb3NlOw0KDQogICAgaWYgKCAhc3RyZWFtLT5zaXplICkNCiAgICB7DQogICAgICBmdF9hbWlnYV9zdHJlYW1fY2xvc2UoIHN0cmVhbSApOw0KICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX09wZW46IiApKTsNCiAgICAgIEZUX0VSUk9SKCggIiBvcGVuZWQgYCVzJyBidXQgemVyby1zaXplZFxuIiwgZmlsZXBhdGhuYW1lICkpOw0KICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9TdHJlYW0gKTsNCiAgICB9DQoNCiAgICBGVF9UUkFDRTEoKCAiRlRfU3RyZWFtX09wZW46IiApKTsNCiAgICBGVF9UUkFDRTEoKCAiIG9wZW5lZCBgJXMnICglbGQgYnl0ZXMpIHN1Y2Nlc3NmdWxseVxuIiwNCiAgICAgICAgICAgICAgICBmaWxlcGF0aG5hbWUsIHN0cmVhbS0+c2l6ZSApKTsNCg0KICAgIHJldHVybiBGVF9FcnJfT2s7DQogIH0NCg0KDQojaWZkZWYgRlRfREVCVUdfTUVNT1JZDQoNCiAgZXh0ZXJuIEZUX0ludA0KICBmdF9tZW1fZGVidWdfaW5pdCggRlRfTWVtb3J5ICBtZW1vcnkgKTsNCg0KICBleHRlcm4gdm9pZA0KICBmdF9tZW1fZGVidWdfZG9uZSggRlRfTWVtb3J5ICBtZW1vcnkgKTsNCg0KI2VuZGlmDQoNCg0KICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovDQoNCiAgRlRfQkFTRV9ERUYoIEZUX01lbW9yeSApDQogIEZUX05ld19NZW1vcnkoIHZvaWQgKQ0KICB7DQogICAgRlRfTWVtb3J5ICBtZW1vcnk7DQoNCg0KI2lmZGVmIF9fYW1pZ2FvczRfXw0KICAgIG1lbW9yeSA9IChGVF9NZW1vcnkpQWxsb2NWZWMoIHNpemVvZiAoICptZW1vcnkgKSwgTUVNRl9TSEFSRUQgKTsNCiNlbHNlDQogICAgbWVtb3J5ID0gKEZUX01lbW9yeSlBbGxvY1ZlYyggc2l6ZW9mICggKm1lbW9yeSApLCBNRU1GX1BVQkxJQyApOw0KI2VuZGlmDQogICAgaWYgKCBtZW1vcnkgKQ0KICAgIHsNCiNpZmRlZiBfX2FtaWdhb3M0X18NCiAgICAgIG1lbW9yeS0+dXNlciA9IENyZWF0ZVBvb2woIE1FTUZfU0hBUkVELCAxNjM4NCwgMTYzODQgKTsNCiNlbHNlDQogICAgICBtZW1vcnktPnVzZXIgPSBDcmVhdGVQb29sKCBNRU1GX1BVQkxJQywgMTYzODQsIDE2Mzg0ICk7DQojZW5kaWYNCiAgICAgIGlmICggbWVtb3J5LT51c2VyID09IE5VTEwgKQ0KICAgICAgew0KICAgICAgICBGcmVlVmVjKCBtZW1vcnkgKTsNCiAgICAgICAgbWVtb3J5ID0gTlVMTDsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgbWVtb3J5LT5hbGxvYyAgID0gZnRfYWxsb2M7DQogICAgICAgIG1lbW9yeS0+cmVhbGxvYyA9IGZ0X3JlYWxsb2M7DQogICAgICAgIG1lbW9yeS0+ZnJlZSAgICA9IGZ0X2ZyZWU7DQojaWZkZWYgRlRfREVCVUdfTUVNT1JZDQogICAgICAgIGZ0X21lbV9kZWJ1Z19pbml0KCBtZW1vcnkgKTsNCiNlbmRpZg0KICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBtZW1vcnk7DQogIH0NCg0KDQogIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8NCg0KICBGVF9CQVNFX0RFRiggdm9pZCApDQogIEZUX0RvbmVfTWVtb3J5KCBGVF9NZW1vcnkgIG1lbW9yeSApDQogIHsNCiNpZmRlZiBGVF9ERUJVR19NRU1PUlkNCiAgICBmdF9tZW1fZGVidWdfZG9uZSggbWVtb3J5ICk7DQojZW5kaWYNCg0KICAgIERlbGV0ZVBvb2woIG1lbW9yeS0+dXNlciApOw0KICAgIEZyZWVWZWMoIG1lbW9yeSApOw0KICB9DQoNCi8qDQpMb2NhbCBWYXJpYWJsZXM6DQpjb2Rpbmc6IGxhdGluLTENCkVuZDoNCiovDQovKiBFTkQgKi8NCg==