LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkNvcHlyaWdodCAoQykgMTk5NyBNYXJ0aW4gdm9uIEz2d2lzCgpQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLApwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIG5vIHdhcnJhbnR5LiBVc2UgYXQgeW91ciBvd24gcmlzay4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSAiUHl0aG9uLmgiCgpzdGF0aWMgY2hhciBsb2NhbGVfX2RvY19fW109IlN1cHBvcnQgZm9yIFBPU0lYIGxvY2FsZXMuIjsKCnN0YXRpYyBQeU9iamVjdCAqRXJyb3I7CgovKiBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgZm9ybWF0dGluZyBmbG9hdGluZyBwb2ludCBudW1iZXJzICovCgpzdGF0aWMgY2hhciBzZXRsb2NhbGVfX2RvY19fW109CiIoaW50ZWdlcixzdHJpbmc9Tm9uZSkgLT4gc3RyaW5nLiBBY3RpdmF0ZXMvcXVlcmllcyBsb2NhbGUgcHJvY2Vzc2luZy4iCjsKCi8qIHRvIHJlY29yZCB0aGUgTENfTlVNRVJJQyBzZXR0aW5ncyAqLwpzdGF0aWMgUHlPYmplY3QqIGdyb3VwaW5nPTA7CnN0YXRpYyBQeU9iamVjdCogdGhvdXNhbmRzX3NlcD0wOwpzdGF0aWMgUHlPYmplY3QqIGRlY2ltYWxfcG9pbnQ9MDsKLyogaWYgbm9uLW51bGwsIGluZGljYXRlcyB0aGF0IExDX05VTUVSSUMgaXMgZGlmZmVyZW50IGZyb20gIkMiICovCnN0YXRpYyBjaGFyKiBzYXZlZF9udW1lcmljPTA7CgovKiB0aGUgZ3JvdXBpbmcgaXMgdGVybWluYXRlZCBieSBlaXRoZXIgMCBvciBDSEFSX01BWCAqLwpzdGF0aWMgUHlPYmplY3QqCmNvcHlfZ3JvdXBpbmcocykKICBjaGFyKiBzOwp7CiAgaW50IGk7CiAgUHlPYmplY3QgKnJlc3VsdCwqdmFsPTA7CiAgaWYoc1swXT09J1wwJykKICAgICAvKiBlbXB0eSBzdHJpbmc6IG5vIGdyb3VwaW5nIGF0IGFsbCAqLwogICAgIHJldHVybiBQeUxpc3RfTmV3KDApOwogIGZvcihpPTA7c1tpXSE9J1wwJyAmJiBzW2ldIT1DSEFSX01BWDtpKyspCiAgICAgLyogbm90aGluZyAqLzsKICByZXN1bHQgPSBQeUxpc3RfTmV3KGkrMSk7CiAgaWYoIXJlc3VsdClyZXR1cm4gTlVMTDsKICBpPS0xOwogIGRvewogICAgaSsrOwogICAgdmFsPVB5SW50X0Zyb21Mb25nKHNbaV0pOwogICAgaWYoIXZhbClicmVhazsKICAgIGlmKFB5TGlzdF9TZXRJdGVtKHJlc3VsdCxpLHZhbCkpewogICAgICBQeV9ERUNSRUYodmFsKTsKICAgICAgdmFsPTA7CiAgICAgIGJyZWFrOwogICAgfQogIH13aGlsZShzW2ldIT0nXDAnICYmIHNbaV0hPUNIQVJfTUFYKTsKICBpZighdmFsKXsKICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgcmV0dXJuIE5VTEw7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyB2b2lkCmZpeHVwX3VsY2FzZSgpCnsKICBQeU9iamVjdCAqbW9kcywqc3Ryb3AsKnN0cmluZywqdWxvOwogIHVuc2lnbmVkIGNoYXIgdWxbMjU2XTsKICBpbnQgbixjOwoKICAvKiBmaW5kaW5nIHN5cy5tb2R1bGVzICovCiAgbW9kcz1QeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CiAgaWYoIW1vZHMpcmV0dXJuOwogIC8qIGZpbmRpbmcgdGhlIG1vZHVsZSAqLwogIHN0cmluZz1QeURpY3RfR2V0SXRlbVN0cmluZyhtb2RzLCJzdHJpbmciKTsKICBpZihzdHJpbmcpCiAgICAgc3RyaW5nPVB5TW9kdWxlX0dldERpY3Qoc3RyaW5nKTsKICBzdHJvcD1QeURpY3RfR2V0SXRlbVN0cmluZyhtb2RzLCJzdHJvcCIpOwogIGlmKHN0cm9wKQogICAgIHN0cm9wPVB5TW9kdWxlX0dldERpY3Qoc3Ryb3ApOwogIGlmKCFzdHJpbmcgJiYgIXN0cm9wKXJldHVybjsKICAvKiBjcmVhdGUgdXBwZXJjYXNlICovCiAgbiA9IDA7CiAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7CiAgICBpZiAoaXN1cHBlcihjKSkKICAgICAgIHVsW24rK10gPSBjOwogIH0KICB1bG89UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodWwsbik7CiAgaWYoIXVsbylyZXR1cm47CiAgaWYoc3RyaW5nKQogICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHN0cmluZywidXBwZXJjYXNlIix1bG8pOwogIGlmKHN0cm9wKQogICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHN0cm9wLCJ1cHBlcmNhc2UiLHVsbyk7CiAgUHlfREVDUkVGKHVsbyk7CiAgLyogY3JlYXRlIGxvd2VyY2FzZSAqLwogIG4gPSAwOwogIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykgewogICAgaWYgKGlzbG93ZXIoYykpCiAgICAgICB1bFtuKytdID0gYzsKICB9CiAgdWxvPVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHVsLG4pOwogIGlmKCF1bG8pcmV0dXJuOwogIGlmKHN0cmluZykKICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzdHJpbmcsImxvd2VyY2FzZSIsdWxvKTsKICBpZihzdHJvcCkKICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzdHJvcCwibG93ZXJjYXNlIix1bG8pOwogIFB5X0RFQ1JFRih1bG8pOwogIC8qIGNyZWF0ZSBsZXR0ZXJzICovCiAgbiA9IDA7CiAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7CiAgICBpZiAoaXNhbHBoYShjKSkKICAgICAgIHVsW24rK10gPSBjOwogIH0KICB1bG89UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodWwsbik7CiAgaWYoIXVsbylyZXR1cm47CiAgaWYoc3RyaW5nKQogICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHN0cmluZywibGV0dGVycyIsdWxvKTsKICBQeV9ERUNSRUYodWxvKTsKfQogIAoKc3RhdGljIFB5T2JqZWN0KgpQeUxvY2FsZV9zZXRsb2NhbGUoc2VsZixhcmdzKQogIFB5T2JqZWN0ICpzZWxmOwogIFB5T2JqZWN0ICphcmdzOwp7CiAgaW50IGNhdGVnb3J5OwogIGNoYXIgKmxvY2FsZT0wLCpyZXN1bHQ7CiAgUHlPYmplY3QgKnJlc3VsdF9vYmplY3Q7CiAgc3RydWN0IGxjb252ICpsYzsKICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJpfHoiLCZjYXRlZ29yeSwmbG9jYWxlKSlyZXR1cm4gMDsKICBpZihsb2NhbGUpewogICAgLyogc2V0IGxvY2FsZSAqLwogICAgcmVzdWx0PXNldGxvY2FsZShjYXRlZ29yeSxsb2NhbGUpOwogICAgaWYoIXJlc3VsdCl7CiAgICAgIC8qIG9wZXJhdGlvbiBmYWlsZWQsIG5vIHNldHRpbmcgd2FzIGNoYW5nZWQgKi8KICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCJsb2NhbGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIik7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmVzdWx0X29iamVjdD1QeVN0cmluZ19Gcm9tU3RyaW5nKHJlc3VsdCk7CiAgICBpZighcmVzdWx0KXJldHVybiBOVUxMOwogICAgLyogcmVjb3JkIGNoYW5nZXMgdG8gTENfTlVNRVJJQyAqLwogICAgaWYoY2F0ZWdvcnk9PUxDX05VTUVSSUMgfHwgY2F0ZWdvcnk9PUxDX0FMTCl7CiAgICAgIGlmKHN0cmNtcChsb2NhbGUsIkMiKT09MCB8fCBzdHJjbXAobG9jYWxlLCJQT1NJWCIpPT0wKXsKICAgICAgICAvKiB1c2VyIGp1c3QgYXNrZWQgZm9yIGRlZmF1bHQgbnVtZXJpYyBsb2NhbGUgKi8KICAgICAgICBpZihzYXZlZF9udW1lcmljKWZyZWUoc2F2ZWRfbnVtZXJpYyk7CiAgICAgICAgc2F2ZWRfbnVtZXJpYz0wOwogICAgICB9ZWxzZXsKICAgICAgICAvKiByZW1lbWJlciB2YWx1ZXMgKi8KICAgICAgICBsYz1sb2NhbGVjb252KCk7CiAgICAgICAgUHlfWERFQ1JFRihncm91cGluZyk7CiAgICAgICAgZ3JvdXBpbmc9Y29weV9ncm91cGluZyhsYy0+Z3JvdXBpbmcpOwogICAgICAgIFB5X1hERUNSRUYodGhvdXNhbmRzX3NlcCk7CiAgICAgICAgdGhvdXNhbmRzX3NlcD1QeVN0cmluZ19Gcm9tU3RyaW5nKGxjLT50aG91c2FuZHNfc2VwKTsKICAgICAgICBQeV9YREVDUkVGKGRlY2ltYWxfcG9pbnQpOwogICAgICAgIGRlY2ltYWxfcG9pbnQ9UHlTdHJpbmdfRnJvbVN0cmluZyhsYy0+ZGVjaW1hbF9wb2ludCk7CiAgICAgICAgc2F2ZWRfbnVtZXJpYyA9IHN0cmR1cChsb2NhbGUpOwoKICAgICAgICAvKiByZXN0b3JlIHRvICJDIiAqLwogICAgICAgIHNldGxvY2FsZShMQ19OVU1FUklDLCJDIik7CiAgICAgIH0KICAgIH0KICAgIC8qIHJlY29yZCBjaGFuZ2VzIHRvIExDX0NUWVBFICovCiAgICBpZihjYXRlZ29yeT09TENfQ1RZUEUgfHwgY2F0ZWdvcnk9PUxDX0FMTCkKICAgICAgIGZpeHVwX3VsY2FzZSgpOwogICAgLyogdGhpbmdzIHRoYXQgZ290IHdyb25nIHVwIHRvIGhlcmUgYXJlIGlnbm9yZWQgKi8KICAgIFB5RXJyX0NsZWFyKCk7CiAgfWVsc2V7CiAgICAvKiBnZXQgbG9jYWxlICovCiAgICAvKiByZXN0b3JlIExDX05VTUVSSUMgZmlyc3QsIGlmIGFwcHJvcHJpYXRlICovCiAgICBpZihzYXZlZF9udW1lcmljKQogICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsc2F2ZWRfbnVtZXJpYyk7CiAgICByZXN1bHQ9c2V0bG9jYWxlKGNhdGVnb3J5LE5VTEwpOwogICAgaWYoIXJlc3VsdCl7CiAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwibG9jYWxlIHF1ZXJ5IGZhaWxlZCIpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHJlc3VsdF9vYmplY3Q9UHlTdHJpbmdfRnJvbVN0cmluZyhyZXN1bHQpOwogICAgLyogcmVzdG9yZSBiYWNrIHRvICJDIiAqLwogICAgaWYoc2F2ZWRfbnVtZXJpYykKICAgICAgIHNldGxvY2FsZShMQ19OVU1FUklDLCJDIik7CiAgfQogIHJldHVybiByZXN1bHRfb2JqZWN0Owp9CgpzdGF0aWMgY2hhciBsb2NhbGVjb252X19kb2NfX1tdPQoiKCkgLT4gZGljdC4gUmV0dXJucyBudW1lcmljIGFuZCBtb25ldGFyeSBsb2NhbGUtc3BlY2lmaWMgcGFyYW1ldGVycy4iCjsKCnN0YXRpYyBQeU9iamVjdCoKUHlMb2NhbGVfbG9jYWxlY29udihzZWxmLGFyZ3MpCiAgUHlPYmplY3QgKnNlbGY7CiAgUHlPYmplY3QgKmFyZ3M7CnsKICBQeU9iamVjdCogcmVzdWx0OwogIHN0cnVjdCBsY29udiAqbDsKICBQeU9iamVjdCAqeDsKICBpZighUHlBcmdfTm9BcmdzKGFyZ3MpKXJldHVybiAwOwogIHJlc3VsdCA9IFB5RGljdF9OZXcoKTsKICBpZighcmVzdWx0KXJldHVybiAwOwogIC8qIGlmIExDX05VTUVSSUMgaXMgZGlmZmVyZW50IGluIHRoZSBDIGxpYnJhcnksIHVzZSBzYXZlZCB2YWx1ZSAqLwogIGwgPSBsb2NhbGVjb252KCk7CiAgLyogaG9wZWZ1bGx5LCB0aGUgbG9jYWxlY29udiByZXN1bHQgc3Vydml2ZXMgdGhlIEMgbGlicmFyeSBjYWxscwogICAgIGludm9sdmVkIGhlcmVpbiAqLwojZGVmaW5lIFJFU1VMVF9TVFJJTkcocykgXAogIHg9UHlTdHJpbmdfRnJvbVN0cmluZyhsLT5zKTtpZigheClnb3RvIGZhaWxlZDtQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsI3MseCk7UHlfWERFQ1JFRih4KQojZGVmaW5lIFJFU1VMVF9JTlQoaSkgXAogIHg9UHlJbnRfRnJvbUxvbmcobC0+aSk7aWYoIXgpZ290byBmYWlsZWQ7UHlEaWN0X1NldEl0ZW1TdHJpbmcocmVzdWx0LCNpLHgpO1B5X1hERUNSRUYoeCkKCiAgICAvKiBOdW1lcmljIGluZm9ybWF0aW9uICovCiAgaWYoc2F2ZWRfbnVtZXJpYyl7CiAgICAvKiBjYW5ub3QgdXNlIGxvY2FsZWNvbnYgcmVzdWx0cyAqLwogICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcocmVzdWx0LCJkZWNpbWFsX3BvaW50IixkZWNpbWFsX3BvaW50KTsKICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwiZ3JvdXBpbmciLGdyb3VwaW5nKTsKICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwidGhvdXNhbmRzX3NlcCIsdGhvdXNhbmRzX3NlcCk7CiAgfWVsc2V7CiAgICBSRVNVTFRfU1RSSU5HKGRlY2ltYWxfcG9pbnQpOwogICAgUkVTVUxUX1NUUklORyh0aG91c2FuZHNfc2VwKTsKICAgIHg9Y29weV9ncm91cGluZyhsLT5ncm91cGluZyk7CiAgICBpZigheClnb3RvIGZhaWxlZDsKICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwiZ3JvdXBpbmciLHgpOwogICAgUHlfWERFQ1JFRih4KTsKICB9CgogIC8qIE1vbmV0YXJ5IGluZm9ybWF0aW9uICovCiAgUkVTVUxUX1NUUklORyhpbnRfY3Vycl9zeW1ib2wpOwogIFJFU1VMVF9TVFJJTkcoY3VycmVuY3lfc3ltYm9sKTsKICBSRVNVTFRfU1RSSU5HKG1vbl9kZWNpbWFsX3BvaW50KTsKICBSRVNVTFRfU1RSSU5HKG1vbl90aG91c2FuZHNfc2VwKTsKICB4PWNvcHlfZ3JvdXBpbmcobC0+bW9uX2dyb3VwaW5nKTsKICBpZigheClnb3RvIGZhaWxlZDsKICBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsIm1vbl9ncm91cGluZyIseCk7CiAgUHlfWERFQ1JFRih4KTsKICBSRVNVTFRfU1RSSU5HKHBvc2l0aXZlX3NpZ24pOwogIFJFU1VMVF9TVFJJTkcobmVnYXRpdmVfc2lnbik7CiAgUkVTVUxUX0lOVChpbnRfZnJhY19kaWdpdHMpOwogIFJFU1VMVF9JTlQoZnJhY19kaWdpdHMpOwogIFJFU1VMVF9JTlQocF9jc19wcmVjZWRlcyk7CiAgUkVTVUxUX0lOVChwX3NlcF9ieV9zcGFjZSk7CiAgUkVTVUxUX0lOVChuX2NzX3ByZWNlZGVzKTsKICBSRVNVTFRfSU5UKG5fc2VwX2J5X3NwYWNlKTsKICBSRVNVTFRfSU5UKHBfc2lnbl9wb3NuKTsKICBSRVNVTFRfSU5UKG5fc2lnbl9wb3NuKTsKCiAgcmV0dXJuIHJlc3VsdDsKIGZhaWxlZDoKICBQeV9YREVDUkVGKHJlc3VsdCk7CiAgUHlfWERFQ1JFRih4KTsKICByZXR1cm4gTlVMTDsKfQoKc3RhdGljIGNoYXIgc3RyY29sbF9fZG9jX19bXT0KInN0cmluZyxzdHJpbmcgLT4gaW50LiBDb21wYXJlcyB0d28gc3RyaW5ncyBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsZS4iCjsKCnN0YXRpYyBQeU9iamVjdCoKUHlMb2NhbGVfc3RyY29sbChzZWxmLGFyZ3MpCiAgUHlPYmplY3QgKnNlbGY7CiAgUHlPYmplY3QgKmFyZ3M7CnsKICBjaGFyICpzMSwqczI7CiAgaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywic3MiLCZzMSwmczIpKQogICAgIHJldHVybiBOVUxMOwogIHJldHVybiBQeUludF9Gcm9tTG9uZyhzdHJjb2xsKHMxLHMyKSk7Cn0KCnN0YXRpYyBjaGFyIHN0cnhmcm1fX2RvY19fW109CiJzdHJpbmcgLT4gc3RyaW5nLiBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgYmVoYXZlcyBmb3IgY21wIGxvY2FsZS1hd2FyZS4iCjsKCnN0YXRpYyBQeU9iamVjdCoKUHlMb2NhbGVfc3RyeGZybShzZWxmLGFyZ3MpCiAgUHlPYmplY3QqIHNlbGY7CiAgUHlPYmplY3QqIGFyZ3M7CnsKICBjaGFyICpzLCpidWY7CiAgaW50IG4xLG4yOwogIFB5T2JqZWN0ICpyZXN1bHQ7CiAgaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywicyIsJnMpKQogICAgIHJldHVybiBOVUxMOwogIC8qIGFzc3VtZSBubyBjaGFuZ2UgaW4gc2l6ZSwgZmlyc3QgKi8KICBuMT1zdHJsZW4ocykrMTsKICBidWY9UHlfTWFsbG9jKG4xKTsKICBpZighYnVmKXJldHVybiBOVUxMOwogIG4yPXN0cnhmcm0oYnVmLHMsbjEpOwogIGlmKG4yPm4xKXsKICAgIC8qIG1vcmUgc3BhY2UgbmVlZGVkICovCiAgICBidWY9UHlfUmVhbGxvYyhidWYsbjIpOwogICAgaWYoIWJ1ZilyZXR1cm4gTlVMTDsKICAgIHN0cnhmcm0oYnVmLHMsbjIpOwogIH0KICByZXN1bHQ9UHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogIFB5X0ZyZWUoYnVmKTsKICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFB5TG9jYWxlX01ldGhvZHNbXSA9IHsKICB7InNldGxvY2FsZSIsKFB5Q0Z1bmN0aW9uKVB5TG9jYWxlX3NldGxvY2FsZSwxLHNldGxvY2FsZV9fZG9jX199LAogIHsibG9jYWxlY29udiIsKFB5Q0Z1bmN0aW9uKVB5TG9jYWxlX2xvY2FsZWNvbnYsMCxsb2NhbGVjb252X19kb2NfX30sCiAgeyJzdHJjb2xsIiwoUHlDRnVuY3Rpb24pUHlMb2NhbGVfc3RyY29sbCwxLHN0cmNvbGxfX2RvY19ffSwKICB7InN0cnhmcm0iLChQeUNGdW5jdGlvbilQeUxvY2FsZV9zdHJ4ZnJtLDEsc3RyeGZybV9fZG9jX199LAogIHtOVUxMLCBOVUxMfQp9OwoKdm9pZAppbml0X2xvY2FsZSgpCnsKICBQeU9iamVjdCAqbSwqZCwqeDsKICBtPVB5X0luaXRNb2R1bGUoIl9sb2NhbGUiLFB5TG9jYWxlX01ldGhvZHMpOwogIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogIHg9UHlJbnRfRnJvbUxvbmcoTENfQ1RZUEUpOwogIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIkxDX0NUWVBFIix4KTsKICBQeV9YREVDUkVGKHgpOwoKICB4PVB5SW50X0Zyb21Mb25nKExDX1RJTUUpOwogIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIkxDX1RJTUUiLHgpOwogIFB5X1hERUNSRUYoeCk7CgogIHg9UHlJbnRfRnJvbUxvbmcoTENfQ09MTEFURSk7CiAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiTENfQ09MTEFURSIseCk7CiAgUHlfWERFQ1JFRih4KTsKCiAgeD1QeUludF9Gcm9tTG9uZyhMQ19NT05FVEFSWSk7CiAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiTENfTU9ORVRBUlkiLHgpOwogIFB5X1hERUNSRUYoeCk7CgojaWZkZWYgTENfTUVTU0FHRVMKICB4PVB5SW50X0Zyb21Mb25nKExDX01FU1NBR0VTKTsKICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCJMQ19NRVNTQUdFUyIseCk7CiAgUHlfWERFQ1JFRih4KTsKI2VuZGlmIC8qIExDX01FU1NBR0VTICovCgogIHg9UHlJbnRfRnJvbUxvbmcoTENfTlVNRVJJQyk7CiAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiTENfTlVNRVJJQyIseCk7CiAgUHlfWERFQ1JFRih4KTsKCiAgeD1QeUludF9Gcm9tTG9uZyhMQ19BTEwpOwogIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIkxDX0FMTCIseCk7CiAgUHlfWERFQ1JFRih4KTsKCiAgeD1QeUludF9Gcm9tTG9uZyhDSEFSX01BWCk7CiAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiQ0hBUl9NQVgiLHgpOwogIFB5X1hERUNSRUYoeCk7CgogIEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJsb2NhbGUuRXJyb3IiLCBOVUxMLCBOVUxMKTsKICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBFcnJvcik7CgogIHg9UHlTdHJpbmdfRnJvbVN0cmluZyhsb2NhbGVfX2RvY19fKTsKICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCJfX2RvY19fIix4KTsKICBQeV9YREVDUkVGKHgpOwoKICBpZihQeUVycl9PY2N1cnJlZCgpKQogICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBtb2R1bGUgbG9jYWxlIik7Cn0K