LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2RiZy5jLHYgMS40IDIwMDIvMDYvMTkgMjA6MDg6MjIga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlICJmY2ludC5oIgoKdm9pZApGY1ZhbHVlUHJpbnQgKEZjVmFsdWUgdikKewogICAgc3dpdGNoICh2LnR5cGUpIHsKICAgIGNhc2UgRmNUeXBlVm9pZDoKCXByaW50ZiAoIiA8dm9pZD4iKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVJbnRlZ2VyOgoJcHJpbnRmICgiICVkIiwgdi51LmkpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZURvdWJsZToKCXByaW50ZiAoIiAlZyIsIHYudS5kKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVTdHJpbmc6CglwcmludGYgKCIgXCIlc1wiIiwgdi51LnMpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUJvb2w6CglwcmludGYgKCIgJXMiLCB2LnUuYiA/ICJGY1RydWUiIDogIkZjRmFsc2UiKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVNYXRyaXg6CglwcmludGYgKCIgKCVmICVmOyAlZiAlZikiLCB2LnUubS0+eHgsIHYudS5tLT54eSwgdi51Lm0tPnl4LCB2LnUubS0+eXkpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUNoYXJTZXQ6CS8qIFhYWCAqLwoJcHJpbnRmICgiIHNldCIpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUZURmFjZToKCXByaW50ZiAoIiBmYWNlIik7CglicmVhazsKICAgIH0KfQoKdm9pZApGY1ZhbHVlTGlzdFByaW50IChGY1ZhbHVlTGlzdCAqbCkKewogICAgZm9yICg7IGw7IGwgPSBsLT5uZXh0KQoJRmNWYWx1ZVByaW50IChsLT52YWx1ZSk7Cn0KCnZvaWQKRmNQYXR0ZXJuUHJpbnQgKEZjUGF0dGVybiAqcCkKewogICAgaW50CQkgICAgaTsKICAgIEZjUGF0dGVybkVsdCAgICplOwogICAgCiAgICBpZiAoIXApCiAgICB7CglwcmludGYgKCJOdWxsIHBhdHRlcm5cbiIpOwoJcmV0dXJuOwogICAgfQogICAgcHJpbnRmICgiUGF0dGVybiAlZCBvZiAlZFxuIiwgcC0+bnVtLCBwLT5zaXplKTsKICAgIGZvciAoaSA9IDA7IGkgPCBwLT5udW07IGkrKykKICAgIHsKCWUgPSAmcC0+ZWx0c1tpXTsKCXByaW50ZiAoIlx0JXM6IiwgZS0+b2JqZWN0KTsKCUZjVmFsdWVMaXN0UHJpbnQgKGUtPnZhbHVlcyk7CglwcmludGYgKCJcbiIpOwogICAgfQogICAgcHJpbnRmICgiXG4iKTsKfQoKdm9pZApGY09wUHJpbnQgKEZjT3Agb3ApCnsKICAgIHN3aXRjaCAob3ApIHsKICAgIGNhc2UgRmNPcEludGVnZXI6IHByaW50ZiAoIkludGVnZXIiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BEb3VibGU6IHByaW50ZiAoIkRvdWJsZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcFN0cmluZzogcHJpbnRmICgiU3RyaW5nIik7IGJyZWFrOwogICAgY2FzZSBGY09wTWF0cml4OiBwcmludGYgKCJNYXRyaXgiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BCb29sOiBwcmludGYgKCJCb29sIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ2hhclNldDogcHJpbnRmICgiQ2hhclNldCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEZpZWxkOiBwcmludGYgKCJGaWVsZCIpOyBicmVhazsKICAgIGNhc2UgRmNPcENvbnN0OiBwcmludGYgKCJDb25zdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEFzc2lnbjogcHJpbnRmICgiQXNzaWduIik7IGJyZWFrOwogICAgY2FzZSBGY09wQXNzaWduUmVwbGFjZTogcHJpbnRmICgiQXNzaWduUmVwbGFjZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcFByZXBlbmQ6IHByaW50ZiAoIlByZXBlbmQiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BQcmVwZW5kRmlyc3Q6IHByaW50ZiAoIlByZXBlbmRGaXJzdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEFwcGVuZDogcHJpbnRmICgiQXBwZW5kIik7IGJyZWFrOwogICAgY2FzZSBGY09wQXBwZW5kTGFzdDogcHJpbnRmICgiQXBwZW5kTGFzdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcFF1ZXN0OiBwcmludGYgKCJRdWVzdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcE9yOiBwcmludGYgKCJPciIpOyBicmVhazsKICAgIGNhc2UgRmNPcEFuZDogcHJpbnRmICgiQW5kIik7IGJyZWFrOwogICAgY2FzZSBGY09wRXF1YWw6IHByaW50ZiAoIkVxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ29udGFpbnM6IHByaW50ZiAoIkNvbnRhaW5zIik7IGJyZWFrOwogICAgY2FzZSBGY09wTm90RXF1YWw6IHByaW50ZiAoIk5vdEVxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wTGVzczogcHJpbnRmICgiTGVzcyIpOyBicmVhazsKICAgIGNhc2UgRmNPcExlc3NFcXVhbDogcHJpbnRmICgiTGVzc0VxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wTW9yZTogcHJpbnRmICgiTW9yZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcE1vcmVFcXVhbDogcHJpbnRmICgiTW9yZUVxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wUGx1czogcHJpbnRmICgiUGx1cyIpOyBicmVhazsKICAgIGNhc2UgRmNPcE1pbnVzOiBwcmludGYgKCJNaW51cyIpOyBicmVhazsKICAgIGNhc2UgRmNPcFRpbWVzOiBwcmludGYgKCJUaW1lcyIpOyBicmVhazsKICAgIGNhc2UgRmNPcERpdmlkZTogcHJpbnRmICgiRGl2aWRlIik7IGJyZWFrOwogICAgY2FzZSBGY09wTm90OiBwcmludGYgKCJOb3QiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOaWw6IHByaW50ZiAoIk5pbCIpOyBicmVhazsKICAgIGNhc2UgRmNPcENvbW1hOiBwcmludGYgKCJDb21tYSIpOyBicmVhazsKICAgIGNhc2UgRmNPcEludmFsaWQ6IHByaW50ZiAoIkludmFsaWQiKTsgYnJlYWs7CiAgICB9Cn0KCnZvaWQKRmNFeHByUHJpbnQgKEZjRXhwciAqZXhwcikKewogICAgc3dpdGNoIChleHByLT5vcCkgewogICAgY2FzZSBGY09wSW50ZWdlcjogcHJpbnRmICgiJWQiLCBleHByLT51Lml2YWwpOyBicmVhazsKICAgIGNhc2UgRmNPcERvdWJsZTogcHJpbnRmICgiJWciLCBleHByLT51LmR2YWwpOyBicmVhazsKICAgIGNhc2UgRmNPcFN0cmluZzogcHJpbnRmICgiXCIlc1wiIiwgZXhwci0+dS5zdmFsKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BNYXRyaXg6IHByaW50ZiAoIlslZyAlZyAlZyAlZ10iLAoJCQkgICAgICBleHByLT51Lm12YWwtPnh4LAoJCQkgICAgICBleHByLT51Lm12YWwtPnh5LAoJCQkgICAgICBleHByLT51Lm12YWwtPnl4LAoJCQkgICAgICBleHByLT51Lm12YWwtPnl5KTsgYnJlYWs7CiAgICBjYXNlIEZjT3BCb29sOiBwcmludGYgKCIlcyIsIGV4cHItPnUuYnZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcENoYXJTZXQ6IHByaW50ZiAoImNoYXJzZXRcbiIpOyBicmVhazsKICAgIGNhc2UgRmNPcE5pbDogcHJpbnRmICgibmlsXG4iKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BGaWVsZDogcHJpbnRmICgiJXMiLCBleHByLT51LmZpZWxkKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BDb25zdDogcHJpbnRmICgiJXMiLCBleHByLT51LmNvbnN0YW50KTsgYnJlYWs7CiAgICBjYXNlIEZjT3BRdWVzdDoKCUZjRXhwclByaW50IChleHByLT51LnRyZWUubGVmdCk7CglwcmludGYgKCIgcXVlc3QgIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLnJpZ2h0LT51LnRyZWUubGVmdCk7CglwcmludGYgKCIgY29sb24gIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLnJpZ2h0LT51LnRyZWUucmlnaHQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BBc3NpZ246CiAgICBjYXNlIEZjT3BBc3NpZ25SZXBsYWNlOgogICAgY2FzZSBGY09wUHJlcGVuZEZpcnN0OgogICAgY2FzZSBGY09wUHJlcGVuZDoKICAgIGNhc2UgRmNPcEFwcGVuZDoKICAgIGNhc2UgRmNPcEFwcGVuZExhc3Q6CiAgICBjYXNlIEZjT3BPcjoKICAgIGNhc2UgRmNPcEFuZDoKICAgIGNhc2UgRmNPcEVxdWFsOgogICAgY2FzZSBGY09wQ29udGFpbnM6CiAgICBjYXNlIEZjT3BOb3RFcXVhbDoKICAgIGNhc2UgRmNPcExlc3M6CiAgICBjYXNlIEZjT3BMZXNzRXF1YWw6CiAgICBjYXNlIEZjT3BNb3JlOgogICAgY2FzZSBGY09wTW9yZUVxdWFsOgogICAgY2FzZSBGY09wUGx1czoKICAgIGNhc2UgRmNPcE1pbnVzOgogICAgY2FzZSBGY09wVGltZXM6CiAgICBjYXNlIEZjT3BEaXZpZGU6CiAgICBjYXNlIEZjT3BDb21tYToKCUZjRXhwclByaW50IChleHByLT51LnRyZWUubGVmdCk7CglwcmludGYgKCIgIik7Cglzd2l0Y2ggKGV4cHItPm9wKSB7CgljYXNlIEZjT3BBc3NpZ246IHByaW50ZiAoIkFzc2lnbiIpOyBicmVhazsKCWNhc2UgRmNPcEFzc2lnblJlcGxhY2U6IHByaW50ZiAoIkFzc2lnblJlcGxhY2UiKTsgYnJlYWs7CgljYXNlIEZjT3BQcmVwZW5kRmlyc3Q6IHByaW50ZiAoIlByZXBlbmRGaXJzdCIpOyBicmVhazsKCWNhc2UgRmNPcFByZXBlbmQ6IHByaW50ZiAoIlByZXBlbmQiKTsgYnJlYWs7CgljYXNlIEZjT3BBcHBlbmQ6IHByaW50ZiAoIkFwcGVuZCIpOyBicmVhazsKCWNhc2UgRmNPcEFwcGVuZExhc3Q6IHByaW50ZiAoIkFwcGVuZExhc3QiKTsgYnJlYWs7CgljYXNlIEZjT3BPcjogcHJpbnRmICgiT3IiKTsgYnJlYWs7CgljYXNlIEZjT3BBbmQ6IHByaW50ZiAoIkFuZCIpOyBicmVhazsKCWNhc2UgRmNPcEVxdWFsOiBwcmludGYgKCJFcXVhbCIpOyBicmVhazsKCWNhc2UgRmNPcENvbnRhaW5zOiBwcmludGYgKCJDb250YWlucyIpOyBicmVhazsKCWNhc2UgRmNPcE5vdEVxdWFsOiBwcmludGYgKCJOb3RFcXVhbCIpOyBicmVhazsKCWNhc2UgRmNPcExlc3M6IHByaW50ZiAoIkxlc3MiKTsgYnJlYWs7CgljYXNlIEZjT3BMZXNzRXF1YWw6IHByaW50ZiAoIkxlc3NFcXVhbCIpOyBicmVhazsKCWNhc2UgRmNPcE1vcmU6IHByaW50ZiAoIk1vcmUiKTsgYnJlYWs7CgljYXNlIEZjT3BNb3JlRXF1YWw6IHByaW50ZiAoIk1vcmVFcXVhbCIpOyBicmVhazsKCWNhc2UgRmNPcFBsdXM6IHByaW50ZiAoIlBsdXMiKTsgYnJlYWs7CgljYXNlIEZjT3BNaW51czogcHJpbnRmICgiTWludXMiKTsgYnJlYWs7CgljYXNlIEZjT3BUaW1lczogcHJpbnRmICgiVGltZXMiKTsgYnJlYWs7CgljYXNlIEZjT3BEaXZpZGU6IHByaW50ZiAoIkRpdmlkZSIpOyBicmVhazsKCWNhc2UgRmNPcENvbW1hOiBwcmludGYgKCJDb21tYSIpOyBicmVhazsKCWRlZmF1bHQ6IGJyZWFrOwoJfQoJcHJpbnRmICgiICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5yaWdodCk7CglicmVhazsKICAgIGNhc2UgRmNPcE5vdDoKCXByaW50ZiAoIk5vdCAiKTsKCUZjRXhwclByaW50IChleHByLT51LnRyZWUubGVmdCk7CglicmVhazsKICAgIGNhc2UgRmNPcEludmFsaWQ6IHByaW50ZiAoIkludmFsaWQiKTsgYnJlYWs7CiAgICB9Cn0KCnZvaWQKRmNUZXN0UHJpbnQgKEZjVGVzdCAqdGVzdCkKewogICAgc3dpdGNoICh0ZXN0LT5xdWFsKSB7CiAgICBjYXNlIEZjUXVhbEFueToKCXByaW50ZiAoImFueSAiKTsKCWJyZWFrOwogICAgY2FzZSBGY1F1YWxBbGw6CglwcmludGYgKCJhbGwgIik7CglicmVhazsKICAgIGNhc2UgRmNRdWFsRmlyc3Q6CglwcmludGYgKCJmaXJzdCAiKTsKCWJyZWFrOwogICAgY2FzZSBGY1F1YWxOb3RGaXJzdDoKCXByaW50ZiAoIm5vdF9maXJzdCAiKTsKCWJyZWFrOwogICAgfQogICAgcHJpbnRmICgiJXMgIiwgdGVzdC0+ZmllbGQpOwogICAgRmNPcFByaW50ICh0ZXN0LT5vcCk7CiAgICBwcmludGYgKCIgIik7CiAgICBGY0V4cHJQcmludCAodGVzdC0+ZXhwcik7CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjRWRpdFByaW50IChGY0VkaXQgKmVkaXQpCnsKICAgIHByaW50ZiAoIkVkaXQgJXMgIiwgZWRpdC0+ZmllbGQpOwogICAgRmNPcFByaW50IChlZGl0LT5vcCk7CiAgICBwcmludGYgKCIgIik7CiAgICBGY0V4cHJQcmludCAoZWRpdC0+ZXhwcik7Cn0KCnZvaWQKRmNTdWJzdFByaW50IChGY1N1YnN0ICpzdWJzdCkKewogICAgRmNFZGl0CSplOwogICAgRmNUZXN0CSp0OwogICAgCiAgICBwcmludGYgKCJtYXRjaFxuIik7CiAgICBmb3IgKHQgPSBzdWJzdC0+dGVzdDsgdDsgdCA9IHQtPm5leHQpCiAgICB7CglwcmludGYgKCJcdCIpOwoJRmNUZXN0UHJpbnQgKHQpOwogICAgfQogICAgcHJpbnRmICgiZWRpdFxuIik7CiAgICBmb3IgKGUgPSBzdWJzdC0+ZWRpdDsgZTsgZSA9IGUtPm5leHQpCiAgICB7CglwcmludGYgKCJcdCIpOwoJRmNFZGl0UHJpbnQgKGUpOwoJcHJpbnRmICgiO1xuIik7CiAgICB9CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjRm9udFNldFByaW50IChGY0ZvbnRTZXQgKnMpCnsKICAgIGludAkgICAgaTsKCiAgICBwcmludGYgKCJGb250U2V0ICVkIG9mICVkXG4iLCBzLT5uZm9udCwgcy0+c2ZvbnQpOwogICAgZm9yIChpID0gMDsgaSA8IHMtPm5mb250OyBpKyspCiAgICB7CglwcmludGYgKCJGb250ICVkICIsIGkpOwoJRmNQYXR0ZXJuUHJpbnQgKHMtPmZvbnRzW2ldKTsKICAgIH0KfQoKaW50CkZjRGVidWcgKHZvaWQpCnsKICAgIHN0YXRpYyBpbnQgIGluaXRpYWxpemVkOwogICAgc3RhdGljIGludCAgZGVidWc7CgogICAgaWYgKCFpbml0aWFsaXplZCkKICAgIHsKCWNoYXIgICAgKmU7CgoJaW5pdGlhbGl6ZWQgPSAxOwoJZSA9IGdldGVudiAoIkZDX0RFQlVHIik7CglpZiAoZSkKCXsKCSAgICBwcmludGYgKCJGQ19ERUJVRz0lc1xuIiwgZSk7CgkgICAgZGVidWcgPSBhdG9pIChlKTsKCSAgICBpZiAoZGVidWcgPCAwKQoJCWRlYnVnID0gMDsKCX0KICAgIH0KICAgIHJldHVybiBkZWJ1ZzsKfQo=