ZGlmZiAtLWdpdCBhL2h3L3BmbGFzaF9jZmkwMi5jIGIvaHcvcGZsYXNoX2NmaTAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwY2JlMgotLS0gL2Rldi9udWxsCisrKyBiL2h3L3BmbGFzaF9jZmkwMi5jCkBAIC0wLDAgKzEsNjI3IEBACisvKgorICogIENGSSBwYXJhbGxlbCBmbGFzaCB3aXRoIEFNRCBjb21tYW5kIHNldCBlbXVsYXRpb24KKyAqIAorICogIENvcHlyaWdodCAoYykgMjAwNSBKb2NlbHluIE1heWVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qCisgKiBGb3Igbm93LCB0aGlzIGNvZGUgY2FuIGVtdWxhdGUgZmxhc2hlcyBvZiAxLCAyIG9yIDQgYnl0ZXMgd2lkdGguCisgKiBTdXBwb3J0ZWQgY29tbWFuZHMvbW9kZXMgYXJlOgorICogLSBmbGFzaCByZWFkCisgKiAtIGZsYXNoIHdyaXRlCisgKiAtIGZsYXNoIElEIHJlYWQKKyAqIC0gc2VjdG9yIGVyYXNlCisgKiAtIGNoaXAgZXJhc2UKKyAqIC0gdW5sb2NrIGJ5cGFzcyBjb21tYW5kCisgKiAtIENGSSBxdWVyaWVzCisgKgorICogSXQgZG9lcyBub3Qgc3VwcG9ydCBmbGFzaCBpbnRlcmxlYXZpbmcuCisgKiBJdCBkb2VzIG5vdCBpbXBsZW1lbnQgYm9vdCBibG9jcyB3aXRoIHJlZHVjZWQgc2l6ZQorICogSXQgZG9lcyBub3QgaW1wbGVtZW50IHNvZnR3YXJlIGRhdGEgcHJvdGVjdGlvbiBhcyBmb3VuZCBpbiBtYW55IHJlYWwgY2hpcHMKKyAqIEl0IGRvZXMgbm90IGltcGxlbWVudCBlcmFzZSBzdXNwZW5kL3Jlc3VtZSBjb21tYW5kcworICogSXQgZG9lcyBub3QgaW1wbGVtZW50IG11bHRpcGxlIHNlY3RvcnMgZXJhc2UKKyAqLworCisjaW5jbHVkZSAidmwuaCIKKworLy8jZGVmaW5lIFBGTEFTSF9ERUJVRworI2lmZGVmIFBGTEFTSF9ERUJVRworI2RlZmluZSBEUFJJTlRGKGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsb2dsZXZlbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmcHJpbnRmKGxvZ2ZpbGUsICJQRkxBU0g6ICIgZm10ICwgIyNhcmdzKTsgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYoIlBGTEFTSDogIiBmbXQgLCAjI2FyZ3MpOyAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERQUklOVEYoZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RydWN0IHBmbGFzaF90IHsKKyAgICBCbG9ja0RyaXZlclN0YXRlICpiczsKKyAgICB0YXJnZXRfdWxvbmcgYmFzZTsKKyAgICB0YXJnZXRfdWxvbmcgc2VjdG9yX2xlbjsKKyAgICB0YXJnZXRfdWxvbmcgdG90YWxfbGVuOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgd2N5Y2xlOyAvKiBpZiAwLCB0aGUgZmxhc2ggaXMgcmVhZCBub3JtYWxseSAqLworICAgIGludCBieXBhc3M7CisgICAgaW50IHJvOworICAgIHVpbnQ4X3QgY21kOworICAgIHVpbnQ4X3Qgc3RhdHVzOworICAgIHVpbnQxNl90IGlkZW50WzRdOworICAgIHVpbnQ4X3QgY2ZpX2xlbjsKKyAgICB1aW50OF90IGNmaV90YWJsZVsweDUyXTsKKyAgICBRRU1VVGltZXIgKnRpbWVyOworICAgIHJhbV9hZGRyX3Qgb2ZmOworICAgIGludCBmbF9tZW07CisgICAgdm9pZCAqc3RvcmFnZTsKK307CisKK3N0YXRpYyB2b2lkIHBmbGFzaF90aW1lciAodm9pZCAqb3BhcXVlKQoreworICAgIHBmbGFzaF90ICpwZmwgPSBvcGFxdWU7CisKKyAgICBEUFJJTlRGKCIlczogY29tbWFuZCAlMDJ4IGRvbmVcbiIsIF9fZnVuY19fLCBwZmwtPmNtZCk7CisgICAgLyogUmVzZXQgZmxhc2ggKi8KKyAgICBwZmwtPnN0YXR1cyBePSAweDgwOworICAgIGlmIChwZmwtPmJ5cGFzcykgeworICAgICAgICBwZmwtPndjeWNsZSA9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShwZmwtPmJhc2UsIHBmbC0+dG90YWxfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmbC0+b2ZmIHwgSU9fTUVNX1JPTUQgfCBwZmwtPmZsX21lbSk7CisgICAgICAgIHBmbC0+d2N5Y2xlID0gMDsKKyAgICB9CisgICAgcGZsLT5jbWQgPSAwOworfQorCitzdGF0aWMgdWludDMyX3QgcGZsYXNoX3JlYWQgKHBmbGFzaF90ICpwZmwsIHRhcmdldF91bG9uZyBvZmZzZXQsIGludCB3aWR0aCkKK3sKKyAgICB0YXJnZXRfdWxvbmcgYm9mZjsKKyAgICB1aW50MzJfdCByZXQ7CisgICAgdWludDhfdCAqcDsKKworICAgIERQUklOVEYoIiVzOiBvZmZzZXQgJTA4eFxuIiwgX19mdW5jX18sIG9mZnNldCk7CisgICAgcmV0ID0gLTE7CisgICAgb2Zmc2V0IC09IHBmbC0+YmFzZTsKKyAgICBib2ZmID0gb2Zmc2V0ICYgMHhGRjsKKyAgICBpZiAocGZsLT53aWR0aCA9PSAyKQorICAgICAgICBib2ZmID0gYm9mZiA+PiAxOworICAgIGVsc2UgaWYgKHBmbC0+d2lkdGggPT0gNCkKKyAgICAgICAgYm9mZiA9IGJvZmYgPj4gMjsKKyAgICBzd2l0Y2ggKHBmbC0+Y21kKSB7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIDogcmVzZXQgc3RhdGUgJiB0cmVhdCBpdCBhcyBhIHJlYWQqLworICAgICAgICBEUFJJTlRGKCIlczogdW5rbm93biBjb21tYW5kIHN0YXRlOiAleFxuIiwgX19mdW5jX18sIHBmbC0+Y21kKTsKKyAgICAgICAgcGZsLT53Y3ljbGUgPSAwOworICAgICAgICBwZmwtPmNtZCA9IDA7CisgICAgY2FzZSAweDgwOgorICAgICAgICAvKiBXZSBhY2NlcHQgcmVhZHMgZHVyaW5nIHNlY29uZCB1bmxvY2sgc2VxdWVuY2UuLi4gKi8KKyAgICBjYXNlIDB4MDA6CisgICAgZmxhc2hfcmVhZDoKKyAgICAgICAgLyogRmxhc2ggYXJlYSByZWFkICovCisgICAgICAgIHAgPSBwZmwtPnN0b3JhZ2U7CisgICAgICAgIHN3aXRjaCAod2lkdGgpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0ID0gcFtvZmZzZXRdOworLy8gICAgICAgICAgICBEUFJJTlRGKCIlczogZGF0YSBvZmZzZXQgJTA4eCAlMDJ4XG4iLCBfX2Z1bmNfXywgb2Zmc2V0LCByZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyNpZiBkZWZpbmVkKFRBUkdFVF9XT1JEU19CSUdFTkRJQU4pCisgICAgICAgICAgICByZXQgPSBwW29mZnNldF0gPDwgODsKKyAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDFdOworI2Vsc2UKKyAgICAgICAgICAgIHJldCA9IHBbb2Zmc2V0XTsKKyAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDFdIDw8IDg7CisjZW5kaWYKKy8vICAgICAgICAgICAgRFBSSU5URigiJXM6IGRhdGEgb2Zmc2V0ICUwOHggJTA0eFxuIiwgX19mdW5jX18sIG9mZnNldCwgcmV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisjaWYgZGVmaW5lZChUQVJHRVRfV09SRFNfQklHRU5ESUFOKQorICAgICAgICAgICAgcmV0ID0gcFtvZmZzZXRdIDw8IDI0OworICAgICAgICAgICAgcmV0IHw9IHBbb2Zmc2V0ICsgMV0gPDwgMTY7CisgICAgICAgICAgICByZXQgfD0gcFtvZmZzZXQgKyAyXSA8PCA4OworICAgICAgICAgICAgcmV0IHw9IHBbb2Zmc2V0ICsgM107CisjZWxzZQorICAgICAgICAgICAgcmV0ID0gcFtvZmZzZXRdOworICAgICAgICAgICAgcmV0IHw9IHBbb2Zmc2V0ICsgMV0gPDwgODsKKyAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDFdIDw8IDg7CisgICAgICAgICAgICByZXQgfD0gcFtvZmZzZXQgKyAyXSA8PCAxNjsKKyAgICAgICAgICAgIHJldCB8PSBwW29mZnNldCArIDNdIDw8IDI0OworI2VuZGlmCisvLyAgICAgICAgICAgIERQUklOVEYoIiVzOiBkYXRhIG9mZnNldCAlMDh4ICUwOHhcbiIsIF9fZnVuY19fLCBvZmZzZXQsIHJldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4OTA6CisgICAgICAgIC8qIGZsYXNoIElEIHJlYWQgKi8KKyAgICAgICAgc3dpdGNoIChib2ZmKSB7CisgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgcmV0ID0gcGZsLT5pZGVudFtib2ZmICYgMHgwMV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAyOgorICAgICAgICAgICAgcmV0ID0gMHgwMDsgLyogUHJldGVuZCBhbGwgc2VjdG9ycyBhcmUgdW5wcm90ZWN0ZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MEU6CisgICAgICAgIGNhc2UgMHgwRjoKKyAgICAgICAgICAgIGlmIChwZmwtPmlkZW50WzIgKyAoYm9mZiAmIDB4MDEpXSA9PSAodWludDhfdCktMSkKKyAgICAgICAgICAgICAgICBnb3RvIGZsYXNoX3JlYWQ7CisgICAgICAgICAgICByZXQgPSBwZmwtPmlkZW50WzIgKyAoYm9mZiAmIDB4MDEpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBmbGFzaF9yZWFkOworICAgICAgICB9CisgICAgICAgIERQUklOVEYoIiVzOiBJRCAlZCAleFxuIiwgX19mdW5jX18sIGJvZmYsIHJldCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhBMDoKKyAgICBjYXNlIDB4MTA6CisgICAgY2FzZSAweDMwOgorICAgICAgICAvKiBTdGF0dXMgcmVnaXN0ZXIgcmVhZCAqLworICAgICAgICByZXQgPSBwZmwtPnN0YXR1czsKKyAgICAgICAgRFBSSU5URigiJXM6IHN0YXR1cyAleFxuIiwgX19mdW5jX18sIHJldCk7CisgICAgICAgIC8qIFRvZ2dsZSBiaXQgNiAqLworICAgICAgICBwZmwtPnN0YXR1cyBePSAweDQwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4OTg6CisgICAgICAgIC8qIENGSSBxdWVyeSBtb2RlICovCisgICAgICAgIGlmIChib2ZmID4gcGZsLT5jZmlfbGVuKQorICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gcGZsLT5jZmlfdGFibGVbYm9mZl07CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIHVwZGF0ZSBmbGFzaCBjb250ZW50IG9uIGRpc2sgKi8KK3N0YXRpYyB2b2lkIHBmbGFzaF91cGRhdGUocGZsYXNoX3QgKnBmbCwgaW50IG9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQoreworICAgIGludCBvZmZzZXRfZW5kOworICAgIGlmIChwZmwtPmJzKSB7CisgICAgICAgIG9mZnNldF9lbmQgPSBvZmZzZXQgKyBzaXplOworICAgICAgICAvKiByb3VuZCB0byBzZWN0b3JzICovCisgICAgICAgIG9mZnNldCA9IG9mZnNldCA+PiA5OworICAgICAgICBvZmZzZXRfZW5kID0gKG9mZnNldF9lbmQgKyA1MTEpID4+IDk7CisgICAgICAgIGJkcnZfd3JpdGUocGZsLT5icywgb2Zmc2V0LCBwZmwtPnN0b3JhZ2UgKyAob2Zmc2V0IDw8IDkpLCAKKyAgICAgICAgICAgICAgICAgICBvZmZzZXRfZW5kIC0gb2Zmc2V0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBmbGFzaF93cml0ZSAocGZsYXNoX3QgKnBmbCwgdGFyZ2V0X3Vsb25nIG9mZnNldCwgdWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkKK3sKKyAgICB0YXJnZXRfdWxvbmcgYm9mZjsKKyAgICB1aW50OF90ICpwOworICAgIHVpbnQ4X3QgY21kOworCisgICAgLyogV0FSTklORzogd2hlbiB0aGUgbWVtb3J5IGFyZWEgaXMgaW4gUk9NRCBtb2RlLCB0aGUgb2Zmc2V0IGlzIGEKKyAgICAgICByYW0gb2Zmc2V0LCBub3QgYSBwaHlzaWNhbCBhZGRyZXNzICovCisgICAgaWYgKHBmbC0+d2N5Y2xlID09IDApCisgICAgICAgIG9mZnNldCAtPSBwZmwtPm9mZjsKKyAgICBlbHNlCisgICAgICAgIG9mZnNldCAtPSBwZmwtPmJhc2U7CisgICAgICAgIAorICAgIGNtZCA9IHZhbHVlOworICAgIERQUklOVEYoIiVzOiBvZmZzZXQgJTA4eCAlMDh4ICVkXG4iLCBfX2Z1bmNfXywgb2Zmc2V0LCB2YWx1ZSwgd2lkdGgpOworICAgIGlmIChwZmwtPmNtZCAhPSAweEEwICYmIGNtZCA9PSAweEYwKSB7CisgICAgICAgIERQUklOVEYoIiVzOiBmbGFzaCByZXNldCBhc2tlZCAoJTAyeCAlMDJ4KVxuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGZsLT5jbWQsIGNtZCk7CisgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CisgICAgfQorICAgIC8qIFNldCB0aGUgZGV2aWNlIGluIEkvTyBhY2Nlc3MgbW9kZSAqLworICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkocGZsLT5iYXNlLCBwZmwtPnRvdGFsX2xlbiwgcGZsLT5mbF9tZW0pOworICAgIGJvZmYgPSBvZmZzZXQgJiAocGZsLT5zZWN0b3JfbGVuIC0gMSk7CisgICAgaWYgKHBmbC0+d2lkdGggPT0gMikKKyAgICAgICAgYm9mZiA9IGJvZmYgPj4gMTsKKyAgICBlbHNlIGlmIChwZmwtPndpZHRoID09IDQpCisgICAgICAgIGJvZmYgPSBib2ZmID4+IDI7CisgICAgc3dpdGNoIChwZmwtPndjeWNsZSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgLyogV2UncmUgaW4gcmVhZCBtb2RlICovCisgICAgY2hlY2tfdW5sb2NrMDoKKyAgICAgICAgaWYgKGJvZmYgPT0gMHg1NSAmJiBjbWQgPT0gMHg5OCkgeworICAgICAgICBlbnRlcl9DRklfbW9kZToKKyAgICAgICAgICAgIC8qIEVudGVyIENGSSBxdWVyeSBtb2RlICovCisgICAgICAgICAgICBwZmwtPndjeWNsZSA9IDc7CisgICAgICAgICAgICBwZmwtPmNtZCA9IDB4OTg7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJvZmYgIT0gMHg1NTUgfHwgY21kICE9IDB4QUEpIHsKKyAgICAgICAgICAgIERQUklOVEYoIiVzOiB1bmxvY2swIGZhaWxlZCAlMDR4ICUwMnggJTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJvZmYsIGNtZCwgMHg1NTUpOworICAgICAgICAgICAgZ290byByZXNldF9mbGFzaDsKKyAgICAgICAgfQorICAgICAgICBEUFJJTlRGKCIlczogdW5sb2NrIHNlcXVlbmNlIHN0YXJ0ZWRcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICAvKiBXZSBzdGFydGVkIGFuIHVubG9jayBzZXF1ZW5jZSAqLworICAgIGNoZWNrX3VubG9jazE6CisgICAgICAgIGlmIChib2ZmICE9IDB4MkFBIHx8IGNtZCAhPSAweDU1KSB7CisgICAgICAgICAgICBEUFJJTlRGKCIlczogdW5sb2NrMSBmYWlsZWQgJTA0eCAlMDJ4XG4iLCBfX2Z1bmNfXywgYm9mZiwgY21kKTsKKyAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CisgICAgICAgIH0KKyAgICAgICAgRFBSSU5URigiJXM6IHVubG9jayBzZXF1ZW5jZSBkb25lXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgLyogV2UgZmluaXNoZWQgYW4gdW5sb2NrIHNlcXVlbmNlICovCisgICAgICAgIGlmICghcGZsLT5ieXBhc3MgJiYgYm9mZiAhPSAweDU1NSkgeworICAgICAgICAgICAgRFBSSU5URigiJXM6IGNvbW1hbmQgZmFpbGVkICUwNHggJTAyeFxuIiwgX19mdW5jX18sIGJvZmYsIGNtZCk7CisgICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIGNhc2UgMHgyMDoKKyAgICAgICAgICAgIHBmbC0+YnlwYXNzID0gMTsKKyAgICAgICAgICAgIGdvdG8gZG9fYnlwYXNzOworICAgICAgICBjYXNlIDB4ODA6CisgICAgICAgIGNhc2UgMHg5MDoKKyAgICAgICAgY2FzZSAweEEwOgorICAgICAgICAgICAgcGZsLT5jbWQgPSBjbWQ7CisgICAgICAgICAgICBEUFJJTlRGKCIlczogc3RhcnRpbmcgY29tbWFuZCAlMDJ4XG4iLCBfX2Z1bmNfXywgY21kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRFBSSU5URigiJXM6IHVua25vd24gY29tbWFuZCAlMDJ4XG4iLCBfX2Z1bmNfXywgY21kKTsKKyAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBzd2l0Y2ggKHBmbC0+Y21kKSB7CisgICAgICAgIGNhc2UgMHg4MDoKKyAgICAgICAgICAgIC8qIFdlIG5lZWQgYW5vdGhlciB1bmxvY2sgc2VxdWVuY2UgKi8KKyAgICAgICAgICAgIGdvdG8gY2hlY2tfdW5sb2NrMDsKKyAgICAgICAgY2FzZSAweEEwOgorICAgICAgICAgICAgRFBSSU5URigiJXM6IHdyaXRlIGRhdGEgb2Zmc2V0ICUwOHggJTA4eCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG9mZnNldCwgdmFsdWUsIHdpZHRoKTsKKyAgICAgICAgICAgIHAgPSBwZmwtPnN0b3JhZ2U7CisgICAgICAgICAgICBzd2l0Y2ggKHdpZHRoKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcFtvZmZzZXRdICY9IHZhbHVlOworICAgICAgICAgICAgICAgIHBmbGFzaF91cGRhdGUocGZsLCBvZmZzZXQsIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorI2lmIGRlZmluZWQoVEFSR0VUX1dPUkRTX0JJR0VORElBTikKKyAgICAgICAgICAgICAgICBwW29mZnNldF0gJj0gdmFsdWUgPj4gODsKKyAgICAgICAgICAgICAgICBwW29mZnNldCArIDFdICY9IHZhbHVlOworI2Vsc2UKKyAgICAgICAgICAgICAgICBwW29mZnNldF0gJj0gdmFsdWU7CisgICAgICAgICAgICAgICAgcFtvZmZzZXQgKyAxXSAmPSB2YWx1ZSA+PiA4OworI2VuZGlmCisgICAgICAgICAgICAgICAgcGZsYXNoX3VwZGF0ZShwZmwsIG9mZnNldCwgMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisjaWYgZGVmaW5lZChUQVJHRVRfV09SRFNfQklHRU5ESUFOKQorICAgICAgICAgICAgICAgIHBbb2Zmc2V0XSAmPSB2YWx1ZSA+PiAyNDsKKyAgICAgICAgICAgICAgICBwW29mZnNldCArIDFdICY9IHZhbHVlID4+IDE2OworICAgICAgICAgICAgICAgIHBbb2Zmc2V0ICsgMl0gJj0gdmFsdWUgPj4gODsKKyAgICAgICAgICAgICAgICBwW29mZnNldCArIDNdICY9IHZhbHVlOworI2Vsc2UKKyAgICAgICAgICAgICAgICBwW29mZnNldF0gJj0gdmFsdWU7CisgICAgICAgICAgICAgICAgcFtvZmZzZXQgKyAxXSAmPSB2YWx1ZSA+PiA4OworICAgICAgICAgICAgICAgIHBbb2Zmc2V0ICsgMl0gJj0gdmFsdWUgPj4gMTY7CisgICAgICAgICAgICAgICAgcFtvZmZzZXQgKyAzXSAmPSB2YWx1ZSA+PiAyNDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHBmbGFzaF91cGRhdGUocGZsLCBvZmZzZXQsIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGZsLT5zdGF0dXMgPSAweDAwIHwgfih2YWx1ZSAmIDB4ODApOworICAgICAgICAgICAgLyogTGV0J3MgcHJldGVuZCB3cml0ZSBpcyBpbW1lZGlhdGUgKi8KKyAgICAgICAgICAgIGlmIChwZmwtPmJ5cGFzcykKKyAgICAgICAgICAgICAgICBnb3RvIGRvX2J5cGFzczsKKyAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CisgICAgICAgIGNhc2UgMHg5MDoKKyAgICAgICAgICAgIGlmIChwZmwtPmJ5cGFzcyAmJiBjbWQgPT0gMHgwMCkgeworICAgICAgICAgICAgICAgIC8qIFVubG9jayBieXBhc3MgcmVzZXQgKi8KKyAgICAgICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogV2UgY2FuIGVudGVyIENGSSBxdWVyeSBtb2RlIGZyb20gYXV0b3NlbGVjdCBtb2RlICovCisgICAgICAgICAgICBpZiAoYm9mZiA9PSAweDU1ICYmIGNtZCA9PSAweDk4KQorICAgICAgICAgICAgICAgIGdvdG8gZW50ZXJfQ0ZJX21vZGU7CisgICAgICAgICAgICAvKiBObyBicmVhayBoZXJlICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEUFJJTlRGKCIlczogaW52YWxpZCB3cml0ZSBmb3IgY29tbWFuZCAlMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGZsLT5jbWQpOworICAgICAgICAgICAgZ290byByZXNldF9mbGFzaDsKKyAgICAgICAgfQorICAgIGNhc2UgNDoKKyAgICAgICAgc3dpdGNoIChwZmwtPmNtZCkgeworICAgICAgICBjYXNlIDB4QTA6CisgICAgICAgICAgICAvKiBJZ25vcmUgd3JpdGVzIHdoaWxlIGZsYXNoIGRhdGEgd3JpdGUgaXMgb2NjdXJpbmcgKi8KKyAgICAgICAgICAgIC8qIEFzIHdlIHN1cHBvc2Ugd3JpdGUgaXMgaW1tZWRpYXRlLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAweDgwOgorICAgICAgICAgICAgZ290byBjaGVja191bmxvY2sxOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworICAgICAgICAgICAgRFBSSU5URigiJXM6IGludmFsaWQgY29tbWFuZCBzdGF0ZSAlMDJ4ICh3YyA0KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBmbC0+Y21kKTsKKyAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIDB4MTA6CisgICAgICAgICAgICBpZiAoYm9mZiAhPSAweDU1NSkgeworICAgICAgICAgICAgICAgIERQUklOVEYoIiVzOiBjaGlwIGVyYXNlOiBpbnZhbGlkIGFkZHJlc3MgJTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIGdvdG8gcmVzZXRfZmxhc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDaGlwIGVyYXNlICovCisgICAgICAgICAgICBEUFJJTlRGKCIlczogc3RhcnQgY2hpcCBlcmFzZVxuIiwgX19mdW5jX18pOworICAgICAgICAgICAgbWVtc2V0KHBmbC0+c3RvcmFnZSwgMHhGRiwgcGZsLT50b3RhbF9sZW4pOworICAgICAgICAgICAgcGZsLT5zdGF0dXMgPSAweDAwOworICAgICAgICAgICAgcGZsYXNoX3VwZGF0ZShwZmwsIDAsIHBmbC0+dG90YWxfbGVuKTsKKyAgICAgICAgICAgIC8qIExldCdzIHdhaXQgNSBzZWNvbmRzIGJlZm9yZSBjaGlwIGVyYXNlIGlzIGRvbmUgKi8KKyAgICAgICAgICAgIHFlbXVfbW9kX3RpbWVyKHBmbC0+dGltZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9nZXRfY2xvY2sodm1fY2xvY2spICsgKHRpY2tzX3Blcl9zZWMgKiA1KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDMwOgorICAgICAgICAgICAgLyogU2VjdG9yIGVyYXNlICovCisgICAgICAgICAgICBwID0gcGZsLT5zdG9yYWdlOworICAgICAgICAgICAgb2Zmc2V0ICY9IH4ocGZsLT5zZWN0b3JfbGVuIC0gMSk7CisgICAgICAgICAgICBEUFJJTlRGKCIlczogc3RhcnQgc2VjdG9yIGVyYXNlIGF0ICUwOHhcbiIsIF9fZnVuY19fLCBvZmZzZXQpOworICAgICAgICAgICAgbWVtc2V0KHAgKyBvZmZzZXQsIDB4RkYsIHBmbC0+c2VjdG9yX2xlbik7CisgICAgICAgICAgICBwZmxhc2hfdXBkYXRlKHBmbCwgb2Zmc2V0LCBwZmwtPnNlY3Rvcl9sZW4pOworICAgICAgICAgICAgcGZsLT5zdGF0dXMgPSAweDAwOworICAgICAgICAgICAgLyogTGV0J3Mgd2FpdCAxLzIgc2Vjb25kIGJlZm9yZSBzZWN0b3IgZXJhc2UgaXMgZG9uZSAqLworICAgICAgICAgICAgcWVtdV9tb2RfdGltZXIocGZsLT50aW1lciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBxZW11X2dldF9jbG9jayh2bV9jbG9jaykgKyAodGlja3NfcGVyX3NlYyAvIDIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRFBSSU5URigiJXM6IGludmFsaWQgY29tbWFuZCAlMDJ4ICh3YyA1KVxuIiwgX19mdW5jX18sIGNtZCk7CisgICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOworICAgICAgICB9CisgICAgICAgIHBmbC0+Y21kID0gY21kOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIHN3aXRjaCAocGZsLT5jbWQpIHsKKyAgICAgICAgY2FzZSAweDEwOgorICAgICAgICAgICAgLyogSWdub3JlIHdyaXRlcyBkdXJpbmcgY2hpcCBlcmFzZSAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIDB4MzA6CisgICAgICAgICAgICAvKiBJZ25vcmUgd3JpdGVzIGR1cmluZyBzZWN0b3IgZXJhc2UgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgICAgICAgICAgIERQUklOVEYoIiVzOiBpbnZhbGlkIGNvbW1hbmQgc3RhdGUgJTAyeCAod2MgNilcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwZmwtPmNtZCk7CisgICAgICAgICAgICBnb3RvIHJlc2V0X2ZsYXNoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzogLyogU3BlY2lhbCB2YWx1ZSBmb3IgQ0ZJIHF1ZXJpZXMgKi8KKyAgICAgICAgRFBSSU5URigiJXM6IGludmFsaWQgd3JpdGUgaW4gQ0ZJIHF1ZXJ5IG1vZGVcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgZ290byByZXNldF9mbGFzaDsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisgICAgICAgIERQUklOVEYoIiVzOiBpbnZhbGlkIHdyaXRlIHN0YXRlICh3YyA3KVxuIiwgIF9fZnVuY19fKTsKKyAgICAgICAgZ290byByZXNldF9mbGFzaDsKKyAgICB9CisgICAgcGZsLT53Y3ljbGUrKzsKKworICAgIHJldHVybjsKKworICAgIC8qIFJlc2V0IGZsYXNoICovCisgcmVzZXRfZmxhc2g6CisgICAgaWYgKHBmbC0+d2N5Y2xlICE9IDApIHsKKyAgICAgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShwZmwtPmJhc2UsIHBmbC0+dG90YWxfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmbC0+b2ZmIHwgSU9fTUVNX1JPTUQgfCBwZmwtPmZsX21lbSk7CisgICAgfQorICAgIHBmbC0+YnlwYXNzID0gMDsKKyAgICBwZmwtPndjeWNsZSA9IDA7CisgICAgcGZsLT5jbWQgPSAwOworICAgIHJldHVybjsKKworIGRvX2J5cGFzczoKKyAgICBwZmwtPndjeWNsZSA9IDI7CisgICAgcGZsLT5jbWQgPSAwOworICAgIHJldHVybjsKK30KKworCitzdGF0aWMgdWludDMyX3QgcGZsYXNoX3JlYWRiICh2b2lkICpvcGFxdWUsIHRhcmdldF9waHlzX2FkZHJfdCBhZGRyKQoreworICAgIHJldHVybiBwZmxhc2hfcmVhZChvcGFxdWUsIGFkZHIsIDEpOworfQorCitzdGF0aWMgdWludDMyX3QgcGZsYXNoX3JlYWR3ICh2b2lkICpvcGFxdWUsIHRhcmdldF9waHlzX2FkZHJfdCBhZGRyKQoreworICAgIHBmbGFzaF90ICpwZmwgPSBvcGFxdWU7CisKKyAgICByZXR1cm4gcGZsYXNoX3JlYWQocGZsLCBhZGRyLCAyKTsKK30KKworc3RhdGljIHVpbnQzMl90IHBmbGFzaF9yZWFkbCAodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkcikKK3sKKyAgICBwZmxhc2hfdCAqcGZsID0gb3BhcXVlOworCisgICAgcmV0dXJuIHBmbGFzaF9yZWFkKHBmbCwgYWRkciwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIHBmbGFzaF93cml0ZWIgKHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBwZmxhc2hfd3JpdGUob3BhcXVlLCBhZGRyLCB2YWx1ZSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHBmbGFzaF93cml0ZXcgKHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBwZmxhc2hfdCAqcGZsID0gb3BhcXVlOworCisgICAgcGZsYXNoX3dyaXRlKHBmbCwgYWRkciwgdmFsdWUsIDIpOworfQorCitzdGF0aWMgdm9pZCBwZmxhc2hfd3JpdGVsICh2b2lkICpvcGFxdWUsIHRhcmdldF9waHlzX2FkZHJfdCBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCit7CisgICAgcGZsYXNoX3QgKnBmbCA9IG9wYXF1ZTsKKworICAgIHBmbGFzaF93cml0ZShwZmwsIGFkZHIsIHZhbHVlLCA0KTsKK30KKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqcGZsYXNoX3dyaXRlX29wc1tdID0geworICAgICZwZmxhc2hfd3JpdGViLAorICAgICZwZmxhc2hfd3JpdGV3LAorICAgICZwZmxhc2hfd3JpdGVsLAorfTsKKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICpwZmxhc2hfcmVhZF9vcHNbXSA9IHsKKyAgICAmcGZsYXNoX3JlYWRiLAorICAgICZwZmxhc2hfcmVhZHcsCisgICAgJnBmbGFzaF9yZWFkbCwKK307CisKKy8qIENvdW50IHRyYWlsaW5nIHplcm9lcyBvZiBhIDMyIGJpdHMgcXVhbnRpdHkgKi8KK3N0YXRpYyBpbnQgY3R6MzIgKHVpbnQzMl90IG4pCit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IDA7CisgICAgaWYgKCEobiAmIDB4RkZGRikpIHsKKyAgICAgICAgcmV0ICs9IDE2OworICAgICAgICBuID0gbiA+PiAxNjsKKyAgICB9CisgICAgaWYgKCEobiAmIDB4RkYpKSB7CisgICAgICAgIHJldCArPSA4OworICAgICAgICBuID0gbiA+PiA4OworICAgIH0KKyAgICBpZiAoIShuICYgMHhGKSkgeworICAgICAgICByZXQgKz0gNDsKKyAgICAgICAgbiA9IG4gPj4gNDsKKyAgICB9CisgICAgaWYgKCEobiAmIDB4MykpIHsKKyAgICAgICAgcmV0ICs9IDI7CisgICAgICAgIG4gPSBuID4+IDI7CisgICAgfQorICAgIGlmICghKG4gJiAweDEpKSB7CisgICAgICAgIHJldCsrOworICAgICAgICBuID0gbiA+PiAxOworICAgIH0KKyNpZiAwIC8qIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhcyBuIGlzIG5ldmVyIDAgKi8KKyAgICBpZiAoIW4pCisgICAgICAgIHJldCsrOworI2VuZGlmCisKKyAgICByZXR1cm4gcmV0OworfQorCitwZmxhc2hfdCAqcGZsYXNoX3JlZ2lzdGVyICh0YXJnZXRfdWxvbmcgYmFzZSwgcmFtX2FkZHJfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBzZWN0b3JfbGVuLCBpbnQgbmJfYmxvY3MsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGlkMCwgdWludDE2X3QgaWQxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGlkMiwgdWludDE2X3QgaWQzKQoreworICAgIHBmbGFzaF90ICpwZmw7CisgICAgdGFyZ2V0X2xvbmcgdG90YWxfbGVuOworCisgICAgdG90YWxfbGVuID0gc2VjdG9yX2xlbiAqIG5iX2Jsb2NzOworICAgIC8qIFhYWDogdG8gYmUgZml4ZWQgKi8KKyAgICBpZiAodG90YWxfbGVuICE9ICg4ICogMTAyNCAqIDEwMjQpICYmIHRvdGFsX2xlbiAhPSAoMTYgKiAxMDI0ICogMTAyNCkgJiYKKyAgICAgICAgdG90YWxfbGVuICE9ICgzMiAqIDEwMjQgKiAxMDI0KSAmJiB0b3RhbF9sZW4gIT0gKDY0ICogMTAyNCAqIDEwMjQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwZmwgPSBxZW11X21hbGxvY3ooc2l6ZW9mKHBmbGFzaF90KSk7CisgICAgaWYgKHBmbCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwZmwtPnN0b3JhZ2UgPSBwaHlzX3JhbV9iYXNlICsgb2ZmOworICAgIHBmbC0+ZmxfbWVtID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeSgwLCBwZmxhc2hfcmVhZF9vcHMsIHBmbGFzaF93cml0ZV9vcHMsIHBmbCk7CisgICAgcGZsLT5vZmYgPSBvZmY7CisgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShiYXNlLCB0b3RhbF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgfCBwZmwtPmZsX21lbSB8IElPX01FTV9ST01EKTsKKyAgICBwZmwtPmJzID0gYnM7CisgICAgaWYgKHBmbC0+YnMpIHsKKyAgICAgICAgLyogcmVhZCB0aGUgaW5pdGlhbCBmbGFzaCBjb250ZW50ICovCisgICAgICAgIGJkcnZfcmVhZChwZmwtPmJzLCAwLCBwZmwtPnN0b3JhZ2UsIHRvdGFsX2xlbiA+PiA5KTsKKyAgICB9CisjaWYgMCAvKiBYWFg6IHRoZXJlIHNob3VsZCBiZSBhIGJpdCB0byBzZXQgdXAgcmVhZC1vbmx5LAorICAgICAgICogICAgICB0aGUgc2FtZSB3YXkgdGhlIGhhcmR3YXJlIGRvZXMgKHdpdGggV1AgcGluKS4KKyAgICAgICAqLworICAgIHBmbC0+cm8gPSAxOworI2Vsc2UKKyAgICBwZmwtPnJvID0gMDsKKyNlbmRpZgorICAgIHBmbC0+dGltZXIgPSBxZW11X25ld190aW1lcih2bV9jbG9jaywgcGZsYXNoX3RpbWVyLCBwZmwpOworICAgIHBmbC0+YmFzZSA9IGJhc2U7CisgICAgcGZsLT5zZWN0b3JfbGVuID0gc2VjdG9yX2xlbjsKKyAgICBwZmwtPnRvdGFsX2xlbiA9IHRvdGFsX2xlbjsKKyAgICBwZmwtPndpZHRoID0gd2lkdGg7CisgICAgcGZsLT53Y3ljbGUgPSAwOworICAgIHBmbC0+Y21kID0gMDsKKyAgICBwZmwtPnN0YXR1cyA9IDA7CisgICAgcGZsLT5pZGVudFswXSA9IGlkMDsKKyAgICBwZmwtPmlkZW50WzFdID0gaWQxOworICAgIHBmbC0+aWRlbnRbMl0gPSBpZDI7CisgICAgcGZsLT5pZGVudFszXSA9IGlkMzsKKyAgICAvKiBIYXJkY29kZWQgQ0ZJIHRhYmxlIChtb3N0bHkgZnJvbSBTRzI5IFNwYW5zaW9uIGZsYXNoKSAqLworICAgIHBmbC0+Y2ZpX2xlbiA9IDB4NTI7CisgICAgLyogU3RhbmRhcmQgIlFSWSIgc3RyaW5nICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgxMF0gPSAnUSc7CisgICAgcGZsLT5jZmlfdGFibGVbMHgxMV0gPSAnUic7CisgICAgcGZsLT5jZmlfdGFibGVbMHgxMl0gPSAnWSc7CisgICAgLyogQ29tbWFuZCBzZXQgKEFNRC9GdWppdHN1KSAqLworICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MTNdID0gMHgwMjsKKyAgICBwZmwtPmNmaV90YWJsZVsweDE0XSA9IDB4MDA7CisgICAgLyogUHJpbWFyeSBleHRlbmRlZCB0YWJsZSBhZGRyZXNzIChub25lKSAqLworICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MTVdID0gMHgwMDsKKyAgICBwZmwtPmNmaV90YWJsZVsweDE2XSA9IDB4MDA7CisgICAgLyogQWx0ZXJuYXRlIGNvbW1hbmQgc2V0IChub25lKSAqLworICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MTddID0gMHgwMDsKKyAgICBwZmwtPmNmaV90YWJsZVsweDE4XSA9IDB4MDA7CisgICAgLyogQWx0ZXJuYXRlIGV4dGVuZGVkIHRhYmxlIChub25lKSAqLworICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MTldID0gMHgwMDsKKyAgICBwZmwtPmNmaV90YWJsZVsweDFBXSA9IDB4MDA7CisgICAgLyogVmNjIG1pbiAqLworICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MUJdID0gMHgyNzsKKyAgICAvKiBWY2MgbWF4ICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgxQ10gPSAweDM2OworICAgIC8qIFZwcCBtaW4gKG5vIFZwcCBwaW4pICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgxRF0gPSAweDAwOworICAgIC8qIFZwcCBtYXggKG5vIFZwcCBwaW4pICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgxRV0gPSAweDAwOworICAgIC8qIFJlc2VydmVkICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgxRl0gPSAweDA3OworICAgIC8qIFRpbWVvdXQgZm9yIG1pbiBzaXplIGJ1ZmZlciB3cml0ZSAoMTYgtXMpICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgyMF0gPSAweDA0OworICAgIC8qIFR5cGljYWwgdGltZW91dCBmb3IgYmxvY2sgZXJhc2UgKDUxMiBtcykgKi8KKyAgICBwZmwtPmNmaV90YWJsZVsweDIxXSA9IDB4MDk7CisgICAgLyogVHlwaWNhbCB0aW1lb3V0IGZvciBmdWxsIGNoaXAgZXJhc2UgKDQwOTYgbXMpICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgyMl0gPSAweDBDOworICAgIC8qIFJlc2VydmVkICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgyM10gPSAweDAxOworICAgIC8qIE1heCB0aW1lb3V0IGZvciBidWZmZXIgd3JpdGUgKi8KKyAgICBwZmwtPmNmaV90YWJsZVsweDI0XSA9IDB4MDQ7CisgICAgLyogTWF4IHRpbWVvdXQgZm9yIGJsb2NrIGVyYXNlICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgyNV0gPSAweDBBOworICAgIC8qIE1heCB0aW1lb3V0IGZvciBjaGlwIGVyYXNlICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgyNl0gPSAweDBEOworICAgIC8qIERldmljZSBzaXplICovCisgICAgcGZsLT5jZmlfdGFibGVbMHgyN10gPSBjdHozMih0b3RhbF9sZW4pICsgMTsKKyAgICAvKiBGbGFzaCBkZXZpY2UgaW50ZXJmYWNlICg4ICYgMTYgYml0cykgKi8KKyAgICBwZmwtPmNmaV90YWJsZVsweDI4XSA9IDB4MDI7CisgICAgcGZsLT5jZmlfdGFibGVbMHgyOV0gPSAweDAwOworICAgIC8qIE1heCBudW1iZXIgb2YgYnl0ZXMgaW4gbXVsdGktYnl0ZXMgd3JpdGUgKi8KKyAgICBwZmwtPmNmaV90YWJsZVsweDJBXSA9IDB4MDU7CisgICAgcGZsLT5jZmlfdGFibGVbMHgyQl0gPSAweDAwOworICAgIC8qIE51bWJlciBvZiBlcmFzZSBibG9jayByZWdpb25zICh1bmlmb3JtKSAqLworICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MkNdID0gMHgwMTsKKyAgICAvKiBFcmFzZSBibG9jayByZWdpb24gMSAqLworICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MkRdID0gbmJfYmxvY3MgLSAxOworICAgIHBmbC0+Y2ZpX3RhYmxlWzB4MkVdID0gKG5iX2Jsb2NzIC0gMSkgPj4gODsKKyAgICBwZmwtPmNmaV90YWJsZVsweDJGXSA9IHNlY3Rvcl9sZW4gPj4gODsKKyAgICBwZmwtPmNmaV90YWJsZVsweDMwXSA9IHNlY3Rvcl9sZW4gPj4gMTY7CisKKyAgICByZXR1cm4gcGZsOworfQo=