LyogY2FjaGUgLmMgLSBhIExSVSBjYWNoZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAiY2FjaGUuaCIKI2luY2x1ZGUgPGxpbWl0cy5oPgoKLyogb25seSB1c2VkIGludGVybmFsbHkgKi8KcHlzcWxpdGVfTm9kZSogcHlzcWxpdGVfbmV3X25vZGUoUHlPYmplY3QqIGtleSwgUHlPYmplY3QqIGRhdGEpCnsKICAgIHB5c3FsaXRlX05vZGUqIG5vZGU7CgogICAgbm9kZSA9IChweXNxbGl0ZV9Ob2RlKikgKHB5c3FsaXRlX05vZGVUeXBlLnRwX2FsbG9jKCZweXNxbGl0ZV9Ob2RlVHlwZSwgMCkpOwogICAgaWYgKCFub2RlKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgUHlfSU5DUkVGKGtleSk7CiAgICBub2RlLT5rZXkgPSBrZXk7CgogICAgUHlfSU5DUkVGKGRhdGEpOwogICAgbm9kZS0+ZGF0YSA9IGRhdGE7CgogICAgbm9kZS0+cHJldiA9IE5VTEw7CiAgICBub2RlLT5uZXh0ID0gTlVMTDsKCiAgICByZXR1cm4gbm9kZTsKfQoKdm9pZCBweXNxbGl0ZV9ub2RlX2RlYWxsb2MocHlzcWxpdGVfTm9kZSogc2VsZikKewogICAgUHlfREVDUkVGKHNlbGYtPmtleSk7CiAgICBQeV9ERUNSRUYoc2VsZi0+ZGF0YSk7CgogICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOwp9CgppbnQgcHlzcWxpdGVfY2FjaGVfaW5pdChweXNxbGl0ZV9DYWNoZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5T2JqZWN0KiBmYWN0b3J5OwogICAgaW50IHNpemUgPSAxMDsKCiAgICBzZWxmLT5mYWN0b3J5ID0gTlVMTDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aSIsICZmYWN0b3J5LCAmc2l6ZSkpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogbWluaW11bSBjYWNoZSBzaXplIGlzIDUgZW50cmllcyAqLwogICAgaWYgKHNpemUgPCA1KSB7CiAgICAgICAgc2l6ZSA9IDU7CiAgICB9CiAgICBzZWxmLT5zaXplID0gc2l6ZTsKICAgIHNlbGYtPmZpcnN0ID0gTlVMTDsKICAgIHNlbGYtPmxhc3QgPSBOVUxMOwoKICAgIHNlbGYtPm1hcHBpbmcgPSBQeURpY3RfTmV3KCk7CiAgICBpZiAoIXNlbGYtPm1hcHBpbmcpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgUHlfSU5DUkVGKGZhY3RvcnkpOwogICAgc2VsZi0+ZmFjdG9yeSA9IGZhY3Rvcnk7CgogICAgc2VsZi0+ZGVjcmVmX2ZhY3RvcnkgPSAxOwoKICAgIHJldHVybiAwOwp9Cgp2b2lkIHB5c3FsaXRlX2NhY2hlX2RlYWxsb2MocHlzcWxpdGVfQ2FjaGUqIHNlbGYpCnsKICAgIHB5c3FsaXRlX05vZGUqIG5vZGU7CiAgICBweXNxbGl0ZV9Ob2RlKiBkZWxldGVfbm9kZTsKCiAgICBpZiAoIXNlbGYtPmZhY3RvcnkpIHsKICAgICAgICAvKiBjb25zdHJ1Y3RvciBmYWlsZWQsIGp1c3QgZ2V0IG91dCBvZiBoZXJlICovCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIGl0ZXJhdGUgb3ZlciBhbGwgbm9kZXMgYW5kIGRlYWxsb2NhdGUgdGhlbSAqLwogICAgbm9kZSA9IHNlbGYtPmZpcnN0OwogICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICBkZWxldGVfbm9kZSA9IG5vZGU7CiAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CiAgICAgICAgUHlfREVDUkVGKGRlbGV0ZV9ub2RlKTsKICAgIH0KCiAgICBpZiAoc2VsZi0+ZGVjcmVmX2ZhY3RvcnkpIHsKICAgICAgICBQeV9ERUNSRUYoc2VsZi0+ZmFjdG9yeSk7CiAgICB9CiAgICBQeV9ERUNSRUYoc2VsZi0+bWFwcGluZyk7CgogICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOwp9CgpQeU9iamVjdCogcHlzcWxpdGVfY2FjaGVfZ2V0KHB5c3FsaXRlX0NhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIGtleSA9IGFyZ3M7CiAgICBweXNxbGl0ZV9Ob2RlKiBub2RlOwogICAgcHlzcWxpdGVfTm9kZSogcHRyOwogICAgUHlPYmplY3QqIGRhdGE7CgogICAgbm9kZSA9IChweXNxbGl0ZV9Ob2RlKilQeURpY3RfR2V0SXRlbShzZWxmLT5tYXBwaW5nLCBrZXkpOwogICAgaWYgKG5vZGUpIHsKICAgICAgICAvKiBhbiBlbnRyeSBmb3IgdGhpcyBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNhY2hlICovCgogICAgICAgIC8qIGluY3JlYXNlIHVzYWdlIGNvdW50ZXIgb2YgdGhlIG5vZGUgZm91bmQgKi8KICAgICAgICBpZiAobm9kZS0+Y291bnQgPCBMT05HX01BWCkgewogICAgICAgICAgICBub2RlLT5jb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgLyogaWYgbmVjZXNzYXJ5LCByZW9yZGVyIGVudHJpZXMgaW4gdGhlIGNhY2hlIGJ5IHN3YXBwaW5nIHBvc2l0aW9ucyAqLwogICAgICAgIGlmIChub2RlLT5wcmV2ICYmIG5vZGUtPmNvdW50ID4gbm9kZS0+cHJldi0+Y291bnQpIHsKICAgICAgICAgICAgcHRyID0gbm9kZS0+cHJldjsKCiAgICAgICAgICAgIHdoaWxlIChwdHItPnByZXYgJiYgbm9kZS0+Y291bnQgPiBwdHItPnByZXYtPmNvdW50KSB7CiAgICAgICAgICAgICAgICBwdHIgPSBwdHItPnByZXY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChub2RlLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBub2RlLT5uZXh0LT5wcmV2ID0gbm9kZS0+cHJldjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNlbGYtPmxhc3QgPSBub2RlLT5wcmV2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChub2RlLT5wcmV2KSB7CiAgICAgICAgICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHRyLT5wcmV2KSB7CiAgICAgICAgICAgICAgICBwdHItPnByZXYtPm5leHQgPSBub2RlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBub2RlLT5uZXh0ID0gcHRyOwogICAgICAgICAgICBub2RlLT5wcmV2ID0gcHRyLT5wcmV2OwogICAgICAgICAgICBpZiAoIW5vZGUtPnByZXYpIHsKICAgICAgICAgICAgICAgIHNlbGYtPmZpcnN0ID0gbm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdHItPnByZXYgPSBub2RlOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyogVGhlcmUgaXMgbm8gZW50cnkgZm9yIHRoaXMga2V5IGluIHRoZSBjYWNoZSwgeWV0LiBXZSdsbCBpbnNlcnQgYSBuZXcKICAgICAgICAgKiBlbnRyeSBpbiB0aGUgY2FjaGUsIGFuZCBtYWtlIHNwYWNlIGlmIG5lY2Vzc2FyeSBieSB0aHJvd2luZyB0aGUKICAgICAgICAgKiBsZWFzdCB1c2VkIGl0ZW0gb3V0IG9mIHRoZSBjYWNoZS4gKi8KCiAgICAgICAgaWYgKFB5RGljdF9TaXplKHNlbGYtPm1hcHBpbmcpID09IHNlbGYtPnNpemUpIHsKICAgICAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLT5sYXN0OwoKICAgICAgICAgICAgICAgIGlmIChQeURpY3RfRGVsSXRlbShzZWxmLT5tYXBwaW5nLCBzZWxmLT5sYXN0LT5rZXkpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9kZS0+cHJldikgewogICAgICAgICAgICAgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZi0+bGFzdCA9IG5vZGUtPnByZXY7CiAgICAgICAgICAgICAgICBub2RlLT5wcmV2ID0gTlVMTDsKCiAgICAgICAgICAgICAgICBQeV9ERUNSRUYobm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRhdGEgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+ZmFjdG9yeSwgIk8iLCBrZXkpOwoKICAgICAgICBpZiAoIWRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQoKICAgICAgICBub2RlID0gcHlzcWxpdGVfbmV3X25vZGUoa2V5LCBkYXRhKTsKICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIG5vZGUtPnByZXYgPSBzZWxmLT5sYXN0OwoKICAgICAgICBQeV9ERUNSRUYoZGF0YSk7CgogICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5tYXBwaW5nLCBrZXksIChQeU9iamVjdCopbm9kZSkgIT0gMCkgewogICAgICAgICAgICBQeV9ERUNSRUYobm9kZSk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsKICAgICAgICAgICAgc2VsZi0+bGFzdC0+bmV4dCA9IG5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOwogICAgICAgIH0KICAgICAgICBzZWxmLT5sYXN0ID0gbm9kZTsKICAgIH0KCiAgICBQeV9JTkNSRUYobm9kZS0+ZGF0YSk7CiAgICByZXR1cm4gbm9kZS0+ZGF0YTsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2NhY2hlX2Rpc3BsYXkocHlzcWxpdGVfQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBweXNxbGl0ZV9Ob2RlKiBwdHI7CiAgICBQeU9iamVjdCogcHJldmtleTsKICAgIFB5T2JqZWN0KiBuZXh0a2V5OwogICAgUHlPYmplY3QqIGZtdF9hcmdzOwogICAgUHlPYmplY3QqIHRlbXBsYXRlOwogICAgUHlPYmplY3QqIGRpc3BsYXlfc3RyOwoKICAgIHB0ciA9IHNlbGYtPmZpcnN0OwoKICAgIHdoaWxlIChwdHIpIHsKICAgICAgICBpZiAocHRyLT5wcmV2KSB7CiAgICAgICAgICAgIHByZXZrZXkgPSBwdHItPnByZXYtPmtleTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmV2a2V5ID0gUHlfTm9uZTsKICAgICAgICB9CiAgICAgICAgUHlfSU5DUkVGKHByZXZrZXkpOwoKICAgICAgICBpZiAocHRyLT5uZXh0KSB7CiAgICAgICAgICAgIG5leHRrZXkgPSBwdHItPm5leHQtPmtleTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXh0a2V5ID0gUHlfTm9uZTsKICAgICAgICB9CiAgICAgICAgUHlfSU5DUkVGKG5leHRrZXkpOwoKICAgICAgICBmbXRfYXJncyA9IFB5X0J1aWxkVmFsdWUoIk9PTyIsIHByZXZrZXksIHB0ci0+a2V5LCBuZXh0a2V5KTsKICAgICAgICBpZiAoIWZtdF9hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCIlcyA8LSAlcyAtPiVzXG4iKTsKICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihmbXRfYXJncyk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBkaXNwbGF5X3N0ciA9IFB5VW5pY29kZV9Gb3JtYXQodGVtcGxhdGUsIGZtdF9hcmdzKTsKICAgICAgICBQeV9ERUNSRUYodGVtcGxhdGUpOwogICAgICAgIFB5X0RFQ1JFRihmbXRfYXJncyk7CiAgICAgICAgaWYgKCFkaXNwbGF5X3N0cikgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgUHlPYmplY3RfUHJpbnQoZGlzcGxheV9zdHIsIHN0ZG91dCwgUHlfUFJJTlRfUkFXKTsKICAgICAgICBQeV9ERUNSRUYoZGlzcGxheV9zdHIpOwoKICAgICAgICBQeV9ERUNSRUYocHJldmtleSk7CiAgICAgICAgUHlfREVDUkVGKG5leHRrZXkpOwoKICAgICAgICBwdHIgPSBwdHItPm5leHQ7CiAgICB9CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KCnN0YXRpYyBQeU1ldGhvZERlZiBjYWNoZV9tZXRob2RzW10gPSB7CiAgICB7ImdldCIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jYWNoZV9nZXQsIE1FVEhfTywKICAgICAgICBQeURvY19TVFIoIkdldHMgYW4gZW50cnkgZnJvbSB0aGUgY2FjaGUgb3IgY2FsbHMgdGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gcHJvZHVjZSBvbmUuIil9LAogICAgeyJkaXNwbGF5IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2NhY2hlX2Rpc3BsYXksIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiRm9yIGRlYnVnZ2luZyBvbmx5LiIpfSwKICAgIHtOVUxMLCBOVUxMfQp9OwoKUHlUeXBlT2JqZWN0IHB5c3FsaXRlX05vZGVUeXBlID0gewogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgIE1PRFVMRV9OQU1FICJOb2RlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICAgICBzaXplb2YocHlzcWxpdGVfTm9kZSksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX25vZGVfZGVhbGxvYywgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAgICAoaW5pdHByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCn07CgpQeVR5cGVPYmplY3QgcHlzcWxpdGVfQ2FjaGVUeXBlID0gewogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgIE1PRFVMRV9OQU1FICIuQ2FjaGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICAgICBzaXplb2YocHlzcWxpdGVfQ2FjaGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX2NhY2hlX2RlYWxsb2MsICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgICAgY2FjaGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAgICAoaW5pdHByb2MpcHlzcWxpdGVfY2FjaGVfaW5pdCwgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCn07CgpleHRlcm4gaW50IHB5c3FsaXRlX2NhY2hlX3NldHVwX3R5cGVzKHZvaWQpCnsKICAgIGludCByYzsKCiAgICBweXNxbGl0ZV9Ob2RlVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKICAgIHB5c3FsaXRlX0NhY2hlVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKCiAgICByYyA9IFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfTm9kZVR5cGUpOwogICAgaWYgKHJjIDwgMCkgewogICAgICAgIHJldHVybiByYzsKICAgIH0KCiAgICByYyA9IFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfQ2FjaGVUeXBlKTsKICAgIHJldHVybiByYzsKfQo=