LyoqDQogKiBAZmlsZSBhY2Nlc3NNYW5hZ2VyLmMNCiAqIEBhdXRob3IgTlhQIFNlbWljb25kdWN0b3JzDQogKiBAdmVyc2lvbiAxLjANCiAqIEBwYXIgTGljZW5zZQ0KICoNCiAqIENvcHlyaWdodCAyMDE3LDIwMjAgTlhQDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMA0KICoNCiAqIEBwYXIgRGVzY3JpcHRpb24NCiAqIENvbm5lY3Rpb24gT3JpZW50ZWQgVENQL0lQIFNlcnZlciBpbXBsZW1lbnRpbmcgSlJDUF9WMSBwcm90b2NvbCBmb3INCiAqIGluY29taW5nIGNvbm5lY3Rpb25zLg0KICogU2V2ZXJhbCBjbGllbnQgcHJvY2Vzc2VzIGNhbiBjb25uZWN0IGluIHBhcmFsbGVsIHRvIHNlcnZlciBwcm9jZXNzLg0KICogVGhlIHNlcnZlciBjYW4gY29ubmVjdCB0byB0aGUgc2VjdXJlIGVsZW1lbnQgdmlhIHRoZQ0KICogLSBTQ0kyQyBwcm90b2NvbCAobm90IHRlc3RlZCkNCiAqIC0gVDFvSTJDIHByb3RvY29sDQogKiBAcGFyIEhpc3RvcnkNCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KI2luY2x1ZGUgPGVycm5vLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAvLyBtZW1zZXQNCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+DQojaW5jbHVkZSA8c3lzL3NlbGVjdC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxuZXRkYi5oPg0KI2luY2x1ZGUgPGFycGEvaW5ldC5oPg0KI2luY2x1ZGUgPHN5cy93YWl0Lmg+DQojaW5jbHVkZSA8c2lnbmFsLmg+DQoNCiNpZiBkZWZpbmVkKFNTU19VU0VfRlRSX0ZJTEUpDQojaW5jbHVkZSAiZnNsX3Nzc19mdHIuaCINCiNlbHNlDQojaW5jbHVkZSAiZnNsX3Nzc19mdHJfZGVmYXVsdC5oIg0KI2VuZGlmDQoNCiNpbmNsdWRlICJzbV9hcGR1LmgiDQojaW5jbHVkZSAiYWNjZXNzTWFuYWdlci5oIg0KI2luY2x1ZGUgImFjY2Vzc01hbmFnZXJfY29tLmgiDQoNCiNpZiBkZWZpbmVkKFNDSTJDKQ0KI2luY2x1ZGUgImFwZHVDb21tLmgiDQojaW5jbHVkZSAic2NpMmMuaCINCiNlbmRpZg0KDQojZGVmaW5lIEJBQ0tMT0cgMTAgICAgICAgIC8vIGhvdyBtYW55IHBlbmRpbmcgY29ubmVjdGlvbnMgcXVldWUgd2lsbCBob2xkDQojZGVmaW5lIEFDQ0VTU19NR1JfVkVSU0lPTl9NQUpPUiAxDQojZGVmaW5lIEFDQ0VTU19NR1JfVkVSU0lPTl9NSU5PUiAwDQoNCiNkZWZpbmUgRVJST1JfVkVSQk9TRQ0KDQojaWZuZGVmIEZMT1dfVkVSQk9TRQ0KI2RlZmluZSBGTE9XX1ZFUkJPU0UNCiNlbmRpZg0KDQovLyAjaWZuZGVmIEFQRFVfVkVSQk9TRQ0KLy8gI2RlZmluZSBBUERVX1ZFUkJPU0UNCi8vICNlbmRpZg0KDQovLyAjZGVmaW5lIERCR19WRVJCT1NFDQoNCiNpZmRlZiBFUlJPUl9WRVJCT1NFDQojZGVmaW5lIEVQUklOVEYoLi4uKSBwcmludGYgKF9fVkFfQVJHU19fKQ0KI2Vsc2UNCiNkZWZpbmUgRVBSSU5URiguLi4pDQojZW5kaWYNCg0KI2lmZGVmIEFQRFVfVkVSQk9TRQ0KI2RlZmluZSBBUFJJTlRGKC4uLikgcHJpbnRmIChfX1ZBX0FSR1NfXykNCiNlbHNlDQojZGVmaW5lIEFQUklOVEYoLi4uKQ0KI2VuZGlmDQoNCiNpZmRlZiBGTE9XX1ZFUkJPU0UNCiNkZWZpbmUgRlBSSU5URiguLi4pIHByaW50ZiAoX19WQV9BUkdTX18pDQojZWxzZQ0KI2RlZmluZSBGUFJJTlRGKC4uLikNCiNlbmRpZg0KDQojaWZkZWYgREJHX1ZFUkJPU0UNCiNkZWZpbmUgRFBSSU5URiguLi4pIHByaW50ZiAoX19WQV9BUkdTX18pDQojZWxzZQ0KI2RlZmluZSBEUFJJTlRGKC4uLikNCiNlbmRpZg0KDQoNCi8vICNpbmNsdWRlICJkZW1vQWNjZXNzTWFuYWdlckNvbmZpZy5oIg0KDQovKiBkYXRhIHN0cnVjdHVyZXMgKi8NCnR5cGVkZWYgc3RydWN0IGNsaWVudF9zdHJ1Y3Qgew0KICBpbnQgICAgICAgICAgICAgICAgICBzb2NrOw0KICAvKiBwbGFjZSBhZGRpdGlvbmFsIGNsaWVudCBhdHRyaWJ1dGVzIGhlcmUgKi8NCiAgaW50ICAgICAgICAgICAgICAgICAgbkxvY2s7DQogIHN0cnVjdCBjbGllbnRfc3RydWN0ICpuZXh0Ow0KfSBjbGllbnRfdDsNCg0KY2xpZW50X3QqIGFkZENsaWVudChjbGllbnRfdCAqaGVhZCwgaW50IHNvY2spOw0KY2xpZW50X3QqIHJlbW92ZU9ic29sZXRlQ2xpZW50cyhjbGllbnRfdCAqaGVhZCwgaW50ICpmT25Ib2xkKTsNCg0KI2RlZmluZSBXUklURUNIRUNLKHgpICAgeyBpZigoeCkgPCAwKSB7IFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb25uZWN0aW9uIHRvIGNsaWVudCAlZCB1bmV4cGVjdGVkbHkgY2xvc2VkLlxuIiwgY2wtPnNvY2spOyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNsLT5zb2NrID0gLTE7IFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTt9IFwNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KI2lmIDANCi8vIGdldCBzb2NrYWRkciwgSVB2NCBvciBJUHY2Og0Kdm9pZCAqZ2V0X2luX2FkZHIoc3RydWN0IHNvY2thZGRyICpzYSkNCnsNCiAgICBpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKXNhKS0+c2luX2FkZHIpOw0KICAgIH0NCg0KICAgIHJldHVybiAmKCgoc3RydWN0IHNvY2thZGRyX2luNiopc2EpLT5zaW42X2FkZHIpOw0KfQ0KI2VuZGlmDQoNCnN0YXRpYyB2b2lkIGNtZExpbmVBcmdIZWxwKGNoYXIgKnN6UHJvZ05hbWUpOw0Kc3RhdGljIGludCBjbWRMaW5lUGFyc2luZyhpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGJvb2wgKnJlcXVlc3RQbGF0Zm9ybVNDUDAzLCBib29sICpyZXF1ZXN0QW55QWRkcmVzc0JpbmRpbmcpOw0KDQppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQ0Kew0KICAgIGludCBsaXN0ZW5pbmdTb2NrOw0KICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXI7DQogICAgdWludDE2X3Qgc2VydmVyUG9ydCA9IFNFUlZFUlBPUlQ7DQoNCiAgICAvLyBDbGllbnQgZGF0YSBzdHJ1Y3R1cmUNCiAgICBjbGllbnRfdCAqY2xpZW50SGVhZCA9IE5VTEw7DQogICAgaW50IGZPbkhvbGQgPSAwOw0KDQogICAgaW50IGZTZXJ2ZSA9IDE7DQogICAgaW50IHNvY2tldFR5cGU7DQogICAgaW50IHllcyA9IDE7DQoNCiAgICAvLyBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpzZXJ2aW5mbywgKnA7DQogICAgLy8gc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgdGhlaXJfYWRkcjsgLy8gY29ubmVjdG9yJ3MgYWRkcmVzcyBpbmZvcm1hdGlvbg0KICAgIC8vIHNvY2tsZW5fdCBzaW5fc2l6ZTsNCiAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOw0KICAgIGNoYXIgc1tJTkVUNl9BRERSU1RSTEVOXTsNCiAgICBpbnQgcnY7DQogICAgVTggc25kQnVmW01TR19TSVpFXTsgICAgICAgICAgICAgLy8gT3V0Z291bmcgZGF0YSBzZW50IG92ZXIgc29ja2V0DQogICAgVTE2IHNuZEJ1ZkxlbiA9IHNpemVvZihzbmRCdWYpOw0KICAgIHVpbnQ4X3QgIHJjdkJ1ZltNU0dfU0laRV07ICAgICAgIC8vIEluY29taW5nIGRhdGEgcmVjZWl2ZWQgb3ZlciBzb2NrZXQNCiAgICBVMTYgc3RhdHVzVmFsdWUgPSAwOw0KICAgIFU4IHJlc3BCdWZbTVNHX1NJWkVdOyAgICAgICAgICAgIC8vIEFQRFUgUmVzcG9uc2UgYnVmZmVyDQogICAgVTE2IHJlc3BCdWZMZW4gPSBzaXplb2YocmVzcEJ1Zik7DQogICAgc3RhdGljIGJvb2wgc2Vzc2lvbk9wZW4gPSAgRkFMU0U7DQogICAgc3RhdGljIGJvb2wgYXBwbGV0U2VsZWN0ZWQgPSBGQUxTRTsNCiAgICBzdGF0aWMgYm9vbCByZXF1ZXN0UGxhdGZvcm1TQ1AwMyA9IFRSVUU7DQogICAgc3RhdGljIGJvb2wgcmVxdWVzdEFueUFkZHJlc3NCaW5kaW5nID0gRkFMU0U7DQogICAgaW50IG5DbWRMaW5lUGFyc2VTdGF0dXMgPSAwOw0KICAgIHN0YXRpYyBVOCBwbGF0Zm9ybVNDUDAzX09uID0gMDsNCg0KICAgIFU4IGNtZFNFMDV4QXBwbGV0U2VsZWN0W10gPSB7IDB4MDAsIDB4QTQsIDB4MDQsIDB4MDAsIDB4MTAsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4OTYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NCwgMHg1MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07DQogICAgc3RhdGljIFU4IHJzcEFwcGxldFNlbGVjdFsxMjhdOw0KICAgIHN0YXRpYyBzaXplX3QgcnNwQXBwbGV0U2VsZWN0TGVuID0gMDsNCg0KICAgIFUxNiBjb25uZWN0U3RhdHVzID0gMDsNCiNpZiBkZWZpbmVkKFNDSTJDKSB8fCBkZWZpbmVkKFBDU0MpIHx8IGRlZmluZWQoU01DT01fSlJDUF9WMikgfHwgZGVmaW5lZChUMW9JMkMpDQogICAgVTggQXRyWzY0XTsNCiAgICBVMTYgQXRyTGVuID0gc2l6ZW9mKEF0cik7DQogICAgU21Db21tU3RhdGVBbV90IGNvbW1TdGF0ZTsNCiAgICAvLyBTY3AwM1Nlc3Npb25TdGF0ZV90IHNlc3Npb25TdGF0ZTsNCiNlbmRpZg0KDQogICAgLy8gRGVhbCB3aXRoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMNCiAgICBuQ21kTGluZVBhcnNlU3RhdHVzID0gY21kTGluZVBhcnNpbmcoYXJnYywgYXJndiwgJnJlcXVlc3RQbGF0Zm9ybVNDUDAzLCAmcmVxdWVzdEFueUFkZHJlc3NCaW5kaW5nKTsNCiAgICBpZiAobkNtZExpbmVQYXJzZVN0YXR1cyA9PSAtMSkgew0KICAgICAgICBjbWRMaW5lQXJnSGVscChhcmd2WzBdKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIHByaW50ZigiU3RhcnRpbmcgYWNjZXNzTWFuYWdlciAoUmV2LiVkLiVkKS5cbiIsIEFDQ0VTU19NR1JfVkVSU0lPTl9NQUpPUiwgQUNDRVNTX01HUl9WRVJTSU9OX01JTk9SKTsNCiAgICBwcmludGYoIiAgUHJvdGVjdCBMaW5rIGJldHdlZW4gYWNjZXNzTWFuYWdlciBhbmQgU0U6ICVzLlxuIiwgKHJlcXVlc3RQbGF0Zm9ybVNDUDAzID09IFRSVUUpID8gIllFUyIgOiAiTk8iKTsNCg0KICAgIC8vIGludCBzb2NrZXQoaW50IGRvbWFpbiAsIGludCB0eXBlICwgaW50IHByb3RvY29sICk7DQogICAgLy8gICAgICBSZXR1cm5zIGZpbGUgZGVzY3JpcHRvciBvbiBzdWNjZXNzLCBvciCWMSBvbiBlcnJvcg0KICAgIC8vIEZvciBJUEMgd2UgY2FuIGFsc28gdXNlIGRvbWFpbiAnQUZfVU5JWCcNCg0KICAgIC8vIFNldHVwIHNvY2tldA0KICAgIC8vIE5PVEU6IExpbnV4IGRlZmluZXMgdHdvIG5vbi1zdGFuZGFyZCBmbGFncyBmb3IgdGhlIHR5cGUgcGFyYW1ldGVyIG9mIHRoZSBzb2NrZXQgZnVuY3Rpb24NCiAgICAvLyBUaGUgU09DS19OT05CTE9DSyBmbGFnIChvbmUgb2YgdGhlbSkgY2F1c2VzIHRoZSBrZXJuZWwgdG8gc2V0IHRoZSBPX05PTkJMT0NLIGZsYWcgb24gdGhlDQogICAgLy8gdW5kZXJseWluZyBvcGVuIGZpbGUgZGVzY3JpcHRpb24sIHNvIHRoYXQgZnV0dXJlIEkvTyBvcGVyYXRpb25zIG9uIHRoZSBzb2NrZXQgd2lsbCBiZSBub25ibG9ja2luZy4NCiAgICAvLyBUaGlzIHNhdmVzIGFkZGl0aW9uYWwgY2FsbHMgdG8gZmNudGwoKSB0byBhY2hpZXZlIHRoZSBzYW1lIHJlc3VsdC4NCiAgICBzb2NrZXRUeXBlID0gU09DS19TVFJFQU07DQojaWZkZWYgX19nbnVfbGludXhfXw0KICAgIHNvY2tldFR5cGUgfD0gU09DS19OT05CTE9DSzsNCiNlbHNlDQogICAgRVBSSU5URigiQ2hlY2sgd2hldGhlciBsaXN0ZW5pbmcgc29ja2V0IG11c3QgYmUgbm9uLWJsb2NraW5nLlxuIik7DQojZW5kaWYNCiAgICBsaXN0ZW5pbmdTb2NrID0gc29ja2V0KEFGX0lORVQsIHNvY2tldFR5cGUsIDApOw0KICAgIGlmIChsaXN0ZW5pbmdTb2NrIDwgMCkgew0KICAgICAgICBwZXJyb3IoInNvY2tldCIpOw0KICAgICAgICByZXR1cm4gTUNTX1NPQ0tFVF9GQUlMVVJFOw0KICAgIH0NCiAgICBpZiAoc2V0c29ja29wdChsaXN0ZW5pbmdTb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIHNpemVvZihpbnQpKSkNCiAgICB7DQogICAgICAgIHBlcnJvcigic2V0c29ja29wdCIpOw0KICAgICAgICByZXR1cm4gTUNTX1NPQ0tFVF9GQUlMVVJFOw0KICAgIH0NCiAgICBtZW1zZXQoJnNlcnZlciwgMHgwMCwgc2l6ZW9mKHNlcnZlcikpOw0KICAgIHNlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsNCiAgICBpZiAocmVxdWVzdEFueUFkZHJlc3NCaW5kaW5nKSB7DQogICAgICAgIHNlcnZlci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgc2VydmVyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7DQogICAgfQ0KICAgIHNlcnZlci5zaW5fcG9ydCA9IGh0b25zKHNlcnZlclBvcnQpOw0KICAgIGlmIChiaW5kKGxpc3RlbmluZ1NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSAmc2VydmVyLCBzaXplb2Yoc2VydmVyKSkpIHsNCiAgICAgICAgcGVycm9yKCJiaW5kIik7DQogICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7DQogICAgfQ0KICAgIGlmIChsaXN0ZW4obGlzdGVuaW5nU29jaywgQkFDS0xPRykpIHsNCiAgICAgICAgcGVycm9yKCJsaXN0ZW4iKTsNCiAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsNCiAgICB9DQoNCiNpZiBkZWZpbmVkKFNDSTJDKQ0KICAgIHByaW50ZigiYWNjZXNzTWFuYWdlciBKUkNQdjEgKFNDSTJDIFNFIHNpZGUpXG4iKTsNCiAgICAjaWYgZGVmaW5lZChUR1RfQTcxQ0gpIHx8IGRlZmluZWQoVEdUX0E3MUNMKQ0KICAgICAgICBwcmludGYoIkE3MSAoSTJDX0NMS19NQVggPSA0MDAga0h6KSAtIEVmZmVjdGl2ZSBNYXN0ZXIgQ2xvY2sgZGVwZW5kcyBvbiBIb3N0IFBsYXRmb3JtLlxuIik7DQogICAgI2Vsc2UNCiAgICAgICAgcHJpbnRmKCJBNzAgKEkyQ19DTEtfTUFYID0gMTAwIGtIeikgLSBFZmZlY3RpdmUgTWFzdGVyIENsb2NrIGRlcGVuZHMgb24gSG9zdCBQbGF0Zm9ybS5cbiIpOw0KICAgICNlbmRpZg0KI2VsaWYgZGVmaW5lZCAoUENTQykNCiAgICBwcmludGYoImFjY2Vzc01hbmFnZXIgSlJDUHYxIChQQ1NDIFNFIHNpZGUpXG4iKTsNCiNlbGlmIGRlZmluZWQoU01DT01fSlJDUF9WMikNCiAgICBwcmludGYoImFjY2Vzc01hbmFnZXIgSlJDUHYxIChKUkNQdjIgU0Ugc2lkZSlcbiIpOw0KI2VsaWYgZGVmaW5lZChUMW9JMkMpDQogICAgcHJpbnRmKCJhY2Nlc3NNYW5hZ2VyIEpSQ1B2MSAoVDFvSTJDIFNFIHNpZGUpXG4iKTsNCiNlbHNlDQogICAgI2Vycm9yICJObyBTRSBzaWRlIGludGVyY29ubmVjdCBkZWZpbmVkOiBzdXBwb3J0ZWQgYXJlIFQxb0kyQywgU0NJMkMgYW5kIFBDU0MiDQojZW5kaWYNCiAgICBwcmludGYoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7DQogICAgcHJpbnRmKCJTZXJ2ZXI6IHdhaXRpbmcgZm9yIGNvbm5lY3Rpb25zIG9uIHBvcnQgJWQuXG4iLCBzZXJ2ZXJQb3J0KTsNCiAgICBzd2l0Y2ggKG50b2hsKHNlcnZlci5zaW5fYWRkci5zX2FkZHIpKSB7DQogICAgICAgIGNhc2UgSU5BRERSX0xPT1BCQUNLOg0KICAgICAgICBwcmludGYoIlNlcnZlcjogb25seSBsb2NhbGhvc3QgYmFzZWQgcHJvY2Vzc2VzIGNhbiBjb25uZWN0LlxuIik7DQogICAgICAgIGJyZWFrOw0KDQogICAgICAgIGNhc2UgSU5BRERSX0FOWToNCiAgICAgICAgcHJpbnRmKCJTZXJ2ZXI6ICoqIFdBUk5JTkcgKiogYWNjZXNzTWFuYWdlciByZWFjaGVhYmxlIG92ZXIgbmV0d29yayAqKiBXQVJOSU5HICoqXG4iKTsNCiAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgcHJpbnRmKCJTZXJ2ZXI6ICoqIFdBUk5JTkcgKiogYWNjZXNzTWFuYWdlciBtYXkgYmUgcmVhY2hlYWJsZSBvdmVyIG5ldHdvcmsgKiogV0FSTklORyAqKlxuIik7DQogICAgICAgIGJyZWFrOw0KICAgIH0NCg0KICAgIHdoaWxlIChmU2VydmUgPT0gMSkgew0KICAgICAgICBmZF9zZXQgICBzb2NrZXRzOw0KICAgICAgICBpbnQgICAgICBtYXhmZCA9IGxpc3RlbmluZ1NvY2s7DQogICAgICAgIGNsaWVudF90ICpjbDsNCiAgICAgICAgaW50IG5TdGF0dXM7DQogICAgICAgIGludCBsb2NrUmVxdWVzdGVkID0gMDsNCiAgICAgICAgYm9vbCBzZW5kVG9BcHBsZXQgPSBUUlVFOw0KDQogICAgICAgIC8qIGNyZWF0ZSBzZXQgb2YgZmlsZSBkZXNjcmlwdG9ycyAoPXNvY2tldHMpICovDQogICAgICAgIEZEX1pFUk8oJnNvY2tldHMpOw0KICAgICAgICBGRF9TRVQobGlzdGVuaW5nU29jaywgJnNvY2tldHMpOw0KDQogICAgICAgIC8qIGNsZWFuIHVwIGxpc3Qgb2YgY2xpZW50cyAqLw0KICAgICAgICBEUFJJTlRGKCIqIGNsZWFuIHVwIGxpc3Qgb2YgY2xpZW50cyAqXG4iKTsNCiAgICAgICAgY2xpZW50SGVhZCA9IHJlbW92ZU9ic29sZXRlQ2xpZW50cyhjbGllbnRIZWFkLCAmZk9uSG9sZCk7DQogICAgICAgIGNsID0gY2xpZW50SGVhZDsNCg0KICAgICAgICB3aGlsZSAoY2wgIT0gTlVMTCkgew0KICAgICAgICAgICAgaWYgKCAoZk9uSG9sZCA9PSAxKSAmJiAoY2wtPm5Mb2NrID4gMCkgKSB7DQogICAgICAgICAgICAgICAgLy8gT25seSB0aGUgbG9ja2luZyBjbGllbnQgbWF5IGxpc3RlbiBvbiBzb2NrZXQNCiAgICAgICAgICAgICAgICBpZiAoY2wtPnNvY2sgPj0gMCkgew0KICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCJBZGRpbmcgc29ja2V0ICVkIChsaW5lPSVkKVxuIiwgY2wtPnNvY2ssIF9fTElORV9fKTsNCiAgICAgICAgICAgICAgICAgICAgRkRfU0VUKGNsLT5zb2NrLCAmc29ja2V0cyk7DQogICAgICAgICAgICAgICAgICAgIG1heGZkID0gKG1heGZkID4gY2wtPnNvY2spID8gbWF4ZmQgOiBjbC0+c29jazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChmT25Ib2xkID09IDApIHsNCiAgICAgICAgICAgICAgICBpZiAoY2wtPnNvY2sgPj0gMCkgew0KICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCJBZGRpbmcgc29ja2V0ICVkIChsaW5lPSVkKVxuIiwgY2wtPnNvY2ssIF9fTElORV9fKTsNCiAgICAgICAgICAgICAgICAgICAgRkRfU0VUKGNsLT5zb2NrLCAmc29ja2V0cyk7DQogICAgICAgICAgICAgICAgICAgIG1heGZkID0gKG1heGZkID4gY2wtPnNvY2spID8gbWF4ZmQgOiBjbC0+c29jazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjbCA9IGNsLT5uZXh0Ow0KICAgICAgICB9DQoNCiAgICAgICAgLyogd2FpdCBmb3IgbmV3IGNvbm5lY3Rpb25zIG9yIGRhdGEgb24gZXhpc3RpbmcgY29ubmVjdGlvbnMgKi8NCiAgICAgICAgc2VsZWN0KG1heGZkICsgMSwgJnNvY2tldHMsIE5VTEwsIE5VTEwsIE5VTEwpOw0KDQoNCiAgICAgICAgVTggZW1wdHlEYmdJbmZvW10gPSB7TVRZX0RFQlVHX0lORk9STUFUSU9OLCAweDAwLCAweDAwLCAweDAwfTsNCiAgICAgICAgVTggZW1wdHlUZXJtaW5hbEluZm9bXSA9IHtNVFlfVEVSTUlOQUxfSU5GTywgMHgwMCwgMHgwMCwgMHgwMH07DQoNCiAgICAgICAgLyogbG9vayBmb3IgZGF0YSBmcm9tIGNsaWVudHMgKi8NCiAgICAgICAgY2wgPSBjbGllbnRIZWFkOw0KICAgICAgICB3aGlsZSAoIChjbCAhPSBOVUxMKSAmJiAobG9ja1JlcXVlc3RlZCAhPSAxKSAmJiAoZlNlcnZlID09IDEpKSB7DQogICAgICAgICAgICBpZiAoRkRfSVNTRVQoY2wtPnNvY2ssICZzb2NrZXRzKSkgew0KICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKnBEYXRhOw0KICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcGFyYXRvciA9ICI6IjsNCiAgICAgICAgICAgICAgICBpbnQgICAgICAgIG5CeXRlOw0KICAgICAgICAgICAgICAgIGludCAgICAgICAgblBlbmRpbmdEYXRhID0gMDsNCg0KICAgICAgICAgICAgICAgIERQUklOVEYoIiBSZWFkIGNsaWVudCBtZXNzYWdlIGhlYWRlclxuIik7DQogICAgICAgICAgICAgICAgLy8gUmVhZCBjbGllbnQgbWVzc2FnZSBoZWFkZXINCiAgICAgICAgICAgICAgICBuQnl0ZSA9IHJlY3YoY2wtPnNvY2ssIHJjdkJ1ZiwgTVNHX0hFQURFUl9TSVpFLCBNU0dfV0FJVEFMTCk7DQogICAgICAgICAgICAgICAgaWYgKG5CeXRlID09IDApIHsgLyogaWYgc2VsZWN0IG1hcmtzIGRlc2NyaXB0b3IgYXMgcmVhZHksIGJ1dCBubyBkYXRhIGNhbiBiZSByZWFkIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCAqLw0KICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlY2VpdmVkIDAgYnl0ZSBmcm9tIGNsaWVudCAlZCAoTWVzc2FnZSBIZWFkZXIgUGhhc2UpIC5cbiIsIGNsLT5zb2NrKTsNCiAgICAgICAgICAgICAgICAgICAgY2xvc2UoY2wtPnNvY2spOw0KICAgICAgICAgICAgICAgICAgICBjbC0+c29jayA9IC0xOyAvKiBtYXJrIGNsaWVudCBmb3IgZGVsZXRpb24gKi8NCiAgICAgICAgICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5CeXRlID09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIkVycm9yIG9uIHJlYWRpbmc6IGVycm5vOiAlcy5cbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgICAgICAgICAgICAgICAgIGNsLT5zb2NrID0gLTE7IC8qIG1hcmsgY2xpZW50IGZvciBkZWxldGlvbiAqLw0KICAgICAgICAgICAgICAgICAgICBjbCA9IGNsLT5uZXh0Ow0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAobkJ5dGUgPCBNU0dfSEVBREVSX1NJWkUpIHsNCiAgICAgICAgICAgICAgICAgICAgRVBSSU5URigiRXhwZWN0ZWQgdG8gaGFuZGxlIGEgaGVhZGVyIG9mIHNpemUgNC4gQWN0dWFsIHNpemUgPSAlZC4iLCBuQnl0ZSk7DQogICAgICAgICAgICAgICAgICAgIGNsb3NlKGNsLT5zb2NrKTsNCiAgICAgICAgICAgICAgICAgICAgY2wtPnNvY2sgPSAtMTsgLyogbWFyayBjbGllbnQgZm9yIGRlbGV0aW9uICovDQogICAgICAgICAgICAgICAgICAgIGNsID0gY2wtPm5leHQ7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgd2UgcmVjZWl2ZWQgYXQgbGVhc3QgNCBieXRlDQogICAgICAgICAgICAgICAgblBlbmRpbmdEYXRhID0gKChyY3ZCdWZbTE5IX0lEWF0gPDwgOCkgKyByY3ZCdWZbTE5MX0lEWF0pICYgMHgwRkZGRjsNCiAgICAgICAgICAgICAgICBEUFJJTlRGKCJDb21tYW5kIERhdGEgUGF5bG9hZCA9ICVkXG4iLCBuUGVuZGluZ0RhdGEpOw0KDQogICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVtYWluaW5nIGRhdGENCiAgICAgICAgICAgICAgICBpZiAoblBlbmRpbmdEYXRhID4gKE1TR19TSVpFLU1TR19IRUFERVJfU0laRSkpIHsNCiAgICAgICAgICAgICAgICAgICAgRVBSSU5URigicmN2QnVmIHRvIHNtYWxsIHRvIGNvbnRhaW4gaW5jb21pbmcgY29tbWFuZC5cbiIpOw0KICAgICAgICAgICAgICAgICAgICBjbG9zZShjbC0+c29jayk7DQogICAgICAgICAgICAgICAgICAgIGNsLT5zb2NrID0gLTE7IC8qIG1hcmsgY2xpZW50IGZvciBkZWxldGlvbiAqLw0KICAgICAgICAgICAgICAgICAgICBjbCA9IGNsLT5uZXh0Ow0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoblBlbmRpbmdEYXRhID4gMCkgew0KICAgICAgICAgICAgICAgICAgICBuQnl0ZSA9IHJlY3YoY2wtPnNvY2ssICZyY3ZCdWZbTVNHX0hFQURFUl9TSVpFXSwgblBlbmRpbmdEYXRhLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG5CeXRlID09IDApIHsgLyogaWYgc2VsZWN0IG1hcmtzIGRlc2NyaXB0b3IgYXMgcmVhZHksIGJ1dCBubyBkYXRhIGNhbiBiZSByZWFkIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5URigiQ29ubmVjdGlvbiB0byBjbGllbnQgJWQgY2xvc2VkIChQYXlsb2FkIFBoYXNlKS5cbiIsIGNsLT5zb2NrKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGNsLT5zb2NrKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsLT5zb2NrID0gLTE7IC8qIG1hcmsgY2xpZW50IGZvciBkZWxldGlvbiAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5CeXRlID09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlRGKCJFcnJvciBvbiByZWFkaW5nOiBlcnJubzogJXMuXG4iLCBzdHJlcnJvcihlcnJubykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2wtPnNvY2sgPSAtMTsgLyogbWFyayBjbGllbnQgZm9yIGRlbGV0aW9uICovDQogICAgICAgICAgICAgICAgICAgICAgICBjbCA9IGNsLT5uZXh0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobkJ5dGUgPCBuUGVuZGluZ0RhdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIkV4cGVjdGVkIGEgY29tbWFuZCBwYXlsb2FkIG9mICVkLiBBY3R1YWwgc2l6ZSA9ICVkLiIsIG5QZW5kaW5nRGF0YSwgbkJ5dGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoY2wtPnNvY2spOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2wtPnNvY2sgPSAtMTsgLyogbWFyayBjbGllbnQgZm9yIGRlbGV0aW9uICovDQogICAgICAgICAgICAgICAgICAgICAgICBjbCA9IGNsLT5uZXh0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBGUFJJTlRGKCJDb21tYW5kIDB4JTAyWCBmcm9tIGNsaWVudCAlZFxuIiwgcmN2QnVmW01UWV9JRFhdLCBjbC0+c29jayk7DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpbnQgajsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8NCArIG5QZW5kaW5nRGF0YTsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCIweCUwMlg6IiwgcmN2QnVmW2pdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCJcbiIpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHNuZEJ1ZkxlbiA9IHNpemVvZihzbmRCdWYpOw0KDQogICAgICAgICAgICAgICAgLy8gSW50ZXJwcmV0IHRoZSBtZXNzYWdlIGNvbnRhaW5lZCBpbiByY3ZCdWYgKHJjdkJ1ZikNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHJjdkJ1ZltNVFlfSURYXSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2FzZSBNVFlfV0FJVF9GT1JfQ0FSRDoNCiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHJlc2V0DQogICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uT3BlbikNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHJlc2V0IGNhcmQgY29ubmVjdGlvbiBhZ2Fpbi4NCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBBVFIgYXMgcmVjZWl2ZWQgb24gaW5pdGlhbCBjb25uZWN0DQogICAgICAgICAgICAgICAgICAgICAgICBpbnQgaT0wOw0KICAgICAgICAgICAgICAgICAgICAgICAgRlBSSU5URigiQVRSPTB4Iik7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxBdHJMZW47IGkrKykgcHJpbnRmKCIlMDJYLiIsIEF0cltpXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBGUFJJTlRGKCJcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgc25kQnVmTGVuID0gc2l6ZW9mKHNuZEJ1Zik7DQogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNWYWx1ZSA9IGFtUGFja2FnZUFwZHVSZXNwb25zZShNVFlfV0FJVF9GT1JfQ0FSRCwgMHgwMCwgQXRyLCBBdHJMZW4sIHNuZEJ1ZiwgJnNuZEJ1Zkxlbik7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzVmFsdWUgPT0gQU1fT0spDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogT24gRmFpbHVyZSBsb2cNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFUFJJTlRGKCJSZXR1cm5pbmcgQVRSIHRvIEpDU2hlbGwgY2xpZW50IGZhaWxlZFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEVDSEVDSyh3cml0ZShjbC0+c29jaywgc25kQnVmLCBzbmRCdWZMZW4pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uT3BlbiA9IFRSVUU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5URigiQ291bGQgbm90IHBhY2thZ2UgQVBEVSByZXNwb25zZSAoTGluZT0lZCkuXG4iLCBfX0xJTkVfXyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCJFc3RhYmxpc2ggY29ubmVjdGlvbiBhbmQgaXNzdWUgYW4gQVRSLlxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBBdHJMZW4gPSBzaXplb2YoQXRyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RTdGF0dXMgPSBTTV9Db25uZWN0QW0oJmNvbW1TdGF0ZSwgQXRyLCAmQXRyTGVuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0U3RhdHVzICE9IFNXX09LKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFU4IGVyck1zZ1tdID0ge01UWV9XQUlUX0ZPUl9DQVJELCAweDAwLCAweDAwLCAweDAwfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlRGKCJGYWlsZWQgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gU2VjdXJlIE1vZHVsZTogMHglMDRYXG4iLCBjb25uZWN0U3RhdHVzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURUNIRUNLKHdyaXRlKGNsLT5zb2NrLCBlcnJNc2csIHNpemVvZihlcnJNc2cpKSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk9MDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFJJTlRGKCJBVFI9MHgiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxBdHJMZW47IGkrKykgcHJpbnRmKCIlMDJYLiIsIEF0cltpXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBSSU5URigiXG4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRCdWZMZW4gPSBzaXplb2Yoc25kQnVmKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNWYWx1ZSA9IGFtUGFja2FnZUFwZHVSZXNwb25zZShNVFlfV0FJVF9GT1JfQ0FSRCwgMHgwMCwgQXRyLCBBdHJMZW4sIHNuZEJ1ZiwgJnNuZEJ1Zkxlbik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c1ZhbHVlID09IEFNX09LKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogT24gRmFpbHVyZSBsb2cNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVBSSU5URigiUmV0dXJuaW5nIEFUUiB0byBKQ1NoZWxsIGNsaWVudCBmYWlsZWRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURUNIRUNLKHdyaXRlKGNsLT5zb2NrLCBzbmRCdWYsIHNuZEJ1ZkxlbikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uT3BlbiA9IFRSVUU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIkNvdWxkIG5vdCBwYWNrYWdlIEFQRFUgcmVzcG9uc2UgKExpbmU9JWQpLlxuIiwgX19MSU5FX18pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlIE1UWV9BUERVX0RBVEE6DQogICAgICAgICAgICAgICAgICAgIHJlc3BCdWZMZW4gPSBzaXplb2YocmVzcEJ1Zik7DQogICAgICAgICAgICAgICAgICAgIHNlbmRUb0FwcGxldCA9IFRSVUU7DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gVFJBQ0UgUFJJTlQgQkVHSU4NCiAgICAgICAgICAgICAgICAgICAgQVBSSU5URigiMHgiKTsNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Mb29wID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobkxvb3AgPSAwOyBuTG9vcCA8IG5QZW5kaW5nRGF0YTsgbkxvb3ArKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUklOVEYoIiUwMlguIiwgcmN2QnVmW0RBVEFfU1RBUlRfSURYK25Mb29wXSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgQVBSSU5URigiXG4iKTsNCiAgICAgICAgICAgICAgICAgICAgLy8gVFJBQ0UgUFJJTlQgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcGxldFNlbGVjdGVkKQ0KICAgICAgICAgICAgICAgICAgICB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIFU4IGNtZENhcmRtYW5hZ2VyU2VsZWN0W10gPSB7IDB4MDAsIDB4QTQsIDB4MDQsIDB4MDAsIDB4MDAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFU4IHJzcENhcmRtYW5hZ2VyU2VsZWN0W10gPSB7IDB4NkYsIDB4MTAsIDB4ODQsIDB4MDgsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NTEsIDB4MDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHhBNSwgMHgwNCwgMHg5RiwgMHg2NSwgMHgwMSwgMHhGRiwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07DQogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNWYWx1ZSA9IFNXX09LOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzaXplb2YoY21kQ2FyZG1hbmFnZXJTZWxlY3QpID09IG5QZW5kaW5nRGF0YSkgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtY21wKGNtZENhcmRtYW5hZ2VyU2VsZWN0LCAmcmN2QnVmW0RBVEFfU1RBUlRfSURYXSwgblBlbmRpbmdEYXRhKSkgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRUb0FwcGxldCA9IEZBTFNFOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQUklOVEYoIlByZS1jb29rZWQgcmVzcG9uc2UgKHJzcENhcmRtYW5hZ2VyU2VsZWN0KVxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHJlc3BCdWYsIHJzcENhcmRtYW5hZ2VyU2VsZWN0LCBzaXplb2YocnNwQ2FyZG1hbmFnZXJTZWxlY3QpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwQnVmTGVuID0gc2l6ZW9mKHJzcENhcmRtYW5hZ2VyU2VsZWN0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc2l6ZW9mKGNtZFNFMDV4QXBwbGV0U2VsZWN0KSA9PSBuUGVuZGluZ0RhdGEpICYmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lbWNtcChjbWRTRTA1eEFwcGxldFNlbGVjdCwgJnJjdkJ1ZltEQVRBX1NUQVJUX0lEWF0sIG5QZW5kaW5nRGF0YSkpID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kVG9BcHBsZXQgPSBGQUxTRTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFJJTlRGKCJQcmUtY29va2VkIHJlc3BvbnNlIChyc3BBcHBsZXRTZWxlY3QpXG4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocmVzcEJ1ZiwgcnNwQXBwbGV0U2VsZWN0LCByc3BBcHBsZXRTZWxlY3RMZW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BCdWZMZW4gPSByc3BBcHBsZXRTZWxlY3RMZW47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzaXplb2YoY21kU0UwNXhBcHBsZXRTZWxlY3QpID09IG5QZW5kaW5nRGF0YSkgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVtY21wKGNtZFNFMDV4QXBwbGV0U2VsZWN0LCAmcmN2QnVmW0RBVEFfU1RBUlRfSURYXSwgblBlbmRpbmdEYXRhKSkgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRUb0FwcGxldCA9IEZBTFNFOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCAmIEludGVycHJldCByZXN1bHQgb2YgYXBwbGV0IHNlbGVjdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1ZhbHVlID0gU01fU2VuZEFQRFVBbSgmcmN2QnVmW0RBVEFfU1RBUlRfSURYXSwgblBlbmRpbmdEYXRhLCByZXNwQnVmLCAmcmVzcEJ1ZkxlbiwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzVmFsdWUgPT0gU1dfT0spICYmIChyZXNwQnVmTGVuID49IDIpICkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChyZXNwQnVmW3Jlc3BCdWZMZW4tMl0gPT0gMHg5MCkgJiYgKHJlc3BCdWZbcmVzcEJ1Zkxlbi0xXSA9PSAweDAwKSApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwQnVmTGVuIDw9IHNpemVvZihyc3BBcHBsZXRTZWxlY3QpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNwQXBwbGV0U2VsZWN0TGVuID0gcmVzcEJ1ZkxlbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocnNwQXBwbGV0U2VsZWN0LCByZXNwQnVmLCByc3BBcHBsZXRTZWxlY3RMZW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxldFNlbGVjdGVkID0gVFJVRTsNCiNpZiBTU1NfSEFWRV9BNzFDSCB8fCBTU1NfSEFWRV9BNzFDSF9TSU0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcEJ1ZkxlbiA+PSA0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1TdGF0ZS5hcHBsZXRWZXJzaW9uID0gKHJlc3BCdWZbMF0gPDwgOCkgKyByZXNwQnVmWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcEJ1ZkxlbiA9PSA2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tU3RhdGUuc2JWZXJzaW9uID0gKHJlc3BCdWZbMl0gPDwgOCkgKyByZXNwQnVmWzNdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BCdWZMZW4gPT0gNCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbVN0YXRlLnNiVmVyc2lvbiA9IDB4MDAwMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiNlbmRpZiAvLyBTU1NfSEFWRV9BNzFDSCAvIFNTU19IQVZFX0E3MUNMDQojaWYgU1NTX0hBVkVfU0UwNVgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcEJ1ZkxlbiA+PSA2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuMi40IHJldHVybnMgNCBieXRlcywgMi4yLjQuW0EsQixDXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLjMuMCByZXR1cm5zIDUgYnl0ZXMsIDIuMy4wLlt2MV0uW3YyXQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLjUuMyByZXR1cm5zIDcgYnl0ZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1TdGF0ZS5hcHBsZXRWZXJzaW9uID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbVN0YXRlLmFwcGxldFZlcnNpb24gfD0gcmVzcEJ1ZlswXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbVN0YXRlLmFwcGxldFZlcnNpb24gPDw9IDg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1TdGF0ZS5hcHBsZXRWZXJzaW9uIHw9IHJlc3BCdWZbMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1TdGF0ZS5hcHBsZXRWZXJzaW9uIDw8PSA4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tU3RhdGUuYXBwbGV0VmVyc2lvbiB8PSByZXNwQnVmWzJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tU3RhdGUuYXBwbGV0VmVyc2lvbiA8PD0gODsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbVN0YXRlLmFwcGxldFZlcnNpb24gfD0gc2VsZWN0UmVzcG9uc2VEYXRhWzNdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tU3RhdGUuc2JWZXJzaW9uID0gMHgwMDAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5URigiQ2Fubm90IGRldGVybWluZSBhcHBsZXQgdmVyc2lvbi5cbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiNlbmRpZiAvLyBTU1NfSEFWRV9TRTA1WA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmRpdGlvbmFsbHkgZXN0YWJsaXNoIFBsYXRmb3JtIFNDUDAzIHNlc3Npb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFBsYXRmb3JtU0NQMDMgPT0gVFJVRSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNWYWx1ZSA9IFNNX0VzdGFibGlzaFBsYXRmb3JtU0NQMDNBbSgmY29tbVN0YXRlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c1ZhbHVlID09IFNXX09LKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybVNDUDAzX09uID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIkNhbm5vdCBlc3RhYmxpc2ggUGxhdGZvcm0gU0NQMDMuXG4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIkFyZSB0aGUgY29ycmVjdCBwbGF0Zm9ybSBTQ1AwMyBrZXlzIHVzZWQ/LlxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlRGKCIuLi4gUmVxdWVzdGluZyBzZXJ2ZXIgdG8gaGFsdC5cbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kTGluZUFyZ0hlbHAoImFjY2Vzc01hbmFnZXIiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZTZXJ2ZSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZiAoc2VuZFRvQXBwbGV0ID09IFRSVUUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1ZhbHVlID0gU01fU2VuZEFQRFVBbSgmcmN2QnVmW0RBVEFfU1RBUlRfSURYXSwgblBlbmRpbmdEYXRhLCByZXNwQnVmLCAmcmVzcEJ1ZkxlbiwgcGxhdGZvcm1TQ1AwM19Pbik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCAgIChzdGF0dXNWYWx1ZSA9PSBTV19PSykgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICggKHBsYXRmb3JtU0NQMDNfT24gPT0gMSkgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzVmFsdWUgPT0gU1dfQ09ORElUSU9OU19OT1RfU0FUSVNGSUVEKSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzVmFsdWUgPT0gU1dfQ09NTUFORF9OT1RfQUxMT1dFRCkgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c1ZhbHVlID09IFNXX1dST05HX0RBVEEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBzbmRCdWZMZW4gPSBzaXplb2Yoc25kQnVmKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1ZhbHVlID0gYW1QYWNrYWdlQXBkdVJlc3BvbnNlKE1UWV9BUERVX0RBVEEsIDB4MDAsIHJlc3BCdWYsIHJlc3BCdWZMZW4sIHNuZEJ1ZiwgJnNuZEJ1Zkxlbik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIEFQUklOVEYoIkFwZHVSc3A6IDB4Iik7DQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Mb29wID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG5Mb29wID0gMDsgbkxvb3AgPCByZXNwQnVmTGVuOyBuTG9vcCsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUklOVEYoIiUwMlguIiwgcmVzcEJ1ZltuTG9vcF0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIEFQUklOVEYoIlxuIik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXNWYWx1ZSA9PSBBTV9PSykNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURUNIRUNLKHdyaXRlKGNsLT5zb2NrLCBzbmRCdWYsIHNuZEJ1ZkxlbikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIkNvdWxkIG5vdCBwYWNrYWdlIEFQRFUgcmVzcG9uc2UgKExpbmU9JWQpLlxuIiwgX19MSU5FX18pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgVTggc3RhdHVzQXJyYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIlNNX1NlbmRBUERVIGZhaWxlZCB3aXRoIHN0YXR1c1ZhbHVlOiAweCUwNFguXG4iLCBzdGF0dXNWYWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlRGKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNBcnJheVswXSA9IChVOCkoc3RhdHVzVmFsdWUgPDwgOCk7DQogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNBcnJheVsxXSA9IChVOCkoc3RhdHVzVmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgc25kQnVmTGVuID0gc2l6ZW9mKHNuZEJ1Zik7DQogICAgICAgICAgICAgICAgICAgICAgICBhbVBhY2thZ2VBcGR1UmVzcG9uc2UoTVRZX0FQRFVfREFUQSwgMHgwMCwgc3RhdHVzQXJyYXksIDIsIHNuZEJ1ZiwgJnNuZEJ1Zkxlbik7DQogICAgICAgICAgICAgICAgICAgICAgICB3cml0ZShjbC0+c29jaywgc25kQnVmLCBzbmRCdWZMZW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoY2wtPnNvY2spOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2wtPnNvY2sgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsID0gY2wtPm5leHQ7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlIE1UWV9ERUJVR19JTkZPUk1BVElPTjoNCiAgICAgICAgICAgICAgICAgICAgRVBSSU5URigiUmVjZWl2ZWQgYSBkZWJ1ZyBpbmZvIG1lc3NhZ2UuIFJldHVybiBERUJVR19JTkZPIHdpdGhvdXQgZGF0YSBwYXlsb2FkLlxuIik7DQogICAgICAgICAgICAgICAgICAgIFdSSVRFQ0hFQ0sod3JpdGUoY2wtPnNvY2ssIGVtcHR5RGJnSW5mbywgc2l6ZW9mKGVtcHR5RGJnSW5mbykpKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSBNVFlfVEVSTUlOQUxfSU5GTzoNCiAgICAgICAgICAgICAgICAgICAgRVBSSU5URigiUmVjZWl2ZWQgYSB0ZXJtaW5hbCBpbmZvIG1lc3NhZ2UuIFJldHVybiBURVJNSU5BTF9JTkZPIHdpdGhvdXQgZGF0YSBwYXlsb2FkLlxuIik7DQogICAgICAgICAgICAgICAgICAgIFdSSVRFQ0hFQ0sod3JpdGUoY2wtPnNvY2ssIGVtcHR5VGVybWluYWxJbmZvLCBzaXplb2YoZW1wdHlUZXJtaW5hbEluZm8pKSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgTVRZX1NUQVRVUzoNCiAgICAgICAgICAgICAgICBjYXNlIE1UWV9FUlJPUl9NU0c6DQogICAgICAgICAgICAgICAgY2FzZSBNVFlfSU5JVElBTElaQVRJT05fREFUQToNCiAgICAgICAgICAgICAgICBjYXNlIE1UWV9JTkZPUk1BVElPTl9URVhUOg0KICAgICAgICAgICAgICAgICAgICBFUFJJTlRGKCJEb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggTWVzc2FnZSBUeXBlIDB4JTAyWC5cbiIsIHJjdkJ1ZltNVFlfSURYXSk7DQogICAgICAgICAgICAgICAgICAgIGNsb3NlKGNsLT5zb2NrKTsNCiAgICAgICAgICAgICAgICAgICAgY2wtPnNvY2sgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KI2lmZGVmIEFNX0xPQ0tfVU5MT0NLX1NVUFBPUlQNCiAgICAgICAgICAgICAgICBjYXNlIE1UWV9MT0NLOg0KICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGlzdGljIGNvbW1hbmQgdmFsaWRhdGlvbg0KICAgICAgICAgICAgICAgICAgICBpZiAoblBlbmRpbmdEYXRhICE9IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIk5vIGNvbW1hbmQgcGF5bG9hZCBzdXBwb3J0ZWQ6IGNsb3NpbmcgY29ubmVjdGlvbiB3dXRoIGNsaWVudC5cbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBjbGllbnQgZm9yIGRlbGV0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShjbC0+c29jayk7DQogICAgICAgICAgICAgICAgICAgICAgICBjbC0+c29jayA9IC0xOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNsLT5uTG9jayArPSAxOw0KICAgICAgICAgICAgICAgICAgICBmT25Ib2xkID0gMTsNCiAgICAgICAgICAgICAgICAgICAgbG9ja1JlcXVlc3RlZCA9IDE7DQogICAgICAgICAgICAgICAgICAgIHNuZEJ1ZltNVFlfSURYXSA9IE1UWV9MT0NLOw0KICAgICAgICAgICAgICAgICAgICBzbmRCdWZbTkFEX0lEWF0gPSByY3ZCdWZbTkFEX0lEWF07DQogICAgICAgICAgICAgICAgICAgIHNuZEJ1ZltMTkhfSURYXSA9IDB4MDA7DQogICAgICAgICAgICAgICAgICAgIHNuZEJ1ZltMTkxfSURYXSA9IDB4MDA7DQogICAgICAgICAgICAgICAgICAgIHNuZEJ1ZkxlbiA9IDQ7DQogICAgICAgICAgICAgICAgICAgIFdSSVRFQ0hFQ0sod3JpdGUoY2wtPnNvY2ssIHNuZEJ1Ziwgc25kQnVmTGVuKSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgY2FzZSBNVFlfVU5MT0NLOg0KICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGlzdGljIGNvbW1hbmQgdmFsaWRhdGlvbg0KICAgICAgICAgICAgICAgICAgICBpZiAoblBlbmRpbmdEYXRhICE9IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIk5vIGNvbW1hbmQgcGF5bG9hZCBzdXBwb3J0ZWQ6IGNsb3NpbmcgY29ubmVjdGlvbiB3dXRoIGNsaWVudC5cbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBjbGllbnQgZm9yIGRlbGV0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShjbC0+c29jayk7DQogICAgICAgICAgICAgICAgICAgICAgICBjbC0+c29jayA9IC0xOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNsLT5uTG9jayAtPSAxOw0KICAgICAgICAgICAgICAgICAgICBpZiAoY2wtPm5Mb2NrIDw9IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZPbkhvbGQgPSAwOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHNuZEJ1ZltNVFlfSURYXSA9IE1UWV9VTkxPQ0s7DQogICAgICAgICAgICAgICAgICAgIHNuZEJ1ZltOQURfSURYXSA9IHJjdkJ1ZltOQURfSURYXTsNCiAgICAgICAgICAgICAgICAgICAgc25kQnVmW0xOSF9JRFhdID0gMHgwMDsNCiAgICAgICAgICAgICAgICAgICAgc25kQnVmW0xOTF9JRFhdID0gMHgwMDsNCiAgICAgICAgICAgICAgICAgICAgc25kQnVmTGVuID0gNDsNCiAgICAgICAgICAgICAgICAgICAgV1JJVEVDSEVDSyh3cml0ZShjbC0+c29jaywgc25kQnVmLCBzbmRCdWZMZW4pKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQojZW5kaWYgLy8gQU1fTE9DS19VTkxPQ0tfU1VQUE9SVA0KDQojaWZuZGVmIE5ERUJVRw0KICAgICAgICAgICAgICAgIGNhc2UgTVRZX1FVSVQ6DQogICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsaXN0aWMgY29tbWFuZCB2YWxpZGF0aW9uDQogICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIkdPVCBRVUlUIFJFUSBGUk9NIENMSUVOVFxuIik7DQogICAgICAgICAgICAgICAgICAgIGZTZXJ2ZSA9IDA7DQogICAgICAgICAgICAgICAgICAgIHNuZEJ1ZltNVFlfSURYXSA9IE1UWV9RVUlUOw0KICAgICAgICAgICAgICAgICAgICBzbmRCdWZbTkFEX0lEWF0gPSByY3ZCdWZbTkFEX0lEWF07DQogICAgICAgICAgICAgICAgICAgIHNuZEJ1ZltMTkhfSURYXSA9IDB4MDA7DQogICAgICAgICAgICAgICAgICAgIHNuZEJ1ZltMTkxfSURYXSA9IDB4MDA7DQogICAgICAgICAgICAgICAgICAgIHNuZEJ1ZkxlbiA9IDQ7DQogICAgICAgICAgICAgICAgICAgIFdSSVRFQ0hFQ0sod3JpdGUoY2wtPnNvY2ssIHNuZEJ1Ziwgc25kQnVmTGVuKSk7DQogICAgICAgICAgICAgICAgICAgIFNNX0Nsb3NlQW0oMCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KI2VuZGlmDQojaWYgMA0KICAgICAgICAgICAgICAgIGNhc2UgTVRZX1NFVF9VSU5UMzI6DQogICAgICAgICAgICAgICAgICAgIG5TdGF0dXMgPSBoYW5kbGVTZXRVaW50MzIocmN2QnVmLCA0ICsgblBlbmRpbmdEYXRhLCBzbmRCdWYsICZzbmRCdWZMZW4pOw0KICAgICAgICAgICAgICAgICAgICBpZiAoblN0YXR1cyAhPSBNQ1NfT0spIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgY2xpZW50IGZvciBkZWxldGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgY2wtPnNvY2sgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsID0gY2wtPm5leHQ7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBXUklURUNIRUNLKHdyaXRlKGNsLT5zb2NrLCBzbmRCdWYsIHNuZEJ1ZkxlbikpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgIGNhc2UgTVRZX0dFVF9VSU5UMzI6DQogICAgICAgICAgICAgICAgICAgIG5TdGF0dXMgPSBoYW5kbGVHZXRVaW50MzIocmN2QnVmLCA0ICsgblBlbmRpbmdEYXRhLCBzbmRCdWYsICZzbmRCdWZMZW4pOw0KICAgICAgICAgICAgICAgICAgICBpZiAoblN0YXR1cyAhPSBNQ1NfT0spIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgY2xpZW50IGZvciBkZWxldGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgY2wtPnNvY2sgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsID0gY2wtPm5leHQ7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBXUklURUNIRUNLKHdyaXRlKGNsLT5zb2NrLCBzbmRCdWYsIHNuZEJ1ZkxlbikpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiNlbmRpZg0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIEVQUklOVEYoIkRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aCBNZXNzYWdlIFR5cGUgMHglMDJYLlxuIiwgcmN2QnVmWzBdKTsNCiAgICAgICAgICAgICAgICAgICAgY2xvc2UoY2wtPnNvY2spOw0KICAgICAgICAgICAgICAgICAgICBjbC0+c29jayA9IC0xOw0KICAgICAgICAgICAgICAgICAgICBjbCA9IGNsLT5uZXh0Ow0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qIGhhbmRsZSBuZXcgY2xpZW50IGNvbm5lY3Rpb25zLCBpZiBhdmFpbGFibGUgKi8NCiAgICAgICAgaWYgKEZEX0lTU0VUKGxpc3RlbmluZ1NvY2ssICZzb2NrZXRzKSkgew0KICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIG5ld0NsaWVudDsNCiAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBuZXdDbGllbnRGZDsNCiAgICAgICAgICAgIHNvY2tsZW5fdCAgICAgICAgICBuZXdDbGllbnRMZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsNCg0KICAgICAgICAgICAgbmV3Q2xpZW50RmQgPSBhY2NlcHQobGlzdGVuaW5nU29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbmV3Q2xpZW50LCAmbmV3Q2xpZW50TGVuKTsNCiAgICAgICAgICAgIGlmIChuZXdDbGllbnRGZCA8IDApIHsNCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFjY2VwdCgpIGZhaWxlZC5cbiIpOw0KICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjbGllbnRIZWFkID0gYWRkQ2xpZW50KGNsaWVudEhlYWQsIG5ld0NsaWVudEZkKTsgIC8qIGFkZCBjbGllbnQgdG8gbGlzdCAqLw0KICAgICAgICAgICAgRlBSSU5URigiTmV3IGNsaWVudCBjb25uZWN0aW9uIGZyb20gJWQuJWQuJWQuJWQuIENsaWVudCBJRDogJWRcbiIsDQogICAgICAgICAgICAgICAgKG5ld0NsaWVudC5zaW5fYWRkci5zX2FkZHIgPj4gMCkgJiAweDAwMDAwMGZmLA0KICAgICAgICAgICAgICAgIChuZXdDbGllbnQuc2luX2FkZHIuc19hZGRyID4+IDgpICYgMHgwMDAwMDBmZiwNCiAgICAgICAgICAgICAgICAobmV3Q2xpZW50LnNpbl9hZGRyLnNfYWRkciA+PiAxNikgJiAweDAwMDAwMGZmLA0KICAgICAgICAgICAgICAgIChuZXdDbGllbnQuc2luX2FkZHIuc19hZGRyID4+IDI0KSAmIDB4MDAwMDAwZmYsDQogICAgICAgICAgICAgICAgbmV3Q2xpZW50RmQpOw0KDQogICAgICAgIH0NCiAgICB9DQogICAgRlBSSU5URigiU3RvcHBpbmcgc2VydmVyIG1haW4gcHJvZ3JhbSAoUmV2LiVkLiVkKS5cbiIsIEFDQ0VTU19NR1JfVkVSU0lPTl9NQUpPUiwgQUNDRVNTX01HUl9WRVJTSU9OX01JTk9SKTsNCiAgICByZXR1cm4gMDsNCn0NCg0KDQpjbGllbnRfdCogYWRkQ2xpZW50KGNsaWVudF90ICpoZWFkLCBpbnQgc29jaykNCnsNCiAgICBjbGllbnRfdCAqY2xpZW50ID0gaGVhZDsNCiAgICBjbGllbnRfdCAqbmV3Q2xpZW50Ow0KDQogICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgY2xpZW50ICovDQogICAgbmV3Q2xpZW50ID0gKGNsaWVudF90KiltYWxsb2Moc2l6ZW9mKGNsaWVudF90KSk7DQogICAgaWYgKG5ld0NsaWVudCA9PSBOVUxMKSB7DQogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGFkZCBjbGllbnQ7IG5vdCBlbm91Z2ggbWVtb3J5IVxuIik7DQogICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsNCiAgICB9DQoNCiAgICAvKiBpbml0aWFsaXplIGNsaWVudCBzdHJ1Y3R1cmUgKi8NCiAgICBtZW1zZXQobmV3Q2xpZW50LCAweDAwLCBzaXplb2YoY2xpZW50X3QpKTsNCiAgICBuZXdDbGllbnQtPnNvY2sgPSBzb2NrOw0KICAgIG5ld0NsaWVudC0+bkxvY2sgPSAwOw0KICAgIG5ld0NsaWVudC0+bmV4dCA9IE5VTEw7DQoNCiAgICAvKiBpZiBsaXN0IGlzIGVtcHR5ICovDQogICAgaWYgKGhlYWQgPT0gTlVMTCkNCiAgICAgICAgcmV0dXJuIG5ld0NsaWVudDsNCg0KICAgIC8qIHJ1biB0byBlbmQgb2YgbGlzdCAqLw0KICAgIHdoaWxlIChjbGllbnQtPm5leHQgIT0gTlVMTCkNCiAgICAgICAgY2xpZW50ID0gY2xpZW50LT5uZXh0Ow0KDQogICAgLyogcHV0IGNsaWVudCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0ICovDQogICAgY2xpZW50LT5uZXh0ID0gbmV3Q2xpZW50Ow0KDQogICAgcmV0dXJuIGhlYWQ7DQp9DQoNCmNsaWVudF90KiByZW1vdmVPYnNvbGV0ZUNsaWVudHMoY2xpZW50X3QgKmhlYWQsIGludCAqZk9uSG9sZCkNCnsNCiAgICBjbGllbnRfdCAqcHJldkNsaWVudCwgKmNsaWVudDsNCg0KICAgIHdoaWxlIChoZWFkICE9IE5VTEwgJiYgaGVhZC0+c29jayA8IDApIHsNCiAgICAgICAgY2xpZW50X3QgKmNsID0gaGVhZDsNCg0KICAgICAgICBoZWFkID0gaGVhZC0+bmV4dDsNCiAgICAgICAgaWYgKGNsLT5uTG9jayA+IDApIHsNCiAgICAgICAgICAgICpmT25Ib2xkID0gMDsNCiAgICAgICAgfQ0KICAgICAgICBmcmVlKGNsKTsNCiAgICB9DQoNCiAgICBpZiAoaGVhZCA9PSBOVUxMKSB7IC8vIGlmIGxpc3QgaXMgZW1wdHksIHJldHVybg0KICAgICAgICByZXR1cm4gaGVhZDsNCiAgICB9DQoNCiAgICBjbGllbnQgPSBoZWFkLT5uZXh0Ow0KICAgIHByZXZDbGllbnQgPSBoZWFkOw0KICAgIHdoaWxlIChjbGllbnQgIT0gTlVMTCkgew0KICAgICAgICBpZiAoY2xpZW50LT5zb2NrIDwgMCkgew0KICAgICAgICAgICAgcHJldkNsaWVudC0+bmV4dCA9IGNsaWVudC0+bmV4dDsNCiAgICAgICAgICAgIGlmIChjbGllbnQtPm5Mb2NrID4gMCkgew0KICAgICAgICAgICAgICAgICpmT25Ib2xkID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZyZWUoY2xpZW50KTsNCiAgICAgICAgICAgIGNsaWVudCA9IHByZXZDbGllbnQ7DQogICAgICAgIH0NCiAgICAgICAgcHJldkNsaWVudCA9IGNsaWVudDsNCiAgICAgICAgY2xpZW50ID0gY2xpZW50LT5uZXh0Ow0KICAgIH0NCg0KICAgIHJldHVybiBoZWFkOw0KfQ0KDQoNCnN0YXRpYyBpbnQgY21kTGluZVBhcnNpbmcoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBib29sICpyZXF1ZXN0UGxhdGZvcm1TQ1AwMywgYm9vbCAqcmVxdWVzdEFueUFkZHJlc3NCaW5kaW5nKSB7DQogICAgaW50IG5TdGF0dXMgPSAtMTsNCg0KICAgIGlmIChhcmdjID09IDEpIHsNCiAgICAgICAgLy8gS2VlcCBkZWZhdWx0IHZhbHVlcw0KICAgICAgICBuU3RhdHVzID0gMDsNCiAgICB9DQogICAgZWxzZSBpZiAoYXJnYyA+PSAyKSB7DQogICAgICAgIGlmIChhcmdjID09IDIpIHsNCiAgICAgICAgICAgIGlmICggc3RybmNtcChhcmd2WzFdLCAicGxhaW4iLCBzdHJsZW4oInBsYWluIikpID09IDAgKSB7DQogICAgICAgICAgICAgICAgKnJlcXVlc3RQbGF0Zm9ybVNDUDAzID0gRkFMU0U7DQogICAgICAgICAgICAgICAgblN0YXR1cyA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICggc3RybmNtcChhcmd2WzFdLCAiYW55Iiwgc3RybGVuKCJhbnkiKSkgPT0gMCApIHsNCiAgICAgICAgICAgICAgICAqcmVxdWVzdEFueUFkZHJlc3NCaW5kaW5nID0gVFJVRTsNCiAgICAgICAgICAgICAgICBuU3RhdHVzID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoYXJnYyA9PSAzKSB7DQogICAgICAgICAgICBpZiAoKHN0cm5jbXAoYXJndlsxXSwgInBsYWluIiwgc3RybGVuKCJwbGFpbiIpKSA9PSAwKSAmJiAoc3RybmNtcChhcmd2WzJdLCAiYW55Iiwgc3RybGVuKCJhbnkiKSkgPT0gMCkpIHsNCiAgICAgICAgICAgICAgICAqcmVxdWVzdFBsYXRmb3JtU0NQMDMgPSBGQUxTRTsNCiAgICAgICAgICAgICAgICAqcmVxdWVzdEFueUFkZHJlc3NCaW5kaW5nID0gVFJVRTsNCiAgICAgICAgICAgICAgICBuU3RhdHVzID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKChzdHJuY21wKGFyZ3ZbMV0sICJhbnkiLCBzdHJsZW4oImFueSIpKSA9PSAwKSAmJiAoc3RybmNtcChhcmd2WzJdLCAicGxhaW4iLCBzdHJsZW4oInBsYWluIikpID09IDApKSB7DQogICAgICAgICAgICAgICAgKnJlcXVlc3RQbGF0Zm9ybVNDUDAzID0gRkFMU0U7DQogICAgICAgICAgICAgICAgKnJlcXVlc3RBbnlBZGRyZXNzQmluZGluZyA9IFRSVUU7DQogICAgICAgICAgICAgICAgblN0YXR1cyA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIG5TdGF0dXM7DQp9DQoNCnN0YXRpYyB2b2lkIGNtZExpbmVBcmdIZWxwKGNoYXIgKnN6UHJvZ05hbWUpIHsNCiAgICBFUFJJTlRGKCIlcyB0YWtlcyB0d28gb3B0aW9uYWwgYXJndW1lbnRzICdwbGFpbicgJiAnYW55J1xuIiwgc3pQcm9nTmFtZSk7DQogICAgRVBSSU5URigiXHQnJXMnOlxuIiwgc3pQcm9nTmFtZSk7DQogICAgRVBSSU5URigiXHRcdFBsYXRmb3JtIFNDUDAzOiBPTi5cbiIpOw0KICAgIEVQUklOVEYoIlx0XHRJbmNvbWluZyBjb25uZWN0aW9uOiBsb2NhbGhvc3QuXG4iKTsNCiAgICBFUFJJTlRGKCJcdCclcyBwbGFpbic6XG4iLCBzelByb2dOYW1lKTsNCiAgICBFUFJJTlRGKCJcdFx0UGxhdGZvcm0gU0NQMDM6IE9GRi5cbiIpOw0KICAgIEVQUklOVEYoIlx0XHRJbmNvbWluZyBjb25uZWN0aW9uOiBsb2NhbGhvc3QuXG4iKTsNCiAgICBFUFJJTlRGKCJcdCclcyBhbnknOlxuIiwgc3pQcm9nTmFtZSk7DQogICAgRVBSSU5URigiXHRcdFBsYXRmb3JtIFNDUDAzOiBPTi5cbiIpOw0KICAgIEVQUklOVEYoIlx0XHRJbmNvbWluZyBjb25uZWN0aW9uOiBhbnkgc3VwcG9ydGVkIGFkZHJlc3MuXG4iKTsNCiAgICBFUFJJTlRGKCJcdCclcyBwbGFpbiBhbnknOlxuIiwgc3pQcm9nTmFtZSk7DQogICAgRVBSSU5URigiXHRcdFBsYXRmb3JtIFNDUDAzOiBPRkYuXG4iKTsNCiAgICBFUFJJTlRGKCJcdFx0SW5jb21pbmcgY29ubmVjdGlvbjogYW55IHN1cHBvcnRlZCBhZGRyZXNzLlxuIik7DQogICAgRVBSSU5URigiXG4iKTsNCiAgICBFUFJJTlRGKCJOb3RlOlxuIik7DQogICAgRVBSSU5URigiXHRQcm9kdWN0IERlcGxveW1lbnQgPT4gRW5hYmxlIFBsYXRmb3JtIFNDUDAzICYgcmVzdHJpY3QgaW5jb21pbmcgY29ubmVjdGlvbiB0byBsb2NhbGhvc3RcbiIpOw0KfQ==