Lyogcm93LmMgLSBhbiBlbmhhbmNlZCB0dXBsZSBmb3IgZGF0YWJhc2Ugcm93cwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAicm93LmgiCiNpbmNsdWRlICJjdXJzb3IuaCIKI2luY2x1ZGUgInNxbGl0ZWNvbXBhdC5oIgoKdm9pZCBweXNxbGl0ZV9yb3dfZGVhbGxvYyhweXNxbGl0ZV9Sb3cqIHNlbGYpCnsKICAgIFB5X1hERUNSRUYoc2VsZi0+ZGF0YSk7CiAgICBQeV9YREVDUkVGKHNlbGYtPmRlc2NyaXB0aW9uKTsKCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cn0KCmludCBweXNxbGl0ZV9yb3dfaW5pdChweXNxbGl0ZV9Sb3cqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBQeU9iamVjdCogZGF0YTsKICAgIHB5c3FsaXRlX0N1cnNvciogY3Vyc29yOwoKICAgIHNlbGYtPmRhdGEgPSAwOwogICAgc2VsZi0+ZGVzY3JpcHRpb24gPSAwOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmY3Vyc29yLCAmZGF0YSkpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKCFQeU9iamVjdF9Jc0luc3RhbmNlKChQeU9iamVjdCopY3Vyc29yLCAoUHlPYmplY3QqKSZweXNxbGl0ZV9DdXJzb3JUeXBlKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnN0YW5jZSBvZiBjdXJzb3IgcmVxdWlyZWQgZm9yIGZpcnN0IGFyZ3VtZW50Iik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmICghUHlUdXBsZV9DaGVjayhkYXRhKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ0dXBsZSByZXF1aXJlZCBmb3Igc2Vjb25kIGFyZ3VtZW50Iik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIFB5X0lOQ1JFRihkYXRhKTsKICAgIHNlbGYtPmRhdGEgPSBkYXRhOwoKICAgIFB5X0lOQ1JFRihjdXJzb3ItPmRlc2NyaXB0aW9uKTsKICAgIHNlbGYtPmRlc2NyaXB0aW9uID0gY3Vyc29yLT5kZXNjcmlwdGlvbjsKCiAgICByZXR1cm4gMDsKfQoKUHlPYmplY3QqIHB5c3FsaXRlX3Jvd19zdWJzY3JpcHQocHlzcWxpdGVfUm93KiBzZWxmLCBQeU9iamVjdCogaWR4KQp7CiAgICBsb25nIF9pZHg7CiAgICBjaGFyKiBrZXk7CiAgICBpbnQgbml0ZW1zLCBpOwogICAgY2hhciogY29tcGFyZV9rZXk7CgogICAgY2hhciogcDE7CiAgICBjaGFyKiBwMjsKCiAgICBQeU9iamVjdCogaXRlbTsKCiAgICBpZiAoUHlMb25nX0NoZWNrKGlkeCkpIHsKICAgICAgICBfaWR4ID0gUHlMb25nX0FzTG9uZyhpZHgpOwogICAgICAgIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oc2VsZi0+ZGF0YSwgX2lkeCk7CiAgICAgICAgUHlfWElOQ1JFRihpdGVtKTsKICAgICAgICByZXR1cm4gaXRlbTsKICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGlkeCkpIHsKICAgICAgICBrZXkgPSBQeVVuaWNvZGVfQXNTdHJpbmcoaWR4KTsKCiAgICAgICAgbml0ZW1zID0gUHlUdXBsZV9TaXplKHNlbGYtPmRlc2NyaXB0aW9uKTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG5pdGVtczsgaSsrKSB7CiAgICAgICAgICAgIGNvbXBhcmVfa2V5ID0gUHlVbmljb2RlX0FzU3RyaW5nKFB5VHVwbGVfR0VUX0lURU0oUHlUdXBsZV9HRVRfSVRFTShzZWxmLT5kZXNjcmlwdGlvbiwgaSksIDApKTsKICAgICAgICAgICAgaWYgKCFjb21wYXJlX2tleSkgewogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHAxID0ga2V5OwogICAgICAgICAgICBwMiA9IGNvbXBhcmVfa2V5OwoKICAgICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgICAgIGlmICgoKnAxID09IChjaGFyKTApIHx8ICgqcDIgPT0gKGNoYXIpMCkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoKCpwMSB8IDB4MjApICE9ICgqcDIgfCAweDIwKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHAxKys7CiAgICAgICAgICAgICAgICBwMisrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoKCpwMSA9PSAoY2hhcikwKSAmJiAoKnAyID09IChjaGFyKTApKSB7CiAgICAgICAgICAgICAgICAvKiBmb3VuZCBpdGVtICovCiAgICAgICAgICAgICAgICBpdGVtID0gUHlUdXBsZV9HZXRJdGVtKHNlbGYtPmRhdGEsIGkpOwogICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgIk5vIGl0ZW0gd2l0aCB0aGF0IGtleSIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGlkeCkpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNsaWNlcyBub3QgaW1wbGVtZW50ZWQsIHlldCIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgIkluZGV4IG11c3QgYmUgaW50IG9yIHN0cmluZyIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQp9CgpQeV9zc2l6ZV90IHB5c3FsaXRlX3Jvd19sZW5ndGgocHlzcWxpdGVfUm93KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKewogICAgcmV0dXJuIFB5VHVwbGVfR0VUX1NJWkUoc2VsZi0+ZGF0YSk7Cn0KClB5T2JqZWN0KiBweXNxbGl0ZV9yb3dfa2V5cyhweXNxbGl0ZV9Sb3cqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQp7CiAgICBQeU9iamVjdCogbGlzdDsKICAgIGludCBuaXRlbXMsIGk7CgogICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CiAgICBpZiAoIWxpc3QpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIG5pdGVtcyA9IFB5VHVwbGVfU2l6ZShzZWxmLT5kZXNjcmlwdGlvbik7CgogICAgZm9yIChpID0gMDsgaSA8IG5pdGVtczsgaSsrKSB7CiAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgUHlUdXBsZV9HRVRfSVRFTShQeVR1cGxlX0dFVF9JVEVNKHNlbGYtPmRlc2NyaXB0aW9uLCBpKSwgMCkpICE9IDApIHsKICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGxpc3Q7Cn0KCnN0YXRpYyBpbnQgcHlzcWxpdGVfcm93X3ByaW50KHB5c3FsaXRlX1Jvdyogc2VsZiwgRklMRSAqZnAsIGludCBmbGFncykKewogICAgcmV0dXJuICgmUHlUdXBsZV9UeXBlKS0+dHBfcHJpbnQoc2VsZi0+ZGF0YSwgZnAsIGZsYWdzKTsKfQoKc3RhdGljIFB5T2JqZWN0KiBweXNxbGl0ZV9pdGVyKHB5c3FsaXRlX1Jvdyogc2VsZikKewogICAgcmV0dXJuIFB5T2JqZWN0X0dldEl0ZXIoc2VsZi0+ZGF0YSk7Cn0KCnN0YXRpYyBsb25nIHB5c3FsaXRlX3Jvd19oYXNoKHB5c3FsaXRlX1JvdyAqc2VsZikKewogICAgcmV0dXJuIFB5T2JqZWN0X0hhc2goc2VsZi0+ZGVzY3JpcHRpb24pIF4gUHlPYmplY3RfSGFzaChzZWxmLT5kYXRhKTsKfQoKc3RhdGljIFB5T2JqZWN0KiBweXNxbGl0ZV9yb3dfcmljaGNvbXBhcmUocHlzcWxpdGVfUm93ICpzZWxmLCBQeU9iamVjdCAqX290aGVyLCBpbnQgb3BpZCkKewogICAgaWYgKG9waWQgIT0gUHlfRVEgJiYgb3BpZCAhPSBQeV9ORSkgewoJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKICAgIH0KICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUoX290aGVyKSwgJnB5c3FsaXRlX1Jvd1R5cGUpKSB7CglweXNxbGl0ZV9Sb3cgKm90aGVyID0gKHB5c3FsaXRlX1JvdyAqKV9vdGhlcjsKCVB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZShzZWxmLT5kZXNjcmlwdGlvbiwgb3RoZXItPmRlc2NyaXB0aW9uLCBvcGlkKTsKCWlmIChvcGlkID09IFB5X0VRICYmIHJlcyA9PSBQeV9UcnVlCgkgICAgfHwgb3BpZCA9PSBQeV9ORSAmJiByZXMgPT0gUHlfRmFsc2UpIHsKCSAgICBQeV9ERUNSRUYocmVzKTsKCSAgICByZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUoc2VsZi0+ZGF0YSwgb3RoZXItPmRhdGEsIG9waWQpOwoJfQogICAgfQogICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKfQoKUHlNYXBwaW5nTWV0aG9kcyBweXNxbGl0ZV9yb3dfYXNfbWFwcGluZyA9IHsKICAgIC8qIG1wX2xlbmd0aCAgICAgICAgKi8gKGxlbmZ1bmMpcHlzcWxpdGVfcm93X2xlbmd0aCwKICAgIC8qIG1wX3N1YnNjcmlwdCAgICAgKi8gKGJpbmFyeWZ1bmMpcHlzcWxpdGVfcm93X3N1YnNjcmlwdCwKICAgIC8qIG1wX2Fzc19zdWJzY3JpcHQgKi8gKG9iam9iamFyZ3Byb2MpMCwKfTsKCnN0YXRpYyBQeU1ldGhvZERlZiBweXNxbGl0ZV9yb3dfbWV0aG9kc1tdID0gewogICAgeyJrZXlzIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX3Jvd19rZXlzLCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIlJldHVybnMgdGhlIGtleXMgb2YgdGhlIHJvdy4iKX0sCiAgICB7TlVMTCwgTlVMTH0KfTsKCgpQeVR5cGVPYmplY3QgcHlzcWxpdGVfUm93VHlwZSA9IHsKICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAgICBNT0RVTEVfTkFNRSAiLlJvdyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCiAgICAgICAgc2l6ZW9mKHB5c3FsaXRlX1JvdyksICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAgICAoZGVzdHJ1Y3RvcilweXNxbGl0ZV9yb3dfZGVhbGxvYywgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCiAgICAgICAgKHByaW50ZnVuYylweXNxbGl0ZV9yb3dfcHJpbnQsICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCiAgICAgICAgKGhhc2hmdW5jKXB5c3FsaXRlX3Jvd19oYXNoLCAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAgICAodHJhdmVyc2Vwcm9jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgICAgKHJpY2hjbXBmdW5jKXB5c3FsaXRlX3Jvd19yaWNoY29tcGFyZSwgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgICAgIChnZXRpdGVyZnVuYylweXNxbGl0ZV9pdGVyLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgICAgIHB5c3FsaXRlX3Jvd19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCiAgICAgICAgKGluaXRwcm9jKXB5c3FsaXRlX3Jvd19pbml0LCAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwp9OwoKZXh0ZXJuIGludCBweXNxbGl0ZV9yb3dfc2V0dXBfdHlwZXModm9pZCkKewogICAgcHlzcWxpdGVfUm93VHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKICAgIHB5c3FsaXRlX1Jvd1R5cGUudHBfYXNfbWFwcGluZyA9ICZweXNxbGl0ZV9yb3dfYXNfbWFwcGluZzsKICAgIHJldHVybiBQeVR5cGVfUmVhZHkoJnB5c3FsaXRlX1Jvd1R5cGUpOwp9Cg==