IyBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQuICBTZWUKIyB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwojIHRoYXQgbWF5IGFwcGx5OgojCiMgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKIyBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiMgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KIwoKIwojIE1ha2VmaWxlIGZvciBzbm1wbGliCiMKCnRvcF9idWlsZGRpcj0uLgpteXN1YmRpcj1zbm1wbGliCgojIHVzZSBHTlUgdnBhdGgsIGlmIGF2YWlsYWJsZSwgdG8gb25seSBzZXQgYSBwYXRoIGZvciBzb3VyY2UgYW5kIGhlYWRlcnMKIyBWUEFUSCB3aWxsIHBpY2sgdXAgb2JqZWN0cyB0b28sIHdoaWNoIGlzIGJhZCBpZiB5b3UgYXJlIHNoYXJpbmcgYQojIHNvdXJjZSBkaXIuLi4KQEdOVV92cGF0aEAgJS5oICQoc3JjZGlyKQpAR05VX3ZwYXRoQCAlLmMgJChzcmNkaXIpCkBHTlVfdnBhdGhAICUucmMgJChzcmNkaXIpCiMgZmFsbGJhY2sgdG8gcmVndWxhciBWUEFUSCBmb3Igbm9uLWdudS4uLgpATk9OX0dOVV9WUEFUSEAgJChzcmNkaXIpCgoKIwojIFRoaW5ncyB0byBpbnN0YWxsCiMKCiMgaGVhZGVycwpJTlNUQUxMSEVBREVSUz1cCgluZXQtc25tcC1pbmNsdWRlcy5oIFwKCWNvbmZpZ19hcGkuaCAgXAoJbWliX2FwaS5oICAgICBcCglvdXRwdXRfYXBpLmggIFwKCXBkdV9hcGkuaCAgICAgXAoJc2Vzc2lvbl9hcGkuaCBcCglzbm1wdjNfYXBpLmggIFwKCXZhcmJpbmRfYXBpLmggXAoJdHlwZXMuaCAgICAgICBcCgl1dGlsaXRpZXMuaCAgIFwKCXZlcnNpb24uaCAgICAgXAoJZGVmaW5pdGlvbnMuaAoKSU5DTFVERVNVQkRJUj1saWJyYXJ5CklOQ0xVREVTVUJESVJIRUFERVJTPVJFQURNRSBcCglhc24xLmggXAoJY2FsbGJhY2suaCBcCgljZXJ0X3V0aWwuaCBcCgljb250YWluZXIuaCBcCgljb250YWluZXJfYmluYXJ5X2FycmF5LmggXAoJY29udGFpbmVyX2xpc3Rfc3NsbC5oIFwKCWNvbnRhaW5lcl9pdGVyYXRvci5oIFwKCWNvbnRhaW5lcl9udWxsLmggXAoJZmFjdG9yeS5oIFwKCWRhdGFfbGlzdC5oIFwKCWRlZmF1bHRfc3RvcmUuaCBcCglkaXJfdXRpbHMuaCBcCglmZF9ldmVudF9tYW5hZ2VyLmggXAoJZmlsZV91dGlscy5oIFwKCWludDY0LmggXAoJa2V5dG9vbHMuaCBcCgltaWIuaCBcCgltZDUuaCBcCglwYXJzZS5oIFwKCXJlYWRfY29uZmlnLmggXAoJc2NhcGkuaCBcCglzbm1wLmggXAoJc25tcF9hbGFybS5oIFwKCXNubXBfYXBpLmggXAoJbGFyZ2VfZmRfc2V0LmggXAoJc25tcF9hc3NlcnQuaCBcCglzbm1wX2NsaWVudC5oIFwKCXNubXBfZGVidWcuaCBcCglzbm1wX2ltcGwuaCBcCglzbm1wX2xvZ2dpbmcuaCBcCglzbm1wX3BhcnNlX2FyZ3MuaCBcCglzbm1wX3NlcnZpY2UuaCBcCglzbm1wLXRjLmggXAoJc25tcHYzLmggXAoJc3lzdGVtLmggXAoJdGV4dF91dGlscy5oIFwKCXRvb2xzLmggXAoJdHJhbnNmb3JtX29pZHMuaCBcCgl0eXBlcy5oIFwKICAgICAgICBnZXRvcHQuaCBcCiAgICAgICAgbGNkX3RpbWUuaCBcCiAgICAgICAgbXRfc3VwcG9ydC5oIFwKICAgICAgICBvaWQuaCBcCiAgICAgICAgb2lkX3N0YXNoLmggXAogICAgICAgIHNubXBfZW51bS5oIFwKICAgICAgICBzbm1wX3NlY21vZC5oIFwKICAgICAgICB1Y2RfY29tcGF0LmggXAogICAgICAgIHZhY20uaCBcCgljaGVja192YXJiaW5kLmggXAoJc25tcF90cmFuc3BvcnQuaCBcCgl3aW5waXBlLmggXAoJd2luc2VydmljZS5oIFwKCUB0cmFuc3BvcnRfaGRyX2xpc3RAIFwKCUBzZWN1cml0eV9oZHJfbGlzdEAKCklOU1RBTExCVUlMVFNVQkRJUkhFQURFUlM9Li4vaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5L3NubXB2My1zZWN1cml0eS1pbmNsdWRlcy5oCklOU1RBTExCVUlMVFNVQkRJUj1saWJyYXJ5CgoKSU5TVEFMTFVDREhFQURFUlM9IGFzbjEuaCBcCgljYWxsYmFjay5oCVwKCWRlZmF1bHRfc3RvcmUuaAlcCglpbnQ2NC5oCQlcCglrZXl0b29scy5oCVwKCW1pYi5oCQlcCglwYXJzZS5oCQlcCglyZWFkX2NvbmZpZy5oCVwKCXNjYXBpLmgJCVwKCXNubXBfYWxhcm0uaAlcCglzbm1wX2FwaS5oCVwKCWxhcmdlX2ZkX3NldC5oCVwKCXNubXBfY2xpZW50LmgJXAoJc25tcF9kZWJ1Zy5oCVwKCXNubXAuaAkJXAoJc25tcF9pbXBsLmgJXAoJc25tcF9sb2dnaW5nLmgJXAoJc25tcF9wYXJzZV9hcmdzLmggXAoJc25tcC10Yy5oCVwKCXNubXB1c20uaAlcCglzbm1wdjMuaAlcCglzbm1wX3ZhcnMuaAlcCglzdHJ1Y3QuaAlcCglzeXN0ZW0uaAlcCgl0b29scy5oCQlcCgl0cmFuc2Zvcm1fb2lkcy5oCgojIGxpYnJhcmllcwpJTlNUQUxMTElCUz1saWJuZXRzbm1wLiQoTElCX0VYVEVOU0lPTikkKExJQl9WRVJTSU9OKQpJTlNUQUxMVUNETElCUz1saWJzbm1wLiQoTElCX0VYVEVOU0lPTikkKExJQl9WRVJTSU9OKQoKIwojIFRoaW5ncyB0byBidWlsZAojICAgLSBmb3IgdGhlIGZlYXR1cmUgY2hlY2tpbmcgLyByZW1vdmFsIC8gbWluaW1pYWxpc3Qgc3VwcG9ydCB0aGVzZQojICAgICBtdXN0IGJlIGxpc3RlZCBzdWNoIHRoYXQgY29kZSByZXF1aXJpbmcgYSBmZWF0dXJlIG11c3QgYmUgbGlzdGVkCiMgICAgICpiZWZvcmUqIHRoZSBjb2RlIGltcGxlbWVudGluZyB0aGUgZmVhdHVyZS4KIwpDU1JDUz0Jc25tcF9jbGllbnQuYyBtaWIuYyBwYXJzZS5jIHNubXBfYXBpLmMgc25tcC5jIAkJXAoJc25tcF9hdXRoLmMgYXNuMS5jIG1kNS5jIHNubXBfcGFyc2VfYXJncy5jCQlcCglzeXN0ZW0uYyB2YWNtLmMgaW50NjQuYyByZWFkX2NvbmZpZy5jIHBrY3MuYwkJXAoJc25tcF9kZWJ1Zy5jIHRvb2xzLmMgIHNubXBfbG9nZ2luZy5jIHRleHRfdXRpbHMuYwlcCglsYXJnZV9mZF9zZXQuYyBjZXJ0X3V0aWwuYyBzbm1wX29wZW5zc2wuYyAJCVwKCXNubXB2My5jIGxjZF90aW1lLmMga2V5dG9vbHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJc2NhcGkuYyBjYWxsYmFjay5jIGRlZmF1bHRfc3RvcmUuYyBzbm1wX2FsYXJtLmMJCVwKCWRhdGFfbGlzdC5jIG9pZF9zdGFzaC5jIGZkX2V2ZW50X21hbmFnZXIuYyAJCVwKCWNoZWNrX3ZhcmJpbmQuYyAJCQkJCVwKCW10X3N1cHBvcnQuYyBzbm1wX2VudW0uYyBzbm1wLXRjLmMgc25tcF9zZXJ2aWNlLmMJXAoJc25wcmludGYuYwkJCQkJCVwKCXNubXBfdHJhbnNwb3J0LmMgQHRyYW5zcG9ydF9zcmNfbGlzdEAJCQlcCglzbm1wX3NlY21vZC5jIEBzZWN1cml0eV9zcmNfbGlzdEAgc25tcF92ZXJzaW9uLmMgICAgICAgIFwKCWNvbnRhaW5lcl9udWxsLmMgY29udGFpbmVyX2xpc3Rfc3NsbC5jIGNvbnRhaW5lcl9pdGVyYXRvci5jIFwKCXVjZF9jb21wYXQuYwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCglAb3RoZXJfc3JjX2xpc3RAIEBjcnlwdG9fZmlsZXNfY0AgICAgICAgIAkJXAoJZGlyX3V0aWxzLmMgZmlsZV91dGlscy5jIAkgICAgICAgICAgICAgICAgICAgICAgICBcCgljb250YWluZXIuYyBjb250YWluZXJfYmluYXJ5X2FycmF5LmMJCgpPQkpTPQlzbm1wX2NsaWVudC5vIG1pYi5vIHBhcnNlLm8gc25tcF9hcGkubyBzbm1wLm8gCQlcCglzbm1wX2F1dGgubyBhc24xLm8gbWQ1Lm8gc25tcF9wYXJzZV9hcmdzLm8JCVwKCXN5c3RlbS5vIHZhY20ubyBpbnQ2NC5vIHJlYWRfY29uZmlnLm8gcGtjcy5vIAkJXAoJc25tcF9kZWJ1Zy5vIHRvb2xzLm8gIHNubXBfbG9nZ2luZy5vIHRleHRfdXRpbHMubwlcCglsYXJnZV9mZF9zZXQubyBjZXJ0X3V0aWwubyBzbm1wX29wZW5zc2wubyAJCVwKCXNubXB2My5vIGxjZF90aW1lLm8ga2V5dG9vbHMubyAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJc2NhcGkubyBjYWxsYmFjay5vIGRlZmF1bHRfc3RvcmUubyBzbm1wX2FsYXJtLm8JCVwKCWRhdGFfbGlzdC5vIG9pZF9zdGFzaC5vIGZkX2V2ZW50X21hbmFnZXIubwkJXAoJY2hlY2tfdmFyYmluZC5vIAkJCQkJXAoJbXRfc3VwcG9ydC5vIHNubXBfZW51bS5vIHNubXAtdGMubyBzbm1wX3NlcnZpY2UubwlcCglzbnByaW50Zi5vCQkJCQkJXAoJc25tcF90cmFuc3BvcnQubyBAdHJhbnNwb3J0X29ial9saXN0QCAgICAgICAgICAgICAgICAgICBcCglzbm1wX3NlY21vZC5vIEBzZWN1cml0eV9vYmpfbGlzdEAgc25tcF92ZXJzaW9uLm8gICAgICAgIFwKCWNvbnRhaW5lcl9udWxsLm8gY29udGFpbmVyX2xpc3Rfc3NsbC5vIGNvbnRhaW5lcl9pdGVyYXRvci5vIFwKCXVjZF9jb21wYXQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCVwKICAgICAgICBAY3J5cHRvX2ZpbGVzX29AIEBvdGhlcl9vYmpzX2xpc3RAIEBMSUJPQkpTQCAJCVwKCWRpcl91dGlscy5vIGZpbGVfdXRpbHMubyAJICAgICAgICAgICAgICAgICAgICAgICAgXAoJY29udGFpbmVyLm8gY29udGFpbmVyX2JpbmFyeV9hcnJheS5vCQoKTE9CSlM9CXNubXBfY2xpZW50LmxvIG1pYi5sbyBwYXJzZS5sbyBzbm1wX2FwaS5sbyBzbm1wLmxvIAlcCglzbm1wX2F1dGgubG8gYXNuMS5sbyBtZDUubG8gc25tcF9wYXJzZV9hcmdzLmxvCQlcCglzeXN0ZW0ubG8gdmFjbS5sbyBpbnQ2NC5sbyByZWFkX2NvbmZpZy5sbyBwa2NzLmxvCVwKCXNubXBfZGVidWcubG8gdG9vbHMubG8gIHNubXBfbG9nZ2luZy5sbwkgdGV4dF91dGlscy5sbwlcCglsYXJnZV9mZF9zZXQubG8gY2VydF91dGlsLmxvIHNubXBfb3BlbnNzbC5sbyAJCVwKCXNubXB2My5sbyBsY2RfdGltZS5sbyBrZXl0b29scy5sbyAgICAgICAgICAgICAgICAgICAgICAgXAoJc2NhcGkubG8gY2FsbGJhY2subG8gZGVmYXVsdF9zdG9yZS5sbyBzbm1wX2FsYXJtLmxvCVwKCWRhdGFfbGlzdC5sbyBvaWRfc3Rhc2gubG8gZmRfZXZlbnRfbWFuYWdlci5sbwkJXAoJY2hlY2tfdmFyYmluZC5sbyAJCQkJCVwKCW10X3N1cHBvcnQubG8gc25tcF9lbnVtLmxvIHNubXAtdGMubG8gc25tcF9zZXJ2aWNlLmxvCVwKCXNucHJpbnRmLmxvCQkJCQkJXAoJc25tcF90cmFuc3BvcnQubG8gQHRyYW5zcG9ydF9sb2JqX2xpc3RAICAgICAgICAgICAgICAgICBcCglzbm1wX3NlY21vZC5sbyBAc2VjdXJpdHlfbG9ial9saXN0QCBzbm1wX3ZlcnNpb24ubG8gICAgIFwKCWNvbnRhaW5lci5sbyBjb250YWluZXJfYmluYXJ5X2FycmF5LmxvCQkJXAoJdWNkX2NvbXBhdC5sbwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgQGNyeXB0b19maWxlc19sb0AgQG90aGVyX2xvYmpzX2xpc3RAIEBMVExJQk9CSlNAICAgICAgICBcCglkaXJfdXRpbHMubG8gZmlsZV91dGlscy5sbyAJICAgICAgICAgICAgICAgICAgICAgICAgXAoJY29udGFpbmVyX251bGwubG8gY29udGFpbmVyX2xpc3Rfc3NsbC5sbyBjb250YWluZXJfaXRlcmF0b3IubG8gCgpGVE9CSlM9CXNubXBfY2xpZW50LmZ0IG1pYi5mdCBwYXJzZS5mdCBzbm1wX2FwaS5mdCBzbm1wLmZ0IAlcCglzbm1wX2F1dGguZnQgYXNuMS5mdCBtZDUuZnQgc25tcF9wYXJzZV9hcmdzLmZ0CQlcCglzeXN0ZW0uZnQgdmFjbS5mdCBpbnQ2NC5mdCByZWFkX2NvbmZpZy5mdCBwa2NzLmZ0CVwKCXNubXBfZGVidWcuZnQgdG9vbHMuZnQgIHNubXBfbG9nZ2luZy5mdAkgdGV4dF91dGlscy5mdAlcCglzbm1wdjMuZnQgbGNkX3RpbWUuZnQga2V5dG9vbHMuZnQgICAgICAgICAgICAgICAgICAgICAgIFwKCXNjYXBpLmZ0IGNhbGxiYWNrLmZ0IGRlZmF1bHRfc3RvcmUuZnQgc25tcF9hbGFybS5mdAlcCglkYXRhX2xpc3QuZnQgb2lkX3N0YXNoLmZ0IGZkX2V2ZW50X21hbmFnZXIuZnQJCVwKCWNoZWNrX3ZhcmJpbmQuZnQgCQkJCQlcCgltdF9zdXBwb3J0LmZ0IHNubXBfZW51bS5mdCBzbm1wLXRjLmZ0IHNubXBfc2VydmljZS5mdAlcCglzbnByaW50Zi5mdAkJCQkJCVwKCXNubXBfdHJhbnNwb3J0LmZ0IEB0cmFuc3BvcnRfZnRvYmpfbGlzdEAgICAgICAgICAgICAgICAgXAoJc25tcF9zZWNtb2QuZnQgQHNlY3VyaXR5X2Z0b2JqX2xpc3RAIHNubXBfdmVyc2lvbi5mdCAgICBcCgljb250YWluZXIuZnQgY29udGFpbmVyX2JpbmFyeV9hcnJheS5mdAlcCgl1Y2RfY29tcGF0LmZ0CQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCiAgICAgICAgQG90aGVyX2Z0b2Jqc19saXN0QCAgICAgICAgICAgICAgICAgICAgIAkJXAoJbGFyZ2VfZmRfc2V0LmZ0IGNlcnRfdXRpbC5mdCBzbm1wX29wZW5zc2wuZnQgCQlcCglkaXJfdXRpbHMuZnQgZmlsZV91dGlscy5mdCAJICAgICAgICAgICAgICAgICAgICAgICAgXAoJY29udGFpbmVyX251bGwuZnQgY29udGFpbmVyX2xpc3Rfc3NsbC5mdCBjb250YWluZXJfaXRlcmF0b3IuZnQKCiMganVzdCBpbiBjYXNlIHNvbWVvbmUgd2FudHMgdG8gcmVtb3ZlIGxpYnRvb2wsIGNoYW5nZSB0aGlzIHRvIE9CSlMuClRPQkpTPSQoTE9CSlMpCgpGRUFUVVJFRklMRSAgICAgPSAkKHRvcF9idWlsZGRpcikvaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5L2ZlYXR1cmVzLmgKCiMgCkNQUEZMQUdTID0gJChUT1BfSU5DTFVERVMpIC1JLiAJJChTTk1QTElCX0lOQ0xVREVTKSBAQ1BQRkxBR1NACgphbGw6IHN0YW5kYXJkYWxsCgojIGhvdyB0byBidWlsZCB0aGUgbGlicmFyaWVzLgpsaWJuZXRzbm1wLiQoTElCX0VYVEVOU0lPTikkKExJQl9WRVJTSU9OKTogICAgJChUT0JKUykKCSQoTElCX0xEX0NNRCkgJEAgJChUT0JKUykgQExEX05PX1VOREVGSU5FREAgJChMREZMQUdTKSBATE5FVFNOTVBMSUJTQAoJJChSQU5MSUIpICRACgpsaWJzbm1wLiQoTElCX0VYVEVOU0lPTikkKExJQl9WRVJTSU9OKTogICAgJChUT0JKUykKCSQoTElCX0xEX0NNRCkgJEAgJChUT0JKUykgQExEX05PX1VOREVGSU5FREAgJChMREZMQUdTKSBATE5FVFNOTVBMSUJTQAoJJChSQU5MSUIpICRACgojCiMgaW50ZXJuYWwgdGVzdCBvYmplY3RzCiMKcGFyc2U6ICBtaWIubyBwYXJzZS5jCgkkKENDKSAkKENGTEFHUykgLURURVNUIHBhcnNlLmMgLW8gJEAgXAoJCWAkKHRvcF9zcmNkaXIpL25ldC1zbm1wLWNvbmZpZyAtLWxpYnNgCg==