LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2RiZy5jLHYgMS40IDIwMDIvMDYvMTkgMjA6MDg6MjIga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlICJmY2ludC5oIgoKdm9pZApGY1ZhbHVlUHJpbnQgKGNvbnN0IEZjVmFsdWUgdikKewogICAgc3dpdGNoICh2LnR5cGUpIHsKICAgIGNhc2UgRmNUeXBlVm9pZDoKCXByaW50ZiAoIiA8dm9pZD4iKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVJbnRlZ2VyOgoJcHJpbnRmICgiICVkIiwgdi51LmkpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZURvdWJsZToKCXByaW50ZiAoIiAlZyIsIHYudS5kKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVTdHJpbmc6CglwcmludGYgKCIgXCIlc1wiIiwgdi51LnMpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUJvb2w6CglwcmludGYgKCIgJXMiLCB2LnUuYiA/ICJGY1RydWUiIDogIkZjRmFsc2UiKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVNYXRyaXg6CglwcmludGYgKCIgKCVmICVmOyAlZiAlZikiLCB2LnUubS0+eHgsIHYudS5tLT54eSwgdi51Lm0tPnl4LCB2LnUubS0+eXkpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUNoYXJTZXQ6CS8qIFhYWCAqLwoJcHJpbnRmICgiIHNldCIpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUZURmFjZToKCXByaW50ZiAoIiBmYWNlIik7CglicmVhazsKICAgIGNhc2UgRmNUeXBlUGF0dGVybjoKCXByaW50ZiAoIiBwYXR0ZXJuIHsiKTsKCUZjUGF0dGVyblByaW50ICh2LnUucCk7CglwcmludGYgKCIgfSAiKTsKCWJyZWFrOwogICAgfQp9Cgp2b2lkCkZjVmFsdWVMaXN0UHJpbnQgKGNvbnN0IEZjVmFsdWVMaXN0ICpsKQp7CiAgICBmb3IgKDsgbDsgbCA9IGwtPm5leHQpCglGY1ZhbHVlUHJpbnQgKGwtPnZhbHVlKTsKfQoKdm9pZApGY1BhdHRlcm5QcmludCAoY29uc3QgRmNQYXR0ZXJuICpwKQp7CiAgICBpbnQJCSAgICBpOwogICAgRmNQYXR0ZXJuRWx0ICAgKmU7CiAgICAKICAgIGlmICghcCkKICAgIHsKCXByaW50ZiAoIk51bGwgcGF0dGVyblxuIik7CglyZXR1cm47CiAgICB9CiAgICBwcmludGYgKCJQYXR0ZXJuICVkIG9mICVkXG4iLCBwLT5udW0sIHAtPnNpemUpOwogICAgZm9yIChpID0gMDsgaSA8IHAtPm51bTsgaSsrKQogICAgewoJZSA9ICZwLT5lbHRzW2ldOwoJcHJpbnRmICgiXHQlczoiLCBlLT5vYmplY3QpOwoJRmNWYWx1ZUxpc3RQcmludCAoZS0+dmFsdWVzKTsKCXByaW50ZiAoIlxuIik7CiAgICB9CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjT3BQcmludCAoRmNPcCBvcCkKewogICAgc3dpdGNoIChvcCkgewogICAgY2FzZSBGY09wSW50ZWdlcjogcHJpbnRmICgiSW50ZWdlciIpOyBicmVhazsKICAgIGNhc2UgRmNPcERvdWJsZTogcHJpbnRmICgiRG91YmxlIik7IGJyZWFrOwogICAgY2FzZSBGY09wU3RyaW5nOiBwcmludGYgKCJTdHJpbmciKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BNYXRyaXg6IHByaW50ZiAoIk1hdHJpeCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEJvb2w6IHByaW50ZiAoIkJvb2wiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BDaGFyU2V0OiBwcmludGYgKCJDaGFyU2V0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wRmllbGQ6IHByaW50ZiAoIkZpZWxkIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ29uc3Q6IHByaW50ZiAoIkNvbnN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wQXNzaWduOiBwcmludGYgKCJBc3NpZ24iKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BBc3NpZ25SZXBsYWNlOiBwcmludGYgKCJBc3NpZ25SZXBsYWNlIik7IGJyZWFrOwogICAgY2FzZSBGY09wUHJlcGVuZDogcHJpbnRmICgiUHJlcGVuZCIpOyBicmVhazsKICAgIGNhc2UgRmNPcFByZXBlbmRGaXJzdDogcHJpbnRmICgiUHJlcGVuZEZpcnN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wQXBwZW5kOiBwcmludGYgKCJBcHBlbmQiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BBcHBlbmRMYXN0OiBwcmludGYgKCJBcHBlbmRMYXN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wUXVlc3Q6IHByaW50ZiAoIlF1ZXN0Iik7IGJyZWFrOwogICAgY2FzZSBGY09wT3I6IHByaW50ZiAoIk9yIik7IGJyZWFrOwogICAgY2FzZSBGY09wQW5kOiBwcmludGYgKCJBbmQiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BFcXVhbDogcHJpbnRmICgiRXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BDb250YWluczogcHJpbnRmICgiQ29udGFpbnMiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOb3RFcXVhbDogcHJpbnRmICgiTm90RXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BMZXNzOiBwcmludGYgKCJMZXNzIik7IGJyZWFrOwogICAgY2FzZSBGY09wTGVzc0VxdWFsOiBwcmludGYgKCJMZXNzRXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BNb3JlOiBwcmludGYgKCJNb3JlIik7IGJyZWFrOwogICAgY2FzZSBGY09wTW9yZUVxdWFsOiBwcmludGYgKCJNb3JlRXF1YWwiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BQbHVzOiBwcmludGYgKCJQbHVzIik7IGJyZWFrOwogICAgY2FzZSBGY09wTWludXM6IHByaW50ZiAoIk1pbnVzIik7IGJyZWFrOwogICAgY2FzZSBGY09wVGltZXM6IHByaW50ZiAoIlRpbWVzIik7IGJyZWFrOwogICAgY2FzZSBGY09wRGl2aWRlOiBwcmludGYgKCJEaXZpZGUiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOb3Q6IHByaW50ZiAoIk5vdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcE5pbDogcHJpbnRmICgiTmlsIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ29tbWE6IHByaW50ZiAoIkNvbW1hIik7IGJyZWFrOwogICAgY2FzZSBGY09wSW52YWxpZDogcHJpbnRmICgiSW52YWxpZCIpOyBicmVhazsKICAgIH0KfQoKdm9pZApGY0V4cHJQcmludCAoY29uc3QgRmNFeHByICpleHByKQp7CiAgICBzd2l0Y2ggKGV4cHItPm9wKSB7CiAgICBjYXNlIEZjT3BJbnRlZ2VyOiBwcmludGYgKCIlZCIsIGV4cHItPnUuaXZhbCk7IGJyZWFrOwogICAgY2FzZSBGY09wRG91YmxlOiBwcmludGYgKCIlZyIsIGV4cHItPnUuZHZhbCk7IGJyZWFrOwogICAgY2FzZSBGY09wU3RyaW5nOiBwcmludGYgKCJcIiVzXCIiLCBleHByLT51LnN2YWwpOyBicmVhazsKICAgIGNhc2UgRmNPcE1hdHJpeDogcHJpbnRmICgiWyVnICVnICVnICVnXSIsCgkJCSAgICAgIGV4cHItPnUubXZhbC0+eHgsCgkJCSAgICAgIGV4cHItPnUubXZhbC0+eHksCgkJCSAgICAgIGV4cHItPnUubXZhbC0+eXgsCgkJCSAgICAgIGV4cHItPnUubXZhbC0+eXkpOyBicmVhazsKICAgIGNhc2UgRmNPcEJvb2w6IHByaW50ZiAoIiVzIiwgZXhwci0+dS5idmFsID8gInRydWUiIDogImZhbHNlIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ2hhclNldDogcHJpbnRmICgiY2hhcnNldFxuIik7IGJyZWFrOwogICAgY2FzZSBGY09wTmlsOiBwcmludGYgKCJuaWxcbiIpOyBicmVhazsKICAgIGNhc2UgRmNPcEZpZWxkOiBwcmludGYgKCIlcyIsIGV4cHItPnUuZmllbGQpOyBicmVhazsKICAgIGNhc2UgRmNPcENvbnN0OiBwcmludGYgKCIlcyIsIGV4cHItPnUuY29uc3RhbnQpOyBicmVhazsKICAgIGNhc2UgRmNPcFF1ZXN0OgoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5sZWZ0KTsKCXByaW50ZiAoIiBxdWVzdCAiKTsKCUZjRXhwclByaW50IChleHByLT51LnRyZWUucmlnaHQtPnUudHJlZS5sZWZ0KTsKCXByaW50ZiAoIiBjb2xvbiAiKTsKCUZjRXhwclByaW50IChleHByLT51LnRyZWUucmlnaHQtPnUudHJlZS5yaWdodCk7CglicmVhazsKICAgIGNhc2UgRmNPcEFzc2lnbjoKICAgIGNhc2UgRmNPcEFzc2lnblJlcGxhY2U6CiAgICBjYXNlIEZjT3BQcmVwZW5kRmlyc3Q6CiAgICBjYXNlIEZjT3BQcmVwZW5kOgogICAgY2FzZSBGY09wQXBwZW5kOgogICAgY2FzZSBGY09wQXBwZW5kTGFzdDoKICAgIGNhc2UgRmNPcE9yOgogICAgY2FzZSBGY09wQW5kOgogICAgY2FzZSBGY09wRXF1YWw6CiAgICBjYXNlIEZjT3BDb250YWluczoKICAgIGNhc2UgRmNPcE5vdEVxdWFsOgogICAgY2FzZSBGY09wTGVzczoKICAgIGNhc2UgRmNPcExlc3NFcXVhbDoKICAgIGNhc2UgRmNPcE1vcmU6CiAgICBjYXNlIEZjT3BNb3JlRXF1YWw6CiAgICBjYXNlIEZjT3BQbHVzOgogICAgY2FzZSBGY09wTWludXM6CiAgICBjYXNlIEZjT3BUaW1lczoKICAgIGNhc2UgRmNPcERpdmlkZToKICAgIGNhc2UgRmNPcENvbW1hOgoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5sZWZ0KTsKCXByaW50ZiAoIiAiKTsKCXN3aXRjaCAoZXhwci0+b3ApIHsKCWNhc2UgRmNPcEFzc2lnbjogcHJpbnRmICgiQXNzaWduIik7IGJyZWFrOwoJY2FzZSBGY09wQXNzaWduUmVwbGFjZTogcHJpbnRmICgiQXNzaWduUmVwbGFjZSIpOyBicmVhazsKCWNhc2UgRmNPcFByZXBlbmRGaXJzdDogcHJpbnRmICgiUHJlcGVuZEZpcnN0Iik7IGJyZWFrOwoJY2FzZSBGY09wUHJlcGVuZDogcHJpbnRmICgiUHJlcGVuZCIpOyBicmVhazsKCWNhc2UgRmNPcEFwcGVuZDogcHJpbnRmICgiQXBwZW5kIik7IGJyZWFrOwoJY2FzZSBGY09wQXBwZW5kTGFzdDogcHJpbnRmICgiQXBwZW5kTGFzdCIpOyBicmVhazsKCWNhc2UgRmNPcE9yOiBwcmludGYgKCJPciIpOyBicmVhazsKCWNhc2UgRmNPcEFuZDogcHJpbnRmICgiQW5kIik7IGJyZWFrOwoJY2FzZSBGY09wRXF1YWw6IHByaW50ZiAoIkVxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wQ29udGFpbnM6IHByaW50ZiAoIkNvbnRhaW5zIik7IGJyZWFrOwoJY2FzZSBGY09wTm90RXF1YWw6IHByaW50ZiAoIk5vdEVxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wTGVzczogcHJpbnRmICgiTGVzcyIpOyBicmVhazsKCWNhc2UgRmNPcExlc3NFcXVhbDogcHJpbnRmICgiTGVzc0VxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wTW9yZTogcHJpbnRmICgiTW9yZSIpOyBicmVhazsKCWNhc2UgRmNPcE1vcmVFcXVhbDogcHJpbnRmICgiTW9yZUVxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wUGx1czogcHJpbnRmICgiUGx1cyIpOyBicmVhazsKCWNhc2UgRmNPcE1pbnVzOiBwcmludGYgKCJNaW51cyIpOyBicmVhazsKCWNhc2UgRmNPcFRpbWVzOiBwcmludGYgKCJUaW1lcyIpOyBicmVhazsKCWNhc2UgRmNPcERpdmlkZTogcHJpbnRmICgiRGl2aWRlIik7IGJyZWFrOwoJY2FzZSBGY09wQ29tbWE6IHByaW50ZiAoIkNvbW1hIik7IGJyZWFrOwoJZGVmYXVsdDogYnJlYWs7Cgl9CglwcmludGYgKCIgIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLnJpZ2h0KTsKCWJyZWFrOwogICAgY2FzZSBGY09wTm90OgoJcHJpbnRmICgiTm90ICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5sZWZ0KTsKCWJyZWFrOwogICAgY2FzZSBGY09wSW52YWxpZDogcHJpbnRmICgiSW52YWxpZCIpOyBicmVhazsKICAgIH0KfQoKdm9pZApGY1Rlc3RQcmludCAoY29uc3QgRmNUZXN0ICp0ZXN0KQp7CiAgICBzd2l0Y2ggKHRlc3QtPmtpbmQpIHsKICAgIGNhc2UgRmNNYXRjaFBhdHRlcm46CglwcmludGYgKCJwYXR0ZXJuICIpOwoJYnJlYWs7CiAgICBjYXNlIEZjTWF0Y2hGb250OgoJcHJpbnRmICgiZm9udCAiKTsKCWJyZWFrOwogICAgfQogICAgc3dpdGNoICh0ZXN0LT5xdWFsKSB7CiAgICBjYXNlIEZjUXVhbEFueToKCXByaW50ZiAoImFueSAiKTsKCWJyZWFrOwogICAgY2FzZSBGY1F1YWxBbGw6CglwcmludGYgKCJhbGwgIik7CglicmVhazsKICAgIGNhc2UgRmNRdWFsRmlyc3Q6CglwcmludGYgKCJmaXJzdCAiKTsKCWJyZWFrOwogICAgY2FzZSBGY1F1YWxOb3RGaXJzdDoKCXByaW50ZiAoIm5vdF9maXJzdCAiKTsKCWJyZWFrOwogICAgfQogICAgcHJpbnRmICgiJXMgIiwgdGVzdC0+ZmllbGQpOwogICAgRmNPcFByaW50ICh0ZXN0LT5vcCk7CiAgICBwcmludGYgKCIgIik7CiAgICBGY0V4cHJQcmludCAodGVzdC0+ZXhwcik7CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjRWRpdFByaW50IChjb25zdCBGY0VkaXQgKmVkaXQpCnsKICAgIHByaW50ZiAoIkVkaXQgJXMgIiwgZWRpdC0+ZmllbGQpOwogICAgRmNPcFByaW50IChlZGl0LT5vcCk7CiAgICBwcmludGYgKCIgIik7CiAgICBGY0V4cHJQcmludCAoZWRpdC0+ZXhwcik7Cn0KCnZvaWQKRmNTdWJzdFByaW50IChjb25zdCBGY1N1YnN0ICpzdWJzdCkKewogICAgRmNFZGl0CSplOwogICAgRmNUZXN0CSp0OwogICAgCiAgICBwcmludGYgKCJtYXRjaFxuIik7CiAgICBmb3IgKHQgPSBzdWJzdC0+dGVzdDsgdDsgdCA9IHQtPm5leHQpCiAgICB7CglwcmludGYgKCJcdCIpOwoJRmNUZXN0UHJpbnQgKHQpOwogICAgfQogICAgcHJpbnRmICgiZWRpdFxuIik7CiAgICBmb3IgKGUgPSBzdWJzdC0+ZWRpdDsgZTsgZSA9IGUtPm5leHQpCiAgICB7CglwcmludGYgKCJcdCIpOwoJRmNFZGl0UHJpbnQgKGUpOwoJcHJpbnRmICgiO1xuIik7CiAgICB9CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjRm9udFNldFByaW50IChjb25zdCBGY0ZvbnRTZXQgKnMpCnsKICAgIGludAkgICAgaTsKCiAgICBwcmludGYgKCJGb250U2V0ICVkIG9mICVkXG4iLCBzLT5uZm9udCwgcy0+c2ZvbnQpOwogICAgZm9yIChpID0gMDsgaSA8IHMtPm5mb250OyBpKyspCiAgICB7CglwcmludGYgKCJGb250ICVkICIsIGkpOwoJRmNQYXR0ZXJuUHJpbnQgKHMtPmZvbnRzW2ldKTsKICAgIH0KfQoKaW50CkZjRGVidWcgKHZvaWQpCnsKICAgIHN0YXRpYyBpbnQgIGluaXRpYWxpemVkOwogICAgc3RhdGljIGludCAgZGVidWc7CgogICAgaWYgKCFpbml0aWFsaXplZCkKICAgIHsKCWNoYXIgICAgKmU7CgoJaW5pdGlhbGl6ZWQgPSAxOwoJZSA9IGdldGVudiAoIkZDX0RFQlVHIik7CglpZiAoZSkKCXsKCSAgICBwcmludGYgKCJGQ19ERUJVRz0lc1xuIiwgZSk7CgkgICAgZGVidWcgPSBhdG9pIChlKTsKCSAgICBpZiAoZGVidWcgPCAwKQoJCWRlYnVnID0gMDsKCX0KICAgIH0KICAgIHJldHVybiBkZWJ1ZzsKfQo=