LyoKICogIGkyYy1hbGdvLXBjYS5jIGkyYyBkcml2ZXIgYWxnb3JpdGhtcyBmb3IgUENBOTU2NCBhZGFwdGVycyAgICAgICAgICAgICAgICAKICogICAgQ29weXJpZ2h0IChDKSAyMDA0IEFyY29tIENvbnRyb2wgU3lzdGVtcwogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1wY2EuaD4KI2luY2x1ZGUgImkyYy1hbGdvLXBjYS5oIgoKI2RlZmluZSBEUklWRVIgImkyYy1hbGdvLXBjYSIKCiNkZWZpbmUgREVCMShmbXQsIGFyZ3MuLi4pIGRvIHsgaWYgKGkyY19kZWJ1Zz49MSkgcHJpbnRrKGZtdCwgIyMgYXJncyk7IH0gd2hpbGUoMCkKI2RlZmluZSBERUIyKGZtdCwgYXJncy4uLikgZG8geyBpZiAoaTJjX2RlYnVnPj0yKSBwcmludGsoZm10LCAjIyBhcmdzKTsgfSB3aGlsZSgwKQojZGVmaW5lIERFQjMoZm10LCBhcmdzLi4uKSBkbyB7IGlmIChpMmNfZGVidWc+PTMpIHByaW50ayhmbXQsICMjIGFyZ3MpOyB9IHdoaWxlKDApCgpzdGF0aWMgaW50IGkyY19kZWJ1Zz0wOwoKI2RlZmluZSBwY2Ffb3V0dyhhZGFwLCByZWcsIHZhbCkgYWRhcC0+d3JpdGVfYnl0ZShhZGFwLCByZWcsIHZhbCkKI2RlZmluZSBwY2FfaW53KGFkYXAsIHJlZykgYWRhcC0+cmVhZF9ieXRlKGFkYXAsIHJlZykKCiNkZWZpbmUgcGNhX3N0YXR1cyhhZGFwKSBwY2FfaW53KGFkYXAsIEkyQ19QQ0FfU1RBKQojZGVmaW5lIHBjYV9jbG9jayhhZGFwKSBhZGFwLT5nZXRfY2xvY2soYWRhcCkKI2RlZmluZSBwY2Ffb3duKGFkYXApIGFkYXAtPmdldF9vd24oYWRhcCkKI2RlZmluZSBwY2Ffc2V0X2NvbihhZGFwLCB2YWwpIHBjYV9vdXR3KGFkYXAsIEkyQ19QQ0FfQ09OLCB2YWwpCiNkZWZpbmUgcGNhX2dldF9jb24oYWRhcCkgcGNhX2ludyhhZGFwLCBJMkNfUENBX0NPTikKI2RlZmluZSBwY2Ffd2FpdChhZGFwKSBhZGFwLT53YWl0X2Zvcl9pbnRlcnJ1cHQoYWRhcCkKCi8qCiAqIEdlbmVyYXRlIGEgc3RhcnQgY29uZGl0aW9uIG9uIHRoZSBpMmMgYnVzLgogKgogKiByZXR1cm5zIGFmdGVyIHRoZSBzdGFydCBjb25kaXRpb24gaGFzIG9jY3VycmVkCiAqLwpzdGF0aWMgdm9pZCBwY2Ffc3RhcnQoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQp7CglpbnQgc3RhID0gcGNhX2dldF9jb24oYWRhcCk7CglERUIyKCI9PT0gU1RBUlRcbiIpOwoJc3RhIHw9IEkyQ19QQ0FfQ09OX1NUQTsKCXN0YSAmPSB+KEkyQ19QQ0FfQ09OX1NUT3xJMkNfUENBX0NPTl9TSSk7CglwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOwoJcGNhX3dhaXQoYWRhcCk7Cn0KCi8qCiAqIEdlbmVyYXRlIGEgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIG9uIHRoZSBpMmMgYnVzCiAqCiAqIHJldHVybiBhZnRlciB0aGUgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIGhhcyBvY2N1cnJlZAogKi8Kc3RhdGljIHZvaWQgcGNhX3JlcGVhdGVkX3N0YXJ0KHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCkKewoJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOwoJREVCMigiPT09IFJFUEVBVEVEIFNUQVJUXG4iKTsKCXN0YSB8PSBJMkNfUENBX0NPTl9TVEE7CglzdGEgJj0gfihJMkNfUENBX0NPTl9TVE98STJDX1BDQV9DT05fU0kpOwoJcGNhX3NldF9jb24oYWRhcCwgc3RhKTsKCXBjYV93YWl0KGFkYXApOwp9CgovKgogKiBHZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIG9uIHRoZSBpMmMgYnVzCiAqCiAqIHJldHVybnMgYWZ0ZXIgdGhlIHN0b3AgY29uZGl0aW9uIGhhcyBiZWVuIGdlbmVyYXRlZAogKgogKiBTVE9QcyBkbyBub3QgZ2VuZXJhdGUgYW4gaW50ZXJydXB0IG9yIHNldCB0aGUgU0kgZmxhZywgc2luY2UgdGhlCiAqIHBhcnQgcmV0dXJucyB0aGUgaWRsZSBzdGF0ZSAoMHhmOCkuIEhlbmNlIHdlIGRvbid0IG5lZWQgdG8KICogcGNhX3dhaXQgaGVyZS4KICovCnN0YXRpYyB2b2lkIHBjYV9zdG9wKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCkKewoJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOwoJREVCMigiPT09IFNUT1BcbiIpOwoJc3RhIHw9IEkyQ19QQ0FfQ09OX1NUTzsKCXN0YSAmPSB+KEkyQ19QQ0FfQ09OX1NUQXxJMkNfUENBX0NPTl9TSSk7CglwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOwp9CgovKgogKiBTZW5kIHRoZSBzbGF2ZSBhZGRyZXNzIGFuZCBSL1cgYml0CiAqCiAqIHJldHVybnMgYWZ0ZXIgdGhlIGFkZHJlc3MgaGFzIGJlZW4gc2VudAogKi8Kc3RhdGljIHZvaWQgcGNhX2FkZHJlc3Moc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwLCAKCQkJc3RydWN0IGkyY19tc2cgKm1zZykKewoJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOwoJaW50IGFkZHI7CgoJYWRkciA9ICggKDB4N2YgJiBtc2ctPmFkZHIpIDw8IDEgKTsKCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkQgKQoJCWFkZHIgfD0gMTsKCURFQjIoIj09PSBTTEFWRSBBRERSRVNTICUjMDR4KyVjPSUjMDR4XG4iLCAKCSAgICAgbXNnLT5hZGRyLCBtc2ctPmZsYWdzICYgSTJDX01fUkQgPyAnUicgOiAnVycsIGFkZHIpOwoJCglwY2Ffb3V0dyhhZGFwLCBJMkNfUENBX0RBVCwgYWRkcik7CgoJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RPfEkyQ19QQ0FfQ09OX1NUQXxJMkNfUENBX0NPTl9TSSk7CglwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOwoKCXBjYV93YWl0KGFkYXApOwp9CgovKgogKiBUcmFuc21pdCBhIGJ5dGUuCiAqCiAqIFJldHVybnMgYWZ0ZXIgdGhlIGJ5dGUgaGFzIGJlZW4gdHJhbnNtaXR0ZWQKICovCnN0YXRpYyB2b2lkIHBjYV90eF9ieXRlKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCwgCgkJCV9fdTggYikKewoJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOwoJREVCMigiPT09IFdSSVRFICUjMDR4XG4iLCBiKTsKCXBjYV9vdXR3KGFkYXAsIEkyQ19QQ0FfREFULCBiKTsKCglzdGEgJj0gfihJMkNfUENBX0NPTl9TVE98STJDX1BDQV9DT05fU1RBfEkyQ19QQ0FfQ09OX1NJKTsKCXBjYV9zZXRfY29uKGFkYXAsIHN0YSk7CgoJcGNhX3dhaXQoYWRhcCk7Cn0KCi8qCiAqIFJlY2VpdmUgYSBieXRlCiAqCiAqIHJldHVybnMgaW1tZWRpYXRlbHkuCiAqLwpzdGF0aWMgdm9pZCBwY2FfcnhfYnl0ZShzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXAsIAoJCQlfX3U4ICpiLCBpbnQgYWNrKQp7CgkqYiA9IHBjYV9pbncoYWRhcCwgSTJDX1BDQV9EQVQpOwoJREVCMigiPT09IFJFQUQgJSMwNHggJXNcbiIsICpiLCBhY2sgPyAiQUNLIiA6ICJOQUNLIik7Cn0KCi8qIAogKiBTZXR1cCBBQ0sgb3IgTkFDSyBmb3IgbmV4dCByZWNlaXZlZCBieXRlIGFuZCB3YWl0IGZvciBpdCB0byBhcnJpdmUuCiAqCiAqIFJldHVybnMgYWZ0ZXIgbmV4dCBieXRlIGhhcyBhcnJpdmVkLgogKi8Kc3RhdGljIHZvaWQgcGNhX3J4X2FjayhzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXAsIAoJCSAgICAgICBpbnQgYWNrKQp7CglpbnQgc3RhID0gcGNhX2dldF9jb24oYWRhcCk7CgoJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RPfEkyQ19QQ0FfQ09OX1NUQXxJMkNfUENBX0NPTl9TSXxJMkNfUENBX0NPTl9BQSk7CgoJaWYgKCBhY2sgKQoJCXN0YSB8PSBJMkNfUENBX0NPTl9BQTsKCglwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOwoJcGNhX3dhaXQoYWRhcCk7Cn0KCi8qIAogKiBSZXNldCB0aGUgaTJjIGJ1cyAvIFNJTyAKICovCnN0YXRpYyB2b2lkIHBjYV9yZXNldChzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXApCnsKCS8qIGFwcGFyZW50bHkgb25seSBhbiBleHRlcm5hbCByZXNldCB3aWxsIGRvIGl0LiBub3QgYSBsb3QgY2FuIGJlIGRvbmUgKi8KCXByaW50ayhLRVJOX0VSUiBEUklWRVIgIjogSGF2ZW4ndCBmaWd1cmVkIG91dCBob3cgdG8gZG8gYSByZXNldCB5ZXRcbiIpOwp9CgpzdGF0aWMgaW50IHBjYV94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGkyY19tc2cgKm1zZ3MsCiAgICAgICAgICAgICAgICAgICAgaW50IG51bSkKewogICAgICAgIHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CiAgICAgICAgc3RydWN0IGkyY19tc2cgKm1zZyA9IE5VTEw7CiAgICAgICAgaW50IGN1cm1zZzsKCWludCBudW1ieXRlcyA9IDA7CglpbnQgc3RhdGU7CglpbnQgcmV0OwoJaW50IHRpbWVvdXQgPSAxMDA7CgoJd2hpbGUgKChzdGF0ZSA9IHBjYV9zdGF0dXMoYWRhcCkpICE9IDB4ZjggJiYgdGltZW91dC0tKSB7CgkJbXNsZWVwKDEwKTsKCX0KCWlmIChzdGF0ZSAhPSAweGY4KSB7CgkJZGV2X2RiZygmaTJjX2FkYXAtPmRldiwgImJ1cyBpcyBub3QgaWRsZS4gc3RhdHVzIGlzICUjMDR4XG4iLCBzdGF0ZSk7CgkJcmV0dXJuIC1FSU87Cgl9CgoJREVCMSgie3t7IFhGRVIgJWQgbWVzc2FnZXNcbiIsIG51bSk7CgoJaWYgKGkyY19kZWJ1Zz49MikgewoJCWZvciAoY3VybXNnID0gMDsgY3VybXNnIDwgbnVtOyBjdXJtc2crKykgewoJCQlpbnQgYWRkciwgaTsKCQkJbXNnID0gJm1zZ3NbY3VybXNnXTsKCQkJCgkJCWFkZHIgPSAoMHg3ZiAmIG1zZy0+YWRkcikgOwoJCQoJCQlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JEICkKCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICBbJTAyZF0gUkQgJWQgYnl0ZXMgZnJvbSAlIzAyeCBbJSMwMngsIC4uLl1cbiIsIAoJCQkJICAgICAgIGN1cm1zZywgbXNnLT5sZW4sIGFkZHIsIChhZGRyPDwxKSB8IDEpOwoJCQllbHNlIHsKCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICBbJTAyZF0gV1IgJWQgYnl0ZXMgdG8gJSMwMnggWyUjMDJ4JXMiLCAKCQkJCSAgICAgICBjdXJtc2csIG1zZy0+bGVuLCBhZGRyLCBhZGRyPDwxLAoJCQkJICAgICAgIG1zZy0+bGVuID09IDAgPyAiIiA6ICIsICIpOwoJCQkJZm9yKGk9MDsgaSA8IG1zZy0+bGVuOyBpKyspCgkJCQkJcHJpbnRrKCIlIzA0eCVzIiwgbXNnLT5idWZbaV0sIGkgPT0gbXNnLT5sZW4gLSAxID8gIiIgOiAiLCAiKTsKCQkJCXByaW50aygiXVxuIik7CgkJCX0KCQl9Cgl9CgoJY3VybXNnID0gMDsKCXJldCA9IC1FUkVNT1RFSU87Cgl3aGlsZSAoY3VybXNnIDwgbnVtKSB7CgkJc3RhdGUgPSBwY2Ffc3RhdHVzKGFkYXApOwoKCQlERUIzKCJTVEFURSBpcyAweCUwMnhcbiIsIHN0YXRlKTsKCQltc2cgPSAmbXNnc1tjdXJtc2ddOwoKCQlzd2l0Y2ggKHN0YXRlKSB7CgkJY2FzZSAweGY4OiAvKiBPbiByZXNldCBvciBzdG9wIHRoZSBidXMgaXMgaWRsZSAqLwoJCQlwY2Ffc3RhcnQoYWRhcCk7CgkJCWJyZWFrOwoKCQljYXNlIDB4MDg6IC8qIEEgU1RBUlQgY29uZGl0aW9uIGhhcyBiZWVuIHRyYW5zbWl0dGVkICovCgkJY2FzZSAweDEwOiAvKiBBIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiBoYXMgYmVlbiB0cmFuc21pdHRlZCAqLwoJCQlwY2FfYWRkcmVzcyhhZGFwLCBtc2cpOwoJCQlicmVhazsKCQkJCgkJY2FzZSAweDE4OiAvKiBTTEErVyBoYXMgYmVlbiB0cmFuc21pdHRlZDsgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCgkJY2FzZSAweDI4OiAvKiBEYXRhIGJ5dGUgaW4gSTJDREFUIGhhcyBiZWVuIHRyYW5zbWl0dGVkOyBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KCQkJaWYgKG51bWJ5dGVzIDwgbXNnLT5sZW4pIHsKCQkJCXBjYV90eF9ieXRlKGFkYXAsIG1zZy0+YnVmW251bWJ5dGVzXSk7CgkJCQludW1ieXRlcysrOwoJCQkJYnJlYWs7CgkJCX0KCQkJY3VybXNnKys7IG51bWJ5dGVzID0gMDsKCQkJaWYgKGN1cm1zZyA9PSBudW0pCgkJCQlwY2Ffc3RvcChhZGFwKTsKCQkJZWxzZQoJCQkJcGNhX3JlcGVhdGVkX3N0YXJ0KGFkYXApOwoJCQlicmVhazsKCgkJY2FzZSAweDIwOiAvKiBTTEErVyBoYXMgYmVlbiB0cmFuc21pdHRlZDsgTk9UIEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLwoJCQlERUIyKCJOT1QgQUNLIHJlY2VpdmVkIGFmdGVyIFNMQStXXG4iKTsKCQkJcGNhX3N0b3AoYWRhcCk7CgkJCWdvdG8gb3V0OwoKCQljYXNlIDB4NDA6IC8qIFNMQStSIGhhcyBiZWVuIHRyYW5zbWl0dGVkOyBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KCQkJcGNhX3J4X2FjayhhZGFwLCBtc2ctPmxlbiA+IDEpOwoJCQlicmVhazsKCgkJY2FzZSAweDUwOiAvKiBEYXRhIGJ5dGVzIGhhcyBiZWVuIHJlY2VpdmVkOyBBQ0sgaGFzIGJlZW4gcmV0dXJuZWQgKi8KCQkJaWYgKG51bWJ5dGVzIDwgbXNnLT5sZW4pIHsKCQkJCXBjYV9yeF9ieXRlKGFkYXAsICZtc2ctPmJ1ZltudW1ieXRlc10sIDEpOwoJCQkJbnVtYnl0ZXMrKzsKCQkJCXBjYV9yeF9hY2soYWRhcCwgbnVtYnl0ZXMgPCBtc2ctPmxlbiAtIDEpOwoJCQkJYnJlYWs7CgkJCX0KCQkJY3VybXNnKys7IG51bWJ5dGVzID0gMDsKCQkJaWYgKGN1cm1zZyA9PSBudW0pCgkJCQlwY2Ffc3RvcChhZGFwKTsKCQkJZWxzZQoJCQkJcGNhX3JlcGVhdGVkX3N0YXJ0KGFkYXApOwoJCQlicmVhazsKCgkJY2FzZSAweDQ4OiAvKiBTTEErUiBoYXMgYmVlbiB0cmFuc21pdHRlZDsgTk9UIEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLwoJCQlERUIyKCJOT1QgQUNLIHJlY2VpdmVkIGFmdGVyIFNMQStSXG4iKTsKCQkJcGNhX3N0b3AoYWRhcCk7CgkJCWdvdG8gb3V0OwoKCQljYXNlIDB4MzA6IC8qIERhdGEgYnl0ZSBpbiBJMkNEQVQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IE5PVCBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KCQkJREVCMigiTk9UIEFDSyByZWNlaXZlZCBhZnRlciBkYXRhIGJ5dGVcbiIpOwoJCQlnb3RvIG91dDsKCgkJY2FzZSAweDM4OiAvKiBBcmJpdHJhdGlvbiBsb3N0IGR1cmluZyBTTEErVywgU0xBK1Igb3IgZGF0YSBieXRlcyAqLwoJCQlERUIyKCJBcmJpdHJhdGlvbiBsb3N0XG4iKTsKCQkJZ290byBvdXQ7CgkJCQoJCWNhc2UgMHg1ODogLyogRGF0YSBieXRlIGhhcyBiZWVuIHJlY2VpdmVkOyBOT1QgQUNLIGhhcyBiZWVuIHJldHVybmVkICovCgkJCWlmICggbnVtYnl0ZXMgPT0gbXNnLT5sZW4gLSAxICkgewoJCQkJcGNhX3J4X2J5dGUoYWRhcCwgJm1zZy0+YnVmW251bWJ5dGVzXSwgMCk7CgkJCQljdXJtc2crKzsgbnVtYnl0ZXMgPSAwOwoJCQkJaWYgKGN1cm1zZyA9PSBudW0pCgkJCQkJcGNhX3N0b3AoYWRhcCk7CgkJCQllbHNlCgkJCQkJcGNhX3JlcGVhdGVkX3N0YXJ0KGFkYXApOwoJCQl9IGVsc2UgewoJCQkJREVCMigiTk9UIEFDSyBzZW50IGFmdGVyIGRhdGEgYnl0ZSByZWNlaXZlZC4gIgoJCQkJICAgICAiTm90IGZpbmFsIGJ5dGUuIG51bWJ5dGVzICVkLiBsZW4gJWRcbiIsCgkJCQkgICAgIG51bWJ5dGVzLCBtc2ctPmxlbik7CgkJCQlwY2Ffc3RvcChhZGFwKTsKCQkJCWdvdG8gb3V0OwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgMHg3MDogLyogQnVzIGVycm9yIC0gU0RBIHN0dWNrIGxvdyAqLwoJCQlERUIyKCJCVVMgRVJST1IgLSBTREEgU3R1Y2sgbG93XG4iKTsKCQkJcGNhX3Jlc2V0KGFkYXApOwoJCQlnb3RvIG91dDsKCQljYXNlIDB4OTA6IC8qIEJ1cyBlcnJvciAtIFNDTCBzdHVjayBsb3cgKi8KCQkJREVCMigiQlVTIEVSUk9SIC0gU0NMIFN0dWNrIGxvd1xuIik7CgkJCXBjYV9yZXNldChhZGFwKTsKCQkJZ290byBvdXQ7CgkJY2FzZSAweDAwOiAvKiBCdXMgZXJyb3IgZHVyaW5nIG1hc3RlciBvciBzbGF2ZSBtb2RlIGR1ZSB0byBpbGxlZ2FsIFNUQVJUIG9yIFNUT1AgY29uZGl0aW9uICovCgkJCURFQjIoIkJVUyBFUlJPUiAtIElsbGVnYWwgU1RBUlQgb3IgU1RPUFxuIik7CgkJCXBjYV9yZXNldChhZGFwKTsKCQkJZ290byBvdXQ7CgkJZGVmYXVsdDoKCQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUiAiOiB1bmhhbmRsZWQgU0lPIHN0YXRlIDB4JTAyeFxuIiwgc3RhdGUpOwoJCQlicmVhazsKCQl9CgkJCgl9CgoJcmV0ID0gY3VybXNnOwogb3V0OgoJREVCMShLRVJOX0NSSVQgIn19fSB0cmFuc2ZlcmVkICVkLyVkIG1lc3NhZ2VzLiAiCgkgICAgICJzdGF0dXMgaXMgJSMwNHguIGNvbnRyb2wgaXMgJSMwNHhcbiIsIAoJICAgICBjdXJtc2csIG51bSwgcGNhX3N0YXR1cyhhZGFwKSwKCSAgICAgcGNhX2dldF9jb24oYWRhcCkpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHUzMiBwY2FfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKICAgICAgICByZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTDsKfQoKc3RhdGljIGludCBwY2FfaW5pdChzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXApCnsKCXN0YXRpYyBpbnQgZnJlcXNbXSA9IHszMzAsMjg4LDIxNywxNDYsODgsNTksNDQsMzZ9OwoJaW50IG93biwgY2xvY2s7CgoJb3duID0gcGNhX293bihhZGFwKTsKCWNsb2NrID0gcGNhX2Nsb2NrKGFkYXApOwoJREVCMShLRVJOX0lORk8gRFJJVkVSICI6IG93biBhZGRyZXNzIGlzICUjMDR4XG4iLCBvd24pOwoJREVCMShLRVJOX0lORk8gRFJJVkVSICI6IGNsb2NrIGZyZXFldW5jeSBpcyAlZGtIelxuIiwgZnJlcXNbY2xvY2tdKTsKCglwY2Ffb3V0dyhhZGFwLCBJMkNfUENBX0FEUiwgb3duIDw8IDEpOwoKCXBjYV9zZXRfY29uKGFkYXAsIEkyQ19QQ0FfQ09OX0VOU0lPIHwgY2xvY2spOwoJdWRlbGF5KDUwMCk7IC8qIDUwMCC1cyBmb3Igb3NjaWxhdG9yIHRvIHN0YWJpbGlzZSAqLwoKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gcGNhX2FsZ28gPSB7CgkubWFzdGVyX3hmZXIJPSBwY2FfeGZlciwKCS5mdW5jdGlvbmFsaXR5CT0gcGNhX2Z1bmMsCn07CgovKiAKICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAogKi8KaW50IGkyY19wY2FfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqcGNhX2FkYXAgPSBhZGFwLT5hbGdvX2RhdGE7CglpbnQgcnZhbDsKCgkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCglhZGFwLT5hbGdvID0gJnBjYV9hbGdvOwoKCWFkYXAtPnRpbWVvdXQgPSAxMDA7CQkvKiBkZWZhdWx0IHZhbHVlcywgc2hvdWxkCSovCglhZGFwLT5yZXRyaWVzID0gMzsJCS8qIGJlIHJlcGxhY2VkIGJ5IGRlZmluZXMJKi8KCglydmFsID0gcGNhX2luaXQocGNhX2FkYXApOwoKCWlmICghcnZhbCkKCQlpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7CgoJcmV0dXJuIHJ2YWw7Cn0KCmludCBpMmNfcGNhX2RlbF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglyZXR1cm4gaTJjX2RlbF9hZGFwdGVyKGFkYXApOwp9CgpFWFBPUlRfU1lNQk9MKGkyY19wY2FfYWRkX2J1cyk7CkVYUE9SVF9TWU1CT0woaTJjX3BjYV9kZWxfYnVzKTsKCk1PRFVMRV9BVVRIT1IoIklhbiBDYW1wYmVsbCA8aWNhbXBiZWxsQGFyY29tLmNvbT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMtQnVzIFBDQTk1NjQgYWxnb3JpdGhtIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9wYXJhbShpMmNfZGVidWcsIGludCwgMCk7Cg==