LyogdW5pa2xvZy5oCiAqCiAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCiAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCiAqIGRldGFpbHMuCiAqLwoKLyogVGhpcyBtb2R1bGUgY29udGFpbnMgbWFjcm9zIHRvIGFpZCBkZXZlbG9wZXJzIGluIGxvZ2dpbmcgbWVzc2FnZXMuCiAqCiAqIFRoaXMgbW9kdWxlIGlzIGFmZmVjdGVkIGJ5IHRoZSBERUJVRyBjb21waWxldGltZSBvcHRpb24uCiAqCiAqLwojaWZuZGVmIF9fVU5JS0xPR19IX18KI2RlZmluZSBfX1VOSUtMT0dfSF9fCgoKI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgoKLyoKICogIyBEQkdJTkYKICoKICogXGJyaWVmIExvZyBkZWJ1ZyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UgLSBsb2cgYSBMT0dfSU5GTyBtZXNzYWdlIG9ubHkKICogICAgICAgIGlmIERFQlVHIGNvbXBpbGV0aW1lIG9wdGlvbiBlbmFibGVkCiAqCiAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCiAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgogKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZQogKiAgICAgICAgICAgICBmb3JtYXQgc3RyaW5nLgogKiBccmV0dXJuIG5vdGhpbmcKICoKICogTG9nIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0lORk8gbGV2ZWwsIGJ1dCBvbmx5IGlmIERFQlVHIGlzIGVuYWJsZWQuICBJZgogKiBERUJVRyBpcyBkaXNhYmxlZCwgdGhpcyBleHBhbmRzIHRvIGEgbm8tb3AuCiAqLwoKLyoKICogIyBEQkdWRVIKICoKICogXGJyaWVmIExvZyBkZWJ1ZyB2ZXJib3NlIG1lc3NhZ2UgLSBsb2cgYSBMT0dfREVCVUcgbWVzc2FnZSBvbmx5IGlmCiAqICAgICAgICBERUJVRyBjb21waWxldGltZSBvcHRpb24gZW5hYmxlZAogKgogKiBccGFyYW0gZGV2bmFtZSB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGRldmljZSByZXBvcnRpbmcgdGhpcyBtZXNzYWdlLCBvcgogKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCiAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KICogXHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUKICogICAgICAgICAgICAgZm9ybWF0IHN0cmluZy4KICogXHJldHVybiBub3RoaW5nCiAqCiAqIExvZyBhIG1lc3NhZ2UgYXQgdGhlIExPR19ERUJVRyBsZXZlbCwgYnV0IG9ubHkgaWYgREVCVUcgaXMgZW5hYmxlZC4gIElmCiAqIERFQlVHIGlzIGRpc2FibGVkLCB0aGlzIGV4cGFuZHMgdG8gYSBuby1vcC4gIE5vdGUgYWxzbyB0aGF0IExPR19ERUJVRwogKiBtZXNzYWdlcyBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCBhdCBydW50aW1lIGFzIHdlbGwuCiAqLwojZGVmaW5lIERCR0lORkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgICAgICBkbyB7IH0gd2hpbGUgKDApCiNkZWZpbmUgREJHVkVSREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKI2RlZmluZSBEQkdJTkYoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQojZGVmaW5lIERCR1ZFUihmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKDApCgovKgogKiAjIExPR0lORgogKgogKiBcYnJpZWYgTG9nIGluZm9ybWF0aW9uYWwgbWVzc2FnZSAtIGxvZ3MgYSBtZXNzYWdlIGF0IHRoZSBMT0dfSU5GTyBsZXZlbAogKgogKiBccGFyYW0gZGV2bmFtZSB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGRldmljZSByZXBvcnRpbmcgdGhpcyBtZXNzYWdlLCBvcgogKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCiAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KICogXHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUKICogICAgICAgICAgICAgZm9ybWF0IHN0cmluZy4KICogXHJldHVybiBub3RoaW5nCiAqCiAqIExvZ3MgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGF0IHRoZSBMT0dfSU5GTyBsZXZlbC4KICovCgojZGVmaW5lIExPR0lORihmbXQsIGFyZ3MuLi4pIHByX2luZm8oZm10LCAjIyBhcmdzKQojZGVmaW5lIExPR0lORkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pIFwKCXByX2luZm8oIiVzICIgZm10LCBkZXZuYW1lLCAjIyBhcmdzKQojZGVmaW5lIExPR0lORkRFVlgoZGV2bm8sIGZtdCwgYXJncy4uLikgXAoJcHJfaW5mbygiZGV2JWQgIiBmbXQsIGRldm5vLCAjIyBhcmdzKQojZGVmaW5lIExPR0lORk5BTUUodm5pYywgZm10LCBhcmdzLi4uKQkJCQlcCglkbyB7CQkJCQkJCQlcCgkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAoJCQlwcl9pbmZvKCIlcyAiIGZtdCwgdm5pYy0+bmFtZSwgIyMgYXJncyk7CVwKCQl9IGVsc2UgewkJCQkJCVwKCQkJcHJfaW5mbyhmbXQsICMjIGFyZ3MpOwkJCQlcCgkJfQkJCQkJCQlcCgl9IHdoaWxlICgwKQoKLyoKICogIyBMT0dWRVIKICoKICogXGJyaWVmIExvZyB2ZXJib3NlIG1lc3NhZ2UgLSBsb2dzIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0RFQlVHIGxldmVsLAogKiAgICAgICAgd2hpY2ggY2FuIGJlIGRpc2FibGVkIGF0IHJ1bnRpbWUKICoKICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKICogICAgICAgICAgICAgICAgTlVMTCBpZiB0aGlzIG1lc3NhZ2UgaXMgTk9UIGRldmljZS1yZWxhdGVkLgogKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCiAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlIGZvcm1hdAogKiBccGFyYW0gc3RyaW5nLgogKiBccmV0dXJuIG5vdGhpbmcKICoKICogTG9ncyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXQgdGhlIExPR19ERUJVRyBsZXZlbC4gIE5vdGUgYWxzbyB0aGF0CiAqIExPR19ERUJVRyBtZXNzYWdlcyBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCBhdCBydW50aW1lIGFzIHdlbGwuCiAqLwojZGVmaW5lIExPR1ZFUihmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKGZtdCwgIyMgYXJncykKI2RlZmluZSBMT0dWRVJERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSBcCglwcl9kZWJ1ZygiJXMgIiBmbXQsIGRldm5hbWUsICMjIGFyZ3MpCiNkZWZpbmUgTE9HVkVSTkFNRSh2bmljLCBmbXQsIGFyZ3MuLi4pCQkJCQlcCglkbyB7CQkJCQkJCQlcCgkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAoJCQlwcl9kZWJ1ZygiJXMgIiBmbXQsIHZuaWMtPm5hbWUsICMjIGFyZ3MpOwlcCgkJfSBlbHNlIHsJCQkJCQlcCgkJCXByX2RlYnVnKGZtdCwgIyMgYXJncyk7CQkJCVwKCQl9CQkJCQkJCVwKCX0gd2hpbGUgKDApCgoKLyoKICogIyBMT0dFUlIKICoKICogXGJyaWVmIExvZyBlcnJvciBtZXNzYWdlIC0gbG9ncyBhIG1lc3NhZ2UgYXQgdGhlIExPR19FUlIgbGV2ZWwsCiAqICAgICAgICBpbmNsdWRpbmcgc291cmNlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uCiAqCiAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCiAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgogKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBmb3JtYXQKICogXHBhcmFtIHN0cmluZy4KICogXHJldHVybiBub3RoaW5nCiAqCiAqIExvZ3MgdGhlIHNwZWNpZmllZCBlcnJvciBtZXNzYWdlIGF0IHRoZSBMT0dfRVJSIGxldmVsLiAgSXQgd2lsbCBhbHNvCiAqIGluY2x1ZGUgdGhlIGZpbGUsIGxpbmUgbnVtYmVyLCBhbmQgZnVuY3Rpb24gbmFtZSBvZiB3aGVyZSB0aGUgZXJyb3IKICogb3JpZ2luYXRlZCBpbiB0aGUgbG9nIG1lc3NhZ2UuCiAqLwojZGVmaW5lIExPR0VSUihmbXQsIGFyZ3MuLi4pIHByX2VycihmbXQsICMjIGFyZ3MpCiNkZWZpbmUgTE9HRVJSREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgXAoJcHJfZXJyKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKI2RlZmluZSBMT0dFUlJERVZYKGRldm5vLCBmbXQsIGFyZ3MuLi4pIFwKCXByX2VycigiZGV2JWQgIiBmbXQsIGRldm5vLCAjIyBhcmdzKQojZGVmaW5lIExPR0VSUk5BTUUodm5pYywgZm10LCBhcmdzLi4uKQkJCQlcCglkbyB7CQkJCQkJCQlcCgkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAoJCQlwcl9lcnIoIiVzICIgZm10LCB2bmljLT5uYW1lLCAjIyBhcmdzKTsJXAoJCX0gZWxzZSB7CQkJCQkJXAoJCQlwcl9lcnIoZm10LCAjIyBhcmdzKTsJCQkJXAoJCX0JCQkJCQkJXAoJfSB3aGlsZSAoMCkKI2RlZmluZSBMT0dPUkRVTVBFUlIoc2VxZmlsZSwgZm10LCBhcmdzLi4uKSBkbyB7CQlcCgkJaWYgKHNlcWZpbGUpIHsJCQkJCVwKCQkJc2VxX3ByaW50ZihzZXFmaWxlLCBmbXQsICMjIGFyZ3MpOwlcCgkJfSBlbHNlIHsJCQkJCVwKCQkJTE9HRVJSKGZtdCwgIyMgYXJncyk7CQkJXAoJCX0JCQkJCQlcCgl9IHdoaWxlICgwKQoKLyoKICogIyBMT0dXUk4KICoKICogXGJyaWVmIExvZyB3YXJuaW5nIG1lc3NhZ2UgLSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgTE9HX1dBUk5JTkcgbGV2ZWwsCiAqICAgICAgICBpbmNsdWRpbmcgc291cmNlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uCiAqCiAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCiAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgogKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBmb3JtYXQKICogXHBhcmFtIHN0cmluZy4KICogXHJldHVybiBub3RoaW5nCiAqCiAqIExvZ3MgdGhlIHNwZWNpZmllZCBlcnJvciBtZXNzYWdlIGF0IHRoZSBMT0dfV0FSTklORyBsZXZlbC4gIEl0IHdpbGwgYWxzbwogKiBpbmNsdWRlIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgYW5kIGZ1bmN0aW9uIG5hbWUgb2Ygd2hlcmUgdGhlIGVycm9yCiAqIG9yaWdpbmF0ZWQgaW4gdGhlIGxvZyBtZXNzYWdlLgogKi8KI2RlZmluZSBMT0dXUk4oZm10LCBhcmdzLi4uKSBwcl93YXJuKGZtdCwgIyMgYXJncykKI2RlZmluZSBMT0dXUk5ERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSBcCglwcl93YXJuKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKI2RlZmluZSBMT0dXUk5OQU1FKHZuaWMsIGZtdCwgYXJncy4uLikgXAoJZG8gewkJCQkJCQkJXAoJCWlmICh2bmljICE9IE5VTEwpIHsJCQkJCVwKCQkJcHJfd2FybigiJXMgIiBmbXQsIHZuaWMtPm5hbWUsICMjIGFyZ3MpOwlcCgkJfSBlbHNlIHsJCQkJCQlcCgkJCXByX3dhcm4oZm10LCAjIyBhcmdzKTsJCQkJXAoJCX0JCQkJCQkJXAoJfSB3aGlsZSAoMCkKCiNlbmRpZiAvKiBfX1VOSUtMT0dfSF9fICovCg==