LyoKICogV1BBIFN1cHBsaWNhbnQgLSBkcml2ZXIgaW50ZXJhY3Rpb24gd2l0aCBUSSBzdGF0aW9uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgQlNECiAqIGxpY2Vuc2UuCiAqCiAqLwoKLyogQ29weXJpZ2h0IKkgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIChPY3QgMjAwNSkKICogVEhJUyBDT0RFL1BST0dSQU0gSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKICogRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVERUQgQlVUIE5PVCBMSU1JVEVEIFRPICwgVEhFIElNUExJRUQKICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAKICogVGhpcyBwcm9ncmFtIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaXRzIG9yaWdpbmFsIG9wZXJhdGlvbiBieSBUZXhhcyAKICogSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkLiBUaGVzZSBjaGFuZ2VzIGFyZSBjb3ZlcmVkIHVuZGVyIHZlcnNpb24gMiAKICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBkYXRlZCBKdW5lIDE5OTEuCiAqCiAqIENvcHlyaWdodCCpIEdvb2dsZSBJbmMgKEZlYiAyMDA4KQoqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAiaW5jbHVkZXMuaCIKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiNpbmNsdWRlIDxuZXQvaWYuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgImNvbW1vbi5oIgojaW5jbHVkZSAiZHJpdmVyLmgiCiNpbmNsdWRlICJlbG9vcC5oIgojaW5jbHVkZSAid3BhLmgiCiNpbmNsdWRlICJ3cGFfc3VwcGxpY2FudC5oIgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3cGFfc3VwcGxpY2FudF9pLmgiCiNpbmNsdWRlICJ3cGFfaS5oIgojaW5jbHVkZSAibDJfcGFja2V0LmgiCiNpbmNsdWRlICJ3cGFfY3RybC5oIgovKi0tLS0tIFNUQV9ESyBmaWxlcyAtLS0tLSovCiNpbmNsdWRlICJ3c3BWZXIuaCIKI2luY2x1ZGUgImRyaXZlcl90aS5oIgojaW5jbHVkZSAic2Nhbm1lcmdlLmgiCiNpbmNsdWRlICJzY2FuTW5nclR5cGVzLmgiCiNpZmRlZiBBTkRST0lECiNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgojZW5kaWYKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZSBUSV9EUklWRVJfTVNHX1BPUlQgICAgICAgOTAwMAojZGVmaW5lIFJYX1NFTEZfRklMVEVSICAgICAgICAgICAwCiNkZWZpbmUgUlhfQlJPQURDQVNUX0ZJTFRFUiAgICAgIDEKI2RlZmluZSBSWF9JUFY0X01VTFRJQ0FTVF9GSUxURVIgMgojZGVmaW5lIFJYX0lQVjZfTVVMVElDQVNUX0ZJTFRFUiAzCiNkZWZpbmUgVEkyV1BBX1NUQVRVUyhzKSAgICAgICAgICgoKHMpICE9IE9LKSA/IC0xIDogMCkKI2RlZmluZSBUSV9DSEVDS19EUklWRVIoZixyKSAgICAgXAogICAgaWYoICEoZikgKSB7IFwKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiVEk6IERyaXZlciBub3QgaW5pdGlhbGl6ZWQgeWV0Li4uYWJvcnRpbmcuLi4iKTsgXAogICAgICAgIHJldHVybiggciApOyBcCiAgICB9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIExvY2sgZmlsZSBwb2ludGVyIC0gdXNlZCB0byBhY2Nlc3MgcGlkLWxvY2stZmlsZSB0byBwcmV2ZW50IHR3byBpbnN0YW5jZXMgb2Ygd3BhX3N1cHBsaWNhbnQgKi8KI2lmZGVmIENPTkZJR19USV9MT0NLRklMRQpzdGF0aWMgaW50IGxmcDsKI2VuZGlmCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogY2hlY2tfYW5kX2dldF9idWlsZF9jaGFubmVscwpSb3V0aW5lIERlc2NyaXB0aW9uOiBnZXQgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMgYWNjb3JkaW5nIHRvIGEgYnVpbGQgdmFyLgpBcmd1bWVudHM6IE5vbmUKUmV0dXJuIFZhbHVlOiBOdW1iZXIgb2YgY2hhbm5lbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IGNoZWNrX2FuZF9nZXRfYnVpbGRfY2hhbm5lbHMoIHZvaWQgKQp7CiNpZmRlZiBBTkRST0lECiAgICBjaGFyIHByb3Bfc3RhdHVzW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICBjaGFyICpwcm9wX25hbWUgPSAicm8ud2lmaS5jaGFubmVscyI7CiAgICBpbnQgaSwgZGVmYXVsdF9jaGFubmVscyA9IE5VTUJFUl9TQ0FOX0NIQU5ORUxTX0ZDQzsKCiAgICBpZiggcHJvcGVydHlfZ2V0KHByb3BfbmFtZSwgcHJvcF9zdGF0dXMsIE5VTEwpICkgewogICAgICAgIGkgPSBhdG9pKHByb3Bfc3RhdHVzKTsKICAgICAgICBpZiggaSAhPSAwICkKICAgICAgICAgICAgZGVmYXVsdF9jaGFubmVscyA9IGk7CiAgICB9CiAgICByZXR1cm4oIGRlZmF1bHRfY2hhbm5lbHMgKTsKI2Vsc2UKICAgIHJldHVybiggTlVNQkVSX1NDQU5fQ0hBTk5FTFNfRkNDICk7CiNlbmRpZgp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9ldmVudF9yZWNlaXZlClJvdXRpbmUgRGVzY3JpcHRpb246IGRyaXZlciBldmVudHMgY2FsbGJhY2ssIGNhbGxlZCBmcm9tIGRyaXZlciBJUEMKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHBEYXRhIC0gcG9pbnRlciB0byBldmVudCBpbmZvcm1hdGlvbgpSZXR1cm4gVmFsdWU6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFfZHJpdmVyX3Rpc3RhX2V2ZW50X3JlY2VpdmUoIElQQ19FVl9EQVRBICpwRGF0YSApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15U3VwcGw7CiAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZWNob3NlcnZlcjsKICAgIGludCByZXMsIG1zZ19zaXplOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX2V2ZW50X3JlY2VpdmUgY2FsbGVkOiAlZCIsCiAgICAgICAgICAgICAgIHBEYXRhLT51QnVmZmVyU2l6ZSk7CgogICAgbXlTdXBwbCA9IHBEYXRhLT5FdlBhcmFtcy5oVXNlclBhcmFtOwogICAgbXNnX3NpemUgPSAoaW50KShwRGF0YS0+dUJ1ZmZlclNpemUgKyBvZmZzZXRvZihJUENfRVZfREFUQSwgdUJ1ZmZlcikpOwoKICAgIG9zX21lbXNldCggJmVjaG9zZXJ2ZXIsIDAsIHNpemVvZihlY2hvc2VydmVyKSApOyAgICAgLyogQ2xlYXIgc3RydWN0ICovCiAgICBlY2hvc2VydmVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOyAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybmV0L0lQICovCiAgICBlY2hvc2VydmVyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigiMTI3LjAuMC4xIik7IC8qIElQIGFkZHJlc3MgKi8KICAgIGVjaG9zZXJ2ZXIuc2luX3BvcnQgPSBodG9ucyhUSV9EUklWRVJfTVNHX1BPUlQpOyAgICAgLyogc2VydmVyIHBvcnQgKi8KCiAgICByZXMgPSBzZW5kdG8obXlTdXBwbC0+ZHJpdmVyRXZlbnRzU29ja2V0LCBwRGF0YSwgbXNnX3NpemUsIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmZWNob3NlcnZlciwgc2l6ZW9mKGVjaG9zZXJ2ZXIpKTsKICAgIGVjaG9zZXJ2ZXIuc2luX3BvcnQgPSBodG9ucyhUSV9EUklWRVJfTVNHX1BPUlQgKyAxKTsKICAgIHJlcyA9IHNlbmR0byhteVN1cHBsLT5kcml2ZXJFdmVudHNTb2NrZXQsIHBEYXRhLCBtc2dfc2l6ZSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZlY2hvc2VydmVyLCBzaXplb2YoZWNob3NlcnZlcikpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9yZWdpc3Rlcl9ldmVudHMKUm91dGluZSBEZXNjcmlwdGlvbjogcmVnaXN0ZXIgdG8gZHJpdmVyIGV2ZW50cwpBcmd1bWVudHM6CiAgIGN0eCAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQpSZXR1cm4gVmFsdWU6IE5vbmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYV9kcml2ZXJfdGlzdGFfcmVnaXN0ZXJfZXZlbnRzKCB2b2lkICpjdHggKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopY3R4OwogICAgSVBDX0VWRU5UX1BBUkFNUyBwRXZlbnQ7CiAgICBpbnQgaTsKCiAgICBvc19tZW1zZXQoIG15RHJ2LT5oRXZlbnRzLCAwLCBzaXplb2YoVUxPTkcpICogSVBDX0VWRU5UX01BWCApOwogICAgZm9yKGk9SVBDX0VWRU5UX0FTU09DSUFURUQ7KCBpIDwgSVBDX0VWRU5UX01BWCApO2krKykgewogICAgICAgIC8qIFJlZ2lzdGVyIHRvIHJlY2VpdmUgZHJpdmVyIGV2ZW50cyAqLwogICAgICAgIHBFdmVudC51RXZlbnRUeXBlICAgICAgID0gaTsKICAgICAgICBwRXZlbnQudURlbGl2ZXJ5VHlwZSAgICA9IERFTElWRVJZX1BVU0g7CiAgICAgICAgcEV2ZW50LmhVc2VyUGFyYW0gICAgICAgPSAoVElfSEFORExFKW15RHJ2OwogICAgICAgIHBFdmVudC5wZkV2ZW50Q2FsbGJhY2sgID0gKFRJX0VWRU5UX0NBTExCQUNLKXdwYV9kcml2ZXJfdGlzdGFfZXZlbnRfcmVjZWl2ZTsKICAgICAgICBUSV9SZWdpc3RlckV2ZW50KCBteURydi0+aERyaXZlciwgJnBFdmVudCApOwogICAgICAgIG15RHJ2LT5oRXZlbnRzW2ldID0gcEV2ZW50LnVFdmVudElEOwogICAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV91bnJlZ2lzdGVyX2V2ZW50cwpSb3V0aW5lIERlc2NyaXB0aW9uOiB1bnJlZ2lzdGVyIGRyaXZlciBldmVudHMKQXJndW1lbnRzOgogICBjdHggLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKUmV0dXJuIFZhbHVlOiBOb25lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFfZHJpdmVyX3Rpc3RhX3VucmVnaXN0ZXJfZXZlbnRzKCB2b2lkICpjdHggKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopY3R4OwogICAgSVBDX0VWRU5UX1BBUkFNUyBwRXZlbnQ7CiAgICBpbnQgaWR4OwoKICAgIGZvcihpZHg9MDsoIGlkeCA8IElQQ19FVkVOVF9NQVggKTtpZHgrKykgewogICAgICAgIGlmKCBteURydi0+aEV2ZW50c1tpZHhdICkgewogICAgICAgICAgICBwRXZlbnQudUV2ZW50VHlwZSA9IGlkeDsKICAgICAgICAgICAgcEV2ZW50LnVFdmVudElEID0gbXlEcnYtPmhFdmVudHNbaWR4XTsKICAgICAgICAgICAgVElfVW5SZWdpc3RlckV2ZW50KCBteURydi0+aERyaXZlciwgJnBFdmVudCApOwogICAgICAgIH0KICAgIH0KfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X2Jzc2lkClJvdXRpbmUgRGVzY3JpcHRpb246IGdldCBjdXJyZW50IEJTU0lEIGZyb20gZHJpdmVyCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBic3NpZCAtIHBvaW50ZXIgdG8gaG9sZCBic3NpZApSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9nZXRfYnNzaWQoIHZvaWQgKnByaXYsIHU4ICpic3NpZCApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgT1NfODAyXzExX01BQ19BRERSRVNTIHRpQVBNYWNBZGRyOwogICAgVElfU1RBVFVTIHJldFZhbHVlOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAid3BhX2RyaXZlcl90aXN0YV9nZXRfYnNzaWQgY2FsbGVkIik7CgogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICAvKiBHZXQgTUFDIGFkZHJlc3Mgb2YgY3VycmVudCBBUCAqLwogICAgaWYoIFRJX0dldEJTU0lEKCBteURydi0+aERyaXZlciwgJnRpQVBNYWNBZGRyICkgIT0gVElfUkVTVUxUX09LICkKICAgICAgICByZXR1cm4oIC0xICk7CgogICAgLyogQ29weSBCU1NJRCBpbnRvIGNhbGxlciBwb2ludGVyIHByb3ZpZGVkIGluIHJvdXRpbmUgcGFyYW1ldGVycyAqLwogICAgb3NfbWVtY3B5KCAodm9pZCAqKWJzc2lkLCAodm9pZCAqKSZ0aUFQTWFjQWRkciwgTUFDX0FERFJfTEVOICk7CiAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJnZXRfYnNzaWQ6IiwgYnNzaWQsIE1BQ19BRERSX0xFTik7CiAgICByZXR1cm4oIDAgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X3NzaWQKUm91dGluZSBEZXNjcmlwdGlvbjogZ2V0IGN1cnJlbnQgU1NJRApBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgc3NpZCAtIHBvaW50ZXIgdG8gaG9sZCBjdXJyZW50IGJzc2lkClJldHVybiBWYWx1ZTogTGVuZ3RoIG9mIFNTSUQgc3RyaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX2dldF9zc2lkKCB2b2lkICpwcml2LCB1OCAqc3NpZCApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgT1NfODAyXzExX1NTSUQgbXlzc2lkOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX2dldF9zc2lkIGNhbGxlZCIpOwoKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgLyogR2V0IGN1cnJlbnQgU1NJRCBmcm9tIGRyaXZlciAqLwogICAgaWYoIFRJX0dldEN1cnJlbnRTU0lEKG15RHJ2LT5oRHJpdmVyLCAmbXlzc2lkKSAhPSBUSV9SRVNVTFRfT0sgKQogICAgICAgIHJldHVybiggLTEgKTsKCiAgICAvKiBDb3B5IHRvIHVzZXIgc3VwcGxpZWQgcG9pbnRlciAqLwogICAgb3NfbWVtY3B5KCAodm9pZCAqKXNzaWQsICh2b2lkICopJm15c3NpZC5Tc2lkLCBteXNzaWQuU3NpZExlbmd0aCApOwoKICAgIC8qIFJldHVybiBsZW5ndGggb2YgU1NJRCAqLwogICAgcmV0dXJuKCBteXNzaWQuU3NpZExlbmd0aCApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfc3NpZApSb3V0aW5lIERlc2NyaXB0aW9uOiBzZXRzIGN1cnJlbnQgU1NJRCAoQXNzb2NpYXRlcykKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHNzaWQgLSBwb2ludGVyIHRvIHNzaWQKICAgc3NpZF9sZW4gLSBsZW5ndGggb2Ygc3NpZApSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfc3NpZCggdm9pZCAqcHJpdiwgY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgY2hhciBzc2lkQnVmW01BWF9TU0lEX0xFTl07CiAgICBpbnQgcmV0OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3NldF9zc2lkIGNhbGxlZDogJXMiLCBzc2lkKTsKCiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIC8qIENvcHkgdXNlciBzdXBwbGllZCBTU0lEIGludG8gbG9jYWwgYnVmZmVyICovCiAgICBvc19tZW1zZXQoIHNzaWRCdWYsIDAsIE1BWF9TU0lEX0xFTiApOwogICAgb3NfbWVtY3B5KCBzc2lkQnVmLCBzc2lkLCBzc2lkX2xlbiApOwoKICAgIC8qIFNldCBsb2NhbCBTU0lEIGJ1ZmZlciB0byBkcml2ZXIgLSB0cmlnZ2VyaW5nIGNvbm5lY3Rpb24gcHJvY2VzcyBpbiBkcml2ZXIgKi8KICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJBc3NvY2lhdGU6IFNTSUQgPSAlcyIsIHNzaWRCdWYpOyAvKiBEbTogKi8KI2lmZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKICAgIHJldCA9IChpbnQpVElfU2V0U1NJRCggbXlEcnYtPmhEcml2ZXIsIChjaGFyICopc3NpZEJ1ZiApOwojZWxzZQogICAgcmV0ID0gKGludClUSV9TZXRTU0lEKCBteURydi0+aERyaXZlciwgKHU4ICopc3NpZEJ1ZiApOwojZW5kaWYKICAgIHJldHVybiggVEkyV1BBX1NUQVRVUyhyZXQpICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGEKUm91dGluZSBEZXNjcmlwdGlvbjogZW5hYmxlL2Rpc2FibGUgV1BBIHN1cHBvcnQgaW4gZHJpdmVyIC0gbm90IGltcGxlbWVudGVkIHNpbmNlIG5vdCBzdXBwb3J0ZWQgaW4gZHJpdmVyLiBhbHNvIG9ic2VsZXRlIGZvciB3cGEtc3VwcGwgY29yZQpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgZW5hYmxlZCAtIGVuYWJsZS9kaXNhYmxlIGZsYWcKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3dwYSh2b2lkICpwcml2LCBpbnQgZW5hYmxlZCkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X3dwYSBjYWxsZWQ6ICVkIixlbmFibGVkKTsKICAgIHJldHVybiggMCApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfcHJvdG8KUm91dGluZSBEZXNjcmlwdGlvbjogc2V0IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIChXUEEvV1BBMihSU04pKQpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgcHJvdG8gLSBhdXRoZW50aWNhdGlvbiBzdWl0ZQpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfcHJvdG8oIHZvaWQgKnByaXYsIGludCBwcm90byApCnsKICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CgogICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9zZXRfcHJvdG8gY2FsbGVkOiAlZCIsIHByb3RvKTsKICAgbXlEcnYtPnByb3RvID0gcHJvdG87CgogICByZXR1cm4oIDAgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3dwYV9vcHRpb25zClJvdXRpbmUgRGVzY3JpcHRpb246IHNldCB3cGFfb3B0aW9ucwpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgd3BhX29wdGlvbnMgLSBXUEEgb3B0aW9ucyAoMCAtIGRpc2FibGUsIDMgLSBlbmFibGUpClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGFfb3B0aW9ucyggdm9pZCAqcHJpdiwgaW50IGtleV9tZ210X3N1aXRlICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBVSU5UMzIgd3BhX29wdCA9IFdQQV9PUFRJT05TX0RJU0FCTEU7CiAgICBpbnQgcmV0OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGFfb3B0aW9ucyBjYWxsZWQ6ICVkIiwga2V5X21nbXRfc3VpdGUpOwogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICBteURydi0+a2V5X21nbXQgPSBrZXlfbWdtdF9zdWl0ZTsKCiAgICBzd2l0Y2goIGtleV9tZ210X3N1aXRlICkgewogICAgICAgIGNhc2UgS0VZX01HTVRfODAyXzFYOiAgICAgICAgICAvKiBEbTogRUFQICovCiAgICAgICAgICAgIHdwYV9vcHQgPSBXUEFfT1BUSU9OU19FTkFCTEU7IC8qIHdwYV9hdXRoID0gMTsgKi8KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgS0VZX01HTVRfUFNLOiAgICAgICAgICAgICAvKiBEbTogUFNLICovCiAgICAgICAgICAgIHdwYV9vcHQgPSBXUEFfT1BUSU9OU19FTkFCTEU7IC8qIHdwYV9hdXRoID0gMjsgKi8KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgS0VZX01HTVRfODAyXzFYX05PX1dQQTogICAvKiBEbTogPz8/ICovCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEtFWV9NR01UX1dQQV9OT05FOiAgICAgICAgLyogRG06ID8/PyAqLwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBLRVlfTUdNVF9OT05FOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdwYV9vcHQgPSBXUEFfT1BUSU9OU19ESVNBQkxFOyAvKiB3cGFfYXV0aCA9IDI1NTsgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgLyogU2V0IFdQQSBPcHRpb25zICovCiAgICByZXQgPSBUSV9TZXRXcGFPcHRpb25zKCBteURydi0+aERyaXZlciwgd3BhX29wdCApOwogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2VuY3J5cHRpb24KUm91dGluZSBEZXNjcmlwdGlvbjogc2V0IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIChXUEEvV1BBMihSU04pKQpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgcHJvdG8gLSBhdXRoZW50aWNhdGlvbiBzdWl0ZQpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfZW5jcnlwdGlvbiggdm9pZCAqcHJpdiwgaW50IGVuY3J5cHRpb24gKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIGludCByZXQgPSAtMTsKICAgIE9TXzgwMl8xMV9FTkNSWVBUSU9OX1RZUEVTIHdwYV9jaXBoZXIgPSBPU19FTkNSWVBUSU9OX1RZUEVfTk9ORTsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9zZXRfZW5jcnlwdGlvbiBjYWxsZWQ6ICVkIixlbmNyeXB0aW9uKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgbXlEcnYtPmVuY3J5cHRpb24gPSBlbmNyeXB0aW9uOwogICAgc3dpdGNoKCBlbmNyeXB0aW9uICkgewogICAgICAgIGNhc2UgQ0lQSEVSX1dFUDQwOgogICAgICAgIGNhc2UgQ0lQSEVSX1dFUDEwNDoKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJlbmNyeXB0aW9uOiBPU19FTkNSWVBUSU9OX1RZUEVfV0VQIik7CiAgICAgICAgICAgIHdwYV9jaXBoZXIgPSBPU19FTkNSWVBUSU9OX1RZUEVfV0VQOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBDSVBIRVJfVEtJUDoKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJlbmNyeXB0aW9uOiBPU19FTkNSWVBUSU9OX1RZUEVfVEtJUCIpOwogICAgICAgICAgICB3cGFfY2lwaGVyID0gT1NfRU5DUllQVElPTl9UWVBFX1RLSVA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIENJUEhFUl9DQ01QOgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgImVuY3J5cHRpb246IE9TX0VOQ1JZUFRJT05fVFlQRV9BRVMiKTsKICAgICAgICAgICAgd3BhX2NpcGhlciA9IE9TX0VOQ1JZUFRJT05fVFlQRV9BRVM7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIENJUEhFUl9OT05FOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiZW5jcnlwdGlvbjogT1NfRU5DUllQVElPTl9UWVBFX05PTkUiKTsKICAgICAgICAgICAgd3BhX2NpcGhlciA9IE9TX0VOQ1JZUFRJT05fVFlQRV9OT05FOwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldCA9IFRJX1NldEVuY3J5cHRpb25UeXBlKCBteURydi0+aERyaXZlciwgd3BhX2NpcGhlciApOwogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYV9kcml2ZXJfdGlzdGFfcHJpbnRfYXV0aF9tb2RlKCBPU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBteUF1dGggKQp7CiAgICBjaGFyICptb2RlX25hbWUgPSBOVUxMOwoKICAgIHN3aXRjaCggbXlBdXRoICkgewogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZU9wZW46CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlT3BlbiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZVNoYXJlZDoKICAgICAgICAgICAgbW9kZV9uYW1lID0gIm9zODAyXzExQXV0aE1vZGVTaGFyZWQiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIG9zODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOgogICAgICAgICAgICBtb2RlX25hbWUgPSAib3M4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2giOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIG9zODAyXzExQXV0aE1vZGVXUEE6CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlV1BBIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBvczgwMl8xMUF1dGhNb2RlV1BBUFNLOgogICAgICAgICAgICBtb2RlX25hbWUgPSAib3M4MDJfMTFBdXRoTW9kZVdQQVBTSyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZVdQQU5vbmU6CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlV1BBTm9uZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZVdQQTI6CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlV1BBMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZVdQQTJQU0s6CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlV1BBMlBTSyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZU1heDoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBtb2RlX25hbWUgPSAiVW5rbm93biI7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJTZWxlY3RlZCBBdXRoTW9kZTogJXMiLCBtb2RlX25hbWUpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfYXV0aF9tb2RlClJvdXRpbmUgRGVzY3JpcHRpb246CkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfYXV0aF9tb2RlKCB2b2lkICpwcml2ICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBPU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKICAgIGludCByZXQ7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X2F1dGhfbW9kZSBjYWxsZWQiKTsKCiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIHdwYV9kcml2ZXJfdGlzdGFfc2V0X3Byb3RvKCBwcml2LCAoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqKW15RHJ2LT5oV3BhU3VwcGxpY2FudCktPndwYS0+cHJvdG8gKTsKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAicHJvdG86ICVkIiwgbXlEcnYtPnByb3RvKTsgLyogc2hvdWxkIGJlIHNldCBCRUZPUkUgKi8KICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiYXV0aF9hbGc6ICVkIixteURydi0+YXV0aF9hbGcpOwoKICAgIGlmKCAobXlEcnYtPmF1dGhfYWxnID09IEFVVEhfQUxHX09QRU5fU1lTVEVNKSB8fAogICAgICAgIChteURydi0+YXV0aF9hbGcgPT0gQVVUSF9BTEdfTEVBUCkgKSB7CiAgICAgICAgc3dpdGNoKCBteURydi0+a2V5X21nbXQgKSB7CiAgICAgICAgICAgIGNhc2UgS0VZX01HTVRfODAyXzFYOgogICAgICAgICAgICAgICAgaWYoIG15RHJ2LT5wcm90byAmIFdQQV9QUk9UT19XUEEgKSB7CiAgICAgICAgICAgICAgICAgICAgbXlBdXRoID0gb3M4MDJfMTFBdXRoTW9kZVdQQTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYoIG15RHJ2LT5wcm90byAmIFdQQV9QUk9UT19SU04gKSB7CiAgICAgICAgICAgICAgICAgICAgbXlBdXRoID0gb3M4MDJfMTFBdXRoTW9kZVdQQTI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBLRVlfTUdNVF9QU0s6CiAgICAgICAgICAgICAgICBpZiggbXlEcnYtPnByb3RvICYgV1BBX1BST1RPX1dQQSApIHsKICAgICAgICAgICAgICAgICAgICBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlV1BBUFNLOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiggbXlEcnYtPnByb3RvICYgV1BBX1BST1RPX1JTTiApIHsKICAgICAgICAgICAgICAgICAgICBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEtFWV9NR01UXzgwMl8xWF9OT19XUEE6CiAgICAgICAgICAgIGNhc2UgS0VZX01HTVRfV1BBX05PTkU6CiAgICAgICAgICAgICAgICBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEtFWV9NR01UX05PTkU6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlT3BlbjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG15RHJ2LT5hdXRoX2FsZyA9PSBBVVRIX0FMR19TSEFSRURfS0VZICkgewogICAgICAgIG15QXV0aCA9IG9zODAyXzExQXV0aE1vZGVTaGFyZWQ7CiAgICB9CiAgICBpZiggbXlEcnYtPmF1dGhfYWxnID09IEFVVEhfQUxHX0xFQVAgKSB7CiAgICAgICAgVElfU2V0RUFQVHlwZSggbXlEcnYtPmhEcml2ZXIsIE9TX0VBUF9UWVBFX0xFQVAgKTsKICAgICAgICBUSV9TZXRFQVBUeXBlRHJpdmVyKCBteURydi0+aERyaXZlciwgT1NfRUFQX1RZUEVfTEVBUCApOwogICAgfQogICAgd3BhX2RyaXZlcl90aXN0YV9wcmludF9hdXRoX21vZGUoIG15QXV0aCApOwogICAgcmV0ID0gVElfU2V0QXV0aGVudGljYXRpb25Nb2RlKCBteURydi0+aERyaXZlciwgbXlBdXRoICk7CiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9kZWxfa2V5ClJvdXRpbmUgRGVzY3JpcHRpb246IHJlbW92ZSBrZXkgZnJvbSBkcml2ZXIKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIGtleV9pZHggLSBrZXkgaW5kZXgKICAgYWRkciAtIGtleSBhZGRyZXNzICh1bmljYXN0L2Jyb2FkY2FzdCkKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfZGVsX2tleSh2b2lkICpwcml2LCBpbnQga2V5X2lkeCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIE9TXzgwMl8xMV9SRU1PVkVfS0VZIG15S2V5OwogICAgaW50IHJldDsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9kZWxfa2V5IGNhbGxlZCIpOwogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsImtleV9pZHggPSAlZCwgYWRkciA9ICIgVElNQUNTVFIsIGtleV9pZHgsIE1BQzJTVFIoYWRkcikpOwoKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgLyogY29weSBwYXJhbWV0ZXJzIChNQUMgb2Yga2V5IHRvIHJlbW92ZSwgZXRjKSB0byBsb2NhbCBzdHJ1Y3R1cmUgKi8KICAgIG15S2V5Lkxlbmd0aCA9IHNpemVvZihPU184MDJfMTFfUkVNT1ZFX0tFWSk7CiAgICBvc19tZW1jcHkoJm15S2V5LkJTU0lELGFkZHIsTUFDX0FERFJfTEVOKTsKICAgIG15S2V5LktleUluZGV4ID0ga2V5X2lkeDsKCiAgICAvKiBDYWxsIFV0aWxpdHkgYWRhcHRlciB0byByZW1vdmUgdGhlIGtleSAqLwogICAgcmV0ID0gVElfUmVtb3ZlS2V5KCBteURydi0+aERyaXZlciwgJm15S2V5ICk7CiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfa2V5ClJvdXRpbmUgRGVzY3JpcHRpb246IHNldCBrZXkgaW4gZHJpdmVyCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBhbGcgLSB0eXBlIG9mIGtleQogICBhZGRyIC0ga2V5IGFkZHJlc3MgKHVuaWNhc3QvYnJvYWRjYXN0KQogICBrZXlfaWR4IC0ga2V5IGluZGV4CiAgIHNldF90eCAtIHVzZSBrZXkgZm9yIGltbWlkaWF0ZSB0eAogICBzZXEgLSBzZXF1ZW5jZSBjb3VudGVyIChmb3IgcmVwbGF5IGRldGVjdGlvbikKICAgc2VxX2xlbiAtIHNlcXVlbmNlIGNvdW50ZXIgYnVmZmVyIGxlbgogICBrZXkgLSBrZXkgY29udGVudAogICBrZXlfbGVuIC0gbGVuZ3RoIG9mIGtleSAoMzIgZm9yIFRLSVAsIDE2IGZvciBBRVMpClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX3NldF9rZXkodm9pZCAqcHJpdiwgd3BhX2FsZyBhbGcsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgaW50IGtleV9pZHgsIGludCBzZXRfdHgsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNlcSwgc2l6ZV90IHNlcV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgc2l6ZV90IGtleV9sZW4pCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgT1NfODAyXzExX0tFWSBteUtleTsKICAgIE9TXzgwMl8xMV9XRVAgbXlXZXBLZXk7CiAgICBVSU5UOCB0ZW1wW1RLSVBfS0VZX0xFTkdUSF07CiAgICBpbnQgcmV0ID0gLTE7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X2tleSBjYWxsZWQiKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJhZGRfa2V5IChhZGRyKTogIiBNQUNTVFIsIE1BQzJTVFIoYWRkcikpOwogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJhZGRfa2V5IChrZXlfaWR4KTogJWQiLCBrZXlfaWR4KTsKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiYWRkX2tleSAoYWxnKTogJWQiLCBhbGcpOwogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJhZGRfa2V5IChzZXRfdHgpOiAlZCIsIHNldF90eCk7CiAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJhZGRfa2V5IChzZXEpOiIsIHNlcSwgc2VxX2xlbik7CiAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJhZGRfa2V5IChrZXkpOiIsIGtleSwga2V5X2xlbik7CgogICAgc3dpdGNoKCBrZXlfbGVuICkgewogICAgICAgIGNhc2UgVEtJUF9LRVlfTEVOR1RIOiAgICAgICAgICAvKiAzMiAqLwogICAgICAgIGNhc2UgQUVTX0tFWV9MRU5HVEg6ICAgICAgICAgICAvKiAxNiAqLwogICAgICAgICAgICAvKiBTZXQga2V5IGluZGV4ICovCiAgICAgICAgICAgIG15S2V5LktleUluZGV4ID0ga2V5X2lkeDsKICAgICAgICAgICAgLyogU2V0IGtleSBsZW5ndGggYW5kIGNvbnRlbnQgKi8KICAgICAgICAgICAgbXlLZXkuS2V5TGVuZ3RoID0ga2V5X2xlbjsKICAgICAgICAgICAgLyogU2V0IHN0cnVjdHVyZSBzaXplICovCiAgICAgICAgICAgIG15S2V5Lkxlbmd0aCA9IHNpemVvZihPU184MDJfMTFfS0VZKTsKICAgICAgICAgICAgLyogc2V0IGtleSBNQUMgYWRkcmVzcyAtIEZGOkZGOkZGOkZGOkZGOkZGIGZvciBicm9hZGNhc3QsIG90aGVyIGZvciB1bmljYXN0ICovCiAgICAgICAgICAgIG9zX21lbWNweSggJm15S2V5LkJTU0lELCBhZGRyLCBNQUNfQUREUl9MRU4gKTsKCiAgICAgICAgICAgIGlmKCBzZXFfbGVuICkgewogICAgICAgICAgICAgICAgLyogU2V0IGtleSBSU0MgKi8KICAgICAgICAgICAgICAgIG9zX21lbWNweSggJm15S2V5LktleVJTQywgc2VxLCBzZXFfbGVuICk7CiAgICAgICAgICAgICAgICBteUtleS5LZXlJbmRleCB8PSBUSVdMQU5fS0VZX0ZMQUdTX1NFVF9LRVlfUlNDOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiggc2V0X3R4ICkgewogICAgICAgICAgICAgICAgbXlLZXkuS2V5SW5kZXggfD0gVElXTEFOX0tFWV9GTEFHU19UUkFOU01JVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoIG15S2V5LkJTU0lEWzBdICE9IDB4RkYgKSB7CiAgICAgICAgICAgICAgICBteUtleS5LZXlJbmRleCB8PSBUSVdMQU5fS0VZX0ZMQUdTX1BBSVJXSVNFOwogICAgICAgICAgICB9CgogICAgICAgICAgICBvc19tZW1jcHkoICZ0ZW1wLCBrZXksIEFFU19LRVlfTEVOR1RIICk7CiAgICAgICAgICAgIGlmKCBrZXlfbGVuID09IFRLSVBfS0VZX0xFTkdUSCApIHsKICAgICAgICAgICAgICAgIC8qIG5lZWQgdG8gc3dpdGNoIFJYIGFuZCBUWCBNSUMgc2V0IHdpdGgga2V5ICh0byBtYXRjaCBkcml2ZXIgQVBJKSAqLwogICAgICAgICAgICAgICAgb3NfbWVtY3B5KCAoVUlOVDgqKSgoKFVJTlQ4KikmdGVtcCkrMjQpLCAoVUlOVDgqKSgoKFVJTlQ4KilrZXkpKzE2KSwgOCApOwogICAgICAgICAgICAgICAgb3NfbWVtY3B5KCAoVUlOVDgqKSgoKFVJTlQ4KikmdGVtcCkrMTYpLCAoVUlOVDgqKSgoKFVJTlQ4KilrZXkpKzI0KSwgOCApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9zX21lbWNweSggJm15S2V5LktleU1hdGVyaWFsLCAmdGVtcCwga2V5X2xlbiApOwogICAgICAgICAgICByZXQgPSBUSV9BZGRLZXkoIG15RHJ2LT5oRHJpdmVyLCAmbXlLZXkgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0VQX0tFWV9MRU5HVEhfNDA6ICAgICAgICAvKiA1ICovCiAgICAgICAgY2FzZSBXRVBfS0VZX0xFTkdUSF8xMDQ6ICAgICAgIC8qIDEzICovCiAgICAgICAgICAgIGlmKCBrZXlfbGVuICE9IDAgKSB7CiAgICAgICAgICAgICAgICAvKiBTZXQga2V5IGluZGV4ICovCiAgICAgICAgICAgICAgICBteVdlcEtleS5LZXlJbmRleCA9IGtleV9pZHg7CiAgICAgICAgICAgICAgICAvKiBTZXQga2V5IGxlbmd0aCBhbmQgY29udGVudCAqLwogICAgICAgICAgICAgICAgbXlXZXBLZXkuS2V5TGVuZ3RoID0ga2V5X2xlbjsKICAgICAgICAgICAgICAgIC8qIFNldCBzdHJ1Y3R1cmUgc2l6ZSAqLwogICAgICAgICAgICAgICAgbXlXZXBLZXkuTGVuZ3RoID0gc2l6ZW9mKE9TXzgwMl8xMV9XRVApOwoKICAgICAgICAgICAgICAgIGlmKCBzZXRfdHggKSB7CiAgICAgICAgICAgICAgICAgICAgbXlXZXBLZXkuS2V5SW5kZXggfD0gVElXTEFOX0tFWV9GTEFHU19UUkFOU01JVDsKICAgICAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgInNldHRpbmcgdGhpcyBrZXkgdG8gYmUgdGhlIGluZGV4OiAweCV4IiwgbXlXZXBLZXkuS2V5SW5kZXgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG9zX21lbWNweSggJm15V2VwS2V5LktleU1hdGVyaWFsLCBrZXksIGtleV9sZW4gKTsKICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiQWRkaW5nIFdFUCBrZXkgaW5kZXg6IDB4JXgiLCBrZXlfaWR4KTsKICAgICAgICAgICAgICAgIHJldCA9IFRJX0FkZFdFUEtleSggbXlEcnYtPmhEcml2ZXIsICZteVdlcEtleSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJSZW1vdmluZyBXRVAga2V5IGluZGV4OiAweCV4Iiwga2V5X2lkeCk7CiAgICAgICAgICAgICAgICByZXQgPSBUSV9SZW1vdmVXRVBLZXkoIG15RHJ2LT5oRHJpdmVyLCBrZXlfaWR4ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJTZXRfa2V5OiBXcm9uZyBLZXlcbiIpOwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiggVEkyV1BBX1NUQVRVUyhyZXQpICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX3NldF9jb3VudGVybWVhc3VyZXMKUm91dGluZSBEZXNjcmlwdGlvbjogc3RhcnQvc3RvcCBjb3VudGVybWVhc3VyZXMgKGRyb3AgcGFja2V0cyBkdWUgdG8gcmVwbGF5IGF0dGFjayBkZXRlY3Rpb24pCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBlbmFibGVkIC0gZW5hYmxlL2Rpc2FibGUgZmxhZwpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfY291bnRlcm1lYXN1cmVzKHZvaWQgKnByaXYsIGludCBlbmFibGVkKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9zZXRfY291bnRlcm1lYXN1cmVzIGNhbGxlZDogJWQiLCBlbmFibGVkKTsKICAgIHJldHVybiggMCApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfZHJvcF91bmVuY3J5cHRlZApSb3V0aW5lIERlc2NyaXB0aW9uOiBlbmFibGUvZGlzYWJsZSBFQVBPTC1vbmx5IHR4IGJ5IGRyaXZlcgpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgZW5hYmxlZCAtIGVuYWJsZS9kaXNhYmxlIGZsYWcKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2Ryb3BfdW5lbmNyeXB0ZWQodm9pZCAqcHJpdiwgaW50IGVuYWJsZWQpCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJUSTogd3BhX2RyaXZlcl90aXN0YV9zZXRfZHJvcF91bmVuY3J5cHRlZCBjYWxsZWQ6ICVkIC0gbm90IGltcGxlbWVudGVkIiwgZW5hYmxlZCk7CiAgICByZXR1cm4oIDAgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZGVhdXRoZW50aWNhdGUKUm91dGluZSBEZXNjcmlwdGlvbjogc2VuZCBkZWF1dGhlbnRpY2F0aW9uIHBhY2tldApBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgYWRkciAtIGFkZHJlc3MgdG8gc2VuZCBkZWF1dGggcGFja2V0IHRvCiAgIHJlYXNvbl9jb2RlIC0gcmVhc29uIGNvZGUgc3VwcGxpZWQgaW4gZGVhdXRoIHBhY2tldApSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9kZWF1dGhlbnRpY2F0ZSh2b2lkICpwcml2LCBjb25zdCBVSU5UOCAqYWRkciwgaW50IHJlYXNvbl9jb2RlKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIGludCByZXQ7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfZGVhdXRoZW50aWNhdGUgY2FsbGVkIik7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIC8qIEJsb2NrIGFueSBwZW5kaW5nIGRpc2Fzc29jIGV2ZW50IHVudGlsIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgKi8KICAgIGlmKCBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID09IE5PX0JMT0NLICkKICAgICAgICBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID0gTk9fQkxPQ0tfRElTQVNTT0NfSU5fUFJPR1JFU1M7CgogICAgcmV0ID0gVElfRGlzYXNzb2NpYXRlKCBteURydi0+aERyaXZlciApOwogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZGlzYXNzb2NpYXRlClJvdXRpbmUgRGVzY3JpcHRpb246IGRpc2Fzc29jaWF0ZSBmcm9tIEFQCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBhZGRyIC0gYWRkcmVzcyB0byBzZW5kIGRlYXV0aCBwYWNrZXQgdG8KICAgcmVhc29uX2NvZGUgLSByZWFzb24gY29kZSBzdXBwbGllZCBpbiBkZWF1dGggcGFja2V0ClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX2Rpc2Fzc29jaWF0ZSh2b2lkICpwcml2LCBjb25zdCBVSU5UOCAqYWRkciwgaW50IHJlYXNvbl9jb2RlKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIGludCByZXQ7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlRJOiB3cGFfZHJpdmVyX3Rpc3RhX2Rpc2Fzc29jaWF0ZSBjYWxsZWQiKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgLyogQmxvY2sgYW55IHBlbmRpbmcgZGlzYXNzb2MgZXZlbnQgdW50aWwgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCAqLwogICAgaWYoIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPT0gTk9fQkxPQ0sgKQogICAgICAgIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPSBOT19CTE9DS19ESVNBU1NPQ19JTl9QUk9HUkVTUzsKCiAgICByZXQgPSBUSV9EaXNhc3NvY2lhdGUoIG15RHJ2LT5oRHJpdmVyICk7CiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9hc3NvY2lhdGUKUm91dGluZSBEZXNjcmlwdGlvbjogYXNzb2NpYXRlIHdpdGggQVAKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHBhcmFtcyAtIHN0cnVjdCB3cGFfZHJpdmVyX2Fzc29jaWF0ZV9wYXJhbXMgKHNzaWQsIGJzc2lkLCBldGMpClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX2Fzc29jaWF0ZSh2b2lkICpwcml2LCBzdHJ1Y3Qgd3BhX2RyaXZlcl9hc3NvY2lhdGVfcGFyYW1zICpwYXJhbXMpCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgT1NfODAyXzExX01BQ19BRERSRVNTIGJzc2lkID0geyAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiB9OwogICAgaW50IHdwYV9vcHQsIHdwYV9jaXBoZXIsIHJldDsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVEk6IHdwYV9kcml2ZXJfdGlzdGFfYXNzb2NpYXRlIGNhbGxlZCIpOwogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICBpZiggbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9PSBOT19CTE9DS19ESVNBU1NPQ19JTl9QUk9HUkVTUyApCiAgICAgICAgbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9IEJMT0NLX0RJU0FTU09DOwoKICAgIGlmKCBwYXJhbXMtPmJzc2lkICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiVEk6IEJTU0lEPSIgTUFDU1RSLCBNQUMyU1RSKHBhcmFtcy0+YnNzaWQpKTsKICAgICAgICAvKiBpZiB0aGVyZSBpcyBic3NpZCAtPiBzZXQgaXQgKi8KICAgICAgICBpZiggb3NfbWVtY21wKCBwYXJhbXMtPmJzc2lkLCAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwgRVRIX0FMRU4gKSAhPSAwICkgewogICAgICAgICAgICBvc19tZW1jcHkoICZic3NpZCwgcGFyYW1zLT5ic3NpZCwgRVRIX0FMRU4gKTsKICAgICAgICAgICAgVElfU2V0QlNTSUQoIG15RHJ2LT5oRHJpdmVyLCAmYnNzaWQgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiBlbHNlIHNldCBpdCB0byB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn0gKi8KICAgICAgICBUSV9TZXRCU1NJRCggbXlEcnYtPmhEcml2ZXIsICZic3NpZCApOwogICAgfQoKICAgIC8qIFNldCBkcml2ZXIgbmV0d29yayBtb2RlIChBZGhvYy9JbmZyYXN0cnVjdHVyZSkgYWNjb3JkaW5nIHRvIHN1cHBsaWVkIHBhcmFtZXRlcnMgKi8KICAgIGlmKCBwYXJhbXMtPm1vZGUgPT0gSUVFRTgwMjExX01PREVfSU5GUkEgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlRJOiBzZXR0aW5nIG9zODAyXzExSW5mcmFzdHJ1Y3R1cmUgbW9kZS4uLiIpOwogICAgICAgIFRJX1NldEJTU1R5cGUoIG15RHJ2LT5oRHJpdmVyLCBvczgwMl8xMUluZnJhc3RydWN0dXJlICk7CiAgICB9CiAgICBlbHNlIGlmKCBwYXJhbXMtPm1vZGUgPT0gSUVFRTgwMjExX01PREVfSUJTUyApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVEk6IHNldHRpbmcgb3M4MDJfMTFJQlNTIG1vZGUuLi4iKTsKICAgICAgICBUSV9TZXRCU1NUeXBlKCBteURydi0+aERyaXZlciwgb3M4MDJfMTFJQlNTICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiVEk6IEFzc29jaWF0ZTogaW52YWxpZCBtb2RlIHNwZWNpZmllZC4uLiIpOwogICAgfQoKICAgIHdwYV9kcml2ZXJfdGlzdGFfc2V0X3dwYV9vcHRpb25zKCBwcml2LCBwYXJhbXMtPmtleV9tZ210X3N1aXRlICk7CiAgICB3cGFfZHJpdmVyX3Rpc3RhX3NldF9hdXRoX21vZGUoIHByaXYgKTsKICAgIHdwYV9kcml2ZXJfdGlzdGFfc2V0X2VuY3J5cHRpb24oIHByaXYsIHBhcmFtcy0+cGFpcndpc2Vfc3VpdGUgKTsKCiAgICAvKiBBbmQgdHJpZ2dlciBjb25uZWN0aW9uL2Fzc29jaWF0aW9uIHByb2Nlc3MgaW4gZHJpdmVyIGJ5IHNldHRpbmcgU1NJRCAqLwogICAgcmV0ID0gd3BhX2RyaXZlcl90aXN0YV9zZXRfc3NpZCggcHJpdiwgcGFyYW1zLT5zc2lkLCBwYXJhbXMtPnNzaWRfbGVuKTsKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB0aV9pbml0X3NjYW5fcGFyYW1zClJvdXRpbmUgRGVzY3JpcHRpb246IGludCBzY2FuIHBhcmFtZXRlcnMgYmVmb3JlIHNjYW4gY29tbWFuZApBcmd1bWVudHM6CiAgIHBTY2FuUGFyYW1zIC0gcG9pbnRlciB0byBzY2FuIHBhcmFtdGVycyBzdHJ1Y3R1cmUKICAgcFNjYW5Qb2xpY3kgLSBwb2ludGVyIHRvIHNjYW4gcG9saWN5IHN0cnVjdHVyZQogICBzY2FuVHlwZSAgICAtIHNjYW4gdHlwZQogICBub09mQ2hhbiAgICAtIG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzClJldHVybiBWYWx1ZTogTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyB2b2lkIHRpX2luaXRfc2Nhbl9wYXJhbXMoIHNjYW5fUGFyYW1zX3QgKnBTY2FuUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX1BvbGljeV90ICpwU2NhblBvbGljeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYW5fdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgKQp7CiAgICBVSU5UMzIgc2Nhbk1heER3ZWxsVGltZSA9IFNNRV9TQ0FOX0JHX01BWF9EV0VMTF9USU1FX0RFRjsKICAgIFVJTlQzMiBzY2FuTWluRHdlbGxUaW1lID0gU01FX1NDQU5fQkdfTUlOX0RXRUxMX1RJTUVfREVGOwogICAgVUlOVDMyIGNoYW5NYXhEd2VsbFRpbWUgPSBTTUVfU0NBTl9CR19NSU5fRFdFTExfVElNRV9ERUY7CiAgICBVSU5UMzIgY2hhbk1pbkR3ZWxsVGltZSA9IFNNRV9TQ0FOX0JHX01JTl9EV0VMTF9USU1FX0RFRiAvIDI7CiAgICBpbnQgc2NhblR5cGUgPSBzY2FuX3R5cGU7CiAgICBpbnQgbm9PZkNoYW4gPSBteURydi0+c2Nhbl9jaGFubmVsczsKICAgIGludCBidENvZXhTY2FuID0gbXlEcnYtPmJ0Y29leF9zY2FuOwogICAgaW50IGksIGo7CiAgICBVSU5UOCB0aWQgPSAwLCBwcm9iZU51bSA9IDM7CgogICAgaWYoIG5vT2ZDaGFuID4gTUFYX05VTUJFUl9PRl9DSEFOTkVMU19QRVJfU0NBTiApCiAgICAgICAgbm9PZkNoYW4gPSBNQVhfTlVNQkVSX09GX0NIQU5ORUxTX1BFUl9TQ0FOOwogICAgLyogaW5pdCBhcHBsaWNhdGlvbiBzY2FuIGRlZmF1bHQgcGFyYW1zICovCiAgICBwU2NhblBhcmFtcy0+ZGVzaXJlZFNzaWQubGVuID0gMDsKICAgIHBTY2FuUGFyYW1zLT5iYW5kID0gUkFESU9fQkFORF8yXzRfR0haOwogICAgaWYoIGJ0Q29leFNjYW4gKSB7IC8qIENoYW5naW5nIHNjYW4gcGFyYW1ldGVyZXMgdG8gY29leGlzdCB3aXRoIEJUIEEyRFAgKi8KICAgICAgICBpZiggc2NhblR5cGUgPT0gU0NBTl9UWVBFX05PUk1BTF9QQVNTSVZFICkKICAgICAgICAgICAgc2NhblR5cGUgPSBTQ0FOX1RZUEVfVFJJR0dFUkVEX1BBU1NJVkU7CiAgICAgICAgZWxzZSBpZiggc2NhblR5cGUgPT0gU0NBTl9UWVBFX05PUk1BTF9BQ1RJVkUgKQogICAgICAgICAgICBzY2FuVHlwZSA9IFNDQU5fVFlQRV9UUklHR0VSRURfQUNUSVZFOwogICAgICAgIHByb2JlTnVtID0gMTsKICAgICAgICB0aWQgPSAweEZGOwogICAgICAgIHNjYW5NYXhEd2VsbFRpbWUgLz0gNjsKICAgICAgICBzY2FuTWluRHdlbGxUaW1lIC89IDY7CiAgICAgICAgY2hhbk1heER3ZWxsVGltZSAvPSA2OwogICAgICAgIGNoYW5NaW5Ed2VsbFRpbWUgLz0gNjsKICAgIH0KICAgIHBTY2FuUGFyYW1zLT5zY2FuVHlwZSA9IHNjYW5UeXBlOwogICAgcFNjYW5QYXJhbXMtPnByb2JlUmVxTnVtYmVyID0gcHJvYmVOdW07CiAgICBwU2NhblBhcmFtcy0+VGlkID0gdGlkOwogICAgcFNjYW5QYXJhbXMtPnByb2JlUmVxdWVzdFJhdGUgPSBEUlZfUkFURV9NQVNLXzJfQkFSS0VSOwogICAgcFNjYW5QYXJhbXMtPm51bU9mQ2hhbm5lbHMgPSAoVUlOVDgpbm9PZkNoYW47CiAgICBmb3IoaT0wOyggaSA8IG5vT2ZDaGFuICk7aSsrKSB7CiAgICAgICAgZm9yKGo9MDsoIGogPCBNQUNfQUREUl9MRU4gKTtqKyspIHsKICAgICAgICAgICAgcFNjYW5QYXJhbXMtPmNoYW5uZWxFbnRyeVsgaSBdLm5vcm1hbENoYW5uZWxFbnRyeS5ic3NJZC5hZGRyWyBqIF0gPSAweGZmOwogICAgICAgIH0KICAgICAgICBwU2NhblBhcmFtcy0+Y2hhbm5lbEVudHJ5WyBpIF0ubm9ybWFsQ2hhbm5lbEVudHJ5LmVhcmx5VGVybWluYXRpb25FdmVudCA9IFNDQU5fRVRfQ09ORF9ESVNBQkxFOwogICAgICAgIHBTY2FuUGFyYW1zLT5jaGFubmVsRW50cnlbIGkgXS5ub3JtYWxDaGFubmVsRW50cnkuRVRNYXhOdW1PZkFQZnJhbWVzID0gMDsKICAgICAgICBwU2NhblBhcmFtcy0+Y2hhbm5lbEVudHJ5WyBpIF0ubm9ybWFsQ2hhbm5lbEVudHJ5Lm1heENoYW5uZWxEd2VsbFRpbWUgPSBzY2FuTWF4RHdlbGxUaW1lOwogICAgICAgIHBTY2FuUGFyYW1zLT5jaGFubmVsRW50cnlbIGkgXS5ub3JtYWxDaGFubmVsRW50cnkubWluQ2hhbm5lbER3ZWxsVGltZSA9IHNjYW5NaW5Ed2VsbFRpbWU7CiNpZmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICAgICAgcFNjYW5QYXJhbXMtPmNoYW5uZWxFbnRyeVsgaSBdLm5vcm1hbENoYW5uZWxFbnRyeS50eFBvd2VyTGV2ZWwgPSAxOwojZWxzZQogICAgICAgIHBTY2FuUGFyYW1zLT5jaGFubmVsRW50cnlbIGkgXS5ub3JtYWxDaGFubmVsRW50cnkudHhQb3dlckRibSA9IE1BWF9UWF9QT1dFUjsKI2VuZGlmCiAgICAgICAgcFNjYW5QYXJhbXMtPmNoYW5uZWxFbnRyeVsgaSBdLm5vcm1hbENoYW5uZWxFbnRyeS5jaGFubmVsID0gaSArIDE7CiAgICB9CgogICAgLyogaW5pdCBkZWZhdWx0IHNjYW4gcG9saWN5ICovCiAgICBwU2NhblBvbGljeS0+bm9ybWFsU2NhbkludGVydmFsID0gMTAwMDA7CiAgICBwU2NhblBvbGljeS0+ZGV0ZXJpb3JhdGluZ1NjYW5JbnRlcnZhbCA9IDUwMDA7CiAgICBwU2NhblBvbGljeS0+bWF4VHJhY2tGYWlsdXJlcyA9IDM7CiAgICBwU2NhblBvbGljeS0+QlNTTGlzdFNpemUgPSA0OwogICAgcFNjYW5Qb2xpY3ktPkJTU051bWJlclRvU3RhcnREaXNjb3ZlcnkgPSAxOwogICAgcFNjYW5Qb2xpY3ktPm51bU9mQmFuZHMgPSAxOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uYmFuZCA9IFJBRElPX0JBTkRfMl80X0dIWjsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLnJ4UlNTSVRocmVzaG9sZCA9IC04MDsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLm51bU9mQ2hhbm5sZXMgPSAoVUlOVDgpbm9PZkNoYW47CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5udW1PZkNoYW5ubGVzRm9yRGlzY292ZXJ5ID0gMzsKICAgIGZvcihpPTA7KCBpIDwgbm9PZkNoYW4gKTtpKyspIHsKICAgICAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5jaGFubmVsTGlzdFsgaSBdID0gaSArIDE7CiAgICB9CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5zY2FuVHlwZSA9IFNDQU5fVFlQRV9OT19TQ0FOOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLmVhcmx5VGVybWluYXRpb25FdmVudCA9IFNDQU5fRVRfQ09ORF9ESVNBQkxFOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLkVUTWF4TnVtYmVyT2ZBcEZyYW1lcyA9IDA7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMubWF4Q2hhbm5lbER3ZWxsVGltZSA9IGNoYW5NYXhEd2VsbFRpbWU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMubWluQ2hhbm5lbER3ZWxsVGltZSA9IGNoYW5NaW5Ed2VsbFRpbWU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy5iaXRyYXRlID0gRFJWX1JBVEVfTUFTS18xX0JBUktFUjsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLnRyYWNraW5nTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLm51bU9mUHJvYmVSZXFzID0gcFNjYW5QYXJhbXMtPnByb2JlUmVxTnVtYmVyOwojaWZkZWYgU1RBX0RLX1ZFUl81XzBfMF85NAogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLnByb2JSZXFQYXJhbXMudHhMZXZlbCA9IDE7CiNlbHNlCiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy50eFBvd2VyRGJtID0gTUFYX1RYX1BPV0VSOwojZW5kaWYKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5zY2FuVHlwZSA9IFNDQU5fVFlQRV9OT19TQ0FOOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5lYXJseVRlcm1pbmF0aW9uRXZlbnQgPSBTQ0FOX0VUX0NPTkRfRElTQUJMRTsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMuRVRNYXhOdW1iZXJPZkFwRnJhbWVzID0gMDsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMubWF4Q2hhbm5lbER3ZWxsVGltZSA9IGNoYW5NYXhEd2VsbFRpbWU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5kaXNjb3ZlcnlNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLm1pbkNoYW5uZWxEd2VsbFRpbWUgPSBjaGFuTWluRHdlbGxUaW1lOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLmJpdHJhdGUgPSBEUlZfUkFURV9NQVNLXzJfQkFSS0VSOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLm51bU9mUHJvYmVSZXFzID0gcFNjYW5QYXJhbXMtPnByb2JlUmVxTnVtYmVyOwojaWZkZWYgU1RBX0RLX1ZFUl81XzBfMF85NAogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLnR4TGV2ZWwgPSAxOwojZWxzZQogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLnR4UG93ZXJEYm0gPSBNQVhfVFhfUE9XRVI7CiNlbmRpZgogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5zY2FuVHlwZSA9IGJ0Q29leFNjYW4gPyBTQ0FOX1RZUEVfVFJJR0dFUkVEX0FDVElWRSA6IFNDQU5fVFlQRV9OT1JNQUxfQUNUSVZFOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMuZWFybHlUZXJtaW5hdGlvbkV2ZW50ID0gU0NBTl9FVF9DT05EX0RJU0FCTEU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5pbW1lZGlhdGVTY2FuTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5FVE1heE51bWJlck9mQXBGcmFtZXMgPSAwOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMubWF4Q2hhbm5lbER3ZWxsVGltZSA9IGNoYW5NYXhEd2VsbFRpbWU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5pbW1lZGlhdGVTY2FuTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5taW5DaGFubmVsRHdlbGxUaW1lID0gY2hhbk1pbkR3ZWxsVGltZTsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmltbWVkaWF0ZVNjYW5NZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLnByb2JSZXFQYXJhbXMuYml0cmF0ZSA9IERSVl9SQVRFX01BU0tfNV81X0NDSzsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmltbWVkaWF0ZVNjYW5NZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLnByb2JSZXFQYXJhbXMubnVtT2ZQcm9iZVJlcXMgPSBwU2NhblBhcmFtcy0+cHJvYmVSZXFOdW1iZXI7CiNpZmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5pbW1lZGlhdGVTY2FuTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLnR4TGV2ZWwgPSAxOwojZWxzZQogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy50eFBvd2VyRGJtID0gTUFYX1RYX1BPV0VSOwojZW5kaWYKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2NhbgpSb3V0aW5lIERlc2NyaXB0aW9uOiByZXF1ZXN0IHNjYW4gZnJvbSBkcml2ZXIKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHNzaWQgLSBzc2lkIGJ1ZmZlcgogICBzc2lkX2xlbiAtIGxlbmd0aCBvZiBzc2lkClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX3NjYW4oIHZvaWQgKnByaXYsIGNvbnN0IFVJTlQ4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4gKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MgPSAoc3RydWN0IHdwYV9zdXBwbGljYW50ICopKG15RHJ2LT5oV3BhU3VwcGxpY2FudCk7CiAgICBzdHJ1Y3Qgd3BhX3NzaWQgKmlzc2lkOwogICAgc2Nhbl9QYXJhbXNfdCBzY2FuUGFyYW1zOwogICAgc2Nhbl9Qb2xpY3lfdCBzY2FuUG9saWN5OwogICAgaW50IHNjYW5fdHlwZSwgcmV0LCBzY2FuX3Byb2JlX2ZsYWcgPSAwOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3NjYW4gY2FsbGVkIik7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIHNjYW5fdHlwZSA9IG15RHJ2LT5zY2FuX3R5cGU7CiAgICBpZiAod3BhX3MtPnByZXZfc2Nhbl9zc2lkICE9IEJST0FEQ0FTVF9TU0lEX1NDQU4pIHsKICAgICAgICBpZiAod3BhX3MtPnByZXZfc2Nhbl9zc2lkLT5zY2FuX3NzaWQpIHsKICAgICAgICAgICAgc2Nhbl90eXBlID0gU0NBTl9UWVBFX05PUk1BTF9BQ1RJVkU7CiAgICAgICAgICAgIHNjYW5fcHJvYmVfZmxhZyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHRpX2luaXRfc2Nhbl9wYXJhbXMoICZzY2FuUGFyYW1zLCAmc2NhblBvbGljeSwgc2Nhbl90eXBlLCBteURydiApOwoKICAgIG15RHJ2LT5mb3JjZV9tZXJnZV9mbGFnID0gMDsgLyogU2V0IG1lcmdlIGZsYWcgKi8KCiAgICBpZiAoKHNjYW5fcHJvYmVfZmxhZyAmJiBzc2lkKSAmJgogICAgICAgIChzc2lkX2xlbiA+IDAgJiYgc3NpZF9sZW4gPD0gc2l6ZW9mKHNjYW5QYXJhbXMuZGVzaXJlZFNzaWQuc3NpZFN0cmluZykpKSB7CiAgICAgICAgb3NfbWVtY3B5KHNjYW5QYXJhbXMuZGVzaXJlZFNzaWQuc3NpZFN0cmluZywgc3NpZCwgc3NpZF9sZW4pOwoJaWYgKHNzaWRfbGVuIDwgc2l6ZW9mKHNjYW5QYXJhbXMuZGVzaXJlZFNzaWQuc3NpZFN0cmluZykpCiAgICAgICAgICAgIHNjYW5QYXJhbXMuZGVzaXJlZFNzaWQuc3NpZFN0cmluZ1tzc2lkX2xlbl0gPSAnXDAnOwogICAgICAgIHNjYW5QYXJhbXMuZGVzaXJlZFNzaWQubGVuID0gc3NpZF9sZW47CiAgICAgICAgbXlEcnYtPmZvcmNlX21lcmdlX2ZsYWcgPSAxOwogICAgfQogICAgVElfU2V0U2NhblBvbGljeSggbXlEcnYtPmhEcml2ZXIsIChVSU5UOCAqKSZzY2FuUG9saWN5LCBzaXplb2Yoc2Nhbl9Qb2xpY3lfdCkgKTsKICAgIG15RHJ2LT5sYXN0X3NjYW4gPSBzY2FuX3R5cGU7IC8qIFJlbWVtYmVyIHNjYW4gdHlwZSBmb3IgbGFzdCBzY2FuICovCiAgICByZXQgPSBUSV9TdGFydFNjYW4oIG15RHJ2LT5oRHJpdmVyLCAoc2Nhbl9QYXJhbXNfdCAqKSZzY2FuUGFyYW1zICk7CiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfYXV0aF9hbGcKUm91dGluZSBEZXNjcmlwdGlvbjogc2V0IGF1dGhlbnRpY2F0aW9uIGluIGRyaXZlcgpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgYXV0aF9hbGcgLSBPcGVuL1NoYXJlZC9MRUFQClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX3NldF9hdXRoX2FsZyggdm9pZCAqcHJpdiwgaW50IGF1dGhfYWxnICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X2F1dGhfYWxnIGNhbGxlZDogJWQiLCBhdXRoX2FsZyk7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwogICAgbXlEcnYtPmF1dGhfYWxnID0gYXV0aF9hbGc7CiAgICByZXR1cm4oIDAgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X2Jzc2lkX2luZm8KUm91dGluZSBEZXNjcmlwdGlvbjogcmV0cmlldmUgYnNzaWQgZnVsbCBpbmZvCkFyZ3VtZW50czoKICAgaERyaXZlciAtIHBvaW50ZXIgdG8gZHJpdmVyIHN0cnVjdHVyZQpSZXR1cm4gVmFsdWU6IHBvaW50ZXIgdG8gQlNTSUQgc3RydWN0dXJlIG9yIE5VTEwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgT1NfODAyXzExX0JTU0lEX0VYICp3cGFfZHJpdmVyX3Rpc3RhX2dldF9ic3NpZF9pbmZvKCBUSV9IQU5ETEUgaERyaXZlciApCnsKICAgIE9TXzgwMl8xMV9CU1NJRF9MSVNUX0VYICpic3NpZF9saXN0OwogICAgT1NfODAyXzExX0JTU0lEX0VYICpwQnNzaWQsICpuQnNzaWQgPSBOVUxMOwogICAgaW50IGksIG51bWJlcl9pdGVtcywgcmVzOwogICAgT1NfODAyXzExX01BQ19BRERSRVNTIGJzc2lkOwogICAgT1NfODAyXzExX1NTSUQgc3NpZDsKCiAgICBpZiggVElfR2V0QlNTSURMaXN0KCBoRHJpdmVyLCAmYnNzaWRfbGlzdCApIHx8ICFic3NpZF9saXN0ICkKICAgICAgICByZXR1cm4oIG5Cc3NpZCApOwoKICAgIGlmKCBUSV9HZXRCU1NJRCggaERyaXZlciwgJmJzc2lkICkgIT0gVElfUkVTVUxUX09LICkKICAgICAgICByZXR1cm4oIG5Cc3NpZCApOwoKICAgIGlmKCBUSV9HZXRDdXJyZW50U1NJRCggaERyaXZlciwgJnNzaWQgKSAhPSBUSV9SRVNVTFRfT0sgKQogICAgICAgIHJldHVybiggbkJzc2lkICk7CgogICAgcEJzc2lkID0gJmJzc2lkX2xpc3QtPkJzc2lkWzBdOwogICAgbnVtYmVyX2l0ZW1zID0gKGludCkoYnNzaWRfbGlzdC0+TnVtYmVyT2ZJdGVtcyk7CiAgICBmb3IoaT0wOyggaSA8IG51bWJlcl9pdGVtcyApO2krKykgewogICAgICAgIGlmKCAhb3NfbWVtY21wKCh2b2lkICopJmJzc2lkLCBwQnNzaWQtPk1hY0FkZHJlc3MsIE1BQ19BRERSX0xFTikgJiYKICAgICAgICAgICAgIW9zX21lbWNtcChzc2lkLlNzaWQsIHBCc3NpZC0+U3NpZC5Tc2lkLCBwQnNzaWQtPlNzaWQuU3NpZExlbmd0aCkgKSB7CiAgICAgICAgICAgIG5Cc3NpZCA9IChPU184MDJfMTFfQlNTSURfRVggKilvc19tYWxsb2MoIHBCc3NpZC0+TGVuZ3RoICk7CiAgICAgICAgICAgIGlmKCBuQnNzaWQgIT0gTlVMTCApCiAgICAgICAgICAgICAgICBvc19tZW1jcHkoIG5Cc3NpZCwgcEJzc2lkLCBwQnNzaWQtPkxlbmd0aCApOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcEJzc2lkID0gKE9TXzgwMl8xMV9CU1NJRF9FWCAqKSgoKGNoYXIgKilwQnNzaWQpICsgcEJzc2lkLT5MZW5ndGgpOwogICAgfQogICAgb3NfZnJlZSggYnNzaWRfbGlzdCApOwogICAgcmV0dXJuKCBuQnNzaWQgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDb21wYXJlIGZ1bmN0aW9uIGZvciBzb3J0aW5nIHNjYW4gcmVzdWx0cy4gUmV0dXJuID4wIGlmIEBiIGlzIGNvbnNpZGVyZWQgYmV0dGVyLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zY2FuX3Jlc3VsdF9jb21wYXJlKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCnsKICAgIGNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQgKndhID0gYTsKICAgIGNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQgKndiID0gYjsKCiAgICByZXR1cm4oIHdiLT5sZXZlbCAtIHdhLT5sZXZlbCApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9nZXRfc2Nhbl9yZXN1bHRzClJvdXRpbmUgRGVzY3JpcHRpb246IHJldHJpZXZlIGRyaXZlciBzY2FuIHJlc3VsdHMKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHJlc3VsdHMgLSBwb2ludGVyIHRvIGJ1ZmZlcgogICBtYXhfc2l6ZSAtIG1heGltdW0gc2l6ZSBvZiByZXN1bHRzIGJ1ZmZlcgpSZXR1cm4gVmFsdWU6IG51bWJlciBvZiBTU0lEIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X3NjYW5fcmVzdWx0cyggdm9pZCAqcHJpdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQgKnJlc3VsdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X3NpemUgKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIE9TXzgwMl8xMV9CU1NJRF9MSVNUX0VYICpic3NpZF9saXN0OwogICAgT1NfODAyXzExX0JTU0lEX0VYICpwQnNzaWQ7CiAgICBPU184MDJfMTFfRklYRURfSUVzICpwRml4ZWRJZXM7CiAgICBPU184MDJfMTFfVkFSSUFCTEVfSUVzICpwVmFySWVzOwogICAgdW5zaWduZWQgaW50IG51bWJlcl9pdGVtcywgaSwgaW5kZXg7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfZ2V0X3NjYW5fcmVzdWx0cyBjYWxsZWQiKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgaWYoIFRJX0dldEJTU0lETGlzdChteURydi0+aERyaXZlciwgJmJzc2lkX2xpc3QpIHx8ICFic3NpZF9saXN0ICkKICAgICAgICByZXR1cm4oIC0xICk7CgogICAgcEJzc2lkID0gJmJzc2lkX2xpc3QtPkJzc2lkWzBdOwogICAgbnVtYmVyX2l0ZW1zID0gKGludCkoYnNzaWRfbGlzdC0+TnVtYmVyT2ZJdGVtcyk7CgogICAgd3BhX3ByaW50ZihNU0dfTVNHRFVNUCwgIlJlY2VpdmVkICVkIGJ5dGVzIG9mIHNjYW4gcmVzdWx0cyAoJWQgQlNTZXMpIiwKICAgICAgICAgICBudW1iZXJfaXRlbXMgKiBzaXplb2YoT1NfODAyXzExX0JTU0lEX0VYKSwgbnVtYmVyX2l0ZW1zKTsKCiAgICBvc19tZW1zZXQoIHJlc3VsdHMsIDAsIG1heF9zaXplICogc2l6ZW9mKHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQpICk7CiAgICBudW1iZXJfaXRlbXMgPSBNSU4oIG51bWJlcl9pdGVtcywgbWF4X3NpemUgKTsKCiAgICBmb3IoaW5kZXg9MDsgaW5kZXggPCBudW1iZXJfaXRlbXM7IGluZGV4KyspIHsKICAgICAgICBvc19tZW1jcHkoIHJlc3VsdHNbaW5kZXhdLmJzc2lkLCAmcEJzc2lkLT5NYWNBZGRyZXNzLCBFVEhfQUxFTiApOwogICAgICAgIG9zX21lbWNweSggcmVzdWx0c1tpbmRleF0uc3NpZCwgcEJzc2lkLT5Tc2lkLlNzaWQsIHBCc3NpZC0+U3NpZC5Tc2lkTGVuZ3RoICk7CiAgICAgICAgcmVzdWx0c1tpbmRleF0uc3NpZF9sZW4gPSBwQnNzaWQtPlNzaWQuU3NpZExlbmd0aDsKI2lmZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKICAgICAgICByZXN1bHRzW2luZGV4XS5mcmVxID0gcEJzc2lkLT5Db25maWd1cmF0aW9uLmNoYW5uZWwgLyAxMDAwOwogICAgICAgIHJlc3VsdHNbaW5kZXhdLmNhcHMgPSBwQnNzaWQtPkNhcGFiaWxpdGllczsKI2Vsc2UKICAgICAgICByZXN1bHRzW2luZGV4XS5mcmVxID0gcEJzc2lkLT5Db25maWd1cmF0aW9uLlVuaW9uLmNoYW5uZWwgLyAxMDAwOwogICAgICAgIHJlc3VsdHNbaW5kZXhdLmNhcHMgPSBwQnNzaWQtPlVuaW9uLkNhcGFiaWxpdGllczsKI2VuZGlmCiAgICAgICAgcmVzdWx0c1tpbmRleF0ubGV2ZWwgPSBwQnNzaWQtPlJzc2k7CiAgICAgICAgcmVzdWx0c1tpbmRleF0ubWF4cmF0ZSA9IDA7IC8qIEluIHVuaXRzIG9mIDAuNSBNYi9zICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihwQnNzaWQtPlN1cHBvcnRlZFJhdGVzKTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwQnNzaWQtPlN1cHBvcnRlZFJhdGVzW2ldID4gKHVuc2lnbmVkKXJlc3VsdHNbaW5kZXhdLm1heHJhdGUpIHsKICAgICAgICAgICAgICAgIHJlc3VsdHNbaW5kZXhdLm1heHJhdGUgPSBwQnNzaWQtPlN1cHBvcnRlZFJhdGVzW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJUSTogTmV0OiAlcyBDYXA6IDB4JTA0eCBQcml2OiAweCV4IE5ldFR5cGU6IDB4JXggSW5mcmFNb2RlOiAweCV4IElFTGVuOiAlZCIsCiNpZmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICAgICAgICAgICAgICAgICBwQnNzaWQtPlNzaWQuU3NpZCwgcEJzc2lkLT5DYXBhYmlsaXRpZXMsIHBCc3NpZC0+UHJpdmFjeSwgcEJzc2lkLT5OZXR3b3JrVHlwZUluVXNlLAojZWxzZQogICAgICAgICAgICAgICAgICAgcEJzc2lkLT5Tc2lkLlNzaWQsIHBCc3NpZC0+VW5pb24uQ2FwYWJpbGl0aWVzLCBwQnNzaWQtPlByaXZhY3ksIHBCc3NpZC0+TmV0d29ya1R5cGVJblVzZSwKI2VuZGlmCiAgICAgICAgICAgICAgICAgICBwQnNzaWQtPkluZnJhc3RydWN0dXJlTW9kZSwgcEJzc2lkLT5JRUxlbmd0aCApOwoKICAgICAgICAvKiBGaXhlZCBJRXMgZnJvbSBzaXRlIGVudHJ5IC0gc2FtZSBDYXBhYmlsaXRpZXMgKi8KICAgICAgICBwRml4ZWRJZXMgPSAoT1NfODAyXzExX0ZJWEVEX0lFcyAqKSZwQnNzaWQtPklFc1swXTsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVEk6IEZpeGVkIElFczogQmVhY29uOiAweCV4IENhcDogMHgleCIsIHBGaXhlZEllcy0+QmVhY29uSW50ZXJ2YWwsIHBGaXhlZEllcy0+Q2FwYWJpbGl0aWVzKTsKICAgICAgICBmb3IoaT1zaXplb2YoT1NfODAyXzExX0ZJWEVEX0lFcyk7IGkgPCBwQnNzaWQtPklFTGVuZ3RoOykgewogICAgICAgICAgICBwVmFySWVzID0gKE9TXzgwMl8xMV9WQVJJQUJMRV9JRXMgKikmcEJzc2lkLT5JRXNbaV07CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJUSTogVmFyaWFibGUgSUVzOiBJRDogMHgleCBMZW46ICVkIiwgcFZhckllcy0+RWxlbWVudElELCBwVmFySWVzLT5MZW5ndGgpOwogICAgICAgICAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsIlRJOiBvdWk6IiwgcFZhckllcy0+ZGF0YSwgcFZhckllcy0+TGVuZ3RoKTsKICAgICAgICAgICAgc3dpdGNoKCBwVmFySWVzLT5FbGVtZW50SUQgKSB7CiAgICAgICAgICAgICAgICBjYXNlIEdFTkVSSUNfSU5GT19FTEVNOiAvKiAweGRkICovCiAgICAgICAgICAgICAgICAgICAgaWYoIChwVmFySWVzLT5MZW5ndGggPiAzKSAmJiAob3NfbWVtY21wKHBWYXJJZXMtPmRhdGEsIFdQQV9PVUksIDQpID09IDApICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2luZGV4XS53cGFfaWVfbGVuID0gTUlOKChwVmFySWVzLT5MZW5ndGggKyAyKSwgU1NJRF9NQVhfV1BBX0lFX0xFTik7CiAgICAgICAgICAgICAgICAgICAgICAgIG9zX21lbWNweSggcmVzdWx0c1tpbmRleF0ud3BhX2llLCBwVmFySWVzLCByZXN1bHRzW2luZGV4XS53cGFfaWVfbGVuICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgUlNOX0lORk9fRUxFTTogICAgIC8qIDB4MzAgKi8KICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2luZGV4XS5yc25faWVfbGVuID0gTUlOKChwVmFySWVzLT5MZW5ndGggKyAyKSwgU1NJRF9NQVhfV1BBX0lFX0xFTik7CiAgICAgICAgICAgICAgICAgICAgb3NfbWVtY3B5KCByZXN1bHRzW2luZGV4XS5yc25faWUsIHBWYXJJZXMsIHJlc3VsdHNbaW5kZXhdLnJzbl9pZV9sZW4gKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpICs9IChwVmFySWVzLT5MZW5ndGggKyAoMiAqIHNpemVvZih0aVVJTlQ4KSkpOwogICAgICAgIH0KICAgICAgICBwQnNzaWQgPSAoT1NfODAyXzExX0JTU0lEX0VYICopKCgodTggKilwQnNzaWQpICsgcEJzc2lkLT5MZW5ndGgpOwogICAgfQogICAgLyogTWVyZ2UgbmV3IHJlc3VsdHMgd2l0aCBwcmV2aW91cyAqLwogICAgbnVtYmVyX2l0ZW1zID0gc2Nhbl9tZXJnZSggbXlEcnYsIHJlc3VsdHMsIG15RHJ2LT5mb3JjZV9tZXJnZV9mbGFnLCBudW1iZXJfaXRlbXMsIG1heF9zaXplICk7CgogICAgcXNvcnQoIHJlc3VsdHMsIG51bWJlcl9pdGVtcywgc2l6ZW9mKHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQpLAogICAgICAgICAgIHdwYV9kcml2ZXJfdGlzdGFfc2Nhbl9yZXN1bHRfY29tcGFyZSApOwoKICAgIG9zX2ZyZWUoIGJzc2lkX2xpc3QgKTsKICAgIHJldHVybiggbnVtYmVyX2l0ZW1zICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX2dldF9zY2FuX3Jlc3VsdHMKUm91dGluZSBEZXNjcmlwdGlvbjogcmV0cmlldmUgZHJpdmVyIHNjYW4gcmVzdWx0cwpBcmd1bWVudHM6CiAgIHNvY2sgLSBzb2NrZXQKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBzb2NrX2N0eCAtIHBvaW50ZXIgdG8gb3RoZXIgcHJpdmF0ZSBkYXRhClJldHVybiBWYWx1ZTogTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyB2b2lkIHdwYV9kcml2ZXJfdGlzdGFfcmVjZWl2ZV9kcml2ZXJfZXZlbnQoIGludCBzb2NrLCB2b2lkICpwcml2LCB2b2lkICpzb2NrX2N0eCApCnsKICAgIElQQ19FVl9EQVRBIG15QnVmOwogICAgVUlOVDggKmJ1ZjsKICAgIFVJTlQzMiAqYnVmTG9uZzsKICAgIHVuaW9uIHdwYV9ldmVudF9kYXRhIG15RXZlbnREYXRhOwogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlTdXBwbDsKICAgIE9TXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiAqcEluZm8gPSBOVUxMOwogICAgT1NfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QgKnBNZWRpYVNwZWNpZmljQnVmOwogICAgT1NfODAyXzExX0JTU0lEX0VYICpwU2VsZWN0ZWRCc3NpZEluZm8gPSBOVUxMOwogICAgT1NfODAyXzExX05FVFdPUktfTU9ERSBteUJzc1R5cGU7CiAgICBJUENfRVZfREFUQSAqcERhdGEgPSAmbXlCdWY7CiAgICBpbnQgcmVzOwojaWZuZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKICAgIGJ0Q29leFN0YXR1c190ICpidENvZXhTdGF0dXM7CiNlbmRpZgoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3JlY2VpdmVfZHJpdmVyX2V2ZW50Li4uIik7CgogICAgcmVzID0gcmVjdiggc29jaywgJm15QnVmLCBzaXplb2YobXlCdWYpLCAwICk7CiAgICBpZiggcmVzIDwgMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwibDJfcGFja2V0X3JlY2VpdmUgLSByZWN2ZnJvbSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteVN1cHBsID0gcERhdGEtPkV2UGFyYW1zLmhVc2VyUGFyYW07CgogICAgc3dpdGNoKCAoKElQQ19FVkVOVF9QQVJBTVMqKXBEYXRhKS0+dUV2ZW50VHlwZSApIHsKICAgICAgICBjYXNlIElQQ19FVkVOVF9BU1NPQ0lBVEVEOgogICAgICAgICAgICAvKiBBc3NvY2lhdGVkIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBzdWNjZXNzZnVsbCBBU1NPQ19SU1AgcGFja2V0IGlzIHJlY2VpdmVkICovCiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfc3VwcGxpY2FudCAtIEFzc29jaWF0ZWQiKTsKCiAgICAgICAgICAgIFRJX0dldEJTU1R5cGUoIG15U3VwcGwtPmhEcml2ZXIsICZteUJzc1R5cGUgKTsKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15QnNzVHlwZSA9ICVkIixteUJzc1R5cGUpOwoKICAgICAgICAgICAgaWYoIG15QnNzVHlwZSA9PSBvczgwMl8xMUluZnJhc3RydWN0dXJlICkgewogICAgICAgICAgICAgICAgLyogR2V0IEFTU09DX1JFUSBhbmQgQVNTT0NfUlNQIElFICovCiAgICAgICAgICAgICAgICByZXMgPSBUSV9HZXRBc3NvY2lhdGlvbkluZm8oIG15U3VwcGwtPmhEcml2ZXIsICZwSW5mbyApOwogICAgICAgICAgICAgICAgYnVmID0gKFVJTlQ4ICopcEluZm87CgogICAgICAgICAgICAgICAgaWYoIGJ1ZiAhPSBOVUxMICkgewogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llcyA9IGJ1ZiArIHBJbmZvLT5PZmZzZXRSZXF1ZXN0SUVzOwogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llc19sZW4gPSBwSW5mby0+UmVxdWVzdElFTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXMgPSBidWYgKyBwSW5mby0+T2Zmc2V0UmVzcG9uc2VJRXM7CiAgICAgICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXNwX2llc19sZW4gPSBwSW5mby0+UmVzcG9uc2VJRUxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXMgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llc19sZW4gPSAwOwoKICAgICAgICAgICAgICAgICAgICAvKiBHZXQgQVAgQmVhY29uIElFcyAtIGVzcGVjaWFsbHkgV1BBL1JTTiBJRSAqLwogICAgICAgICAgICAgICAgICAgIHBTZWxlY3RlZEJzc2lkSW5mbyA9IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X2Jzc2lkX2luZm8oIG15U3VwcGwtPmhEcml2ZXIgKTsKICAgICAgICAgICAgICAgICAgICBpZiggcFNlbGVjdGVkQnNzaWRJbmZvICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNlbGVjdGVkQnNzaWRJbmZvLT5JRUxlbmd0aCAmJiBwU2VsZWN0ZWRCc3NpZEluZm8tPklFcyApIHsgLyogRG06IEZpeGVkIElFcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzID0gKFVJTlQ4ICopcFNlbGVjdGVkQnNzaWRJbmZvLT5JRXMgKyBzaXplb2YoT1NfODAyXzExX0ZJWEVEX0lFcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXNfbGVuID0gcFNlbGVjdGVkQnNzaWRJbmZvLT5JRUxlbmd0aCAtIHNpemVvZihPU184MDJfMTFfRklYRURfSUVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywibXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXFfaWVzID0gMHgleCIsKHVuc2lnbmVkKW15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llcyk7CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llc19sZW4gPSAlZCIsbXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXFfaWVzX2xlbik7CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXMgPSAweCV4IiwodW5zaWduZWQpbXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXNwX2llcyk7CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXNfbGVuID0gJWQiLG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXNfbGVuKTsKICAgICAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywibXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzID0gMHgleCIsKHVuc2lnbmVkKW15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llcyk7CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llc19sZW4gPSAlZCIsbXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzX2xlbik7CiAgICAgICAgICAgICAgICAgICAgd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiV1BBOiBiZWFjb25faWVzIiwgbXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzLCBteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXNfbGVuKTsKCiAgICAgICAgICAgICAgICAgICAgLyogRmlyc3Qgd2Ugbm90aWZ5IHdwYV9zdXBwbGljYW50IGFuZCBnaXZlIGl0IGFsbCB0aGUgYWJvdmUgSUVzICovCiAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZXZlbnQoIG15U3VwcGwtPmhXcGFTdXBwbGljYW50LCBFVkVOVF9BU1NPQ0lORk8sICZteUV2ZW50RGF0YSApOwoKICAgICAgICAgICAgICAgICAgICAvKiBTaW5jZSBib3RoIEFTU09DX1JFUS9SU1AgYW5kIGJlYWNvbiBJRXMgYXJlIGFsbG9jYXRlZCBkeW5hbWljYWxseSBieSB0aGUgVXRpbGl0eSBBZGFwdGVyIC0gd2UgbmVlZCB0byBmcmVlIHRoZSBidWZmZXJzICovCiAgICAgICAgICAgICAgICAgICAgb3NfZnJlZSggcEluZm8gKTsKICAgICAgICAgICAgICAgICAgICBpZiggcFNlbGVjdGVkQnNzaWRJbmZvICkgewogICAgICAgICAgICAgICAgICAgICAgICBvc19mcmVlKCBwU2VsZWN0ZWRCc3NpZEluZm8gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlcV9pZXMgPSBOVUxMOwogICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXFfaWVzX2xlbiA9IDA7CiAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzID0gTlVMTDsKICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXNfbGVuID0gMDsKICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llcyA9IE5VTEw7CiAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXNfbGVuID0gMDsKICAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgRVZFTlRfQVNTT0NJTkZPLCAmbXlFdmVudERhdGEgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBXZSBub3cgY2FuIG5vdGlmeSB3cGFfc3VwcGxpY2FudCBvZiB0aGUgYXNzb2NpYXRpb24gZXZlbnQgc28gaXQgY291bGQgc3RhcnQga2V5IG5lZ290aWF0aW9uIChpZiBuZWVkZWQpICovCiAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgRVZFTlRfQVNTT0MsIE5VTEwgKTsKICAgICAgICAgICAgLyogQWxsb3cgRGlzYXNzb2NpYXRpb24gKi8KICAgICAgICAgICAgbXlTdXBwbC0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID0gTk9fQkxPQ0s7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElQQ19FVkVOVF9ESVNBU1NPQ0lBVEVEOgogICAgICAgICAgICBpZiggbXlTdXBwbC0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzICE9IEJMT0NLX0RJU0FTU09DICkgewogICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBEaXNhc3NvY2lhdGVkIik7CiAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgRVZFTlRfRElTQVNTT0MsIE5VTEwgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfSU5GTywid3BhX3N1cHBsaWNhbnQgLSBEaXNhc3NvY2lhdGVkIChibG9ja2VkKSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElQQ19FVkVOVF9TQ0FOX0NPTVBMRVRFOgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBJUENfRVZFTlRfU0NBTl9DT01QTEVURSIpOwogICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9ldmVudCggbXlTdXBwbC0+aFdwYVN1cHBsaWNhbnQsIEVWRU5UX1NDQU5fUkVTVUxUUywgTlVMTCApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBJUENfRVZFTlRfQVVUSF9TVUNDOgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19JTkZPLCJ3cGFfc3VwcGxpY2FudCAtIElQQ19FVkVOVF9BVVRIX1NVQ0MiKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSVBDX0VWRU5UX0VBUE9MOgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBFQVBPTCIpOwogICAgICAgICAgICBidWYgPSBwRGF0YS0+dUJ1ZmZlcjsKICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfcnhfZWFwb2woIG15U3VwcGwtPmhXcGFTdXBwbGljYW50LCAoVUlOVDggKikoYnVmICsgTUFDX0FERFJfTEVOKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCAqKShidWYgKyBFVEhFUk5FVF9IRFJfTEVOKSwgKHBEYXRhLT51QnVmZmVyU2l6ZSAtIEVUSEVSTkVUX0hEUl9MRU4pICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElQQ19FVkVOVF9NRURJQV9TUEVDSUZJQzoKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9zdXBwbGljYW50IC0gTWVkaWFfU3BlY2lmaWMiKTsKICAgICAgICAgICAgYnVmTG9uZyA9IChVSU5UMzIgKilwRGF0YS0+dUJ1ZmZlcjsKICAgICAgICAgICAgLyogQ2hlY2sgZm9yIEF1dGhlbnRpY2F0aW9uIHR5cGUgbWVzc2FnZXMgZnJvbSBkcml2ZXIgKi8KICAgICAgICAgICAgaWYoICgqYnVmTG9uZykgPT0gb3M4MDJfMTFTdGF0dXNUeXBlX0F1dGhlbnRpY2F0aW9uICkgewogICAgICAgICAgICAgICAgcE1lZGlhU3BlY2lmaWNCdWYgPSAoT1NfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QgKikoYnVmTG9uZyArIDEpOwogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9zdXBwbGljYW50IC0gTWVkaWFfU3BlY2lmaWMgLSBBdXRoZW50aWNhdGlvbiBtZXNzYWdlIGRldGVjdGVkOiAldSIsIHBNZWRpYVNwZWNpZmljQnVmLT5GbGFncyk7CiAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgTUlDIGZhaWx1cmUgZXZlbnQgKi8KICAgICAgICAgICAgICAgIGlmKCAocE1lZGlhU3BlY2lmaWNCdWYtPkZsYWdzID09IE9TXzgwMl8xMV9SRVFVRVNUX1BBSVJXSVNFX0VSUk9SKSB8fCAocE1lZGlhU3BlY2lmaWNCdWYtPkZsYWdzID09IE9TXzgwMl8xMV9SRVFVRVNUX0dST1VQX0VSUk9SKSkgewogICAgICAgICAgICAgICAgICAgIC8qIE5vdGlmeSB3cGFfc3VwcGxpY2FudCBvZiBNSUMgZmFpbHVyZSAqLwogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLm1pY2hhZWxfbWljX2ZhaWx1cmUudW5pY2FzdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZXZlbnQoIG15U3VwcGwtPmhXcGFTdXBwbGljYW50LCBFVkVOVF9NSUNIQUVMX01JQ19GQUlMVVJFLCAmbXlFdmVudERhdGEgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIE9TXzgwMl8xMV9SRVFVRVNUX1JFQVVUSCAtIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSAqLwogICAgICAgICAgICAgICAgLyogT1NfODAyXzExX1JFUVVFU1RfS0VZVVBEQVRFIC0gbm8gZXZlbnQgb2YgdGhpcyB0eXBlICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSVBDX0VWRU5UX0xJTktfU1BFRUQ6CiAgICAgICAgICAgIGJ1ZkxvbmcgPSAoVUlOVDMyICopcERhdGEtPnVCdWZmZXI7CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfc3VwcGxpY2FudCAtIExpbmsgU3BlZWQgPSAldSBNQi9zIiwgKCgqYnVmTG9uZykgLyAyKSk7CiAgICAgICAgICAgIC8qIHdwYV9tc2cobXlTdXBwbC0+aFdwYVN1cHBsaWNhbnQsIE1TR19JTkZPLCBXUEFfRVZFTlRfTElOS19TUEVFRCAiJXUgTUIvcyIsICgoKmJ1ZkxvbmcpIC8gMikpOyAqLwogICAgICAgICAgICBteVN1cHBsLT5saW5rX3NwZWVkID0gKHVuc2lnbmVkKSgoKmJ1ZkxvbmcpIC8gMik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElQQ19FVkVOVF9XUEEyX1BSRUFVVEhFTlRJQ0FUSU9OOgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBXUEEyX1BSRUFVVEhFTlRJQ0FUSU9OIik7CiAgICAgICAgICAgIGJ1ZkxvbmcgPSAoVUlOVDMyICopcERhdGEtPnVCdWZmZXI7CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJQcmVhdXRoIFN0YXR1cyBDb2RlID0gJXUiLCpidWZMb25nKTsKICAgICAgICAgICAgLyogRG06IHdwYV9zdXBwbGljYW50X2V2ZW50KCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgRVZFTlRfUE1LSURfQ0FORElEQVRFLCAmZGF0YSk7ICovCiAgICAgICAgICAgIGJyZWFrOwoKI2lmbmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICAgICAgY2FzZSBJUENfRVZFTlRfQlRfQ09FWF9NT0RFOgogICAgICAgICAgICBidENvZXhTdGF0dXMgPSAoYnRDb2V4U3RhdHVzX3QgKilwRGF0YS0+dUJ1ZmZlcjsKICAgICAgICAgICAgaWYoIChidENvZXhTdGF0dXMgIT0gTlVMTCkgJiYgYnRDb2V4U3RhdHVzLT5zdGF0ZSApIHsKICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfc3VwcGxpY2FudCAtIEJUX0NPRVhfTU9ERSAoU0cgaXMgT04sIG1pblR4UmF0ZSA9ICVkKVxuIiwgYnRDb2V4U3RhdHVzLT5taW5UeFJhdGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9zdXBwbGljYW50IC0gQlRfQ09FWF9NT0RFIChTRyBpcyBPRkYpXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKI2VuZGlmCiAgICAgICAgY2FzZSBJUENfRVZFTlRfTE9XX1NOUjoKICAgICAgICBjYXNlIElQQ19FVkVOVF9MT1dfUlNTSToKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJ3cGFfc3VwcGxpY2FudCAtIFVuaGFuZGxlZCBkcml2ZXIgZXZlbnQ6ICVkIiwgKChJUENfRVZFTlRfUEFSQU1TKilwRGF0YSktPnVFdmVudFR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgIH0KfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfaW5pdApSb3V0aW5lIERlc2NyaXB0aW9uOiBpbml0IGRyaXZlciBpbnRlcmZhY2UKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIGlmbmFtZSAtIHJldHVybiBpbnRlcmZhY2UgbmFtZQpSZXR1cm4gVmFsdWU6IHBvaW50ZXIgdG8gZHJpdmVyIHN0cnVjdHVyZSAodG8gYmUgc3VwcGxpZWQgbGF0ZXIgYnkgc3VwcGxpY2FudCB0byB3cmFwcGVycykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgdm9pZCAqd3BhX2RyaXZlcl90aXN0YV9pbml0KCB2b2lkICpwcml2LCBjb25zdCBjaGFyICppZm5hbWUgKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydjsKICAgIGludCBzdGF0dXM7CiAgICBVSU5UMzIgZHJpdmVyU3RhdHVzLHJlczsKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBlY2hvc2VydmVyOwogICAgT1NfODAyXzExX01BQ19BRERSRVNTIG15TWFjOwojaWZkZWYgQ09ORklHX1RJX0xPQ0tGSUxFCiAgICBjaGFyIHN0clsxMF07CiNlbmRpZgoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJJbml0aWFsaXppbmcgU1RBLURLICVzIGludGVyZmFjZS4uLiIsU1dfVkVSU0lPTl9TVFIpOwojaWZkZWYgQ09ORklHX1RJX0xPQ0tGSUxFCiAgICAvKiBUcnkgdG8gb3BlbiB0aGUgbG9jayBmaWxlICovCiAgICBsZnAgPSBvcGVuKCIuLy53cGFfc3VwcGxpY2FudF9sb2NrZmlsZS5waWQiLCAoT19SRFdSIHwgT19DUkVBVCB8IE9fRVhDTCksIDA2NDApOwogICAgaWYoIGxmcCA8IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsIkNhbm5vdCBvcGVuIHBpZC1maWxlLi4uQWJvcnRpbmcuLi5cbiIpOwogICAgICAgIHJldHVybiggTlVMTCApOwogICAgfQogICAgLyogVHJ5IHRvIGdldCBhIGZpbGUgbG9jayBvbiB0aGUgcGlkLWZpbGUuIElmIGFub3RoZXIgaW5zdGFuY2UgaXMgcnVubmluZyBhbmQgYWxyZWFkeSBoYXMgYSBsb2NrIC0gd2Ugd2lsbCBmYWlsICovCiNpZm5kZWYgQU5EUk9JRCAvKiBEbTogISEhIGxvY2tmIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBBbmRyb2lkICovCiAgICBpZiggbG9ja2YobGZwLEZfVExPQ0ssMCkgPCAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJBbm90aGVyIGluc3RhbmNlIG9mIHdwYV9zdXBwbGljYW50IGlzIHJ1bm5pbmcuLi5BYm9ydGluZy4uLlxuIik7CiAgICAgICAgcmV0dXJuKCBOVUxMICk7CiAgICB9CiNlbmRpZgogICAgLyogSWYgd2UgZ290IGhlcmUgLSBpdCBtZWFucyB0aGF0IG5vIG90aGVyIGluc3RhbmNlIGlzIHJ1bm5pbmcgLSB3cml0ZSBwcm9jZXNzIGlkIHRvIHBpZF9maWxlICovCiAgICBzcHJpbnRmKHN0ciwgIiVkXG4iLCBnZXRwaWQoKSk7CiAgICB3cml0ZShsZnAsc3RyLG9zX3N0cmxlbihzdHIpKTsgLyogcmVjb3JkIHBpZCB0byBsb2NrZmlsZSAqLwojZW5kaWYKCiAgICAvKiBBbGxvY2F0ZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB0byBtYW5hZ2UgZHJpdmVyICovCiAgICBteURydiA9IG9zX21hbGxvYyggc2l6ZW9mKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEpICk7CgogICAgLyogSWYgZmFpbGVkIHRvIGFsbG9jYXRlICovCiAgICBpZiggbXlEcnYgPT0gTlVMTCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udHJvbCBzdHJ1Y3R1cmUuLi5BYm9ydGluZy4uLiIpOwogICAgICAgIGdvdG8gbGFiZWxfaW5pdF9lcnJvcl9maWxlOwogICAgfQoKICAgIC8qIFplcm8gbWVtb3J5ICovCiAgICBvc19tZW1zZXQoIG15RHJ2LCAwLCBzaXplb2Yoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSkgKTsKCiAgICAvKiBJbml0aWFsaXplIFV0aWxpdHkgQWRhcHRlciBtb2R1bGUgKi8KICAgIG15RHJ2LT5oRHJpdmVyID0gVElfQWRhcHRlckluaXQoIFRJV0xBTl9EUlZfTkFNRSApOwoKICAgIC8qIElmIGNvdWxkbid0IGluaXRpYWxpemUgLSByZXR1cm4gTlVMTCB0byBpbmRpY2F0ZSBlcnJvciAqLwogICAgaWYoIG15RHJ2LT5oRHJpdmVyID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsIkVycm9yOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBVdGlsaXR5IEFkYXB0ZXIgaW50ZXJmYWNlLi4uIik7CiAgICAgICAgZ290byBsYWJlbF9pbml0X2Vycm9yX2ZyZWU7CiAgICB9CgogICAgLyogR2V0IFdMQU4gaW50ZXJmYWNlIG1hYyBhZGRyZXNzIHRocm91Z2ggVXRpbGl0eSBBZGFwdGVyICovCiAgICByZXMgPSBUSV9HZXRDdXJyZW50QWRkcmVzcyggbXlEcnYtPmhEcml2ZXIsICZteU1hYyApOwoKICAgIGlmKCByZXMgPT0gKFVJTlQzMiktMSApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiRXJyb3I6IGZhaWxlZCB0byBpbml0aWFsaXplIFV0aWxpdHkgQWRhcHRlciBpbnRlcmZhY2UuLi4iKTsKICAgICAgICBnb3RvIGxhYmVsX2luaXRfZXJyb3JfZnJlZTsKICAgIH0KCiAgICBvc19tZW1jcHkoICZteURydi0+b3duX2FkZHIsICZteU1hYywgTUFDX0FERFJfTEVOICk7CgogICAgd3BhX2RyaXZlcl90aXN0YV9yZWdpc3Rlcl9ldmVudHMoIG15RHJ2ICk7CgogICAgLyogQmxvY2sgZGlzYXNzb2MgZXZlbnRzIHVudGlsIGNvbm5lY3RlZCAqLwogICAgaWYoIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPT0gTk9fQkxPQ0sgKQogICAgICAgIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPSBOT19CTE9DS19ESVNBU1NPQ19JTl9QUk9HUkVTUzsKCiAgICAvKiBTdG9yZSB3cGFfc3VwcGxpY2FudCBjb250ZXh0ICovCiAgICBteURydi0+aFdwYVN1cHBsaWNhbnQgPSBwcml2OwoKICAgIG15RHJ2LT5kcml2ZXJFdmVudHNTb2NrZXQgPSBzb2NrZXQoIFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQICk7CgogICAgaWYoIG15RHJ2LT5kcml2ZXJFdmVudHNTb2NrZXQgPCAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJFcnJvcjogZmFpbGVkIHRvIGNyZWF0ZSBkcml2ZXIgZXZlbnRzIHNvY2tldC4uLiAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICBnb3RvIGxhYmVsX2luaXRfZXJyb3JfZnJlZTsKICAgIH0KCiAgICBvc19tZW1zZXQoICZlY2hvc2VydmVyLCAwLCBzaXplb2YoZWNob3NlcnZlcikgKTsgIC8qIENsZWFyIHN0cnVjdCAqLwogICAgZWNob3NlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5ldC9JUCAqLwogICAgZWNob3NlcnZlci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsgICAvKiBJUCBhZGRyZXNzICovCiAgICBlY2hvc2VydmVyLnNpbl9wb3J0ID0gaHRvbnMoVElfRFJJVkVSX01TR19QT1JUKTsgIC8qIHNlcnZlciBwb3J0ICovCgogICAgaWYoIGJpbmQobXlEcnYtPmRyaXZlckV2ZW50c1NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmZWNob3NlcnZlciwgc2l6ZW9mKGVjaG9zZXJ2ZXIpKSA8IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsIkVycm9yOiBmYWlsZWQgdG8gY3JlYXRlIGRyaXZlciBldmVudHMgc29ja2V0Li4uICglcykiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIGNsb3NlKG15RHJ2LT5kcml2ZXJFdmVudHNTb2NrZXQpOwogICAgICAgIGdvdG8gbGFiZWxfaW5pdF9lcnJvcl9mcmVlOwogICAgfQoKICAgIHN0YXR1cyA9IGVsb29wX3JlZ2lzdGVyX3JlYWRfc29jayggbXlEcnYtPmRyaXZlckV2ZW50c1NvY2tldCwgd3BhX2RyaXZlcl90aXN0YV9yZWNlaXZlX2RyaXZlcl9ldmVudCwgcHJpdiwgbXlEcnYgKTsKCiAgICBpZiggc3RhdHVzICE9IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsIkVycm9yOiBmYWlsZWQgdG8gcmVnaXN0ZXIgc29ja2V0IGhhbmRsZXIuLi4iKTsKICAgIH0KCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiZHJpdmVyIGV2ZW50cyBzb2NrZXQgaXMgMHgleC4uLiIsbXlEcnYtPmRyaXZlckV2ZW50c1NvY2tldCk7CgogICAgLyogU2lnbmFsIHRoYXQgZHJpdmVyIGlzIG5vdCBzdG9wcGVkICovCiAgICBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCA9IFRSVUU7CgogICAgLyogU2V0IGRlZmF1bHQgc2NhbiB0eXBlICovCiAgICBteURydi0+c2Nhbl90eXBlID0gU0NBTl9UWVBFX05PUk1BTF9BQ1RJVkU7CiAgICBteURydi0+Zm9yY2VfbWVyZ2VfZmxhZyA9IDA7CiAgICBzY2FuX2luaXQoIG15RHJ2ICk7CgogICAgLyogU2V0IGRlZmF1bHQgYW1vdW50IG9mIGNoYW5uZWxzICovCiAgICBteURydi0+c2Nhbl9jaGFubmVscyA9IGNoZWNrX2FuZF9nZXRfYnVpbGRfY2hhbm5lbHMoKTsKCiAgICAvKiBMaW5rIFNwZWVkIHdpbGwgYmUgc2V0IGJ5IHRoZSBtZXNzYWdlIGZyb20gdGhlIGRyaXZlciAqLwogICAgbXlEcnYtPmxpbmtfc3BlZWQgPSAwOwoKICAgIC8qIEJ0Q29leCBtb2RlIGlzIHJlYWQgZnJvbSB0aXdsYW4uaW5pIGZpbGUgKi8KICAgIG15RHJ2LT5idGNvZXhfbW9kZSA9IDE7IC8qIFNHX0RJU0FCTEUgKi8KICAgIG15RHJ2LT5idGNvZXhfc2NhbiA9IEZBTFNFOwoKICAgIC8qIFJUUyBUaHJlc2hvbGQgaXMgcmVhZCBmcm9tIHRpd2xhbi5pbmkgZmlsZSAqLwogICAgbXlEcnYtPnJ0c190aHJlc2hvbGQgPSBIQUxfQ1RSTF9SVFNfVEhSRVNIT0xEX01BWDsKCiAgICAvKiBSZXR1cm4gcG9pbnRlciB0byBvdXIgZHJpdmVyIHN0cnVjdHVyZSAqLwogICAgcmV0dXJuKCBteURydiApOwoKbGFiZWxfaW5pdF9lcnJvcl9mcmVlOgogICAgb3NfZnJlZSggbXlEcnYgKTsKbGFiZWxfaW5pdF9lcnJvcl9maWxlOgojaWZkZWYgQ09ORklHX1RJX0xPQ0tGSUxFCiAgICAvKiBDbG9zZSBhbmQgZGVsZXRlIHRoZSBwaWQtbG9jay1maWxlICovCiAgICBjbG9zZShsZnApOwogICAgdW5saW5rKCIuL3dwYV9zdXBwbGljYW50X2xvY2tmaWxlLnBpZCIpOwojZW5kaWYKICAgIHJldHVybiggTlVMTCApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV91bmxvYWQKUm91dGluZSBEZXNjcmlwdGlvbjogdW5sb2FkIGRyaXZlcgpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKUmV0dXJuIFZhbHVlOiBOb25lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIHZvaWQgd3BhX2RyaXZlcl90aXN0YV91bmxvYWQoIHZvaWQgKnByaXYgKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV91bmxvYWQgY2FsbGVkIik7CiAgICAvKiBVbnJlZ2lzdGVyIGRyaXZlciBldmVudHMgKi8KICAgIHdwYV9kcml2ZXJfdGlzdGFfdW5yZWdpc3Rlcl9ldmVudHMoIHByaXYgKTsKICAgIC8qIENsb3NlIGNvbm5lY3Rpb24gc29ja2V0ICovCiAgICBjbG9zZShteURydi0+ZHJpdmVyRXZlbnRzU29ja2V0KTsKICAgIC8qIFVubG9hZCBVdGlsaXR5IEFkYXB0ZXIgKi8KICAgIFRJX0FkYXB0ZXJEZWluaXQoIG15RHJ2LT5oRHJpdmVyICk7CiAgICAvKiBGcmVlIGFsbCBhbGxvY2F0ZWQgbWVtb3J5ICovCiAgICBzY2FuX2V4aXQoIG15RHJ2ICk7CiAgICBvc19mcmVlKCBteURydiApOwojaWZkZWYgQ09ORklHX1RJX0xPQ0tGSUxFCiAgICAvKiBDbG9zZSBhbmQgZGVsZXRlIHRoZSBwaWQtbG9jay1maWxlICovCiAgICBjbG9zZShsZnApOwogICAgdW5saW5rKCIuL3dwYV9zdXBwbGljYW50X2xvY2tmaWxlLnBpZCIpOwojZW5kaWYKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJTVEEtREsgJXMgaW50ZXJmYWNlIERlaW5pdGlhbGl6ZWQuLi5ieWUhIiwgU1dfVkVSU0lPTl9TVFIpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9nZXRfbWFjX2FkZHIKUm91dGluZSBEZXNjcmlwdGlvbjogcmV0dXJuIFdMQU4gTUFDIGFkZHJlc3MKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlClJldHVybiBWYWx1ZTogcG9pbnRlciB0byBCU1NJRAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmNvbnN0IHU4ICp3cGFfZHJpdmVyX3Rpc3RhX2dldF9tYWNfYWRkciggdm9pZCAqcHJpdiApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX2dldF9tYWNfYWRkciBjYWxsZWQiKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIE5VTEwgKTsKICAgIHJldHVybiggKGNvbnN0IHU4ICopJm15RHJ2LT5vd25fYWRkciApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZW5kX2VhcG9sClJvdXRpbmUgRGVzY3JpcHRpb246IHRyYW5zbWl0IEVBUE9MCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBkYXRhIC0gcG9pbnRlciB0byBFQVBPTCBkYXRhCiAgIGRhdGFfbGVuIC0gbGVuZ3RoIG9mIEVBUE9MIGRhdGEKUmV0dXJuIFZhbHVlOiBOb25lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB0aV9zZW5kX2VhcG9sKCB2b2lkICpwcml2LCBjb25zdCB1OCAqZGVzdCwgdTE2IHByb3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4gKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIHU4KiBEYXRhV2l0aEhlYWRlciA9IE5VTEw7CiAgICB1MTYgcHJvdG9OZXR3b3JrOwogICAgaW50IHJldCA9IDA7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlRJIHNlbmRfZWFwb2wgY2FsbGVkIik7CiNpZmRlZiBJRUVFODAyMVhfRUFQT0wKICAgIERhdGFXaXRoSGVhZGVyID0gb3NfbWFsbG9jKGRhdGFfbGVuICsgRVRIRVJORVRfSERSX0xFTik7IC8qIDE0IGJ5dGVzICovCiAgICBpZiggRGF0YVdpdGhIZWFkZXIgPT0gTlVMTCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiVEkgc2VuZF9lYXBvbCBmYWlsZWQgdG8gYWxsb2MgZnVsbCBidWZmZXIiKTsKICAgICAgICByZXR1cm4oIC0xICk7CiAgICB9CgogICAgb3NfbWVtY3B5KERhdGFXaXRoSGVhZGVyLCBkZXN0LCBNQUNfQUREUl9MRU4pOyAvKiA2IGJ5dGVzICovCiAgICBvc19tZW1jcHkoRGF0YVdpdGhIZWFkZXIrTUFDX0FERFJfTEVOLCBteURydi0+b3duX2FkZHIsIE1BQ19BRERSX0xFTik7CiAgICBwcm90b05ldHdvcmsgPSBodG9ucyhwcm90byk7CiAgICBvc19tZW1jcHkoRGF0YVdpdGhIZWFkZXIrKE1BQ19BRERSX0xFTjw8MSksICZwcm90b05ldHdvcmssIHNpemVvZih1MTYpKTsgLyogMiBieXRlcyAqLwoKICAgIG9zX21lbWNweShEYXRhV2l0aEhlYWRlcitFVEhFUk5FVF9IRFJfTEVOLCBkYXRhLCBkYXRhX2xlbik7CiAgICBkYXRhX2xlbiArPSBFVEhFUk5FVF9IRFJfTEVOOwoKICAgIHdwYV9oZXhkdW1wKE1TR19ERUJVRywgIldQQTogRlVMTCBUWCBFQVBPTC1LZXkiLCBEYXRhV2l0aEhlYWRlciwgZGF0YV9sZW4pOwoKICAgIC8qIFRyYW5zbWl0IEVBUE9MIHBhY2tldCAqLwogICAgcmV0ID0gVElfU2VuZF9FQVBPTF9QYWNrZXQoIG15RHJ2LT5oRHJpdmVyLCAodm9pZCAqKURhdGFXaXRoSGVhZGVyLCBkYXRhX2xlbiApOwogICAgb3NfZnJlZShEYXRhV2l0aEhlYWRlcik7CiNlbmRpZgogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKI2lmbmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiBwcmVwYXJlX2ZpbHRlcl9zdHJ1Y3QKUm91dGluZSBEZXNjcmlwdGlvbjogZmlsbHMgcnggZGF0YSBmaWx0ZXIgc3RydWN0dXJlIGFjY29yZGluZyB0byBwYXJhbWV0ZXIgdHlwZQpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgdHlwZSAtIHR5cGUgb2YgbWFjIGFkZHJlc3MKICAgZGZyZXFfcHRyIC0gcG9pbnRlciB0byBUSVdMQU5fREFUQV9GSUxURVJfUkVRVUVTVCBzdHJ1Y3R1cmUKUmV0dXJuIFZhbHVlOiAwIC0gc3VjY2VzcywgLTEgLSBlcnJvcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgcHJlcGFyZV9maWx0ZXJfc3RydWN0KCB2b2lkICpwcml2LCBpbnQgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJV0xBTl9EQVRBX0ZJTFRFUl9SRVFVRVNUICpkZnJlcV9wdHIgKQp7CiAgICB1OCAqbWFjYWRkciA9IE5VTEw7CiAgICBzaXplX3QgbGVuID0gMDsKICAgIHU4IG1hc2sgPSAwOwogICAgaW50IHJldCA9IC0xOwoKICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCAiJXM6IHR5cGU9JWQiLCBfX2Z1bmNfXywgdHlwZSk7CiAgICBzd2l0Y2ggKHR5cGUgKSB7CiAgICAgIGNhc2UgUlhfU0VMRl9GSUxURVI6CiAgICAgICAgbWFjYWRkciA9ICh1OCAqKXdwYV9kcml2ZXJfdGlzdGFfZ2V0X21hY19hZGRyKHByaXYpOwogICAgICAgIGxlbiA9IE1BQ19BRERSX0xFTjsKICAgICAgICBtYXNrID0gMHgzRjsgLyogNiBieXRlcyAqLwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJYX0JST0FEQ0FTVF9GSUxURVI6CiAgICAgICAgbWFjYWRkciA9ICh1OCAqKSJceEZGXHhGRlx4RkZceEZGXHhGRlx4RkYiOwogICAgICAgIGxlbiA9IE1BQ19BRERSX0xFTjsKICAgICAgICBtYXNrID0gMHgzRjsgLyogNiBieXRlcyAqLwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJYX0lQVjRfTVVMVElDQVNUX0ZJTFRFUjoKICAgICAgICBtYWNhZGRyID0gKHU4ICopIlx4MDFceDAwXHg1RSI7CiAgICAgICAgbGVuID0gMzsKICAgICAgICBtYXNrID0gMHg3OyAvKiAzIGJ5dGVzICovCiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUlhfSVBWNl9NVUxUSUNBU1RfRklMVEVSOgogICAgICAgIG1hY2FkZHIgPSAodTggKikiXHgzM1x4MzMiOwogICAgICAgIGxlbiA9IDI7CiAgICAgICAgbWFzayA9IDB4MzsgLyogMiBieXRlcyAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGxlbiAmJiBtYWNhZGRyKSB7CiAgICAgICAgZGZyZXFfcHRyLT5PZmZzZXQgPSAwOwogICAgICAgIGRmcmVxX3B0ci0+TWFza0xlbmd0aCA9IDE7CiAgICAgICAgZGZyZXFfcHRyLT5NYXNrWzBdID0gbWFzazsKICAgICAgICBkZnJlcV9wdHItPlBhdHRlcm5MZW5ndGggPSBsZW47CiAgICAgICAgb3NfbWVtY3B5KCBkZnJlcV9wdHItPlBhdHRlcm4sIG1hY2FkZHIsIGxlbiApOwogICAgICAgIHJldCA9IDA7CiAgICB9CiAgICByZXR1cm4oIHJldCApOwp9CiNlbmRpZgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZHJpdmVyX2NtZApSb3V0aW5lIERlc2NyaXB0aW9uOiBleGVjdXRlcyBkcml2ZXItc3BlY2lmaWMgY29tbWFuZHMKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIGNtZCAtIGNvbW1hbmQKICAgYnVmIC0gcmV0dXJuIGJ1ZmZlcgogICBidWZfbGVuIC0gYnVmZmVyIGxlbmd0aApSZXR1cm4gVmFsdWU6IGFjdHVhbCBidWZmZXIgbGVuZ3RoIC0gc3VjY2VzcywgLTEgLSBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KaW50IHdwYV9kcml2ZXJfdGlzdGFfZHJpdmVyX2NtZCggdm9pZCAqcHJpdiwgY2hhciAqY21kLCBjaGFyICpidWYsIHNpemVfdCBidWZfbGVuICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBpbnQgcmV0ID0gLTEsIHByZXZfZXZlbnRzOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiJXMgJXMiLCBfX2Z1bmNfXywgY21kKTsKCiAgICBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJzdGFydCIpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlN0YXJ0IGNvbW1hbmQiKTsKICAgICAgICBwcmV2X2V2ZW50cyA9IG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHM7CiAgICAgICAgbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9IG15RHJ2LT5ibG9ja19kaXNhc3NvY19wcmV2OwogICAgICAgIHJldCA9IFRJX1N0YXJ0KCBteURydi0+aERyaXZlciApOwogICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgIC8qIFNpZ25hbCB0aGF0IGRyaXZlciBpcyBub3QgbG9hZGVkIHlldCAqLwogICAgICAgICAgICBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCA9IFRSVUU7CiAgICAgICAgICAgIHdwYV9tc2cobXlEcnYtPmhXcGFTdXBwbGljYW50LCBNU0dfSU5GTywgV1BBX0VWRU5UX0RSSVZFUl9TVEFURSAiU1RBUlRFRCIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPSBwcmV2X2V2ZW50czsKICAgICAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwogICAgfQoKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAic3RvcCIpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlN0b3AgY29tbWFuZCIpOwogICAgICAgIG15RHJ2LT5ibG9ja19kaXNhc3NvY19wcmV2ID0gbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50czsKICAgICAgICBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID0gQkxPQ0tfRElTQVNTT0M7IC8qIEJsb2NrIG1lc3NhZ2UgKi8KICAgICAgICByZXQgPSBUSV9TdG9wKCBteURydi0+aERyaXZlciApOwogICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgIC8qIFNpZ25hbCB0aGF0IGRyaXZlciBpcyBub3QgbG9hZGVkIHlldCAqLwogICAgICAgICAgICBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCA9IEZBTFNFOwogICAgICAgICAgICB3cGFfbXNnKG15RHJ2LT5oV3BhU3VwcGxpY2FudCwgTVNHX0lORk8sIFdQQV9FVkVOVF9EUklWRVJfU1RBVEUgIlNUT1BQRUQiKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID0gbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX3ByZXY7CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgIm1hY2FkZHIiKSA9PSAwICkgewogICAgICAgIHU4ICptYWNhZGRyID0gKHU4ICopd3BhX2RyaXZlcl90aXN0YV9nZXRfbWFjX2FkZHIocHJpdik7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIk1hY2FkZHIgY29tbWFuZCIpOwogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiICAgTWFjYWRkciA9ICIgTUFDU1RSLCBNQUMyU1RSKG1hY2FkZHIpKTsKICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICJNYWNhZGRyID0gIiBNQUNTVFIgIlxuIiwgTUFDMlNUUihtYWNhZGRyKSk7CiAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAic2Nhbi1wYXNzaXZlIikgPT0gMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiU2NhbiBQYXNzaXZlIGNvbW1hbmQiKTsKICAgICAgICBteURydi0+c2Nhbl90eXBlID0gU0NBTl9UWVBFX05PUk1BTF9QQVNTSVZFOwogICAgICAgIHJldCA9IDA7CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInNjYW4tYWN0aXZlIikgPT0gMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiU2NhbiBBY3RpdmUgY29tbWFuZCIpOwogICAgICAgIG15RHJ2LT5zY2FuX3R5cGUgPSBTQ0FOX1RZUEVfTk9STUFMX0FDVElWRTsKICAgICAgICByZXQgPSAwOwogICAgfQogICAgZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJzY2FuLW1vZGUiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJTY2FuIE1vZGUgY29tbWFuZCIpOwogICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIlNjYW5Nb2RlID0gJXVcbiIsIG15RHJ2LT5zY2FuX3R5cGUpOwogICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgImxpbmtzcGVlZCIpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIkxpbmsgU3BlZWQgY29tbWFuZCIpOwogICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIkxpbmtTcGVlZCAldVxuIiwgbXlEcnYtPmxpbmtfc3BlZWQpOwogICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJzY2FuLWNoYW5uZWxzIiwgMTMpID09IDAgKSB7CiAgICAgICAgaW50IG5vT2ZDaGFuOwogICAgICAgIGNoYXIgKmNwID0gY21kICsgMTM7CiAgICAgICAgY2hhciAqZW5kcDsKCiAgICAgICAgaWYgKCpjcCAhPSAnXDAnKSB7CiAgICAgICAgICAgIG5vT2ZDaGFuID0gc3RydG9sKGNwLCAmZW5kcCwgMCk7CiAgICAgICAgICAgIGlmIChlbmRwICE9IGNwKSB7CiAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiU2NhbiBDaGFubmVscyBjb21tYW5kID0gJWQiLCBub09mQ2hhbik7CiAgICAgICAgICAgICAgICBpZiggKG5vT2ZDaGFuID4gMCkgJiYgKG5vT2ZDaGFuIDw9IE1BWF9OVU1CRVJfT0ZfQ0hBTk5FTFNfUEVSX1NDQU4pICkgewogICAgICAgICAgICAgICAgICAgIG15RHJ2LT5zY2FuX2NoYW5uZWxzID0gbm9PZkNoYW47CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIlNjYW4tQ2hhbm5lbHMgPSAlZFxuIiwgbXlEcnYtPnNjYW5fY2hhbm5lbHMpOwogICAgICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJyc3NpLWFwcHJveCIpID09IDAgKSB7CiAgICAgICAgc3RydWN0IHdwYV9zY2FuX3Jlc3VsdCAqY3VyX3JlczsKICAgICAgICBzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zID0gKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqKShteURydi0+aFdwYVN1cHBsaWNhbnQpOwogICAgICAgIGludCByc3NpLCBsZW47CgogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJyc3NpLWFwcHJveCBjb21tYW5kIik7CgogICAgICAgIGlmKCAhd3BhX3MgKQogICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgIGN1cl9yZXMgPSBzY2FuX2dldF9ieV9ic3NpZCggbXlEcnYsIHdwYV9zLT5ic3NpZCApOwogICAgICAgIGlmKCBjdXJfcmVzICkgewogICAgICAgICAgICBsZW4gPSAoaW50KShjdXJfcmVzLT5zc2lkX2xlbik7CiAgICAgICAgICAgIHJzc2kgPSBjdXJfcmVzLT5sZXZlbDsKICAgICAgICAgICAgaWYoIChsZW4gPiAwKSAmJiAobGVuIDw9IE1BWF9TU0lEX0xFTikgJiYgKGxlbiA8IChpbnQpYnVmX2xlbikpIHsKICAgICAgICAgICAgICAgIG9zX21lbWNweSggKHZvaWQgKilidWYsICh2b2lkICopKGN1cl9yZXMtPnNzaWQpLCBsZW4gKTsKICAgICAgICAgICAgICAgIHJldCA9IGxlbjsKICAgICAgICAgICAgICAgIHJldCArPSBzbnByaW50ZigmYnVmW3JldF0sIGJ1Zl9sZW4tbGVuLCAiIHJzc2kgJWRcbiIsIHJzc2kpOwogICAgICAgICAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInJzc2kiKSA9PSAwICkgewojaWYgMQogICAgICAgIHU4IHNzaWRbTUFYX1NTSURfTEVOXTsKICAgICAgICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0ICpjdXJfcmVzOwogICAgICAgIHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MgPSAoc3RydWN0IHdwYV9zdXBwbGljYW50ICopKG15RHJ2LT5oV3BhU3VwcGxpY2FudCk7CiAgICAgICAgaW50IHJzc2ksIGxlbjsKCiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsInJzc2kgY29tbWFuZCIpOwoKICAgICAgICByZXQgPSBUSV9HZXRSU1NJKCBteURydi0+aERyaXZlciwgJnJzc2kgKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICBsZW4gPSB3cGFfZHJpdmVyX3Rpc3RhX2dldF9zc2lkKCBwcml2LCAodTggKilzc2lkICk7CiAgICAgICAgICAgIGlmKCAobGVuID4gMCkgJiYgKGxlbiA8PSBNQVhfU1NJRF9MRU4pICYmIChsZW4gPCAoaW50KWJ1Zl9sZW4pKSB7CiAgICAgICAgICAgICAgICBvc19tZW1jcHkoICh2b2lkICopYnVmLCAodm9pZCAqKXNzaWQsIGxlbiApOwogICAgICAgICAgICAgICAgcmV0ID0gbGVuOwogICAgICAgICAgICAgICAgcmV0ICs9IHNucHJpbnRmKCZidWZbcmV0XSwgYnVmX2xlbi1sZW4sICIgcnNzaSAlZFxuIiwgcnNzaSk7CiAgICAgICAgICAgICAgICBpZiggIXdwYV9zICkKICAgICAgICAgICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgICAgICAgICAgY3VyX3JlcyA9IHNjYW5fZ2V0X2J5X2Jzc2lkKCBteURydiwgd3BhX3MtPmJzc2lkICk7CiAgICAgICAgICAgICAgICBpZiggY3VyX3JlcyApCiAgICAgICAgICAgICAgICAgICAgY3VyX3Jlcy0+bGV2ZWwgPSByc3NpOwogICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KI2Vsc2UKICAgICAgICBPU184MDJfMTFfQlNTSURfRVggYnNzaWRJbmZvOwoKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywicnNzaSBjb21tYW5kIik7CgogICAgICAgIHJldCA9IFRJX0dldFNlbGVjdGVkQlNTSURJbmZvKCBteURydi0+aERyaXZlciwgKE9TXzgwMl8xMV9CU1NJRF9FWCAqKSZic3NpZEluZm8gKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICBpZiggYnNzaWRJbmZvLlNzaWQuU3NpZExlbmd0aCAhPSAwICYmIGJzc2lkSW5mby5Tc2lkLlNzaWRMZW5ndGggPCBidWZfbGVuKSB7CiAgICAgICAgICAgICAgICBvc19tZW1jcHkoICh2b2lkICopYnVmLCAodm9pZCAqKShic3NpZEluZm8uU3NpZC5Tc2lkKSwgYnNzaWRJbmZvLlNzaWQuU3NpZExlbmd0aCApOwogICAgICAgICAgICAgICAgcmV0ID0gYnNzaWRJbmZvLlNzaWQuU3NpZExlbmd0aDsKICAgICAgICAgICAgICAgIHJldCArPSBzbnByaW50ZigmYnVmW3JldF0sIGJ1Zl9sZW4tcmV0LCAiIHJzc2kgJWRcbiIsIGJzc2lkSW5mby5Sc3NpKTsKICAgICAgICAgICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCA9IC0xOwogICAgICAgIH0KI2VuZGlmCiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJwb3dlcm1vZGUiLCA5KSA9PSAwICkgewogICAgICAgIHUzMiBydHNUaHJlc2hvbGQgPSBteURydi0+cnRzX3RocmVzaG9sZDsKICAgICAgICB1MzIgbW9kZTsKICAgICAgICBjaGFyICpjcCA9IGNtZCArIDk7CiAgICAgICAgY2hhciAqZW5kcDsKCiAgICAgICAgaWYgKCpjcCAhPSAnXDAnKSB7CiAgICAgICAgICAgIG1vZGUgPSAodTMyKXN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlBvd2VyIE1vZGUgY29tbWFuZCA9ICV1IiwgbW9kZSk7CiAgICAgICAgICAgICAgICBpZiggbW9kZSA8PSBPU19QT1dFUl9NT0RFX0xPTkdfRE9aRSApCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gVElfQ29uZmlnUG93ZXJNYW5hZ2VtZW50KCBteURydi0+aERyaXZlciwgbW9kZSApOwogICAgICAgICAgICAgICAgaWYoIG1vZGUgPT0gT1NfUE9XRVJfTU9ERV9BQ1RJVkUgKQogICAgICAgICAgICAgICAgICAgIHJ0c1RocmVzaG9sZCA9IDA7CiAgICAgICAgICAgICAgICBpZiggVElfU2V0UlRTVGhyZXNob2xkKCBteURydi0+aERyaXZlciwgcnRzVGhyZXNob2xkICkgIT0gT0sgKQogICAgICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJTZXQgUlRTIHRocmVzaG9sZCA9ICV1IGZhaWxlZCIsIHJ0c1RocmVzaG9sZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJnZXRwb3dlciIsIDgpID09IDAgKSB7CiAgICAgICAgdTMyIG1vZGU7CgogICAgICAgIHJldCA9IFRJX0dldFBvd2VyTW9kZSggbXlEcnYtPmhEcml2ZXIsIChPU184MDJfMTFfUE9XRVJfUFJPRklMRSAqKSZtb2RlKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICJwb3dlcm1vZGUgPSAldVxuIiwgbW9kZSk7CiAgICAgICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJnZXQtcnRzLXRocmVzaG9sZCIsIDE3KSA9PSAwICkgewogICAgICAgIHRpVUlOVDMyIHJ0c1RocmVzaG9sZCA9IDA7CgogICAgICAgIHJldCA9IFRJX0dldFJUU1RocmVzaG9sZCggbXlEcnYtPmhEcml2ZXIsICZydHNUaHJlc2hvbGQgKTsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiR2V0IFJUUyBUaHJlc2hvbGQgY29tbWFuZCA9ICVkIiwgcnRzVGhyZXNob2xkKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICJydHMtdGhyZXNob2xkID0gJXVcbiIsIHJ0c1RocmVzaG9sZCk7CiAgICAgICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJzZXQtcnRzLXRocmVzaG9sZCIsIDE3KSA9PSAwICkgewogICAgICAgIHRpVUlOVDMyIHJ0c1RocmVzaG9sZCA9IDA7CiAgICAgICAgY2hhciAqY3AgPSBjbWQgKyAxNzsKICAgICAgICBjaGFyICplbmRwOwoKICAgICAgICBpZiAoKmNwICE9ICdcMCcpIHsKICAgICAgICAgICAgcnRzVGhyZXNob2xkID0gKHRpVUlOVDMyKXN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlJUUyBUaHJlc2hvbGQgY29tbWFuZCA9ICVkIiwgcnRzVGhyZXNob2xkKTsKICAgICAgICAgICAgICAgIGlmKCBydHNUaHJlc2hvbGQgPD0gSEFMX0NUUkxfUlRTX1RIUkVTSE9MRF9NQVggKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gVElfU2V0UlRTVGhyZXNob2xkKCBteURydi0+aERyaXZlciwgcnRzVGhyZXNob2xkICk7CiAgICAgICAgICAgICAgICAgICAgaWYoIHJldCA9PSBPSyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXlEcnYtPnJ0c190aHJlc2hvbGQgPSBydHNUaHJlc2hvbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJidGNvZXhzY2FuLXN0YXJ0IikgPT0gMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiQlQgQ29leCBTY2FuIFN0YXJ0IGNvbW1hbmQiKTsKICAgICAgICBteURydi0+YnRjb2V4X3NjYW4gPSBUUlVFOwogICAgICAgIHJldCA9IDA7CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgImJ0Y29leHNjYW4tc3RvcCIpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIkJUIENvZXggU2NhbiBTdG9wIGNvbW1hbmQiKTsKICAgICAgICBteURydi0+YnRjb2V4X3NjYW4gPSBGQUxTRTsKICAgICAgICByZXQgPSAwOwogICAgfQojaWZuZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAicnhmaWx0ZXItc3RhcnQiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJSeCBEYXRhIEZpbHRlciBTdGFydCBjb21tYW5kIik7CiAgICAgICAgcmV0ID0gVElfRW5hYmxlRGlzYWJsZVJ4RGF0YUZpbHRlcnMoIG15RHJ2LT5oRHJpdmVyLCBUUlVFICk7CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInJ4ZmlsdGVyLXN0b3AiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJSeCBEYXRhIEZpbHRlciBTdG9wIGNvbW1hbmQiKTsKICAgICAgICByZXQgPSBUSV9FbmFibGVEaXNhYmxlUnhEYXRhRmlsdGVycyggbXlEcnYtPmhEcml2ZXIsIEZBTFNFICk7CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInJ4ZmlsdGVyLXN0YXRpc3RpY3MiKSA9PSAwICkgewogICAgICAgIFRJV0xBTl9EQVRBX0ZJTFRFUl9TVEFUSVNUSUNTIHN0YXRzOwogICAgICAgIGludCBsZW4sIGk7CgogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJSeCBEYXRhIEZpbHRlciBTdGF0aXN0aWNzIGNvbW1hbmQiKTsKICAgICAgICByZXQgPSBUSV9HZXRSeERhdGFGaWx0ZXJzU3RhdGlzdGljcyggbXlEcnYtPmhEcml2ZXIsICZzdGF0cyApOwogICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIlJ4RmlsdGVyU3RhdDogJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5Vbm1hdGNoZWRQYWNrZXRzQ291bnQpOwogICAgICAgICAgICBmb3IoaT0wOyggaSA8IE1BWF9OVU1fREFUQV9GSUxURVJTICk7aSsrKSB7CiAgICAgICAgICAgICAgICByZXQgKz0gc25wcmludGYoJmJ1ZltyZXRdLCBidWZfbGVuLXJldCwgIiAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLk1hdGNoZWRQYWNrZXRzQ291bnRbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCArPSBzbnByaW50ZigmYnVmW3JldF0sIGJ1Zl9sZW4tcmV0LCAiXG4iKTsKICAgICAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cm5jYXNlY21wKGNtZCwgInJ4ZmlsdGVyLWFkZCIsIDEyKSA9PSAwICkgewogICAgICAgIFRJV0xBTl9EQVRBX0ZJTFRFUl9SRVFVRVNUIGRmcmVxOwogICAgICAgIGNoYXIgKmNwID0gY21kICsgMTI7CiAgICAgICAgY2hhciAqZW5kcDsKICAgICAgICBpbnQgdHlwZTsKCiAgICAgICAgaWYgKCpjcCAhPSAnXDAnKSB7CiAgICAgICAgICAgIHR5cGUgPSAoaW50KXN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlJ4IERhdGEgRmlsdGVyIEFkZCBbJWRdIGNvbW1hbmQiLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldCA9IHByZXBhcmVfZmlsdGVyX3N0cnVjdCggcHJpdiwgdHlwZSwgJmRmcmVxICk7CiAgICAgICAgICAgICAgICBpZiggcmV0ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gVElfQWRkUnhEYXRhRmlsdGVyKCBteURydi0+aERyaXZlciwgJmRmcmVxICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJyeGZpbHRlci1yZW1vdmUiLDE1KSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJSeCBEYXRhIEZpbHRlciBSZW1vdmUgY29tbWFuZCIpOwogICAgICAgIFRJV0xBTl9EQVRBX0ZJTFRFUl9SRVFVRVNUIGRmcmVxOwogICAgICAgIGNoYXIgKmNwID0gY21kICsgMTU7CiAgICAgICAgY2hhciAqZW5kcDsKICAgICAgICBpbnQgdHlwZTsKCiAgICAgICAgaWYgKCpjcCAhPSAnXDAnKSB7CiAgICAgICAgICAgIHR5cGUgPSAoaW50KXN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlJ4IERhdGEgRmlsdGVyIFJlbW92ZSBbJWRdIGNvbW1hbmQiLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldCA9IHByZXBhcmVfZmlsdGVyX3N0cnVjdCggcHJpdiwgdHlwZSwgJmRmcmVxICk7CiAgICAgICAgICAgICAgICBpZiggcmV0ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gVElfUmVtb3ZlUnhEYXRhRmlsdGVyKCBteURydi0+aERyaXZlciwgJmRmcmVxICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInNuciIpID09IDAgKSB7CiAgICAgICAgdTMyIHNucjsKCiAgICAgICAgcmV0ID0gVElfR2V0U05SKCBteURydi0+aERyaXZlciwgJnNuciApOwogICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgInNuciA9ICV1XG4iLCBzbnIpOwogICAgICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiggb3Nfc3RybmNhc2VjbXAoY21kLCAiYnRjb2V4bW9kZSIsIDEwKSA9PSAwICkgewogICAgICAgIHUzMiBtb2RlOwogICAgICAgIGNoYXIgKmNwID0gY21kICsgMTA7CiAgICAgICAgY2hhciAqZW5kcDsKCiAgICAgICAgaWYgKCpjcCAhPSAnXDAnKSB7CiAgICAgICAgICAgIG1vZGUgPSAodTMyKXN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIkJ0Q29leCBNb2RlIGNvbW1hbmQgPSAldSIsIG1vZGUpOwogICAgICAgICAgICAgICAgcmV0ID0gVElfU2V0QnRDb2VFbmFibGUoIG15RHJ2LT5oRHJpdmVyLCBtb2RlICk7CiAgICAgICAgICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICAgICAgICAgIG15RHJ2LT5idGNvZXhfbW9kZSA9IG1vZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgImJ0Y29leHN0YXQiKSA9PSAwICkgewogICAgICAgIHUzMiBzdGF0dXMgPSBteURydi0+YnRjb2V4X21vZGU7CgogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJCdENvZXggU3RhdHVzIik7CiAgICAgICAgcmV0ID0gVElfU2V0QnRDb2VHZXRTdGF0dXMoIG15RHJ2LT5oRHJpdmVyLCAodGlVSU5UMzIgKikmc3RhdHVzICk7CiAgICAgICAgaWYoIHJldCA9PSBPSyApIHsKICAgICAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBidWZfbGVuLCAiYnRjb2V4c3RhdHVzID0gMHgleFxuIiwgc3RhdHVzKTsKICAgICAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KI2VuZGlmCiAgICBlbHNlIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVW5zdXBwb3J0ZWQgY29tbWFuZCIpOwogICAgfQogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyogRmlsbCBkcml2ZXJfb3BzIHN0cnVjdHVyZSB0byBwcm92aWRlIHdwYV9zdXBwbGljYW50IGNvcmUgd2l0aCB3cmFwcGVyIHJvdXRpbmVzICovCnN0cnVjdCB3cGFfZHJpdmVyX29wcyB3cGFfZHJpdmVyX2N1c3RvbV9vcHMgPSB7CiAgICAubmFtZSAgICAgICAgICAgPSBUSVdMQU5fRFJWX05BTUUsCiAgICAuZGVzYyAgICAgICAgICAgPSAiVEkgU3RhdGlvbiBEcml2ZXIiLAogICAgLmluaXQgICAgICAgICAgID0gd3BhX2RyaXZlcl90aXN0YV9pbml0LAogICAgLmRlaW5pdCAgICAgICAgID0gd3BhX2RyaXZlcl90aXN0YV91bmxvYWQsCiAgICAuZ2V0X2Jzc2lkICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX2dldF9ic3NpZCwKICAgIC5nZXRfc3NpZCAgICAgICA9IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X3NzaWQsCiAgICAuc2V0X3dwYSAgICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGEsCiAgICAuc2V0X2tleSAgICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3NldF9rZXksCiAgICAuc2V0X3BhcmFtICAgICAgPSBOVUxMLAogICAgLnNldF9jb3VudGVybWVhc3VyZXMgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3NldF9jb3VudGVybWVhc3VyZXMsCiAgICAuc2V0X2Ryb3BfdW5lbmNyeXB0ZWQgICA9IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2Ryb3BfdW5lbmNyeXB0ZWQsCiAgICAuc2NhbiAgICAgICAgICAgICAgICAgICA9IHdwYV9kcml2ZXJfdGlzdGFfc2NhbiwKICAgIC5nZXRfc2Nhbl9yZXN1bHRzICAgICAgID0gd3BhX2RyaXZlcl90aXN0YV9nZXRfc2Nhbl9yZXN1bHRzLAogICAgLmRlYXV0aGVudGljYXRlID0gd3BhX2RyaXZlcl90aXN0YV9kZWF1dGhlbnRpY2F0ZSwKICAgIC5kaXNhc3NvY2lhdGUgICA9IHdwYV9kcml2ZXJfdGlzdGFfZGlzYXNzb2NpYXRlLAogICAgLmFzc29jaWF0ZSAgICAgID0gd3BhX2RyaXZlcl90aXN0YV9hc3NvY2lhdGUsCiAgICAuc2V0X2F1dGhfYWxnICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3NldF9hdXRoX2FsZywKICAgIC5nZXRfbWFjX2FkZHIgICA9IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X21hY19hZGRyLAogICAgLnNlbmRfZWFwb2wgICAgID0gdGlfc2VuZF9lYXBvbCwKICAgIC5hZGRfcG1raWQgICAgICA9IE5VTEwsCiAgICAucmVtb3ZlX3Bta2lkICAgPSBOVUxMLAogICAgLmZsdXNoX3Bta2lkICAgID0gTlVMTCwKICAgIC5nZXRfY2FwYSAgICAgICA9IE5VTEwsCiAgICAucG9sbCAgICAgICAgICAgPSBOVUxMLAogICAgLmdldF9pZm5hbWUgICAgID0gTlVMTCwgLyogTm90IG5lc2Vzc2FyeSAqLwogICAgLnNldF9vcGVyc3RhdGUgID0gTlVMTCwKI2lmZGVmIENPTkZJR19DTElFTlRfTUxNRQogICAgLmdldF9od19tb2RlcyAgID0gTlVMTCwKICAgIC5zZXRfY2hhbm5lbCAgICA9IE5VTEwsCiAgICAuc2V0X3NzaWQgICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3NldF9zc2lkLAogICAgLnNldF9ic3NpZCAgICAgID0gTlVMTCwKICAgIC5zZW5kX21sbWUgICAgICA9IE5VTEwsCiAgICAubWxtZV9hZGRfc3RhICAgPSBOVUxMLAogICAgLm1sbWVfcmVtb3ZlX3N0YSAgICA9IE5VTEwsCiAgICAubWxtZV9zZXRwcm90ZWN0aW9uID0gTlVMTCwKI2VuZGlmIC8qIENPTkZJR19DTElFTlRfTUxNRSAqLwogICAgLmRyaXZlcl9jbWQgICAgID0gd3BhX2RyaXZlcl90aXN0YV9kcml2ZXJfY21kCn07Cg==