LyogY2FjaGUgLmMgLSBhIExSVSBjYWNoZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAiY2FjaGUuaCIKI2luY2x1ZGUgPGxpbWl0cy5oPgoKLyogb25seSB1c2VkIGludGVybmFsbHkgKi8KcHlzcWxpdGVfTm9kZSogcHlzcWxpdGVfbmV3X25vZGUoUHlPYmplY3QqIGtleSwgUHlPYmplY3QqIGRhdGEpCnsKICAgIHB5c3FsaXRlX05vZGUqIG5vZGU7CgogICAgbm9kZSA9IChweXNxbGl0ZV9Ob2RlKikgKHB5c3FsaXRlX05vZGVUeXBlLnRwX2FsbG9jKCZweXNxbGl0ZV9Ob2RlVHlwZSwgMCkpOwogICAgaWYgKCFub2RlKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgUHlfSU5DUkVGKGtleSk7CiAgICBub2RlLT5rZXkgPSBrZXk7CgogICAgUHlfSU5DUkVGKGRhdGEpOwogICAgbm9kZS0+ZGF0YSA9IGRhdGE7CgogICAgbm9kZS0+cHJldiA9IE5VTEw7CiAgICBub2RlLT5uZXh0ID0gTlVMTDsKCiAgICByZXR1cm4gbm9kZTsKfQoKdm9pZCBweXNxbGl0ZV9ub2RlX2RlYWxsb2MocHlzcWxpdGVfTm9kZSogc2VsZikKewogICAgUHlfREVDUkVGKHNlbGYtPmtleSk7CiAgICBQeV9ERUNSRUYoc2VsZi0+ZGF0YSk7CgogICAgUHlfVHlwZShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOwp9CgppbnQgcHlzcWxpdGVfY2FjaGVfaW5pdChweXNxbGl0ZV9DYWNoZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCnsKICAgIFB5T2JqZWN0KiBmYWN0b3J5OwogICAgaW50IHNpemUgPSAxMDsKCiAgICBzZWxmLT5mYWN0b3J5ID0gTlVMTDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aSIsICZmYWN0b3J5LCAmc2l6ZSkpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogbWluaW11bSBjYWNoZSBzaXplIGlzIDUgZW50cmllcyAqLwogICAgaWYgKHNpemUgPCA1KSB7CiAgICAgICAgc2l6ZSA9IDU7CiAgICB9CiAgICBzZWxmLT5zaXplID0gc2l6ZTsKICAgIHNlbGYtPmZpcnN0ID0gTlVMTDsKICAgIHNlbGYtPmxhc3QgPSBOVUxMOwoKICAgIHNlbGYtPm1hcHBpbmcgPSBQeURpY3RfTmV3KCk7CiAgICBpZiAoIXNlbGYtPm1hcHBpbmcpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgUHlfSU5DUkVGKGZhY3RvcnkpOwogICAgc2VsZi0+ZmFjdG9yeSA9IGZhY3Rvcnk7CgogICAgc2VsZi0+ZGVjcmVmX2ZhY3RvcnkgPSAxOwoKICAgIHJldHVybiAwOwp9Cgp2b2lkIHB5c3FsaXRlX2NhY2hlX2RlYWxsb2MocHlzcWxpdGVfQ2FjaGUqIHNlbGYpCnsKICAgIHB5c3FsaXRlX05vZGUqIG5vZGU7CiAgICBweXNxbGl0ZV9Ob2RlKiBkZWxldGVfbm9kZTsKCiAgICBpZiAoIXNlbGYtPmZhY3RvcnkpIHsKICAgICAgICAvKiBjb25zdHJ1Y3RvciBmYWlsZWQsIGp1c3QgZ2V0IG91dCBvZiBoZXJlICovCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIGl0ZXJhdGUgb3ZlciBhbGwgbm9kZXMgYW5kIGRlYWxsb2NhdGUgdGhlbSAqLwogICAgbm9kZSA9IHNlbGYtPmZpcnN0OwogICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICBkZWxldGVfbm9kZSA9IG5vZGU7CiAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CiAgICAgICAgUHlfREVDUkVGKGRlbGV0ZV9ub2RlKTsKICAgIH0KCiAgICBpZiAoc2VsZi0+ZGVjcmVmX2ZhY3RvcnkpIHsKICAgICAgICBQeV9ERUNSRUYoc2VsZi0+ZmFjdG9yeSk7CiAgICB9CiAgICBQeV9ERUNSRUYoc2VsZi0+bWFwcGluZyk7CgogICAgUHlfVHlwZShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOwp9CgpQeU9iamVjdCogcHlzcWxpdGVfY2FjaGVfZ2V0KHB5c3FsaXRlX0NhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlPYmplY3QqIGtleSA9IGFyZ3M7CiAgICBweXNxbGl0ZV9Ob2RlKiBub2RlOwogICAgcHlzcWxpdGVfTm9kZSogcHRyOwogICAgUHlPYmplY3QqIGRhdGE7CgogICAgbm9kZSA9IChweXNxbGl0ZV9Ob2RlKilQeURpY3RfR2V0SXRlbShzZWxmLT5tYXBwaW5nLCBrZXkpOwogICAgaWYgKG5vZGUpIHsKICAgICAgICAvKiBhbiBlbnRyeSBmb3IgdGhpcyBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNhY2hlICovCgogICAgICAgIC8qIGluY3JlYXNlIHVzYWdlIGNvdW50ZXIgb2YgdGhlIG5vZGUgZm91bmQgKi8KICAgICAgICBpZiAobm9kZS0+Y291bnQgPCBMT05HX01BWCkgewogICAgICAgICAgICBub2RlLT5jb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgLyogaWYgbmVjZXNzYXJ5LCByZW9yZGVyIGVudHJpZXMgaW4gdGhlIGNhY2hlIGJ5IHN3YXBwaW5nIHBvc2l0aW9ucyAqLwogICAgICAgIGlmIChub2RlLT5wcmV2ICYmIG5vZGUtPmNvdW50ID4gbm9kZS0+cHJldi0+Y291bnQpIHsKICAgICAgICAgICAgcHRyID0gbm9kZS0+cHJldjsKCiAgICAgICAgICAgIHdoaWxlIChwdHItPnByZXYgJiYgbm9kZS0+Y291bnQgPiBwdHItPnByZXYtPmNvdW50KSB7CiAgICAgICAgICAgICAgICBwdHIgPSBwdHItPnByZXY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChub2RlLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBub2RlLT5uZXh0LT5wcmV2ID0gbm9kZS0+cHJldjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNlbGYtPmxhc3QgPSBub2RlLT5wcmV2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChub2RlLT5wcmV2KSB7CiAgICAgICAgICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHRyLT5wcmV2KSB7CiAgICAgICAgICAgICAgICBwdHItPnByZXYtPm5leHQgPSBub2RlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBub2RlLT5uZXh0ID0gcHRyOwogICAgICAgICAgICBub2RlLT5wcmV2ID0gcHRyLT5wcmV2OwogICAgICAgICAgICBpZiAoIW5vZGUtPnByZXYpIHsKICAgICAgICAgICAgICAgIHNlbGYtPmZpcnN0ID0gbm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdHItPnByZXYgPSBub2RlOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyogVGhlcmUgaXMgbm8gZW50cnkgZm9yIHRoaXMga2V5IGluIHRoZSBjYWNoZSwgeWV0LiBXZSdsbCBpbnNlcnQgYSBuZXcKICAgICAgICAgKiBlbnRyeSBpbiB0aGUgY2FjaGUsIGFuZCBtYWtlIHNwYWNlIGlmIG5lY2Vzc2FyeSBieSB0aHJvd2luZyB0aGUKICAgICAgICAgKiBsZWFzdCB1c2VkIGl0ZW0gb3V0IG9mIHRoZSBjYWNoZS4gKi8KCiAgICAgICAgaWYgKFB5RGljdF9TaXplKHNlbGYtPm1hcHBpbmcpID09IHNlbGYtPnNpemUpIHsKICAgICAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLT5sYXN0OwoKICAgICAgICAgICAgICAgIGlmIChQeURpY3RfRGVsSXRlbShzZWxmLT5tYXBwaW5nLCBzZWxmLT5sYXN0LT5rZXkpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobm9kZS0+cHJldikgewogICAgICAgICAgICAgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZi0+bGFzdCA9IG5vZGUtPnByZXY7CiAgICAgICAgICAgICAgICBub2RlLT5wcmV2ID0gTlVMTDsKCiAgICAgICAgICAgICAgICBQeV9ERUNSRUYobm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRhdGEgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+ZmFjdG9yeSwgIk8iLCBrZXkpOwoKICAgICAgICBpZiAoIWRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQoKICAgICAgICBub2RlID0gcHlzcWxpdGVfbmV3X25vZGUoa2V5LCBkYXRhKTsKICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIG5vZGUtPnByZXYgPSBzZWxmLT5sYXN0OwoKICAgICAgICBQeV9ERUNSRUYoZGF0YSk7CgogICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5tYXBwaW5nLCBrZXksIChQeU9iamVjdCopbm9kZSkgIT0gMCkgewogICAgICAgICAgICBQeV9ERUNSRUYobm9kZSk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsKICAgICAgICAgICAgc2VsZi0+bGFzdC0+bmV4dCA9IG5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOwogICAgICAgIH0KICAgICAgICBzZWxmLT5sYXN0ID0gbm9kZTsKICAgIH0KCiAgICBQeV9JTkNSRUYobm9kZS0+ZGF0YSk7CiAgICByZXR1cm4gbm9kZS0+ZGF0YTsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX2NhY2hlX2Rpc3BsYXkocHlzcWxpdGVfQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBweXNxbGl0ZV9Ob2RlKiBwdHI7CiAgICBQeU9iamVjdCogcHJldmtleTsKICAgIFB5T2JqZWN0KiBuZXh0a2V5OwogICAgUHlPYmplY3QqIGZtdF9hcmdzOwogICAgUHlPYmplY3QqIHRlbXBsYXRlOwogICAgUHlPYmplY3QqIGRpc3BsYXlfc3RyOwoKICAgIHB0ciA9IHNlbGYtPmZpcnN0OwoKICAgIHdoaWxlIChwdHIpIHsKICAgICAgICBpZiAocHRyLT5wcmV2KSB7CiAgICAgICAgICAgIHByZXZrZXkgPSBwdHItPnByZXYtPmtleTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmV2a2V5ID0gUHlfTm9uZTsKICAgICAgICB9CiAgICAgICAgUHlfSU5DUkVGKHByZXZrZXkpOwoKICAgICAgICBpZiAocHRyLT5uZXh0KSB7CiAgICAgICAgICAgIG5leHRrZXkgPSBwdHItPm5leHQtPmtleTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXh0a2V5ID0gUHlfTm9uZTsKICAgICAgICB9CiAgICAgICAgUHlfSU5DUkVGKG5leHRrZXkpOwoKICAgICAgICBmbXRfYXJncyA9IFB5X0J1aWxkVmFsdWUoIk9PTyIsIHByZXZrZXksIHB0ci0+a2V5LCBuZXh0a2V5KTsKICAgICAgICBpZiAoIWZtdF9hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiVzIDwtICVzIC0+JXNcbiIpOwogICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgUHlfREVDUkVGKGZtdF9hcmdzKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGRpc3BsYXlfc3RyID0gUHlTdHJpbmdfRm9ybWF0KHRlbXBsYXRlLCBmbXRfYXJncyk7CiAgICAgICAgUHlfREVDUkVGKHRlbXBsYXRlKTsKICAgICAgICBQeV9ERUNSRUYoZm10X2FyZ3MpOwogICAgICAgIGlmICghZGlzcGxheV9zdHIpIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIFB5T2JqZWN0X1ByaW50KGRpc3BsYXlfc3RyLCBzdGRvdXQsIFB5X1BSSU5UX1JBVyk7CiAgICAgICAgUHlfREVDUkVGKGRpc3BsYXlfc3RyKTsKCiAgICAgICAgUHlfREVDUkVGKHByZXZrZXkpOwogICAgICAgIFB5X0RFQ1JFRihuZXh0a2V5KTsKCiAgICAgICAgcHRyID0gcHRyLT5uZXh0OwogICAgfQoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpzdGF0aWMgUHlNZXRob2REZWYgY2FjaGVfbWV0aG9kc1tdID0gewogICAgeyJnZXQiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY2FjaGVfZ2V0LCBNRVRIX08sCiAgICAgICAgUHlEb2NfU1RSKCJHZXRzIGFuIGVudHJ5IGZyb20gdGhlIGNhY2hlIG9yIGNhbGxzIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHRvIHByb2R1Y2Ugb25lLiIpfSwKICAgIHsiZGlzcGxheSIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jYWNoZV9kaXNwbGF5LCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIkZvciBkZWJ1Z2dpbmcgb25seS4iKX0sCiAgICB7TlVMTCwgTlVMTH0KfTsKClB5VHlwZU9iamVjdCBweXNxbGl0ZV9Ob2RlVHlwZSA9IHsKICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAgICBNT0RVTEVfTkFNRSAiTm9kZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCiAgICAgICAgc2l6ZW9mKHB5c3FsaXRlX05vZGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAgICAoZGVzdHJ1Y3RvcilweXNxbGl0ZV9ub2RlX2RlYWxsb2MsICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCiAgICAgICAgKGluaXRwcm9jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwp9OwoKUHlUeXBlT2JqZWN0IHB5c3FsaXRlX0NhY2hlVHlwZSA9IHsKICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAgICBNT0RVTEVfTkFNRSAiLkNhY2hlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCiAgICAgICAgc2l6ZW9mKHB5c3FsaXRlX0NhY2hlKSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAgICAoZGVzdHJ1Y3RvcilweXNxbGl0ZV9jYWNoZV9kZWFsbG9jLCAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgICAgIGNhY2hlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCiAgICAgICAgKGluaXRwcm9jKXB5c3FsaXRlX2NhY2hlX2luaXQsICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwp9OwoKZXh0ZXJuIGludCBweXNxbGl0ZV9jYWNoZV9zZXR1cF90eXBlcyh2b2lkKQp7CiAgICBpbnQgcmM7CgogICAgcHlzcWxpdGVfTm9kZVR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CiAgICBweXNxbGl0ZV9DYWNoZVR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CgogICAgcmMgPSBQeVR5cGVfUmVhZHkoJnB5c3FsaXRlX05vZGVUeXBlKTsKICAgIGlmIChyYyA8IDApIHsKICAgICAgICByZXR1cm4gcmM7CiAgICB9CgogICAgcmMgPSBQeVR5cGVfUmVhZHkoJnB5c3FsaXRlX0NhY2hlVHlwZSk7CiAgICByZXR1cm4gcmM7Cn0K