LyogRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgaGVhcHEucHkNCg0KQyBpbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGRpcmVjdGx5IGZyb20gaGVhcHEucHkgaW4gUHkyLjMNCndoaWNoIHdhcyB3cml0dGVuIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycywNCmFubm90YXRlZCBieSBGcmFuw6dvaXMgUGluYXJkLCBhbmQgY29udmVydGVkIHRvIEMgYnkgUmF5bW9uZCBIZXR0aW5nZXIuDQoNCiovDQoNCiNpbmNsdWRlICJQeXRob24uaCINCg0KLyogT2xkZXIgaW1wbGVtZW50YXRpb25zIG9mIGhlYXBxIHVzZWQgUHlfTEUgZm9yIGNvbXBhcmlzb25zLiAgTm93LCBpdCB1c2VzDQogICBQeV9MVCBzbyBpdCB3aWxsIG1hdGNoIG1pbigpLCBzb3J0ZWQoKSwgYW5kIGJpc2VjdCgpLiAgVW5mb3J0dW5hdGVseSwgc29tZQ0KICAgY2xpZW50IGNvZGUgKFR3aXN0ZWQgZm9yIGV4YW1wbGUpIHJlbGllZCBvbiBQeV9MRSwgc28gdGhpcyBsaXR0bGUgZnVuY3Rpb24NCiAgIHJlc3RvcmVzIGNvbXBhdGliaWxpdHkgYnkgdHJ5aW5nIGJvdGguDQoqLw0Kc3RhdGljIGludA0KY21wX2x0KFB5T2JqZWN0ICp4LCBQeU9iamVjdCAqeSkNCnsNCiAgICBpbnQgY21wOw0KICAgIHN0YXRpYyBQeU9iamVjdCAqbHQgPSBOVUxMOw0KDQogICAgaWYgKGx0ID09IE5VTEwpIHsNCiAgICAgICAgbHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfX2x0X18iKTsNCiAgICAgICAgaWYgKGx0ID09IE5VTEwpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KICAgIGlmIChQeU9iamVjdF9IYXNBdHRyKHgsIGx0KSkNCiAgICAgICAgcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh4LCB5LCBQeV9MVCk7DQogICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHksIHgsIFB5X0xFKTsNCiAgICBpZiAoY21wICE9IC0xKQ0KICAgICAgICBjbXAgPSAxIC0gY21wOw0KICAgIHJldHVybiBjbXA7DQp9DQoNCnN0YXRpYyBpbnQNCl9zaWZ0ZG93bihQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgcG9zKQ0Kew0KICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqcGFyZW50Ow0KICAgIFB5X3NzaXplX3QgcGFyZW50cG9zLCBzaXplOw0KICAgIGludCBjbXA7DQoNCiAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsNCiAgICBzaXplID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOw0KICAgIGlmIChwb3MgPj0gc2l6ZSkgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgLyogRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcNCiAgICAgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8NCiAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7DQogICAgd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKSB7DQogICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxOw0KICAgICAgICBwYXJlbnQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcGFyZW50cG9zKTsNCiAgICAgICAgY21wID0gY21wX2x0KG5ld2l0ZW0sIHBhcmVudCk7DQogICAgICAgIGlmIChjbXAgPT0gLTEpDQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIGlmIChzaXplICE9IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgew0KICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOw0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9DQogICAgICAgIGlmIChjbXAgPT0gMCkNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBwYXJlbnQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcGFyZW50cG9zKTsNCiAgICAgICAgbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOw0KICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcGFyZW50cG9zLCBuZXdpdGVtKTsNCiAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsNCiAgICAgICAgcG9zID0gcGFyZW50cG9zOw0KICAgIH0NCiAgICByZXR1cm4gMDsNCn0NCg0Kc3RhdGljIGludA0KX3NpZnR1cChQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3QgcG9zKQ0Kew0KICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgY2hpbGRwb3MsIHJpZ2h0cG9zLCBsaW1pdDsNCiAgICBQeU9iamVjdCAqdG1wMSwgKnRtcDI7DQogICAgaW50IGNtcDsNCg0KICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOw0KICAgIGVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsNCiAgICBzdGFydHBvcyA9IHBvczsNCiAgICBpZiAocG9zID49IGVuZHBvcykgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLw0KICAgIGxpbWl0ID0gZW5kcG9zIC8gMjsgICAgICAgICAgLyogc21hbGxlc3QgcG9zIHRoYXQgaGFzIG5vIGNoaWxkICovDQogICAgd2hpbGUgKHBvcyA8IGxpbWl0KSB7DQogICAgICAgIC8qIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLiAgICovDQogICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8NCiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7DQogICAgICAgIGlmIChyaWdodHBvcyA8IGVuZHBvcykgew0KICAgICAgICAgICAgY21wID0gY21wX2x0KA0KICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyksDQogICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHJpZ2h0cG9zKSk7DQogICAgICAgICAgICBpZiAoY21wID09IC0xKQ0KICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gMCkNCiAgICAgICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zOw0KICAgICAgICAgICAgaWYgKGVuZHBvcyAhPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsNCiAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOw0KICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLw0KICAgICAgICB0bXAxID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKTsNCiAgICAgICAgdG1wMiA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOw0KICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgY2hpbGRwb3MsIHRtcDIpOw0KICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXAxKTsNCiAgICAgICAgcG9zID0gY2hpbGRwb3M7DQogICAgfQ0KICAgIC8qIEJ1YmJsZSBpdCB1cCB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4gKi8NCiAgICByZXR1cm4gX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOw0KfQ0KDQpzdGF0aWMgUHlPYmplY3QgKg0KaGVhcHB1c2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQ0Kew0KICAgIFB5T2JqZWN0ICpoZWFwLCAqaXRlbTsNCg0KICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhlYXBwdXNoIiwgMiwgMiwgJmhlYXAsICZpdGVtKSkNCiAgICAgICAgcmV0dXJuIE5VTEw7DQoNCiAgICBpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOw0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBpZiAoUHlMaXN0X0FwcGVuZChoZWFwLCBpdGVtKSA9PSAtMSkNCiAgICAgICAgcmV0dXJuIE5VTEw7DQoNCiAgICBpZiAoX3NpZnRkb3duKChQeUxpc3RPYmplY3QgKiloZWFwLCAwLCBQeUxpc3RfR0VUX1NJWkUoaGVhcCktMSkgPT0gLTEpDQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsNCiAgICByZXR1cm4gUHlfTm9uZTsNCn0NCg0KUHlEb2NfU1RSVkFSKGhlYXBwdXNoX2RvYywNCiJoZWFwcHVzaChoZWFwLCBpdGVtKSAtPiBOb25lLiBQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIik7DQoNCnN0YXRpYyBQeU9iamVjdCAqDQpoZWFwcG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaGVhcCkNCnsNCiAgICBQeU9iamVjdCAqbGFzdGVsdCwgKnJldHVybml0ZW07DQogICAgUHlfc3NpemVfdCBuOw0KDQogICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgLyogIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5ICovDQogICAgbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsNCiAgICBpZiAobiA9PSAwKSB7DQogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KICAgIGxhc3RlbHQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgbi0xKSA7DQogICAgUHlfSU5DUkVGKGxhc3RlbHQpOw0KICAgIFB5TGlzdF9TZXRTbGljZShoZWFwLCBuLTEsIG4sIE5VTEwpOw0KICAgIG4tLTsNCg0KICAgIGlmICghbikNCiAgICAgICAgcmV0dXJuIGxhc3RlbHQ7DQogICAgcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsNCiAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgbGFzdGVsdCk7DQogICAgaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7DQogICAgICAgIFB5X0RFQ1JFRihyZXR1cm5pdGVtKTsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KICAgIHJldHVybiByZXR1cm5pdGVtOw0KfQ0KDQpQeURvY19TVFJWQVIoaGVhcHBvcF9kb2MsDQoiUG9wIHRoZSBzbWFsbGVzdCBpdGVtIG9mZiB0aGUgaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LiIpOw0KDQpzdGF0aWMgUHlPYmplY3QgKg0KaGVhcHJlcGxhY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQ0Kew0KICAgIFB5T2JqZWN0ICpoZWFwLCAqaXRlbSwgKnJldHVybml0ZW07DQoNCiAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcmVwbGFjZSIsIDIsIDIsICZoZWFwLCAmaXRlbSkpDQogICAgICAgIHJldHVybiBOVUxMOw0KDQogICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgaWYgKFB5TGlzdF9HRVRfU0laRShoZWFwKSA8IDEpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsNCiAgICBQeV9JTkNSRUYoaXRlbSk7DQogICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGl0ZW0pOw0KICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgew0KICAgICAgICBQeV9ERUNSRUYocmV0dXJuaXRlbSk7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCiAgICByZXR1cm4gcmV0dXJuaXRlbTsNCn0NCg0KUHlEb2NfU1RSVkFSKGhlYXByZXBsYWNlX2RvYywNCiJoZWFwcmVwbGFjZShoZWFwLCBpdGVtKSAtPiB2YWx1ZS4gUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLlxuXA0KXG5cDQpUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmVcblwNCm1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWVcblwNCnJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZlxuXA0KdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBjb25kaXRpb25hbCByZXBsYWNlbWVudDpcblxuXA0KICAgIGlmIGl0ZW0gPiBoZWFwWzBdOlxuXA0KICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSlcbiIpOw0KDQpzdGF0aWMgUHlPYmplY3QgKg0KaGVhcHB1c2hwb3AoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQ0Kew0KICAgIFB5T2JqZWN0ICpoZWFwLCAqaXRlbSwgKnJldHVybml0ZW07DQogICAgaW50IGNtcDsNCg0KICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhlYXBwdXNocG9wIiwgMiwgMiwgJmhlYXAsICZpdGVtKSkNCiAgICAgICAgcmV0dXJuIE5VTEw7DQoNCiAgICBpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOw0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCiAgICBpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApIDwgMSkgew0KICAgICAgICBQeV9JTkNSRUYoaXRlbSk7DQogICAgICAgIHJldHVybiBpdGVtOw0KICAgIH0NCg0KICAgIGNtcCA9IGNtcF9sdChQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCksIGl0ZW0pOw0KICAgIGlmIChjbXAgPT0gLTEpDQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIGlmIChjbXAgPT0gMCkgew0KICAgICAgICBQeV9JTkNSRUYoaXRlbSk7DQogICAgICAgIHJldHVybiBpdGVtOw0KICAgIH0NCg0KICAgIHJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7DQogICAgUHlfSU5DUkVGKGl0ZW0pOw0KICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsNCiAgICBpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpIHsNCiAgICAgICAgUHlfREVDUkVGKHJldHVybml0ZW0pOw0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQogICAgcmV0dXJuIHJldHVybml0ZW07DQp9DQoNClB5RG9jX1NUUlZBUihoZWFwcHVzaHBvcF9kb2MsDQoiaGVhcHB1c2hwb3AoaGVhcCwgaXRlbSkgLT4gdmFsdWUuIFB1c2ggaXRlbSBvbiB0aGUgaGVhcCwgdGhlbiBwb3AgYW5kIHJldHVybiB0aGUgc21hbGxlc3QgaXRlbVxuXA0KZnJvbSB0aGUgaGVhcC4gVGhlIGNvbWJpbmVkIGFjdGlvbiBydW5zIG1vcmUgZWZmaWNpZW50bHkgdGhhblxuXA0KaGVhcHB1c2goKSBmb2xsb3dlZCBieSBhIHNlcGFyYXRlIGNhbGwgdG8gaGVhcHBvcCgpLiIpOw0KDQpzdGF0aWMgUHlPYmplY3QgKg0KaGVhcGlmeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmhlYXApDQp7DQogICAgUHlfc3NpemVfdCBpLCBuOw0KDQogICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsNCiAgICAvKiBUcmFuc2Zvcm0gYm90dG9tLXVwLiAgVGhlIGxhcmdlc3QgaW5kZXggdGhlcmUncyBhbnkgcG9pbnQgdG8NCiAgICAgICBsb29raW5nIGF0IGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdA0KICAgICAgIGhhdmUgMippICsgMSA8IG4sIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzDQogICAgICAgKDIqai0xKS8yID0gai0xLzIgc28gai0xIGlzIHRoZSBsYXJnZXN0LCB3aGljaCBpcyBuLy8yIC0gMS4gIElmDQogICAgICAgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpcyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LA0KICAgICAgIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLg0KICAgICovDQogICAgZm9yIChpPW4vMi0xIDsgaT49MCA7IGktLSkNCiAgICAgICAgaWYoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpDQogICAgICAgICAgICByZXR1cm4gTlVMTDsNCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7DQogICAgcmV0dXJuIFB5X05vbmU7DQp9DQoNClB5RG9jX1NUUlZBUihoZWFwaWZ5X2RvYywNCiJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgaGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKGhlYXApKSB0aW1lLiIpOw0KDQpzdGF0aWMgUHlPYmplY3QgKg0Kbmxhcmdlc3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQ0Kew0KICAgIFB5T2JqZWN0ICpoZWFwPU5VTEwsICplbGVtLCAqaXRlcmFibGUsICpzb2wsICppdCwgKm9sZGVsZW07DQogICAgUHlfc3NpemVfdCBpLCBuOw0KICAgIGludCBjbXA7DQoNCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POm5sYXJnZXN0IiwgJm4sICZpdGVyYWJsZSkpDQogICAgICAgIHJldHVybiBOVUxMOw0KDQogICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsNCiAgICBpZiAoaXQgPT0gTlVMTCkNCiAgICAgICAgcmV0dXJuIE5VTEw7DQoNCiAgICBoZWFwID0gUHlMaXN0X05ldygwKTsNCiAgICBpZiAoaGVhcCA9PSBOVUxMKQ0KICAgICAgICBnb3RvIGZhaWw7DQoNCiAgICBmb3IgKGk9MCA7IGk8biA7IGkrKyApew0KICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOw0KICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7DQogICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgICAgICAgICAgICBnb3RvIGZhaWw7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7DQogICAgICAgIH0NCiAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgfQ0KICAgICAgICBQeV9ERUNSRUYoZWxlbSk7DQogICAgfQ0KICAgIGlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPT0gMCkNCiAgICAgICAgZ290byBzb3J0aXQ7DQoNCiAgICBmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQ0KICAgICAgICBpZihfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCg0KICAgIHNvbCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsNCiAgICB3aGlsZSAoMSkgew0KICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOw0KICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7DQogICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgICAgICAgICAgICBnb3RvIGZhaWw7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7DQogICAgICAgIH0NCiAgICAgICAgY21wID0gY21wX2x0KHNvbCwgZWxlbSk7DQogICAgICAgIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY21wID09IDApIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQogICAgICAgIG9sZGVsZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7DQogICAgICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBlbGVtKTsNCiAgICAgICAgUHlfREVDUkVGKG9sZGVsZW0pOw0KICAgICAgICBpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpDQogICAgICAgICAgICBnb3RvIGZhaWw7DQogICAgICAgIHNvbCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsNCiAgICB9DQpzb3J0aXQ6DQogICAgaWYgKFB5TGlzdF9Tb3J0KGhlYXApID09IC0xKQ0KICAgICAgICBnb3RvIGZhaWw7DQogICAgaWYgKFB5TGlzdF9SZXZlcnNlKGhlYXApID09IC0xKQ0KICAgICAgICBnb3RvIGZhaWw7DQogICAgUHlfREVDUkVGKGl0KTsNCiAgICByZXR1cm4gaGVhcDsNCg0KZmFpbDoNCiAgICBQeV9ERUNSRUYoaXQpOw0KICAgIFB5X1hERUNSRUYoaGVhcCk7DQogICAgcmV0dXJuIE5VTEw7DQp9DQoNClB5RG9jX1NUUlZBUihubGFyZ2VzdF9kb2MsDQoiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cblwNClxuXA0KRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwgcmV2ZXJzZT1UcnVlKVs6bl1cbiIpOw0KDQpzdGF0aWMgaW50DQpfc2lmdGRvd25tYXgoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IHBvcykNCnsNCiAgICBQeU9iamVjdCAqbmV3aXRlbSwgKnBhcmVudDsNCiAgICBpbnQgY21wOw0KICAgIFB5X3NzaXplX3QgcGFyZW50cG9zOw0KDQogICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7DQogICAgaWYgKHBvcyA+PSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsNCiAgICBQeV9JTkNSRUYobmV3aXRlbSk7DQogICAgLyogRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcNCiAgICAgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8NCiAgICB3aGlsZSAocG9zID4gc3RhcnRwb3Mpew0KICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTsNCiAgICAgICAgcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7DQogICAgICAgIGNtcCA9IGNtcF9sdChwYXJlbnQsIG5ld2l0ZW0pOw0KICAgICAgICBpZiAoY21wID09IC0xKSB7DQogICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGNtcCA9PSAwKQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIFB5X0lOQ1JFRihwYXJlbnQpOw0KICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOw0KICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBwYXJlbnQpOw0KICAgICAgICBwb3MgPSBwYXJlbnRwb3M7DQogICAgfQ0KICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7DQogICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7DQogICAgcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyBpbnQNCl9zaWZ0dXBtYXgoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHBvcykNCnsNCiAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvcywgbGltaXQ7DQogICAgaW50IGNtcDsNCiAgICBQeU9iamVjdCAqbmV3aXRlbSwgKnRtcDsNCg0KICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOw0KICAgIGVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsNCiAgICBzdGFydHBvcyA9IHBvczsNCiAgICBpZiAocG9zID49IGVuZHBvcykgew0KICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsNCiAgICBQeV9JTkNSRUYobmV3aXRlbSk7DQoNCiAgICAvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovDQogICAgbGltaXQgPSBlbmRwb3MgLyAyOyAgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8NCiAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsNCiAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8NCiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLw0KICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMTsNCiAgICAgICAgaWYgKHJpZ2h0cG9zIDwgZW5kcG9zKSB7DQogICAgICAgICAgICBjbXAgPSBjbXBfbHQoDQogICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHJpZ2h0cG9zKSwNCiAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpKTsNCiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGNtcCA9PSAwKQ0KICAgICAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3M7DQogICAgICAgIH0NCiAgICAgICAgLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8NCiAgICAgICAgdG1wID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKTsNCiAgICAgICAgUHlfSU5DUkVGKHRtcCk7DQogICAgICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7DQogICAgICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHRtcCk7DQogICAgICAgIHBvcyA9IGNoaWxkcG9zOw0KICAgIH0NCg0KICAgIC8qIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGJ1YmJsZQ0KICAgICAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLw0KICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7DQogICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7DQogICAgcmV0dXJuIF9zaWZ0ZG93bm1heChoZWFwLCBzdGFydHBvcywgcG9zKTsNCn0NCg0Kc3RhdGljIFB5T2JqZWN0ICoNCm5zbWFsbGVzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpDQp7DQogICAgUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKmxvcywgKml0LCAqb2xkZWxlbTsNCiAgICBQeV9zc2l6ZV90IGksIG47DQogICAgaW50IGNtcDsNCg0KICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk86bnNtYWxsZXN0IiwgJm4sICZpdGVyYWJsZSkpDQogICAgICAgIHJldHVybiBOVUxMOw0KDQogICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsNCiAgICBpZiAoaXQgPT0gTlVMTCkNCiAgICAgICAgcmV0dXJuIE5VTEw7DQoNCiAgICBoZWFwID0gUHlMaXN0X05ldygwKTsNCiAgICBpZiAoaGVhcCA9PSBOVUxMKQ0KICAgICAgICBnb3RvIGZhaWw7DQoNCiAgICBmb3IgKGk9MCA7IGk8biA7IGkrKyApew0KICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOw0KICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7DQogICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgICAgICAgICAgICBnb3RvIGZhaWw7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7DQogICAgICAgIH0NCiAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgfQ0KICAgICAgICBQeV9ERUNSRUYoZWxlbSk7DQogICAgfQ0KICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7DQogICAgaWYgKG4gPT0gMCkNCiAgICAgICAgZ290byBzb3J0aXQ7DQoNCiAgICBmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQ0KICAgICAgICBpZihfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCg0KICAgIGxvcyA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsNCiAgICB3aGlsZSAoMSkgew0KICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOw0KICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7DQogICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkNCiAgICAgICAgICAgICAgICBnb3RvIGZhaWw7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7DQogICAgICAgIH0NCiAgICAgICAgY21wID0gY21wX2x0KGVsZW0sIGxvcyk7DQogICAgICAgIGlmIChjbXAgPT0gLTEpIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY21wID09IDApIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQoNCiAgICAgICAgb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsNCiAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOw0KICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7DQogICAgICAgIGlmIChfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkNCiAgICAgICAgICAgIGdvdG8gZmFpbDsNCiAgICAgICAgbG9zID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOw0KICAgIH0NCg0Kc29ydGl0Og0KICAgIGlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkNCiAgICAgICAgZ290byBmYWlsOw0KICAgIFB5X0RFQ1JFRihpdCk7DQogICAgcmV0dXJuIGhlYXA7DQoNCmZhaWw6DQogICAgUHlfREVDUkVGKGl0KTsNCiAgICBQeV9YREVDUkVGKGhlYXApOw0KICAgIHJldHVybiBOVUxMOw0KfQ0KDQpQeURvY19TVFJWQVIobnNtYWxsZXN0X2RvYywNCiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cblwNClxuXA0KRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSlbOm5dXG4iKTsNCg0Kc3RhdGljIFB5TWV0aG9kRGVmIGhlYXBxX21ldGhvZHNbXSA9IHsNCiAgICB7ImhlYXBwdXNoIiwgICAgICAgIChQeUNGdW5jdGlvbiloZWFwcHVzaCwNCiAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgaGVhcHB1c2hfZG9jfSwNCiAgICB7ImhlYXBwdXNocG9wIiwgICAgIChQeUNGdW5jdGlvbiloZWFwcHVzaHBvcCwNCiAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgaGVhcHB1c2hwb3BfZG9jfSwNCiAgICB7ImhlYXBwb3AiLCAgICAgICAgIChQeUNGdW5jdGlvbiloZWFwcG9wLA0KICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICBoZWFwcG9wX2RvY30sDQogICAgeyJoZWFwcmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24paGVhcHJlcGxhY2UsDQogICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIGhlYXByZXBsYWNlX2RvY30sDQogICAgeyJoZWFwaWZ5IiwgICAgICAgICAoUHlDRnVuY3Rpb24paGVhcGlmeSwNCiAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgaGVhcGlmeV9kb2N9LA0KICAgIHsibmxhcmdlc3QiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKW5sYXJnZXN0LA0KICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBubGFyZ2VzdF9kb2N9LA0KICAgIHsibnNtYWxsZXN0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKW5zbWFsbGVzdCwNCiAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgbnNtYWxsZXN0X2RvY30sDQogICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8NCn07DQoNClB5RG9jX1NUUlZBUihtb2R1bGVfZG9jLA0KIkhlYXAgcXVldWUgYWxnb3JpdGhtIChhLmsuYS4gcHJpb3JpdHkgcXVldWUpLlxuXA0KXG5cDQpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvclxuXA0KYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxuXA0Kbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXG5cDQpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC5cblwNClxuXA0KVXNhZ2U6XG5cDQpcblwNCmhlYXAgPSBbXSAgICAgICAgICAgICMgY3JlYXRlcyBhbiBlbXB0eSBoZWFwXG5cDQpoZWFwcHVzaChoZWFwLCBpdGVtKSAjIHB1c2hlcyBhIG5ldyBpdGVtIG9uIHRoZSBoZWFwXG5cDQppdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcFxuXA0KaXRlbSA9IGhlYXBbMF0gICAgICAgIyBzbWFsbGVzdCBpdGVtIG9uIHRoZSBoZWFwIHdpdGhvdXQgcG9wcGluZyBpdFxuXA0KaGVhcGlmeSh4KSAgICAgICAgICAgIyB0cmFuc2Zvcm1zIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBsaW5lYXIgdGltZVxuXA0KaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkc1xuXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmV3IGl0ZW07IHRoZSBoZWFwIHNpemUgaXMgdW5jaGFuZ2VkXG5cDQpcblwNCk91ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOlxuXA0KXG5cDQotIFdlIHVzZSAwLWJhc2VkIGluZGV4aW5nLiAgVGhpcyBtYWtlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlXG5cDQogIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzc1xuXA0KICBvYnZpb3VzLCBidXQgaXMgbW9yZSBzdWl0YWJsZSBzaW5jZSBQeXRob24gdXNlcyAwLWJhc2VkIGluZGV4aW5nLlxuXA0KXG5cDQotIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC5cblwNClxuXA0KVGhlc2UgdHdvIG1ha2UgaXQgcG9zc2libGUgdG8gdmlldyB0aGUgaGVhcCBhcyBhIHJlZ3VsYXIgUHl0aG9uIGxpc3RcblwNCndpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KClcblwNCm1haW50YWlucyB0aGUgaGVhcCBpbnZhcmlhbnQhXG4iKTsNCg0KDQpQeURvY19TVFJWQVIoX19hYm91dF9fLA0KIkhlYXAgcXVldWVzXG5cDQpcblwNCltleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdXG5cDQpcblwNCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXG5cDQphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sXG5cDQpub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmdcblwNCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxuIg0KIlxuXA0KVGhlIHN0cmFuZ2UgaW52YXJpYW50IGFib3ZlIGlzIG1lYW50IHRvIGJlIGFuIGVmZmljaWVudCBtZW1vcnlcblwNCnJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXTpcblwNClxuXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXG5cDQpcblwNCiAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXG5cDQpcblwNCiAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNlxuXA0KXG5cDQogICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMCAgICAgIDExICAgICAgMTIgICAgICAxMyAgICAgIDE0XG5cDQpcblwNCiAgICAxNSAxNiAgIDE3IDE4ICAgMTkgMjAgICAyMSAyMiAgIDIzIDI0ICAgMjUgMjYgICAyNyAyOCAgIDI5IDMwXG5cDQpcblwNClxuXA0KSW4gdGhlIHRyZWUgYWJvdmUsIGVhY2ggY2VsbCBgaycgaXMgdG9wcGluZyBgMiprKzEnIGFuZCBgMiprKzInLiAgSW5cblwNCmFuIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXG5cDQpvdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWVcblwNCnRvIHNlZSBhbGwgb3Bwb25lbnRzIHMvaGUgaGFkLiAgSG93ZXZlciwgaW4gbWFueSBjb21wdXRlciBhcHBsaWNhdGlvbnNcblwNCm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxuXA0KVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG9cblwNCnJlcGxhY2UgaXQgYnkgc29tZXRoaW5nIGVsc2UgYXQgYSBsb3dlciBsZXZlbCwgYW5kIHRoZSBydWxlIGJlY29tZXNcblwNCnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXG5cDQpidXQgdGhlIHRvcCBjZWxsIFwid2luc1wiIG92ZXIgdGhlIHR3byB0b3BwZWQgY2VsbHMuXG4iDQoiXG5cDQpJZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XG5cDQp0aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmRcblwNCmZpbmQgdGhlIFwibmV4dFwiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZVxuXA0KZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93blxuXA0KdGhlIHRyZWUsIGV4Y2hhbmdpbmcgdmFsdWVzLCB1bnRpbCB0aGUgaW52YXJpYW50IGlzIHJlLWVzdGFibGlzaGVkLlxuXA0KVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuXG5cDQpCeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuXG4iDQoiXG5cDQpBIG5pY2UgZmVhdHVyZSBvZiB0aGlzIHNvcnQgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IGluc2VydCBuZXdcblwNCml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcblwNCm5vdCBcImJldHRlclwiIHRoYW4gdGhlIGxhc3QgMCd0aCBlbGVtZW50IHlvdSBleHRyYWN0ZWQuICBUaGlzIGlzXG5cDQplc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGxcblwNCmluY29taW5nIGV2ZW50cywgYW5kIHRoZSBcIndpblwiIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkXG5cDQp0aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZSBvdGhlciBldmVudHMgZm9yIGV4ZWN1dGlvbiwgdGhleSBhcmVcblwNCnNjaGVkdWxlZCBpbnRvIHRoZSBmdXR1cmUsIHNvIHRoZXkgY2FuIGVhc2lseSBnbyBpbnRvIHRoZSBoZWFwLiAgU28sIGFcblwNCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJXG5cDQp1c2VkIGZvciBteSBNSURJIHNlcXVlbmNlciA6LSkuXG4iDQoiXG5cDQpWYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseVxuXA0Kc3R1ZGllZCwgYW5kIGhlYXBzIGFyZSBnb29kIGZvciB0aGlzLCBhcyB0aGV5IGFyZSByZWFzb25hYmx5IHNwZWVkeSxcblwNCnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnRcblwNCnRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2hcblwNCmFyZSBtb3JlIGVmZmljaWVudCBvdmVyYWxsLCB5ZXQgdGhlIHdvcnN0IGNhc2VzIG1pZ2h0IGJlIHRlcnJpYmxlLlxuIg0KIlxuXA0KSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcblwNCmtub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nIFwicnVuc1wiICh3aGljaCBhcmUgcHJlLXNvcnRlZFxuXA0Kc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLFxuXA0KZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlblxuXA0KdmVyeSBjbGV2ZXJseSBvcmdhbmlzZWRbMV0uICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZSBpbml0aWFsXG5cDQpzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheVxuXA0KdG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdVxuXA0KcmVwbGFjZSBhbmQgcGVyY29sYXRlIGl0ZW1zIHRoYXQgaGFwcGVuIHRvIGZpdCB0aGUgY3VycmVudCBydW4sIHlvdSdsbFxuXA0KcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsXG5cDQphbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC5cbiINCiJcblwNCk1vcmVvdmVyLCBpZiB5b3Ugb3V0cHV0IHRoZSAwJ3RoIGl0ZW0gb24gZGlzayBhbmQgZ2V0IGFuIGlucHV0IHdoaWNoXG5cDQptYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcIndpbnNcIiBvdmVyXG5cDQp0aGUgbGFzdCBvdXRwdXQgdmFsdWUpLCBpdCBjYW5ub3QgZml0IGluIHRoZSBoZWFwLCBzbyB0aGUgc2l6ZSBvZiB0aGVcblwNCmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHlcblwNCmZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlXG5cDQpzYW1lIHJhdGUgdGhlIGZpcnN0IGhlYXAgaXMgbWVsdGluZy4gIFdoZW4gdGhlIGZpcnN0IGhlYXAgY29tcGxldGVseVxuXA0KdmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGVcblwNCmVmZmVjdGl2ZSFcblwNClxuXA0KSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluXG5cDQphIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGVcblwNCmFyb3VuZC4gOi0pXG4iDQoiXG5cDQotLS0tLS0tLS0tLS0tLS0tLS0tLVxuXA0KWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlXG5cDQptb3JlIGFubm95aW5nIHRoYW4gY2xldmVyLCBhbmQgdGhpcyBpcyBhIGNvbnNlcXVlbmNlIG9mIHRoZSBzZWVraW5nXG5cDQpjYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcblwNCnRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeVxuXA0KY2xldmVyIHRvIGVuc3VyZSAoZmFyIGluIGFkdmFuY2UpIHRoYXQgZWFjaCB0YXBlIG1vdmVtZW50IHdpbGwgYmUgdGhlXG5cDQptb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XG5cDQpcInByb2dyZXNzaW5nXCIgdGhlIG1lcmdlKS4gIFNvbWUgdGFwZXMgd2VyZSBldmVuIGFibGUgdG8gcmVhZFxuXA0KYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS5cblwNCkJlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghXG5cDQpGcm9tIGFsbCB0aW1lcywgc29ydGluZyBoYXMgYWx3YXlzIGJlZW4gYSBHcmVhdCBBcnQhIDotKVxuIik7DQoNClB5TU9ESU5JVF9GVU5DDQppbml0X2hlYXBxKHZvaWQpDQp7DQogICAgUHlPYmplY3QgKm07DQoNCiAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9oZWFwcSIsIGhlYXBxX21ldGhvZHMsIG1vZHVsZV9kb2MpOw0KICAgIGlmIChtID09IE5VTEwpDQogICAgICAgIHJldHVybjsNCiAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9fYWJvdXRfXyIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoX19hYm91dF9fKSk7DQp9DQoNCg==