LyogY3Vyc29yLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIGN1cnNvciB0eXBlCiAqCiAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICoKICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgogKgogKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAogKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogKi8KCiNpZm5kZWYgUFlTUUxJVEVfQ1VSU09SX0gKI2RlZmluZSBQWVNRTElURV9DVVJTT1JfSAojaW5jbHVkZSAiUHl0aG9uLmgiCgojaW5jbHVkZSAic3RhdGVtZW50LmgiCiNpbmNsdWRlICJjb25uZWN0aW9uLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKCnR5cGVkZWYgc3RydWN0CnsKICAgIFB5T2JqZWN0X0hFQUQKICAgIHB5c3FsaXRlX0Nvbm5lY3Rpb24qIGNvbm5lY3Rpb247CiAgICBQeU9iamVjdCogZGVzY3JpcHRpb247CiAgICBQeU9iamVjdCogcm93X2Nhc3RfbWFwOwogICAgaW50IGFycmF5c2l6ZTsKICAgIFB5T2JqZWN0KiBsYXN0cm93aWQ7CiAgICBsb25nIHJvd2NvdW50OwogICAgUHlPYmplY3QqIHJvd19mYWN0b3J5OwogICAgcHlzcWxpdGVfU3RhdGVtZW50KiBzdGF0ZW1lbnQ7CgogICAgLyogdGhlIG5leHQgcm93IHRvIGJlIHJldHVybmVkLCBOVUxMIGlmIG5vIG5leHQgcm93IGF2YWlsYWJsZSAqLwogICAgUHlPYmplY3QqIG5leHRfcm93Owp9IHB5c3FsaXRlX0N1cnNvcjsKCnR5cGVkZWYgZW51bSB7CiAgICBTVEFURU1FTlRfSU5WQUxJRCwgU1RBVEVNRU5UX0lOU0VSVCwgU1RBVEVNRU5UX0RFTEVURSwKICAgIFNUQVRFTUVOVF9VUERBVEUsIFNUQVRFTUVOVF9SRVBMQUNFLCBTVEFURU1FTlRfU0VMRUNULAogICAgU1RBVEVNRU5UX09USEVSCn0gcHlzcWxpdGVfU3RhdGVtZW50S2luZDsKCmV4dGVybiBQeVR5cGVPYmplY3QgcHlzcWxpdGVfQ3Vyc29yVHlwZTsKCmludCBweXNxbGl0ZV9jdXJzb3JfaW5pdChweXNxbGl0ZV9DdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKdm9pZCBweXNxbGl0ZV9jdXJzb3JfZGVhbGxvYyhweXNxbGl0ZV9DdXJzb3IqIHNlbGYpOwpQeU9iamVjdCogcHlzcWxpdGVfY3Vyc29yX2V4ZWN1dGUocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7ClB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfZXhlY3V0ZW1hbnkocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7ClB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfZ2V0aXRlcihweXNxbGl0ZV9DdXJzb3IgKnNlbGYpOwpQeU9iamVjdCogcHlzcWxpdGVfY3Vyc29yX2l0ZXJuZXh0KHB5c3FsaXRlX0N1cnNvciAqc2VsZik7ClB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfZmV0Y2hvbmUocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7ClB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfZmV0Y2htYW55KHB5c3FsaXRlX0N1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOwpQeU9iamVjdCogcHlzcWxpdGVfY3Vyc29yX2ZldGNoYWxsKHB5c3FsaXRlX0N1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwpQeU9iamVjdCogcHlzcWxpdGVfbm9vcChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncyk7ClB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfY2xvc2UocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CgppbnQgcHlzcWxpdGVfY3Vyc29yX3NldHVwX3R5cGVzKHZvaWQpOwoKI2RlZmluZSBVTktOT1dOICgtMSkKI2VuZGlmCg==