LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAgQ29weXJpZ2h0IKkgMTk5NSwgMTk5NiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBNYXluYXJkLCBNYXNzYWNodXNldHRzLgoKICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIApkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkICAKdGhhdCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyAgCm9mIHNvZnR3YXJlIGFuZCBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90ICAKYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIAp3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIERpZ2l0YWwgZ3JhbnRzIHRoaXMgcGVybWlzc2lvbiAKcHJvdmlkZWQgdGhhdCB5b3UgcHJvbWluZW50bHkgbWFyaywgYXMgbm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsLCBhbnkgCm1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGlzIHNvZnR3YXJlIG9yIGRvY3VtZW50YXRpb24uCgpEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiBkaXNjbGFpbXMgYWxsIHdhcnJhbnRpZXMgYW5kL29yIGd1YXJhbnRlZXMgIAp3aXRoIHJlZ2FyZCB0byB0aGlzIHNvZnR3YXJlLCBpbmNsdWRpbmcgYWxsIGltcGxpZWQgd2FycmFudGllcyBvZiBmaXRuZXNzIGZvciAKYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYW5kIG1lcmNoYW50YWJpbGl0eSwgYW5kIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyAKcmVnYXJkaW5nIHRoZSB1c2Ugb2YsIG9yIHRoZSByZXN1bHRzIG9mIHRoZSB1c2Ugb2YsIHRoZSBzb2Z0d2FyZSBhbmQgCmRvY3VtZW50YXRpb24gaW4gdGVybXMgb2YgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCByZWxpYWJpbGl0eSwgY3VycmVudG5lc3Mgb3IKb3RoZXJ3aXNlOyBhbmQgeW91IHJlbHkgb24gdGhlIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uIGFuZCByZXN1bHRzIHNvbGVseSBhdCAKeW91ciBvd24gcmlzay4gCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBkYXZpZC5ydXNsaW5nQHJlby5tdHMuZGVjLmNvbQogKgogKiBNb2RpZmllZCBmb3IgUUVNVSBQQUxjb2RlIGJ5IHJ0aEB0d2lkZGxlLm5ldC4KICovCgojaW5jbHVkZSAicHJvdG9zLmgiCiNpbmNsdWRlICJ1YXJ0LmgiCgojaWZuZGVmIFNFUklBTF9TUEVFRAojZGVmaW5lIFNFUklBTF9TUEVFRCA5NjAwCiNlbmRpZgoKaW50CnVhcnRfY2hhcmF2KGludCBvZmZzZXQpCnsKCXJldHVybiBpbmIoY29tMkxzciArIG9mZnNldCkgJiAxOwp9CgppbnQKdWFydF9nZXRjaGFyKGludCBvZmZzZXQpCnsKCS8qIElmIGludGVycnVwdHMgYXJlIGVuYWJsZWQsIHVzZSB3dGludCBhc3N1bWluZyB0aGF0IGVpdGhlciB0aGUKCSAgIGRldmljZSBpdHNlbGYgd2lsbCB3YWtlIHVzLCBvciB0aGF0IGEgY2xvY2sgaW50ZXJydXB0IHdpbGwuICAqLwoJaWYgKChyZHBzKCkgJiA3KSA9PSAwKSB7CgkgICAgd2hpbGUgKCF1YXJ0X2NoYXJhdihvZmZzZXQpKSB7CgkJd3RpbnQoMCk7CgkgICAgfQoJfSBlbHNlIHsKCSAgICB3aGlsZSAoIXVhcnRfY2hhcmF2KG9mZnNldCkpCgkgICAgICAgIGNvbnRpbnVlOwoJfQoKCXJldHVybiBpbmIoY29tMlJiciArIG9mZnNldCk7Cn0KCnZvaWQKdWFydF9wdXRjaGFyX3JhdyhpbnQgb2Zmc2V0LCBjaGFyIGMpCnsKCXdoaWxlICgoaW5iKGNvbTJMc3IgKyBvZmZzZXQpICYgMHgyMCkgPT0gMCkKCQljb250aW51ZTsKCW91dGIoYywgY29tMlRociArIG9mZnNldCk7Cn0KCnZvaWQKdWFydF9wdXRjaGFyKGludCBvZmZzZXQsIGNoYXIgYykKewoJaWYgKGMgPT0gJ1xuJykKCQl1YXJ0X3B1dGNoYXJfcmF3KG9mZnNldCwgJ1xyJyk7Cgl1YXJ0X3B1dGNoYXJfcmF3KG9mZnNldCwgYyk7Cn0KCnZvaWQKdWFydF9wdXRzKGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKnMpCnsKCXdoaWxlICgqcyAhPSAnXDAnKQoJCXVhcnRfcHV0Y2hhcihvZmZzZXQsICpzKyspOwp9Cgp2b2lkCnVhcnRfaW5pdF9saW5lKGludCBvZmZzZXQsIGludCBiYXVkKQp7CglpbnQgaTsKCWludCBiYXVkY29uc3Q7CgoJc3dpdGNoIChiYXVkKSB7CgljYXNlIDU2MDAwOgoJCWJhdWRjb25zdCA9IDI7CgkJYnJlYWs7CgljYXNlIDM4NDAwOgoJCWJhdWRjb25zdCA9IDM7CgkJYnJlYWs7CgljYXNlIDE5MjAwOgoJCWJhdWRjb25zdCA9IDY7CgkJYnJlYWs7CgljYXNlIDk2MDA6CgkJYmF1ZGNvbnN0ID0gMTI7CgkJYnJlYWs7CgljYXNlIDQ4MDA6CgkJYmF1ZGNvbnN0ID0gMjQ7CgkJYnJlYWs7CgljYXNlIDI0MDA6CgkJYmF1ZGNvbnN0ID0gNDg7CgkJYnJlYWs7CgljYXNlIDEyMDA6CgkJYmF1ZGNvbnN0ID0gOTY7CgkJYnJlYWs7CgljYXNlIDMwMDoKCQliYXVkY29uc3QgPSAzODQ7CgkJYnJlYWs7CgljYXNlIDE1MDoKCQliYXVkY29uc3QgPSA3Njg7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWJhdWRjb25zdCA9IDEyOwoJCWJyZWFrOwoJfQoKCglvdXRiKDB4ODcsIGNvbTJMY3IgKyBvZmZzZXQpOwoJb3V0YigwLCBjb20yRGxtICsgb2Zmc2V0KTsKCW91dGIoYmF1ZGNvbnN0LCBjb20yRGxsICsgb2Zmc2V0KTsKCW91dGIoMHgwNywgY29tMkxjciArIG9mZnNldCk7CglvdXRiKDB4MEYsIGNvbTJNY3IgKyBvZmZzZXQpOwoKCWZvciAoaSA9IDEwOyBpID4gMDsgaS0tKSB7CgkJaWYgKGluYihjb20yTHNyICsgb2Zmc2V0KSA9PSAwKQoJCQlicmVhazsKCQlpbmIoY29tMlJiciArIG9mZnNldCk7Cgl9Cn0KCnZvaWQgdWFydF9pbml0KHZvaWQpCnsKCXVhcnRfaW5pdF9saW5lKENPTTEsIFNFUklBTF9TUEVFRCk7CgkvKiB1YXJ0X2luaXRfbGluZShDT00yLCBTRVJJQUxfU1BFRUQpOyAqLwp9Cg==