[ruby-dev:35798] iso-2022-jp implementation
From:
Tanaka Akira <akr@...>
Date:
2008-08-07 12:32:08 UTC
List:
ruby-dev #35798
SVNPLTIwMjItSlAggsyOwJGVgsWCt4KqgUEweDFlIIKqIHNoaWZ0IIK+gsaCooLBgsSC3YK9guiB QQ0KDQolIC4vcnVieSAtdmUgJ3AgIlx4MWUiLmVuY29kZSgiZXVjLWpwIiwgImlzby0yMDIyLWpw IiknDQpydWJ5IDEuOS4wICgyMDA4LTA4LTA3IHJldmlzaW9uIDE4NDE2KSBbaTY4Ni1saW51eF0N Ci1lOjE6aW4gYGVuY29kZSc6IHNoaWZ0IGlzIG5vdCBzdXBwb3J0ZWQgKFJ1bnRpbWVFcnJvcikN CiAgICAgICAgZnJvbSAtZToxOmluIGA8bWFpbj4nDQoNCjppbnZhbGlkPT46cmVwbGFjZSwgOnVu ZGVmPT46cmVwbGFjZSCCzJe8lfuC8I53kuiCtYLEguCX4YpPgqqPb4K9guiBQQ0KDQolIC4vcnVi eSAtZSAncCAiXGUoWCIuZW5jb2RlKCJFVUMtSlAiLCAiSVNPLTIwMjItSlAiLCA6aW52YWxpZD0+ OnJlcGxhY2UsIDp1bmRlZj0+OnJlcGxhY2UpJw0KLWU6MTppbiBgZW5jb2RlJzogdGhpcyBtb2Rl IGlzIG5vdCBzdXBwb3J0ZWQgKEVTQyAoIFgpIChSdW50aW1lRXJyb3IpDQogICAgICAgIGZyb20g LWU6MTppbiBgPG1haW4+Jw0KDQqDR4OJgVuDgYNig1qBW4NXgskgTlVMIIKqk/yCwYK9guiBQQ0K DQolIC4vcnVieSAtZSAncCAiXGUiLmVuY29kZSgiRVVDLUpQIiwgIklTTy0yMDIyLUpQIiknfCYg Y2F0IC12IA0KLWU6MTppbiBgZW5jb2RlJzogdGhpcyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgKEVT QyBeQCkgKFJ1bnRpbWVFcnJvcikNCiAgICAgICAgZnJvbSAtZToxOmluIGA8bWFpbj4nDQoNCi0x IGJ5dGVzIGxlZnQggsaCooKkifaCtYKig4GDYoNagVuDV4Kqj2+CvYLogUENCg0KJSAuL3J1Ynkg LWUgJ3AgIlxlJChEYSIuZW5jb2RlKCJFVUMtSlAiLCAiSVNPLTIwMjItSlAiKScgDQotZToxOmlu IGBlbmNvZGUnOiBub3QgZnVsbHkgY29udmVydGVkLCAtMSBieXRlcyBsZWZ0IChBcmd1bWVudEVy cm9yKQ0KICAgICAgICBmcm9tIC1lOjE6aW4gYDxtYWluPicNCg0KgreC6YLMgsWBQY3sguiCyIKo grWCxIjIibqCzILmgqSCyYK3gumCzILNgseCpILFgrWC5YKkgqmBQg0KDQpJbmRleDogZW5jL3Ry YW5zL2lzbzIwMjIuZXJiLmMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBlbmMvdHJhbnMvaXNvMjAyMi5lcmIu YwkocmV2aXNpb24gMCkNCisrKyBlbmMvdHJhbnMvaXNvMjAyMi5lcmIuYwkocmV2aXNpb24gMCkN CkBAIC0wLDAgKzEsMTQyIEBADQorI2luY2x1ZGUgInRyYW5zY29kZV9kYXRhLmgiDQorDQorPCUN CisgIG1hcCA9IHt9DQorICBtYXBbIjFiMjg0MiJdID0gOmZ1bmNfc28gICAgICAgIyBkZXNpZ25h dGUgVVMtQVNDSUkgdG8gRzAuICAgICAgICAgICAgICJFU0MgKCBCIg0KKyAgbWFwWyIxYjI4NGEi XSA9IDpmdW5jX3NvICAgICAgICMgZGVzaWduYXRlIEpJUyBYIDAyMDEgbGF0aW4gdG8gRzAuICAg ICAiRVNDICggSiINCisgIG1hcFsiMWIyNDQwIl0gPSA6ZnVuY19zbyAgICAgICAjIGRlc2lnbmF0 ZSBKSVMgWCAwMjA4IDE5NzggdG8gRzAuICAgICAgIkVTQyAkIEAiDQorICBtYXBbIjFiMjQ0MiJd ID0gOmZ1bmNfc28gICAgICAgIyBkZXNpZ25hdGUgSklTIFggMDIwOCAxOTgzIHRvIEcwLiAgICAg ICJFU0MgJCBCIg0KKyAgbWFwWyJ7MDAtMGQsMTAtMWEsMWMtN2Z9Il0gPSA6ZnVuY19zaQ0KKw0K KyAgbWFwX2ppc3gwMjA4X3Jlc3QgPSB7fQ0KKyAgbWFwX2ppc3gwMjA4X3Jlc3RbInsyMS03ZX0i XSA9IDpmdW5jX3NvDQorJT4NCisNCis8JT0gdHJhbnNjb2RlX2dlbmVyYXRlX25vZGUoQWN0aW9u TWFwLnBhcnNlKG1hcCksICJpc28yMDIyanBfdG9fZXVjanAiLCBbXSkgJT4NCis8JT0gdHJhbnNj b2RlX2dlbmVyYXRlX25vZGUoQWN0aW9uTWFwLnBhcnNlKG1hcF9qaXN4MDIwOF9yZXN0KSwgImlz bzIwMjJqcF90b19ldWNqcF9qaXN4MDIwOF9yZXN0IiwgW10pICU+DQorDQorc3RhdGljIFZBTFVF DQorZnVuX3NpX2lzbzIwMjJqcF90b19ldWNqcChyYl90cmFuc2NvZGluZyogdCwgY29uc3QgdW5z aWduZWQgY2hhciogcywgc2l6ZV90IGwpDQorew0KKyAgICBpZiAodC0+c3RhdGVmdWxbMF0gPT0g MCkNCisgICAgICAgIHJldHVybiAoVkFMVUUpTk9NQVA7DQorICAgIGVsc2UgaWYgKDB4MjEgPD0g c1swXSAmJiBzWzBdIDw9IDB4N2UpDQorICAgICAgICByZXR1cm4gKFZBTFVFKSZpc28yMDIyanBf dG9fZXVjanBfamlzeDAyMDhfcmVzdDsNCisgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIChWQUxV RSlJTlZBTElEOw0KK30NCisNCitzdGF0aWMgaW50DQorZnVuX3NvX2lzbzIwMjJqcF90b19ldWNq cChyYl90cmFuc2NvZGluZyogdCwgY29uc3QgdW5zaWduZWQgY2hhciogcywgc2l6ZV90IGwsIHVu c2lnbmVkIGNoYXIqIG8pDQorew0KKyAgICBpZiAoc1swXSA9PSAweDFiKSB7DQorICAgICAgICBp ZiAoc1sxXSA9PSAnKCcpIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHNbbC0xXSkgew0KKyAgICAg ICAgICAgICAgY2FzZSAnQic6DQorICAgICAgICAgICAgICBjYXNlICdKJzoNCisgICAgICAgICAg ICAgICAgdC0+c3RhdGVmdWxbMF0gPSAwOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAg ICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBzd2l0 Y2ggKHNbbC0xXSkgew0KKyAgICAgICAgICAgICAgY2FzZSAnQCc6DQorICAgICAgICAgICAgICBj YXNlICdCJzoNCisgICAgICAgICAgICAgICAgdC0+c3RhdGVmdWxbMF0gPSAxOw0KKyAgICAgICAg ICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1 cm4gMDsNCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICAgIG9bMF0gPSBzWzBdIHwgMHg4MDsN CisgICAgICAgIG9bMV0gPSBzWzFdIHwgMHg4MDsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICB9 DQorfQ0KKw0KK3N0YXRpYyBjb25zdCByYl90cmFuc2NvZGVyDQorcmJfSVNPXzIwMjJfSlBfdG9f RVVDX0pQID0gew0KKyAgICAiSVNPLTIwMjItSlAiLCAiRVVDLUpQIiwgJmlzbzIwMjJqcF90b19l dWNqcCwgMywgMCwNCisgICAgTlVMTCwgZnVuX3NpX2lzbzIwMjJqcF90b19ldWNqcCwgTlVMTCwg ZnVuX3NvX2lzbzIwMjJqcF90b19ldWNqcA0KK307DQorDQorPCUNCisgIG1hcF9ldWNqcCA9IHsN CisgICAgInswZSwwZiwxYn0iID0+IDp1bmRlZiwNCisgICAgInswMC0wZCwxMC0xYSwxYy03Zn0i ID0+IDpmdW5jX3NvLA0KKyAgICAie2ExLWZlfXthMS1mZX0iID0+IDpmdW5jX3NvLA0KKyAgICAi OGV7YTEtZmV9IiA9PiA6dW5kZWYsDQorICAgICI4ZnthMS1mZX17YTEtZmV9IiA9PiA6dW5kZWYs DQorICB9DQorJT4NCisNCis8JT0gdHJhbnNjb2RlX2dlbmVyYXRlX25vZGUoQWN0aW9uTWFwLnBh cnNlKG1hcF9ldWNqcCksICJldWNqcF90b19pc28yMDIyanAiLCBbXSkgJT4NCisNCitzdGF0aWMg aW50DQorZnVuX3NvX2V1Y2pwX3RvX2lzbzIwMjJqcChyYl90cmFuc2NvZGluZyAqdCwgY29uc3Qg dW5zaWduZWQgY2hhciAqcywgc2l6ZV90IGwsIHVuc2lnbmVkIGNoYXIgKm8pDQorew0KKyAgICB1 bnNpZ25lZCBjaGFyICpvdXRwdXQwID0gbzsNCisNCisgICAgaWYgKHQtPnN0YXRlZnVsWzBdID09 IDApIHsNCisgICAgICAgIHQtPnN0YXRlZnVsWzBdID0gMTsgLyogaW5pdGlhbGl6ZWQgZmxhZyAq Lw0KKyAgICAgICAgdC0+c3RhdGVmdWxbMV0gPSAxOyAvKiBBU0NJSSBtb2RlICovDQorICAgIH0N CisNCisgICAgaWYgKGwgIT0gdC0+c3RhdGVmdWxbMV0pIHsNCisgICAgICAgIGlmIChsID09IDEp IHsNCisgICAgICAgICAgICAqbysrID0gMHgxYjsNCisgICAgICAgICAgICAqbysrID0gJygnOw0K KyAgICAgICAgICAgICpvKysgPSAnQic7DQorICAgICAgICAgICAgdC0+c3RhdGVmdWxbMV0gPSAx Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgKm8rKyA9IDB4MWI7 DQorICAgICAgICAgICAgKm8rKyA9ICckJzsNCisgICAgICAgICAgICAqbysrID0gJ0InOw0KKyAg ICAgICAgICAgIHQtPnN0YXRlZnVsWzFdID0gMjsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAg ICBpZiAobCA9PSAxKSB7DQorICAgICAgICAqbysrID0gc1swXSAmIDB4N2Y7DQorICAgIH0NCisg ICAgZWxzZSB7DQorICAgICAgICAqbysrID0gc1swXSAmIDB4N2Y7DQorICAgICAgICAqbysrID0g c1sxXSAmIDB4N2Y7DQorICAgIH0NCisNCisgICAgcmV0dXJuIG8gLSBvdXRwdXQwOw0KK30NCisN CitzdGF0aWMgaW50DQorZmluaXNoX2V1Y2pwX3RvX2lzbzIwMjJqcChyYl90cmFuc2NvZGluZyAq dCwgdW5zaWduZWQgY2hhciAqbykNCit7DQorICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dDAgPSBv Ow0KKw0KKyAgICBpZiAodC0+c3RhdGVmdWxbMF0gPT0gMCkNCisgICAgICAgIHJldHVybiAwOw0K Kw0KKyAgICBpZiAodC0+c3RhdGVmdWxbMV0gIT0gMSkgew0KKyAgICAgICAgKm8rKyA9IDB4MWI7 DQorICAgICAgICAqbysrID0gJygnOw0KKyAgICAgICAgKm8rKyA9ICdCJzsNCisgICAgICAgIHQt PnN0YXRlZnVsWzFdID0gMTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gbyAtIG91dHB1dDA7DQor fQ0KKw0KK3N0YXRpYyBjb25zdCByYl90cmFuc2NvZGVyDQorcmJfRVVDX0pQX3RvX0lTT18yMDIy X0pQID0gew0KKyAgICAiRVVDLUpQIiwgIklTTy0yMDIyLUpQIiwgJmV1Y2pwX3RvX2lzbzIwMjJq cCwgNSwgMCwNCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgZnVuX3NvX2V1Y2pwX3RvX2lzbzIwMjJq cCwgZmluaXNoX2V1Y2pwX3RvX2lzbzIwMjJqcA0KK307DQorDQordm9pZA0KK0luaXRfaXNvMjAy Mih2b2lkKQ0KK3sNCisgICAgcmJfcmVnaXN0ZXJfdHJhbnNjb2RlcigmcmJfSVNPXzIwMjJfSlBf dG9fRVVDX0pQKTsNCisgICAgcmJfcmVnaXN0ZXJfdHJhbnNjb2RlcigmcmJfRVVDX0pQX3RvX0lT T18yMDIyX0pQKTsNCit9DQorDQpJbmRleDogZW5jL3RyYW5zL2phcGFuZXNlLmVyYi5jDQo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09DQotLS0gZW5jL3RyYW5zL2phcGFuZXNlLmVyYi5jCShyZXZpc2lvbiAxODQxNykNCisr KyBlbmMvdHJhbnMvamFwYW5lc2UuZXJiLmMJKHdvcmtpbmcgY29weSkNCkBAIC0xNywyMzUgKzE3 LDggQEANCiA8JT0gdHJhbnNjb2RlX3RibGdlbiAiVVRGLTgiLCAiRVVDLUpQIiwgW1siezAwLTdm fSIsIDpub21hcF0sICpVQ1NfVE9fRVVDSlBfVEJMXSAlPg0KIDwlPSB0cmFuc2NvZGVfdGJsZ2Vu ICJVVEYtOCIsICJDUDUxOTMyIiwgW1siezAwLTdmfSIsIDpub21hcF0sICpVQ1NfVE9fRVVDSlBf VEJMXSAlPg0KIA0KLSNkZWZpbmUgSVNPXzIwMjJfRU5DT0RJTkcoZXNjc2VxLCBieXRlKSAoKGVz Y3NlcTw8OCl8Ynl0ZSkNCi1lbnVtIElTT18yMDIyX0VTQ1NFUSB7DQotICAgIElTT18yMDIyX0Na RCAgID0gJyEnLA0KLSAgICBJU09fMjAyMl9DMUQgICA9ICciJywNCi0gICAgSVNPXzIwMjJfR1pE NCAgPSAnKCcsDQotICAgIElTT18yMDIyX0cxRDQgID0gJyknLA0KLSAgICBJU09fMjAyMl9HMkQ0 ICA9ICcqJywNCi0gICAgSVNPXzIwMjJfRzNENCAgPSAnKycsDQotICAgIElTT18yMDIyX0cxRDYg ID0gJy0nLA0KLSAgICBJU09fMjAyMl9HMkQ2ICA9ICcuJywNCi0gICAgSVNPXzIwMjJfRzNENiAg PSAnLycsDQotICAgIElTT18yMDIyX0daRE00ID0gSVNPXzIwMjJfRU5DT0RJTkcoJyQnLCcoJyks DQotICAgIElTT18yMDIyX0cxRE00ID0gSVNPXzIwMjJfRU5DT0RJTkcoJyQnLCcpJyksDQotICAg IElTT18yMDIyX0cyRE00ID0gSVNPXzIwMjJfRU5DT0RJTkcoJyQnLCcqJyksDQotICAgIElTT18y MDIyX0czRE00ID0gSVNPXzIwMjJfRU5DT0RJTkcoJyQnLCcrJyksDQotICAgIElTT18yMDIyX0cx RE02ID0gSVNPXzIwMjJfRU5DT0RJTkcoJyQnLCctJyksDQotICAgIElTT18yMDIyX0cyRE02ID0g SVNPXzIwMjJfRU5DT0RJTkcoJyQnLCcuJyksDQotICAgIElTT18yMDIyX0czRE02ID0gSVNPXzIw MjJfRU5DT0RJTkcoJyQnLCcvJyksDQotICAgIElTT18yMDIyX0RPQ1MgID0gSVNPXzIwMjJfRU5D T0RJTkcoJyUnLCdJJyksDQotICAgIElTT18yMDIyX0lSUiAgID0gJyYnDQotfTsNCi0NCi0NCi0j ZGVmaW5lIElTT18yMDIyX0daX0FTQ0lJICAgICAgICAgICAgICAgICAgICAgICBJU09fMjAyMl9F TkNPRElORyhJU09fMjAyMl9HWkQ0LCAnQicpDQotI2RlZmluZSBJU09fMjAyMl9HWl9KSVNfWF8w MjAxX0thdGFrYW5hICAgICAgICAgSVNPXzIwMjJfRU5DT0RJTkcoSVNPXzIwMjJfR1pENCwgJ0kn KQ0KLSNkZWZpbmUgSVNPXzIwMjJfR1pfSklTX1hfMDIwMV9Sb21hbiAgICAgICAgICAgIElTT18y MDIyX0VOQ09ESU5HKElTT18yMDIyX0daRDQsICdKJykNCi0jZGVmaW5lIElTT18yMDIyX0daX0pJ U19DXzYyMjZfMTk3OCAgICAgICAgICAgICBJU09fMjAyMl9FTkNPRElORyhJU09fMjAyMl9HWkRN NCwnQCcpDQotI2RlZmluZSBJU09fMjAyMl9HWl9KSVNfWF8wMjA4XzE5ODMgICAgICAgICAgICAg SVNPXzIwMjJfRU5DT0RJTkcoSVNPXzIwMjJfR1pETTQsJ0InKQ0KLSNkZWZpbmUgSVNPXzIwMjJf R1pfSklTX1hfMDIxMl8xOTkwICAgICAgICAgICAgIElTT18yMDIyX0VOQ09ESU5HKElTT18yMDIy X0daRE00LCdEJykNCi0jZGVmaW5lIElTT18yMDIyX0daX0pJU19YXzAyMTNfMjAwMF8xICAgICAg ICAgICBJU09fMjAyMl9FTkNPRElORyhJU09fMjAyMl9HWkRNNCwnTycpDQotI2RlZmluZSBJU09f MjAyMl9HWl9KSVNfWF8wMjEzXzIwMDBfMiAgICAgICAgICAgSVNPXzIwMjJfRU5DT0RJTkcoSVNP XzIwMjJfR1pETTQsJ1AnKQ0KLSNkZWZpbmUgSVNPXzIwMjJfR1pfSklTX1hfMDIxM18yMDA0XzEg ICAgICAgICAgIElTT18yMDIyX0VOQ09ESU5HKElTT18yMDIyX0daRE00LCdRJykNCi0NCi0jZGVm aW5lIFVOU1VQUE9SVEVEX01PREUgVFJBTlNDT0RFX0VSUk9SDQotDQotc3RhdGljIGludA0KLWdl dF9pc29fMjAyMl9tb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbl9wb3MpDQotew0KLSAgICBp bnQgbmV3X21vZGU7DQotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluX3AgPSAqaW5fcG9zOw0K LSAgICBzd2l0Y2ggKCppbl9wKyspIHsNCi0gICAgICBjYXNlICcoJzoNCi0Jc3dpdGNoICgqaW5f cCsrKSB7DQotCSAgY2FzZSAnQic6IGNhc2UgJ0knOiBjYXNlICdKJzoNCi0JICAgIG5ld19tb2Rl ID0gSVNPXzIwMjJfRU5DT0RJTkcoSVNPXzIwMjJfR1pENCwgKihpbl9wLTEpKTsNCi0JICAgIGJy ZWFrOw0KLQkgIGRlZmF1bHQ6DQotCSAgICByYl9yYWlzZShVTlNVUFBPUlRFRF9NT0RFLCAidGhp cyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgKEVTQyAoICVjKSIsICooaW5fcC0xKSk7DQotCSAgICBi cmVhazsNCi0JfQ0KLQlicmVhazsNCi0gICAgICBjYXNlICckJzoNCi0Jc3dpdGNoICgqaW5fcCsr KSB7DQotCSAgY2FzZSAnQCc6IGNhc2UgJ0EnOiBjYXNlICdCJzoNCi0JICAgIG5ld19tb2RlID0g SVNPXzIwMjJfRU5DT0RJTkcoSVNPXzIwMjJfR1pETTQsICooaW5fcC0xKSk7DQotCSAgICBicmVh azsNCi0JICBjYXNlICcoJzoNCi0JICAgIHN3aXRjaCAoKmluX3ArKykgew0KLQkgICAgICBjYXNl ICdEJzogY2FzZSAnTyc6IGNhc2UgJ1AnOiBjYXNlICdRJzoNCi0JCW5ld19tb2RlID0gSVNPXzIw MjJfRU5DT0RJTkcoSVNPXzIwMjJfR1pETTQsICooaW5fcC0xKSk7DQotCQlicmVhazsNCi0JICAg ICAgZGVmYXVsdDoNCi0JCXJiX3JhaXNlKFVOU1VQUE9SVEVEX01PREUsICJ0aGlzIG1vZGUgaXMg bm90IHN1cHBvcnRlZCAoRVNDICQgKCAlYykiLCAqKGluX3AtMSkpOw0KLQkJYnJlYWs7DQotCSAg ICB9DQotCSAgICBicmVhazsNCi0JICBkZWZhdWx0Og0KLQkgICAgcmJfcmFpc2UoVU5TVVBQT1JU RURfTU9ERSwgInRoaXMgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIChFU0MgJCAlYykiLCAqKGluX3At MSkpOw0KLQkgICAgYnJlYWs7DQotCX0NCi0JYnJlYWs7DQotICAgICAgZGVmYXVsdDoNCi0JcmJf cmFpc2UoVU5TVVBQT1JURURfTU9ERSwgInRoaXMgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIChFU0Mg JWMpIiwgKihpbl9wLTEpKTsNCi0JYnJlYWs7DQotICAgIH0NCi0gICAgKmluX3BvcyA9IGluX3A7 DQotICAgIHJldHVybiBuZXdfbW9kZTsNCi19DQotDQotc3RhdGljIHZvaWQNCi1mcm9tX2lzb18y MDIyX2pwX3RyYW5zY29kZXJfcHJlcHJvY2Vzc29yKGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbl9w b3MsIHVuc2lnbmVkIGNoYXIgKipvdXRfcG9zLA0KLQkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIg KmluX3N0b3AsIHVuc2lnbmVkIGNoYXIgKm91dF9zdG9wLA0KLQkJCQkJIHJiX3RyYW5zY29kaW5n ICpteV90cmFuc2NvZGluZykNCi17DQotICAgIGNvbnN0IHJiX3RyYW5zY29kZXIgKm15X3RyYW5z Y29kZXIgPSBteV90cmFuc2NvZGluZy0+dHJhbnNjb2RlcjsNCi0gICAgY29uc3QgdW5zaWduZWQg Y2hhciAqaW5fcCA9ICppbl9wb3M7DQotICAgIHVuc2lnbmVkIGNoYXIgKm91dF9wID0gKm91dF9w b3M7DQotICAgIGludCBjdXJfbW9kZSA9IElTT18yMDIyX0daX0FTQ0lJOw0KLSAgICB1bnNpZ25l ZCBjaGFyIGMxOw0KLSAgICB1bnNpZ25lZCBjaGFyICpvdXRfcyA9IG91dF9zdG9wIC0gbXlfdHJh bnNjb2Rlci0+bWF4X291dHB1dCArIDE7DQotICAgIHdoaWxlIChpbl9wIDwgaW5fc3RvcCkgew0K LQlpZiAob3V0X3AgPj0gb3V0X3MpIHsNCi0JICAgIGludCBsZW4gPSAob3V0X3AgLSAqb3V0X3Bv cyk7DQotCSAgICBpbnQgbmV3X2xlbiA9IChsZW4gKyBteV90cmFuc2NvZGVyLT5tYXhfb3V0cHV0 KSAqIDI7DQotCSAgICAqb3V0X3BvcyA9ICgqbXlfdHJhbnNjb2RpbmctPmZsdXNoX2Z1bmMpKG15 X3RyYW5zY29kaW5nLCBsZW4sIG5ld19sZW4pOw0KLQkgICAgb3V0X3AgPSAqb3V0X3BvcyArIGxl bjsNCi0JICAgIG91dF9zID0gKm91dF9wb3MgKyBuZXdfbGVuIC0gbXlfdHJhbnNjb2Rlci0+bWF4 X291dHB1dDsNCi0JfQ0KLQljMSA9ICppbl9wKys7DQotCWlmIChjMSA9PSAweDFCKSB7DQotCSAg ICBjdXJfbW9kZSA9IGdldF9pc29fMjAyMl9tb2RlKCZpbl9wKTsNCi0JfQ0KLQllbHNlIGlmIChj MSA9PSAweDFFIHx8IGMxID09IDB4MUYpIHsNCi0JICAgIC8qIFNISUZUICovDQotCSAgICByYl9y YWlzZShVTlNVUFBPUlRFRF9NT0RFLCAic2hpZnQgaXMgbm90IHN1cHBvcnRlZCIpOw0KLQl9DQot CWVsc2UgaWYgKGMxID49IDB4ODApIHsNCi0JICAgIHJiX3JhaXNlKFRSQU5TQ09ERV9FUlJPUiwg ImludmFsaWQgYnl0ZSBzZXF1ZW5jZSIpOw0KLQl9DQotCWVsc2Ugew0KLQkgICAgc3dpdGNoIChj dXJfbW9kZSkgew0KLQkgICAgICBjYXNlIElTT18yMDIyX0daX0FTQ0lJOg0KLQkgICAgICBjYXNl IElTT18yMDIyX0daX0pJU19YXzAyMDFfUm9tYW46DQotCQkqb3V0X3ArKyA9IGMxOw0KLQkJYnJl YWs7DQotCSAgICAgIGNhc2UgSVNPXzIwMjJfR1pfSklTX1hfMDIwMV9LYXRha2FuYToNCi0JCSpv dXRfcCsrID0gMHg4RTsNCi0JCSpvdXRfcCsrID0gYzEgfCAweDgwOw0KLQkJYnJlYWs7DQotCSAg ICAgIGNhc2UgSVNPXzIwMjJfR1pfSklTX1hfMDIxMl8xOTkwOg0KLQkJKm91dF9wKysgPSAweDhG Ow0KLQkgICAgICBjYXNlIElTT18yMDIyX0daX0pJU19DXzYyMjZfMTk3ODoNCi0JICAgICAgY2Fz ZSBJU09fMjAyMl9HWl9KSVNfWF8wMjA4XzE5ODM6DQotCQkqb3V0X3ArKyA9IGMxIHwgMHg4MDsN Ci0JCSpvdXRfcCsrID0gKmluX3ArKyB8IDB4ODA7DQotCQlicmVhazsNCi0JICAgIH0NCi0JfQ0K LSAgICB9DQotICAgIC8qIGNsZWFudXAgKi8NCi0gICAgKmluX3BvcyAgPSBpbl9wOw0KLSAgICAq b3V0X3BvcyA9IG91dF9wOw0KLX0NCi0NCi1zdGF0aWMgaW50DQotc2VsZWN0X2lzb18yMDIyX21v ZGUodW5zaWduZWQgY2hhciAqKm91dF9wb3MsIGludCBuZXdfbW9kZSkNCi17DQotICAgIHVuc2ln bmVkIGNoYXIgKm91dF9wID0gKm91dF9wb3M7DQotICAgICpvdXRfcCsrID0gJ1x4MWInOw0KLSAg ICBzd2l0Y2ggKG5ld19tb2RlPj44KSB7DQotICAgICAgY2FzZSBJU09fMjAyMl9HWkQ0Og0KLQkq b3V0X3ArKyA9IG5ld19tb2RlID4+IDg7DQotCSpvdXRfcCsrID0gbmV3X21vZGUgJiAweDdGOw0K LQlicmVhazsNCi0gICAgICBjYXNlIElTT18yMDIyX0daRE00Og0KLQkqb3V0X3ArKyA9IG5ld19t b2RlID4+IDE2Ow0KLQlpZiAoKG5ld19tb2RlICYgMHg3RikgIT0gJ0AnICYmDQotCSAgICAobmV3 X21vZGUgJiAweDdGKSAhPSAnQScgJiYNCi0JICAgIChuZXdfbW9kZSAmIDB4N0YpICE9ICdCJykN Ci0Jew0KLQkgICAgKm91dF9wKysgPSAobmV3X21vZGU+PjgpICYgMHg3RjsNCi0JfQ0KLQkqb3V0 X3ArKyA9IG5ld19tb2RlICYgMHg3RjsNCi0JYnJlYWs7DQotICAgICAgZGVmYXVsdDoNCi0JcmJf cmFpc2UoVU5TVVBQT1JURURfTU9ERSwgInRoaXMgbW9kZSBpcyBub3Qgc3VwcG9ydGVkLiIpOw0K LQlicmVhazsNCi0gICAgfQ0KLSAgICAqb3V0X3BvcyA9IG91dF9wOw0KLSAgICByZXR1cm4gbmV3 X21vZGU7DQotfQ0KLQ0KLXN0YXRpYyB2b2lkDQotdG9faXNvXzIwMjJfanBfdHJhbnNjb2Rlcl9w b3N0cHJvY2Vzc29yKGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbl9wb3MsIHVuc2lnbmVkIGNoYXIg KipvdXRfcG9zLA0KLQkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW5fc3RvcCwgdW5zaWduZWQg Y2hhciAqb3V0X3N0b3AsDQotCQkJCQlyYl90cmFuc2NvZGluZyAqbXlfdHJhbnNjb2RpbmcpDQot ew0KLSAgICBjb25zdCByYl90cmFuc2NvZGVyICpteV90cmFuc2NvZGVyID0gbXlfdHJhbnNjb2Rp bmctPnRyYW5zY29kZXI7DQotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluX3AgPSAqaW5fcG9z Ow0KLSAgICB1bnNpZ25lZCBjaGFyICpvdXRfcCA9ICpvdXRfcG9zOw0KLSAgICBpbnQgY3VyX21v ZGUgPSBJU09fMjAyMl9HWl9BU0NJSSwgbmV3X21vZGUgPSAwOw0KLSAgICB1bnNpZ25lZCBjaGFy IG5leHRfYnl0ZTsNCi0gICAgdW5zaWduZWQgY2hhciAqb3V0X3MgPSBvdXRfc3RvcCAtIG15X3Ry YW5zY29kZXItPm1heF9vdXRwdXQgKyAxOw0KLSAgICB3aGlsZSAoaW5fcCA8IGluX3N0b3ApIHsN Ci0JaWYgKG91dF9wID49IG91dF9zKSB7DQotCSAgICBpbnQgbGVuID0gKG91dF9wIC0gKm91dF9w b3MpOw0KLQkgICAgaW50IG5ld19sZW4gPSAobGVuICsgbXlfdHJhbnNjb2Rlci0+bWF4X291dHB1 dCkgKiAyOw0KLQkgICAgKm91dF9wb3MgPSAoKm15X3RyYW5zY29kaW5nLT5mbHVzaF9mdW5jKSht eV90cmFuc2NvZGluZywgbGVuLCBuZXdfbGVuKTsNCi0JICAgIG91dF9wID0gKm91dF9wb3MgKyBs ZW47DQotCSAgICBvdXRfcyA9ICpvdXRfcG9zICsgbmV3X2xlbiAtIG15X3RyYW5zY29kZXItPm1h eF9vdXRwdXQ7DQotCX0NCi0JbmV4dF9ieXRlID0gKmluX3ArKzsNCi0JaWYgKG5leHRfYnl0ZSA8 IDB4ODApIHsNCi0JICAgIG5ld19tb2RlID0gSVNPXzIwMjJfR1pfQVNDSUk7DQotCX0NCi0JZWxz ZSBpZiAobmV4dF9ieXRlID09IDB4OEUpIHsNCi0JICAgIG5ld19tb2RlID0gSVNPXzIwMjJfR1pf SklTX1hfMDIwMV9LYXRha2FuYTsNCi0JICAgIG5leHRfYnl0ZSA9ICppbl9wKys7DQotCX0NCi0J ZWxzZSBpZiAobmV4dF9ieXRlID09IDB4OEYpIHsNCi0JICAgIG5ld19tb2RlID0gSVNPXzIwMjJf R1pfSklTX1hfMDIxMl8xOTkwOw0KLQkgICAgbmV4dF9ieXRlID0gKmluX3ArKzsNCi0JfQ0KLQll bHNlIHsNCi0JICAgIG5ld19tb2RlID0gSVNPXzIwMjJfR1pfSklTX1hfMDIwOF8xOTgzOw0KLQl9 DQotCWlmIChjdXJfbW9kZSAhPSBuZXdfbW9kZSkNCi0JICAgIGN1cl9tb2RlID0gc2VsZWN0X2lz b18yMDIyX21vZGUoJm91dF9wLCBuZXdfbW9kZSk7DQotCWlmIChjdXJfbW9kZSA8IDB4RkZGRikg ew0KLQkgICAgKm91dF9wKysgPSBuZXh0X2J5dGUgJiAweDdGOw0KLQl9DQotCWVsc2Ugew0KLQkg ICAgKm91dF9wKysgPSBuZXh0X2J5dGUgJiAweDdGOw0KLQkgICAgKm91dF9wKysgPSAqaW5fcCsr ICYgMHg3RjsNCi0JfQ0KLSAgICB9DQotICAgIGlmIChjdXJfbW9kZSAhPSBJU09fMjAyMl9HWl9B U0NJSSkNCi0JY3VyX21vZGUgPSBzZWxlY3RfaXNvXzIwMjJfbW9kZSgmb3V0X3AsIElTT18yMDIy X0daX0FTQ0lJKTsNCi0gICAgLyogY2xlYW51cCAqLw0KLSAgICAqaW5fcG9zICA9IGluX3A7DQot ICAgICpvdXRfcG9zID0gb3V0X3A7DQotfQ0KLQ0KLXN0YXRpYyBjb25zdCByYl90cmFuc2NvZGVy DQotcmJfZnJvbV9JU09fMjAyMl9KUCA9IHsNCi0gICAgIklTTy0yMDIyLUpQIiwgIlVURi04Iiwg JmZyb21fRVVDX0pQLCA4LCAwLA0KLSAgICAmZnJvbV9pc29fMjAyMl9qcF90cmFuc2NvZGVyX3By ZXByb2Nlc3NvciwgTlVMTCwNCi19Ow0KLQ0KLXN0YXRpYyBjb25zdCByYl90cmFuc2NvZGVyDQot cmJfdG9fSVNPXzIwMjJfSlAgPSB7DQotICAgICJVVEYtOCIsICJJU08tMjAyMi1KUCIsICZ0b19F VUNfSlAsIDgsIDEsDQotICAgIE5VTEwsICZ0b19pc29fMjAyMl9qcF90cmFuc2NvZGVyX3Bvc3Rw cm9jZXNzb3IsDQotfTsNCi0NCiB2b2lkDQogSW5pdF9qYXBhbmVzZSh2b2lkKQ0KIHsNCiA8JT0g dHJhbnNjb2RlX3JlZ2lzdGVyX2NvZGUgJT4NCi0gICAgcmJfcmVnaXN0ZXJfdHJhbnNjb2Rlcigm cmJfZnJvbV9JU09fMjAyMl9KUCk7DQotICAgIHJiX3JlZ2lzdGVyX3RyYW5zY29kZXIoJnJiX3Rv X0lTT18yMDIyX0pQKTsNCiB9DQpJbmRleDogZW5jL3RyYW5zL3V0Zl8xNl8zMi5lcmIuYw0KPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQ0KLS0tIGVuYy90cmFucy91dGZfMTZfMzIuZXJiLmMJKHJldmlzaW9uIDE4NDE3KQ0K KysrIGVuYy90cmFucy91dGZfMTZfMzIuZXJiLmMJKHdvcmtpbmcgY29weSkNCkBAIC0xLDcgKzEs NyBAQA0KICNpbmNsdWRlICJ0cmFuc2NvZGVfZGF0YS5oIg0KIA0KIHN0YXRpYyBpbnQNCi1mdW5f c29fZnJvbV91dGZfMTZiZShjb25zdCB1bnNpZ25lZCBjaGFyKiBzLCB1bnNpZ25lZCBjaGFyKiBv KQ0KK2Z1bl9zb19mcm9tX3V0Zl8xNmJlKHJiX3RyYW5zY29kaW5nKiB0LCBjb25zdCB1bnNpZ25l ZCBjaGFyKiBzLCBzaXplX3QgbCwgdW5zaWduZWQgY2hhciogbykNCiB7DQogICAgIGlmICghc1sw XSAmJiBzWzFdPDB4ODApIHsNCiAgICAgICAgIG9bMF0gPSBzWzFdOw0KQEAgLTI5LDcgKzI5LDcg QEAgZnVuX3NvX2Zyb21fdXRmXzE2YmUoY29uc3QgdW5zaWduZWQgY2hhcg0KIH0NCiANCiBzdGF0 aWMgaW50DQotZnVuX3NvX3RvX3V0Zl8xNmJlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHMsIHVuc2ln bmVkIGNoYXIqIG8pDQorZnVuX3NvX3RvX3V0Zl8xNmJlKHJiX3RyYW5zY29kaW5nKiB0LCBjb25z dCB1bnNpZ25lZCBjaGFyKiBzLCBzaXplX3QgbCwgdW5zaWduZWQgY2hhciogbykNCiB7DQogICAg IGlmICghKHNbMF0mMHg4MCkpIHsNCiAgICAgICAgIG9bMF0gPSAweDAwOw0KQEAgLTU3LDcgKzU3 LDcgQEAgZnVuX3NvX3RvX3V0Zl8xNmJlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIA0KIH0NCiANCiBz dGF0aWMgaW50DQotZnVuX3NvX2Zyb21fdXRmXzE2bGUoY29uc3QgdW5zaWduZWQgY2hhciogcywg dW5zaWduZWQgY2hhciogbykNCitmdW5fc29fZnJvbV91dGZfMTZsZShyYl90cmFuc2NvZGluZyog dCwgY29uc3QgdW5zaWduZWQgY2hhciogcywgc2l6ZV90IGwsIHVuc2lnbmVkIGNoYXIqIG8pDQog ew0KICAgICBpZiAoIXNbMV0gJiYgc1swXTwweDgwKSB7DQogICAgICAgICBvWzBdID0gc1swXTsN CkBAIC04NSw3ICs4NSw3IEBAIGZ1bl9zb19mcm9tX3V0Zl8xNmxlKGNvbnN0IHVuc2lnbmVkIGNo YXINCiB9DQogDQogc3RhdGljIGludA0KLWZ1bl9zb190b191dGZfMTZsZShjb25zdCB1bnNpZ25l ZCBjaGFyKiBzLCB1bnNpZ25lZCBjaGFyKiBvKQ0KK2Z1bl9zb190b191dGZfMTZsZShyYl90cmFu c2NvZGluZyogdCwgY29uc3QgdW5zaWduZWQgY2hhciogcywgc2l6ZV90IGwsIHVuc2lnbmVkIGNo YXIqIG8pDQogew0KICAgICBpZiAoIShzWzBdJjB4ODApKSB7DQogICAgICAgICBvWzFdID0gMHgw MDsNCkBAIC0xMTMsNyArMTEzLDcgQEAgZnVuX3NvX3RvX3V0Zl8xNmxlKGNvbnN0IHVuc2lnbmVk IGNoYXIqIA0KIH0NCiANCiBzdGF0aWMgaW50DQotZnVuX3NvX2Zyb21fdXRmXzMyYmUoY29uc3Qg dW5zaWduZWQgY2hhciogcywgdW5zaWduZWQgY2hhciogbykNCitmdW5fc29fZnJvbV91dGZfMzJi ZShyYl90cmFuc2NvZGluZyogdCwgY29uc3QgdW5zaWduZWQgY2hhciogcywgc2l6ZV90IGwsIHVu c2lnbmVkIGNoYXIqIG8pDQogew0KICAgICBpZiAoIXNbMV0pIHsNCiAgICAgICAgIGlmIChzWzJd PT0wICYmIHNbM108MHg4MCkgew0KQEAgLTE0Miw3ICsxNDIsNyBAQCBmdW5fc29fZnJvbV91dGZf MzJiZShjb25zdCB1bnNpZ25lZCBjaGFyDQogfQ0KIA0KIHN0YXRpYyBpbnQNCi1mdW5fc29fdG9f dXRmXzMyYmUoY29uc3QgdW5zaWduZWQgY2hhciogcywgdW5zaWduZWQgY2hhciogbykNCitmdW5f c29fdG9fdXRmXzMyYmUocmJfdHJhbnNjb2RpbmcqIHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHMs IHNpemVfdCBsLCB1bnNpZ25lZCBjaGFyKiBvKQ0KIHsNCiAgICAgb1swXSA9IDA7DQogICAgIGlm ICghKHNbMF0mMHg4MCkpIHsNCkBAIC0xNjgsMTMgKzE2OCwxMyBAQCBmdW5fc29fdG9fdXRmXzMy YmUoY29uc3QgdW5zaWduZWQgY2hhciogDQogfQ0KIA0KIHN0YXRpYyBpbnQNCi1mdW5fc29fZnJv bV91dGZfMzJsZShjb25zdCB1bnNpZ25lZCBjaGFyKiBzLCB1bnNpZ25lZCBjaGFyKiBvKQ0KK2Z1 bl9zb19mcm9tX3V0Zl8zMmxlKHJiX3RyYW5zY29kaW5nKiB0LCBjb25zdCB1bnNpZ25lZCBjaGFy KiBzLCBzaXplX3QgbCwgdW5zaWduZWQgY2hhciogbykNCiB7DQogICAgIHJldHVybiAxOw0KIH0N CiANCiBzdGF0aWMgaW50DQotZnVuX3NvX3RvX3V0Zl8zMmxlKGNvbnN0IHVuc2lnbmVkIGNoYXIq IHMsIHVuc2lnbmVkIGNoYXIqIG8pDQorZnVuX3NvX3RvX3V0Zl8zMmxlKHJiX3RyYW5zY29kaW5n KiB0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzLCBzaXplX3QgbCwgdW5zaWduZWQgY2hhciogbykN CiB7DQogICAgIHJldHVybiA0Ow0KIH0NCkBAIC0xOTEsNyArMTkxLDcgQEAgZnVuX3NvX3RvX3V0 Zl8zMmxlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIA0KIHN0YXRpYyBjb25zdCByYl90cmFuc2NvZGVy DQogcmJfZnJvbV9VVEZfMTZCRSA9IHsNCiAgICAgIlVURi0xNkJFIiwgIlVURi04IiwgJmZyb21f VVRGXzE2QkUsIDQsIDAsDQotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICZmdW5f c29fZnJvbV91dGZfMTZiZQ0KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCAmZnVuX3NvX2Zyb21fdXRm XzE2YmUNCiB9Ow0KIA0KIDwlPQ0KQEAgLTIxNyw3ICsyMTcsNyBAQCByYl9mcm9tX1VURl8xNkJF ID0gew0KIHN0YXRpYyBjb25zdCByYl90cmFuc2NvZGVyDQogcmJfdG9fVVRGXzE2QkUgPSB7DQog ICAgICJVVEYtOCIsICJVVEYtMTZCRSIsICZ0b19VVEZfMTZCRSwgNCwgMSwNCi0gICAgTlVMTCwg TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgJmZ1bl9zb190b191dGZfMTZiZQ0KKyAgICBOVUxMLCBO VUxMLCBOVUxMLCAmZnVuX3NvX3RvX3V0Zl8xNmJlDQogfTsNCiANCiA8JT0NCkBAIC0yMzIsMTMg KzIzMiwxMyBAQCByYl90b19VVEZfMTZCRSA9IHsNCiBzdGF0aWMgY29uc3QgcmJfdHJhbnNjb2Rl cg0KIHJiX2Zyb21fVVRGXzE2TEUgPSB7DQogICAgICJVVEYtMTZMRSIsICJVVEYtOCIsICZmcm9t X1VURl8xNkxFLCA0LCAwLA0KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAmZnVu X3NvX2Zyb21fdXRmXzE2bGUNCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgJmZ1bl9zb19mcm9tX3V0 Zl8xNmxlDQogfTsNCiANCiBzdGF0aWMgY29uc3QgcmJfdHJhbnNjb2Rlcg0KIHJiX3RvX1VURl8x NkxFID0gew0KICAgICAiVVRGLTgiLCAiVVRGLTE2TEUiLCAmdG9fVVRGXzE2QkUsIDQsIDEsDQot ICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICZmdW5fc29fdG9fdXRmXzE2bGUNCisg ICAgTlVMTCwgTlVMTCwgTlVMTCwgJmZ1bl9zb190b191dGZfMTZsZQ0KIH07DQogDQogPCU9DQpA QCAtMjU0LDEzICsyNTQsMTMgQEAgcmJfdG9fVVRGXzE2TEUgPSB7DQogc3RhdGljIGNvbnN0IHJi X3RyYW5zY29kZXINCiByYl9mcm9tX1VURl8zMkJFID0gew0KICAgICAiVVRGLTMyQkUiLCAiVVRG LTgiLCAmZnJvbV9VVEZfMzJCRSwgNCwgMCwNCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwg TlVMTCwgJmZ1bl9zb19mcm9tX3V0Zl8zMmJlDQorICAgIE5VTEwsIE5VTEwsIE5VTEwsICZmdW5f c29fZnJvbV91dGZfMzJiZQ0KIH07DQogDQogc3RhdGljIGNvbnN0IHJiX3RyYW5zY29kZXINCiBy Yl90b19VVEZfMzJCRSA9IHsNCiAgICAgIlVURi04IiwgIlVURi0zMkJFIiwgJnRvX1VURl8xNkJF LCA0LCAxLA0KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAmZnVuX3NvX3RvX3V0 Zl8zMmJlDQorICAgIE5VTEwsIE5VTEwsIE5VTEwsICZmdW5fc29fdG9fdXRmXzMyYmUNCiB9Ow0K IA0KIDwlPQ0KQEAgLTI3NiwxMyArMjc2LDEzIEBAIHJiX3RvX1VURl8zMkJFID0gew0KIHN0YXRp YyBjb25zdCByYl90cmFuc2NvZGVyDQogcmJfZnJvbV9VVEZfMzJMRSA9IHsNCiAgICAgIlVURi0z MkxFIiwgIlVURi04IiwgJmZyb21fVVRGXzMyTEUsIDQsIDAsDQotICAgIE5VTEwsIE5VTEwsIE5V TEwsIE5VTEwsIE5VTEwsICZmdW5fc29fZnJvbV91dGZfMzJsZQ0KKyAgICBOVUxMLCBOVUxMLCBO VUxMLCAmZnVuX3NvX2Zyb21fdXRmXzMybGUNCiB9Ow0KIA0KIHN0YXRpYyBjb25zdCByYl90cmFu c2NvZGVyDQogcmJfdG9fVVRGXzMyTEUgPSB7DQogICAgICJVVEYtOCIsICJVVEYtMzJMRSIsICZ0 b19VVEZfMTZCRSwgNCwgMSwNCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgJmZ1 bl9zb190b191dGZfMzJsZQ0KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCAmZnVuX3NvX3RvX3V0Zl8z MmxlDQogfTsNCiANCiB2b2lkDQpJbmRleDogdHJhbnNjb2RlX2RhdGEuaA0KPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K LS0tIHRyYW5zY29kZV9kYXRhLmgJKHJldmlzaW9uIDE4NDE3KQ0KKysrIHRyYW5zY29kZV9kYXRh LmgJKHdvcmtpbmcgY29weSkNCkBAIC02Myw2ICs2Myw4IEBAIHR5cGVkZWYgc3RydWN0IHJiX3Ry YW5zY29kaW5nIHsNCiAgICAgVkFMVUUgcnVieV9zdHJpbmdfZGVzdDsgLyogdGhlIFN0cmluZyB1 c2VkIGFzIHRoZSBjb252ZXJzaW9uIGRlc3RpbmF0aW9uLA0KIAkJCSAgICAgICBvciBOVUxMIGlm IHNvbWV0aGluZyBlbHNlIGlzIGJlaW5nIGNvbnZlcnRlZCAqLw0KICAgICB1bnNpZ25lZCBjaGFy ICooKmZsdXNoX2Z1bmMpKHN0cnVjdCByYl90cmFuc2NvZGluZyosIGludCwgaW50KTsNCisNCisg ICAgdW5zaWduZWQgY2hhciBzdGF0ZWZ1bFsyNTZdOyAvKiBvcGFxdWUgZGF0YSBmb3Igc3RhdGVm dWwgZW5jb2RpbmcgKi8NCiB9IHJiX3RyYW5zY29kaW5nOw0KIA0KIC8qIHN0YXRpYyBzdHJ1Y3R1 cmUsIG9uZSBwZXIgc3VwcG9ydGVkIGVuY29kaW5nIHBhaXIgKi8NCkBAIC03MiwxMiArNzQsMTEg QEAgdHlwZWRlZiBzdHJ1Y3QgcmJfdHJhbnNjb2RlciB7DQogICAgIGNvbnN0IEJZVEVfTE9PS1VQ ICpjb252X3RyZWVfc3RhcnQ7DQogICAgIGludCBtYXhfb3V0cHV0Ow0KICAgICBpbnQgZnJvbV91 dGY4Ow0KLSAgICB2b2lkICgqcHJlcHJvY2Vzc29yKShjb25zdCB1bnNpZ25lZCBjaGFyKiosIHVu c2lnbmVkIGNoYXIqKiwgY29uc3QgdW5zaWduZWQgY2hhciosIHVuc2lnbmVkIGNoYXIqLCBzdHJ1 Y3QgcmJfdHJhbnNjb2RpbmcgKik7DQotICAgIHZvaWQgKCpwb3N0cHJvY2Vzc29yKShjb25zdCB1 bnNpZ25lZCBjaGFyKiosIHVuc2lnbmVkIGNoYXIqKiwgY29uc3QgdW5zaWduZWQgY2hhciosIHVu c2lnbmVkIGNoYXIqLCBzdHJ1Y3QgcmJfdHJhbnNjb2RpbmcgKik7DQotICAgIFZBTFVFICgqZnVu Y19paSkoVkFMVUUpOyAvKiBpbmZvICAtPiBpbmZvICAgKi8NCi0gICAgVkFMVUUgKCpmdW5jX3Np KShjb25zdCB1bnNpZ25lZCBjaGFyICopOyAvKiBzdGFydCAtPiBpbmZvICAgKi8NCi0gICAgaW50 ICgqZnVuY19pbykoVkFMVUUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqKTsgLyogaW5mbyAgLT4gb3V0 cHV0ICovDQotICAgIGludCAoKmZ1bmNfc28pKGNvbnN0IHVuc2lnbmVkIGNoYXIqLCB1bnNpZ25l ZCBjaGFyKik7IC8qIHN0YXJ0IC0+IG91dHB1dCAqLw0KKyAgICBWQUxVRSAoKmZ1bmNfaWkpKHJi X3RyYW5zY29kaW5nKiwgVkFMVUUpOyAvKiBpbmZvICAtPiBpbmZvICAgKi8NCisgICAgVkFMVUUg KCpmdW5jX3NpKShyYl90cmFuc2NvZGluZyosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBzaXplX3Qp OyAvKiBzdGFydCAtPiBpbmZvICAgKi8NCisgICAgaW50ICgqZnVuY19pbykocmJfdHJhbnNjb2Rp bmcqLCBWQUxVRSwgY29uc3QgdW5zaWduZWQgY2hhciopOyAvKiBpbmZvICAtPiBvdXRwdXQgKi8N CisgICAgaW50ICgqZnVuY19zbykocmJfdHJhbnNjb2RpbmcqLCBjb25zdCB1bnNpZ25lZCBjaGFy Kiwgc2l6ZV90LCB1bnNpZ25lZCBjaGFyKik7IC8qIHN0YXJ0IC0+IG91dHB1dCAqLw0KKyAgICBp bnQgKCpmaW5pc2hfZnVuYykocmJfdHJhbnNjb2RpbmcqLCB1bnNpZ25lZCBjaGFyKik7IC8qIC0+ IG91dHB1dCAqLw0KIH0gcmJfdHJhbnNjb2RlcjsNCiANCiB2b2lkIHJiX2RlY2xhcmVfdHJhbnNj b2Rlcihjb25zdCBjaGFyICplbmMxLCBjb25zdCBjaGFyICplbmMyLCBjb25zdCBjaGFyICpsaWIp Ow0KSW5kZXg6IHRvb2wvdHJhbnNjb2RlLXRibGdlbi5yYg0KPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHRvb2wv dHJhbnNjb2RlLXRibGdlbi5yYgkocmV2aXNpb24gMTg0MTcpDQorKysgdG9vbC90cmFuc2NvZGUt dGJsZ2VuLnJiCSh3b3JraW5nIGNvcHkpDQpAQCAtMjM0LDYgKzIzNCwxMiBAQCBjbGFzcyBBY3Rp b25NYXANCiAgICAgICAiVU5ERUYiDQogICAgIHdoZW4gOmludmFsaWQNCiAgICAgICAiSU5WQUxJ RCINCisgICAgd2hlbiA6ZnVuY19paQ0KKyAgICAgICJGVU5paSINCisgICAgd2hlbiA6ZnVuY19z aQ0KKyAgICAgICJGVU5zaSINCisgICAgd2hlbiA6ZnVuY19pbw0KKyAgICAgICJGVU5pbyINCiAg ICAgd2hlbiA6ZnVuY19zbw0KICAgICAgICJGVU5zbyINCiAgICAgd2hlbiAvXEEoWzAtOWEtZl1b MC05YS1mXSlcei9pDQpJbmRleDogdGVzdC9ydWJ5L3Rlc3RfdHJhbnNjb2RlLnJiDQo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09DQotLS0gdGVzdC9ydWJ5L3Rlc3RfdHJhbnNjb2RlLnJiCShyZXZpc2lvbiAxODQxNykNCisr KyB0ZXN0L3J1YnkvdGVzdF90cmFuc2NvZGUucmIJKHdvcmtpbmcgY29weSkNCkBAIC0zMjEsMTIg KzMyMSwxMyBAQCBjbGFzcyBUZXN0VHJhbnNjb2RlIDwgVGVzdDo6VW5pdDo6VGVzdENhDQogICAg IGFzc2VydF9yYWlzZShSdW50aW1lRXJyb3IpIHsgIlx4MWIoQSIuZW5jb2RlKCJ1dGYtOCIsICJp c28tMjAyMi1qcCIpIH0NCiAgICAgYXNzZXJ0X3JhaXNlKFJ1bnRpbWVFcnJvcikgeyAiXHgxYiQo QSIuZW5jb2RlKCJ1dGYtOCIsICJpc28tMjAyMi1qcCIpIH0NCiAgICAgYXNzZXJ0X3JhaXNlKFJ1 bnRpbWVFcnJvcikgeyAiXHgxYiRDIi5lbmNvZGUoInV0Zi04IiwgImlzby0yMDIyLWpwIikgfQ0K LSAgICBhc3NlcnRfcmFpc2UoUnVudGltZUVycm9yKSB7ICJceDFlIi5lbmNvZGUoInV0Zi04Iiwg Imlzby0yMDIyLWpwIikgfQ0KKyAgICBhc3NlcnRfcmFpc2UoUnVudGltZUVycm9yKSB7ICJceDBl Ii5lbmNvZGUoInV0Zi04IiwgImlzby0yMDIyLWpwIikgfQ0KICAgICBhc3NlcnRfcmFpc2UoUnVu dGltZUVycm9yKSB7ICJceDgwIi5lbmNvZGUoInV0Zi04IiwgImlzby0yMDIyLWpwIikgfQ0KICAg ICBhc3NlcnRfcmFpc2UoUnVudGltZUVycm9yKSB7ICJceDFiJChEZCFceDFiKEIiLmVuY29kZSgi dXRmLTgiLCAiaXNvLTIwMjItanAiKSB9DQogICAgIGFzc2VydF9yYWlzZShSdW50aW1lRXJyb3Ip IHsgIlx1OTI5OSIuZW5jb2RlKCJpc28tMjAyMi1qcCIpIH0NCi0gICAgI0BAQEAgVE9ETzogdGhl IG5leHQgdGVzdCBzaG91bGQgYWN0dWFsbHkgZmFpbCwgYmVjYXVzZSBpc28tMjAyMi1qcCBkb2Vz IG5vdCBpbmNsdWRlIGhhbGYtd2lkdGgga2FuYQ0KLSAgICBjaGVja19ib3RoX3dheXMoIlx1ZmY3 MVx1ZmY3Mlx1ZmY3M1x1ZmY3NFx1ZmY3NSIsICJceDFiKEkxMjM0NVx4MWIoQiIsICJpc28tMjAy Mi1qcCIpICMgSklTIFggMDIwMSCnqKmqqw0KKyAgICBhc3NlcnRfcmFpc2UoUnVudGltZUVycm9y KSB7ICJcdTkyOTkiLmVuY29kZSgiaXNvLTIwMjItanAiKSB9DQorICAgIGFzc2VydF9yYWlzZShS dW50aW1lRXJyb3IpIHsgIlx1ZmY3MVx1ZmY3Mlx1ZmY3M1x1ZmY3NFx1ZmY3NSIuZW5jb2RlKCJp c28tMjAyMi1qcCIpIH0NCisgICAgYXNzZXJ0X3JhaXNlKFJ1bnRpbWVFcnJvcikgeyAiXHgxYihJ MTIzNDVceDFiKEIiLmVuY29kZSgidXRmLTgiLCAiaXNvLTIwMjItanAiKSB9DQogICBlbmQNCiAg IA0KICAgZGVmIHRlc3RfaXNvXzIwMjJfanBfMQ0KSW5kZXg6IHRyYW5zY29kZS5jDQo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09DQotLS0gdHJhbnNjb2RlLmMJKHJldmlzaW9uIDE4NDE3KQ0KKysrIHRyYW5zY29kZS5jCSh3 b3JraW5nIGNvcHkpDQpAQCAtMjUsNTMgKzI1LDc4IEBAIHN0YXRpYyBWQUxVRSBzeW1faW52YWxp ZCwgc3ltX3VuZGVmLCBzeW0NCiAgKiAgRGlzcGF0Y2ggZGF0YSBhbmQgbG9naWMNCiAgKi8NCiAN Ci1zdGF0aWMgc3RfdGFibGUgKnRyYW5zY29kZXJfdGFibGUsICp0cmFuc2NvZGVyX2xpYl90YWJs ZTsNCit0eXBlZGVmIHN0cnVjdCB7DQorICAgIGNvbnN0IGNoYXIgKmZyb207DQorICAgIGNvbnN0 IGNoYXIgKnRvOw0KKyAgICBjb25zdCBjaGFyICpsaWI7IC8qIG1heWJlIG51bGwuICBpdCBtZWFu cyB0aGF0IGRvbid0IGxvYWQgdGhlIGxpYnJhcnkuICovDQorICAgIGNvbnN0IHJiX3RyYW5zY29k ZXIgKnRyYW5zY29kZXI7DQorfSB0cmFuc2NvZGVyX2VudHJ5X3Q7DQogDQotI2RlZmluZSBUUkFO U0NPREVSX0lOVEVSTkFMX1NFUEFSQVRPUiAnXHQnDQorc3RhdGljIHN0X3RhYmxlICp0cmFuc2Nv ZGVyX3RhYmxlOw0KIA0KLXN0YXRpYyBjaGFyICoNCi10cmFuc2NvZGVyX2tleShjb25zdCBjaGFy ICpmcm9tX2UsIGNvbnN0IGNoYXIgKnRvX2UpDQorc3RhdGljIHRyYW5zY29kZXJfZW50cnlfdCAq DQorbWFrZV90cmFuc2NvZGVyX2VudHJ5KGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRv KQ0KIHsNCi0gICAgaW50IHRvX2xlbiA9IHN0cmxlbih0b19lKTsNCi0gICAgaW50IGZyb21fbGVu ID0gc3RybGVuKGZyb21fZSk7DQotICAgIGNoYXIgKmNvbnN0IGtleSA9IHhtYWxsb2ModG9fbGVu ICsgZnJvbV9sZW4gKyAyKTsNCisgICAgc3RfZGF0YV90IHZhbDsNCisgICAgc3RfdGFibGUgKnRh YmxlMjsNCiANCi0gICAgbWVtY3B5KGtleSwgdG9fZSwgdG9fbGVuKTsNCi0gICAgbWVtY3B5KGtl eSArIHRvX2xlbiArIDEsIGZyb21fZSwgZnJvbV9sZW4gKyAxKTsNCi0gICAga2V5W3RvX2xlbl0g PSBUUkFOU0NPREVSX0lOVEVSTkFMX1NFUEFSQVRPUjsNCi0gICAgcmV0dXJuIGtleTsNCisgICAg aWYgKCFzdF9sb29rdXAodHJhbnNjb2Rlcl90YWJsZSwgKHN0X2RhdGFfdClmcm9tLCAmdmFsKSkg ew0KKyAgICAgICAgdmFsID0gKHN0X2RhdGFfdClzdF9pbml0X3N0cmNhc2V0YWJsZSgpOw0KKyAg ICAgICAgc3RfYWRkX2RpcmVjdCh0cmFuc2NvZGVyX3RhYmxlLCAoc3RfZGF0YV90KWZyb20sIHZh bCk7DQorICAgIH0NCisgICAgdGFibGUyID0gKHN0X3RhYmxlICopdmFsOw0KKyAgICBpZiAoIXN0 X2xvb2t1cCh0YWJsZTIsIChzdF9kYXRhX3QpdG8sICZ2YWwpKSB7DQorICAgICAgICB0cmFuc2Nv ZGVyX2VudHJ5X3QgKmVudHJ5ID0gQUxMT0ModHJhbnNjb2Rlcl9lbnRyeV90KTsNCisgICAgICAg IGVudHJ5LT5mcm9tID0gZnJvbTsNCisgICAgICAgIGVudHJ5LT50byA9IHRvOw0KKyAgICAgICAg ZW50cnktPmxpYiA9IE5VTEw7DQorICAgICAgICBlbnRyeS0+dHJhbnNjb2RlciA9IE5VTEw7DQor ICAgICAgICB2YWwgPSAoc3RfZGF0YV90KWVudHJ5Ow0KKyAgICAgICAgc3RfYWRkX2RpcmVjdCh0 YWJsZTIsIChzdF9kYXRhX3QpdG8sIHZhbCk7DQorICAgIH0NCisgICAgcmV0dXJuICh0cmFuc2Nv ZGVyX2VudHJ5X3QgKil2YWw7DQorfQ0KKw0KK3N0YXRpYyB0cmFuc2NvZGVyX2VudHJ5X3QgKg0K K2dldF90cmFuc2NvZGVyX2VudHJ5KGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvKQ0K K3sNCisgICAgc3RfZGF0YV90IHZhbDsNCisgICAgc3RfdGFibGUgKnRhYmxlMjsNCisNCisgICAg aWYgKCFzdF9sb29rdXAodHJhbnNjb2Rlcl90YWJsZSwgKHN0X2RhdGFfdClmcm9tLCAmdmFsKSkg ew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgdGFibGUyID0gKHN0X3RhYmxl ICopdmFsOw0KKyAgICBpZiAoIXN0X2xvb2t1cCh0YWJsZTIsIChzdF9kYXRhX3QpdG8sICZ2YWwp KSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXR1cm4gKHRyYW5zY29k ZXJfZW50cnlfdCAqKXZhbDsNCiB9DQogDQogdm9pZA0KIHJiX3JlZ2lzdGVyX3RyYW5zY29kZXIo Y29uc3QgcmJfdHJhbnNjb2RlciAqdHIpDQogew0KLSAgICBzdF9kYXRhX3QgaywgdmFsID0gMDsN CiAgICAgY29uc3QgY2hhciAqY29uc3QgZnJvbV9lID0gdHItPmZyb21fZW5jb2Rpbmc7DQogICAg IGNvbnN0IGNoYXIgKmNvbnN0IHRvX2UgPSB0ci0+dG9fZW5jb2Rpbmc7DQotICAgIGNoYXIgKmNv bnN0IGtleSA9IHRyYW5zY29kZXJfa2V5KGZyb21fZSwgdG9fZSk7DQogDQotICAgIGlmIChzdF9s b29rdXAodHJhbnNjb2Rlcl90YWJsZSwgKHN0X2RhdGFfdClrZXksICZ2YWwpKSB7DQotCXhmcmVl KGtleSk7DQorICAgIHRyYW5zY29kZXJfZW50cnlfdCAqZW50cnk7DQorDQorICAgIGVudHJ5ID0g bWFrZV90cmFuc2NvZGVyX2VudHJ5KGZyb21fZSwgdG9fZSk7DQorICAgIGlmIChlbnRyeS0+dHJh bnNjb2Rlcikgew0KIAlyYl9yYWlzZShyYl9lQXJnRXJyb3IsICJ0cmFuc2NvZGVyIGZyb20gJXMg dG8gJXMgaGFzIGJlZW4gYWxyZWFkeSByZWdpc3RlcmVkIiwNCiAJCSBmcm9tX2UsIHRvX2UpOw0K ICAgICB9DQotICAgIGsgPSAoc3RfZGF0YV90KWtleTsNCi0gICAgaWYgKHN0X2RlbGV0ZSh0cmFu c2NvZGVyX2xpYl90YWJsZSwgJmssICZ2YWwpKSB7DQotCXhmcmVlKChjaGFyICopayk7DQotICAg IH0NCi0gICAgc3RfaW5zZXJ0KHRyYW5zY29kZXJfdGFibGUsIChzdF9kYXRhX3Qpa2V5LCAoc3Rf ZGF0YV90KXRyKTsNCisNCisgICAgZW50cnktPnRyYW5zY29kZXIgPSB0cjsNCiB9DQogDQogc3Rh dGljIHZvaWQNCiBkZWNsYXJlX3RyYW5zY29kZXIoY29uc3QgY2hhciAqdG8sIGNvbnN0IGNoYXIg KmZyb20sIGNvbnN0IGNoYXIgKmxpYikNCiB7DQotICAgIGNvbnN0IGNoYXIgKmNvbnN0IGtleSA9 IHRyYW5zY29kZXJfa2V5KHRvLCBmcm9tKTsNCi0gICAgc3RfZGF0YV90IGsgPSAoc3RfZGF0YV90 KWtleSwgdmFsOw0KKyAgICB0cmFuc2NvZGVyX2VudHJ5X3QgKmVudHJ5Ow0KIA0KLSAgICBpZiAo c3RfZGVsZXRlKHRyYW5zY29kZXJfbGliX3RhYmxlLCAmaywgJnZhbCkpIHsNCi0JeGZyZWUoKGNo YXIgKilrKTsNCi0gICAgfQ0KLSAgICBzdF9pbnNlcnQodHJhbnNjb2Rlcl9saWJfdGFibGUsIChz dF9kYXRhX3Qpa2V5LCAoc3RfZGF0YV90KWxpYik7DQorICAgIGVudHJ5ID0gbWFrZV90cmFuc2Nv ZGVyX2VudHJ5KGZyb20sIHRvKTsNCisgICAgZW50cnktPmxpYiA9IGxpYjsNCiB9DQogDQogI2Rl ZmluZSBNQVhfVFJBTlNDT0RFUl9MSUJOQU1FX0xFTiA2NA0KQEAgLTkwLDM4ICsxMTUsMTY2IEBA IHJiX2RlY2xhcmVfdHJhbnNjb2Rlcihjb25zdCBjaGFyICplbmMxLCANCiANCiAjZGVmaW5lIGVu Y29kaW5nX2VxdWFsKGVuYzEsIGVuYzIpIChTVFJDQVNFQ01QKGVuYzEsIGVuYzIpID09IDApDQog DQordHlwZWRlZiBzdHJ1Y3Qgc2VhcmNoX3BhdGhfcXVldWVfdGFnIHsNCisgICAgc3RydWN0IHNl YXJjaF9wYXRoX3F1ZXVlX3RhZyAqbmV4dDsNCisgICAgY29uc3QgY2hhciAqZW5jOw0KK30gc2Vh cmNoX3BhdGhfcXVldWVfdDsNCisNCit0eXBlZGVmIHN0cnVjdCB7DQorICAgIHN0X3RhYmxlICp2 aXNpdGVkOw0KKyAgICBzZWFyY2hfcGF0aF9xdWV1ZV90ICpxdWV1ZTsNCisgICAgc2VhcmNoX3Bh dGhfcXVldWVfdCAqKnF1ZXVlX2xhc3RfcHRyOw0KKyAgICBjb25zdCBjaGFyICpiYXNlX2VuYzsN Cit9IHNlYXJjaF9wYXRoX2Jmc190Ow0KKw0KK3N0YXRpYyBpbnQNCit0cmFuc2NvZGVfc2VhcmNo X3BhdGhfaShzdF9kYXRhX3Qga2V5LCBzdF9kYXRhX3QgdmFsLCBzdF9kYXRhX3QgYXJnKQ0KK3sN CisgICAgY29uc3QgY2hhciAqdG8gPSAoY29uc3QgY2hhciAqKWtleTsNCisgICAgc2VhcmNoX3Bh dGhfYmZzX3QgKmJmcyA9IChzZWFyY2hfcGF0aF9iZnNfdCAqKWFyZzsNCisgICAgc2VhcmNoX3Bh dGhfcXVldWVfdCAqcTsNCisNCisgICAgaWYgKHN0X2xvb2t1cChiZnMtPnZpc2l0ZWQsIChzdF9k YXRhX3QpdG8sICZ2YWwpKSB7DQorICAgICAgICByZXR1cm4gU1RfQ09OVElOVUU7DQorICAgIH0N CisNCisgICAgcSA9IEFMTE9DKHNlYXJjaF9wYXRoX3F1ZXVlX3QpOw0KKyAgICBxLT5lbmMgPSB0 bzsNCisgICAgcS0+bmV4dCA9IE5VTEw7DQorICAgICpiZnMtPnF1ZXVlX2xhc3RfcHRyID0gcTsN CisgICAgYmZzLT5xdWV1ZV9sYXN0X3B0ciA9ICZxLT5uZXh0Ow0KKw0KKyAgICBzdF9hZGRfZGly ZWN0KGJmcy0+dmlzaXRlZCwgKHN0X2RhdGFfdCl0bywgKHN0X2RhdGFfdCliZnMtPmJhc2VfZW5j KTsNCisgICAgcmV0dXJuIFNUX0NPTlRJTlVFOw0KK30NCisNCitzdGF0aWMgaW50DQordHJhbnNj b2RlX3NlYXJjaF9wYXRoKGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvLA0KKyAgICB2 b2lkICgqY2FsbGJhY2spKGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvLCBpbnQgZGVw dGgsIHZvaWQgKmFyZyksDQorICAgIHZvaWQgKmFyZykNCit7DQorICAgIHNlYXJjaF9wYXRoX2Jm c190IGJmczsNCisgICAgc2VhcmNoX3BhdGhfcXVldWVfdCAqcTsNCisgICAgc3RfZGF0YV90IHZh bDsNCisgICAgc3RfdGFibGUgKnRhYmxlMjsNCisgICAgaW50IGZvdW5kOw0KKw0KKyAgICBxID0g QUxMT0Moc2VhcmNoX3BhdGhfcXVldWVfdCk7DQorICAgIHEtPmVuYyA9IGZyb207DQorICAgIHEt Pm5leHQgPSBOVUxMOw0KKyAgICBiZnMucXVldWVfbGFzdF9wdHIgPSAmcS0+bmV4dDsNCisgICAg YmZzLnF1ZXVlID0gcTsNCisNCisgICAgYmZzLnZpc2l0ZWQgPSBzdF9pbml0X3N0cmNhc2V0YWJs ZSgpOw0KKyAgICBzdF9hZGRfZGlyZWN0KGJmcy52aXNpdGVkLCAoc3RfZGF0YV90KWZyb20sIChz dF9kYXRhX3QpTlVMTCk7DQorDQorICAgIHdoaWxlIChiZnMucXVldWUpIHsNCisgICAgICAgIHEg PSBiZnMucXVldWU7DQorICAgICAgICBiZnMucXVldWUgPSBxLT5uZXh0Ow0KKyAgICAgICAgaWYg KCFiZnMucXVldWUpDQorICAgICAgICAgICAgYmZzLnF1ZXVlX2xhc3RfcHRyID0gJmJmcy5xdWV1 ZTsNCisNCisgICAgICAgIGlmICghc3RfbG9va3VwKHRyYW5zY29kZXJfdGFibGUsIChzdF9kYXRh X3QpcS0+ZW5jLCAmdmFsKSkgew0KKyAgICAgICAgICAgIHhmcmVlKHEpOw0KKyAgICAgICAgICAg IGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGFibGUyID0gKHN0X3RhYmxlICopdmFs Ow0KKw0KKyAgICAgICAgaWYgKHN0X2xvb2t1cCh0YWJsZTIsIChzdF9kYXRhX3QpdG8sICZ2YWwp KSB7DQorICAgICAgICAgICAgc3RfYWRkX2RpcmVjdChiZnMudmlzaXRlZCwgKHN0X2RhdGFfdCl0 bywgKHN0X2RhdGFfdClxLT5lbmMpOw0KKyAgICAgICAgICAgIHhmcmVlKHEpOw0KKyAgICAgICAg ICAgIGZvdW5kID0gMTsNCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7DQorICAgICAgICB9DQor DQorICAgICAgICBiZnMuYmFzZV9lbmMgPSBxLT5lbmM7DQorICAgICAgICBzdF9mb3JlYWNoKHRh YmxlMiwgdHJhbnNjb2RlX3NlYXJjaF9wYXRoX2ksIChzdF9kYXRhX3QpJmJmcyk7DQorICAgICAg ICBiZnMuYmFzZV9lbmMgPSBOVUxMOw0KKw0KKyAgICAgICAgeGZyZWUocSk7DQorICAgIH0NCisg ICAgZm91bmQgPSAwOw0KKw0KK2NsZWFudXA6DQorICAgIHdoaWxlIChiZnMucXVldWUpIHsNCisg ICAgICAgIHEgPSBiZnMucXVldWU7DQorICAgICAgICBiZnMucXVldWUgPSBxLT5uZXh0Ow0KKyAg ICAgICAgeGZyZWUocSk7DQorICAgIH0NCisNCisgICAgaWYgKGZvdW5kKSB7DQorICAgICAgICBj b25zdCBjaGFyICplbmMgPSB0bzsNCisgICAgICAgIGludCBkZXB0aCA9IDA7DQorICAgICAgICB3 aGlsZSAoMSkgew0KKyAgICAgICAgICAgIHN0X2xvb2t1cChiZnMudmlzaXRlZCwgKHN0X2RhdGFf dCllbmMsICZ2YWwpOw0KKyAgICAgICAgICAgIGlmICghdmFsKQ0KKyAgICAgICAgICAgICAgICBi cmVhazsNCisgICAgICAgICAgICBkZXB0aCsrOw0KKyAgICAgICAgICAgIGVuYyA9IChjb25zdCBj aGFyICopdmFsOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZW5jID0gdG87DQorICAgICAgICB3aGls ZSAoMSkgew0KKyAgICAgICAgICAgIHN0X2xvb2t1cChiZnMudmlzaXRlZCwgKHN0X2RhdGFfdCll bmMsICZ2YWwpOw0KKyAgICAgICAgICAgIGlmICghdmFsKQ0KKyAgICAgICAgICAgICAgICBicmVh azsNCisgICAgICAgICAgICBjYWxsYmFjaygoY29uc3QgY2hhciAqKXZhbCwgZW5jLCAtLWRlcHRo LCBhcmcpOw0KKyAgICAgICAgICAgIGVuYyA9IChjb25zdCBjaGFyICopdmFsOw0KKyAgICAgICAg fQ0KKyAgICB9DQorDQorICAgIHN0X2ZyZWVfdGFibGUoYmZzLnZpc2l0ZWQpOw0KKw0KKyAgICBy ZXR1cm4gZm91bmQ7DQorfQ0KKw0KK3N0YXRpYyB2b2lkDQordHJhbnNjb2RlX2Rpc3BhdGNoX2Ni KGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvLCBpbnQgZGVwdGgsIHZvaWQgKmFyZykN Cit7DQorICAgIGNvbnN0IHJiX3RyYW5zY29kZXIgKipmaXJzdF90cmFuc2NvZGVyX3B0ciA9IChj b25zdCByYl90cmFuc2NvZGVyICoqKWFyZzsNCisNCisgICAgdHJhbnNjb2Rlcl9lbnRyeV90ICpl bnRyeTsNCisNCisgICAgaWYgKCEqZmlyc3RfdHJhbnNjb2Rlcl9wdHIpDQorICAgICAgICByZXR1 cm47DQorDQorICAgIGVudHJ5ID0gZ2V0X3RyYW5zY29kZXJfZW50cnkoZnJvbSwgdG8pOw0KKyAg ICBpZiAoIWVudHJ5KQ0KKyAgICAgICAgZ290byBmYWlsZWQ7DQorDQorICAgIGlmICghZW50cnkt PnRyYW5zY29kZXIgJiYgZW50cnktPmxpYikgew0KKyAgICAgICAgY29uc3QgY2hhciAqbGliID0g ZW50cnktPmxpYjsNCisgICAgICAgIGludCBsZW4gPSBzdHJsZW4obGliKTsNCisgICAgICAgIGNo YXIgcGF0aFtzaXplb2YodHJhbnNjb2Rlcl9saWJfcHJlZml4KSArIE1BWF9UUkFOU0NPREVSX0xJ Qk5BTUVfTEVOXTsNCisNCisgICAgICAgIGVudHJ5LT5saWIgPSBOVUxMOw0KKw0KKyAgICAgICAg aWYgKGxlbiA+IE1BWF9UUkFOU0NPREVSX0xJQk5BTUVfTEVOKSBnb3RvIGZhaWxlZDsNCisgICAg ICAgIG1lbWNweShwYXRoLCB0cmFuc2NvZGVyX2xpYl9wcmVmaXgsIHNpemVvZih0cmFuc2NvZGVy X2xpYl9wcmVmaXgpIC0gMSk7DQorICAgICAgICBtZW1jcHkocGF0aCArIHNpemVvZih0cmFuc2Nv ZGVyX2xpYl9wcmVmaXgpIC0gMSwgbGliLCBsZW4gKyAxKTsNCisgICAgICAgIGlmICghcmJfcmVx dWlyZShwYXRoKSkgZ290byBmYWlsZWQ7DQorICAgIH0NCisgICAgaWYgKCFlbnRyeS0+dHJhbnNj b2RlcikNCisgICAgICAgIGdvdG8gZmFpbGVkOw0KKw0KKyAgICBpZiAoZGVwdGggPT0gMCkNCisg ICAgICAgICpmaXJzdF90cmFuc2NvZGVyX3B0ciA9IGVudHJ5LT50cmFuc2NvZGVyOw0KKw0KKyAg ICByZXR1cm47DQorDQorZmFpbGVkOg0KKyAgICAqZmlyc3RfdHJhbnNjb2Rlcl9wdHIgPSBOVUxM Ow0KKyAgICByZXR1cm47DQorfQ0KKw0KIHN0YXRpYyBjb25zdCByYl90cmFuc2NvZGVyICoNCiB0 cmFuc2NvZGVfZGlzcGF0Y2goY29uc3QgY2hhciAqZnJvbV9lbmNvZGluZywgY29uc3QgY2hhciAq dG9fZW5jb2RpbmcpDQogew0KLSAgICBjaGFyICpjb25zdCBrZXkgPSB0cmFuc2NvZGVyX2tleShm cm9tX2VuY29kaW5nLCB0b19lbmNvZGluZyk7DQotICAgIHN0X2RhdGFfdCBrLCB2YWwgPSAwOw0K KyAgICBjb25zdCByYl90cmFuc2NvZGVyICpmaXJzdF90cmFuc2NvZGVyID0gKHJiX3RyYW5zY29k ZXIgKikxOw0KIA0KLSAgICB3aGlsZSAoIXN0X2xvb2t1cCh0cmFuc2NvZGVyX3RhYmxlLCAoayA9 IChzdF9kYXRhX3Qpa2V5KSwgJnZhbCkgJiYNCi0JICAgc3RfZGVsZXRlKHRyYW5zY29kZXJfbGli X3RhYmxlLCAmaywgJnZhbCkpIHsNCi0JY29uc3QgY2hhciAqY29uc3QgbGliID0gKGNvbnN0IGNo YXIgKil2YWw7DQotCWludCBsZW4gPSBzdHJsZW4obGliKTsNCi0JY2hhciBwYXRoW3NpemVvZih0 cmFuc2NvZGVyX2xpYl9wcmVmaXgpICsgTUFYX1RSQU5TQ09ERVJfTElCTkFNRV9MRU5dOw0KLQ0K LQl4ZnJlZSgoY2hhciAqKWspOw0KLQlpZiAobGVuID4gTUFYX1RSQU5TQ09ERVJfTElCTkFNRV9M RU4pIHJldHVybiBOVUxMOw0KLQltZW1jcHkocGF0aCwgdHJhbnNjb2Rlcl9saWJfcHJlZml4LCBz aXplb2YodHJhbnNjb2Rlcl9saWJfcHJlZml4KSAtIDEpOw0KLQltZW1jcHkocGF0aCArIHNpemVv Zih0cmFuc2NvZGVyX2xpYl9wcmVmaXgpIC0gMSwgbGliLCBsZW4gKyAxKTsNCi0JaWYgKCFyYl9y ZXF1aXJlKHBhdGgpKSByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLSAgICBpZiAoIXZhbCkgew0KLQlp ZiAoIXN0X2xvb2t1cCh0cmFuc2NvZGVyX3RhYmxlLCAoc3RfZGF0YV90KWtleSwgJnZhbCkpIHsN Ci0JICAgIHhmcmVlKGtleSk7DQotCSAgICAvKiBtdWx0aXN0ZXAgbG9naWMsIHZpYSBVVEYtOCAq Lw0KLQkgICAgaWYgKCFlbmNvZGluZ19lcXVhbChmcm9tX2VuY29kaW5nLCAiVVRGLTgiKSAmJg0K LQkJIWVuY29kaW5nX2VxdWFsKHRvX2VuY29kaW5nLCAiVVRGLTgiKSAmJg0KLQkJdHJhbnNjb2Rl X2Rpc3BhdGNoKCJVVEYtOCIsIHRvX2VuY29kaW5nKSkgeyAgLyogY2hlY2sgdGhhdCB3ZSBoYXZl IGEgc2Vjb25kIHN0ZXAgKi8NCi0JCXJldHVybiB0cmFuc2NvZGVfZGlzcGF0Y2goZnJvbV9lbmNv ZGluZywgIlVURi04Iik7IC8qIHJldHVybiBmaXJzdCBzdGVwICovDQotCSAgICB9DQotCSAgICBy ZXR1cm4gTlVMTDsNCi0JfQ0KKyAgICBpZiAodHJhbnNjb2RlX3NlYXJjaF9wYXRoKGZyb21fZW5j b2RpbmcsIHRvX2VuY29kaW5nLCB0cmFuc2NvZGVfZGlzcGF0Y2hfY2IsICh2b2lkICopJmZpcnN0 X3RyYW5zY29kZXIpKSB7DQorICAgICAgICByZXR1cm4gZmlyc3RfdHJhbnNjb2RlcjsNCiAgICAg fQ0KLSAgICB4ZnJlZShrZXkpOw0KLSAgICByZXR1cm4gKHJiX3RyYW5zY29kZXIgKil2YWw7DQor ICAgIHJldHVybiBOVUxMOw0KIH0NCiANCiBzdGF0aWMgdm9pZA0KQEAgLTI0NSwxNyArMzk4LDE3 IEBAIHRyYW5zY29kZV9sb29wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbl8NCiAJICAgICpvdXRf cCsrID0gZ2V0QlQzKG5leHRfaW5mbyk7DQogCSAgICBjb250aW51ZTsNCiAJICBjYXNlIEZVTmlp Og0KLQkgICAgbmV4dF9pbmZvID0gKFZBTFVFKSgqbXlfdHJhbnNjb2Rlci0+ZnVuY19paSkobmV4 dF9pbmZvKTsNCisJICAgIG5leHRfaW5mbyA9IChWQUxVRSkoKm15X3RyYW5zY29kZXItPmZ1bmNf aWkpKG15X3RyYW5zY29kaW5nLCBuZXh0X2luZm8pOw0KIAkgICAgZ290byBmb2xsb3dfaW5mbzsN CiAJICBjYXNlIEZVTnNpOg0KLQkgICAgbmV4dF9pbmZvID0gKFZBTFVFKSgqbXlfdHJhbnNjb2Rl ci0+ZnVuY19zaSkoY2hhcl9zdGFydCk7DQorCSAgICBuZXh0X2luZm8gPSAoVkFMVUUpKCpteV90 cmFuc2NvZGVyLT5mdW5jX3NpKShteV90cmFuc2NvZGluZywgY2hhcl9zdGFydCwgKHNpemVfdCko aW5fcC1jaGFyX3N0YXJ0KSk7DQogCSAgICBnb3RvIGZvbGxvd19pbmZvOw0KIAkgICAgYnJlYWs7 DQogCSAgY2FzZSBGVU5pbzoNCi0JICAgIG91dF9wICs9IChWQUxVRSkoKm15X3RyYW5zY29kZXIt PmZ1bmNfaW8pKG5leHRfaW5mbywgb3V0X3ApOw0KKwkgICAgb3V0X3AgKz0gKFZBTFVFKSgqbXlf dHJhbnNjb2Rlci0+ZnVuY19pbykobXlfdHJhbnNjb2RpbmcsIG5leHRfaW5mbywgb3V0X3ApOw0K IAkgICAgYnJlYWs7DQogCSAgY2FzZSBGVU5zbzoNCi0JICAgIG91dF9wICs9IChWQUxVRSkoKm15 X3RyYW5zY29kZXItPmZ1bmNfc28pKGNoYXJfc3RhcnQsIG91dF9wKTsNCisJICAgIG91dF9wICs9 IChWQUxVRSkoKm15X3RyYW5zY29kZXItPmZ1bmNfc28pKG15X3RyYW5zY29kaW5nLCBjaGFyX3N0 YXJ0LCAoc2l6ZV90KShpbl9wLWNoYXJfc3RhcnQpLCBvdXRfcCk7DQogCSAgICBicmVhazsNCiAJ ICBjYXNlIElOVkFMSUQ6DQogCSAgICBnb3RvIGludmFsaWQ7DQpAQCAtMjkwLDYgKzQ0MywxNiBA QCB0cmFuc2NvZGVfbG9vcChjb25zdCB1bnNpZ25lZCBjaGFyICoqaW5fDQogCWNvbnRpbnVlOw0K ICAgICB9DQogICAgIC8qIGNsZWFudXAgKi8NCisgICAgaWYgKG15X3RyYW5zY29kZXItPmZpbmlz aF9mdW5jKSB7DQorCWlmIChvdXRfcCA+PSBvdXRfcykgew0KKwkgICAgaW50IGxlbiA9IChvdXRf cCAtICpvdXRfcG9zKTsNCisJICAgIGludCBuZXdfbGVuID0gKGxlbiArIG15X3RyYW5zY29kZXIt Pm1heF9vdXRwdXQpICogMjsNCisJICAgICpvdXRfcG9zID0gKCpteV90cmFuc2NvZGluZy0+Zmx1 c2hfZnVuYykobXlfdHJhbnNjb2RpbmcsIGxlbiwgbmV3X2xlbik7DQorCSAgICBvdXRfcCA9ICpv dXRfcG9zICsgbGVuOw0KKwkgICAgb3V0X3MgPSAqb3V0X3BvcyArIG5ld19sZW4gLSBteV90cmFu c2NvZGVyLT5tYXhfb3V0cHV0Ow0KKwl9DQorICAgICAgICBvdXRfcCArPSBteV90cmFuc2NvZGVy LT5maW5pc2hfZnVuYyhteV90cmFuc2NvZGluZywgb3V0X3ApOw0KKyAgICB9DQogICAgICppbl9w b3MgID0gaW5fcDsNCiAgICAgKm91dF9wb3MgPSBvdXRfcDsNCiB9DQpAQCAtNDAxLDIxICs1NjQs OCBAQCBzdHJfdHJhbnNjb2RlKGludCBhcmdjLCBWQUxVRSAqYXJndiwgVkFMDQogCX0NCiANCiAJ bXlfdHJhbnNjb2RpbmcudHJhbnNjb2RlciA9IG15X3RyYW5zY29kZXI7DQorICAgICAgICBtZW1z ZXQobXlfdHJhbnNjb2Rpbmcuc3RhdGVmdWwsIDAsIHNpemVvZihteV90cmFuc2NvZGluZy5zdGF0 ZWZ1bCkpOw0KIA0KLQlpZiAobXlfdHJhbnNjb2Rlci0+cHJlcHJvY2Vzc29yKSB7DQotCSAgICBm cm9tcCA9IHNwID0gKHVuc2lnbmVkIGNoYXIgKilSU1RSSU5HX1BUUihzdHIpOw0KLQkgICAgc2xl biA9IFJTVFJJTkdfTEVOKHN0cik7DQotCSAgICBibGVuID0gc2xlbiArIDMwOyAvKiBsZW4gKyBt YXJnaW4gKi8NCi0JICAgIGRlc3QgPSByYl9zdHJfdG1wX25ldyhibGVuKTsNCi0JICAgIGJwID0g KHVuc2lnbmVkIGNoYXIgKilSU1RSSU5HX1BUUihkZXN0KTsNCi0JICAgIG15X3RyYW5zY29kaW5n LnJ1Ynlfc3RyaW5nX2Rlc3QgPSBkZXN0Ow0KLQkgICAgKCpteV90cmFuc2NvZGVyLT5wcmVwcm9j ZXNzb3IpKCZmcm9tcCwgJmJwLCAoc3Arc2xlbiksIChicCtibGVuKSwgJm15X3RyYW5zY29kaW5n KTsNCi0JICAgIGlmIChmcm9tcCAhPSBzcCtzbGVuKSB7DQotCQlyYl9yYWlzZShyYl9lQXJnRXJy b3IsICJub3QgZnVsbHkgY29udmVydGVkLCAlIlBSSWRQVFJESUZGIiBieXRlcyBsZWZ0Iiwgc3Ar c2xlbi1mcm9tcCk7DQotCSAgICB9DQotCSAgICByYl9zdHJfc2V0X2xlbihkZXN0LCAoY2hhciAq KWJwIC0gUlNUUklOR19QVFIoZGVzdCkpOw0KLQkgICAgc3RyID0gZGVzdDsNCi0JfQ0KIAlmcm9t cCA9IHNwID0gKHVuc2lnbmVkIGNoYXIgKilSU1RSSU5HX1BUUihzdHIpOw0KIAlzbGVuID0gUlNU UklOR19MRU4oc3RyKTsNCiAJYmxlbiA9IHNsZW4gKyAzMDsgLyogbGVuICsgbWFyZ2luICovDQpA QCAtNDMxLDIxICs1ODEsNiBAQCBzdHJfdHJhbnNjb2RlKGludCBhcmdjLCBWQUxVRSAqYXJndiwg VkFMDQogCWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopUlNUUklOR19QVFIoZGVzdCk7DQogCSpicCA9 ICdcMCc7DQogCXJiX3N0cl9zZXRfbGVuKGRlc3QsIGJwIC0gYnVmKTsNCi0JaWYgKG15X3RyYW5z Y29kZXItPnBvc3Rwcm9jZXNzb3IpIHsNCi0JICAgIHN0ciA9IGRlc3Q7DQotCSAgICBmcm9tcCA9 IHNwID0gKHVuc2lnbmVkIGNoYXIgKilSU1RSSU5HX1BUUihzdHIpOw0KLQkgICAgc2xlbiA9IFJT VFJJTkdfTEVOKHN0cik7DQotCSAgICBibGVuID0gc2xlbiArIDMwOyAvKiBsZW4gKyBtYXJnaW4g Ki8NCi0JICAgIGRlc3QgPSByYl9zdHJfdG1wX25ldyhibGVuKTsNCi0JICAgIGJwID0gKHVuc2ln bmVkIGNoYXIgKilSU1RSSU5HX1BUUihkZXN0KTsNCi0JICAgIG15X3RyYW5zY29kaW5nLnJ1Ynlf c3RyaW5nX2Rlc3QgPSBkZXN0Ow0KLQkgICAgKCpteV90cmFuc2NvZGVyLT5wb3N0cHJvY2Vzc29y KSgmZnJvbXAsICZicCwgKHNwK3NsZW4pLCAoYnArYmxlbiksICZteV90cmFuc2NvZGluZyk7DQot CSAgICBpZiAoZnJvbXAgIT0gc3Arc2xlbikgew0KLQkJcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAi bm90IGZ1bGx5IGNvbnZlcnRlZCwgJSJQUklkUFRSRElGRiIgYnl0ZXMgbGVmdCIsIHNwK3NsZW4t ZnJvbXApOw0KLQkgICAgfQ0KLQkgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKilSU1RSSU5HX1BU UihkZXN0KTsNCi0JICAgIHJiX3N0cl9zZXRfbGVuKGRlc3QsIGJwIC0gYnVmKTsNCi0JfQ0KIA0K IAlpZiAoZW5jb2RpbmdfZXF1YWwobXlfdHJhbnNjb2Rlci0+dG9fZW5jb2RpbmcsIHRvX2UpKSB7 DQogCSAgICBmaW5hbF9lbmNvZGluZyA9IDE7DQpAQCAtNTQxLDcgKzY3Niw2IEBAIHZvaWQNCiBJ bml0X3RyYW5zY29kZSh2b2lkKQ0KIHsNCiAgICAgdHJhbnNjb2Rlcl90YWJsZSA9IHN0X2luaXRf c3RyY2FzZXRhYmxlKCk7DQotICAgIHRyYW5zY29kZXJfbGliX3RhYmxlID0gc3RfaW5pdF9zdHJj YXNldGFibGUoKTsNCiANCiAgICAgc3ltX2ludmFsaWQgPSBJRDJTWU0ocmJfaW50ZXJuKCJpbnZh bGlkIikpOw0KICAgICBzeW1fdW5kZWYgPSBJRDJTWU0ocmJfaW50ZXJuKCJ1bmRlZiIpKTsNCi0t IA0KW5NjkoYgk05dW4K9gsiCqSCCoIKrguddW1RhbmFrYSBBa2lyYV0NCg==