LyoKICogIGkyYy1hbGdvLXBjYS5jIGkyYyBkcml2ZXIgYWxnb3JpdGhtcyBmb3IgUENBOTU2NCBhZGFwdGVycyAgICAgICAgICAgICAgICAKICogICAgQ29weXJpZ2h0IChDKSAyMDA0IEFyY29tIENvbnRyb2wgU3lzdGVtcwogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1wY2EuaD4KI2luY2x1ZGUgImkyYy1hbGdvLXBjYS5oIgoKI2RlZmluZSBEUklWRVIgImkyYy1hbGdvLXBjYSIKCiNkZWZpbmUgREVCMShmbXQsIGFyZ3MuLi4pIGRvIHsgaWYgKGkyY19kZWJ1Zz49MSkgcHJpbnRrKGZtdCwgIyMgYXJncyk7IH0gd2hpbGUoMCkKI2RlZmluZSBERUIyKGZtdCwgYXJncy4uLikgZG8geyBpZiAoaTJjX2RlYnVnPj0yKSBwcmludGsoZm10LCAjIyBhcmdzKTsgfSB3aGlsZSgwKQojZGVmaW5lIERFQjMoZm10LCBhcmdzLi4uKSBkbyB7IGlmIChpMmNfZGVidWc+PTMpIHByaW50ayhmbXQsICMjIGFyZ3MpOyB9IHdoaWxlKDApCgpzdGF0aWMgaW50IGkyY19kZWJ1Zz0wOwoKI2RlZmluZSBwY2Ffb3V0dyhhZGFwLCByZWcsIHZhbCkgYWRhcC0+d3JpdGVfYnl0ZShhZGFwLCByZWcsIHZhbCkKI2RlZmluZSBwY2FfaW53KGFkYXAsIHJlZykgYWRhcC0+cmVhZF9ieXRlKGFkYXAsIHJlZykKCiNkZWZpbmUgcGNhX3N0YXR1cyhhZGFwKSBwY2FfaW53KGFkYXAsIEkyQ19QQ0FfU1RBKQojZGVmaW5lIHBjYV9jbG9jayhhZGFwKSBhZGFwLT5nZXRfY2xvY2soYWRhcCkKI2RlZmluZSBwY2Ffb3duKGFkYXApIGFkYXAtPmdldF9vd24oYWRhcCkKI2RlZmluZSBwY2Ffc2V0X2NvbihhZGFwLCB2YWwpIHBjYV9vdXR3KGFkYXAsIEkyQ19QQ0FfQ09OLCB2YWwpCiNkZWZpbmUgcGNhX2dldF9jb24oYWRhcCkgcGNhX2ludyhhZGFwLCBJMkNfUENBX0NPTikKI2RlZmluZSBwY2Ffd2FpdChhZGFwKSBhZGFwLT53YWl0X2Zvcl9pbnRlcnJ1cHQoYWRhcCkKCi8qCiAqIEdlbmVyYXRlIGEgc3RhcnQgY29uZGl0aW9uIG9uIHRoZSBpMmMgYnVzLgogKgogKiByZXR1cm5zIGFmdGVyIHRoZSBzdGFydCBjb25kaXRpb24gaGFzIG9jY3VyZWQKICovCnN0YXRpYyB2b2lkIHBjYV9zdGFydChzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXApCnsKCWludCBzdGEgPSBwY2FfZ2V0X2NvbihhZGFwKTsKCURFQjIoIj09PSBTVEFSVFxuIik7CglzdGEgfD0gSTJDX1BDQV9DT05fU1RBOwoJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RPfEkyQ19QQ0FfQ09OX1NJKTsKCXBjYV9zZXRfY29uKGFkYXAsIHN0YSk7CglwY2Ffd2FpdChhZGFwKTsKfQoKLyoKICogR2VuZXJhdGUgYSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gb24gdGhlIGkyYyBidXMgCiAqCiAqIHJldHVybiBhZnRlciB0aGUgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIGhhcyBvY2N1cmVkCiAqLwpzdGF0aWMgdm9pZCBwY2FfcmVwZWF0ZWRfc3RhcnQoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQp7CglpbnQgc3RhID0gcGNhX2dldF9jb24oYWRhcCk7CglERUIyKCI9PT0gUkVQRUFURUQgU1RBUlRcbiIpOwoJc3RhIHw9IEkyQ19QQ0FfQ09OX1NUQTsKCXN0YSAmPSB+KEkyQ19QQ0FfQ09OX1NUT3xJMkNfUENBX0NPTl9TSSk7CglwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOwoJcGNhX3dhaXQoYWRhcCk7Cn0KCi8qCiAqIEdlbmVyYXRlIGEgc3RvcCBjb25kaXRpb24gb24gdGhlIGkyYyBidXMKICoKICogcmV0dXJucyBhZnRlciB0aGUgc3RvcCBjb25kaXRpb24gaGFzIGJlZW4gZ2VuZXJhdGVkCiAqCiAqIFNUT1BzIGRvIG5vdCBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgb3Igc2V0IHRoZSBTSSBmbGFnLCBzaW5jZSB0aGUKICogcGFydCByZXR1cm5zIHRoZSB0aGUgaWRsZSBzdGF0ZSAoMHhmOCkuIEhlbmNlIHdlIGRvbid0IG5lZWQgdG8KICogcGNhX3dhaXQgaGVyZS4KICovCnN0YXRpYyB2b2lkIHBjYV9zdG9wKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCkKewoJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOwoJREVCMigiPT09IFNUT1BcbiIpOwoJc3RhIHw9IEkyQ19QQ0FfQ09OX1NUTzsKCXN0YSAmPSB+KEkyQ19QQ0FfQ09OX1NUQXxJMkNfUENBX0NPTl9TSSk7CglwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOwp9CgovKgogKiBTZW5kIHRoZSBzbGF2ZSBhZGRyZXNzIGFuZCBSL1cgYml0CiAqCiAqIHJldHVybnMgYWZ0ZXIgdGhlIGFkZHJlc3MgaGFzIGJlZW4gc2VudAogKi8Kc3RhdGljIHZvaWQgcGNhX2FkZHJlc3Moc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwLCAKCQkJc3RydWN0IGkyY19tc2cgKm1zZykKewoJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOwoJaW50IGFkZHI7CgoJYWRkciA9ICggKDB4N2YgJiBtc2ctPmFkZHIpIDw8IDEgKTsKCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkQgKQoJCWFkZHIgfD0gMTsKCURFQjIoIj09PSBTTEFWRSBBRERSRVNTICUjMDR4KyVjPSUjMDR4XG4iLCAKCSAgICAgbXNnLT5hZGRyLCBtc2ctPmZsYWdzICYgSTJDX01fUkQgPyAnUicgOiAnVycsIGFkZHIpOwoJCglwY2Ffb3V0dyhhZGFwLCBJMkNfUENBX0RBVCwgYWRkcik7CgoJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RPfEkyQ19QQ0FfQ09OX1NUQXxJMkNfUENBX0NPTl9TSSk7CglwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOwoKCXBjYV93YWl0KGFkYXApOwp9CgovKgogKiBUcmFuc21pdCBhIGJ5dGUuCiAqCiAqIFJldHVybnMgYWZ0ZXIgdGhlIGJ5dGUgaGFzIGJlZW4gdHJhbnNtaXR0ZWQKICovCnN0YXRpYyB2b2lkIHBjYV90eF9ieXRlKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCwgCgkJCV9fdTggYikKewoJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOwoJREVCMigiPT09IFdSSVRFICUjMDR4XG4iLCBiKTsKCXBjYV9vdXR3KGFkYXAsIEkyQ19QQ0FfREFULCBiKTsKCglzdGEgJj0gfihJMkNfUENBX0NPTl9TVE98STJDX1BDQV9DT05fU1RBfEkyQ19QQ0FfQ09OX1NJKTsKCXBjYV9zZXRfY29uKGFkYXAsIHN0YSk7CgoJcGNhX3dhaXQoYWRhcCk7Cn0KCi8qCiAqIFJlY2VpdmUgYSBieXRlCiAqCiAqIHJldHVybnMgaW1tZWRpYXRlbHkuCiAqLwpzdGF0aWMgdm9pZCBwY2FfcnhfYnl0ZShzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXAsIAoJCQlfX3U4ICpiLCBpbnQgYWNrKQp7CgkqYiA9IHBjYV9pbncoYWRhcCwgSTJDX1BDQV9EQVQpOwoJREVCMigiPT09IFJFQUQgJSMwNHggJXNcbiIsICpiLCBhY2sgPyAiQUNLIiA6ICJOQUNLIik7Cn0KCi8qIAogKiBTZXR1cCBBQ0sgb3IgTkFDSyBmb3IgbmV4dCByZWNlaXZlZCBieXRlIGFuZCB3YWl0IGZvciBpdCB0byBhcnJpdmUuCiAqCiAqIFJldHVybnMgYWZ0ZXIgbmV4dCBieXRlIGhhcyBhcnJpdmVkLgogKi8Kc3RhdGljIHZvaWQgcGNhX3J4X2FjayhzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXAsIAoJCSAgICAgICBpbnQgYWNrKQp7CglpbnQgc3RhID0gcGNhX2dldF9jb24oYWRhcCk7CgoJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RPfEkyQ19QQ0FfQ09OX1NUQXxJMkNfUENBX0NPTl9TSXxJMkNfUENBX0NPTl9BQSk7CgoJaWYgKCBhY2sgKQoJCXN0YSB8PSBJMkNfUENBX0NPTl9BQTsKCglwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOwoJcGNhX3dhaXQoYWRhcCk7Cn0KCi8qIAogKiBSZXNldCB0aGUgaTJjIGJ1cyAvIFNJTyAKICovCnN0YXRpYyB2b2lkIHBjYV9yZXNldChzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXApCnsKCS8qIGFwcGFyZW50bHkgb25seSBhbiBleHRlcm5hbCByZXNldCB3aWxsIGRvIGl0LiBub3QgYSBsb3QgY2FuIGJlIGRvbmUgKi8KCXByaW50ayhLRVJOX0VSUiBEUklWRVIgIjogSGF2ZW4ndCBmaWd1cmVkIG91dCBob3cgdG8gZG8gYSByZXNldCB5ZXRcbiIpOwp9CgpzdGF0aWMgaW50IHBjYV94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGkyY19tc2cgKm1zZ3MsCiAgICAgICAgICAgICAgICAgICAgaW50IG51bSkKewogICAgICAgIHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CiAgICAgICAgc3RydWN0IGkyY19tc2cgKm1zZyA9IE5VTEw7CiAgICAgICAgaW50IGN1cm1zZzsKCWludCBudW1ieXRlcyA9IDA7CglpbnQgc3RhdGU7CglpbnQgcmV0OwoKCXN0YXRlID0gcGNhX3N0YXR1cyhhZGFwKTsKCWlmICggc3RhdGUgIT0gMHhGOCApIHsKCQlkZXZfZGJnKCZpMmNfYWRhcC0+ZGV2LCAiYnVzIGlzIG5vdCBpZGxlLiBzdGF0dXMgaXMgJSMwNHhcbiIsIHN0YXRlICk7CgkJLyogRklYTUU6IHdoYXQgdG8gZG8uIEZvcmNlIHN0b3AgPyAqLwoJCXJldHVybiAtRVJFTU9URUlPOwoJfQoKCURFQjEoInt7eyBYRkVSICVkIG1lc3NhZ2VzXG4iLCBudW0pOwoKCWlmIChpMmNfZGVidWc+PTIpIHsKCQlmb3IgKGN1cm1zZyA9IDA7IGN1cm1zZyA8IG51bTsgY3VybXNnKyspIHsKCQkJaW50IGFkZHIsIGk7CgkJCW1zZyA9ICZtc2dzW2N1cm1zZ107CgkJCQoJCQlhZGRyID0gKDB4N2YgJiBtc2ctPmFkZHIpIDsKCQkKCQkJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCApCgkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgWyUwMmRdIFJEICVkIGJ5dGVzIGZyb20gJSMwMnggWyUjMDJ4LCAuLi5dXG4iLCAKCQkJCSAgICAgICBjdXJtc2csIG1zZy0+bGVuLCBhZGRyLCAoYWRkcjw8MSkgfCAxKTsKCQkJZWxzZSB7CgkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgWyUwMmRdIFdSICVkIGJ5dGVzIHRvICUjMDJ4IFslIzAyeCVzIiwgCgkJCQkgICAgICAgY3VybXNnLCBtc2ctPmxlbiwgYWRkciwgYWRkcjw8MSwKCQkJCSAgICAgICBtc2ctPmxlbiA9PSAwID8gIiIgOiAiLCAiKTsKCQkJCWZvcihpPTA7IGkgPCBtc2ctPmxlbjsgaSsrKQoJCQkJCXByaW50aygiJSMwNHglcyIsIG1zZy0+YnVmW2ldLCBpID09IG1zZy0+bGVuIC0gMSA/ICIiIDogIiwgIik7CgkJCQlwcmludGsoIl1cbiIpOwoJCQl9CgkJfQoJfQoKCWN1cm1zZyA9IDA7CglyZXQgPSAtRVJFTU9URUlPOwoJd2hpbGUgKGN1cm1zZyA8IG51bSkgewoJCXN0YXRlID0gcGNhX3N0YXR1cyhhZGFwKTsKCgkJREVCMygiU1RBVEUgaXMgMHglMDJ4XG4iLCBzdGF0ZSk7CgkJbXNnID0gJm1zZ3NbY3VybXNnXTsKCgkJc3dpdGNoIChzdGF0ZSkgewoJCWNhc2UgMHhmODogLyogT24gcmVzZXQgb3Igc3RvcCB0aGUgYnVzIGlzIGlkbGUgKi8KCQkJcGNhX3N0YXJ0KGFkYXApOwoJCQlicmVhazsKCgkJY2FzZSAweDA4OiAvKiBBIFNUQVJUIGNvbmRpdGlvbiBoYXMgYmVlbiB0cmFuc21pdHRlZCAqLwoJCWNhc2UgMHgxMDogLyogQSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gaGFzIGJlZW4gdHJhbnNtaXR0ZWQgKi8KCQkJcGNhX2FkZHJlc3MoYWRhcCwgbXNnKTsKCQkJYnJlYWs7CgkJCQoJCWNhc2UgMHgxODogLyogU0xBK1cgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLwoJCWNhc2UgMHgyODogLyogRGF0YSBieXRlIGluIEkyQ0RBVCBoYXMgYmVlbiB0cmFuc21pdHRlZDsgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCgkJCWlmIChudW1ieXRlcyA8IG1zZy0+bGVuKSB7CgkJCQlwY2FfdHhfYnl0ZShhZGFwLCBtc2ctPmJ1ZltudW1ieXRlc10pOwoJCQkJbnVtYnl0ZXMrKzsKCQkJCWJyZWFrOwoJCQl9CgkJCWN1cm1zZysrOyBudW1ieXRlcyA9IDA7CgkJCWlmIChjdXJtc2cgPT0gbnVtKQoJCQkJcGNhX3N0b3AoYWRhcCk7CgkJCWVsc2UKCQkJCXBjYV9yZXBlYXRlZF9zdGFydChhZGFwKTsKCQkJYnJlYWs7CgoJCWNhc2UgMHgyMDogLyogU0xBK1cgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IE5PVCBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KCQkJREVCMigiTk9UIEFDSyByZWNlaXZlZCBhZnRlciBTTEErV1xuIik7CgkJCXBjYV9zdG9wKGFkYXApOwoJCQlnb3RvIG91dDsKCgkJY2FzZSAweDQwOiAvKiBTTEErUiBoYXMgYmVlbiB0cmFuc21pdHRlZDsgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCgkJCXBjYV9yeF9hY2soYWRhcCwgbXNnLT5sZW4gPiAxKTsKCQkJYnJlYWs7CgoJCWNhc2UgMHg1MDogLyogRGF0YSBieXRlcyBoYXMgYmVlbiByZWNlaXZlZDsgQUNLIGhhcyBiZWVuIHJldHVybmVkICovCgkJCWlmIChudW1ieXRlcyA8IG1zZy0+bGVuKSB7CgkJCQlwY2FfcnhfYnl0ZShhZGFwLCAmbXNnLT5idWZbbnVtYnl0ZXNdLCAxKTsKCQkJCW51bWJ5dGVzKys7CgkJCQlwY2FfcnhfYWNrKGFkYXAsIG51bWJ5dGVzIDwgbXNnLT5sZW4gLSAxKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWN1cm1zZysrOyBudW1ieXRlcyA9IDA7CgkJCWlmIChjdXJtc2cgPT0gbnVtKQoJCQkJcGNhX3N0b3AoYWRhcCk7CgkJCWVsc2UKCQkJCXBjYV9yZXBlYXRlZF9zdGFydChhZGFwKTsKCQkJYnJlYWs7CgoJCWNhc2UgMHg0ODogLyogU0xBK1IgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IE5PVCBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KCQkJREVCMigiTk9UIEFDSyByZWNlaXZlZCBhZnRlciBTTEErUlxuIik7CgkJCXBjYV9zdG9wKGFkYXApOwoJCQlnb3RvIG91dDsKCgkJY2FzZSAweDMwOiAvKiBEYXRhIGJ5dGUgaW4gSTJDREFUIGhhcyBiZWVuIHRyYW5zbWl0dGVkOyBOT1QgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCgkJCURFQjIoIk5PVCBBQ0sgcmVjZWl2ZWQgYWZ0ZXIgZGF0YSBieXRlXG4iKTsKCQkJZ290byBvdXQ7CgoJCWNhc2UgMHgzODogLyogQXJiaXRyYXRpb24gbG9zdCBkdXJpbmcgU0xBK1csIFNMQStSIG9yIGRhdGEgYnl0ZXMgKi8KCQkJREVCMigiQXJiaXRyYXRpb24gbG9zdFxuIik7CgkJCWdvdG8gb3V0OwoJCQkKCQljYXNlIDB4NTg6IC8qIERhdGEgYnl0ZSBoYXMgYmVlbiByZWNlaXZlZDsgTk9UIEFDSyBoYXMgYmVlbiByZXR1cm5lZCAqLwoJCQlpZiAoIG51bWJ5dGVzID09IG1zZy0+bGVuIC0gMSApIHsKCQkJCXBjYV9yeF9ieXRlKGFkYXAsICZtc2ctPmJ1ZltudW1ieXRlc10sIDApOwoJCQkJY3VybXNnKys7IG51bWJ5dGVzID0gMDsKCQkJCWlmIChjdXJtc2cgPT0gbnVtKQoJCQkJCXBjYV9zdG9wKGFkYXApOwoJCQkJZWxzZQoJCQkJCXBjYV9yZXBlYXRlZF9zdGFydChhZGFwKTsKCQkJfSBlbHNlIHsKCQkJCURFQjIoIk5PVCBBQ0sgc2VudCBhZnRlciBkYXRhIGJ5dGUgcmVjZWl2ZWQuICIKCQkJCSAgICAgIk5vdCBmaW5hbCBieXRlLiBudW1ieXRlcyAlZC4gbGVuICVkXG4iLAoJCQkJICAgICBudW1ieXRlcywgbXNnLT5sZW4pOwoJCQkJcGNhX3N0b3AoYWRhcCk7CgkJCQlnb3RvIG91dDsKCQkJfQoJCQlicmVhazsKCQljYXNlIDB4NzA6IC8qIEJ1cyBlcnJvciAtIFNEQSBzdHVjayBsb3cgKi8KCQkJREVCMigiQlVTIEVSUk9SIC0gU0RBIFN0dWNrIGxvd1xuIik7CgkJCXBjYV9yZXNldChhZGFwKTsKCQkJZ290byBvdXQ7CgkJY2FzZSAweDkwOiAvKiBCdXMgZXJyb3IgLSBTQ0wgc3R1Y2sgbG93ICovCgkJCURFQjIoIkJVUyBFUlJPUiAtIFNDTCBTdHVjayBsb3dcbiIpOwoJCQlwY2FfcmVzZXQoYWRhcCk7CgkJCWdvdG8gb3V0OwoJCWNhc2UgMHgwMDogLyogQnVzIGVycm9yIGR1cmluZyBtYXN0ZXIgb3Igc2xhdmUgbW9kZSBkdWUgdG8gaWxsZWdhbCBTVEFSVCBvciBTVE9QIGNvbmRpdGlvbiAqLwoJCQlERUIyKCJCVVMgRVJST1IgLSBJbGxlZ2FsIFNUQVJUIG9yIFNUT1BcbiIpOwoJCQlwY2FfcmVzZXQoYWRhcCk7CgkJCWdvdG8gb3V0OwoJCWRlZmF1bHQ6CgkJCXByaW50ayhLRVJOX0VSUiBEUklWRVIgIjogdW5oYW5kbGVkIFNJTyBzdGF0ZSAweCUwMnhcbiIsIHN0YXRlKTsKCQkJYnJlYWs7CgkJfQoJCQoJfQoKCXJldCA9IGN1cm1zZzsKIG91dDoKCURFQjEoS0VSTl9DUklUICJ9fX0gdHJhbnNmZXJlZCAlZC8lZCBtZXNzYWdlcy4gIgoJICAgICAic3RhdHVzIGlzICUjMDR4LiBjb250cm9sIGlzICUjMDR4XG4iLCAKCSAgICAgY3VybXNnLCBudW0sIHBjYV9zdGF0dXMoYWRhcCksCgkgICAgIHBjYV9nZXRfY29uKGFkYXApKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB1MzIgcGNhX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CiAgICAgICAgcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUw7Cn0KCnN0YXRpYyBpbnQgcGNhX2luaXQoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQp7CglzdGF0aWMgaW50IGZyZXFzW10gPSB7MzMwLDI4OCwyMTcsMTQ2LDg4LDU5LDQ0LDM2fTsKCWludCBvd24sIGNsb2NrOwoKCW93biA9IHBjYV9vd24oYWRhcCk7CgljbG9jayA9IHBjYV9jbG9jayhhZGFwKTsKCURFQjEoS0VSTl9JTkZPIERSSVZFUiAiOiBvd24gYWRkcmVzcyBpcyAlIzA0eFxuIiwgb3duKTsKCURFQjEoS0VSTl9JTkZPIERSSVZFUiAiOiBjbG9jayBmcmVxZXVuY3kgaXMgJWRrSHpcbiIsIGZyZXFzW2Nsb2NrXSk7CgoJcGNhX291dHcoYWRhcCwgSTJDX1BDQV9BRFIsIG93biA8PCAxKTsKCglwY2Ffc2V0X2NvbihhZGFwLCBJMkNfUENBX0NPTl9FTlNJTyB8IGNsb2NrKTsKCXVkZWxheSg1MDApOyAvKiA1MDAgtXMgZm9yIG9zY2lsYXRvciB0byBzdGFiaWxpc2UgKi8KCglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHBjYV9hbGdvID0gewoJLm5hbWUJCT0gIlBDQTk1NjQgYWxnb3JpdGhtIiwKCS5pZAkJPSBJMkNfQUxHT19QQ0EsCgkubWFzdGVyX3hmZXIJPSBwY2FfeGZlciwKCS5mdW5jdGlvbmFsaXR5CT0gcGNhX2Z1bmMsCn07CgovKiAKICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAogKi8KaW50IGkyY19wY2FfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqcGNhX2FkYXAgPSBhZGFwLT5hbGdvX2RhdGE7CglpbnQgcnZhbDsKCgkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCgoJYWRhcC0+aWQgfD0gcGNhX2FsZ28uaWQ7CglhZGFwLT5hbGdvID0gJnBjYV9hbGdvOwoKCWFkYXAtPnRpbWVvdXQgPSAxMDA7CQkvKiBkZWZhdWx0IHZhbHVlcywgc2hvdWxkCSovCglhZGFwLT5yZXRyaWVzID0gMzsJCS8qIGJlIHJlcGxhY2VkIGJ5IGRlZmluZXMJKi8KCglydmFsID0gcGNhX2luaXQocGNhX2FkYXApOwoKCWlmICghcnZhbCkKCQlpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7CgoJcmV0dXJuIHJ2YWw7Cn0KCmludCBpMmNfcGNhX2RlbF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglyZXR1cm4gaTJjX2RlbF9hZGFwdGVyKGFkYXApOwp9CgpFWFBPUlRfU1lNQk9MKGkyY19wY2FfYWRkX2J1cyk7CkVYUE9SVF9TWU1CT0woaTJjX3BjYV9kZWxfYnVzKTsKCk1PRFVMRV9BVVRIT1IoIklhbiBDYW1wYmVsbCA8aWNhbXBiZWxsQGFyY29tLmNvbT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMtQnVzIFBDQTk1NjQgYWxnb3JpdGhtIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9wYXJhbShpMmNfZGVidWcsIGludCwgMCk7Cg==