LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRyYWNlYWx5emVyIHYyLjYuMCBSZWNvcmRlciBMaWJyYXJ5DQogKiBQZXJjZXBpbyBBQiwgd3d3LnBlcmNlcGlvLmNvbQ0KICoNCiAqIHRyY1VzZXIuYw0KICoNCiAqIFRoZSBwdWJsaWMgQVBJIG9mIHRoZSB0cmFjZSByZWNvcmRlciBsaWJyYXJ5Lg0KICoNCiAqIFRlcm1zIG9mIFVzZQ0KICogVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgUGVyY2VwaW8gQUIuIFRoZSByZWNvcmRlciBsaWJyYXJ5IGlzIGZyZWUgZm9yDQogKiB1c2UgdG9nZXRoZXIgd2l0aCBQZXJjZXBpbyBwcm9kdWN0cy4gWW91IG1heSBkaXN0cmlidXRlIHRoZSByZWNvcmRlciBsaWJyYXJ5DQogKiBpbiBpdHMgb3JpZ2luYWwgZm9ybSwgaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMgaW4gdHJjSGFyZHdhcmVQb3J0LmMvLmgNCiAqIGdpdmVuIHRoYXQgdGhlc2UgbW9kaWZpY2F0aW9uIGFyZSBjbGVhcmx5IG1hcmtlZCBhcyB5b3VyIG93biBtb2RpZmljYXRpb25zDQogKiBhbmQgZG9jdW1lbnRlZCBpbiB0aGUgaW5pdGlhbCBjb21tZW50IHNlY3Rpb24gb2YgdGhlc2Ugc291cmNlIGZpbGVzLg0KICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIFBlcmNlcGlvIEFCIGFuZCBtYXkgbm90IGJlDQogKiBzb2xkIG9yIGluIG90aGVyIHdheXMgY29tbWVyY2lhbGx5IHJlZGlzdHJpYnV0ZWQgd2l0aG91dCBleHBsaWNpdCB3cml0dGVuDQogKiBwZXJtaXNzaW9uIGJ5IFBlcmNlcGlvIEFCLg0KICoNCiAqIERpc2NsYWltZXINCiAqIFRoZSB0cmFjZSB0b29sIGFuZCByZWNvcmRlciBsaWJyYXJ5IGlzIGJlaW5nIGRlbGl2ZXJlZCB0byB5b3UgQVMgSVMgYW5kDQogKiBQZXJjZXBpbyBBQiBtYWtlcyBubyB3YXJyYW50eSBhcyB0byBpdHMgdXNlIG9yIHBlcmZvcm1hbmNlLiBQZXJjZXBpbyBBQiBkb2VzDQogKiBub3QgYW5kIGNhbm5vdCB3YXJyYW50IHRoZSBwZXJmb3JtYW5jZSBvciByZXN1bHRzIHlvdSBtYXkgb2J0YWluIGJ5IHVzaW5nIHRoZQ0KICogc29mdHdhcmUgb3IgZG9jdW1lbnRhdGlvbi4gUGVyY2VwaW8gQUIgbWFrZSBubyB3YXJyYW50aWVzLCBleHByZXNzIG9yDQogKiBpbXBsaWVkLCBhcyB0byBub25pbmZyaW5nZW1lbnQgb2YgdGhpcmQgcGFydHkgcmlnaHRzLCBtZXJjaGFudGFiaWxpdHksIG9yDQogKiBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBJbiBubyBldmVudCB3aWxsIFBlcmNlcGlvIEFCLCBpdHMNCiAqIHRlY2hub2xvZ3kgcGFydG5lcnMsIG9yIGRpc3RyaWJ1dG9ycyBiZSBsaWFibGUgdG8geW91IGZvciBhbnkgY29uc2VxdWVudGlhbCwNCiAqIGluY2lkZW50YWwgb3Igc3BlY2lhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGxvc3QgcHJvZml0cyBvciBsb3N0IHNhdmluZ3MsDQogKiBldmVuIGlmIGEgcmVwcmVzZW50YXRpdmUgb2YgUGVyY2VwaW8gQUIgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkNCiAqIG9mIHN1Y2ggZGFtYWdlcywgb3IgZm9yIGFueSBjbGFpbSBieSBhbnkgdGhpcmQgcGFydHkuIFNvbWUganVyaXNkaWN0aW9ucyBkbw0KICogbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IgbGltaXRhdGlvbiBvZiBpbmNpZGVudGFsLCBjb25zZXF1ZW50aWFsIG9yIHNwZWNpYWwNCiAqIGRhbWFnZXMsIG9yIHRoZSBleGNsdXNpb24gb2YgaW1wbGllZCB3YXJyYW50aWVzIG9yIGxpbWl0YXRpb25zIG9uIGhvdyBsb25nIGFuDQogKiBpbXBsaWVkIHdhcnJhbnR5IG1heSBsYXN0LCBzbyB0aGUgYWJvdmUgbGltaXRhdGlvbnMgbWF5IG5vdCBhcHBseSB0byB5b3UuDQogKg0KICogQ29weXJpZ2h0IFBlcmNlcGlvIEFCLCAyMDEzLg0KICogd3d3LnBlcmNlcGlvLmNvbQ0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNpbmNsdWRlICJGcmVlUlRPUy5oIg0KI2luY2x1ZGUgInRhc2suaCINCg0KI2luY2x1ZGUgInRyY1VzZXIuaCINCg0KI2lmIChVU0VfVFJBQ0VBTFlaRVJfUkVDT1JERVIgPT0gMSkNCg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPHN0ZGFyZy5oPg0KI2luY2x1ZGUgPHN0ZGludC5oPg0KDQpUUkFDRV9TVE9QX0hPT0sgdlRyYWNlU3RvcEhvb2tQdHIgPSAoVFJBQ0VfU1RPUF9IT09LKTA7DQoNCmV4dGVybiB1aW50OF90IGluRXhjbHVkZWRUYXNrOw0KZXh0ZXJuIHVpbnQ4X3QgbklTUmFjdGl2ZTsNCmV4dGVybiBvYmplY3RIYW5kbGVUeXBlIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrOw0KZXh0ZXJuIHVpbnQzMl90IGR0c19taW47DQpleHRlcm4gdWludDMyX3QgaHd0Y19jb3VudF9tYXhfYWZ0ZXJfdGljazsNCmV4dGVybiB1aW50MzJfdCBod3RjX2NvdW50X3N1bV9hZnRlcl90aWNrOw0KZXh0ZXJuIHVpbnQzMl90IGh3dGNfY291bnRfc3VtX2FmdGVyX3RpY2tfY291bnRlcjsNCmV4dGVybiBjaGFyKiB0cmFjZUVycm9yTWVzc2FnZTsNCg0KLyoqKiBwcml2YXRlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VQcmludEZfSGVscGVyKHRyYWNlTGFiZWwgZXZlbnRMYWJlbCwgY29uc3QgY2hhciogZm9ybWF0U3RyLCB2YV9saXN0IHZsKTsNCg0KI2lmIChVU0VfU0VQQVJBVEVfVVNFUl9FVkVOVF9CVUZGRVIgPT0gMSkNCnZvaWQgdlRyYWNlQ2hhbm5lbFByaW50Rl9IZWxwZXIoVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsUGFpciwgdmFfbGlzdCB2bCk7DQpzdGF0aWMgdm9pZCBwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjEoVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsLCB0cmFjZUxhYmVsIGV2ZW50TGFiZWwsIHRyYWNlTGFiZWwgZm9ybWF0TGFiZWwsIHZhX2xpc3QgdmwpOw0Kc3RhdGljIHZvaWQgcHJ2VHJhY2VVc2VyRXZlbnRIZWxwZXIyKFVzZXJFdmVudENoYW5uZWwgY2hhbm5lbCwgdWludDMyX3QqIGRhdGEsIHVpbnQzMl90IG5vT2ZTbG90cyk7DQojZW5kaWYNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VJbml0VHJhY2VEYXRhDQogKg0KICogQWxsb2NhdGVzLCBpZiBuZWNlc3NhcnksIGFuZCBpbml0aWFsaXplcyB0aGUgcmVjb3JkZXIgZGF0YSBzdHJ1Y3R1cmUsIGJhc2VkDQogKiBvbiB0aGUgY29uc3RhbnRzIGluIHRyY0NvbmZpZy5oLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlSW5pdFRyYWNlRGF0YSh2b2lkKQ0Kew0KCXBydlRyYWNlSW5pdFRyYWNlRGF0YSgpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU2V0UmVjb3JkZXJEYXRhDQogKg0KICogSWYgY3VzdG9tIGFsbG9jYXRpb24gaXMgdXNlZCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBzbyB0aGUgcmVjb3JkZXINCiAqIGxpYnJhcnkga25vd3Mgd2hlcmUgdG8gc2F2ZSB0aGUgdHJhY2UgZGF0YS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojaWYgVFJBQ0VfREFUQV9BTExPQ0FUSU9OID09IFRSQUNFX0RBVEFfQUxMT0NBVElPTl9DVVNUT00NCnZvaWQgdlRyYWNlU2V0UmVjb3JkZXJEYXRhKHZvaWQqIHBSZWNvcmRlckRhdGEpDQp7DQoJVFJBQ0VfQVNTRVJUKHBSZWNvcmRlckRhdGEgIT0gTlVMTCwgInZUcmFjZVNldFRyYWNlRGF0YSwgcFJlY29yZGVyRGF0YSA9PSBOVUxMIiwgKTsNCglSZWNvcmRlckRhdGFQdHIgPSBwUmVjb3JkZXJEYXRhOw0KfQ0KI2VuZGlmDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VDbGVhcg0KICoNCiAqIFJlc2V0cyB0aGUgcmVjb3JkZXIuIE9ubHkgbmVjZXNzYXJ5IGlmIGEgcmVzdGFydCBpcyBkZXNpcmVkIC0gdGhpcyBpcyBub3QNCiAqIG5lZWRlZCBpbiB0aGUgc3RhcnR1cCBpbml0aWFsaXphdGlvbi4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZUNsZWFyKHZvaWQpDQp7DQogICAgVFJBQ0VfU1JfQUxMT0NfQ1JJVElDQUxfU0VDVElPTigpOw0KICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCg0KICAgIFJlY29yZGVyRGF0YVB0ci0+YWJzVGltZUxhc3RFdmVudCA9IDA7DQogICAgUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ID0gMDsNCiAgICBSZWNvcmRlckRhdGFQdHItPm51bUV2ZW50cyA9IDA7DQogICAgUmVjb3JkZXJEYXRhUHRyLT5idWZmZXJJc0Z1bGwgPSAwOw0KCXRyYWNlRXJyb3JNZXNzYWdlID0gTlVMTDsNCglSZWNvcmRlckRhdGFQdHItPmludGVybmFsRXJyb3JPY2N1cmVkID0gMDsNCg0KICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQoNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHVpVHJhY2VTdGFydA0KICoNCiAqIFN0YXJ0cyB0aGUgcmVjb3JkZXIuIFRoZSByZWNvcmRlciB3aWxsIG5vdCBiZSBzdGFydGVkIGlmIGFuIGVycm9yIGhhcyBiZWVuDQogKiBpbmRpY2F0ZWQgdXNpbmcgdlRyYWNlRXJyb3IsIGUuZy4gaWYgYW55IG9mIHRoZSBOeCBjb25zdGFudHMgaW4gdHJjQ29uZmlnLmgNCiAqIGhhcyBhIHRvbyBzbWFsbCB2YWx1ZSAoTlRBU0ssIE5RVUVVRSwgZXRjKS4NCiAqDQogKiBSZXR1cm5zIDEgaWYgdGhlIHJlY29yZGVyIHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseS4NCiAqIFJldHVybnMgMCBpZiB0aGUgcmVjb3JkZXIgc3RhcnQgd2FzIHByZXZlbnRlZCBkdWUgdG8gYSBwcmV2aW91cyBpbnRlcm5hbA0KICogZXJyb3IuIEluIHRoYXQgY2FzZSwgY2hlY2sgdlRyYWNlR2V0TGFzdEVycm9yIHRvIGdldCB0aGUgZXJyb3IgbWVzc2FnZS4NCiAqIEFueSBlcnJvciBtZXNzYWdlIGlzIGFsc28gcHJlc2VudGVkIHdoZW4gb3BlbmluZyBhIHRyYWNlIGZpbGUuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQp1aW50MzJfdCB1aVRyYWNlU3RhcnQodm9pZCkNCnsNCglvYmplY3RIYW5kbGVUeXBlIGhhbmRsZTsNCiAgICBUUkFDRV9TUl9BTExPQ19DUklUSUNBTF9TRUNUSU9OKCk7DQoNCgloYW5kbGUgPSAwOw0KDQoJaWYgKFJlY29yZGVyRGF0YVB0ciA9PSBOVUxMKQ0KCXsNCgkJdlRyYWNlRXJyb3IoIlJlY29yZGVyRGF0YVB0ciBpcyBOVUxMLiBDYWxsIHZUcmFjZUluaXRUcmFjZURhdGEoKSBiZWZvcmUgc3RhcnRpbmcgdHJhY2UuIik7DQoJCXJldHVybiAwOw0KCX0NCiAgICBpZiAodHJhY2VFcnJvck1lc3NhZ2UgPT0gTlVMTCkNCiAgICB7DQogICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCiAgICAgICAgUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSA9IDE7DQoNCgkJaGFuZGxlID0gVFJBQ0VfR0VUX1RBU0tfTlVNQkVSKFRSQUNFX0dFVF9DVVJSRU5UX1RBU0soKSk7DQoJCWlmIChoYW5kbGUgPT0gMCkNCgkJew0KCQkJLyogVGhpcyBvY2N1cnMgaWYgdGhlIHNjaGVkdWxlciBpcyBub3QgeWV0IHN0YXJ0ZWQuDQoJCQlUaGlzIGNyZWF0ZXMgYSBkdW1teSAiKHN0YXJ0dXApIiB0YXNrIGVudHJ5IGludGVybmFsbHkgaW4gdGhlDQoJCQlyZWNvcmRlciAqLw0KCQkJaGFuZGxlID0geFRyYWNlR2V0T2JqZWN0SGFuZGxlKFRSQUNFX0NMQVNTX1RBU0spOw0KCQkJdlRyYWNlU2V0T2JqZWN0TmFtZShUUkFDRV9DTEFTU19UQVNLLCBoYW5kbGUsICIoc3RhcnR1cCkiKTsNCg0KCQkJdlRyYWNlU2V0UHJpb3JpdHlQcm9wZXJ0eShUUkFDRV9DTEFTU19UQVNLLCBoYW5kbGUsIDApOw0KCQl9DQoNCiAgICAgICAgdlRyYWNlU3RvcmVUYXNrc3dpdGNoKGhhbmRsZSk7IC8qIFJlZ2lzdGVyIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrICovDQogICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQogICAgfQ0KDQogICAgcmV0dXJuIFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdGFydA0KICoNCiAqIFN0YXJ0cyB0aGUgcmVjb3JkZXIuIFRoZSByZWNvcmRlciB3aWxsIG5vdCBiZSBzdGFydGVkIGlmIGFuIGVycm9yIGhhcyBiZWVuDQogKiBpbmRpY2F0ZWQgdXNpbmcgdlRyYWNlRXJyb3IsIGUuZy4gaWYgYW55IG9mIHRoZSBOeCBjb25zdGFudHMgaW4gdHJjQ29uZmlnLmgNCiAqIGhhcyBhIHRvbyBzbWFsbCB2YWx1ZSAoTlRBU0ssIE5RVUVVRSwgZXRjKS4NCiAqDQogKiBUaGlzIGZ1bmN0aW9uIGlzIG9ic29sZXRlLCBidXQgaGFzIGJlZW4gc2F2ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Lg0KICogV2UgcmVjb21tZW5kIHVzaW5nIHVpVHJhY2VTdGFydCBpbnN0ZWFkLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RhcnQodm9pZCkNCnsNCiAgICAodm9pZCl1aVRyYWNlU3RhcnQoKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3ANCiAqDQogKiBTdG9wcyB0aGUgcmVjb3JkZXIuIFRoZSByZWNvcmRpbmcgY2FuIGJlIHJlc3VtZWQgYnkgY2FsbGluZyB2VHJhY2VTdGFydC4NCiAqIFRoaXMgZG9lcyBub3QgcmVzZXQgdGhlIHJlY29yZGVyLiBVc2UgdlRyYWNlQ2xlYXIgaWYgdGhhdCBpcyBkZXNpcmVkLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcCh2b2lkKQ0Kew0KICAgIFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgPSAwOw0KCQ0KCWlmICh2VHJhY2VTdG9wSG9va1B0ciAhPSAoVFJBQ0VfU1RPUF9IT09LKTApDQoJew0KCQkoKnZUcmFjZVN0b3BIb29rUHRyKSgpOyAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsIGFuIGFwcGxpY2F0aW9uIGxldmVsIGNhbGwgYmFjayBmdW5jdGlvbi4gKi8NCgl9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB4VHJhY2VHZXRMYXN0RXJyb3INCiAqDQogKiBHaXZlcyB0aGUgbGFzdCBlcnJvciBtZXNzYWdlLCBpZiBhbnkuIE5VTEwgaWYgbm8gZXJyb3IgbWVzc2FnZSBpcyBzdG9yZWQuDQogKiBBbnkgZXJyb3IgbWVzc2FnZSBpcyBhbHNvIHByZXNlbnRlZCB3aGVuIG9wZW5pbmcgYSB0cmFjZSBmaWxlLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmNoYXIqIHhUcmFjZUdldExhc3RFcnJvcih2b2lkKQ0Kew0KCXJldHVybiB0cmFjZUVycm9yTWVzc2FnZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogdlRyYWNlQ2xlYXJFcnJvcg0KKg0KKiBSZW1vdmVzIGFueSBwcmV2aW91cyBlcnJvciBtZXNzYWdlIGdlbmVyYXRlZCBieSByZWNvcmRlciBjYWxsaW5nIHZUcmFjZUVycm9yLiANCiogQnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBpdCBtYXkgYmUgcG9zc2libGUgdG8gc3RhcnQvcmVzdGFydCB0aGUgdHJhY2UgDQoqIGRlc3BpdGUgZXJyb3JzIGluIHRoZSByZWNvcmRlciwgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSB0cmFjZSANCiogcmVjb3JkZXIgd2lsbCB3b3JrIGNvcnJlY3RseSBpbiB0aGF0IGNhc2UsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBlcnJvci4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlQ2xlYXJFcnJvcihpbnQgcmVzZXRFcnJvck1lc3NhZ2UpDQp7DQoJKCB2b2lkICkgcmVzZXRFcnJvck1lc3NhZ2U7DQoJdHJhY2VFcnJvck1lc3NhZ2UgPSBOVUxMOwkNCglSZWNvcmRlckRhdGFQdHItPmludGVybmFsRXJyb3JPY2N1cmVkID0gMDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZUdldFRyYWNlQnVmZmVyDQogKg0KICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJlY29yZGVyIGRhdGEgc3RydWN0dXJlLiBVc2UgdGhpcyB0b2dldGhlciB3aXRoDQogKiB1aVRyYWNlR2V0VHJhY2VCdWZmZXJTaXplIGlmIHlvdSB3aXNoIHRvIGltcGxlbWVudCBhbiBvd24gc3RvcmUvdXBsb2FkDQogKiBzb2x1dGlvbiwgZS5nLiwgaW4gY2FzZSBhIGRlYnVnZ2VyIGNvbm5lY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgdXBsb2FkaW5nDQogKiB0aGUgZGF0YS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkKiB2VHJhY2VHZXRUcmFjZUJ1ZmZlcih2b2lkKQ0Kew0KICAgIHJldHVybiBSZWNvcmRlckRhdGFQdHI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB1aVRyYWNlR2V0VHJhY2VCdWZmZXJTaXplDQogKg0KICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcmVjb3JkZXIgZGF0YSBzdHJ1Y3R1cmUuIEZvciB1c2UgdG9nZXRoZXIgd2l0aA0KICogdlRyYWNlR2V0VHJhY2VCdWZmZXIgaWYgeW91IHdpc2ggdG8gaW1wbGVtZW50IGFuIG93biBzdG9yZS91cGxvYWQgc29sdXRpb24sDQogKiBlLmcuLCBpbiBjYXNlIGEgZGVidWdnZXIgY29ubmVjdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciB1cGxvYWRpbmcgdGhlIGRhdGEuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdWludDMyX3QgdWlUcmFjZUdldFRyYWNlQnVmZmVyU2l6ZSh2b2lkKQ0Kew0KICAgIHJldHVybiBzaXplb2YoUmVjb3JkZXJEYXRhVHlwZSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVRhc2tJbnN0YW5jZUlzRmluaXNoZWQNCiAqDQogKiBUaGlzIGRlZmluZXMgYW4gZXhwbGljaXQgSW5zdGFuY2UgRmluaXNoIEV2ZW50IGZvciB0aGUgY3VycmVudCB0YXNrLiBJdCB0ZWxscw0KICogdGhlIHJlY29yZGVyIHRoYXQgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhpcyB0YXNrIGlzIGZpbmlzaGVkIGF0IHRoZSANCiAqIGNvbnRleHQtc3dpdGNoLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYmVmb3JlIHRoZSBBUEkgZnVuY3Rpb24gDQogKiBjYWxsIGNvbnNpZGVyZWQgdG8gYmUgdGhlIEluc3RhbmNlIEZpbmlzaCBFdmVudC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlVGFza0luc3RhbmNlSXNGaW5pc2hlZCgpDQp7DQogICAgaWYgKGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCgkJVFJBQ0VfUFJPUEVSVFlfT0JKRUNUX1NUQVRFKFRSQUNFX0NMQVNTX1RBU0ssIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKSA9IDA7DQogICAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogSW50ZXJydXB0IHJlY29yZGluZyBmdW5jdGlvbnMNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpZiAoSU5DTFVERV9JU1JfVFJBQ0lORyA9PSAxKQ0KDQojZGVmaW5lIE1BWF9JU1JfTkVTVElORyAxNg0Kc3RhdGljIHVpbnQ4X3QgaXNyc3RhY2tbTUFYX0lTUl9ORVNUSU5HXTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVNldElTUlByb3BlcnRpZXMNCiAqDQogKiBSZWdpc3RlcnMgYW4gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSBpbiB0aGUgcmVjb3JkZXIgbGlicmFyeSwgVGhpcyBtdXN0IGJlDQogKiBjYWxsZWQgYmVmb3JlIHVzaW5nIHZUcmFjZVN0b3JlSVNSQmVnaW4gdG8gc3RvcmUgSVNSIGV2ZW50cy4gVGhpcyBpcw0KICogdHlwaWNhbGx5IGNhbGxlZCBpbiB0aGUgc3RhcnR1cCBvZiB0aGUgc3lzdGVtLCBiZWZvcmUgdGhlIHNjaGVkdWxlciBpcw0KICogc3RhcnRlZC4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxICAgICAgIC8vIGxvd2VzdCB2YWxpZCBJRCBpcyAxDQogKiAgICAgI2RlZmluZSBQUklPX09GX0lTUl9USU1FUjEgMyAgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICogICAgIC4uLg0KICogICAgIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICogICAgIHsNCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JCZWdpbihJRF9PRl9JU1JfVElNRVIxKTsNCiAqICAgICAgICAgLi4uDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSRW5kKCk7DQogKiAgICAgfQ0KICoNCiAqIE5PVEU6IFRvIHNhZmVseSByZWNvcmQgSVNScywgeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHRyYWNlZA0KICogaW50ZXJydXB0cyBhY3R1YWxseSBhcmUgZGlzYWJsZWQgYnkgdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpLiBIb3dldmVyLA0KICogaW4gc29tZSBwb3J0cyB0aGlzIGRvZXMgbm90IGRpc2FibGUgaGlnaCBwcmlvcml0eSBpbnRlcnJ1cHRzIQ0KICogSWYgYW4gSVNSIGNhbGxzIHZUcmFjZVN0b3JlSVNSQmVnaW4gd2hpbGUgdGhlIHJlY29yZGVyIGlzIGJ1c3ksIGl0IHdpbGwNCiAqIHN0b3AgdGhlIHJlY29yZGluZyBhbmQgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhvYmplY3RIYW5kbGVUeXBlIGhhbmRsZSwgY29uc3QgY2hhciogbmFtZSwgY2hhciBwcmlvcml0eSkNCnsNCglUUkFDRV9BU1NFUlQoaGFuZGxlIDw9IFJlY29yZGVyRGF0YVB0ci0+T2JqZWN0UHJvcGVydHlUYWJsZS5OdW1iZXJPZk9iamVjdHNQZXJDbGFzc1tUUkFDRV9DTEFTU19JU1JdLCAidlRyYWNlU2V0SVNSUHJvcGVydGllczogSW52YWxpZCB2YWx1ZSBmb3IgaGFuZGxlIiwgKTsNCglUUkFDRV9BU1NFUlQobmFtZSAhPSBOVUxMLCAidlRyYWNlU2V0SVNSUHJvcGVydGllczogbmFtZSA9PSBOVUxMIiwgKTsNCglUUkFDRV9BU1NFUlQocHJpb3JpdHkgPj0gMCwgInZUcmFjZVNldElTUlByb3BlcnRpZXM6IEludmFsaWQgdmFsdWUgZm9yIHByaW9yaXR5IiwgKTsNCg0KICAgIHZUcmFjZVNldE9iamVjdE5hbWUoVFJBQ0VfQ0xBU1NfSVNSLCBoYW5kbGUsIG5hbWUpOw0KICAgIHZUcmFjZVNldFByaW9yaXR5UHJvcGVydHkoVFJBQ0VfQ0xBU1NfSVNSLCBoYW5kbGUsIHByaW9yaXR5KTsNCn0NCg0KI2lmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfQVJNX0NvcnRleE0pDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiAoQWR2YW5jZWQuLi4pDQogKg0KICogSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQgKEZvciBDb3J0ZXgtTSBkZXZpY2VzIG9ubHkpDQogKg0KICogQVJNIENvcnRleC1NIGRldmljZXMgbWF5IGV4ZWN1dGUgSVNScyBiYWNrLXRvLWJhY2sgKHRhaWwtY2hhaW5lZCkgd2l0aG91dCANCiAqIHJlc3VtaW5nIHRoZSBwcmV2aW91cyBjb250ZXh0IGluIGJldHdlZW4uIFNpbmNlIHRoaXMgaXMgZGVjaWRlZCBpbiANCiAqIGhhcmR3YXJlLCB3ZSBjYW4gb25seSBkZXRlY3QgdGhpcyBpbmRpcmVjdGx5LCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjoNCiAqDQogKiBXaGVuIGVudGVyaW5nIHZUcmFjZVN0b3JlSVNSQmVnaW4sIHdlIGNoZWNrIHRoZSBudW1iZXIgb2YgQ1BVIGN5Y2xlcyBzaW5jZSANCiAqIHRoZSBsYXN0IHJldHVybiBvZiB2VHJhY2VTdG9yZUlTUkVuZC4gSWYgbGVzcyBvciBlcXVhbCB0byB0aGUgY29uc3RhbnQNCiAqIElTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgSVNScyBleGVjdXRlZCBiYWNrLXRvLWJhY2sNCiAqICh0YWlsLWNoYWluZWQpLiBJbiB0aGF0IGNhc2UsIHRoZSBwcmV2aW91c2x5IHN0b3JlZCBSRVNVTUUgZXZlbnQgDQogKiAocG9pbnRlZCB0byBieSBwdHJMYXN0SVNSRXhpdEV2ZW50KSBpcyB0aGVuIGRlbGV0ZWQgdG8gYXZvaWQgc2hvd2luZyBhIA0KICogZnJhZ21lbnQgb2YgdGhlIHByZXZpb3VzIGNvbnRleHQgaW4gYmV0d2VlbiB0aGUgSVNSIGV2ZW50cy4gVGhlIGRlbGV0ZSBpcw0KICogbWFkZSBieSByZXBsYWNpbmcgdGhlIGV2ZW50IGNvZGUgd2l0aCBhIFhUUzE2TCBldmVudCwgdGhhdCBzZXJ2ZXMgdG8ga2VlcA0KICogdGhlIGRpZmZlcmVudGlhbCB0aW1lc3RhbXAgZnJvbSB0aGUgZWFybGllciBldmVudC4NCiAqDQogKiBUaGUgdmFsdWUgb2YgSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQgZGVwZW5kcyBvbiB0aGUgaW50ZXJydXB0IGxhdGVuY3kgb2YgDQogKiB0aGUgcHJvY2Vzc29yLCBvbiB0aGUgY29tcGlsZXIgYW5kIG9uIHRoZSBjb21waWxlciBzZXR0aW5ncywgYnV0IHNob3VsZCBiZSANCiAqIGFyb3VuZCA3MCBjeWNsZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDY2IGN5Y2xlcywgd2hpY2ggc2hvdWxkIGJlIGNvcnJlY3Qgd2hlbiANCiAqIHVzaW5nIEdDQyB3aXRoIG9wdGltaXphdGlvbnMgZGlzYWJsZWQgKC1PMCkgYW5kIENvcnRleC1NMy9NNC4NCiAqDQogKiBUbyBtZWFzdXJlIHRoaXMgdmFsdWUsIHNlZSBNRUFTVVJFX0lTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIGJlbG93Lg0KICoNCiAqIElmIHRoaXMgdmFsdWUgc2V0IHRvbyBsb3csIHRhaWwtY2hhaW5lZCBJU1JzIHdpbGwgaW5jb3JyZWN0bHkgYmUgc2hvd24gDQogKiBzZXBhcmF0ZWQsIHdpdGggYSBzaG9ydCBmcmFnbWVudCBvZiB0aGUgcHJldmlvdXMgdGFzayBvciBJU1IgaW4gYmV0d2Vlbi4NCiAqIElmIHRoaXMgdmFsdWUgaXMgc2V0IHRvbyBoaWdoLCB5b3UgZ2V0IHRoZSBvcHBvc2l0ZSBlZmZlY3QgLSBzZXBhcmF0ZSBJU1JzIA0KICogd2lsbCBhcHBlYXIgdG8gZXhlY3V0ZSB0YWlsLWNoYWluZWQgYW5kIHdpbGwgYXBwZWFyIHRvIGhhdmUgaGlnaGVyIGV4ZWN1dGlvbiANCiAqIHRpbWUgYW5kIHJlc3BvbnNlIHRpbWUgKG1heGltdW0gSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQgY3ljbGVzIG1vcmUpLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZSBJU1JfVEFJTENIQUlOSU5HX1RIUkVTSE9MRCA2Ng0KDQp1aW50OF90KiBwdHJMYXN0SVNSRXhpdEV2ZW50ID0gTlVMTDsNCnVpbnQzMl90IERXVEN5Y2xlQ291bnRBdExhc3RJU1JFeGl0ID0gMDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogKEFkdmFuY2VkLi4uKQ0KICoNCiAqIE1FQVNVUkVfSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQgKEZvciBDb3J0ZXgtTSBkZXZpY2VzIG9ubHkpDQogKg0KICogQWxsb3dzIGZvciBtZWFzdXJpbmcgdGhlIHZhbHVlIG9mIElTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIChzZWUgYWJvdmUpLg0KICoNCiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gbWVhc3VyZSB0aGUgbWluaW11bSBudW1iZXIgb2YgY2xvY2sgY3ljbGVzIGZyb20gdGhlIGVuZA0KICogb2YgdlRyYWNlU3RvcmVJU1JFbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9sbG93aW5nIHZUcmFjZVN0b3JlSVNSQmVnaW4uDQogKiBGb3IgdGhpcyBwdXJwb3NlLCB3ZSBhc3N1bWUgYSB0ZXN0IHNldHVwIHVzaW5nIHRoZSBTeXNUaWNrIGludGVycnVwdCwgd2hpY2ggDQogKiBpcyBhdmFpbGFibGUgb24gbW9zdCBDb3J0ZXgtTSBkZXZpY2VzIGFuZCB0eXBpY2FsbHkgdXNlZCBieSB0aGUgUlRPUyBrZXJuZWwuIA0KICogVG8gZG8gdGhlIG1lYXN1cmVtZW50LCBmb2xsb3cgdGhlc2Ugc3RlcHM6DQogKiANCiAqIDEuIE1ha2Ugc3VyZSBNRUFTVVJFX0lTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIGlzIGVuYWJsZWQgKGRlZmluZWQgYXMgMSkNCiAqDQogKiAyLiBUZW1wb3JhcmlseSByZXBsYWNlIHlvdXIgU3lzVGljayBoYW5kbGVyIHdpdGggdGhlIGZvbGxvd2luZzoNCiAqICAgIA0KICogICAgdm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICkNCiAqICAgIHsNCiAqICAgICAgIHZUcmFjZVN0b3JlSVNSQmVnaW4oMSk7IA0KICogICAgICAgdlRyYWNlU3RvcmVJU1JFbmQoKTsNCiAqICAgIH0NCiAqDQogKiAzLiBUbyBtYWtlIHN1cmUgdGhhdCB0aGUgSVNScyBleGVjdXRlIGJhY2stdG8tYmFjaywgaW5jcmVhc2UgdGhlIE9TIHRpY2sgDQogKiAgICBmcmVxdWVuY3kgdG8gYSB2ZXJ5IGhpZ2ggbGV2ZWwgc28gdGhhdCB0aGUgT1MgdGljayBpbnRlcnJ1cHQgZXhlY3V0ZSANCiAqICAgIGNvbnRpbnVvdXNseSB3aXRoIG5vIGFwcGxpY2F0aW9uIHRhc2tzIGluIGJldHdlZW4uIEEgdGljayBmcmVxdWVuY3kgb2YgDQogKiAgICAxIE1IeiAoMS4wMDAuMDAwKSBzaG91bGQgYmUgc3VmZmljaWVudC4NCiAqDQogKiA0LiBQdXQgYSBicmVha3BvaW50IGluIHRoZSBoaWdoZXN0IHByaW9yaXR5IHRhc2sgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgDQogKiAgICByZWFjaGVkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIFN5c1RpY2sgaGFuZGxlciBpcyBleGVjdXRpbmcgYXQgbWF4aW11bSByYXRlDQogKiAgICBhbmQgdGhlcmVieSB0YWlsLWNoYWluZWQsIHdoZXJlIHRoZSBpbnRlcnJ1cHQgbGF0ZW5jeSBpcyA2IGN5Y2xlcy4NCiAqDQogKiA1LiBMZXQgdGhlIHN5c3RlbSBydW4gd2l0aG91dCBicmVha3BvaW50cyBhbmQgaW5zcGVjdCB0aGUgdmFsdWUgb2YgDQogKiAgICB0aHJlc2hvbGRfbG93X3dhdGVybWFyay4gVGhpcyBpcyB0aGUgbWluaW11bSB0b3RhbCBsYXRlbmN5IG9ic2VydmVkLiANCiAqICAgIFRoZSBoYXJkd2FyZSBsYXRlbmN5IGlzIDYgY2xvY2sgY3ljbGVzIGR1ZSB0byB0aGUgdGFpbC1jaGFpbmluZywgc28gdGhlIA0KICogICAgc29mdHdhcmUgbGF0ZW5jeSAoU0wpIGlzIHRoZW4gU0wgPSB0aHJlc2hvbGRfbG93X3dhdGVybWFyayAtIDYuDQogKiANCiAqIFRoZSB0aHJlc2hvbGQgdmFsdWUgSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQgc2hvdWxkIGJlIFNMICsgMiAqIEhMLCB3aGVyZSANCiAqIEhMIGlzIHRoZSBub3JtYWwgaGFyZHdhcmUgaW50ZXJydXB0IGxhdGVuY3ksIGkuZS4sIHRoZSBudW1iZXIgb2YgQ1BVIA0KICogY3ljbGVzIHRvIGVudGVyIG9yIGV4aXQgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBhbiBleGNlcHRpb24gaW4gdGFzayANCiAqIGNvbnRleHQuIFRoZSBITCB2YWx1ZSBpcyAxMi0xNiBkZXBlbmRpbmcgb24gY29yZSwgYXMgc2hvd24gYmVsb3cuDQogKiANCiAqIFZhbHVlcyBmb3IgSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQsIGFzc3VtaW5nIFNMID0gNDINCiAqICAgQ29ydGV4LU0zIGFuZCBNNCAoSEwgPSAxMik6CTY2IGN5Y2xlcw0KICogICBDb3J0ZXgtTTAgKEhMID0gMTYpOgkJCTc0IGN5Y2xlcw0KICogICBDb3J0ZXgtTTArIChITCA9IDE1KTogICAgICAgICAgNzIgY3ljbGVzDQogKg0KICogSWYgdGhlIElTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIHZhbHVlIGlzIHNldCB0b28gbG93LCBzb21lIHRhaWwtY2hhaW5lZA0KICogSVNScyBiZSBzaG93biBzZXBhcmF0ZWQsIHdpdGggYSBzaG9ydCBmcmFnbWVudCBvZiB0aGUgcHJldmlvdXMgYWN0b3IuIElmIA0KICogdGhlIHZhbHVlIGlzIHNldCB0b28gaGlnaCwgc2VwYXJhdGUgSVNScyB3aWxsIGFwcGVhciB0byBleGVjdXRlIHRhaWwtY2hhaW5lZA0KICogYW5kIGZvciB0b28gbG9uZyB0aW1lLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZSBNRUFTVVJFX0lTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIDENCg0KI2lmIChNRUFTVVJFX0lTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEID09IDEpDQp2b2xhdGlsZSB1aW50MzJfdCB0aHJlc2hvbGRfbG93X3dhdGVybWFyayA9IDIwMDAwMDAwMDA7DQojZW5kaWYNCg0KI2VuZGlmDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9yZUlTUkJlZ2luDQogKg0KICogUmVnaXN0ZXJzIHRoZSBiZWdpbm5pbmcgb2YgYW4gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxICAgICAgIC8vIGxvd2VzdCB2YWxpZCBJRCBpcyAxDQogKiAgICAgI2RlZmluZSBQUklPX09GX0lTUl9USU1FUjEgMyAgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICogICAgIC4uLg0KICogICAgIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICogICAgIHsNCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JCZWdpbihJRF9PRl9JU1JfVElNRVIxKTsNCiAqICAgICAgICAgLi4uDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSRW5kKCk7DQogKiAgICAgfQ0KICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0b3JlSVNSQmVnaW4ob2JqZWN0SGFuZGxlVHlwZSBoYW5kbGUpDQp7DQogICAgdWludDE2X3QgZHRzNDsNCgkjaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BUk1fQ29ydGV4TSkNCgl1aW50MzJfdCBDUFVDeWNsZXNTaW5jZUxhc3RJU1JFeGl0ID0gRFdUX0NZQ0xFX0NPVU5URVIgLSBEV1RDeWNsZUNvdW50QXRMYXN0SVNSRXhpdDsNCgkjZW5kaWYJDQogICAgVFNFdmVudCogdHM7DQogICAgVFJBQ0VfU1JfQUxMT0NfQ1JJVElDQUxfU0VDVElPTigpOw0KDQoJdHMgPSBOVUxMOw0KDQojaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BUk1fQ29ydGV4TSkNCglpZiAoRFdUQ3ljbGVDb3VudEF0TGFzdElTUkV4aXQgPiAwKQkNCgl7DQoJCSNpZiAoTUVBU1VSRV9JU1JfVEFJTENIQUlOSU5HX1RIUkVTSE9MRCA9PSAxKSAJCQ0KCQkvKiBBbGxvd3MgZm9yIHZlcmlmeWluZyB0aGUgdmFsdWUgb2YgSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQgKi8NCgkJaWYgKENQVUN5Y2xlc1NpbmNlTGFzdElTUkV4aXQgPCB0aHJlc2hvbGRfbG93X3dhdGVybWFyaykNCgkJew0KCQkJdGhyZXNob2xkX2xvd193YXRlcm1hcmsgPSBDUFVDeWNsZXNTaW5jZUxhc3RJU1JFeGl0Ow0KCQl9DQoJCSNlbmRpZg0KCQkNCgkJaWYgKENQVUN5Y2xlc1NpbmNlTGFzdElTUkV4aXQgPD0gSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQpCQkNCgkJewkJCQ0KCQkJLyogVGhpcyBpcyBqdWRnZWQgdG8gYmUgYSBjYXNlIG9mIElTUiB0YWlsLWNoYWluaW5nIHNpbmNlIHRoZSANCgkJCW51bWJlciBvZiBjeWNsZXMgc2luY2UgdGhlIGxhc3QgdlRyYWNlU3RvcmVJU1JFbmQgaXMgc2hvcnRlciBvciBlcXVhbCB0bw0KCQkJdGhlIHRocmVzaG9sZCAoSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQpICovDQoJCQkNCgkJCWlmIChwdHJMYXN0SVNSRXhpdEV2ZW50ICE9IE5VTEwpDQoJCQl7CQkJCQ0KCQkJCS8qIE92ZXJ3cml0ZSB0aGUgbGFzdCBJU1IgZXhpdCBldmVudCB3aXRoIGEgIm5ldXRyYWwiIGV2ZW50IHRoYXQgb25seQ0KICAgICAgICAgICAgICAgICAgIGFjY291bnRzIGZvciB0aGUgdGltZSBwYXNzZWQgKi8NCgkJCQkqcHRyTGFzdElTUkV4aXRFdmVudCA9IFhUUzE2TDsJCQkJCQkJDQoJCQl9CQkJDQoJCX0NCgkJDQoJfQ0KI2VuZGlmDQoJDQogICAgaWYgKHJlY29yZGVyX2J1c3kpDQogICAgew0KICAgICAgdlRyYWNlRXJyb3IoIklsbGVnYWwgY2FsbCB0byB2VHJhY2VTdG9yZUlTUkJlZ2luLCByZWNvcmRlciBidXN5ISIpOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCgl0cmNDUklUSUNBTF9TRUNUSU9OX0JFR0lOKCk7DQogICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQogICAgew0KDQoJICAgIFRSQUNFX0FTU0VSVChoYW5kbGUgPD0gUmVjb3JkZXJEYXRhUHRyLT5PYmplY3RQcm9wZXJ0eVRhYmxlLk51bWJlck9mT2JqZWN0c1BlckNsYXNzW1RSQUNFX0NMQVNTX0lTUl0sICJ2VHJhY2VTdG9yZUlTUkJlZ2luOiBJbnZhbGlkIHZhbHVlIGZvciBoYW5kbGUiLCApOw0KDQogICAgICAgIGR0czQgPSAodWludDE2X3QpcHJ2VHJhY2VHZXREVFMoMHhGRkZGKTsNCg0KICAgICAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkgLyogTmVlZCB0byByZXBlYXQgdGhpcyBjaGVjayEgKi8NCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKG5JU1JhY3RpdmUgPCBNQVhfSVNSX05FU1RJTkcpDQogICAgICAgICAgICB7DQoJCQkJdWludDhfdCBobmQ4ID0gcHJ2VHJhY2VHZXQ4Qml0SGFuZGxlKGhhbmRsZSk7DQogICAgICAgICAgICAgICAgaXNyc3RhY2tbbklTUmFjdGl2ZV0gPSBoYW5kbGU7DQogICAgICAgICAgICAgICAgbklTUmFjdGl2ZSsrOw0KICAgICAgICAgICAgICAgIHRzID0gKFRTRXZlbnQqKXhUcmFjZU5leHRGcmVlRXZlbnRCdWZmZXJTbG90KCk7DQogICAgICAgICAgICAgICAgaWYgKHRzICE9IE5VTEwpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0cy0+dHlwZSA9IFRTX0lTUl9CRUdJTjsNCiAgICAgICAgICAgICAgICAgICAgdHMtPmR0cyA9IGR0czQ7DQogICAgICAgICAgICAgICAgICAgIHRzLT5vYmpIYW5kbGUgPSBobmQ4Ow0KICAgICAgICAgICAgICAgICAgICBwcnZUcmFjZVVwZGF0ZUNvdW50ZXJzKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBvY2N1ciB1bmxlc3Mgc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcgKi8NCiAgICAgICAgICAgICAgICB2VHJhY2VFcnJvcigiVG9vIG1hbnkgbmVzdGVkIGludGVycnVwdHMhIik7DQogICAgICAgICAgICB9DQogICAgICAgIH0gICAgICAgIA0KICAgIH0NCgl0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU3RvcmVJU1JFbmQNCiAqDQogKiBSZWdpc3RlcnMgdGhlIGVuZCBvZiBhbiBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lLg0KICoNCiAqIEV4YW1wbGU6DQogKiAgICAgI2RlZmluZSBJRF9JU1JfVElNRVIxIDEgICAgICAgLy8gbG93ZXN0IHZhbGlkIElEIGlzIDENCiAqICAgICAjZGVmaW5lIFBSSU9fT0ZfSVNSX1RJTUVSMSAzICAvLyB0aGUgaGFyZHdhcmUgcHJpb3JpdHkgb2YgdGhlIGludGVycnVwdA0KICogICAgIC4uLg0KICogICAgIHZUcmFjZVNldElTUlByb3BlcnRpZXMoSURfSVNSX1RJTUVSMSwgIklTUlRpbWVyMSIsIFBSSU9fT0ZfSVNSX1RJTUVSMSk7DQogKiAgICAgLi4uDQogKiAgICAgdm9pZCBJU1JfaGFuZGxlcigpDQogKiAgICAgew0KICogICAgICAgICB2VHJhY2VTdG9yZUlTUkJlZ2luKElEX09GX0lTUl9USU1FUjEpOw0KICogICAgICAgICAuLi4NCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JFbmQoKTsNCiAqICAgICB9DQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcmVJU1JFbmQodm9pZCkNCnsNCglUU0V2ZW50KiB0czsNCgl1aW50MTZfdCBkdHM1Ow0KCVRSQUNFX1NSX0FMTE9DX0NSSVRJQ0FMX1NFQ1RJT04oKTsNCg0KCWlmIChyZWNvcmRlcl9idXN5KQ0KCXsNCgkJdlRyYWNlRXJyb3IoIklsbGVnYWwgY2FsbCB0byB2VHJhY2VTdG9yZUlTUkVuZCwgcmVjb3JkZXIgYnVzeSEiKTsNCgkJcmV0dXJuOw0KCX0NCg0KCXRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCglpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSAmJiBoYW5kbGVfb2ZfbGFzdF9sb2dnZWRfdGFzaykNCgl7CQkNCgkJZHRzNSA9ICh1aW50MTZfdClwcnZUcmFjZUdldERUUygweEZGRkYpOw0KDQoJCWlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlKSAvKiBOZWVkIHRvIHJlcGVhdCB0aGlzIGNoZWNrISAqLw0KCQl7DQoJCQl1aW50OF90IGhuZDgsIHR5cGU7DQoNCgkJCWlmIChuSVNSYWN0aXZlID4gMSkNCgkJCXsNCgkJCQkvKiByZXR1cm4gdG8gYW5vdGhlciBpc3IgKi8NCgkJCQl0eXBlID0gVFNfSVNSX1JFU1VNRTsNCgkJCQlobmQ4ID0gcHJ2VHJhY2VHZXQ4Qml0SGFuZGxlKGlzcnN0YWNrW25JU1JhY3RpdmVdKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkvKiByZXR1cm4gdG8gdGFzayAqLw0KCQkJCXR5cGUgPSBUU19UQVNLX1JFU1VNRTsNCgkJCQlobmQ4ID0gcHJ2VHJhY2VHZXQ4Qml0SGFuZGxlKGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKTsNCgkJCX0NCg0KCQkJdHMgPSAoVFNFdmVudCopeFRyYWNlTmV4dEZyZWVFdmVudEJ1ZmZlclNsb3QoKTsNCg0KCQkJaWYgKHRzICE9IE5VTEwpDQoJCQl7DQoJCQkJdHMtPnR5cGUgPSB0eXBlOw0KCQkJCXRzLT5vYmpIYW5kbGUgPSBobmQ4Ow0KCQkJCXRzLT5kdHMgPSBkdHM1Ow0KCQkJCW5JU1JhY3RpdmUtLTsNCgkJCQlwcnZUcmFjZVVwZGF0ZUNvdW50ZXJzKCk7DQoJCQl9DQoJCQkJCQkNCgkJfQ0KCQkNCgkJI2lmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfQVJNX0NvcnRleE0pDQoJCS8qIFJlbWVtYmVyIHRoZSBsYXN0IElTUiBleGl0IGV2ZW50LCBhcyB0aGUgZXZlbnQgbmVlZHMgdG8gYmUgbW9kaWZpZWQgaW4gY2FzZSBvZiBhIGZvbGxvd2luZyBJU1IgZW50cnkgKGlmIHRhaWwtY2hhaW5lZCBJU1JzKSAqLw0KCQlwdHJMYXN0SVNSRXhpdEV2ZW50ID0gKHVpbnQ4X3QqKXRzOw0KCQlEV1RDeWNsZUNvdW50QXRMYXN0SVNSRXhpdCA9IERXVF9DWUNMRV9DT1VOVEVSOw0KCQkjZW5kaWYJDQoJfQ0KCXRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQp9DQoNCiNlbHNlDQoNCi8qIElTUiB0cmFjaW5nIGlzIHR1cm5lZCBvZmYgKi8NCnZvaWQgdlRyYWNlSW5jcmVhc2VJU1JBY3RpdmUodm9pZCkNCnsNCiAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSAmJiBoYW5kbGVfb2ZfbGFzdF9sb2dnZWRfdGFzaykNCiAgICAgICAgbklTUmFjdGl2ZSsrOw0KfQ0KDQp2b2lkIHZUcmFjZURlY3JlYXNlSVNSQWN0aXZlKHZvaWQpDQp7DQogICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQogICAgICAgIG5JU1JhY3RpdmUtLTsNCn0NCiNlbmRpZg0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBVc2VyIEV2ZW50IGZ1bmN0aW9ucw0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2lmIChJTkNMVURFX1VTRVJfRVZFTlRTID09IDEpDQoNCiNkZWZpbmUgTUFYX0FSR19TSVpFICg0KzMyKQ0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCnN0YXRpYyB1aW50OF90IHdyaXRlSW50OCh2b2lkICogYnVmZmVyLCB1aW50OF90IGksIHVpbnQ4X3QgdmFsdWUpDQp7DQoJVFJBQ0VfQVNTRVJUKGJ1ZmZlciAhPSBOVUxMLCAid3JpdGVJbnQ4OiBidWZmZXIgPT0gTlVMTCIsIDApOw0KDQogICAgaWYgKGkgPj0gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9DQoNCiAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaV0gPSB2YWx1ZTsNCg0KCWlmIChpICsgMSA+IE1BWF9BUkdfU0laRSkNCgl7DQoJCXJldHVybiAyNTU7DQoJfQ0KDQogICAgcmV0dXJuIGkgKyAxOw0KfQ0KDQovKioqIExvY2FsbHkgdXNlZCBpbiB2VHJhY2VQcmludEYgKioqLw0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVJbnQxNih2b2lkICogYnVmZmVyLCB1aW50OF90IGksIHVpbnQxNl90IHZhbHVlKQ0Kew0KCVRSQUNFX0FTU0VSVChidWZmZXIgIT0gTlVMTCwgIndyaXRlSW50MTY6IGJ1ZmZlciA9PSBOVUxMIiwgMCk7DQoNCiAgICAvKiBBbGlnbiB0byBtdWx0aXBsZSBvZiAyICovDQogICAgd2hpbGUgKChpICUgMikgIT0gMCkNCiAgICB7DQoJCWlmIChpID49IE1BWF9BUkdfU0laRSkNCgkJew0KCQkJcmV0dXJuIDI1NTsNCgkJfQ0KDQogICAgICAgICgodWludDhfdCopYnVmZmVyKVtpXSA9IDA7DQogICAgICAgIGkrKzsNCiAgICB9DQoNCiAgICBpZiAoaSArIDIgPiBNQVhfQVJHX1NJWkUpDQogICAgew0KICAgICAgICByZXR1cm4gMjU1Ow0KICAgIH0NCg0KICAgICgodWludDE2X3QqKWJ1ZmZlcilbaS8yXSA9IHZhbHVlOw0KDQogICAgcmV0dXJuIGkgKyAyOw0KfQ0KDQovKioqIExvY2FsbHkgdXNlZCBpbiB2VHJhY2VQcmludEYgKioqLw0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVJbnQzMih2b2lkICogYnVmZmVyLCB1aW50OF90IGksIHVpbnQzMl90IHZhbHVlKQ0Kew0KCVRSQUNFX0FTU0VSVChidWZmZXIgIT0gTlVMTCwgIndyaXRlSW50MzI6IGJ1ZmZlciA9PSBOVUxMIiwgMCk7DQoNCiAgICAvKiBBIDMyIGJpdCB2YWx1ZSBzaG91bGQgYmVnaW4gYXQgYW4gZXZlbiA0LWJ5dGUgYWRkcmVzcyAqLw0KICAgIHdoaWxlICgoaSAlIDQpICE9IDApDQogICAgew0KCQlpZiAoaSA+PSBNQVhfQVJHX1NJWkUpDQoJCXsNCgkJCXJldHVybiAyNTU7DQoJCX0NCg0KICAgICAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaV0gPSAwOw0KICAgICAgICBpKys7DQogICAgfQ0KDQogICAgaWYgKGkgKyA0ID4gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9DQoNCiAgICAoKHVpbnQzMl90KilidWZmZXIpW2kvNF0gPSB2YWx1ZTsNCg0KICAgIHJldHVybiBpICsgNDsNCn0NCg0KI2lmIChJTkNMVURFX0ZMT0FUX1NVUFBPUlQpDQoNCi8qKiogTG9jYWxseSB1c2VkIGluIHZUcmFjZVByaW50RiAqKiovDQpzdGF0aWMgdWludDhfdCB3cml0ZUZsb2F0KHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaSwgZmxvYXQgdmFsdWUpDQp7DQoJVFJBQ0VfQVNTRVJUKGJ1ZmZlciAhPSBOVUxMLCAid3JpdGVGbG9hdDogYnVmZmVyID09IE5VTEwiLCAwKTsNCg0KICAgIC8qIEEgMzIgYml0IHZhbHVlIHNob3VsZCBiZWdpbiBhdCBhbiBldmVuIDQtYnl0ZSBhZGRyZXNzICovDQogICAgd2hpbGUgKChpICUgNCkgIT0gMCkNCiAgICB7DQoJCWlmIChpID49IE1BWF9BUkdfU0laRSkNCgkJew0KCQkJcmV0dXJuIDI1NTsNCgkJfQ0KDQogICAgICAgICgodWludDhfdCopYnVmZmVyKVtpXSA9IDA7DQogICAgICAgIGkrKzsNCiAgICB9DQoNCiAgICBpZiAoaSArIDQgPiBNQVhfQVJHX1NJWkUpDQogICAgew0KICAgICAgICByZXR1cm4gMjU1Ow0KICAgIH0NCg0KICAgICgoZmxvYXQqKWJ1ZmZlcilbaS80XSA9IHZhbHVlOw0KDQogICAgcmV0dXJuIGkgKyA0Ow0KfQ0KDQovKioqIExvY2FsbHkgdXNlZCBpbiB2VHJhY2VQcmludEYgKioqLw0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVEb3VibGUodm9pZCAqIGJ1ZmZlciwgdWludDhfdCBpLCBkb3VibGUgdmFsdWUpDQp7DQoJVFJBQ0VfQVNTRVJUKGJ1ZmZlciAhPSBOVUxMLCAid3JpdGVEb3VibGU6IGJ1ZmZlciA9PSBOVUxMIiwgMCk7DQoNCiAgICB1aW50MzJfdCAqIGRlc3Q7IA0KICAgIHVpbnQzMl90ICogc3JjID0gKHZvaWQqKSZ2YWx1ZTsNCiAgICAvKiBUaGUgZG91YmxlIGlzIHdyaXR0ZW4gYXMgdHdvIDMyIGJpdCB2YWx1ZXMsIGFuZCBzaG91bGQgYmVnaW4gYXQgYW4gZXZlbg0KICAgIDQtYnl0ZSBhZGRyZXNzICh0byBhdm9pZCBoYXZpbmcgdG8gYWxpZ24gd2l0aCA4IGJ5dGUpICovDQogICAgd2hpbGUgKGkgJSA0ICE9IDApDQogICAgew0KCQlpZiAoaSA+PSBNQVhfQVJHX1NJWkUpDQoJCXsNCgkJCXJldHVybiAyNTU7DQoJCX0NCg0KICAgICAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaV0gPSAwOw0KICAgICAgICBpKys7DQogICAgfQ0KDQogICAgaWYgKGkgKyA4ID4gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9DQoJDQoJZGVzdCA9ICYoKCh1aW50MzJfdCAqKWJ1ZmZlcilbaV0pOw0KDQogICAgZGVzdFswXSA9IHNyY1swXTsNCiAgICBkZXN0WzFdID0gc3JjWzFdOw0KDQogICAgcmV0dXJuIGkgKyA4Ow0KfQ0KDQojZW5kaWYNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHBydlRyYWNlVXNlckV2ZW50Rm9ybWF0DQogKg0KICogUGFyc2VzIHRoZSBmb3JtYXQgc3RyaW5nIGFuZCBzdG9yZXMgdGhlIGFyZ3VtZW50cyBpbiB0aGUgYnVmZmVyLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB1aW50OF90IHBydlRyYWNlVXNlckV2ZW50Rm9ybWF0KGNvbnN0IGNoYXIqIGZvcm1hdFN0ciwgdmFfbGlzdCB2bCwgdWludDhfdCogYnVmZmVyLCB1aW50OF90IGJ5dGVPZmZzZXQpDQp7DQoJdWludDE2X3QgZm9ybWF0U3RySW5kZXggPSAwOw0KCXVpbnQ4X3QgYXJnQ291bnRlciA9IDA7DQoJdWludDhfdCBpID0gYnl0ZU9mZnNldDsNCg0KCXdoaWxlIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdICE9ICdcMCcpDQogICAgew0KICAgICAgICBpZiAoZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSA9PSAnJScpDQogICAgICAgIHsNCiAgICAgICAgICAgIGFyZ0NvdW50ZXIrKzsNCg0KICAgICAgICAgICAgaWYgKGFyZ0NvdW50ZXIgPiAxNSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2VHJhY2VFcnJvcigidlRyYWNlUHJpbnRGIC0gVG9vIG1hbnkgYXJndW1lbnRzLCBtYXggMTUgYWxsb3dlZCEiKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgICAgIH0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVGhlc2UgYmVsb3cgY29kZSB3cml0ZXMgcmF3IGRhdGEgKHByaW1pdGl2ZSBkYXRhdHlwZXMpIGluIHRoZSBldmVudCBidWZmZXIsDQoqIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBldmVudCBzdHJ1Y3RzICh3aGVyZSBieXRlIDAgaXMgZXZlbnQgdHlwZSkuDQoqIFRoZXNlIGRhdGEgZW50cmllcyBtdXN0IG5ldmVyIGJlIGludGVycHJldGVkIGFzIHJlYWwgZXZlbnQgZGF0YSwgYXMgdGhlIHR5cGUNCiogZmllbGQgd291bGQgYmUgbWlzbGVhZGluZyBzaW5jZSB1c2VkIGZvciBwYXlsb2FkIGRhdGEuDQoqDQoqIFRoZSBjb3JyZWN0bmVzcyBvZiB0aGlzIGVuY29kaW5nIGRlcGVuZHMgb24gdHdvIG1lY2hhbmlzbXM6DQoqDQoqIDEuIEFuIGluaXRpYWwgVVNFUl9FVkVOVCwgd2hpY2ggdHlwZSBjb2RlIHRlbGxzIHRoZSBudW1iZXIgb2YgMzItYml0IGRhdGENCiogZW50aXJlcyB0aGF0IGZvbGxvd3MuIChjb2RlIC0gVVNFUl9FVkVOVCA9IG51bWJlciBvZiBkYXRhIGVudHJpZXMpLg0KKiBOb3RlIHRoYXQgYSBkYXRhIGVudHJ5IGNvcnJlc3BvbmRzIHRvIHRoZSBzbG90cyB0aGF0IG5vcm1hbGx5IGNvcnJlc3BvbmRzIHRvDQoqIG9uZSAoMSkgZXZlbnQsIGkuZS4sIDMyIGJpdHMuIHZUcmFjZVByaW50RiBtYXkgZW5jb2RlIHNldmVyYWwgcGllY2VzIG9mIGRhdGENCiogaW4gb25lIGRhdGEgZW50cnksIGUuZy4sIHR3byAxNi1iaXQgdmFsdWVzIG9yIGZvdXIgOC1iaXQgdmFsdWVzLCBvbmUgMTYtYml0DQoqIHZhbHVlIGZvbGxvd2VkIGJ5IHR3byA4LWJpdCB2YWx1ZXMsIGV0Yy4NCioNCiogMi4gQSB0d28tcGhhc2UgY29tbWl0IHByb2NlZHVyZSwgd2hlcmUgdGhlIFVTRVJfRVZFTlQgYW5kIGRhdGEgZW50cmllcyBhcmUNCiogd3JpdHRlbiB0byBhIGxvY2FsIGJ1ZmZlciBhdCBmaXJzdCwgYW5kIHdoZW4gYWxsIGNoZWNrcyBhcmUgT0sgdGhlbiBjb3BpZWQgdG8NCiogdGhlIG1haW4gZXZlbnQgYnVmZmVyIHVzaW5nIGEgZmFzdCBtZW1jcHkuIFRoZSBldmVudCBjb2RlIGlzIGZpbmFsaXplZCBhcyB0aGUNCiogdmVyeSBsYXN0IHN0ZXAuIEJlZm9yZSB0aGF0IHN0ZXAsIHRoZSBldmVudCBjb2RlIGluZGljYXRlcyBhbiB1bmZpbmlzaGVkDQoqIGV2ZW50LCB3aGljaCBjYXVzZXMgaXQgdG8gYmUgaWdub3JlZCBhbmQgc3RvcCB0aGUgbG9hZGluZyBvZiB0aGUgZmlsZSAoc2luY2UNCiogYW4gdW5maW5pc2hlZCBldmVudCBpcyB0aGUgbGFzdCBldmVudCBpbiB0aGUgdHJhY2UpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAgICAgICAgICAgIGZvcm1hdFN0ckluZGV4Kys7DQoNCgkJCXdoaWxlICgoZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSA+PSAnMCcgJiYgZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSA8PSAnOScpIHx8IGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0gPT0gJyMnIHx8IGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0gPT0gJy4nKQ0KCQkJCWZvcm1hdFN0ckluZGV4Kys7DQoNCgkJCWlmIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdICE9ICdcMCcpDQoJCQl7DQoJCQkJc3dpdGNoIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdKQ0KCQkJCXsNCgkJCQljYXNlICdkJzogICAgaSA9IHdyaXRlSW50MzIoYnVmZmVyLA0KCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCSh1aW50MzJfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3gnOg0KCQkJCWNhc2UgJ1gnOg0KCQkJCWNhc2UgJ3UnOiAgICBpID0gd3JpdGVJbnQzMihidWZmZXIsDQoJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJKHVpbnQzMl90KXZhX2FyZyh2bCwgdWludDMyX3QpKTsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJY2FzZSAncyc6ICAgIGkgPSB3cml0ZUludDE2KGJ1ZmZlciwNCgkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkodWludDE2X3QpeFRyYWNlT3BlbkxhYmVsKChjaGFyKil2YV9hcmcodmwsIGNoYXIqKSkpOw0KCQkJCQkJCQlicmVhazsNCg0KI2lmIChJTkNMVURFX0ZMT0FUX1NVUFBPUlQpDQoJCQkJCQkJCS8qIFllcywgImRvdWJsZSIgYXMgdHlwZSBhbHNvIGluIHRoZSBmbG9hdA0KCQkJCQkJCQljYXNlLiBUaGlzIHNpbmNlICJmbG9hdCIgaXMgcHJvbW90ZWQgaW50byAiZG91YmxlIg0KCQkJCQkJCQlieSB0aGUgdmFfYXJnIHN0dWZmLiAqLw0KCQkJCWNhc2UgJ2YnOiAgICBpID0gd3JpdGVGbG9hdChidWZmZXIsDQoJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJKGZsb2F0KXZhX2FyZyh2bCwgZG91YmxlKSk7DQoJCQkJCQkJCWJyZWFrOw0KI2Vsc2UNCgkvKiBObyBzdXBwb3J0IGZvciBmbG9hdHMsIGJ1dCBhdHRlbXB0IHRvIHN0b3JlIGEgZmxvYXQgdXNlciBldmVudA0KCWF2b2lkIGEgcG9zc2libGUgY3Jhc2ggZHVlIHRvIGZsb2F0IHJlZmVyZW5jZS4gSW5zdGVhZCBzdG9yZSB0aGUNCglkYXRhIG9uIHVpbnRfMzIgZm9ybWF0ICh3aWxsIG5vdCBiZSBkaXNwbGF5ZWQgYW55d2F5KS4gVGhpcyBpcyBqdXN0DQoJdG8ga2VlcCB2YV9hcmcgYW5kIGkgY29uc2lzdGVudC4gKi8NCg0KCQkJCWNhc2UgJ2YnOiAgICBpID0gd3JpdGVJbnQzMihidWZmZXIsDQoJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJKHVpbnQzMl90KXZhX2FyZyh2bCwgZG91YmxlKSk7DQoJCQkJCQkJCWJyZWFrOw0KI2VuZGlmDQoJCQkJY2FzZSAnbCc6DQoJCQkJCWZvcm1hdFN0ckluZGV4Kys7DQoJCQkJCXN3aXRjaCAoZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSkNCgkJCQkJew0KI2lmIChJTkNMVURFX0ZMT0FUX1NVUFBPUlQpDQoJCQkJCWNhc2UgJ2YnOiAgICAgaSA9IHdyaXRlRG91YmxlKGJ1ZmZlciwNCgkJCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCQkJKGRvdWJsZSl2YV9hcmcodmwsIGRvdWJsZSkpOw0KCQkJCQkJCQlicmVhazsNCiNlbHNlDQoJLyogTm8gc3VwcG9ydCBmb3IgZmxvYXRzLCBidXQgYXR0ZW1wdCB0byBzdG9yZSBhIGZsb2F0IHVzZXIgZXZlbnQNCglhdm9pZCBhIHBvc3NpYmxlIGNyYXNoIGR1ZSB0byBmbG9hdCByZWZlcmVuY2UuIEluc3RlYWQgc3RvcmUgdGhlDQoJZGF0YSBvbiB1aW50XzMyIGZvcm1hdCAod2lsbCBub3QgYmUgZGlzcGxheWVkIGFueXdheSkuIFRoaXMgaXMganVzdA0KCXRvIGtlZXAgdmFfYXJnIGFuZCBpIGNvbnNpc3RlbnQuICovDQoJCQkJCWNhc2UgJ2YnOiAgICBpID0gd3JpdGVJbnQzMihidWZmZXIsIC8qIEluIHRoaXMgY2FzZSwgdGhlIHZhbHVlIHdpbGwgbm90IGJlIHNob3duIGFueXdheSAqLw0KCQkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkJKHVpbnQzMl90KXZhX2FyZyh2bCwgZG91YmxlKSk7DQoJCQkJCQkJCQlpID0gd3JpdGVJbnQzMihidWZmZXIsIC8qIERvIGl0IHR3aWNlLCB0byB3cml0ZSBpbiB0b3RhbCA4IGJ5dGVzICovDQoJCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCQkodWludDMyX3QpdmFfYXJnKHZsLCBkb3VibGUpKTsNCgkJCQkJCQkJYnJlYWs7DQojZW5kaWYNCg0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ2gnOg0KCQkJCQlmb3JtYXRTdHJJbmRleCsrOw0KCQkJCQlzd2l0Y2ggKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0pDQoJCQkJCXsNCgkJCQkJY2FzZSAnZCc6ICAgIGkgPSB3cml0ZUludDE2KGJ1ZmZlciwNCgkJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJCSh1aW50MTZfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAndSc6ICAgIGkgPSB3cml0ZUludDE2KGJ1ZmZlciwNCgkJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJCSh1aW50MTZfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlICdiJzoNCgkJCQkJZm9ybWF0U3RySW5kZXgrKzsNCgkJCQkJc3dpdGNoIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdKQ0KCQkJCQl7DQoJCQkJCWNhc2UgJ2QnOiAgICBpID0gd3JpdGVJbnQ4KGJ1ZmZlciwNCgkJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJCSh1aW50OF90KXZhX2FyZyh2bCwgdWludDMyX3QpKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICd1JzogICAgaSA9IHdyaXRlSW50OChidWZmZXIsDQoJCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCQkodWludDhfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQkJYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgZm9ybWF0U3RySW5kZXgrKzsNCiAgICAgICAgaWYgKGkgPT0gMjU1KQ0KICAgICAgICB7DQogICAgICAgICAgICB2VHJhY2VFcnJvcigidlRyYWNlUHJpbnRGIC0gVG9vIGxhcmdlIGFyZ3VtZW50cywgbWF4IDMyIGJ5dGUgYWxsb3dlZCEiKTsNCiAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQogICAgfQ0KCXJldHVybiAoaSszKS80Ow0KfQ0KDQojaWYgKFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAxKQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogcHJ2VHJhY2VDbGVhckNoYW5uZWxCdWZmZXINCiAqDQogKiBDbGVhcnMgYSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNoYW5uZWwgYnVmZmVyLCBzdGFydGluZyBmcm9tIG5leHRTbG90VG9Xcml0ZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgdm9pZCBwcnZUcmFjZUNsZWFyQ2hhbm5lbEJ1ZmZlcih1aW50MzJfdCBjb3VudCkNCnsNCgl1aW50MzJfdCBzbG90czsNCg0KCVRSQUNFX0FTU0VSVChVU0VSX0VWRU5UX0JVRkZFUl9TSVpFID49IGNvdW50LCAicHJ2VHJhY2VDbGVhckNoYW5uZWxCdWZmZXI6IFVTRVJfRVZFTlRfQlVGRkVSX1NJWkUgaXMgdG9vIHNtYWxsIHRvIGhhbmRsZSB0aGlzIGV2ZW50LiIsICk7DQoNCgkvKiBDaGVjayBpZiB3ZSdyZSBjbG9zZSB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8NCglpZiAoUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlICsgY291bnQgPiBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFKQ0KCXsNCgkJc2xvdHMgPSBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFIC0gUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlOyAvKiBOdW1iZXIgb2Ygc2xvdHMgYmVmb3JlIGVuZCBvZiBidWZmZXIgKi8NCgkJKHZvaWQpbWVtc2V0KCZSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsQnVmZmVyW1JlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZV0sIDAsIHNsb3RzKTsNCgkJKHZvaWQpbWVtc2V0KCZSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsQnVmZmVyWzBdLCAwLCAoY291bnQgLSBzbG90cykpOw0KCX0NCgllbHNlDQoJCSh2b2lkKW1lbXNldCgmUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbEJ1ZmZlcltSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5uZXh0U2xvdFRvV3JpdGVdLCAwLCBjb3VudCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBwcnZUcmFjZUNvcHlUb0RhdGFCdWZmZXINCiAqDQogKiBDb3BpZXMgYSBudW1iZXIgb2YgaXRlbXMgdG8gdGhlIGRhdGEgYnVmZmVyLCBzdGFydGluZyBmcm9tIG5leHRTbG90VG9Xcml0ZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgdm9pZCBwcnZUcmFjZUNvcHlUb0RhdGFCdWZmZXIodWludDMyX3QqIGRhdGEsIHVpbnQzMl90IGNvdW50KQ0Kew0KCVRSQUNFX0FTU0VSVChkYXRhICE9IE5VTEwsICJwcnZUcmFjZUNvcHlUb0RhdGFCdWZmZXI6IGRhdGEgPT0gTlVMTC4iLCApOw0KCVRSQUNFX0FTU0VSVChjb3VudCA8PSBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFLCAicHJ2VHJhY2VDb3B5VG9EYXRhQnVmZmVyOiBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFIGlzIHRvbyBzbWFsbCB0byBoYW5kbGUgdGhpcyBldmVudC4iLCApOw0KDQoJdWludDMyX3Qgc2xvdHM7DQoJLyogQ2hlY2sgaWYgd2UncmUgY2xvc2UgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovDQoJaWYgKFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZSArIGNvdW50ID4gVVNFUl9FVkVOVF9CVUZGRVJfU0laRSkNCgl7DQoJCXNsb3RzID0gVVNFUl9FVkVOVF9CVUZGRVJfU0laRSAtIFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZTsgLyogTnVtYmVyIG9mIHNsb3RzIGJlZm9yZSBlbmQgb2YgYnVmZmVyICovDQoJCSh2b2lkKW1lbWNweSgmUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuZGF0YUJ1ZmZlcltSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5uZXh0U2xvdFRvV3JpdGUgKiA0XSwgZGF0YSwgc2xvdHMgKiA0KTsNCgkJKHZvaWQpbWVtY3B5KCZSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5kYXRhQnVmZmVyWzBdLCBkYXRhICsgc2xvdHMsIChjb3VudCAtIHNsb3RzKSAqIDQpOw0KCX0NCgllbHNlDQoJew0KCQkodm9pZCltZW1jcHkoJlJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmRhdGFCdWZmZXJbUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlICogNF0sIGRhdGEsIGNvdW50ICogNCk7DQoJfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogcHJ2VHJhY2VVc2VyRXZlbnRIZWxwZXIxDQogKg0KICogQ2FsbHMgb24gcHJ2VHJhY2VVc2VyRXZlbnRGb3JtYXQoKSB0byBkbyB0aGUgYWN0dWFsIGZvcm1hdHRpbmcsIHRoZW4gZ29lcyBvbiB0byB0aGUgbmV4dCBoZWxwZXIgZnVuY3Rpb24uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgcHJ2VHJhY2VVc2VyRXZlbnRIZWxwZXIxKFVzZXJFdmVudENoYW5uZWwgY2hhbm5lbCwgdHJhY2VMYWJlbCBldmVudExhYmVsLCB0cmFjZUxhYmVsIGZvcm1hdExhYmVsLCB2YV9saXN0IHZsKQ0Kew0KCXVpbnQzMl90IGRhdGFbKDMgKyBNQVhfQVJHX1NJWkUpIC8gNF07DQoJdWludDhfdCBieXRlT2Zmc2V0ID0gNDsgLyogTmVlZCByb29tIGZvciB0aW1lc3RhbXAgKi8NCgl1aW50OF90IG5vT2ZTbG90czsNCg0KCWlmIChjaGFubmVsID09IDApDQoJew0KCQkvKiBXZSBhcmUgZGVhbGluZyB3aXRoIGFuIHVua25vd24gY2hhbm5lbCBmb3JtYXQgcGFpciAqLw0KCQlieXRlT2Zmc2V0ICs9IDQ7IC8qIEFsc28gbmVlZCByb29tIGZvciBjaGFubmVsIGFuZCBmb3JtYXQgKi8NCgkJKCh1aW50MTZfdCopZGF0YSlbMl0gPSBldmVudExhYmVsOw0KCQkoKHVpbnQxNl90KilkYXRhKVszXSA9IGZvcm1hdExhYmVsOw0KCX0NCg0KCW5vT2ZTbG90cyA9IHBydlRyYWNlVXNlckV2ZW50Rm9ybWF0KChjaGFyKikmKFJlY29yZGVyRGF0YVB0ci0+U3ltYm9sVGFibGUuc3ltYnl0ZXNbZm9ybWF0TGFiZWwrNF0pLCB2bCwgKHVpbnQ4X3QqKWRhdGEsIGJ5dGVPZmZzZXQpOw0KDQoJcHJ2VHJhY2VVc2VyRXZlbnRIZWxwZXIyKGNoYW5uZWwsIGRhdGEsIG5vT2ZTbG90cyk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjINCiAqDQogKiBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjb3BpZXMgdGhlIGRhdGEgYnVmZmVyIHRvIHRoZSBhY3R1YWwgdXNlciBldmVudCBidWZmZXIuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgcHJ2VHJhY2VVc2VyRXZlbnRIZWxwZXIyKFVzZXJFdmVudENoYW5uZWwgY2hhbm5lbCwgdWludDMyX3QqIGRhdGEsIHVpbnQzMl90IG5vT2ZTbG90cykNCnsNCglzdGF0aWMgdWludDMyX3Qgb2xkX3RpbWVzdGFtcCA9IDA7DQoJdWludDMyX3Qgb2xkX25leHRTbG90VG9Xcml0ZSA9IDA7DQoNCglUUkFDRV9BU1NFUlQoVVNFUl9FVkVOVF9CVUZGRVJfU0laRSA+PSBub09mU2xvdHMsICJ2VHJhY2VQcmludEY6IFVTRVJfRVZFTlRfQlVGRkVSX1NJWkUgaXMgdG9vIHNtYWxsIHRvIGhhbmRsZSB0aGlzIGV2ZW50LiIsICk7DQoNCgl0cmNDUklUSUNBTF9TRUNUSU9OX0JFR0lOKCk7DQoJLyogU3RvcmUgdGhlIHRpbWVzdGFtcCAqLw0KCXZUcmFjZVBvcnRHZXRUaW1lU3RhbXAoZGF0YSk7DQoNCglpZiAoKmRhdGEgPCBvbGRfdGltZXN0YW1wKQ0KCQlSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci53cmFwYXJvdW5kQ291bnRlcisrOw0KCW9sZF90aW1lc3RhbXAgPSAqZGF0YTsNCg0KCS8qIFN0YXJ0IGJ5IGVyYXNpbmcgYW55IGluZm9ybWF0aW9uIGluIHRoZSBjaGFubmVsIGJ1ZmZlciAqLw0KCXBydlRyYWNlQ2xlYXJDaGFubmVsQnVmZmVyKG5vT2ZTbG90cyk7DQoNCglwcnZUcmFjZUNvcHlUb0RhdGFCdWZmZXIoZGF0YSwgbm9PZlNsb3RzKTsgLyogV2lsbCB3cmFwIGFyb3VuZCB0aGUgZGF0YSBpZiBuZWNlc3NhcnkgKi8NCg0KCW9sZF9uZXh0U2xvdFRvV3JpdGUgPSBSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5uZXh0U2xvdFRvV3JpdGU7IC8qIFNhdmUgdGhlIGluZGV4IHRoYXQgd2Ugd2FudCB0byB3cml0ZSB0aGUgY2hhbm5lbCBkYXRhIGF0IHdoZW4gd2UncmUgZG9uZSAqLw0KCVJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZSA9IChSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5uZXh0U2xvdFRvV3JpdGUgKyBub09mU2xvdHMpICUgVVNFUl9FVkVOVF9CVUZGRVJfU0laRTsgLyogTWFrZSBzdXJlIHdlIG5ldmVyIGVuZCB1cCBvdXRzaWRlIHRoZSBidWZmZXIgKi8NCg0KCS8qIFdyaXRlIHRvIHRoZSBjaGFubmVsIGJ1ZmZlciB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgdXNlciBldmVudCBpcyByZWFkeSB0byBiZSB1c2VkICovDQoJaWYgKGNoYW5uZWwgIT0gMCkNCgkJUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbEJ1ZmZlcltvbGRfbmV4dFNsb3RUb1dyaXRlXSA9IGNoYW5uZWw7DQoJZWxzZQ0KCQlSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsQnVmZmVyW29sZF9uZXh0U2xvdFRvV3JpdGVdID0gKFVzZXJFdmVudENoYW5uZWwpMHhGRjsJLyogMHhGRiBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIG5vdCBhIG5vcm1hbCBjaGFubmVsIGlkICovDQoJdHJjQ1JJVElDQUxfU0VDVElPTl9FTkQoKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHhUcmFjZVJlZ2lzdGVyQ2hhbm5lbEZvcm1hdA0KICoNCiAqIEF0dGVtcHRzIHRvIGNyZWF0ZSBhIHBhaXIgb2YgdGhlIGNoYW5uZWwgYW5kIGZvcm1hdCBzdHJpbmcuDQogKg0KICogTm90ZTogVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZiBVU0VfU0VQQVJBVEVfVVNFUl9FVkVOVF9CVUZGRVIgaXMgZW5hYmxlZCBpbiANCiAqIHRyY0NvbmZpZy5oDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KVXNlckV2ZW50Q2hhbm5lbCB4VHJhY2VSZWdpc3RlckNoYW5uZWxGb3JtYXQodHJhY2VMYWJlbCBjaGFubmVsLCB0cmFjZUxhYmVsIGZvcm1hdFN0cikNCnsNCgl1aW50OF90IGk7DQoJVXNlckV2ZW50Q2hhbm5lbCByZXRWYWwgPSAwOw0KDQoJVFJBQ0VfQVNTRVJUKGZvcm1hdFN0ciAhPSAwLCAidlRyYWNlUmVnaXN0ZXJDaGFubmVsRm9ybWF0OiBmb3JtYXRTdHIgPT0gMCIsIChVc2VyRXZlbnRDaGFubmVsKTApOw0KDQoJdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpOw0KCWZvciAoaSA9IDE7IGkgPD0gQ0hBTk5FTF9GT1JNQVRfUEFJUlM7IGkrKykgLyogU2l6ZSBvZiB0aGUgY2hhbm5lbHMgYnVmZmVyIGlzIENIQU5ORUxfRk9STUFUX1BBSVJTICsgMS4gSW5kZXggMCBpcyB1bnVzZWQuICovDQoJew0KCQlpZihSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsc1tpXS5uYW1lID09IDAgJiYgUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbHNbaV0uZGVmYXVsdEZvcm1hdCA9PSAwKQ0KCQl7DQoJCQkvKiBGb3VuZCBlbXB0eSBzbG90ICovDQoJCQlSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsc1tpXS5uYW1lID0gY2hhbm5lbDsNCgkJCVJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmNoYW5uZWxzW2ldLmRlZmF1bHRGb3JtYXQgPSBmb3JtYXRTdHI7DQoJCQlyZXRWYWwgPSAoVXNlckV2ZW50Q2hhbm5lbClpOw0KCQkJYnJlYWs7DQoJCX0NCg0KCQlpZiAoUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbHNbaV0ubmFtZSA9PSBjaGFubmVsICYmIFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmNoYW5uZWxzW2ldLmRlZmF1bHRGb3JtYXQgPT0gZm9ybWF0U3RyKQ0KCQl7DQoJCQkvKiBGb3VuZCBhIG1hdGNoICovDQoJCQlyZXRWYWwgPSAoVXNlckV2ZW50Q2hhbm5lbClpOw0KCQkJYnJlYWs7DQoJCX0NCgl9DQoJdHJjQ1JJVElDQUxfU0VDVElPTl9FTkQoKTsNCglyZXR1cm4gcmV0VmFsOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VDaGFubmVsUHJpbnRGDQogKg0KICogU2xpZ2h0bHkgZmFzdGVyIHZlcnNpb24gb2YgdlRyYWNlUHJpbnRGKCkgZHVlIHRvIG5vIGxvb2t1cHMuDQogKg0KICogTm90ZTogVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZiBVU0VfU0VQQVJBVEVfVVNFUl9FVkVOVF9CVUZGRVIgaXMgZW5hYmxlZCBpbg0KICogdHJjQ29uZmlnLmgNCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VDaGFubmVsUHJpbnRGKFVzZXJFdmVudENoYW5uZWwgY2hhbm5lbFBhaXIsIC4uLikNCnsNCgl2YV9saXN0IHZsOw0KDQoJdmFfc3RhcnQodmwsIGNoYW5uZWxQYWlyKTsNCgl2VHJhY2VDaGFubmVsUHJpbnRGX0hlbHBlcihjaGFubmVsUGFpciwgdmwpOw0KCXZhX2VuZCh2bCk7DQp9DQoNCnZvaWQgdlRyYWNlQ2hhbm5lbFByaW50Rl9IZWxwZXIoVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsUGFpciwgdmFfbGlzdCB2bCkNCnsNCgl0cmFjZUxhYmVsIGNoYW5uZWw7DQoJdHJhY2VMYWJlbCBmb3JtYXRTdHI7DQoNCglUUkFDRV9BU1NFUlQoY2hhbm5lbFBhaXIgIT0gMCwgInZUcmFjZUNoYW5uZWxQcmludEY6IGNoYW5uZWxQYWlyID09IDAiLCApOw0KCVRSQUNFX0FTU0VSVChjaGFubmVsUGFpciA8PSBDSEFOTkVMX0ZPUk1BVF9QQUlSUywgInZUcmFjZUNoYW5uZWxQcmludEY6ICIsICk7DQoNCgljaGFubmVsID0gUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbHNbY2hhbm5lbFBhaXJdLm5hbWU7DQoJZm9ybWF0U3RyID0gUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbHNbY2hhbm5lbFBhaXJdLmRlZmF1bHRGb3JtYXQ7DQoNCglwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjEoY2hhbm5lbFBhaXIsIGNoYW5uZWwsIGZvcm1hdFN0ciwgdmwpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VDaGFubmVsVXNlckV2ZW50DQogKg0KICogU2xpZ2h0bHkgZmFzdGVyIHZlcnNpb24gb2YgdlRyYWNlVXNlckV2ZW50KCkgZHVlIHRvIG5vIGxvb2t1cHMuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VDaGFubmVsVXNlckV2ZW50KFVzZXJFdmVudENoYW5uZWwgY2hhbm5lbFBhaXIpDQp7DQoJdWludDMyX3QgZGF0YVsoMyArIE1BWF9BUkdfU0laRSkgLyA0XTsNCg0KCVRSQUNFX0FTU0VSVChjaGFubmVsUGFpciAhPSAwLCAidlRyYWNlQ2hhbm5lbFByaW50RjogY2hhbm5lbFBhaXIgPT0gMCIsICk7DQoJVFJBQ0VfQVNTRVJUKGNoYW5uZWxQYWlyIDw9IENIQU5ORUxfRk9STUFUX1BBSVJTLCAidlRyYWNlQ2hhbm5lbFByaW50RjogIiwgKTsNCg0KCXBydlRyYWNlVXNlckV2ZW50SGVscGVyMihjaGFubmVsUGFpciwgZGF0YSwgMSk7IC8qIE9ubHkgbmVlZCBvbmUgc2xvdCBmb3IgdGltZXN0YW1wICovDQp9DQojZW5kaWYgLyogVVNFX1NFUEFSQVRFX1VTRVJfRVZFTlRfQlVGRkVSID09IDEgKi8NCg0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVByaW50Rg0KICoNCiAqIEFkdmFuY2VkIHVzZXIgZXZlbnRzIChQcm9mZXNzaW9uYWwgRWRpdGlvbiBvbmx5KQ0KICoNCiAqIEdlbmVyYXRlcyBVc2VyIEV2ZW50IHdpdGggZm9ybWF0dGVkIHRleHQgYW5kIGRhdGEsIHNpbWlsYXIgdG8gYSAicHJpbnRmIi4NCiAqIEl0IGlzIHZlcnkgZmFzdCBjb21wYXJlZCB0byBhIG5vcm1hbCAicHJpbnRmIiBzaW5jZSB0aGlzIGZ1bmN0aW9uIG9ubHkNCiAqIHN0b3JlcyB0aGUgYXJndW1lbnRzLiBUaGUgYWN0dWFsIGZvcm1hdHRpbmcgaXMgZG9uZQ0KICogb24gdGhlIGhvc3QgUEMgd2hlbiB0aGUgdHJhY2UgaXMgZGlzcGxheWVkIGluIHRoZSB2aWV3ZXIgdG9vbC4NCiAqDQogKiBVc2VyIEV2ZW50IGxhYmVscyBhcmUgY3JlYXRlZCB1c2luZyB4VHJhY2VPcGVuTGFiZWwuDQogKiBFeGFtcGxlOg0KICoNCiAqICAgICB0cmFjZUxhYmVsIGFkY191ZWNoYW5uZWwgPSB4VHJhY2VPcGVuTGFiZWwoIkFEQyBVc2VyIEV2ZW50cyIpOw0KICogICAgIC4uLg0KICogICAgIHZUcmFjZVByaW50KGFkY191ZWNoYW5uZWwsDQogKiAgICAgICAgICAgICAgICAgIkFEQyBjaGFubmVsICVkOiAlbGYgdm9sdHMiLA0KICogICAgICAgICAgICAgICAgIGNoLCAoZG91YmxlKWFkY19yZWFkaW5nLyhkb3VibGUpc2NhbGUpOw0KICoNCiAqIFRoaXMgY2FuIGJlIGNvbWJpbmVkIGludG8gb25lIGxpbmUsIGlmIGRlc2lyZWQsIGJ1dCB0aGlzIGlzIHNsb3dlcjoNCiAqDQogKiAgICAgdlRyYWNlUHJpbnQoeFRyYWNlT3BlbkxhYmVsKCJBREMgVXNlciBFdmVudHMiKSwNCiAqICAgICAgICAgICAgICAgICAiQURDIGNoYW5uZWwgJWQ6ICVsZiB2b2x0cyIsDQogKiAgICAgICAgICAgICAgICAgY2gsIChkb3VibGUpYWRjX3JlYWRpbmcvKGRvdWJsZSlzY2FsZSk7DQogKg0KICogQ2FsbGluZyB4VHJhY2VPcGVuTGFiZWwgbXVsdGlwbGUgdGltZXMgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBlbnRyaWVzLCBidXQNCiAqIGl0IGlzIG9mIGNvdXJzZSBmYXN0ZXIgdG8ganVzdCBkbyBpdCBvbmNlLCBhbmQgdGhlbiBrZWVwIHRoZSBoYW5kbGUgZm9yIGxhdGVyDQogKiB1c2UuIElmIHlvdSBkb260dCBoYXZlIGFueSBkYXRhIGFyZ3VtZW50cywgb25seSBhIHRleHQgbGFiZWwvc3RyaW5nLCBpdCBpcw0KICogYmV0dGVyIHRvIHVzZSB2VHJhY2VVc2VyRXZlbnQgLSBpdCBpcyBmYXN0ZXIuDQogKg0KICogRm9ybWF0IHNwZWNpZmllcnMgc3VwcG9ydGVkOg0KICogICVkIC0gMzIgYml0IHNpZ25lZCBpbnRlZ2VyDQogKiAgJXUgLSAzMiBiaXQgdW5zaWduZWQgaW50ZWdlcg0KICogICVmIC0gMzIgYml0IGZsb2F0DQogKiAgJXMgLSBzdHJpbmcgKGlzIGNvcGllZCB0byB0aGUgcmVjb3JkZXIgc3ltYm9sIHRhYmxlKQ0KICogICVoZCAtIDE2IGJpdCBzaWduZWQgaW50ZWdlcg0KICogICVodSAtIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyDQogKiAgJWJkIC0gOCBiaXQgc2lnbmVkIGludGVnZXINCiAqICAlYnUgLSA4IGJpdCB1bnNpZ25lZCBpbnRlZ2VyDQogKiAgJWxmIC0gZG91YmxlLXByZWNpc2lvbiBmbG9hdA0KICoNCiAqIFVwIHRvIDE1IGRhdGEgYXJndW1lbnRzIGFyZSBhbGxvd2VkLCB3aXRoIGEgdG90YWwgc2l6ZSBvZiBtYXhpbXVtIDMyIGJ5dGUuDQogKiBJbiBjYXNlIHRoaXMgaXMgZXhjZWVkZWQsIHRoZSB1c2VyIGV2ZW50IGlzIGNoYW5nZWQgaW50byBhbiBlcnJvciBtZXNzYWdlLg0KICoNCiAqIFRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0cmFjZSBidWZmZXIsIGFuZCBpcyBwYWNrZWQgdG8gYWxsb3cgc3RvcmluZyBtdWx0aXBsZQ0KICogc21hbGxlciBkYXRhIGVudHJpZXMgaW4gdGhlIHNhbWUgNC1ieXRlIHJlY29yZCwgZS5nLiwgZm91ciA4LWJpdCB2YWx1ZXMuDQogKiBBIHN0cmluZyByZXF1aXJlcyB0d28gYnl0ZXMsIGFzIHRoZSBzeW1ib2wgdGFibGUgaXMgbGltaXRlZCB0byA2NEsuIFN0b3JpbmcgYQ0KICogZG91YmxlICglbGYpIHVzZXMgdHdvIHJlY29yZHMsIHNvIHRoaXMgaXMgcXVpdGUgY29zdGx5LiBVc2UgZmxvYXQgKCVmKSB1bmxlc3MNCiAqIHRoZSBoaWdoZXIgcHJlY2lzaW9uIGlzIHJlYWxseSBuZWNlc3NhcnkuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQp2b2lkIHZUcmFjZVByaW50Rih0cmFjZUxhYmVsIGV2ZW50TGFiZWwsIGNvbnN0IGNoYXIqIGZvcm1hdFN0ciwgLi4uKQ0Kew0KCXZhX2xpc3Qgdmw7DQoNCgl2YV9zdGFydCh2bCwgZm9ybWF0U3RyKTsNCgl2VHJhY2VQcmludEZfSGVscGVyKGV2ZW50TGFiZWwsIGZvcm1hdFN0ciwgdmwpOw0KCXZhX2VuZCh2bCk7DQp9DQoNCnZvaWQgdlRyYWNlUHJpbnRGX0hlbHBlcih0cmFjZUxhYmVsIGV2ZW50TGFiZWwsIGNvbnN0IGNoYXIqIGZvcm1hdFN0ciwgdmFfbGlzdCB2bCkNCnsNCiNpZiAoVVNFX1NFUEFSQVRFX1VTRVJfRVZFTlRfQlVGRkVSID09IDApDQoJdWludDMyX3Qgbm9PZlNsb3RzOw0KICAgIFVzZXJFdmVudCogdWUxOw0KICAgIHVpbnQzMl90IHRlbXBEYXRhQnVmZmVyWygzICsgTUFYX0FSR19TSVpFKSAvIDRdOw0KICAgIFRSQUNFX1NSX0FMTE9DX0NSSVRJQ0FMX1NFQ1RJT04oKTsNCg0KICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICogVGhlIGFycmF5IHRlbXBEYXRhQnVmZmVyIGlzIGEgbG9jYWwgYnVmZmVyIHVzZWQgaW4gYSB0d28tcGhhc2UgY29tbWl0IG9mDQogICAgKiB0aGUgZXZlbnQgZGF0YSwgc2luY2UgYSB2VHJhY2VQcmludEYgbWF5IHNwYW4gb3ZlciBtdWx0aXBsZSBzbG90cyBpbiB0aGUNCiAgICAqIGJ1ZmZlci4NCiAgICAqIFRoaXMgYnVmZmVyIGNhbiBiZSBtYWRlIGxhcmdlciwgb2YgY291cnNlLCBidXQgcmVtZW1iZXIgdGhlIHJpc2sgZm9yDQogICAgKiBzdGFjayBvdmVyZmxvdy4gTm90ZTogVGhpcyBzaG91bGQgYmUgYSBMT0NBTCBidWZmZXIsIG11c3Qgbm90IGJlIG1hZGUNCiAgICAqIGdsb2JhbC4gVGhhdCB3b3VsZCBjYXVzZSBkYXRhIGNvcnJ1cHRpb24gd2hlbiB0d28gY2FsbHMgdG8gdlRyYWNlUHJpbnRGDQogICAgKiBmcm9tIGRpZmZlcmVudCB0YXNrcyBvdmVybGFwcyAoaW50ZXJydXB0cyBhcmUgb25seSBkaXNhYmxlZCBpbiBhIHNtYWxsDQogICAgKiBwYXJ0IG9mIHRoaXMgZnVuY3Rpb24sIG90aGVyd2lzZSBlbmFibGVkKQ0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KCVRSQUNFX0FTU0VSVChmb3JtYXRTdHIgIT0gTlVMTCwgInZUcmFjZVByaW50RjogZm9ybWF0U3RyID09IE5VTEwiLCApOw0KDQoJdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpOw0KCQ0KICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmICghIGluRXhjbHVkZWRUYXNrIHx8IG5JU1JhY3RpdmUpICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCiAgICAgICAgLyogRmlyc3QsIHdyaXRlIHRoZSAicHJpbWFyeSIgdXNlciBldmVudCBlbnRyeSBpbiB0aGUgbG9jYWwgYnVmZmVyLCBidXQNCiAgICAgICAgbGV0IHRoZSBldmVudCB0eXBlIGJlICJFVkVOVF9CRUlOR19XUklUVEVOIiBmb3Igbm93Li4uKi8NCg0KICAgICAgICB1ZTEgPSAoVXNlckV2ZW50KikoJnRlbXBEYXRhQnVmZmVyWzBdKTsNCgkJDQogICAgICAgIHVlMS0+dHlwZSA9IEVWRU5UX0JFSU5HX1dSSVRURU47ICAgICAgLyogVXBkYXRlIHRoaXMgYXMgdGhlIGxhc3Qgc3RlcCAqLw0KDQogICAgICAgIG5vT2ZTbG90cyA9IHBydlRyYWNlVXNlckV2ZW50Rm9ybWF0KGZvcm1hdFN0ciwgdmwsICh1aW50OF90Kil0ZW1wRGF0YUJ1ZmZlciwgNCk7DQoNCiAgICAgICAgLyogU3RvcmUgdGhlIGZvcm1hdCBzdHJpbmcsIHdpdGggYSByZWZlcmVuY2UgdG8gdGhlIGNoYW5uZWwgc3ltYm9sICovDQogICAgICAgIHVlMS0+cGF5bG9hZCA9IHBydlRyYWNlT3BlblN5bWJvbChmb3JtYXRTdHIsIGV2ZW50TGFiZWwpOyAgICAgICAJCQ0KDQogICAgICAgIHVlMS0+ZHRzID0gKHVpbnQ4X3QpcHJ2VHJhY2VHZXREVFMoMHhGRik7DQoJCQ0KCQkgLyogcHJ2VHJhY2VHZXREVFMgbWlnaHQgc3RvcCB0aGUgcmVjb3JkZXIgaW4gc29tZSBjYXNlcy4uLiAqLw0KICAgICAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkNCiAgICAgICAgew0KDQoJCQkvKiBJZiB0aGUgZGF0YSBkb2VzIG5vdCBmaXQgaW4gdGhlIHJlbWFpbmluZyBtYWluIGJ1ZmZlciwgd3JhcCBhcm91bmQgdG8NCgkJCTAgaWYgYWxsb3dlZCwgb3RoZXJ3aXNlIHN0b3AgdGhlIHJlY29yZGVyIGFuZCBxdWl0KS4gKi8NCgkJCWlmIChSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXggKyBub09mU2xvdHMgPiBSZWNvcmRlckRhdGFQdHItPm1heEV2ZW50cykNCgkJCXsNCgkJCQkjaWYgKFRSQUNFX1JFQ09SREVSX1NUT1JFX01PREUgPT0gVFJBQ0VfU1RPUkVfTU9ERV9SSU5HX0JVRkZFUikNCgkJCQkodm9pZCltZW1zZXQoJiBSZWNvcmRlckRhdGFQdHItPmV2ZW50RGF0YVtSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXggKiA0XSwNCgkJCQkJICAgMCwNCgkJCQkJICAgKFJlY29yZGVyRGF0YVB0ci0+bWF4RXZlbnRzIC0gUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4KSo0KTsNCgkJCQlSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXggPSAwOw0KCQkJCVJlY29yZGVyRGF0YVB0ci0+YnVmZmVySXNGdWxsID0gMTsNCgkJCQkjZWxzZQ0KCQkJCQ0KCQkJCS8qIFN0b3AgcmVjb3JkZXIsIHNpbmNlIHRoZSBldmVudCBkYXRhIHdpbGwgbm90IGZpdCBpbiB0aGUNCgkJCQlidWZmZXIgYW5kIG5vdCBjaXJjdWxhciBidWZmZXIgaW4gdGhpcyBjYXNlLi4uICovCQkJCQ0KCQkJCXZUcmFjZVN0b3AoKTsJCQkJDQoJCQkJI2VuZGlmDQoJCQl9DQoJCQkNCgkJCS8qIENoZWNrIGlmIHJlY29yZGVyIGhhcyBiZWVuIHN0b3BwZWQgKGkuZS4sIHZUcmFjZVN0b3AgYWJvdmUpICovDQoJCQlpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkNCgkJCXsJCQkJDQoJCQkJLyogQ2hlY2sgdGhhdCB0aGUgYnVmZmVyIHRvIGJlIG92ZXJ3cml0dGVuIGRvZXMgbm90IGNvbnRhaW4gYW55IHVzZXINCgkJCQlldmVudHMgdGhhdCB3b3VsZCBiZSBwYXJ0aWFsbHkgb3ZlcndyaXR0ZW4uIElmIHNvLCB0aGV5IG11c3QgYmUgImtpbGxlZCINCgkJCQlieSByZXBsYWNpbmcgdGhlIHVzZXIgZXZlbnQgYW5kIGZvbGxvd2luZyBkYXRhIHdpdGggTlVMTCBldmVudHMgKGkuZS4sDQoJCQkJdXNpbmcgYSBtZW1zZXQgdG8gemVybykuKi8NCgkJCQkjaWYgKFRSQUNFX1JFQ09SREVSX1NUT1JFX01PREUgPT0gVFJBQ0VfU1RPUkVfTU9ERV9SSU5HX0JVRkZFUikNCgkJCQlwcnZDaGVja0RhdGFUb0JlT3ZlcndyaXR0ZW5Gb3JNdWx0aUVudHJ5RXZlbnRzKCh1aW50OF90KW5vT2ZTbG90cyk7DQoJCQkJI2VuZGlmDQoJCQkJLyogQ29weSB0aGUgbG9jYWwgYnVmZmVyIHRvIHRoZSBtYWluIGJ1ZmZlciAqLw0KCQkJCSh2b2lkKW1lbWNweSgmIFJlY29yZGVyRGF0YVB0ci0+ZXZlbnREYXRhW1JlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCAqIDRdLA0KCQkJCQkgICB0ZW1wRGF0YUJ1ZmZlciwNCgkJCQkJICAgbm9PZlNsb3RzICogNCk7DQoNCgkJCQkvKiBVcGRhdGUgdGhlIGV2ZW50IHR5cGUsIGkuZS4sIG51bWJlciBvZiBkYXRhIGVudHJpZXMgZm9sbG93aW5nIHRoZQ0KCQkJCW1haW4gVVNFUl9FVkVOVCBlbnRyeSAoTm90ZTogaW1wb3J0YW50IHRoYXQgdGhpcyBpcyBhZnRlciB0aGUgbWVtY3B5LA0KCQkJCWJ1dCB3aXRoaW4gdGhlIGNyaXRpY2FsIHNlY3Rpb24hKSovDQoJCQkJUmVjb3JkZXJEYXRhUHRyLT5ldmVudERhdGFbUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ICogNF0gPQ0KCQkJCSAgKHVpbnQ4X3QpICggVVNFUl9FVkVOVCArIG5vT2ZTbG90cyAtIDEgKTsNCg0KCQkJCS8qIFVwZGF0ZSB0aGUgbWFpbiBidWZmZXIgZXZlbnQgaW5kZXggKGFscmVhZHkgY2hlY2tlZCB0aGF0IGl0IGZpdHMgaW4NCgkJCQl0aGUgYnVmZmVyLCBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciB3cmFwcGluZykqLw0KDQoJCQkJUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ICs9IG5vT2ZTbG90czsNCgkJCQlSZWNvcmRlckRhdGFQdHItPm51bUV2ZW50cyArPSBub09mU2xvdHM7DQoNCgkJCQlpZiAoUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ID49IEVWRU5UX0JVRkZFUl9TSVpFKQ0KCQkJCXsNCgkJCQkJI2lmIChUUkFDRV9SRUNPUkRFUl9TVE9SRV9NT0RFID09IFRSQUNFX1NUT1JFX01PREVfUklOR19CVUZGRVIpDQoJCQkJCS8qIFdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kLCBidXQgdGhpcyBpcyBhIHJpbmcgYnVmZmVyLiBTdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgYWdhaW4uICovDQoJCQkJCVJlY29yZGVyRGF0YVB0ci0+YnVmZmVySXNGdWxsID0gMTsNCgkJCQkJUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ID0gMDsNCgkJCQkJI2Vsc2UNCgkJCQkJLyogV2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgc28gd2Ugc3RvcC4gKi8NCgkJCQkJdlRyYWNlU3RvcCgpOw0KCQkJCQkjZW5kaWYNCgkJCQl9DQoJCQkJDQoJCQkJI2lmIChTVE9QX0FGVEVSX05fRVZFTlRTID4gLTEpDQoJCQkJLyogQ2hlY2sgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBkZXNpcmVkIG51bWJlciBvZiBldmVudHMgKi8NCgkJCQlpZiAoUmVjb3JkZXJEYXRhUHRyLT5udW1FdmVudHMgPj0gU1RPUF9BRlRFUl9OX0VWRU5UUykNCgkJCQl7DQoJCQkJCXZUcmFjZVN0b3AoKTsNCgkJCQl9DQoJCQkJI2VuZGlmICAgICAgICANCgkJCX0NCgkJCQ0KCQkJI2lmIChUUkFDRV9SRUNPUkRFUl9TVE9SRV9NT0RFID09IFRSQUNFX1NUT1JFX01PREVfUklOR19CVUZGRVIpDQoJCQkvKiBNYWtlIHN1cmUgdGhlIG5leHQgZW50cnkgaXMgY2xlYXJlZCBjb3JyZWN0bHkgKi8NCgkJCXBydkNoZWNrRGF0YVRvQmVPdmVyd3JpdHRlbkZvck11bHRpRW50cnlFdmVudHMoMSk7DQoJCQkjZW5kaWYNCgkNCgkJfQ0KCX0NCgl0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KDQojZWxpZiAoVVNFX1NFUEFSQVRFX1VTRVJfRVZFTlRfQlVGRkVSID09IDEpDQoJLyogVXNlIHRoZSBzZXBhcmF0ZSB1c2VyIGV2ZW50IGJ1ZmZlciAqLw0KCXRyYWNlTGFiZWwgZm9ybWF0TGFiZWw7DQoJVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsOw0KDQoJaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgKCEgaW5FeGNsdWRlZFRhc2sgfHwgbklTUmFjdGl2ZSkgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQogICAgew0KCSAgICBmb3JtYXRMYWJlbCA9IHhUcmFjZU9wZW5MYWJlbChmb3JtYXRTdHIpOw0KDQoJICAgIGNoYW5uZWwgPSB4VHJhY2VSZWdpc3RlckNoYW5uZWxGb3JtYXQoZXZlbnRMYWJlbCwgZm9ybWF0TGFiZWwpOw0KDQoJCXBydlRyYWNlVXNlckV2ZW50SGVscGVyMShjaGFubmVsLCBldmVudExhYmVsLCBmb3JtYXRMYWJlbCwgdmwpOw0KCX0NCiNlbmRpZg0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VVc2VyRXZlbnQNCiAqDQogKiBCYXNpYyB1c2VyIGV2ZW50IChTdGFuZGFyZCBhbmQgUHJvZmVzc2lvbmFsIEVkaXRpb24gb25seSkNCiAqDQogKiBHZW5lcmF0ZXMgYSBVc2VyIEV2ZW50IHdpdGggYSB0ZXh0IGxhYmVsLiBUaGUgbGFiZWwgaXMgY3JlYXRlZC9sb29rZWQgdXANCiAqIGluIHRoZSBzeW1ib2wgdGFibGUgdXNpbmcgeFRyYWNlT3BlbkxhYmVsLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlVXNlckV2ZW50KHRyYWNlTGFiZWwgZXZlbnRMYWJlbCkNCnsNCiNpZiAoVVNFX1NFUEFSQVRFX1VTRVJfRVZFTlRfQlVGRkVSID09IDApDQogICAgVXNlckV2ZW50KiB1ZTsNCiAgICB1aW50OF90IGR0czE7DQogICAgVFJBQ0VfU1JfQUxMT0NfQ1JJVElDQUxfU0VDVElPTigpOw0KDQoJVFJBQ0VfQVNTRVJUKGV2ZW50TGFiZWwgPiAwLCAidlRyYWNlVXNlckV2ZW50OiBJbnZhbGlkIHZhbHVlIGZvciBldmVudExhYmVsIiwgKTsNCg0KCXRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsJDQogICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgKCEgaW5FeGNsdWRlZFRhc2sgfHwgbklTUmFjdGl2ZSkgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQogICAgeyAgICANCiAgICAgICAgZHRzMSA9ICh1aW50OF90KXBydlRyYWNlR2V0RFRTKDB4RkYpOw0KDQogICAgICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlKSAvKiBOZWVkIHRvIHJlcGVhdCB0aGlzIGNoZWNrISAqLw0KICAgICAgICB7DQogICAgICAgICAgICB1ZSA9IChVc2VyRXZlbnQqKSB4VHJhY2VOZXh0RnJlZUV2ZW50QnVmZmVyU2xvdCgpOw0KICAgICAgICAgICAgaWYgKHVlICE9IE5VTEwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdWUtPmR0cyA9IGR0czE7DQogICAgICAgICAgICAgICAgdWUtPnR5cGUgPSBVU0VSX0VWRU5UOw0KICAgICAgICAgICAgICAgIHVlLT5wYXlsb2FkID0gZXZlbnRMYWJlbDsNCiAgICAgICAgICAgICAgICBwcnZUcmFjZVVwZGF0ZUNvdW50ZXJzKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gICAgICAgIA0KICAgIH0NCgl0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KCQ0KI2VsaWYgKFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAxKQ0KCVVzZXJFdmVudENoYW5uZWwgY2hhbm5lbDsNCgl1aW50MzJfdCBub09mU2xvdHMgPSAxOw0KCXVpbnQzMl90IHRlbXBEYXRhQnVmZmVyWygzICsgTUFYX0FSR19TSVpFKSAvIDRdOwkNCglpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSAmJiAoISBpbkV4Y2x1ZGVkVGFzayB8fCBuSVNSYWN0aXZlKSAmJiBoYW5kbGVfb2ZfbGFzdF9sb2dnZWRfdGFzaykNCgl7DQoJCWNoYW5uZWwgPSB4VHJhY2VSZWdpc3RlckNoYW5uZWxGb3JtYXQoMCwgZXZlbnRMYWJlbCk7DQoNCgkJaWYgKGNoYW5uZWwgPT0gMCkNCgkJew0KCQkJLyogV2UgYXJlIGRlYWxpbmcgd2l0aCBhbiB1bmtub3duIGNoYW5uZWwgZm9ybWF0IHBhaXIgKi8NCgkJCW5vT2ZTbG90cysrOyAvKiBBbHNvIG5lZWQgcm9vbSBmb3IgY2hhbm5lbCBhbmQgZm9ybWF0ICovDQoJCQkoKHVpbnQxNl90Kil0ZW1wRGF0YUJ1ZmZlcilbMl0gPSAwOw0KCQkJKCh1aW50MTZfdCopdGVtcERhdGFCdWZmZXIpWzNdID0gZXZlbnRMYWJlbDsNCgkJfQ0KDQoJCXBydlRyYWNlVXNlckV2ZW50SGVscGVyMihjaGFubmVsLCB0ZW1wRGF0YUJ1ZmZlciwgbm9PZlNsb3RzKTsNCgl9CQ0KI2VuZGlmDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB4VHJhY2VPcGVuTGFiZWwNCiAqDQogKiBDcmVhdGVzIHVzZXIgZXZlbnQgbGFiZWxzIGZvciB1c2VyIGV2ZW50IGNoYW5uZWxzIG9yIGZvciBpbmRpdmlkdWFsIGV2ZW50cy4NCiAqIFVzZXIgZXZlbnRzIGNhbiBiZSB1c2VkIHRvIGxvZyBhcHBsaWNhdGlvbiBldmVudHMgYW5kIGRhdGEgZm9yIGRpc3BsYXkgaW4NCiAqIHRoZSB2aXN1YWxpemF0aW9uIHRvb2wuIEEgdXNlciBldmVudCBpcyBpZGVudGlmaWVkIGJ5IGEgbGFiZWwsIGkuZS4sIGEgc3RyaW5nLA0KICogd2hpY2ggaXMgc3RvcmVkIGluIHRoZSByZWNvcmRlcidzIHN5bWJvbCB0YWJsZS4NCiAqIFdoZW4gbG9nZ2luZyBhIHVzZXIgZXZlbnQsIGEgbnVtZXJpYyBoYW5kbGUgKHJlZmVyZW5jZSkgdG8gdGhpcyBzdHJpbmcgaXMNCiAqIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGV2ZW50LiBUaGlzIGlzIG9idGFpbmVkIGJ5IGNhbGxpbmcNCiAqDQogKiAgICAgeFRyYWNlT3BlbkxhYmVsKCkNCiAqDQogKiB3aGljaCBhZGRzIHRoZSBzdHJpbmcgdG8gdGhlIHN5bWJvbCB0YWJsZSAoaWYgbm90IGFscmVhZHkgcHJlc2VudCkNCiAqIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZS4NCiAqDQogKiBUaGlzIGNhbiBiZSB1c2VkIGluIHR3byB3YXlzOg0KICoNCiAqIDEuIFRoZSBoYW5kbGUgaXMgbG9va2VkIHVwIGV2ZXJ5IHRpbWUsIHdoZW4gc3RvcmluZyB0aGUgdXNlciBldmVudC4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgIHZUcmFjZVVzZXJFdmVudCh4VHJhY2VPcGVuTGFiZWwoIk15VXNlckV2ZW50IikpOw0KICoNCiAqIDIuIFRoZSBsYWJlbCBpcyByZWdpc3RlcmVkIGp1c3Qgb25jZSwgd2l0aCB0aGUgaGFuZGxlIHN0b3JlZCBpbiBhbg0KICogIGFwcGxpY2F0aW9uIHZhcmlhYmxlIC0gbXVjaCBsaWtlIHVzaW5nIGEgZmlsZSBoYW5kbGUuDQogKg0KICogRXhhbXBsZToNCiAqICAgICBteUV2ZW50SGFuZGxlID0geFRyYWNlT3BlbkxhYmVsKCJNeVVzZXJFdmVudCIpOw0KICogICAgIC4uLg0KICogICAgIHZUcmFjZVVzZXJFdmVudChteUV2ZW50SGFuZGxlKTsNCiAqDQogKiBUaGUgc2Vjb25kIG9wdGlvbiBpcyBmYXN0ZXIgc2luY2Ugbm8gbG9va3VwIGlzIHJlcXVpcmVkIG9uIGVhY2ggZXZlbnQsIGFuZA0KICogdGhlcmVmb3JlIHJlY29tbWVuZGVkIGZvciB1c2VyIGV2ZW50cyB0aGF0IGFyZSBmcmVxdWVudGx5DQogKiBleGVjdXRlZCBhbmQvb3IgbG9jYXRlZCBpbiB0aW1lLWNyaXRpY2FsIGNvZGUuIFRoZSBsb29rdXAgb3BlcmF0aW9uIGlzDQogKiBob3dldmVyIGZhaXJseSBmYXN0IGR1ZSB0byB0aGUgZGVzaWduIG9mIHRoZSBzeW1ib2wgdGFibGUuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdHJhY2VMYWJlbCB4VHJhY2VPcGVuTGFiZWwoY29uc3QgY2hhciogbGFiZWwpDQp7DQoJVFJBQ0VfQVNTRVJUKGxhYmVsICE9IE5VTEwsICJ4VHJhY2VPcGVuTGFiZWw6IGxhYmVsID09IE5VTEwiLCAodHJhY2VMYWJlbCkwKTsNCg0KICAgIHJldHVybiBwcnZUcmFjZU9wZW5TeW1ib2wobGFiZWwsIDApOw0KfQ0KDQojZW5kaWYNCg0KI2VuZGlm