LyoKICogSVAgY29uZmlndXJhdGlvbiB1dGlsaXR5CiAqCiAqIENvcHlyaWdodCAyMDEwIKN1a2FzeiBXb2puabNvd2ljegogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiaXBjb25maWcuaCIKCkxBTkdVQUdFIExBTkdfUE9MSVNILCBTVUJMQU5HX0RFRkFVTFQKClNUUklOR1RBQkxFCnsKICAgIFNUUklOR19VU0FHRSwgIlNwb3PzYiB1v3ljaWE6IGlwY29uZmlnIFsgLz8gfCAvYWxsIF1cbiIKICAgIFNUUklOR19JTlZBTElEX0NNRExJTkUsICJCs7lkOiBOaWVyb3pwb3puYW55IGx1YiBuaWVwZbNueSB3aWVyc3ogcG9sZWNlbmlhXG4iCiAgICBTVFJJTkdfQURBUFRFUl9GUklFTkRMWSwgIiVzIGthcnRhICVzXG4iCiAgICBTVFJJTkdfRVRIRVJORVQsICJFdGhlcm5ldCIKICAgIFNUUklOR19VTktOT1dOLCAiTmllem5hbmUiCiAgICBTVFJJTkdfQ09OTl9ETlNfU1VGRklYLCAiU3VmaWtzIEROUyBrb25rcmV0bmVnbyBwb7O5Y3plbmlhIgogICAgU1RSSU5HX0lQX0FERFJFU1MsICJBZHJlcyBJUCIKICAgIFNUUklOR19IT1NUTkFNRSwgIk5hendhIGhvc3RhIgogICAgU1RSSU5HX05PREVfVFlQRSwgIlR5cCB36nqzYSIKICAgIFNUUklOR19CUk9BRENBU1QsICJOYWRhd2NhIgogICAgU1RSSU5HX1BFRVJfVE9fUEVFUiwgIlBlZXItdG8tcGVlciIKICAgIFNUUklOR19NSVhFRCwgIk1pZXN6YW5lIgogICAgU1RSSU5HX0hZQlJJRCwgIkh5YnJ5ZG93ZSIKICAgIFNUUklOR19JUF9ST1VUSU5HLCAiUHJ6ZWtpZXJvd3l3YW5pZSBJUCB3s7ljem9uZSIKICAgIFNUUklOR19ERVNDUklQVElPTiwgIk9waXMiCiAgICBTVFJJTkdfUEhZU19BRERSLCAiQWRyZXMgZml6eWN6bnkiCiAgICBTVFJJTkdfREhDUF9FTkFCTEVELCAiREhDUCB3s7ljem9uZSIKICAgIFNUUklOR19ZRVMsICJUYWsiCiAgICBTVFJJTkdfTk8sICJOaWUiCiAgICBTVFJJTkdfREVGQVVMVF9HQVRFV0FZLCAiQnJhbWEgZG9teZxsbmEiCn0K