LyoKICogIGkyYy1hbGdvLXBjYS5jIGkyYyBkcml2ZXIgYWxnb3JpdGhtcyBmb3IgUENBOTU2NCBhZGFwdGVycyAgICAgICAgICAgICAgICAKICogICAgQ29weXJpZ2h0IChDKSAyMDA0IEFyY29tIENvbnRyb2wgU3lzdGVtcwogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1wY2EuaD4KI2luY2x1ZGUgImkyYy1hbGdvLXBjYS5oIgoKI2RlZmluZSBEUklWRVIgImkyYy1hbGdvLXBjYSIKCiNkZWZpbmUgREVCMShmbXQsIGFyZ3MuLi4pIGRvIHsgaWYgKGkyY19kZWJ1Zz49MSkgcHJpbnRrKGZtdCwgIyMgYXJncyk7IH0gd2hpbGUoMCkKI2RlZmluZSBERUIyKGZtdCwgYXJncy4uLikgZG8geyBpZiAoaTJjX2RlYnVnPj0yKSBwcmludGsoZm10LCAjIyBhcmdzKTsgfSB3aGlsZSgwKQojZGVmaW5lIERFQjMoZm10LCBhcmdzLi4uKSBkbyB7IGlmIChpMmNfZGVidWc+PTMpIHByaW50ayhmbXQsICMjIGFyZ3MpOyB9IHdoaWxlKDApCgpzdGF0aWMgaW50IGkyY19kZWJ1ZzsKCiNkZWZpbmUgcGNhX291dHcoYWRhcCwgcmVnLCB2YWwpIGFkYXAtPndyaXRlX2J5dGUoYWRhcCwgcmVnLCB2YWwpCiNkZWZpbmUgcGNhX2ludyhhZGFwLCByZWcpIGFkYXAtPnJlYWRfYnl0ZShhZGFwLCByZWcpCgojZGVmaW5lIHBjYV9zdGF0dXMoYWRhcCkgcGNhX2ludyhhZGFwLCBJMkNfUENBX1NUQSkKI2RlZmluZSBwY2FfY2xvY2soYWRhcCkgYWRhcC0+Z2V0X2Nsb2NrKGFkYXApCiNkZWZpbmUgcGNhX293bihhZGFwKSBhZGFwLT5nZXRfb3duKGFkYXApCiNkZWZpbmUgcGNhX3NldF9jb24oYWRhcCwgdmFsKSBwY2Ffb3V0dyhhZGFwLCBJMkNfUENBX0NPTiwgdmFsKQojZGVmaW5lIHBjYV9nZXRfY29uKGFkYXApIHBjYV9pbncoYWRhcCwgSTJDX1BDQV9DT04pCiNkZWZpbmUgcGNhX3dhaXQoYWRhcCkgYWRhcC0+d2FpdF9mb3JfaW50ZXJydXB0KGFkYXApCgovKgogKiBHZW5lcmF0ZSBhIHN0YXJ0IGNvbmRpdGlvbiBvbiB0aGUgaTJjIGJ1cy4KICoKICogcmV0dXJucyBhZnRlciB0aGUgc3RhcnQgY29uZGl0aW9uIGhhcyBvY2N1cnJlZAogKi8Kc3RhdGljIHZvaWQgcGNhX3N0YXJ0KHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCkKewoJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOwoJREVCMigiPT09IFNUQVJUXG4iKTsKCXN0YSB8PSBJMkNfUENBX0NPTl9TVEE7CglzdGEgJj0gfihJMkNfUENBX0NPTl9TVE98STJDX1BDQV9DT05fU0kpOwoJcGNhX3NldF9jb24oYWRhcCwgc3RhKTsKCXBjYV93YWl0KGFkYXApOwp9CgovKgogKiBHZW5lcmF0ZSBhIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiBvbiB0aGUgaTJjIGJ1cwogKgogKiByZXR1cm4gYWZ0ZXIgdGhlIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiBoYXMgb2NjdXJyZWQKICovCnN0YXRpYyB2b2lkIHBjYV9yZXBlYXRlZF9zdGFydChzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXApCnsKCWludCBzdGEgPSBwY2FfZ2V0X2NvbihhZGFwKTsKCURFQjIoIj09PSBSRVBFQVRFRCBTVEFSVFxuIik7CglzdGEgfD0gSTJDX1BDQV9DT05fU1RBOwoJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RPfEkyQ19QQ0FfQ09OX1NJKTsKCXBjYV9zZXRfY29uKGFkYXAsIHN0YSk7CglwY2Ffd2FpdChhZGFwKTsKfQoKLyoKICogR2VuZXJhdGUgYSBzdG9wIGNvbmRpdGlvbiBvbiB0aGUgaTJjIGJ1cwogKgogKiByZXR1cm5zIGFmdGVyIHRoZSBzdG9wIGNvbmRpdGlvbiBoYXMgYmVlbiBnZW5lcmF0ZWQKICoKICogU1RPUHMgZG8gbm90IGdlbmVyYXRlIGFuIGludGVycnVwdCBvciBzZXQgdGhlIFNJIGZsYWcsIHNpbmNlIHRoZQogKiBwYXJ0IHJldHVybnMgdGhlIGlkbGUgc3RhdGUgKDB4ZjgpLiBIZW5jZSB3ZSBkb24ndCBuZWVkIHRvCiAqIHBjYV93YWl0IGhlcmUuCiAqLwpzdGF0aWMgdm9pZCBwY2Ffc3RvcChzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXApCnsKCWludCBzdGEgPSBwY2FfZ2V0X2NvbihhZGFwKTsKCURFQjIoIj09PSBTVE9QXG4iKTsKCXN0YSB8PSBJMkNfUENBX0NPTl9TVE87CglzdGEgJj0gfihJMkNfUENBX0NPTl9TVEF8STJDX1BDQV9DT05fU0kpOwoJcGNhX3NldF9jb24oYWRhcCwgc3RhKTsKfQoKLyoKICogU2VuZCB0aGUgc2xhdmUgYWRkcmVzcyBhbmQgUi9XIGJpdAogKgogKiByZXR1cm5zIGFmdGVyIHRoZSBhZGRyZXNzIGhhcyBiZWVuIHNlbnQKICovCnN0YXRpYyB2b2lkIHBjYV9hZGRyZXNzKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCwgCgkJCXN0cnVjdCBpMmNfbXNnICptc2cpCnsKCWludCBzdGEgPSBwY2FfZ2V0X2NvbihhZGFwKTsKCWludCBhZGRyOwoKCWFkZHIgPSAoICgweDdmICYgbXNnLT5hZGRyKSA8PCAxICk7CglpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JEICkKCQlhZGRyIHw9IDE7CglERUIyKCI9PT0gU0xBVkUgQUREUkVTUyAlIzA0eCslYz0lIzA0eFxuIiwgCgkgICAgIG1zZy0+YWRkciwgbXNnLT5mbGFncyAmIEkyQ19NX1JEID8gJ1InIDogJ1cnLCBhZGRyKTsKCQoJcGNhX291dHcoYWRhcCwgSTJDX1BDQV9EQVQsIGFkZHIpOwoKCXN0YSAmPSB+KEkyQ19QQ0FfQ09OX1NUT3xJMkNfUENBX0NPTl9TVEF8STJDX1BDQV9DT05fU0kpOwoJcGNhX3NldF9jb24oYWRhcCwgc3RhKTsKCglwY2Ffd2FpdChhZGFwKTsKfQoKLyoKICogVHJhbnNtaXQgYSBieXRlLgogKgogKiBSZXR1cm5zIGFmdGVyIHRoZSBieXRlIGhhcyBiZWVuIHRyYW5zbWl0dGVkCiAqLwpzdGF0aWMgdm9pZCBwY2FfdHhfYnl0ZShzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXAsIAoJCQlfX3U4IGIpCnsKCWludCBzdGEgPSBwY2FfZ2V0X2NvbihhZGFwKTsKCURFQjIoIj09PSBXUklURSAlIzA0eFxuIiwgYik7CglwY2Ffb3V0dyhhZGFwLCBJMkNfUENBX0RBVCwgYik7CgoJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RPfEkyQ19QQ0FfQ09OX1NUQXxJMkNfUENBX0NPTl9TSSk7CglwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOwoKCXBjYV93YWl0KGFkYXApOwp9CgovKgogKiBSZWNlaXZlIGEgYnl0ZQogKgogKiByZXR1cm5zIGltbWVkaWF0ZWx5LgogKi8Kc3RhdGljIHZvaWQgcGNhX3J4X2J5dGUoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwLCAKCQkJX191OCAqYiwgaW50IGFjaykKewoJKmIgPSBwY2FfaW53KGFkYXAsIEkyQ19QQ0FfREFUKTsKCURFQjIoIj09PSBSRUFEICUjMDR4ICVzXG4iLCAqYiwgYWNrID8gIkFDSyIgOiAiTkFDSyIpOwp9CgovKiAKICogU2V0dXAgQUNLIG9yIE5BQ0sgZm9yIG5leHQgcmVjZWl2ZWQgYnl0ZSBhbmQgd2FpdCBmb3IgaXQgdG8gYXJyaXZlLgogKgogKiBSZXR1cm5zIGFmdGVyIG5leHQgYnl0ZSBoYXMgYXJyaXZlZC4KICovCnN0YXRpYyB2b2lkIHBjYV9yeF9hY2soc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwLCAKCQkgICAgICAgaW50IGFjaykKewoJaW50IHN0YSA9IHBjYV9nZXRfY29uKGFkYXApOwoKCXN0YSAmPSB+KEkyQ19QQ0FfQ09OX1NUT3xJMkNfUENBX0NPTl9TVEF8STJDX1BDQV9DT05fU0l8STJDX1BDQV9DT05fQUEpOwoKCWlmICggYWNrICkKCQlzdGEgfD0gSTJDX1BDQV9DT05fQUE7CgoJcGNhX3NldF9jb24oYWRhcCwgc3RhKTsKCXBjYV93YWl0KGFkYXApOwp9CgovKiAKICogUmVzZXQgdGhlIGkyYyBidXMgLyBTSU8gCiAqLwpzdGF0aWMgdm9pZCBwY2FfcmVzZXQoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQp7CgkvKiBhcHBhcmVudGx5IG9ubHkgYW4gZXh0ZXJuYWwgcmVzZXQgd2lsbCBkbyBpdC4gbm90IGEgbG90IGNhbiBiZSBkb25lICovCglwcmludGsoS0VSTl9FUlIgRFJJVkVSICI6IEhhdmVuJ3QgZmlndXJlZCBvdXQgaG93IHRvIGRvIGEgcmVzZXQgeWV0XG4iKTsKfQoKc3RhdGljIGludCBwY2FfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpMmNfbXNnICptc2dzLAogICAgICAgICAgICAgICAgICAgIGludCBudW0pCnsKICAgICAgICBzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOwogICAgICAgIHN0cnVjdCBpMmNfbXNnICptc2cgPSBOVUxMOwogICAgICAgIGludCBjdXJtc2c7CglpbnQgbnVtYnl0ZXMgPSAwOwoJaW50IHN0YXRlOwoJaW50IHJldDsKCWludCB0aW1lb3V0ID0gMTAwOwoKCXdoaWxlICgoc3RhdGUgPSBwY2Ffc3RhdHVzKGFkYXApKSAhPSAweGY4ICYmIHRpbWVvdXQtLSkgewoJCW1zbGVlcCgxMCk7Cgl9CglpZiAoc3RhdGUgIT0gMHhmOCkgewoJCWRldl9kYmcoJmkyY19hZGFwLT5kZXYsICJidXMgaXMgbm90IGlkbGUuIHN0YXR1cyBpcyAlIzA0eFxuIiwgc3RhdGUpOwoJCXJldHVybiAtRUlPOwoJfQoKCURFQjEoInt7eyBYRkVSICVkIG1lc3NhZ2VzXG4iLCBudW0pOwoKCWlmIChpMmNfZGVidWc+PTIpIHsKCQlmb3IgKGN1cm1zZyA9IDA7IGN1cm1zZyA8IG51bTsgY3VybXNnKyspIHsKCQkJaW50IGFkZHIsIGk7CgkJCW1zZyA9ICZtc2dzW2N1cm1zZ107CgkJCQoJCQlhZGRyID0gKDB4N2YgJiBtc2ctPmFkZHIpIDsKCQkKCQkJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCApCgkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgWyUwMmRdIFJEICVkIGJ5dGVzIGZyb20gJSMwMnggWyUjMDJ4LCAuLi5dXG4iLCAKCQkJCSAgICAgICBjdXJtc2csIG1zZy0+bGVuLCBhZGRyLCAoYWRkcjw8MSkgfCAxKTsKCQkJZWxzZSB7CgkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgWyUwMmRdIFdSICVkIGJ5dGVzIHRvICUjMDJ4IFslIzAyeCVzIiwgCgkJCQkgICAgICAgY3VybXNnLCBtc2ctPmxlbiwgYWRkciwgYWRkcjw8MSwKCQkJCSAgICAgICBtc2ctPmxlbiA9PSAwID8gIiIgOiAiLCAiKTsKCQkJCWZvcihpPTA7IGkgPCBtc2ctPmxlbjsgaSsrKQoJCQkJCXByaW50aygiJSMwNHglcyIsIG1zZy0+YnVmW2ldLCBpID09IG1zZy0+bGVuIC0gMSA/ICIiIDogIiwgIik7CgkJCQlwcmludGsoIl1cbiIpOwoJCQl9CgkJfQoJfQoKCWN1cm1zZyA9IDA7CglyZXQgPSAtRVJFTU9URUlPOwoJd2hpbGUgKGN1cm1zZyA8IG51bSkgewoJCXN0YXRlID0gcGNhX3N0YXR1cyhhZGFwKTsKCgkJREVCMygiU1RBVEUgaXMgMHglMDJ4XG4iLCBzdGF0ZSk7CgkJbXNnID0gJm1zZ3NbY3VybXNnXTsKCgkJc3dpdGNoIChzdGF0ZSkgewoJCWNhc2UgMHhmODogLyogT24gcmVzZXQgb3Igc3RvcCB0aGUgYnVzIGlzIGlkbGUgKi8KCQkJcGNhX3N0YXJ0KGFkYXApOwoJCQlicmVhazsKCgkJY2FzZSAweDA4OiAvKiBBIFNUQVJUIGNvbmRpdGlvbiBoYXMgYmVlbiB0cmFuc21pdHRlZCAqLwoJCWNhc2UgMHgxMDogLyogQSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gaGFzIGJlZW4gdHJhbnNtaXR0ZWQgKi8KCQkJcGNhX2FkZHJlc3MoYWRhcCwgbXNnKTsKCQkJYnJlYWs7CgkJCQoJCWNhc2UgMHgxODogLyogU0xBK1cgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLwoJCWNhc2UgMHgyODogLyogRGF0YSBieXRlIGluIEkyQ0RBVCBoYXMgYmVlbiB0cmFuc21pdHRlZDsgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCgkJCWlmIChudW1ieXRlcyA8IG1zZy0+bGVuKSB7CgkJCQlwY2FfdHhfYnl0ZShhZGFwLCBtc2ctPmJ1ZltudW1ieXRlc10pOwoJCQkJbnVtYnl0ZXMrKzsKCQkJCWJyZWFrOwoJCQl9CgkJCWN1cm1zZysrOyBudW1ieXRlcyA9IDA7CgkJCWlmIChjdXJtc2cgPT0gbnVtKQoJCQkJcGNhX3N0b3AoYWRhcCk7CgkJCWVsc2UKCQkJCXBjYV9yZXBlYXRlZF9zdGFydChhZGFwKTsKCQkJYnJlYWs7CgoJCWNhc2UgMHgyMDogLyogU0xBK1cgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IE5PVCBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KCQkJREVCMigiTk9UIEFDSyByZWNlaXZlZCBhZnRlciBTTEErV1xuIik7CgkJCXBjYV9zdG9wKGFkYXApOwoJCQlnb3RvIG91dDsKCgkJY2FzZSAweDQwOiAvKiBTTEErUiBoYXMgYmVlbiB0cmFuc21pdHRlZDsgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCgkJCXBjYV9yeF9hY2soYWRhcCwgbXNnLT5sZW4gPiAxKTsKCQkJYnJlYWs7CgoJCWNhc2UgMHg1MDogLyogRGF0YSBieXRlcyBoYXMgYmVlbiByZWNlaXZlZDsgQUNLIGhhcyBiZWVuIHJldHVybmVkICovCgkJCWlmIChudW1ieXRlcyA8IG1zZy0+bGVuKSB7CgkJCQlwY2FfcnhfYnl0ZShhZGFwLCAmbXNnLT5idWZbbnVtYnl0ZXNdLCAxKTsKCQkJCW51bWJ5dGVzKys7CgkJCQlwY2FfcnhfYWNrKGFkYXAsIG51bWJ5dGVzIDwgbXNnLT5sZW4gLSAxKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWN1cm1zZysrOyBudW1ieXRlcyA9IDA7CgkJCWlmIChjdXJtc2cgPT0gbnVtKQoJCQkJcGNhX3N0b3AoYWRhcCk7CgkJCWVsc2UKCQkJCXBjYV9yZXBlYXRlZF9zdGFydChhZGFwKTsKCQkJYnJlYWs7CgoJCWNhc2UgMHg0ODogLyogU0xBK1IgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IE5PVCBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KCQkJREVCMigiTk9UIEFDSyByZWNlaXZlZCBhZnRlciBTTEErUlxuIik7CgkJCXBjYV9zdG9wKGFkYXApOwoJCQlnb3RvIG91dDsKCgkJY2FzZSAweDMwOiAvKiBEYXRhIGJ5dGUgaW4gSTJDREFUIGhhcyBiZWVuIHRyYW5zbWl0dGVkOyBOT1QgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCgkJCURFQjIoIk5PVCBBQ0sgcmVjZWl2ZWQgYWZ0ZXIgZGF0YSBieXRlXG4iKTsKCQkJZ290byBvdXQ7CgoJCWNhc2UgMHgzODogLyogQXJiaXRyYXRpb24gbG9zdCBkdXJpbmcgU0xBK1csIFNMQStSIG9yIGRhdGEgYnl0ZXMgKi8KCQkJREVCMigiQXJiaXRyYXRpb24gbG9zdFxuIik7CgkJCWdvdG8gb3V0OwoJCQkKCQljYXNlIDB4NTg6IC8qIERhdGEgYnl0ZSBoYXMgYmVlbiByZWNlaXZlZDsgTk9UIEFDSyBoYXMgYmVlbiByZXR1cm5lZCAqLwoJCQlpZiAoIG51bWJ5dGVzID09IG1zZy0+bGVuIC0gMSApIHsKCQkJCXBjYV9yeF9ieXRlKGFkYXAsICZtc2ctPmJ1ZltudW1ieXRlc10sIDApOwoJCQkJY3VybXNnKys7IG51bWJ5dGVzID0gMDsKCQkJCWlmIChjdXJtc2cgPT0gbnVtKQoJCQkJCXBjYV9zdG9wKGFkYXApOwoJCQkJZWxzZQoJCQkJCXBjYV9yZXBlYXRlZF9zdGFydChhZGFwKTsKCQkJfSBlbHNlIHsKCQkJCURFQjIoIk5PVCBBQ0sgc2VudCBhZnRlciBkYXRhIGJ5dGUgcmVjZWl2ZWQuICIKCQkJCSAgICAgIk5vdCBmaW5hbCBieXRlLiBudW1ieXRlcyAlZC4gbGVuICVkXG4iLAoJCQkJICAgICBudW1ieXRlcywgbXNnLT5sZW4pOwoJCQkJcGNhX3N0b3AoYWRhcCk7CgkJCQlnb3RvIG91dDsKCQkJfQoJCQlicmVhazsKCQljYXNlIDB4NzA6IC8qIEJ1cyBlcnJvciAtIFNEQSBzdHVjayBsb3cgKi8KCQkJREVCMigiQlVTIEVSUk9SIC0gU0RBIFN0dWNrIGxvd1xuIik7CgkJCXBjYV9yZXNldChhZGFwKTsKCQkJZ290byBvdXQ7CgkJY2FzZSAweDkwOiAvKiBCdXMgZXJyb3IgLSBTQ0wgc3R1Y2sgbG93ICovCgkJCURFQjIoIkJVUyBFUlJPUiAtIFNDTCBTdHVjayBsb3dcbiIpOwoJCQlwY2FfcmVzZXQoYWRhcCk7CgkJCWdvdG8gb3V0OwoJCWNhc2UgMHgwMDogLyogQnVzIGVycm9yIGR1cmluZyBtYXN0ZXIgb3Igc2xhdmUgbW9kZSBkdWUgdG8gaWxsZWdhbCBTVEFSVCBvciBTVE9QIGNvbmRpdGlvbiAqLwoJCQlERUIyKCJCVVMgRVJST1IgLSBJbGxlZ2FsIFNUQVJUIG9yIFNUT1BcbiIpOwoJCQlwY2FfcmVzZXQoYWRhcCk7CgkJCWdvdG8gb3V0OwoJCWRlZmF1bHQ6CgkJCXByaW50ayhLRVJOX0VSUiBEUklWRVIgIjogdW5oYW5kbGVkIFNJTyBzdGF0ZSAweCUwMnhcbiIsIHN0YXRlKTsKCQkJYnJlYWs7CgkJfQoJCQoJfQoKCXJldCA9IGN1cm1zZzsKIG91dDoKCURFQjEoS0VSTl9DUklUICJ9fX0gdHJhbnNmZXJlZCAlZC8lZCBtZXNzYWdlcy4gIgoJICAgICAic3RhdHVzIGlzICUjMDR4LiBjb250cm9sIGlzICUjMDR4XG4iLCAKCSAgICAgY3VybXNnLCBudW0sIHBjYV9zdGF0dXMoYWRhcCksCgkgICAgIHBjYV9nZXRfY29uKGFkYXApKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB1MzIgcGNhX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CiAgICAgICAgcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUw7Cn0KCnN0YXRpYyBpbnQgcGNhX2luaXQoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQp7CglzdGF0aWMgaW50IGZyZXFzW10gPSB7MzMwLDI4OCwyMTcsMTQ2LDg4LDU5LDQ0LDM2fTsKCWludCBvd24sIGNsb2NrOwoKCW93biA9IHBjYV9vd24oYWRhcCk7CgljbG9jayA9IHBjYV9jbG9jayhhZGFwKTsKCURFQjEoS0VSTl9JTkZPIERSSVZFUiAiOiBvd24gYWRkcmVzcyBpcyAlIzA0eFxuIiwgb3duKTsKCURFQjEoS0VSTl9JTkZPIERSSVZFUiAiOiBjbG9jayBmcmVxZXVuY3kgaXMgJWRrSHpcbiIsIGZyZXFzW2Nsb2NrXSk7CgoJcGNhX291dHcoYWRhcCwgSTJDX1BDQV9BRFIsIG93biA8PCAxKTsKCglwY2Ffc2V0X2NvbihhZGFwLCBJMkNfUENBX0NPTl9FTlNJTyB8IGNsb2NrKTsKCXVkZWxheSg1MDApOyAvKiA1MDAgtXMgZm9yIG9zY2lsYXRvciB0byBzdGFiaWxpc2UgKi8KCglyZXR1cm4gMDsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIHBjYV9hbGdvID0gewoJLm1hc3Rlcl94ZmVyCT0gcGNhX3hmZXIsCgkuZnVuY3Rpb25hbGl0eQk9IHBjYV9mdW5jLAp9OwoKLyogCiAqIHJlZ2lzdGVyaW5nIGZ1bmN0aW9ucyB0byBsb2FkIGFsZ29yaXRobXMgYXQgcnVudGltZSAKICovCmludCBpMmNfcGNhX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglzdHJ1Y3QgaTJjX2FsZ29fcGNhX2RhdGEgKnBjYV9hZGFwID0gYWRhcC0+YWxnb19kYXRhOwoJaW50IHJ2YWw7CgoJLyogcmVnaXN0ZXIgbmV3IGFkYXB0ZXIgdG8gaTJjIG1vZHVsZS4uLiAqLwoJYWRhcC0+YWxnbyA9ICZwY2FfYWxnbzsKCglhZGFwLT50aW1lb3V0ID0gMTAwOwkJLyogZGVmYXVsdCB2YWx1ZXMsIHNob3VsZAkqLwoJYWRhcC0+cmV0cmllcyA9IDM7CQkvKiBiZSByZXBsYWNlZCBieSBkZWZpbmVzCSovCgoJaWYgKChydmFsID0gcGNhX2luaXQocGNhX2FkYXApKSkKCQlyZXR1cm4gcnZhbDsKCglydmFsID0gaTJjX2FkZF9hZGFwdGVyKGFkYXApOwoKCXJldHVybiBydmFsOwp9CkVYUE9SVF9TWU1CT0woaTJjX3BjYV9hZGRfYnVzKTsKCk1PRFVMRV9BVVRIT1IoIklhbiBDYW1wYmVsbCA8aWNhbXBiZWxsQGFyY29tLmNvbT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMtQnVzIFBDQTk1NjQgYWxnb3JpdGhtIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9wYXJhbShpMmNfZGVidWcsIGludCwgMCk7Cg==