LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KQFJFVEAJCUZjUGF0dGVybiAqCQpARlVOQ0AJCUZjUGF0dGVybkNyZWF0ZQpAVFlQRTFAIAl2b2lkCkBQVVJQT1NFQAlDcmVhdGUgYSBwYXR0ZXJuCkBERVNDQApDcmVhdGVzIGEgcGF0dGVybiB3aXRoIG5vIHByb3BlcnRpZXM7IHVzZWQgdG8gYnVpbGQgcGF0dGVybnMgZnJvbSBzY3JhdGNoLgpAQAoKQFJFVEAJCXZvaWQKQEZVTkNACQlGY1BhdHRlcm5EZXN0cm95CkBUWVBFMUAJCUZjUGF0dGVybiAqIAkJCUBBUkcxQAkJIHAKQFBVUlBPU0VACURlc3Ryb3kgYSBwYXR0ZXJuCkBERVNDQApEZXN0cm95cyBhIHBhdHRlcm4sIGluIHRoZSBwcm9jZXNzIGRlc3Ryb3lpbmcgYWxsIHJlbGF0ZWQgdmFsdWVzLgpAQAoKQFJFVEAJCUZjQm9vbApARlVOQ0AJCUZjUGF0dGVybkVxdWFsCkBUWVBFMUAgCWNvbnN0IEZjUGF0dGVybiAqCQlAQVJHMUAgCQlwYQpAVFlQRTJACQljb25zdCBGY1BhdHRlcm4gKiAJCUBBUkcyQAkJcGIgCkBQVVJQT1NFQAlDb21wYXJlIHBhdHRlcm5zCkBERVNDQApSZXR1cm5zIHdoZXRoZXIgPHBhcmFtZXRlcj5wYTwvcGFyYW1ldGVyPiBhbmQgPHBhcmFtZXRlcj5wYjwvcGFyYW1ldGVyPiBhcmUgZXhhY3RseSBhbGlrZS4KQEAKCkBSRVRACQlGY0Jvb2wKQEZVTkNACQlGY1BhdHRlcm5FcXVhbFN1YnNldApAVFlQRTFACQljb25zdCBGY1BhdHRlcm4gKiAJCUBBUkcxQCAJCXBhCkBUWVBFMkAJCWNvbnN0IEZjUGF0dGVybiAqCQlAQVJHMkAgCQlwYgpAVFlQRTNAIAljb25zdCBGY09iamVjdFNldCAqIAkJQEFSRzNAIAkJb3MgCkBQVVJQT1NFQAlDb21wYXJlIHBvcnRpb25zIG9mIHBhdHRlcm5zCkBERVNDQApSZXR1cm5zIHdoZXRoZXIgPHBhcmFtZXRlcj5wYTwvcGFyYW1ldGVyPiBhbmQgPHBhcmFtZXRlcj5wYjwvcGFyYW1ldGVyPiBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgdmFsdWVzIGZvciBhbGwgb2YgdGhlCm9iamVjdHMgaW4gPHBhcmFtZXRlcj5vczwvcGFyYW1ldGVyPi4KQEAKCkBSRVRACQlGY0NoYXIzMgpARlVOQ0AJCUZjUGF0dGVybkhhc2gKQFRZUEUxQAkJY29uc3QgRmNQYXR0ZXJuICoJCUBBUkcxQAkJcApAUFVSUE9TRUAJQ29tcHV0ZSBhIHBhdHRlcm4gaGFzaCB2YWx1ZQpAREVTQ0AKUmV0dXJucyBhIDMyLWJpdCBudW1iZXIgd2hpY2ggaXMgdGhlIHNhbWUgZm9yIGFueSB0d28gcGF0dGVybnMgd2hpY2ggYXJlCmVxdWFsLgpAQAoKQFJFVEAJCUZjQm9vbApARlVOQ0AJCUZjUGF0dGVybkFkZApAVFlQRTFACQlGY1BhdHRlcm4gKiAJCQlAQVJHMUAgCQlwCkBUWVBFMkAgCWNvbnN0IGNoYXIgKgkJCUBBUkcyQCAJCW9iamVjdApAVFlQRTNACQlGY1ZhbHVlCQkJCUBBUkczQAkJdmFsdWUKQFRZUEU0QAkJRmNCb29sCQkJCUBBUkc0QAkJYXBwZW5kIApAUFVSUE9TRUAJQWRkIGEgdmFsdWUgdG8gYSBwYXR0ZXJuCkBERVNDQApBZGRzIGEgc2luZ2xlIHZhbHVlIHRvIHRoZSBsaXN0IG9mIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IG5hbWVkCmBvYmplY3Q8cGFyYW1ldGVyPi4gIElmIGBhcHBlbmQ8L3BhcmFtZXRlcj4gaXMgRmNUcnVlLCB0aGUgdmFsdWUgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiBhbnkKZXhpc3RpbmcgbGlzdCwgb3RoZXJ3aXNlIGl0IGlzIGluc2VydGVkIGF0IHRoZSBiZWdpbmluZy4gIGB2YWx1ZScgaXMgc2F2ZWQKKHdpdGggRmNWYWx1ZVNhdmUpIHdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgcGF0dGVybiBzbyB0aGF0IHRoZSBsaWJyYXJ5CnJldGFpbnMgbm8gcmVmZXJlbmNlIHRvIGFueSBhcHBsaWNhdGlvbi1zdXBwbGllZCBkYXRhIHN0cnVjdHVyZS4KQEAKCkBSRVRACQlGY0Jvb2wKQEZVTkNACQlGY1BhdHRlcm5BZGRXZWFrCkBUWVBFMUAgCUZjUGF0dGVybiAqIAkJCUBBUkcxQCAJCXAKQFRZUEUyQCAJY29uc3QgY2hhciAqIAkJCUBBUkcyQCAJCW9iamVjdApAVFlQRTNAIAlGY1ZhbHVlICAJCQlAQVJHM0AgCQl2YWx1ZQpAVFlQRTRAIAlGY0Jvb2wgIAkJCUBBUkc0QAkJYXBwZW5kIApAUFVSUE9TRUAJQWRkIGEgdmFsdWUgdG8gYSBwYXR0ZXJuIHdpdGggd2VhayBiaW5kaW5nCkBERVNDQApGY1BhdHRlcm5BZGRXZWFrIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIEZjUGF0dGVybkFkZCBleGNlcHQgdGhhdCBhbnkKdmFsdWVzIGFkZGVkIHRvIHRoZSBsaXN0IGhhdmUgYmluZGluZyA8cGFyYW1ldGVyPndlYWs8L3BhcmFtZXRlcj4gaW5zdGVhZCBvZiA8cGFyYW1ldGVyPnN0cm9uZzwvcGFyYW1ldGVyPi4KQEAKCkBUSVRMRUAJCUZjUGF0dGVybkFkZC1UeXBlCkBSRVRACQlGY0Jvb2wKQEZVTkNACQlGY1BhdHRlcm5BZGRJbnRlZ2VyCkBUWVBFMUAgCUZjUGF0dGVybiAqIAkJCUBBUkcxQCAJCXAKQFRZUEUyQAkJY29uc3QgY2hhciAqCQkJQEFSRzJACQlvYmplY3QKQFRZUEUzQAkJaW50CQkJCUBBUkczQAkJaQoKQFBST1RPVFlQRStACkBSRVQrQAkJRmNCb29sCkBGVU5DK0AJCUZjUGF0dGVybkFkZERvdWJsZQpAVFlQRTErQCAJRmNQYXR0ZXJuICogCQkJQEFSRzErQCAJcApAVFlQRTIrQAljb25zdCBjaGFyICoJCQlAQVJHMitACQlvYmplY3QKQFRZUEUzK0AJZG91YmxlCQkJCUBBUkczK0AJCWQKCkBQUk9UT1RZUEUrK0AKQFJFVCsrQAkJRmNCb29sCkBGVU5DKytACUZjUGF0dGVybkFkZFN0cmluZwpAVFlQRTErK0AgCUZjUGF0dGVybiAqIAkJCUBBUkcxKytAIAlwCkBUWVBFMisrQAljb25zdCBjaGFyICoJCQlAQVJHMisrQAlvYmplY3QKQFRZUEUzKytACWNvbnN0IGNoYXIgKgkJCUBBUkczKytACXMKCkBQUk9UT1RZUEUrKytACkBSRVQrKytACUZjQm9vbApARlVOQysrK0AJRmNQYXR0ZXJuQWRkTWF0cml4CkBUWVBFMSsrK0AgCUZjUGF0dGVybiAqIAkJCUBBUkcxKysrQCAJcApAVFlQRTIrKytACWNvbnN0IGNoYXIgKgkJCUBBUkcyKysrQAlvYmplY3QKQFRZUEUzKysrQAljb25zdCBGY01hdHJpeCAqCQlAQVJHMysrK0AJbQoKQFBST1RPVFlQRSsrKytACkBSRVQrKysrQAlGY0Jvb2wKQEZVTkMrKysrQAlGY1BhdHRlcm5BZGRDaGFyU2V0CkBUWVBFMSsrKytAIAlGY1BhdHRlcm4gKiAJCQlAQVJHMSsrKytAIAlwCkBUWVBFMisrKytACWNvbnN0IGNoYXIgKgkJCUBBUkcyKysrK0AJb2JqZWN0CkBUWVBFMysrKytACWNvbnN0IEZjQ2hhclNldCAqCQlAQVJHMysrKytACWMKCkBQUk9UT1RZUEUrKysrK0AKQFJFVCsrKysrQAlGY0Jvb2wKQEZVTkMrKysrK0AJRmNQYXR0ZXJuQWRkQm9vbApAVFlQRTErKysrK0AgCUZjUGF0dGVybiAqIAkJCUBBUkcxKysrKytAIAlwCkBUWVBFMisrKysrQAljb25zdCBjaGFyICoJCQlAQVJHMisrKysrQAlvYmplY3QKQFRZUEUzKysrKytACUZjQm9vbAkJCQlAQVJHMysrKysrQAliCkBQVVJQT1NFQAlBZGQgYSB0eXBlZCB2YWx1ZSB0byBhIHBhdHRlcm4KQERFU0NAClRoZXNlIGFyZSBhbGwgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRoYXQgaW5zZXJ0IG9iamVjdHMgb2YgdGhlIHNwZWNpZmllZAp0eXBlIGludG8gdGhlIHBhdHRlcm4uICBVc2UgdGhlc2UgaW4gcHJlZmVyZW5jZSB0byBGY1BhdHRlcm5BZGQgYXMgdGhleQp3aWxsIHByb3ZpZGUgY29tcGlsZS10aW1lIHR5cGVjaGVja2luZy4gIFRoZXNlIGFsbCBhcHBlbmQgdmFsdWVzIHRvCmFueSBleGlzdGluZyBsaXN0IG9mIHZhbHVlcy4KQEAKCkBSRVRACQlGY1Jlc3VsdApARlVOQ0AJCUZjUGF0dGVybkdldApAVFlQRTFACQlGY1BhdHRlcm4gKgkJCUBBUkcxQAkJcApAVFlQRTJACQljb25zdCBjaGFyICoJCQlAQVJHMkAJCW9iamVjdApAVFlQRTNACQlpbnQgIAkJCQlAQVJHM0AgCQlpZApAVFlQRTRACQlGY1ZhbHVlICoJCQlAQVJHNEAJCXYgCkBQVVJQT1NFQAlSZXR1cm4gYSB2YWx1ZSBmcm9tIGEgcGF0dGVybgpAREVTQ0AKUmV0dXJucyBpbiBgdjxwYXJhbWV0ZXI+IHRoZSBgaWQ8L3BhcmFtZXRlcj50aCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IGBvYmplY3QnLgpUaGUgdmFsdWUgcmV0dXJuZWQgaXMgbm90IGEgY29weSwgYnV0IHJhdGhlciByZWZlcnMgdG8gdGhlIGRhdGEgc3RvcmVkCndpdGhpbiB0aGUgcGF0dGVybiBkaXJlY3RseS4gIEFwcGxpY2F0aW9ucyBtdXN0IG5vdCBmcmVlIHRoaXMgdmFsdWUuCkBACgpAVElUTEVACQlGY1BhdHRlcm5HZXQtVHlwZQpAUFJPVE9UWVBFQApAUkVUQCAJCUZjUmVzdWx0CkBGVU5DQAkJRmNQYXR0ZXJuR2V0SW50ZWdlcgpAVFlQRTFACQlGY1BhdHRlcm4gKgkJCUBBUkcxQAkJcApAVFlQRTJACQljb25zdCBjaGFyICoJCQlAQVJHMkAJCW9iamVjdApAVFlQRTNACQlpbnQJCQkJQEFSRzNACQluCkBUWVBFNEAJCWludCAqCQkJCUBBUkc0QAkJaQoKQFBST1RPVFlQRStACkBSRVQrQAkJRmNSZXN1bHQKQEZVTkMrQCAJRmNQYXR0ZXJuR2V0RG91YmxlCkBUWVBFMStACUZjUGF0dGVybiAqCQkJQEFSRzErQAkJcApAVFlQRTIrQAljb25zdCBjaGFyICoJCQlAQVJHMitACQlvYmplY3QKQFRZUEUzK0AJaW50CQkJCUBBUkczK0AJCW4KQFRZUEU0K0AJZG91YmxlICoJCQlAQVJHNCtACQlkIAoKQFBST1RPVFlQRSsrQApAUkVUKytAIAlGY1Jlc3VsdApARlVOQysrQAlGY1BhdHRlcm5HZXRTdHJpbmcKQFRZUEUxKytACUZjUGF0dGVybiAqCQkJQEFSRzErK0AJcApAVFlQRTIrK0AJY29uc3QgY2hhciAqCQkJQEFSRzIrK0AJb2JqZWN0CkBUWVBFMysrQAlpbnQJCQkJQEFSRzMrK0AJbgpAVFlQRTQrK0AJY2hhciAqKmNvbnN0CQkJQEFSRzQrK0AJcwoKQFBST1RPVFlQRSsrK0AKQFJFVCsrK0AJRmNSZXN1bHQKQEZVTkMrKytACUZjUGF0dGVybkdldE1hdHJpeCAKQFRZUEUxKysrQCAJRmNQYXR0ZXJuICogCQkJQEFSRzErKytAIAlwIApAVFlQRTIrKytAIAljb25zdCBjaGFyICogCQkJQEFSRzIrKytAIAlvYmplY3QgCkBUWVBFMysrK0AgCWludCAgCQkJCUBBUkczKysrQCAJbiAKQFRZUEU0KysrQCAJRmNNYXRyaXggKiogCQkJQEFSRzQrKytAIAlzIAoKQFBST1RPVFlQRSsrKytACkBSRVQrKysrQCAJRmNSZXN1bHQgCkBGVU5DKysrK0AgCUZjUGF0dGVybkdldENoYXJTZXQgCkBUWVBFMSsrKytAIAlGY1BhdHRlcm4gKiAJCQlAQVJHMSsrKytAIAlwIApAVFlQRTIrKysrQCAJY29uc3QgY2hhciAqIAkJCUBBUkcyKysrK0AgCW9iamVjdCAKQFRZUEUzKysrK0AgCWludCAgCQkJCUBBUkczKysrK0AgCW4gCkBUWVBFNCsrKytAIAlGY0NoYXJTZXQgKiogCQkJQEFSRzQrKysrQCAJYyAKCkBQUk9UT1RZUEUrKysrK0AKQFJFVCsrKysrQCAJRmNSZXN1bHQgCkBGVU5DKysrKytAIAlGY1BhdHRlcm5HZXRCb29sIAkJCkBUWVBFMSsrKysrQCAJRmNQYXR0ZXJuICogCQkJQEFSRzErKysrK0AgCXAKQFRZUEUyKysrKytAIAljb25zdCBjaGFyICogCQkJQEFSRzIrKysrK0AgCW9iamVjdCAKQFRZUEUzKysrKytAIAlpbnQgIAkJCQlAQVJHMysrKysrQCAJbiAKQFRZUEU0KysrKytAIAlGY0Jvb2wgKiAJCQlAQVJHNCsrKysrQCAJYiAKQFBVUlBPU0VACVJldHVybiBhIHR5cGVkIHZhbHVlIGZyb20gYSBwYXR0ZXJuCkBERVNDQApUaGVzZSBhcmUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRoYXQgY2FsbCBGY1BhdHRlcm5HZXQgYW5kIHZlcmlmeSB0aGF0IHRoZQpyZXR1cm5lZCBkYXRhIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlLiBUaGV5IHJldHVybiBGY1Jlc3VsdFR5cGVNaXNtYXRjaCBpZgp0aGlzIGlzIG5vdCB0aGUgY2FzZS4gIE5vdGUgdGhhdCB0aGVzZSAobGlrZSBGY1BhdHRlcm5HZXQpIGRvIG5vdCBtYWtlIGEKY29weSBvZiBhbnkgZGF0YSBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieSB0aGUgcmV0dXJuIHZhbHVlLiAgVXNlIHRoZXNlCmluIHByZWZlcmVuY2UgdG8gRmNQYXR0ZXJuR2V0IHRvIHByb3ZpZGUgY29tcGlsZS10aW1lIHR5cGVjaGVja2luZy4KQEAKCkBSRVRACQlGY1BhdHRlcm4gKgpARlVOQ0AJCUZjUGF0dGVybkJ1aWxkCkBUWVBFMUAJCUZjUGF0dGVybiAqCQkJQEFSRzFACQlvcmlnCkBUWVBFMkAgCS4uLgoKQFBST1RPVFlQRStACkBSRVQrQAkJRmNQYXR0ZXJuICoKQEZVTkMrQAkJRmNQYXR0ZXJuVmFCdWlsZApAVFlQRTErQAlGY1BhdHRlcm4gKgkJCUBBUkcxK0AJCW9yaWcKQFRZUEUyK0AJdmFfbGlzdCAJCQlAQVJHMitACQl2YQpAUFVSUE9TRUAJQ3JlYXRlIHBhdHRlcm5zIGZyb20gYXJndW1lbnRzCkBERVNDQApCdWlsZHMgYSBwYXR0ZXJuIHVzaW5nIGEgbGlzdCBvZiBvYmplY3RzLCB0eXBlcyBhbmQgdmFsdWVzLiAgRWFjaAp2YWx1ZSB0byBiZSBlbnRlcmVkIGluIHRoZSBwYXR0ZXJuIGlzIHNwZWNpZmllZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKPG9yZGVyZWRsaXN0Pgo8bGlzdGl0ZW0+PHBhcmE+Ck9iamVjdCBuYW1lLCBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwcm9wZXJ0eSB0byBiZSBhZGRlZC4KPC9wYXJhPjwvbGlzdGl0ZW0+PGxpc3RpdGVtPjxwYXJhPgpPYmplY3QgdHlwZSwgb25lIG9mIHRoZSBGY1R5cGUgZW51bWVyYXRlZCB2YWx1ZXMKPC9wYXJhPjwvbGlzdGl0ZW0+PGxpc3RpdGVtPjxwYXJhPgpWYWx1ZSwgbm90IGFuIEZjVmFsdWUsIGJ1dCB0aGUgcmF3IHR5cGUgYXMgcGFzc2VkIHRvIGFueSBvZiB0aGUKRmNQYXR0ZXJuQWRkJmx0O3R5cGUmZ3Q7IGZ1bmN0aW9ucy4gIE11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIHNlY29uZAphcmd1bWVudC4KPC9wYXJhPjwvbGlzdGl0ZW0+Cjwvb3JkZXJlZGxpc3Q+CjxwYXJhPgpUaGUgYXJndW1lbnQgbGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBvYmplY3QgbmFtZSwgbm8gb2JqZWN0IHR5cGUgbm9yCnZhbHVlIG5lZWQgYmUgcGFzc2VkIGZvciB0aGlzLiAgVGhlIHZhbHVlcyBhcmUgYWRkZWQgdG8gYHBhdHRlcm4nLCBpZgpgcGF0dGVybicgaXMgbnVsbCwgYSBuZXcgcGF0dGVybiBpcyBjcmVhdGVkLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBwYXR0ZXJuIGlzCnJldHVybmVkLiBFeGFtcGxlCjwvcGFyYT4KPHByb2dyYW1saXN0aW5nPgpwYXR0ZXJuID0gRmNQYXR0ZXJuQnVpbGQgKDAsIEZDX0ZBTUlMWSwgRnRUeXBlU3RyaW5nLCAiVGltZXMiLCAoY2hhciAqKSAwKTsKPC9wcm9ncmFtbGlzdGluZz4KPHBhcmE+CkZjUGF0dGVyblZhQnVpbGQgaXMgdXNlZCB3aGVuIHRoZSBhcmd1bWVudHMgYXJlIGFscmVhZHkgaW4gdGhlIGZvcm0gb2YgYQp2YXJhcmdzIHZhbHVlLgpAQAoKQFJFVEAJCUZjQm9vbApARlVOQ0AJCUZjUGF0dGVybkRlbApAVFlQRTFACQlGY1BhdHRlcm4gKgkJCUBBUkcxQAkJcApAVFlQRTJACQljb25zdCBjaGFyICoJCQlAQVJHMkAJCW9iamVjdCAKQFBVUlBPU0VACURlbGV0ZSBhIHByb3BlcnR5IGZyb20gYSBwYXR0ZXJuCkBERVNDQApEZWxldGVzIGFsbCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBgb2JqZWN0JywgcmV0dXJuaW5nIAp3aGV0aGVyIHRoZSBwcm9wZXJ0eSBleGlzdGVkIG9yIG5vdC4KQEAKCkBSRVRACQl2b2lkCkBGVU5DQAkJRmNQYXR0ZXJuUHJpbnQKQFRZUEUxQAkJY29uc3QgRmNQYXR0ZXJuICoJCUBBUkcxQAkJcCAKQFBVUlBPU0VACVByaW50IGEgcGF0dGVybiBmb3IgZGVidWdnaW5nCkBERVNDQApQcmludHMgYW4gZWFzaWx5IHJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIHBhdHRlcm4gdG8gc3Rkb3V0LiAgVGhlcmUgaXMKbm8gcHJvdmlzaW9uIGZvciByZXBhcnNpbmcgZGF0YSBpbiB0aGlzIGZvcm1hdCwgaXQncyBqdXN0IGZvciBkaWFnbm9zdGljcwphbmQgZGVidWdnaW5nLgpAQAoKQFJFVEAJCXZvaWQgCQpARlVOQ0AJCUZjRGVmYXVsdFN1YnN0aXR1dGUKQFRZUEUxQAkJRmNQYXR0ZXJuICoJCQlAQVJHMUAJCXBhdHRlcm4gCkBQVVJQT1NFQAlQZXJmb3JtIGRlZmF1bHQgc3Vic3RpdHV0aW9ucyBpbiBhIHBhdHRlcm4KQERFU0NAClN1cHBsaWVzIGRlZmF1bHQgdmFsdWVzIGZvciB1bmRlcnNwZWNpZmllZCBmb250IHBhdHRlcm5zOgo8aXRlbWl6ZWRsaXN0Pgo8bGlzdGl0ZW0+PHBhcmE+ClBhdHRlcm5zIHdpdGhvdXQgYSBzcGVjaWZpZWQgc3R5bGUgb3Igd2VpZ2h0IGFyZSBzZXQgdG8gTWVkaXVtCjwvcGFyYT48L2xpc3RpdGVtPgo8bGlzdGl0ZW0+PHBhcmE+ClBhdHRlcm5zIHdpdGhvdXQgYSBzcGVjaWZpZWQgc3R5bGUgb3Igc2xhbnQgYXJlIHNldCB0byBSb21hbgo8L3BhcmE+PC9saXN0aXRlbT4KPGxpc3RpdGVtPjxwYXJhPgpQYXR0ZXJucyB3aXRob3V0IGEgc3BlY2lmaWVkIHBpeGVsIHNpemUgYXJlIGdpdmVuIG9uZSBjb21wdXRlZCBmcm9tIGFueQpzcGVjaWZpZWQgcG9pbnQgc2l6ZSAoZGVmYXVsdCAxMiksIGRwaSAoZGVmYXVsdCA3NSkgYW5kIHNjYWxlIChkZWZhdWx0IDEpLgo8L3BhcmE+PC9saXN0aXRlbT4KPC9pdGVtaXplZGxpc3Q+CkBACgpAUkVUQAkJRmNQYXR0ZXJuICoKQEZVTkNACQlGY05hbWVQYXJzZQpAVFlQRTFACQljb25zdCBjaGFyICoJCQlAQVJHMUAJCW5hbWUgCkBQVVJQT1NFQAlQYXJzZSBhIHBhdHRlcm4gc3RyaW5nCkBERVNDQApDb252ZXJ0cyA8cGFyYW1ldGVyPm5hbWU8L3BhcmFtZXRlcj4gZnJvbSB0aGUgc3RhbmRhcmQgdGV4dCBmb3JtYXQgZGVzY3JpYmVkIGFib3ZlIGludG8gYSBwYXR0ZXJuLgpAQAoKQFJFVEAJCUZjQ2hhcjggKgpARlVOQ0AJCUZjTmFtZVVucGFyc2UKQFRZUEUxQAkJRmNQYXR0ZXJuICoJCQlAQVJHMUAJCXBhdCAKQFBVUlBPU0VACUNvbnZlcnQgYSBwYXR0ZXJuIGJhY2sgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQKQERFU0NACkNvbnZlcnRzIHRoZSBnaXZlbiBwYXR0ZXJuIGludG8gdGhlIHN0YW5kYXJkIHRleHQgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZS4KVGhlIHJldHVybiB2YWx1ZSBpcyBub3Qgc3RhdGljLCBidXQgaW5zdGVhZCByZWZlcnMgdG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeQp3aGljaCBzaG91bGQgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KQEAK