LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL2ZvbnRjb25maWcvZmNwcml2YXRlLmgsdiAxLjIgMjAwMi8wMi8xNSAwNjowMToyNyBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2lmbmRlZiBfRkNQUklWQVRFX0hfCiNkZWZpbmUgX0ZDUFJJVkFURV9IXwoKLyoKICogSSB0cmllZCB0aGlzIHdpdGggZnVuY3Rpb25zIHRoYXQgdG9vayB2YV9saXN0KiBhcmd1bWVudHMKICogYnV0IHBvcnRhYmlsaXR5IGNvbmNlcm5zIG1hZGUgbWUgY2hhbmdlIHRoZXNlIGZ1bmN0aW9ucwogKiBpbnRvIG1hY3JvcyAoc2lnaCkuCiAqLwoKI2RlZmluZSBGY1BhdHRlcm5WYXBCdWlsZChyZXN1bHQsIG9yaWcsIHZhKQkJCSAgICBcCnsJCQkJCQkJCSAgICBcCiAgICBGY1BhdHRlcm4JKl9fcF9fID0gKG9yaWcpOwkJCQkgICAgXAogICAgY29uc3QgY2hhcgkqX19vX187CQkJCQkJICAgIFwKICAgIEZjVmFsdWUJX192X187CQkJCQkJICAgIFwKCQkJCQkJCQkgICAgXAogICAgaWYgKCFfX3BfXykJCQkJCQkJICAgIFwKICAgIHsJCQkJCQkJCSAgICBcCglfX3BfXyA9IEZjUGF0dGVybkNyZWF0ZSAoKTsJCQkJICAgIFwKCWlmICghX19wX18pCQkgICAgCQkJCSAgICBcCgkgICAgZ290byBfRmNQYXR0ZXJuVmFwQnVpbGRfYmFpbDA7CQkJICAgIFwKICAgIH0JCQkJICAgIAkJCQkgICAgXAogICAgZm9yICg7OykJCQkgICAgCQkJCSAgICBcCiAgICB7CQkJCSAgICAJCQkJICAgIFwKCV9fb19fID0gdmFfYXJnICh2YSwgY29uc3QgY2hhciAqKTsJCQkgICAgXAoJaWYgKCFfX29fXykJCSAgICAJCQkJICAgIFwKCSAgICBicmVhazsJCSAgICAJCQkJICAgIFwKCV9fdl9fLnR5cGUgPSB2YV9hcmcgKHZhLCBGY1R5cGUpOwkJCSAgICBcCglzd2l0Y2ggKF9fdl9fLnR5cGUpIHsJICAgIAkJCQkgICAgXAoJY2FzZSBGY1R5cGVWb2lkOgkJCQkJICAgIFwKCSAgICBnb3RvIF9GY1BhdHRlcm5WYXBCdWlsZF9iYWlsMTsgICAgICAgCQkgICAgXAoJY2FzZSBGY1R5cGVJbnRlZ2VyOgkgICAgCQkJCSAgICBcCgkgICAgX192X18udS5pID0gdmFfYXJnICh2YSwgaW50KTsJCQkgICAgXAoJICAgIGJyZWFrOwkJCQkJCSAgICBcCgljYXNlIEZjVHlwZURvdWJsZToJCQkJCSAgICBcCgkgICAgX192X18udS5kID0gdmFfYXJnICh2YSwgZG91YmxlKTsJCQkgICAgXAoJICAgIGJyZWFrOwkJCQkJCSAgICBcCgljYXNlIEZjVHlwZVN0cmluZzoJCQkJCSAgICBcCgkgICAgX192X18udS5zID0gdmFfYXJnICh2YSwgRmNDaGFyOCAqKTsJCQkgICAgXAoJICAgIGJyZWFrOwkJCQkJCSAgICBcCgljYXNlIEZjVHlwZUJvb2w6CQkJCQkgICAgXAoJICAgIF9fdl9fLnUuYiA9IHZhX2FyZyAodmEsIEZjQm9vbCk7CQkJICAgIFwKCSAgICBicmVhazsJCQkJCQkgICAgXAoJY2FzZSBGY1R5cGVNYXRyaXg6CQkJCQkgICAgXAoJICAgIF9fdl9fLnUubSA9IHZhX2FyZyAodmEsIEZjTWF0cml4ICopOwkJICAgIFwKCSAgICBicmVhazsJCQkJCQkgICAgXAoJY2FzZSBGY1R5cGVDaGFyU2V0OgkJCQkJICAgIFwKCSAgICBfX3ZfXy51LmMgPSB2YV9hcmcgKHZhLCBGY0NoYXJTZXQgKik7CQkgICAgXAoJICAgIGJyZWFrOwkJCQkJCSAgICBcCgljYXNlIEZjVHlwZUZURmFjZToJCQkJCSAgICBcCgkgICAgX192X18udS5mID0gdmFfYXJnICh2YSwgRlRfRmFjZSk7CQkJICAgIFwKCX0JCQkJCQkJICAgIFwKCWlmICghRmNQYXR0ZXJuQWRkIChfX3BfXywgX19vX18sIF9fdl9fLCBGY1RydWUpKQkgICAgXAoJICAgIGdvdG8gX0ZjUGF0dGVyblZhcEJ1aWxkX2JhaWwxOwkJCSAgICBcCiAgICB9CQkJCQkJCQkgICAgXAogICAgcmVzdWx0ID0gX19wX187CQkJCQkJICAgIFwKICAgIGdvdG8gX0ZjUGF0dGVyblZhcEJ1aWxkX3JldHVybjsJCQkJICAgIFwKCQkJCQkJCQkgICAgXApfRmNQYXR0ZXJuVmFwQnVpbGRfYmFpbDE6CQkJCQkgICAgXAogICAgaWYgKCFvcmlnKQkJCQkJCQkgICAgXAoJRmNQYXR0ZXJuRGVzdHJveSAoX19wX18pOwkJCQkgICAgXApfRmNQYXR0ZXJuVmFwQnVpbGRfYmFpbDA6CQkJCQkgICAgXAogICAgcmVzdWx0ID0gMDsJCQkJCQkJICAgIFwKCQkJCQkJCQkgICAgXApfRmNQYXR0ZXJuVmFwQnVpbGRfcmV0dXJuOgkJCQkJICAgIFwKICAgIDsJCQkJCQkJCSAgICBcCn0KCgojZGVmaW5lIEZjT2JqZWN0U2V0VmFwQnVpbGQoX19yZXRfXywgX19maXJzdF9fLCBfX3ZhX18pIAkJXAp7CQkJCQkJCQkJXAogICAgRmNPYmplY3RTZXQgICAgKl9fb3NfXzsJCQkJCQlcCiAgICBjb25zdCBjaGFyCSAgICAqX19vYl9fOwkJCQkJCVwKCQkJCQkJCQkJXAogICAgX19yZXRfXyA9IDA7CQkJCQkJICAgIAlcCiAgICBfX29zX18gPSBGY09iamVjdFNldENyZWF0ZSAoKTsJCQkJCVwKICAgIGlmICghX19vc19fKQkJCQkJCQlcCglnb3RvIF9GY09iamVjdFNldFZhcEJ1aWxkX2JhaWwwOwkJCQlcCiAgICBfX29iX18gPSBfX2ZpcnN0X187CQkJCQkJCVwKICAgIHdoaWxlIChfX29iX18pCQkJCQkJCVwKICAgIHsJCQkJCQkJCQlcCglpZiAoIUZjT2JqZWN0U2V0QWRkIChfX29zX18sIF9fb2JfXykpCQkJCVwKCSAgICBnb3RvIF9GY09iamVjdFNldFZhcEJ1aWxkX2JhaWwxOwkJCQlcCglfX29iX18gPSB2YV9hcmcgKF9fdmFfXywgY29uc3QgY2hhciAqKTsJCQkJXAogICAgfQkJCQkJCQkJCVwKICAgIF9fcmV0X18gPSBfX29zX187CQkJCQkJCVwKCQkJCQkJCQkJXApfRmNPYmplY3RTZXRWYXBCdWlsZF9iYWlsMToJCQkJCQlcCiAgICBpZiAoIV9fcmV0X18gJiYgX19vc19fKQkJCQkJICAgIAlcCglGY09iamVjdFNldERlc3Ryb3kgKF9fb3NfXyk7CQkJCQlcCl9GY09iamVjdFNldFZhcEJ1aWxkX2JhaWwwOgkJCQkJCVwKICAgIDsJCQkJCQkJCQlcCn0KCiNlbmRpZiAvKiBfRkNQUklWQVRFX0hfICovCgo=