LyoqDQogKiBUaGlzIGZpbGUgaGFzIG5vIGNvcHlyaWdodCBhc3NpZ25lZCBhbmQgaXMgcGxhY2VkIGluIHRoZSBQdWJsaWMgRG9tYWluLg0KICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHc2NCBtaW5ndy1ydW50aW1lIHBhY2thZ2UuDQogKiBObyB3YXJyYW50eSBpcyBnaXZlbjsgcmVmZXIgdG8gdGhlIGZpbGUgRElTQ0xBSU1FUiB3aXRoaW4gdGhpcyBwYWNrYWdlLg0KICovDQojaWZkZWYgX1dJTjY0DQoJLmZpbGUJImxvZzFwLlMiDQoJLnRleHQNCgkuYWxpZ24gNA0KCS8qIFRoZSBmeWwyeHAxIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHZhbHVlcyBpbg0KCSAgIC0xICsgc3FydCgyKSAvIDIgPD0geCA8PSAxIC0gc3FydCgyKSAvIDINCgkgICAwLjI5IGlzIGEgc2FmZSB2YWx1ZS4NCgkgKi8NCmxpbWl0OgkuZG91YmxlIDAuMjkNCm9uZToJLmRvdWJsZSAxLjANCi8qDQogKiBVc2UgdGhlIGZ5bDJ4cDEgZnVuY3Rpb24gd2hlbiB0aGUgYXJndW1lbnQgaXMgaW4gdGhlIHJhbmdlIC0wLjI5IHRvIDAuMjksDQogKiBvdGhlcndpc2UgZnlsMnggd2l0aCB0aGUgbmVlZGVkIGV4dHJhIGNvbXB1dGF0aW9uLg0KICovDQouZ2xvYmwgX2xvZzFwOyANCgkuZGVmCV9sb2cxcDsJLnNjbAkyOwkudHlwZQkzMjsJLmVuZGVmDQpfbG9nMXA6DQoJbW92c2QJJXhtbTAsLTE2KCVyc3ApDQoJZmxkbG4yDQoJZmxkbAktMTYoJXJzcCkNCglmeGFtDQoJZm5zdHN3DQoJZmxkCSVzdA0KCXNhaGYNCglqYwkzZgkvLyBpbiBjYXNlIHggaXMgTmFOIG9yILFJbmYNCg0KNDoJZmFicw0KCWZjb21wbAlsaW1pdA0KCWZuc3Rzdw0KCXNhaGYNCglqYwkyZg0KCWZhZGRsCW9uZQ0KCWZ5bDJ4DQoJZnN0cGwJLTE2KCVyc3ApDQoJbW92c2QJLTE2KCVyc3ApLCV4bW0wDQoJcmV0DQoNCjI6CWZ5bDJ4cDENCglmc3RwbAktMTYoJXJzcCkNCgltb3ZzZAktMTYoJXJzcCksJXhtbTANCglyZXQNCg0KMzoJanAJNGIJLy8gaW4gY2FzZSB4IGlzILFJbmYNCglmc3RwCSVzdCgxKQ0KCWZzdHAJJXN0KDEpDQoJZnN0cGwJLTE2KCVyc3ApDQoJbW92c2QJLTE2KCVyc3ApLCV4bW0wDQoJcmV0DQojZWxzZQ0KCS5maWxlCSJsb2cxcC5TIg0KCS50ZXh0DQoJLmFsaWduIDQNCgkvKiBUaGUgZnlsMnhwMSBjYW4gb25seSBiZSB1c2VkIGZvciB2YWx1ZXMgaW4NCgkgICAtMSArIHNxcnQoMikgLyAyIDw9IHggPD0gMSAtIHNxcnQoMikgLyAyDQoJICAgMC4yOSBpcyBhIHNhZmUgdmFsdWUuDQoJICovDQpsaW1pdDoJLmRvdWJsZSAwLjI5DQpvbmU6CS5kb3VibGUgMS4wDQovKg0KICogVXNlIHRoZSBmeWwyeHAxIGZ1bmN0aW9uIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGluIHRoZSByYW5nZSAtMC4yOSB0byAwLjI5LA0KICogb3RoZXJ3aXNlIGZ5bDJ4IHdpdGggdGhlIG5lZWRlZCBleHRyYSBjb21wdXRhdGlvbi4NCiAqLw0KLmdsb2JsIF9sb2cxcDsgDQoJLmRlZglfbG9nMXA7CS5zY2wJMjsJLnR5cGUJMzI7CS5lbmRlZg0KX2xvZzFwOg0KCWZsZGxuMg0KCWZsZGwJNCglZXNwKQ0KCWZ4YW0NCglmbnN0c3cNCglmbGQJJXN0DQoJc2FoZg0KCWpjCTNmCS8vIGluIGNhc2UgeCBpcyBOYU4gb3IgsUluZg0KDQo0OglmYWJzDQoJZmNvbXBsCWxpbWl0DQoJZm5zdHN3DQoJc2FoZg0KCWpjCTJmDQoJZmFkZGwJb25lDQoJZnlsMngNCglyZXQNCg0KMjoJZnlsMnhwMQ0KCXJldA0KDQozOglqcAk0YgkvLyBpbiBjYXNlIHggaXMgsUluZg0KCWZzdHAJJXN0KDEpDQoJZnN0cAklc3QoMSkNCglyZXQNCiNlbmRpZg0K